From 964ca18c53443ab783604201e87f7ebc447b8bf9 Mon Sep 17 00:00:00 2001
From: tanyp <742354529@qq.com>
Date: Wed, 29 Mar 2023 16:10:18 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
tansci-boot-ui/.env.development | 2 +-
tansci-boot-ui/.env.production | 2 +-
tansci-boot-ui/src/api/auth.ts | 53 ++++----
.../src/components/layout/Empty.vue | 3 +
.../src/components/layout/Index.vue | 5 +-
tansci-boot-ui/src/components/layout/None.vue | 7 +
tansci-boot-ui/src/router/common.ts | 18 +++
tansci-boot-ui/src/router/index.ts | 51 ++++++-
tansci-boot-ui/src/router/permission.ts | 97 +++++++++++++
tansci-boot-ui/src/utils/common.ts | 16 +++
tansci-boot-ui/src/utils/request.ts | 2 +-
tansci-boot-ui/src/views/common/Component.vue | 12 ++
tansci-boot-ui/src/views/common/Iframe.vue | 23 ++++
tansci-boot-ui/src/views/common/Login.vue | 3 +-
tansci-boot-ui/vite.config.ts | 14 +-
.../java/com/tansci/config/SaTokenConfig.java | 2 +-
.../com/tansci/controller/AuthController.java | 7 +-
.../tansci/controller/SysDicController.java | 26 ++++
.../tansci/controller/SysLogController.java | 29 ++++
.../tansci/controller/SysMenuController.java | 39 ++++++
.../tansci/controller/SysOrgController.java | 26 ++++
.../tansci/controller/SysRoleController.java | 27 ++++
.../tansci/controller/SysUserController.java | 14 +-
.../main/java/com/tansci/domain/SysRole.java | 5 +-
.../main/java/com/tansci/domain/SysUser.java | 13 +-
.../tansci/domain/vo/SysUserSessionVo.java | 41 ++++++
.../java/com/tansci/domain/vo/SysUserVo.java | 46 +++++++
.../handler/GlobalExceptionHandler.java | 2 +-
.../java/com/tansci/mapper/SysDicMapper.java | 16 +++
.../com/tansci/mapper/SysLoginLogMapper.java | 16 +++
.../java/com/tansci/mapper/SysMenuMapper.java | 16 +++
.../com/tansci/mapper/SysOperLogMapper.java | 16 +++
.../java/com/tansci/mapper/SysOrgMapper.java | 16 +++
.../java/com/tansci/mapper/SysRoleMapper.java | 16 +++
.../com/tansci/mapper/SysRoleMenuMapper.java | 16 +++
.../com/tansci/mapper/SysRoleOrgMapper.java | 16 +++
.../com/tansci/mapper/SysUserRoleMapper.java | 16 +++
.../com/tansci/service/SysDicService.java | 14 ++
.../tansci/service/SysLoginLogService.java | 14 ++
.../com/tansci/service/SysMenuService.java | 19 +++
.../com/tansci/service/SysOperLogService.java | 14 ++
.../com/tansci/service/SysOrgService.java | 14 ++
.../tansci/service/SysRoleMenuService.java | 14 ++
.../com/tansci/service/SysRoleService.java | 14 ++
.../tansci/service/SysUserRoleService.java | 14 ++
.../com/tansci/service/SysUserService.java | 11 +-
.../service/impl/SysDicServiceImpl.java | 20 +++
.../service/impl/SysLoginLogServiceImpl.java | 20 +++
.../service/impl/SysMenuServiceImpl.java | 63 +++++++++
.../service/impl/SysOperLogServiceImpl.java | 20 +++
.../service/impl/SysOrgServiceImpl.java | 21 +++
.../service/impl/SysRoleMenuServiceImpl.java | 20 +++
.../service/impl/SysRoleServiceImpl.java | 20 +++
.../service/impl/SysUserRoleServiceImpl.java | 20 +++
.../service/impl/SysUserServiceImpl.java | 128 +++++++++++-------
.../src/main/resources/application.yml | 4 +-
56 files changed, 1085 insertions(+), 108 deletions(-)
create mode 100644 tansci-boot-ui/src/components/layout/Empty.vue
create mode 100644 tansci-boot-ui/src/components/layout/None.vue
create mode 100644 tansci-boot-ui/src/router/permission.ts
create mode 100644 tansci-boot-ui/src/utils/common.ts
create mode 100644 tansci-boot-ui/src/views/common/Component.vue
create mode 100644 tansci-boot-ui/src/views/common/Iframe.vue
create mode 100644 tansci-boot/src/main/java/com/tansci/controller/SysDicController.java
create mode 100644 tansci-boot/src/main/java/com/tansci/controller/SysLogController.java
create mode 100644 tansci-boot/src/main/java/com/tansci/controller/SysMenuController.java
create mode 100644 tansci-boot/src/main/java/com/tansci/controller/SysOrgController.java
create mode 100644 tansci-boot/src/main/java/com/tansci/controller/SysRoleController.java
create mode 100644 tansci-boot/src/main/java/com/tansci/domain/vo/SysUserSessionVo.java
create mode 100644 tansci-boot/src/main/java/com/tansci/domain/vo/SysUserVo.java
create mode 100644 tansci-boot/src/main/java/com/tansci/mapper/SysDicMapper.java
create mode 100644 tansci-boot/src/main/java/com/tansci/mapper/SysLoginLogMapper.java
create mode 100644 tansci-boot/src/main/java/com/tansci/mapper/SysMenuMapper.java
create mode 100644 tansci-boot/src/main/java/com/tansci/mapper/SysOperLogMapper.java
create mode 100644 tansci-boot/src/main/java/com/tansci/mapper/SysOrgMapper.java
create mode 100644 tansci-boot/src/main/java/com/tansci/mapper/SysRoleMapper.java
create mode 100644 tansci-boot/src/main/java/com/tansci/mapper/SysRoleMenuMapper.java
create mode 100644 tansci-boot/src/main/java/com/tansci/mapper/SysRoleOrgMapper.java
create mode 100644 tansci-boot/src/main/java/com/tansci/mapper/SysUserRoleMapper.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/SysDicService.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/SysLoginLogService.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/SysMenuService.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/SysOperLogService.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/SysOrgService.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/SysRoleMenuService.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/SysRoleService.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/SysUserRoleService.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/impl/SysDicServiceImpl.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/impl/SysLoginLogServiceImpl.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/impl/SysMenuServiceImpl.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/impl/SysOperLogServiceImpl.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/impl/SysOrgServiceImpl.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/impl/SysRoleMenuServiceImpl.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/impl/SysRoleServiceImpl.java
create mode 100644 tansci-boot/src/main/java/com/tansci/service/impl/SysUserRoleServiceImpl.java
diff --git a/tansci-boot-ui/.env.development b/tansci-boot-ui/.env.development
index be64e7f..63051f1 100644
--- a/tansci-boot-ui/.env.development
+++ b/tansci-boot-ui/.env.development
@@ -1 +1 @@
-VITE_BASE_API = 'http://localhost:8081/'
\ No newline at end of file
+VITE_BASE_API = 'http://localhost:8080/'
\ No newline at end of file
diff --git a/tansci-boot-ui/.env.production b/tansci-boot-ui/.env.production
index be64e7f..63051f1 100644
--- a/tansci-boot-ui/.env.production
+++ b/tansci-boot-ui/.env.production
@@ -1 +1 @@
-VITE_BASE_API = 'http://localhost:8081/'
\ No newline at end of file
+VITE_BASE_API = 'http://localhost:8080/'
\ No newline at end of file
diff --git a/tansci-boot-ui/src/api/auth.ts b/tansci-boot-ui/src/api/auth.ts
index 68d2a1e..4ee261e 100644
--- a/tansci-boot-ui/src/api/auth.ts
+++ b/tansci-boot-ui/src/api/auth.ts
@@ -1,52 +1,59 @@
import request from '@/utils/request'
-// token key
+const userKey:string = 'tansci_boot_user'
const tokenKey:string = 'tansci_boot_token'
-// 获取token
+// token信息
export function getToken() {
return sessionStorage.getItem(tokenKey);
}
-
-// 存储token
export function setToken(token:string) {
sessionStorage.setItem(tokenKey, token);
}
-
-// 删除token
export function removeToken() {
sessionStorage.removeItem(tokenKey);
}
+// 用户信息
+export function getUser() {
+ return sessionStorage.getItem(userKey);
+}
+export function setUser(data:any) {
+ return sessionStorage.setItem(userKey, JSON.stringify(data));
+}
+export function removeUser() {
+ return sessionStorage.removeItem(userKey);
+}
+
// 登录
export function login(data:any){
return new Promise((resolve, reject) => {
- request({
- url: '/system/security/login',
- method: 'post',
- data: {
- username: data.username,
- password: data.password,
- code: data.code,
- uuid: data.uuid
- }
- }).then((res:any) => {
- var token = res.data
- setToken(token)
- resolve(token)
- }).catch((e:any) => {
- reject(e)
- })
+ request({
+ url: '/tansci/auth/login',
+ method: 'post',
+ data: {
+ username: data.username,
+ password: data.password,
+ code: data.code
+ }
+ }).then((res:any) => {
+ setToken(res.data.result.token)
+ setUser(res.data.result)
+ resolve(res.data.result.token)
+ }).catch((e:any) => {
+ reject(e)
+ })
})
}
// 登出
export function logout(){
request({
- url: '/system/security/logout',
+ url: '/tansci/auth/logout',
method: 'get'
}).then(() => {
removeToken()
+ removeUser()
location.reload()
})
}
\ No newline at end of file
diff --git a/tansci-boot-ui/src/components/layout/Empty.vue b/tansci-boot-ui/src/components/layout/Empty.vue
new file mode 100644
index 0000000..400c7f2
--- /dev/null
+++ b/tansci-boot-ui/src/components/layout/Empty.vue
@@ -0,0 +1,3 @@
+
+ 空页面
+
\ No newline at end of file
diff --git a/tansci-boot-ui/src/components/layout/Index.vue b/tansci-boot-ui/src/components/layout/Index.vue
index 05ae6af..2ffd1a4 100644
--- a/tansci-boot-ui/src/components/layout/Index.vue
+++ b/tansci-boot-ui/src/components/layout/Index.vue
@@ -23,6 +23,9 @@
// 获取菜单
let routers:any = [];
let _routes = router.options.routes;
+
+ console.log("_routes:",_routes)
+
_routes.forEach((item:any)=>{
if(item.children && item.type == 0){
routers.push(item)
@@ -109,7 +112,7 @@
}
}
.el-aside{
- ::v-deep .el-menu{
+ :deep(.el-menu) {
margin: 0 0.6rem;
padding: 0 0.2rem;
border-right: none;
diff --git a/tansci-boot-ui/src/components/layout/None.vue b/tansci-boot-ui/src/components/layout/None.vue
new file mode 100644
index 0000000..3582ba1
--- /dev/null
+++ b/tansci-boot-ui/src/components/layout/None.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tansci-boot-ui/src/router/common.ts b/tansci-boot-ui/src/router/common.ts
index a13698d..38e3131 100644
--- a/tansci-boot-ui/src/router/common.ts
+++ b/tansci-boot-ui/src/router/common.ts
@@ -20,5 +20,23 @@ export default[
name: '500',
meta: {title: "500"},
component: () => import('@/views/common/500.vue')
+ },
+ {
+ path: '/index',
+ name: 'index',
+ type: 0,
+ icon: 'HomeFilled',
+ meta: { title: "首页" },
+ component: () => import("@/components/layout/Index.vue"),
+ children: [
+ {
+ path: '/index',
+ name: 'index',
+ type: 0,
+ icon: 'HomeFilled',
+ meta: { title: "首页" },
+ component: () => import('@/views/Index.vue')
+ }
+ ]
}
]
\ No newline at end of file
diff --git a/tansci-boot-ui/src/router/index.ts b/tansci-boot-ui/src/router/index.ts
index 2b33c7e..fb80bda 100644
--- a/tansci-boot-ui/src/router/index.ts
+++ b/tansci-boot-ui/src/router/index.ts
@@ -1,14 +1,61 @@
import { createRouter, createWebHistory } from "vue-router"
+import { ElMessage } from 'element-plus'
+import { getToken, removeToken, removeUser } from "@/api/auth"
+import { generateRoutes } from "./permission"
-import routers from './routers'
+// import routers from './routers'
import common from './common'
const router = createRouter({
history: createWebHistory(),
routes: [
...common,
- ...routers
+ // ...routers
]
})
+const whiteList = ['/login']
+let load = false
+router.beforeEach(async (to:any, from:any, next) => {
+ // 设置头部
+ if(to.meta.title){
+ document.title = to.meta.title
+ } else {
+ document.title = "Tansci Boot"
+ }
+
+ if(getToken()){
+ if(to.path === '/login'){
+ next({ path: '/index' })
+ } else {
+ if(load){
+ next()
+ } else {
+ load = true
+ try {
+ // 获取菜单
+ await generateRoutes().then( (accessRoutes:any) => {
+ accessRoutes.forEach( (item:any) => {
+ router.addRoute(item)
+ })
+ })
+
+ next({ ...to, replace: true })
+ } catch (error:any) {
+ removeToken()
+ removeUser()
+ ElMessage.error(error.data || 'Has Error')
+ next(`/login`)
+ }
+ }
+ }
+ } else {
+ if(whiteList.indexOf(to.path) !== -1){
+ next()
+ } else {
+ next({ path: "/login" })
+ }
+ }
+})
+
export default router
\ No newline at end of file
diff --git a/tansci-boot-ui/src/router/permission.ts b/tansci-boot-ui/src/router/permission.ts
new file mode 100644
index 0000000..c86babe
--- /dev/null
+++ b/tansci-boot-ui/src/router/permission.ts
@@ -0,0 +1,97 @@
+import request from '@/utils/request'
+import common from '@/utils/common'
+
+const viewModules = import.meta.glob("../views/**/**.vue")
+const layoutModules = import.meta.glob("../components/layout/**.vue")
+
+// 根据菜单构建动态路由
+export const filterAsyncRouter = (routers:any, level:any) => {
+ level = level || 0
+ const accessedRouters = routers.filter( (router:any) => {
+ if (router.isShow === 1) {
+ var setIframe = () => {
+ router.component = loadView(`/common/Iframe`)
+ router.props = { url: router.url }
+ router.path = "/" + router.url
+ }
+
+ if(router.url && router.url.startsWith('http')){
+ if(router.openMode == '0'){
+ setIframe()
+ }
+ } else if(router.url && router.url.startsWith('/') && router.url.indexOf('.htm') != -1) {
+ if(router.openMode == '0'){
+ setIframe()
+ }else{
+ router.path = location.href.substring(0, location.href.indexOf('/', location.href.indexOf('/', location.href.indexOf('/') + 1) + 1)) + router.path
+ }
+ } else if (router.componentName) {
+ router.props = {
+ name: router.componentName,
+ id :router.id
+ }
+
+ // 根据组件类型渲染
+ router.component = loadView(`/common/Component`)
+ } else if (router.component) { // 如果是现成组件
+ const component:any = router.component
+ if (component === 'Layout') {
+ router.path = "/" + common.uuid()
+ router.component = level > 0 ? layoutModules[`../components/layout/None.vue`] : loadLayoutView()
+ } else {
+ router.path = router.path.startsWith('/') ? router.path : '/' + router.path
+ router.component = loadView(component) || layoutModules[`../components/layout/Empty.vue`]
+ }
+ }
+ if (router.children && router.children.length) {
+ router.children = filterAsyncRouter(router.children, level + 1)
+ }
+ return true
+ }
+ return false
+ })
+ return accessedRouters
+}
+
+export const loadLayoutView = () => {
+ return layoutModules[`../components/layout/Index.vue`]
+}
+
+export const loadView = (view:any) => {
+ view = view.substring(0, 1) === '/' ? view : '/' + view
+ return viewModules[`../views${view}.vue`]
+}
+
+// 获取当前用户的权限菜单
+export function generateRoutes(){
+ return new Promise((resolve, reject) => {
+ request({
+ url: '/tansci/sysmenu/tree',
+ method: 'get'
+ }).then( (res:any) => {
+ let data = recastData(res.data.result, [])
+ console.log(data)
+ const asyncRouter = filterAsyncRouter(data, 0)
+ resolve(asyncRouter)
+ })
+ })
+}
+
+export function recastData(data:any, arr:any){
+ data.forEach( (item:any) => {
+ arr.push({
+ path: item.url,
+ name: item.url,
+ icon: item.icon,
+ isShow: item.isShow,
+ component: item.component,
+ meta: {
+ title: item.chineseName,
+ keepAlive: item.keepAlive
+ }
+ })
+ if (item.children && item.children.length) {
+ recastData(item.children, arr);
+ }
+ });
+}
\ No newline at end of file
diff --git a/tansci-boot-ui/src/utils/common.ts b/tansci-boot-ui/src/utils/common.ts
new file mode 100644
index 0000000..348f691
--- /dev/null
+++ b/tansci-boot-ui/src/utils/common.ts
@@ -0,0 +1,16 @@
+const common:any = {}
+
+// 生成UUID
+common.uuid = () => {
+ function S4() {
+ return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
+ }
+ return (S4()+S4()+S4()+S4()+S4()+S4()+S4()+S4());
+}
+
+// 是否包含逗号
+common.isComma = (value:any) => {
+ return value.toString().indexOf(',') !== -1
+}
+
+export default common
\ No newline at end of file
diff --git a/tansci-boot-ui/src/utils/request.ts b/tansci-boot-ui/src/utils/request.ts
index b3114b5..bc9224a 100644
--- a/tansci-boot-ui/src/utils/request.ts
+++ b/tansci-boot-ui/src/utils/request.ts
@@ -18,7 +18,7 @@ const axiosInstance: AxiosInstance = axios.create({
axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {
// 设置token
if (getToken()) {
- config.headers.Authorization = `Bearer ${getToken()}`
+ config.headers.token = getToken()
}
return config;
},
diff --git a/tansci-boot-ui/src/views/common/Component.vue b/tansci-boot-ui/src/views/common/Component.vue
new file mode 100644
index 0000000..74a6a08
--- /dev/null
+++ b/tansci-boot-ui/src/views/common/Component.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/tansci-boot-ui/src/views/common/Iframe.vue b/tansci-boot-ui/src/views/common/Iframe.vue
new file mode 100644
index 0000000..cf6379a
--- /dev/null
+++ b/tansci-boot-ui/src/views/common/Iframe.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
diff --git a/tansci-boot-ui/src/views/common/Login.vue b/tansci-boot-ui/src/views/common/Login.vue
index b41f05a..f51d693 100644
--- a/tansci-boot-ui/src/views/common/Login.vue
+++ b/tansci-boot-ui/src/views/common/Login.vue
@@ -78,8 +78,7 @@
+ {required: true,message: '请输入密码',trigger: 'blur'}]">
diff --git a/tansci-boot-ui/vite.config.ts b/tansci-boot-ui/vite.config.ts
index 533762d..236faa7 100644
--- a/tansci-boot-ui/vite.config.ts
+++ b/tansci-boot-ui/vite.config.ts
@@ -10,6 +10,7 @@ import {
transformerVariantGroup,
} from 'unocss'
+const url = "http://127.0.0.1:8080"
export default defineConfig({
resolve: {
alias: {
@@ -39,5 +40,16 @@ export default defineConfig({
transformerVariantGroup(),
]
}),
- ]
+ ],
+ server: {
+ proxy: {
+ '/tansci': {
+ target: url,
+ changeOrigin: true,
+ pathRewrite: {
+ '^/tansci':'/tansci'
+ }
+ }
+ }
+ }
})
diff --git a/tansci-boot/src/main/java/com/tansci/config/SaTokenConfig.java b/tansci-boot/src/main/java/com/tansci/config/SaTokenConfig.java
index a0f3107..bc22bd3 100644
--- a/tansci-boot/src/main/java/com/tansci/config/SaTokenConfig.java
+++ b/tansci-boot/src/main/java/com/tansci/config/SaTokenConfig.java
@@ -23,7 +23,7 @@ public class SaTokenConfig implements WebMvcConfigurer {
// 验证所有接口
.addPathPatterns("/**")
// 忽略校验
- .excludePathPatterns("/auth/**","/magic/**");
+ .excludePathPatterns("/auth/**");
}
}
diff --git a/tansci-boot/src/main/java/com/tansci/controller/AuthController.java b/tansci-boot/src/main/java/com/tansci/controller/AuthController.java
index b8eda16..4b361f2 100644
--- a/tansci-boot/src/main/java/com/tansci/controller/AuthController.java
+++ b/tansci-boot/src/main/java/com/tansci/controller/AuthController.java
@@ -1,9 +1,11 @@
package com.tansci.controller;
+import cn.dev33.satoken.session.SaSessionCustomUtil;
import cn.dev33.satoken.stp.StpUtil;
import com.tansci.common.WrapMapper;
import com.tansci.common.Wrapper;
import com.tansci.domain.SysUser;
+import com.tansci.domain.vo.SysUserVo;
import com.tansci.service.SysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -29,13 +31,14 @@ public class AuthController {
@ApiOperation(value = "登录", notes = "登录")
@PostMapping("/login")
- public Wrapper login(@RequestBody SysUser user) {
- return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysUserService.login(user.getUsername()));
+ public Wrapper login(@RequestBody SysUser user) {
+ return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysUserService.login(user));
}
@ApiOperation(value = "登出", notes = "登出")
@GetMapping("/logout")
public Wrapper