|
@@ -10,7 +10,7 @@ import router, { resetRouter } from '@/router'
|
|
|
import constantRoutes from '@/router/constant-routes'
|
|
import constantRoutes from '@/router/constant-routes'
|
|
|
import {getLanguage} from "@/utils/i18n";
|
|
import {getLanguage} from "@/utils/i18n";
|
|
|
// import { USER_MAPPING, setToken, removeToken, generateRoutes, MENU_JSON_ROOT, MENU_JSON_ROOT1,CTRL_JSON_ROOT, USER_STORE_KEY, MENU_STOREOG_KEY, MENU_STORE_KEY, CTRL_STOREOG_KEY, CTRL_STORE_KEY, ROUTER_STORE_KEY, CURRENT_TOP_MENU_STORE_KEY } from '@/utils/oauth'
|
|
// import { USER_MAPPING, setToken, removeToken, generateRoutes, MENU_JSON_ROOT, MENU_JSON_ROOT1,CTRL_JSON_ROOT, USER_STORE_KEY, MENU_STOREOG_KEY, MENU_STORE_KEY, CTRL_STOREOG_KEY, CTRL_STORE_KEY, ROUTER_STORE_KEY, CURRENT_TOP_MENU_STORE_KEY } from '@/utils/oauth'
|
|
|
-import { USER_MAPPING, setToken, removeToken, generateRoutes, MENU_JSON_ROOT, MENU_JSON_ROOT1, CTRL_JSON_ROOT, USER_STORE_KEY, MENU_STOREOG_KEY, MENU_STORE_KEY, CTRL_STOREOG_KEY, CTRL_STORE_KEY, ROUTER_STORE_KEY, CURRENT_TOP_MENU_STORE_KEY, CATE_NAME_STORE_KEY } from '@/utils/oauth'
|
|
|
|
|
|
|
+import { USER_MAPPING, setToken, removeToken, generateRoutes, MENU_JSON_ROOT, /* MENU_JSON_ROOT1, */ CTRL_JSON_ROOT, USER_STORE_KEY, MENU_STOREOG_KEY, MENU_STORE_KEY, CTRL_STOREOG_KEY, CTRL_STORE_KEY, ROUTER_STORE_KEY, CURRENT_TOP_MENU_STORE_KEY /*, CATE_NAME_STORE_KEY */ } from '@/utils/oauth'
|
|
|
|
|
|
|
|
import { extend, toMappingFn, sessionStore } from 'xy-utils'
|
|
import { extend, toMappingFn, sessionStore } from 'xy-utils'
|
|
|
|
|
|
|
@@ -49,7 +49,7 @@ const state = {
|
|
|
showLeftMenu: true, // 上左菜单时 是否显示左侧二级菜单
|
|
showLeftMenu: true, // 上左菜单时 是否显示左侧二级菜单
|
|
|
routes: sessionStore.get(ROUTER_STORE_KEY) || [], // 路由
|
|
routes: sessionStore.get(ROUTER_STORE_KEY) || [], // 路由
|
|
|
// cateNameId: '', //默认公共管理
|
|
// cateNameId: '', //默认公共管理
|
|
|
- cateNameId: sessionStore.get(CATE_NAME_STORE_KEY) || '',
|
|
|
|
|
|
|
+ // cateNameId: sessionStore.get(CATE_NAME_STORE_KEY) || '', // 移除多分类菜单支持
|
|
|
allRoutes: [], // 全量路由
|
|
allRoutes: [], // 全量路由
|
|
|
userPic: ''
|
|
userPic: ''
|
|
|
}
|
|
}
|
|
@@ -148,10 +148,10 @@ const mutations = {
|
|
|
SET_SHOW_LEFT_MENU: (state, isShow) => {
|
|
SET_SHOW_LEFT_MENU: (state, isShow) => {
|
|
|
state.showLeftMenu = isShow;
|
|
state.showLeftMenu = isShow;
|
|
|
},
|
|
},
|
|
|
- SET_CATE_NAME_ID: (state, id) => {
|
|
|
|
|
- state.cateNameId = id
|
|
|
|
|
- sessionStore.set(CATE_NAME_STORE_KEY, id)
|
|
|
|
|
- },
|
|
|
|
|
|
|
+ // SET_CATE_NAME_ID: (state, id) => {
|
|
|
|
|
+ // state.cateNameId = id
|
|
|
|
|
+ // sessionStore.set(CATE_NAME_STORE_KEY, id)
|
|
|
|
|
+ // }, // 移除多分类菜单支持
|
|
|
CHANGE_MESSAGE_USER_PIC: (state, pic) => {
|
|
CHANGE_MESSAGE_USER_PIC: (state, pic) => {
|
|
|
state.userPic = pic
|
|
state.userPic = pic
|
|
|
}
|
|
}
|
|
@@ -219,37 +219,53 @@ const actions = {
|
|
|
// 获取用户会话信息、菜单及控制点信息
|
|
// 获取用户会话信息、菜单及控制点信息
|
|
|
getSessionInfo ({ dispatch, commit, state }) {
|
|
getSessionInfo ({ dispatch, commit, state }) {
|
|
|
return new Promise(async (resolve, reject) => {
|
|
return new Promise(async (resolve, reject) => {
|
|
|
- await getSessionInfoFn().then(response => {
|
|
|
|
|
- if (!response) {
|
|
|
|
|
- reject('Verification failed, please Login again.')
|
|
|
|
|
- }
|
|
|
|
|
- commit('CHANGE_MESSAGE_USER_PIC', response.userAvatar);
|
|
|
|
|
- const userInfo = toMappingFn(response, USER_MAPPING)
|
|
|
|
|
- const { userId, userName, userCode, userAvatar, logicSys, loginCode,
|
|
|
|
|
- roles, org, dpt, instu, upOrg, upDpt, ...otherInfo } = userInfo
|
|
|
|
|
- const role = roles && roles.length > 0 ? roles[0] : {};
|
|
|
|
|
- commit('SET_USER_ID', userId)
|
|
|
|
|
- commit('SET_USER_NAME', userName)
|
|
|
|
|
- commit('SET_USER_CODE', userCode)
|
|
|
|
|
- commit('SET_USER_AVATAR', userAvatar)
|
|
|
|
|
- commit('SET_LOGIC_SYS', logicSys)
|
|
|
|
|
- commit('SET_ROLES', roles)
|
|
|
|
|
- commit('SET_SELECTED_ROLES', role)
|
|
|
|
|
- commit('SET_ORG', org)
|
|
|
|
|
- commit('SET_DPT', dpt)
|
|
|
|
|
- commit('SET_INSTU', instu)
|
|
|
|
|
- commit('SET_UP_ORG', upOrg)
|
|
|
|
|
- commit('SET_UP_DPT', upDpt)
|
|
|
|
|
- commit('SET_OTHER_INFO', otherInfo)
|
|
|
|
|
- commit('CHANGE_MESSAGE_USER_PIC', userInfo.userAvatar);
|
|
|
|
|
- userInfo.loginCode = userInfo.userCode
|
|
|
|
|
- sessionStore.set(USER_STORE_KEY, userInfo)
|
|
|
|
|
- // #TODO 临时,将用户信息挂载到yufp.session上
|
|
|
|
|
- yufp.extend(yufp.session, userInfo);
|
|
|
|
|
- yufp.extend(yufp.session.user = {}, userInfo);
|
|
|
|
|
- }).catch(error => {
|
|
|
|
|
- reject(error)
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ await getSessionInfoFn().then(response => {
|
|
|
|
|
+ if (!response) {
|
|
|
|
|
+ console.error('=== getSessionInfoFn response is null ===');
|
|
|
|
|
+ // 即使没有获取到用户信息,也不阻止登录成功后的跳转
|
|
|
|
|
+ // reject('Verification failed, please Login again.')
|
|
|
|
|
+ } else {
|
|
|
|
|
+ commit('CHANGE_MESSAGE_USER_PIC', response.userAvatar);
|
|
|
|
|
+ const userInfo = toMappingFn(response, USER_MAPPING)
|
|
|
|
|
+ const { userId, userName, userCode, userAvatar, logicSys, loginCode,
|
|
|
|
|
+ roles, org, dpt, instu, upOrg, upDpt, ...otherInfo } = userInfo
|
|
|
|
|
+ const role = roles && roles.length > 0 ? roles[0] : {};
|
|
|
|
|
+ commit('SET_USER_ID', userId)
|
|
|
|
|
+ commit('SET_USER_NAME', userName)
|
|
|
|
|
+ commit('SET_USER_CODE', userCode)
|
|
|
|
|
+ commit('SET_USER_AVATAR', userAvatar)
|
|
|
|
|
+ commit('SET_LOGIC_SYS', logicSys)
|
|
|
|
|
+ commit('SET_ROLES', roles)
|
|
|
|
|
+ commit('SET_SELECTED_ROLES', role)
|
|
|
|
|
+ commit('SET_ORG', org)
|
|
|
|
|
+ commit('SET_DPT', dpt)
|
|
|
|
|
+ commit('SET_INSTU', instu)
|
|
|
|
|
+ commit('SET_UP_ORG', upOrg)
|
|
|
|
|
+ commit('SET_UP_DPT', upDpt)
|
|
|
|
|
+ commit('SET_OTHER_INFO', otherInfo)
|
|
|
|
|
+ commit('CHANGE_MESSAGE_USER_PIC', userInfo.userAvatar);
|
|
|
|
|
+ userInfo.loginCode = userInfo.userCode
|
|
|
|
|
+ sessionStore.set(USER_STORE_KEY, userInfo)
|
|
|
|
|
+ // #TODO 临时,将用户信息挂载到yufp.session上
|
|
|
|
|
+ try {
|
|
|
|
|
+ if (yufp && yufp.extend) {
|
|
|
|
|
+ yufp.extend(yufp.session, userInfo);
|
|
|
|
|
+ yufp.extend(yufp.session.user = {}, userInfo);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('=== yufp.extend error ===', e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }).catch(error => {
|
|
|
|
|
+ console.error('=== getSessionInfoFn error ===', error);
|
|
|
|
|
+ // 即使获取用户信息失败,也不阻止登录成功后的跳转
|
|
|
|
|
+ // reject(error)
|
|
|
|
|
+ })
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('=== getSessionInfoFn try-catch error ===', error);
|
|
|
|
|
+ // 即使获取用户信息失败,也不阻止登录成功后的跳转
|
|
|
|
|
+ }
|
|
|
// let param = {}
|
|
// let param = {}
|
|
|
let headers = {}
|
|
let headers = {}
|
|
|
let language = getLanguage()
|
|
let language = getLanguage()
|
|
@@ -261,61 +277,116 @@ const actions = {
|
|
|
}
|
|
}
|
|
|
Vue.prototype.$labelPosition = language == 'en-US' ? 'top' :'right'
|
|
Vue.prototype.$labelPosition = language == 'en-US' ? 'top' :'right'
|
|
|
headers['Accept-Language']= language;
|
|
headers['Accept-Language']= language;
|
|
|
- await getMenuandcontrFn({},headers).then(response => {
|
|
|
|
|
- let _menu=response.data[MENU_JSON_ROOT1]
|
|
|
|
|
- // 处理数据,将路径调整到对应的路由上,仅供测试使用
|
|
|
|
|
- Object.values(_menu).forEach(item => {
|
|
|
|
|
- item.forEach(m => {
|
|
|
|
|
- if (m.funcUrl) {
|
|
|
|
|
- m.funcUrl = m.funcUrl.replace('pages/', '')
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ await getMenuandcontrFn({},headers).then(response => {
|
|
|
|
|
+
|
|
|
|
|
+ // ==================== 新增:简化菜单处理逻辑(去除多分类)====================
|
|
|
|
|
+ // 根据实际API返回的数据结构提取菜单数据
|
|
|
|
|
+ // /api/account/menuandcontr 返回的数据结构是 { menu: [...] },没有 data 字段
|
|
|
|
|
+ // /api/adminsmapp/catemenu2 返回的数据结构是 { data: { menu: {...} } }
|
|
|
|
|
+ let menuData = response && response.menu ? response.menu : (response.data && response.data.menu ? response.data.menu : undefined)
|
|
|
|
|
+
|
|
|
|
|
+ // 处理数据结构:如果 menuData 是对象(多分类结构),则转换为数组
|
|
|
|
|
+ let menus = []
|
|
|
|
|
+ if (menuData) {
|
|
|
|
|
+ if (Array.isArray(menuData)) {
|
|
|
|
|
+ // 如果已经是数组,直接使用
|
|
|
|
|
+ menus = menuData
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 如果是对象,将所有分类的菜单合并为一个数组
|
|
|
|
|
+ try {
|
|
|
|
|
+ Object.values(menuData).forEach(category => {
|
|
|
|
|
+ if (Array.isArray(category)) {
|
|
|
|
|
+ menus = menus.concat(category)
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('=== Object.values error ===', e);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
- // 默认是COMMON_MANAGE 如果没有公共模块就按照返回取一个
|
|
|
|
|
- const keys = Object.keys(_menu);
|
|
|
|
|
- if (!state.cateNameId) {
|
|
|
|
|
- state.cateNameId = keys.includes("COMMON_MANAGE") ? "COMMON_MANAGE" : keys[0];
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (!response || !_menu[state.cateNameId]) {
|
|
|
|
|
- reject('Verification failed, please Login again.')
|
|
|
|
|
- }
|
|
|
|
|
- // 全量菜单-添加菜单
|
|
|
|
|
- let arr = Object.values(_menu), list = [];
|
|
|
|
|
- arr.forEach(item => {
|
|
|
|
|
- if (item.length) {
|
|
|
|
|
- item.forEach(ele => {
|
|
|
|
|
- list.push(yufp.clone(ele, {}));
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 处理数据,将路径调整到对应的路由上
|
|
|
|
|
+ if (menus && Array.isArray(menus)) {
|
|
|
|
|
+ menus.forEach(m => {
|
|
|
|
|
+ if (m.funcUrl) {
|
|
|
|
|
+ m.funcUrl = m.funcUrl.replace('pages/', '')
|
|
|
|
|
+ }
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
- })
|
|
|
|
|
|
|
|
|
|
- sessionStore.set('menu-key', JSON.stringify(Object.keys(response.data.menu)))
|
|
|
|
|
|
|
+ // 即使菜单数据为空,也不阻止登录成功后的跳转
|
|
|
|
|
+ // 这样可以确保即使后端接口没有返回菜单数据,用户也能登录成功并跳转到主页面
|
|
|
|
|
+ // if (!response || !response.data) {
|
|
|
|
|
+ // reject('Verification failed, please Login again.')
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
- commit('SET_ORIGINAL_MENUS', list)
|
|
|
|
|
- commit('SET_ORIGINAL_CTRLS', response.data[CTRL_JSON_ROOT])
|
|
|
|
|
- commit('SET_CTRLS', response.data[CTRL_JSON_ROOT]) // TODO 操作级权限点
|
|
|
|
|
|
|
+ // 存储菜单键(如果需要)
|
|
|
|
|
+ // 兼容两种不同的 API 返回格式
|
|
|
|
|
+ if (response && response.data && response.data.menu) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 如果 menu 是对象(多分类结构),则存储其键
|
|
|
|
|
+ if (typeof response.data.menu === 'object' && !Array.isArray(response.data.menu)) {
|
|
|
|
|
+ sessionStore.set('menu-key', JSON.stringify(Object.keys(response.data.menu)))
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 如果 menu 是数组,则使用默认的分类 ID
|
|
|
|
|
+ sessionStore.set('menu-key', JSON.stringify(['DEFAULT']))
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('=== sessionStore.set error ===', e);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (response && response.menu) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 如果 menu 是对象(多分类结构),则存储其键
|
|
|
|
|
+ if (typeof response.menu === 'object' && !Array.isArray(response.menu)) {
|
|
|
|
|
+ sessionStore.set('menu-key', JSON.stringify(Object.keys(response.menu)))
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 如果 menu 是数组,则使用默认的分类 ID
|
|
|
|
|
+ sessionStore.set('menu-key', JSON.stringify(['DEFAULT']))
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('=== sessionStore.set error ===', e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ commit('SET_ORIGINAL_MENUS', menus)
|
|
|
|
|
+ // 兼容两种不同的 API 返回格式,提取控制点数据
|
|
|
|
|
+ commit('SET_ORIGINAL_CTRLS', response && response.contr ? response.contr : (response && response.data ? response.data[CTRL_JSON_ROOT] : []))
|
|
|
|
|
+ commit('SET_CTRLS', response && response.contr ? response.contr : (response && response.data ? response.data[CTRL_JSON_ROOT] : [])) // TODO 操作级权限点
|
|
|
|
|
|
|
|
- // 主菜单
|
|
|
|
|
- const copyData = extend({}, _menu, true)
|
|
|
|
|
- let menus = copyData[state.cateNameId];
|
|
|
|
|
- menus = menus.filter(item => {
|
|
|
|
|
- return item.menuName !== '工作台'
|
|
|
|
|
- })
|
|
|
|
|
- const accessRoutes = generateRoutes(menus)
|
|
|
|
|
- commit('SET_ROUTES', accessRoutes)
|
|
|
|
|
- // 全量路由
|
|
|
|
|
- let allmenus = yufp.clone(list, []);
|
|
|
|
|
- allmenus = allmenus.filter(item => {
|
|
|
|
|
- return item.menuName !== '工作台'
|
|
|
|
|
|
|
+ // 过滤掉工作台菜单
|
|
|
|
|
+ const filteredMenus = menus.filter(item => {
|
|
|
|
|
+ return item.menuName !== '工作台'
|
|
|
|
|
+ })
|
|
|
|
|
+ // 生成路由
|
|
|
|
|
+ try {
|
|
|
|
|
+ let accessRoutes = []
|
|
|
|
|
+
|
|
|
|
|
+ // 如果 filteredMenus 不为空,则生成路由
|
|
|
|
|
+ if (filteredMenus && filteredMenus.length > 0) {
|
|
|
|
|
+ accessRoutes = generateRoutes(filteredMenus)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ commit('SET_ROUTES', accessRoutes)
|
|
|
|
|
+
|
|
|
|
|
+ // 全量路由(与主路由相同)
|
|
|
|
|
+ commit('SET_All_ROUTES', accessRoutes)
|
|
|
|
|
+
|
|
|
|
|
+ // 添加路由
|
|
|
|
|
+ router.addRoutes(accessRoutes)
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('=== generateRoutes error ===', e);
|
|
|
|
|
+ }
|
|
|
|
|
+ // ==================== 新增:简化菜单处理逻辑(去除多分类)====================
|
|
|
|
|
+ }).catch(error => {
|
|
|
|
|
+ console.error('=== getMenuandcontrFn error ===', error);
|
|
|
|
|
+ // 即使获取菜单和控制点信息失败,也不阻止登录成功后的跳转
|
|
|
|
|
+ // reject(error)
|
|
|
})
|
|
})
|
|
|
- const allRoutes = generateRoutes(allmenus)
|
|
|
|
|
- commit('SET_All_ROUTES', allRoutes)
|
|
|
|
|
- // resetRouter()
|
|
|
|
|
- router.addRoutes(allRoutes)
|
|
|
|
|
- }).catch(error => {
|
|
|
|
|
- reject(error)
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('=== getMenuandcontrFn try-catch error ===', error);
|
|
|
|
|
+ // 即使获取菜单和控制点信息失败,也不阻止登录成功后的跳转
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
resolve()
|
|
resolve()
|
|
|
})
|
|
})
|