-
-

-
-
-
-
-
-
-
{{ $store.state.user.name }}
-
-
-
-
- 系统首页
-
-
-
- 个人信息
-
-
-
-
- 软件安装
-
-
-
- 退出
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
diff --git a/src/layout/nested.vue b/src/layout/nested.vue
new file mode 100644
index 0000000..15584f6
--- /dev/null
+++ b/src/layout/nested.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/src/main.js b/src/main.js
index feb608e..602dcc5 100644
--- a/src/main.js
+++ b/src/main.js
@@ -57,28 +57,37 @@ Vue.prototype.$integrateData = (target,value) => {
}
window.$router = router;
-// if (window.__POWERED_BY_WUJIE__) {
-// let instance;
-// window.__WUJIE_MOUNT = () => {
-// instance = new Vue({
-// router,
-// store,
-// render: h => h(App)
-// }).$mount("#app")
-// };
-// window.__WUJIE_UNMOUNT = () => {
-// instance.$destroy();
-// };
-// } else {
-// new Vue({
-// router,
-// store,
-// render: h => h(App)
-// }).$mount("#app")
-// }
-new Vue({
- el: '#app',
- router,
- store,
- render: h => h(App)
-})
+if (window.__POWERED_BY_WUJIE__) {
+ let instance;
+ window.__WUJIE_MOUNT = () => {
+ instance = new Vue({
+ router,
+ store,
+ render: h => h(App)
+ }).$mount("#app")
+ window.MODULE_NAME = window.$wujie?.props?.module_name;
+ console.log('token-wujie',window.MODULE_NAME)
+ setToken(window.$wujie?.props?.auth_token)
+ router.push('/')
+ };
+ window.__WUJIE_UNMOUNT = () => {
+ instance.$destroy();
+ };
+} else {
+ if (window.top !== window.self) {
+ // 当前页面在iframe中
+ window._IN_IFRAME = true;
+ window.addEventListener("message",function (e) {
+ const { module_name, auth_token } = e.data;
+ window.MODULE_NAME = module_name;
+ console.log('token',auth_token)
+ setToken(auth_token)
+ router.push('/')
+ })
+ }
+ new Vue({
+ router,
+ store,
+ render: h => h(App)
+ }).$mount("#app")
+}
diff --git a/src/permission.js b/src/permission.js
index 316fdc5..ac3a513 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -1,91 +1,46 @@
import router from './router'
import store from './store'
-import {
- Message
-} from 'element-ui'
+import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
-import {
- getToken
-} from '@/utils/auth' // get token from cookie
+import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'
-import { loginOssV2, loginOss } from "@/api/user"
-import { setToken, removeToken } from "@/utils/auth";
-NProgress.configure({
- showSpinner: false
-}) // NProgress Configuration
+NProgress.configure({ showSpinner: false }) // NProgress Configuration
-const whiteList = ['/login','/preview'] // no redirect whitelist
+const whiteList = ['/login'] // no redirect whitelist
-router.beforeEach(async (to, from, next) => {
+router.beforeEach(async(to, from, next) => {
// start progress bar
NProgress.start()
- store.commit('app/SET_ISINIFRAME')
// set page title
document.title = getPageTitle(to.meta.title)
- if (to.query.token) {
- removeToken()
- const res = await loginOss({
- auth_token: to.query.token
- })
- setToken(res.access_token)
- store.commit('user/SET_TOKEN',res.access_token)
-
- const {
- roles
- } = await store.dispatch('user/getInfo')
-
- // generate accessible routes map based on roles
- const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
-
- // dynamically add accessible routes
- router.addRoutes(accessRoutes)
-
- delete to.query.token
- next({
- ...to,
- replace: true
- })
- return
- }
// determine whether the user has logged in
const hasToken = getToken()
-
+ console.log(4444,hasToken)
if (hasToken) {
if (to.path === '/login') {
// if is logged in, redirect to the home page
next({ path: '/' })
NProgress.done()
} else {
- // determine whether the user has obtained his permission roles through getInfo
- const hasRoles = store.getters.roles && store.getters.roles.length > 0
- if (hasRoles) {
+
+ if (store.state.permission.addRoutes && store.state.permission.addRoutes instanceof Array && store.state.permission.addRoutes.length > 0) {
next()
} else {
try {
// get user info
- // note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
- const {
- roles
- } = await store.dispatch('user/getInfo')
-
- // generate accessible routes map based on roles
+ const { roles } = await store.dispatch('user/getInfo')
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
-
// dynamically add accessible routes
router.addRoutes(accessRoutes)
// hack method to ensure that addRoutes is complete
// set the replace: true, so the navigation will not leave a history record
- next({
- ...to,
- replace: true
- })
+ next({ ...to, replace: true })
} catch (error) {
- console.log(error)
// remove token and go to login page to re-login
await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
diff --git a/src/router/index.js b/src/router/index.js
index c419cd1..a519a7d 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -45,9 +45,9 @@ export const constantRoutes = [{
{
path: '/',
component: Layout,
- redirect: '/worker',
+ redirect: '/dashboard',
children: [{
- path: 'contract/dashboard',
+ path: 'dashboard',
name: '系统首页',
component: () => import('@/views/dashboard/index'),
meta: {
diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js
index f6bf3c2..a3b2329 100644
--- a/src/store/modules/permission.js
+++ b/src/store/modules/permission.js
@@ -1,83 +1,45 @@
-import {
- asyncRoutes,
- constantRoutes
-} from '@/router'
-import Layout from '@/layout'
-import {
- getAuthMenu
-} from '@/api/user.js'
-const pathHandler = (item) => {
- if(!item.path || item.path?.includes('#') || item.path == ''){
- return item.id + '_key'
- }
- if(/^\^/.test(item.path)){
- return item.path.replace(/^\^+/g,"")
- }
- if(/^\$/.test(item.path)){
- return item.path.replace(/^\$+/g,"")
- }
- return item.path
- // if(path.includes('$')){
- // return path.replace(/^\$+/g,"")
- // }
- // if(path.includes('^')){
- // return path.replace(/^\^+/g,"")
- // }
- // if(path.includes('#') || path == ''){
- // return id + '_key'
- // }
- // return path
+import { asyncRoutes, constantRoutes } from '@/router'
+import { permissions } from "@/api/me"
+import path from "path"
+import Layout from "@/layout"
+import Nested from "@/layout/nested.vue"
+
+const loadView = (view) => {
+ return (resolve) => require([`@/views${view}`], resolve);
}
-const componentHandler = (path) => {
- //return path === '#'|| path == '' ? Layout : loadView(path)
- if(path === '#' || path === ''){
+const componentHandle = (url, route)=> {
+ if (/^#+/.test(route.path)) {
return Layout
- }
- if(path.includes('#') && path !== '#'){
- return ()=>import('@/layout/noLayout')
- }
- return loadView(path)
-}
-/**
- * Use meta.role to determine if the current user has permission
- * @param roles
- * @param route
- */
-function hasPermission(roles, route) {
- if (route.meta && route.meta.roles) {
- return roles.some(role => route.meta.roles.includes(role))
+ } else if (/^#+/.test(route.path) && route.pid !== 0) {
+ return Nested
} else {
- return true
+ return loadView(url)
}
}
-/**
- * 静态路由懒加载
- * @param view 格式必须为 xxx/xxx 开头不要加斜杠
- * @returns
- */
-export const loadView = (view) => {
- return (resolve) => require([`@/views${view}`], resolve);
-}
-
-/**
- * Filter asynchronous routing tables by recursion
- * @param routes asyncRoutes
- * @param roles
- */
-export function filterAsyncRoutes(routes, roles) {
+export function filterAsyncRoutes(routes) {
const res = []
routes.forEach(route => {
- const tmp = {
- ...route
- }
- if (hasPermission(roles, tmp)) {
- if (tmp.children) {
- tmp.children = filterAsyncRoutes(tmp.children, roles)
+ if (!route.visible) return
+ let tmp= {
+ key: `key-${route.id}`,
+ path: route.path === '#' ? '' : route.path,
+ component: componentHandle(route.url, route),
+ name: route.name,
+ hidden: !route.visible,
+ meta: {
+ title: route.title,
+ icon: route.icon,
+ guard: route.guard_name,
+ folder: route.folder,
}
- res.push(tmp)
}
+
+ if (route.children && route.children instanceof Array && route.children.length > 0) {
+ tmp.children = filterAsyncRoutes(route.children)
+ }
+ res.push(tmp)
})
return res
@@ -85,176 +47,34 @@ export function filterAsyncRoutes(routes, roles) {
const state = {
routes: [],
- rootMenu:[],
- systemMenu:[],
- addRoutes: [],
-
- sidebarMenuMap: new Map()
-}
-
-/**
- * 后台查询的菜单数据拼装成路由格式的数据
- * @param routes
- */
-export function generaMenu(routes, data) {
- data.forEach(item => {
- let params = {};
- if(item.path?.includes('?')){
- let flag = item.path.split('?')
- item.path = flag[0]
- if(flag[1]){
- let list = flag[1].split('&')
- list.forEach(item => {
- let kv = item.split('=')
- Object.defineProperty(params,kv[0],{
- value:kv[1],
- writable:true,
- enumerable:true,
- configurable:false
- })
- })
- }
- }
- if (item.url === "/") {
- routes.push({
- path: '/',
- component: Layout,
- redirect: '/worker',
- children: [{
- path: 'dashboard',
- name: '系统首页',
- component: () => import('@/views/dashboard/index'),
- meta: {
- title: '系统首页',
- icon: 'dashboard',
- params
- }
- }]
- })
- }else if(/^\^/.test(item.path)){
- const menu = {
- path: pathHandler(item),
- component: Layout,
- children: [{
- path: "",
- name: 'menu_' + item.id,
- component: (item.url.includes('#')||item.path == '') ? Layout : loadView(item.url),
- meta: {
- title: item.name,
- id: item.id,
- roles: ['admin'],
- auths:item.has_auth_node_tags,
- params,
-
- icon: item.icon
- }
- }, ]
- }
- if (item.children) {
- generaMenu(menu.children, item.children)
- }
- routes.push(menu)
- } else {
- var path = item.url;
- if (item.path != "null" && item.path != null && item.path != "") {
- path = item.path
- }
- const menu = {
- path: (path.includes('#') ? item.id + '_key' : path),
- redirect: item.redirect || '',
- component: componentHandler(item.url),
- hidden: item.hidden ?? false,
- children: [],
- name: 'menu_' + item.id,
- meta: {
- title: item.name,
- id: item.id,
- roles: ['admin'],
- params,
- icon: item.icon
- }
- }
- if (item.children) {
- generaMenu(menu.children, item.children)
- }
-
- routes.push(menu)
- }
- })
+ addRoutes: []
}
const mutations = {
SET_ROUTES: (state, routes) => {
state.addRoutes = routes
state.routes = constantRoutes.concat(routes)
- },
- SET_ROOTMENU:(state,menu) => {
- state.rootMenu = menu
- },
- SET_SYSTEMMENU:(state,menu) => {
- state.systemMenu = menu
- },
- SET_SIDEBARMENUMAP: (state,{ k,v }) => {
- state.sidebarMenuMap.set(k,v)
}
}
-
-
const actions = {
- generateRoutes({
- commit
- }, roles) {
- return new Promise(resolve => {
- const loadMenuData = []
- // 先查询后台并返回左侧菜单数据并把数据添加到路由
- getAuthMenu(state.token).then(response => {
- let data = response
-
- commit('SET_ROOTMENU',data)
-
- let routes = data?.find(item => item.path === '/contract').children
- let root = data?.map(item => {
- let menu = []
- generaMenu(menu,item.children)
- commit('SET_SIDEBARMENUMAP', { k: item.path, v: menu })
- if(item.children.length > 0){
- item.redirect = item.children[0]?.path
- }
- if(item.path === '/contract') {
- item.redirect = '/contract/dashboard'
- }
- item.hidden = true
- return item
- })
- Object.assign(loadMenuData, [...routes,...root])
- asyncRoutes.length=0;
- generaMenu(asyncRoutes, loadMenuData)
-
- //console.log(asyncRoutes)
+ generateRoutes({ commit }, roles) {
+ return new Promise(async (resolve, reject) => {
+ try {
+ const routes = await permissions()
let accessedRoutes
- if (roles.includes('admin')) {
- accessedRoutes = asyncRoutes || []
- } else {
- accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
- }
- accessedRoutes.push({
- path: '*',
- redirect: '/404',
- hidden: true
- })
+ accessedRoutes = filterAsyncRoutes(routes)
+ //把404拦截放在最后匹配
+ accessedRoutes.push({ path: '*', redirect: '/404', hidden: true })
commit('SET_ROUTES', accessedRoutes)
resolve(accessedRoutes)
-
- // generaMenu(asyncRoutes, data)
- }).catch(error => {
- console.log(error)
- })
+ } catch (err) {
+ reject(err)
+ }
})
}
}
-
export default {
namespaced: true,
state,
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index e21129a..09e5e97 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -3,7 +3,7 @@ import {
logout,
getInfo,
loginOss
-} from '@/api/user'
+} from '@/api/me'
import { getOaToken } from "@/api/out"
import {
getToken,
@@ -17,14 +17,11 @@ import {
const getDefaultState = () => {
return {
token: getToken(),
- userId:'',
name: '',
- username:'',
avatar: '',
- min_allow_level: 2,
+ adminId: '',
department: {},
- roles: [],
- authToken: ''
+ role: [],
}
}
@@ -37,29 +34,20 @@ const mutations = {
SET_TOKEN: (state, token) => {
state.token = token
},
- SET_LEVEL: (state, level=2) => {
- state.min_allow_level = level
- },
SET_NAME: (state, name) => {
state.name = name
},
- SET_USERNAME:(state,username) => {
- state.username = username
- },
- SET_USERID:(state,id) => {
- state.userId = id
- },
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
- SET_ROLES: (state, roles) => {
- state.roles = roles
+ SET_ROLE: (state, role) => {
+ state.role = role
+ },
+ SET_ADMIN_ID: (state, id) => {
+ state.adminId = id
},
SET_DEPARTMENT: (state, department) => {
state.department = department
- },
- SET_AUTHTOKEN: (state, token) => {
- state.authToken = token
}
}
@@ -105,11 +93,6 @@ const actions = {
username: username.trim(),
password: password
}).then(response => {
- console.log(response)
- const {
- data
- } = response;
- console.log(response.access_token)
commit('SET_TOKEN', response.access_token)
setToken(response.access_token)
@@ -126,34 +109,18 @@ const actions = {
state
}) {
return new Promise((resolve, reject) => {
- getOaToken().then(res => {
-
- commit('SET_AUTHTOKEN',res.auth_token)
- })
- getInfo(state.token).then(response => {
+ getInfo().then(response => {
if (!response) {
reject('身份验证失败请重新登录')
}
- response["roles"] = ["admin"];
- const {
- id,
- roles,
- name,
- username,
- avatar,
- department,
- min_allow_level
- } = response
+ const { name, avatar, id, role, department } = response
- commit('SET_USERNAME',username)
- commit('SET_USERID',id)
- commit('SET_ROLES', roles)
+ commit('SET_DEPARTMENT',department)
commit('SET_NAME', name)
commit('SET_AVATAR', avatar)
- commit('SET_DEPARTMENT', department)
- commit('SET_LEVEL', min_allow_level)
-
+ commit('SET_ADMIN_ID', id)
+ commit('SET_ROLE', role)
resolve(response)
}).catch(error => {
reject(error)
diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss
index 47182f5..49b42a4 100644
--- a/src/styles/sidebar.scss
+++ b/src/styles/sidebar.scss
@@ -5,7 +5,6 @@
transition: margin-left .28s;
margin-left: $sideBarWidth;
position: relative;
- top: 50px;
}
.sidebar-container {
@@ -15,7 +14,7 @@
height: 100%;
position: fixed;
font-size: 0px;
- top: 50px;
+ top: 0;
bottom: 0;
left: 0;
z-index: 1001;
diff --git a/src/utils/request.js b/src/utils/request.js
index 408155c..f33fc2a 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -29,7 +29,7 @@ service.interceptors.request.use(
text: "正在加载中..."
})
}
- if (store.getters.token) {
+ if (getToken()) {
// let each request carry token
// ['X-Token'] is a custom headers key
// please modify it according to the actual situation
@@ -59,49 +59,47 @@ service.interceptors.response.use(
* You can also judge the status by HTTP Status Code
*/
response => {
- if (loading) {
- loading.close()
+ loading?.close()
+ if (response.status !== 200) {
+ return Promise.reject("系统错误")
}
const res = response.data
// if the custom code is not 20000, it is judged as an error.
- if (res.errcode) {
+ if (res.code !== 0) {
Message({
- message: res.errmsg || 'Error',
+ message: res.msg || '系统错误',
type: 'error',
- duration: 5 * 1000,
- offset:50
+ duration: 5 * 1000
})
// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
- if (res.errcode === 50008 || res.errcode === 50012 || res.errcode === 50014) {
+ if (res.code === 20001) {
// to re-login
- MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again',
- 'Confirm logout', {
- confirmButtonText: 'Re-Login',
- cancelButtonText: 'Cancel',
- type: 'warning'
+ MessageBox.alert('您的登录状态已过期,需重新登录',
+ '登录已过期', {
+ confirmButtonText: '确定',
+ type: 'warning',
+ closeOnClickModal: false,
+ showClose: false
}).then(() => {
store.dispatch('user/resetToken').then(() => {
location.reload()
})
})
}
- return Promise.reject(new Error(res.errmsg || 'Error'))
+ return Promise.reject(new Error(res.msg || 'Error'))
} else {
- return res
+ return res.data
}
},
error => {
- if (loading) {
- loading.close()
- }
- console.log('err' + error) // for debug
+ loading?.close()
+ console.error('err' + error) // for debug
Message({
- message: error.message,
+ message: /Network Error/g.test(error) ? "网络错误" : "系统错误",
type: 'error',
- duration: 5 * 1000,
- offset: 50
+ duration: 5 * 1000
})
return Promise.reject(error)
}
diff --git a/src/views/contract/components/editorContract.vue b/src/views/contract/components/editorContract.vue
index 2a2d1f8..5a1df2a 100644
--- a/src/views/contract/components/editorContract.vue
+++ b/src/views/contract/components/editorContract.vue
@@ -359,7 +359,7 @@ import {
import {
getInfo
- } from '@/api/user.js'
+ } from '@/api/me.js'
import {
Message
} from 'element-ui'
diff --git a/src/views/contract/contractEdit.vue b/src/views/contract/contractEdit.vue
index d67f760..bb1a0f6 100644
--- a/src/views/contract/contractEdit.vue
+++ b/src/views/contract/contractEdit.vue
@@ -860,7 +860,7 @@ import {
} from "@/api/contract/contract";
import { getBudget } from "@/api/budget/budget";
-import { getInfo } from "@/api/user.js";
+import { getInfo } from "@/api/me.js";
import { listdeptNoAuth } from '@/api/system/department'
import {deepCopy} from "@/utils";
export default {
diff --git a/src/views/contract/contractLedger.vue b/src/views/contract/contractLedger.vue
index 8f386a2..a085f6f 100644
--- a/src/views/contract/contractLedger.vue
+++ b/src/views/contract/contractLedger.vue
@@ -997,7 +997,7 @@ import { getBudget } from "@/api/budget/budget";
import { getOatoken } from "@/api/oatoken";
import { deepCopy, parseTime, resetSelect,moneyFormatter } from '@/utils'
import { Message } from "element-ui";
-import { getInfo } from "@/api/user.js";
+import { getInfo } from "@/api/me.js";
import { getToken } from "@/utils/auth";
import { getOutDetail, httpCurl, updateFlow } from "@/api/out";
import editor from "./components/editorContract";
diff --git a/src/views/contract/contractList.vue b/src/views/contract/contractList.vue
index 73001bf..58fc5bb 100644
--- a/src/views/contract/contractList.vue
+++ b/src/views/contract/contractList.vue
@@ -1193,7 +1193,7 @@ import { getBudget } from "@/api/budget/budget";
import { getOatoken } from "@/api/oatoken";
import { deepCopy, parseTime, resetSelect, moneyFormatter, throttle } from '@/utils'
import { Message } from "element-ui";
-import { getInfo } from "@/api/user.js";
+import { getInfo } from "@/api/me.js";
import { getToken } from "@/utils/auth";
import { getOaToken, getOutDetail, httpCurl, updateFlow } from "@/api/out";
import editor from "./components/editorContract";
diff --git a/src/views/contract/contractProgress.vue b/src/views/contract/contractProgress.vue
index 3deb710..bec4509 100644
--- a/src/views/contract/contractProgress.vue
+++ b/src/views/contract/contractProgress.vue
@@ -309,7 +309,7 @@ import { getBudget } from "@/api/budget/budget";
import { getOatoken } from "@/api/oatoken";
import { parseTime, deepCopy } from "@/utils";
import { Message } from "element-ui";
-import { getInfo } from "@/api/user.js";
+import { getInfo } from "@/api/me.js";
import detail from "./components/detailContract";
import paymentRegistration from "./components/paymentRegistration";
diff --git a/src/views/contract/seeContract.vue b/src/views/contract/seeContract.vue
index b3cb84b..547efaa 100644
--- a/src/views/contract/seeContract.vue
+++ b/src/views/contract/seeContract.vue
@@ -415,7 +415,7 @@
} from "element-ui";
import {
getInfo
- } from '@/api/user.js'
+ } from '@/api/me.js'
import editor from "./components/editorContract"
import detail from "./components/detailContract"
diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue
index 7c44975..64ad706 100644
--- a/src/views/dashboard/index.vue
+++ b/src/views/dashboard/index.vue
@@ -311,7 +311,7 @@ import LxHeader from "@/components/LxHeader/index.vue";
import Pagination from "@/components/Pagination";
import PieChart from "./components/PieChart.vue";
import { adminDepartmentList } from '@/api/system/department';
-import { adminUserList, getInfo } from '@/api/user';
+import { adminUserList, getInfo } from '@/api/me';
import { getNotice, readNotice, statistic, carry } from "@/api/dashboard/notice";
import { parseTime, moneyFormatter } from '@/utils';
import { Message } from "element-ui";
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index 364111d..7150283 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -1,233 +1,221 @@
-