Commit 077f62f4 authored by fulixin's avatar fulixin

Merge branch 'V20240319三方平台登录改造' into V20240805

parents 798456ab f50c2397
...@@ -52,9 +52,16 @@ spring: ...@@ -52,9 +52,16 @@ spring:
# url: jdbc:mysql://192.168.0.79:3306/dsk_operate_sys?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # url: jdbc:mysql://192.168.0.79:3306/dsk_operate_sys?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# username: dev # username: dev
# password: 8AXjjCHZ666! # password: 8AXjjCHZ666!
url: jdbc:mysql://rds-szh.dsk.com/dos?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # url: jdbc:mysql://rds-szh.dsk.com/dos?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: dsk_api_szh # username: dsk_api_szh
password: j1nxbVPF0QS*B57C # password: j1nxbVPF0QS*B57C
# 二十局线上数据库
url: jdbc:mysql://123.60.218.188:3306/dsk_operate_online?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: dev
password: encPHwi8dbKeL!6X
# 从库数据源 # 从库数据源
# slave: # slave:
# lazy: true # lazy: true
...@@ -104,13 +111,29 @@ spring: ...@@ -104,13 +111,29 @@ spring:
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) --- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring: spring:
redis: redis:
host: redis-szh.dsk.com # host: redis-szh.dsk.com
# # 端口,默认为6379
# port: 6379
# # 数据库索引
# database: 13
# # 密码
# password: Xi8$r*@d7zn5FaP2
# # 密码(如没有密码请注释掉)
# # password:
# # 连接超时时间
# timeout: 10s
# # 是否开启ssl
# ssl: false
# 二十局redis测试链接
host: 123.60.218.188
# 端口,默认为6379 # 端口,默认为6379
port: 6379 port: 6379
# 数据库索引 # 数据库索引
database: 13 database: 13
# 密码 # 密码
password: Xi8$r*@d7zn5FaP2 password: zfTFIJjaN#6xB64r
# 密码(如没有密码请注释掉) # 密码(如没有密码请注释掉)
# password: # password:
# 连接超时时间 # 连接超时时间
...@@ -190,4 +213,4 @@ sms: ...@@ -190,4 +213,4 @@ sms:
territory: ap-guangzhou territory: ap-guangzhou
dsk: dsk:
exportBackUrl: https://szhapi.jiansheku.com/export/backUrl exportBackUrl: https://szhapi.jiansheku.com/export/backUrl
\ No newline at end of file
...@@ -49,9 +49,16 @@ spring: ...@@ -49,9 +49,16 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://120.46.64.239:3306/dsk_operate?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # url: jdbc:mysql://120.46.64.239:3306/dsk_operate?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: dskdev # username: dskdev
password: encPHwi8dbKeL8ZX # password: encPHwi8dbKeL8ZX
# 二十局数据库配置
url: jdbc:mysql://123.60.218.188:3306/dsk_operate?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: dev
password: encPHwi8dbKeL!6X
# 从库数据源 # 从库数据源
# slave: # slave:
# lazy: true # lazy: true
...@@ -101,13 +108,28 @@ spring: ...@@ -101,13 +108,28 @@ spring:
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) --- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring: spring:
redis: redis:
host: 120.46.64.239 # host: 120.46.64.239
# # 端口,默认为6379
# port: 6379
# # 数据库索引
# database: 13
# # 密码
# password: zfTFIJjaN#6xB83r
# # 密码(如没有密码请注释掉)
# # password:
# # 连接超时时间
# timeout: 10s
# # 是否开启ssl
# ssl: false
# 二十局redis测试链接
host: 123.60.218.188
# 端口,默认为6379 # 端口,默认为6379
port: 6379 port: 6379
# 数据库索引 # 数据库索引
database: 13 database: 14
# 密码 # 密码
password: zfTFIJjaN#6xB83r password: zfTFIJjaN#6xB64r
# 密码(如没有密码请注释掉) # 密码(如没有密码请注释掉)
# password: # password:
# 连接超时时间 # 连接超时时间
...@@ -115,6 +137,9 @@ spring: ...@@ -115,6 +137,9 @@ spring:
# 是否开启ssl # 是否开启ssl
ssl: false ssl: false
redisson: redisson:
# redis key前缀 # redis key前缀
keyPrefix: keyPrefix:
...@@ -193,4 +218,4 @@ sa-token: ...@@ -193,4 +218,4 @@ sa-token:
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: true is-share: true
\ No newline at end of file
...@@ -29,7 +29,9 @@ captcha: ...@@ -29,7 +29,9 @@ captcha:
# 开发环境配置 # 开发环境配置
server: server:
# 服务器的HTTP端口,默认为8080 # 服务器的HTTP端口,默认为8080
port: 9098 # port: 9098
# 二十局线上端口9097
port: 9097
servlet: servlet:
# 应用的访问路径 # 应用的访问路径
context-path: / context-path: /
...@@ -142,12 +144,14 @@ security: ...@@ -142,12 +144,14 @@ security:
# actuator 监控配置 # actuator 监控配置
- /api/** - /api/**
- /actuator/** - /actuator/**
# - /**
# 多租户配置 # 多租户配置
tenant: tenant:
# 是否开启 # 是否开启
enable: true enable: true
# enable: false
# 排除表 # 排除表
excludes: excludes:
- sys_menu - sys_menu
......
...@@ -113,6 +113,11 @@ public class LoginUser implements Serializable { ...@@ -113,6 +113,11 @@ public class LoginUser implements Serializable {
*/ */
private Long roleId; private Long roleId;
/**
* 是否三方登录
*/
private Boolean isThirdPlatformLogin;
/** /**
* 获取登录id * 获取登录id
*/ */
......
package com.dsk.common.core.domain.model;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 三方平台用户登录对象
*
* @author sxk
*/
@Data
public class ThirdPlatformLoginBody {
/**
* 三方平台跳转本系统所需秘钥
*/
@NotBlank(message = "桑芳平台登录秘钥不能为空")
private String thirdPlatformKey;
}
...@@ -43,4 +43,283 @@ public class IndexController { ...@@ -43,4 +43,283 @@ public class IndexController {
public AjaxResult bidRank(@RequestBody JSONObject object) { public AjaxResult bidRank(@RequestBody JSONObject object) {
return enterpriseService.bidRank(object); return enterpriseService.bidRank(object);
} }
/**
*
*
* 总金额、总面积统计--刘杰那边的接口
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/statisticsOfAmountAndArea")
public AjaxResult statisticsOfAmountAndArea(@RequestBody JSONObject object) {
return enterpriseService.statisticsOfAmountAndArea(object);
}
/**
*
*
* 基础维度统计--刘杰那边的接口
* /nationzj/landMarket/commonStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/jcwdtj")
public AjaxResult jcwdtj(@RequestBody JSONObject object) {
return enterpriseService.jcwdtj(object);
}
/**
*
*
* 前十企业统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/topten")
public AjaxResult topten(@RequestBody JSONObject object) {
return enterpriseService.topten(object);
}
/**
*
*
* 商机-拟建查询-总金额统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/njzjetj")
public AjaxResult njzjetj(@RequestBody JSONObject object) {
return enterpriseService.njzjetj(object);
}
/**
*
*
* 商机-拟建查询-基础维度统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/njjcwdtj")
public AjaxResult njjcwdtj(@RequestBody JSONObject object) {
return enterpriseService.njjcwdtj(object);
}
/**
*
*
* 商机-拟建查询-前十企业统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/njtopten")
public AjaxResult njtopten(@RequestBody JSONObject object) {
return enterpriseService.njtopten(object);
}
/**
*
*
* 商机-招标公告-总金额统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zbggzjetj")
public AjaxResult zbggzjetj(@RequestBody JSONObject object) {
return enterpriseService.zbggzjetj(object);
}
/**
*
*
* 商机-招标公告-基础维度统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zbggjcwdtj")
public AjaxResult zbggjcwdtj(@RequestBody JSONObject object) {
return enterpriseService.zbggjcwdtj(object);
}
/**
*
*
* 商机-招标公告-前十企业统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zbggtopten")
public AjaxResult zbggtopten(@RequestBody JSONObject object) {
return enterpriseService.zbggtopten(object);
}
/**
*
*
* 招标计划查询-总金额统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zbjhcxzjetj")
public AjaxResult zbjhcxzjetj(@RequestBody JSONObject object) {
return enterpriseService.zbjhcxzjetj(object);
}
/**
*
*
* 招标计划查询-基础维度统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zbjhcxjcwdtj")
public AjaxResult zbjhcxjcwdtj(@RequestBody JSONObject object) {
return enterpriseService.zbjhcxjcwdtj(object);
}
/**
*
*
* 招标计划查询-前十企业统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zbjhcxtopten")
public AjaxResult zbjhcxtopten(@RequestBody JSONObject object) {
return enterpriseService.zbjhcxtopten(object);
}
/**
*
*
* 重点项目清单查询-总金额统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zdxmqdzjetj")
public AjaxResult zdxmqdzjetj(@RequestBody JSONObject object) {
return enterpriseService.zdxmqdzjetj(object);
}
/**
*
*
* 重点项目清单查询-基础统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zdxmqdjctj")
public AjaxResult zdxmqdjctj(@RequestBody JSONObject object) {
return enterpriseService.zdxmqdjctj(object);
}
/**
*
*
* 重点项目清单查询-前十企业--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zdxmqdtopten")
public AjaxResult zdxmqdtopten(@RequestBody JSONObject object) {
return enterpriseService.zdxmqdtopten(object);
}
/**
*
*
* 专项债项目-总金额统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zxzxmzjetj")
public AjaxResult zxzxmzjetj(@RequestBody JSONObject object) {
return enterpriseService.zxzxmzjetj(object);
}
/**
*
*
* 专项债项目-基础统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zxzxmjctj")
public AjaxResult zxzxmjctj(@RequestBody JSONObject object) {
return enterpriseService.zxzxmjctj(object);
}
/**
*
*
* 专项债项目查询-企业统计--刘杰那边的接口
* /nationzj/landMarket/companyStatis
* @param object
* @return {@link AjaxResult }
* @throws Exception
*/
@PostMapping(value = "/zxzxmqytj")
public AjaxResult zxzxmqytj(@RequestBody JSONObject object) {
return enterpriseService.zxzxmqytj(object);
}
} }
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"dev": "vue-cli-service serve", "dev": "vue-cli-service serve",
"devmac": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
"build:prod": "vue-cli-service build", "build:prod": "vue-cli-service build",
"build:test": "vue-cli-service build --mode test", "build:test": "vue-cli-service build --mode test",
"build:stage": "vue-cli-service build --mode staging", "build:stage": "vue-cli-service build --mode staging",
......
import request from '@/utils/request' import request from '@/utils/request';
// 登录方法 // 登录方法
export function login(username, password, code, uuid) { export function login(username, password, code, uuid) {
...@@ -7,7 +7,7 @@ export function login(username, password, code, uuid) { ...@@ -7,7 +7,7 @@ export function login(username, password, code, uuid) {
password, password,
code, code,
uuid uuid
} };
return request({ return request({
url: '/login', url: '/login',
headers: { headers: {
...@@ -15,7 +15,7 @@ export function login(username, password, code, uuid) { ...@@ -15,7 +15,7 @@ export function login(username, password, code, uuid) {
}, },
method: 'post', method: 'post',
data: data data: data
}) });
} }
// 注册方法 // 注册方法
...@@ -27,7 +27,7 @@ export function register(data) { ...@@ -27,7 +27,7 @@ export function register(data) {
}, },
method: 'post', method: 'post',
data: data data: data
}) });
} }
// 获取用户详细信息 // 获取用户详细信息
...@@ -35,7 +35,7 @@ export function getInfo() { ...@@ -35,7 +35,7 @@ export function getInfo() {
return request({ return request({
url: '/getInfo', url: '/getInfo',
method: 'get' method: 'get'
}) });
} }
// 退出方法 // 退出方法
...@@ -43,7 +43,7 @@ export function logout() { ...@@ -43,7 +43,7 @@ export function logout() {
return request({ return request({
url: '/logout', url: '/logout',
method: 'post' method: 'post'
}) });
} }
// 获取验证码 // 获取验证码
...@@ -55,7 +55,7 @@ export function getCodeImg() { ...@@ -55,7 +55,7 @@ export function getCodeImg() {
}, },
method: 'get', method: 'get',
timeout: 20000 timeout: 20000
}) });
} }
//获取租户企业列表 //获取租户企业列表
...@@ -63,7 +63,7 @@ export function getTenants() { ...@@ -63,7 +63,7 @@ export function getTenants() {
return request({ return request({
url: '/user/tenants', url: '/user/tenants',
method: 'post', method: 'post',
}) });
} }
// 获取默认租户 // 获取默认租户
...@@ -71,15 +71,15 @@ export function defaultTenantid() { ...@@ -71,15 +71,15 @@ export function defaultTenantid() {
return request({ return request({
url: '/user/default/tenant', url: '/user/default/tenant',
method: 'post', method: 'post',
}) });
} }
// 切换租户 // 切换租户
export function changeTenants(data) { export function changeTenants(data) {
return request({ return request({
url: '/switch/tenant?tenantId='+data, url: '/switch/tenant?tenantId=' + data,
method: 'post', method: 'post',
}) });
} }
//发送短信验证码(删除组织使用) //发送短信验证码(删除组织使用)
...@@ -87,7 +87,7 @@ export function captchaSms() { ...@@ -87,7 +87,7 @@ export function captchaSms() {
return request({ return request({
url: '/getTempSmsCode', url: '/getTempSmsCode',
method: 'get', method: 'get',
}) });
} }
//验证短信验证码(删除组织使用) //验证短信验证码(删除组织使用)
...@@ -95,8 +95,8 @@ export function checkSmsCode(data) { ...@@ -95,8 +95,8 @@ export function checkSmsCode(data) {
return request({ return request({
url: '/checkSmsCode', url: '/checkSmsCode',
method: 'POST', method: 'POST',
params:data params: data
}) });
} }
//根据用户账号获取用户绑定的租户列表 //根据用户账号获取用户绑定的租户列表
...@@ -104,8 +104,8 @@ export function userTenantList(data) { ...@@ -104,8 +104,8 @@ export function userTenantList(data) {
return request({ return request({
url: '/user/tenant/list', url: '/user/tenant/list',
method: 'POST', method: 'POST',
params:data params: data
}) });
} }
//登录获取验证码 //登录获取验证码
...@@ -113,17 +113,29 @@ export function logincaptchaSms(data) { ...@@ -113,17 +113,29 @@ export function logincaptchaSms(data) {
return request({ return request({
url: '/captchaSms', url: '/captchaSms',
method: 'get', method: 'get',
params:data params: data
}) });
} }
//短信登录 //短信登录
export function smsLogin(data) { export function smsLogin(data) {
return request({ return request({
url: '/smsLogin', url: '/smsLogin',
method: 'post', method: 'post',
data:data data: data
}) });
} }
/**
* 第三方植入系统
* @param {string} thirdPlatformKey
* @returns
*/
export const thirdPlatformLoginApi = (thirdPlatformKey) => request({
method: "post",
url: "/thirdPlatformLogin",
data: {
thirdPlatformKey
}
})
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<div class="left-menu" :style="{width: scrollerWidth}"> <div class="left-menu" :style="{width: scrollerWidth}">
<tags-view /> <tags-view />
</div> </div>
<div ref="rightMenu" class="flex-box right-menu"> <div ref="rightMenu" class="flex-box right-menu" v-if="!isThirdPlatformLogin">
<!-- <div class="menu-bells"><img src="@/assets/images/message.png"><i /></div>--> <!-- <div class="menu-bells"><img src="@/assets/images/message.png"><i /></div>-->
<!-- <i class="menu-line" />--> <!-- <i class="menu-line" />-->
<el-dropdown class="avatar-container" trigger="hover" ref="mydrodown" :hide-on-click="false" placement="bottom-start"> <el-dropdown class="avatar-container" trigger="hover" ref="mydrodown" :hide-on-click="false" placement="bottom-start">
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
<script> <script>
import store from "@/store"; import store from "@/store";
import { mapGetters } from 'vuex' import { mapGetters, mapState } from 'vuex'
import elementResizeDetectorMaker from "element-resize-detector" import elementResizeDetectorMaker from "element-resize-detector"
import TagsView from './TagsView' import TagsView from './TagsView'
import { getTenants ,changeTenants} from "@/api/login"; import { getTenants ,changeTenants} from "@/api/login";
...@@ -63,7 +63,10 @@ export default { ...@@ -63,7 +63,10 @@ export default {
'sidebar', 'sidebar',
'avatar', 'avatar',
'name' 'name'
]) ]),
...mapState({
isThirdPlatformLogin : state => state.user.isThirdPlatformLogin
})
}, },
watch: { watch: {
offsetWidth(newValue, oldValue){ offsetWidth(newValue, oldValue){
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<logo v-if="showLogo" :collapse="isCollapse" /> <logo v-if="showLogo" :collapse="isCollapse" />
<el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper"> <el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper">
<el-menu :default-active="activeMenu" :collapse="isCollapse" :background-color="variables.menuBg" :text-color="variables.menuText" <el-menu :default-active="activeMenu" :collapse="isCollapse" :background-color="variables.menuBg" :text-color="variables.menuText"
:unique-opened="true" :active-text-color="settings.theme" :collapse-transition="false" mode="vertical"> :unique-opened="true" :active-text-color="settings.theme" :collapse-transition="false" mode="vertical" class="left-top-level-menu">
<sidebar-item v-for="(route, index) in hidechildren" :key="route.path + index" :is-collapse="isCollapse" :active-menu="activeMenu" <sidebar-item v-for="(route, index) in hidechildren" :key="route.path + index" :is-collapse="isCollapse" :active-menu="activeMenu"
:item="route" :base-path="route.path" :class="route.fixed&&route.fixed.isFixed?'sideFoot':''" :item="route" :base-path="route.path" :class="route.fixed&&route.fixed.isFixed?'sideFoot':''"
:style="route.fixed&&route.fixed.isFixed?{'bottom': route.fixed.number*50+'px'}: bottomMenu&&index==routes.length-bottomMenu-2?{'padding-bottom': bottomMenu*50+'px'}:''" /> :style="route.fixed&&route.fixed.isFixed?{'bottom': route.fixed.number*50+'px'}: bottomMenu&&index==routes.length-bottomMenu-2?{'padding-bottom': bottomMenu*50+'px'}:''" />
...@@ -91,3 +91,10 @@ export default { ...@@ -91,3 +91,10 @@ export default {
}, },
}; };
</script> </script>
<style lang="scss" scoped>
.left-top-level-menu {
padding: 20px 0px;
box-sizing: border-box;
}
</style>
...@@ -3,14 +3,17 @@ import store from './store'; ...@@ -3,14 +3,17 @@ import store from './store';
import { Message } from 'element-ui'; import { Message } from 'element-ui';
import NProgress from 'nprogress'; import NProgress from 'nprogress';
import 'nprogress/nprogress.css'; import 'nprogress/nprogress.css';
import { getToken } from '@/utils/auth'; import { getToken, getThirdPlatform } from '@/utils/auth';
import { isRelogin } from '@/utils/request'; import { isRelogin } from '@/utils/request';
NProgress.configure({ showSpinner: false }); NProgress.configure({ showSpinner: false });
const whiteList = ['/login', '/register']; const whiteList = ['/login', "/404", "/401"];
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
// 默认跳转路径 本系统跳转首页,第三方跳转宏观市场
const platFormKey = getThirdPlatform();
let defaultRedirectPath = platFormKey ? "/macro/nationalEconomies" : "/";
NProgress.start(); NProgress.start();
if (getToken()) { if (getToken()) {
// tab页签title // tab页签title
...@@ -20,10 +23,10 @@ router.beforeEach((to, from, next) => { ...@@ -20,10 +23,10 @@ router.beforeEach((to, from, next) => {
to.meta.title && store.dispatch('settings/setTitle', to.meta.title); to.meta.title && store.dispatch('settings/setTitle', to.meta.title);
/* has token*/ /* has token*/
if (to.path === '/login') { if (to.path === '/login') {
next({ path: '/' }); next({ path: defaultRedirectPath });
NProgress.done(); NProgress.done();
} else { } else {
if (store.getters.roles.length === 0) { if (!store.state?.user?.userId && !store.state?.user?.roles?.length) {
isRelogin.show = true; isRelogin.show = true;
// 判断当前用户是否已拉取完user_info信息 // 判断当前用户是否已拉取完user_info信息
store.dispatch('GetInfo').then(() => { store.dispatch('GetInfo').then(() => {
...@@ -34,24 +37,52 @@ router.beforeEach((to, from, next) => { ...@@ -34,24 +37,52 @@ router.beforeEach((to, from, next) => {
next({ ...to, replace: true }); // hack方法 确保addRoutes已完成 next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
}); });
}).catch(err => { }).catch(err => {
store.dispatch('LogOut').then(() => { if (platFormKey) {
Message.error(err); store.dispatch('FedLogOut').then(() => {
sessionStorage.removeItem('views'); next({
next({ path: '/' }); path: "/401",
}); query: {
isSecretFreeLogin: true
}
});
});
} else {
store.dispatch('LogOut').then(() => {
Message.error(err);
sessionStorage.removeItem('views');
next({ path: '/' });
});
}
}); });
} else { } else {
next(); next();
} }
} }
} else { } else {
// 没有token
if (whiteList.indexOf(to.path) !== -1) { if (whiteList.indexOf(to.path) !== -1) {
// 在免登录白名单,直接进入 // 在免登录白名单,直接进入
next(); next();
} else { } else {
next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页 // 非白名单 没有token 判断是否有app key 属于第三方平台
NProgress.done(); // 第三方平台 获取到 platFormKey 直接通过key 登录
if (platFormKey) {
store.dispatch("secretFreeLogin", platFormKey).then((res) => {
next({
path: defaultRedirectPath
});
}).catch(err => {
// appkey 登陆失败 跳转到401
next({
path: "/401",
query: {
isSecretFreeLogin: true
}
});
});
} else {
next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
NProgress.done();
}
} }
} }
}); });
......
This diff is collapsed.
import auth from '@/plugins/auth'; import auth from '@/plugins/auth';
import router, { constantRoutes, dynamicRoutes } from '@/router'; import router, { constantRoutes, dynamicRoutes, isThirdPlatformRoutes } from '@/router';
import { getRouters } from '@/api/menu'; import { getRouters } from '@/api/menu';
import Layout from '@/layout/index'; import Layout from '@/layout/index';
import ParentView from '@/components/ParentView'; import ParentView from '@/components/ParentView';
...@@ -19,7 +19,7 @@ const permission = { ...@@ -19,7 +19,7 @@ const permission = {
state.routes = constantRoutes.concat(routes); state.routes = constantRoutes.concat(routes);
}, },
SET_DEFAULT_ROUTES: (state, routes) => { SET_DEFAULT_ROUTES: (state, routes) => {
state.defaultRoutes = constantRoutes.concat(routes); state.defaultRoutes = routes;
}, },
SET_TOPBAR_ROUTES: (state, routes) => { SET_TOPBAR_ROUTES: (state, routes) => {
state.topbarRouters = routes; state.topbarRouters = routes;
...@@ -30,21 +30,24 @@ const permission = { ...@@ -30,21 +30,24 @@ const permission = {
}, },
actions: { actions: {
// 生成路由 // 生成路由
GenerateRoutes({ commit }) { GenerateRoutes({ commit, rootState }) {
return new Promise(resolve => { return new Promise(resolve => {
// 向后端请求路由数据 // 向后端请求路由数据
getRouters().then(res => { getRouters().then(res => {
const isThirdPlatformLogin = rootState.user.isThirdPlatformLogin;
let _array = isThirdPlatformLogin ? [isThirdPlatformRoutes[1]] : [isThirdPlatformRoutes[0]];
const sdata = JSON.parse(JSON.stringify(res.data)); const sdata = JSON.parse(JSON.stringify(res.data));
const rdata = JSON.parse(JSON.stringify(res.data)); const rdata = JSON.parse(JSON.stringify(res.data));
const sidebarRoutes = filterAsyncRouter(sdata); const sidebarRoutes = filterAsyncRouter(sdata);
const rewriteRoutes = filterAsyncRouter(rdata, false, true); const rewriteRoutes = filterAsyncRouter(rdata, false, true);
const asyncRoutes = filterDynamicRoutes(dynamicRoutes); const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
rewriteRoutes.unshift(..._array);
rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true }); rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true });
router.addRoutes(asyncRoutes); router.addRoutes(asyncRoutes);
commit('SET_ROUTES', rewriteRoutes); commit('SET_ROUTES', rewriteRoutes);
commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes)); commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(_array).concat(sidebarRoutes));
commit('SET_DEFAULT_ROUTES', sidebarRoutes); commit('SET_DEFAULT_ROUTES', constantRoutes.concat(_array).concat(sidebarRoutes));
commit('SET_TOPBAR_ROUTES', sidebarRoutes); commit('SET_TOPBAR_ROUTES', constantRoutes.concat(_array).concat(sidebarRoutes));
resolve(rewriteRoutes); resolve(rewriteRoutes);
}); });
}); });
......
import { login, logout, getInfo } from '@/api/login'; import { login, logout, getInfo, thirdPlatformLoginApi } from '@/api/login';
import { getToken, setToken, removeToken, setTenantid } from '@/utils/auth'; import { getToken, setToken, removeToken, setTenantid, removeThirdPlatform } from '@/utils/auth';
const user = { const user = {
state: { state: {
...@@ -10,6 +10,7 @@ const user = { ...@@ -10,6 +10,7 @@ const user = {
permissions: [], permissions: [],
userId: '', userId: '',
phonenumber: '', phonenumber: '',
isThirdPlatformLogin: false
}, },
mutations: { mutations: {
...@@ -33,6 +34,9 @@ const user = { ...@@ -33,6 +34,9 @@ const user = {
}, },
SET_USERPHONE: (state, phonenumber) => { SET_USERPHONE: (state, phonenumber) => {
state.phonenumber = phonenumber; state.phonenumber = phonenumber;
},
SET_IS_THIRD_PLATFORM: (state, isThirdPlatformLogin) => {
state.isThirdPlatformLogin = isThirdPlatformLogin ? true : false;
} }
}, },
...@@ -71,6 +75,7 @@ const user = { ...@@ -71,6 +75,7 @@ const user = {
commit('SET_AVATAR', avatar); commit('SET_AVATAR', avatar);
commit('SET_USERID', user.userId); commit('SET_USERID', user.userId);
commit('SET_USERPHONE', user.phonenumber); commit('SET_USERPHONE', user.phonenumber);
commit("SET_IS_THIRD_PLATFORM", res.data.isThirdPlatformLogin);
resolve(res); resolve(res);
}).catch(error => { }).catch(error => {
reject(error); reject(error);
...@@ -97,10 +102,33 @@ const user = { ...@@ -97,10 +102,33 @@ const user = {
FedLogOut({ commit }) { FedLogOut({ commit }) {
return new Promise(resolve => { return new Promise(resolve => {
commit('SET_TOKEN', ''); commit('SET_TOKEN', '');
commit('SET_USERID', "");
commit('SET_ROLES', []);
removeToken(); removeToken();
resolve(); resolve();
}); });
},
// 免密登录 通过appkey登录
async secretFreeLogin({ commit, state }, payload) {
try {
if (!payload) throw new Error("缺少platFormKey");
const tokenInfo = await thirdPlatformLoginApi(payload);
console.log(tokenInfo);
if (tokenInfo.code == 200) {
setToken(tokenInfo.data.token);
commit('SET_TOKEN', tokenInfo.data.token);
setTenantid(tokenInfo.data.tenantId);
return true;
} else {
throw new Error("appkey登录失败");
}
} catch (error) {
throw error;
}
} }
} }
}; };
......
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import { getUrlSearchQuery } from '@/utils';
const TokenKey = 'Admin-Token'; const TokenKey = 'Admin-Token';
const Tenantid = 'Tenantid'; const Tenantid = 'Tenantid';
...@@ -30,3 +31,41 @@ export function setBiAuth(token) { ...@@ -30,3 +31,41 @@ export function setBiAuth(token) {
sessionStorage.setItem("DSK_SYSTEM_AUTH_TOKEN", token); sessionStorage.setItem("DSK_SYSTEM_AUTH_TOKEN", token);
return true; return true;
} }
/**
* 获取第三方app key
* @returns
*/
export function getThirdPlatform() {
const platForm = sessionStorage.getItem("PLAT_FORM");
if (platForm) return platForm;
// sessiongStorage 未获取到appkey 寻找url上的参数
const { platFormKey } = getUrlSearchQuery();
if (platFormKey) {
return setThirdPlatform(platFormKey) ? platFormKey : "";
} else {
return "";
};
}
/**
* 储存第三方app key
* @param {*} appkey
* @returns
*/
export function setThirdPlatform(appkey) {
try {
if (!appkey) throw new Error("");
sessionStorage.setItem("PLAT_FORM", appkey);
return true;
} catch (error) {
return false;
}
}
/**
* 移除第三方app key
*/
export function removeThirdPlatform() {
sessionStorage.removeItem("PLAT_FORM");
}
<template> <template>
<div class="errPage-container"> <div class="errPage-container">
<el-button icon="arrow-left" class="pan-back-btn" @click="back"> <el-button icon="arrow-left" class="pan-back-btn" @click="isSecretFreeLogin === false ? back() : aginLogin()">
返回 {{isSecretFreeLogin === false ? "返回" : "重新登录"}}
</el-button> </el-button>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
401错误! 401错误!
</h1> </h1>
<h2>您没有访问权限!</h2> <h2>您没有访问权限!</h2>
<h6>对不起,您没有访问权限,请不要进行非法操作!您可以返回主页面</h6> <h6>对不起,您没有访问权限,请不要进行非法操作!{{isSecretFreeLogin === true ? "您可以尝试使用appkey重新登录系统" : "您可以返回主界面"}}</h6>
<ul class="list-unstyled"> <ul class="list-unstyled" v-if="isSecretFreeLogin === false">
<li class="link-type"> <li class="link-type">
<router-link to="/"> <router-link to="/">
回首页 回首页
...@@ -26,21 +26,46 @@ ...@@ -26,21 +26,46 @@
</template> </template>
<script> <script>
import errGif from '@/assets/images/401/401.gif' import errGif from '@/assets/images/401/401.gif';
import { getThirdPlatform } from "@/utils/auth";
export default { export default {
name: 'Page401', name: 'Page401',
data() { data() {
return { return {
errGif: errGif + '?' + +new Date() errGif: errGif + '?' + +new Date(),
isSecretFreeLogin: null
};
},
created() {
const { isSecretFreeLogin } = this.$route.query;
try {
this.isSecretFreeLogin = JSON.parse(isSecretFreeLogin);
} catch (error) {
} }
}, },
methods: { methods: {
back() { back() {
if (this.$route.query.noGoBack) { if (this.$route.query.noGoBack) {
this.$router.push({ path: '/' }) this.$router.push({ path: '/' });
} else {
this.$router.go(-1);
}
},
aginLogin() {
const platFormKey = getThirdPlatform();
if (platFormKey) {
this.$router.replace({
path: "/",
query: {
platFormKey
}
});
} else { } else {
this.$router.go(-1) this.$router.replace({
path: "/login"
});
} }
} }
} }
...@@ -48,41 +73,44 @@ export default { ...@@ -48,41 +73,44 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.errPage-container { .errPage-container {
width: 800px; width: 800px;
max-width: 100%; max-width: 100%;
margin: 100px auto; margin: 100px auto;
.pan-back-btn { .pan-back-btn {
background: #008489; background: #008489;
color: #fff; color: #fff;
border: none!important; border: none !important;
} }
.pan-gif { .pan-gif {
margin: 0 auto; margin: 0 auto;
display: block; display: block;
} }
.pan-img { .pan-img {
display: block; display: block;
margin: 0 auto; margin: 0 auto;
width: 100%; width: 100%;
} }
.text-jumbo { .text-jumbo {
font-size: 60px; font-size: 60px;
font-weight: 700; font-weight: 700;
color: #484848; color: #484848;
}
.list-unstyled {
font-size: 14px;
li {
padding-bottom: 5px;
} }
.list-unstyled { a {
font-size: 14px; color: #008489;
li { text-decoration: none;
padding-bottom: 5px; &:hover {
} text-decoration: underline;
a {
color: #008489;
text-decoration: none;
&:hover {
text-decoration: underline;
}
} }
} }
} }
h6 {
line-height: 22px;
}
}
</style> </style>
package com.dsk.system.domain; package com.dsk.system.domain;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import com.dsk.common.annotation.Sensitive; import com.dsk.common.annotation.Sensitive;
import com.dsk.common.constant.UserConstants; import com.dsk.common.constant.UserConstants;
import com.dsk.common.enums.SensitiveStrategy; import com.dsk.common.enums.SensitiveStrategy;
import com.dsk.common.tenant.core.TenantEntity; import com.dsk.common.tenant.core.TenantEntity;
import com.dsk.common.xss.Xss; import com.dsk.common.xss.Xss;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.validation.constraints.Email; import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
/** /**
* 用户对象 sys_user * 用户对象 sys_user
* *
* @author Lion Li * @author Lion Li
*/ */
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@TableName("sys_user") @TableName("sys_user")
public class SysUser extends TenantEntity { public class SysUser extends TenantEntity {
/** /**
* 用户ID * 用户ID
*/ */
@TableId(value = "user_id") @TableId(value = "user_id")
private Long userId; private Long userId;
/** /**
* 部门ID * 三方平台跳转本系统所需秘钥
*/ */
private Long deptId; private String thirdPlatformKey;
/** /**
* 用户账号 * 部门ID
*/ */
@Xss(message = "用户账号不能包含脚本字符") private Long deptId;
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") /**
private String userName; * 用户账号
*/
/** @Xss(message = "用户账号不能包含脚本字符")
* 用户昵称 @NotBlank(message = "用户账号不能为空")
*/ @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符")
@Xss(message = "用户昵称不能包含脚本字符") private String userName;
@NotBlank(message = "用户昵称不能为空")
@Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") /**
private String nickName; * 用户昵称
*/
/** @Xss(message = "用户昵称不能包含脚本字符")
* 用户类型(sys_user系统用户) @NotBlank(message = "用户昵称不能为空")
*/ @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符")
private String userType; private String nickName;
/** /**
* 用户邮箱 * 用户类型(sys_user系统用户)
*/ */
@Sensitive(strategy = SensitiveStrategy.EMAIL) private String userType;
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") /**
private String email; * 用户邮箱
*/
/** @Sensitive(strategy = SensitiveStrategy.EMAIL)
* 手机号码 @Email(message = "邮箱格式不正确")
*/ @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符")
@Sensitive(strategy = SensitiveStrategy.PHONE) private String email;
private String phonenumber;
/**
/** * 手机号码
* 用户性别 */
*/ @Sensitive(strategy = SensitiveStrategy.PHONE)
private String sex; private String phonenumber;
/** /**
* 用户头像 * 用户性别
*/ */
private String avatar; private String sex;
/** /**
* 密码 * 用户头像
*/ */
@TableField( private String avatar;
insertStrategy = FieldStrategy.NOT_EMPTY,
updateStrategy = FieldStrategy.NOT_EMPTY, /**
whereStrategy = FieldStrategy.NOT_EMPTY * 密码
) */
private String password; @TableField(
insertStrategy = FieldStrategy.NOT_EMPTY,
@JsonIgnore updateStrategy = FieldStrategy.NOT_EMPTY,
@JsonProperty whereStrategy = FieldStrategy.NOT_EMPTY
public String getPassword() { )
return password; private String password;
}
@JsonIgnore
/** @JsonProperty
* 帐号状态(0正常 1停用) public String getPassword() {
*/ return password;
private String status; }
/** /**
* 删除标志(0代表存在 2代表删除) * 帐号状态(0正常 1停用)
*/ */
@TableLogic private String status;
private String delFlag;
/**
/** * 删除标志(0代表存在 2代表删除)
* 最后登录IP */
*/ @TableLogic
private String loginIp; private String delFlag;
/** /**
* 最后登录时间 * 最后登录IP
*/ */
private Date loginDate; private String loginIp;
/** /**
* 备注 * 最后登录时间
*/ */
private String remark; private Date loginDate;
/** /**
* 创建时间 * 备注
*/ */
private Date createTime; private String remark;
/** /**
* 部门对象 * 创建时间
*/ */
@TableField(exist = false) private Date createTime;
private SysDept dept;
/**
/** * 部门对象
* 角色对象 */
*/ @TableField(exist = false)
@TableField(exist = false) private SysDept dept;
private List<SysRole> roles;
/**
/** * 角色对象
* 角色组 */
*/ @TableField(exist = false)
@TableField(exist = false) private List<SysRole> roles;
private Long[] roleIds;
/**
/** * 角色组
* 岗位组 */
*/ @TableField(exist = false)
@TableField(exist = false) private Long[] roleIds;
private Long[] postIds;
/**
/** * 岗位组
* 数据权限 当前角色ID */
*/ @TableField(exist = false)
@TableField(exist = false) private Long[] postIds;
private Long roleId;
/**
* 数据权限 当前角色ID
public SysUser(Long userId) { */
this.userId = userId; @TableField(exist = false)
} private Long roleId;
public boolean isAdmin() {
return UserConstants.ADMIN_ID.equals(this.userId); public SysUser(Long userId) {
} this.userId = userId;
}
public boolean isSuperAdmin() {
return UserConstants.SUPER_ADMIN_ID.equals(this.userId); public boolean isAdmin() {
} return UserConstants.ADMIN_ID.equals(this.userId);
}
}
public boolean isSuperAdmin() {
return UserConstants.SUPER_ADMIN_ID.equals(this.userId);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment