import {setToken, setRefreshToken, removeToken, removeRefreshToken} from '@/util/auth' import {Message} from 'element-ui' import {setStore, getStore} from '@/util/store' import {isURL, validatenull} from '@/util/validate' import {deepClone} from '@/util/util' import website from '@/config/website' import {loginByUsername, loginBySocial, loginBySso, getUserInfo, logout, refreshToken, getButtons} from '@/api/user' import {getTopMenu, getRoutes} from '@/api/system/menu' import md5 from 'js-md5' function addPath(ele, first) { const menu = website.menu; const propsConfig = menu.props; const propsDefault = { label: propsConfig.label || 'name', path: 'code', icon: propsConfig.icon || 'icon', children: propsConfig.children || 'children' } const icon = ele[propsDefault.icon]; ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon; const isChild = ele[propsDefault.children] && ele[propsDefault.children].length !== 0; if (!isChild) ele[propsDefault.children] = []; if (!isChild && first && !isURL(ele[propsDefault.path])) { ele[propsDefault.path] = ele[propsDefault.path] + '/index' } else { ele[propsDefault.children].forEach(child => { addPath(child); }) } } const user = { state: { tenantId: getStore({name: 'tenantId'}) || '', userInfo: getStore({name: 'userInfo'}) || [], permission: getStore({name: 'permission'}) || {}, roles: [], menuId: {}, menu: getStore({name: 'menu'}) || [], menuAll: getStore({name: 'menuAll'}) || [], token: getStore({name: 'token'}) || '', refreshToken: getStore({name: 'refreshToken'}) || '', }, actions: { //根据用户名登录 LoginByUsername({commit}, userInfo) { return new Promise((resolve, reject) => { loginByUsername(userInfo.tenantId, userInfo.deptId, userInfo.roleId, userInfo.username, md5(userInfo.password), userInfo.type, userInfo.key, ).then(res => { const data = res.data; if(data.success){ debugger; commit('SET_TOKEN', data.obj.sessionInfo.token); commit('SET_REFRESH_TOKEN', data.obj.sessionInfo.token); commit('SET_TENANT_ID', data.tenant_id); commit('SET_USER_INFO', data.obj.sessionInfo); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); }else { Message({ message: data.msg, type: 'error' }) } resolve(); }).catch(error => { reject(error); }) }) }, //根据手机号登录 LoginByPhone({commit}, userInfo) { return new Promise((resolve) => { loginByUsername(userInfo.phone, ).then(res => { const data = res.data.data; commit('SET_TOKEN', data); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); resolve(); }) }) }, //根据第三方信息登录 LoginBySocial({commit}, userInfo) { return new Promise((resolve) => { loginBySocial(userInfo.tenantId, userInfo.source, userInfo.state).then(res => { const data = res.data; if (data.error_description) { Message({ message: data.error_description, type: 'error' }) } else { commit('SET_TOKEN', data.access_token); commit('SET_REFRESH_TOKEN', data.refresh_token); commit('SET_USER_INFO', data); commit('SET_TENANT_ID', data.tenant_id); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); } resolve(); }) }) }, //根据单点信息登录 LoginBySso({commit}, userInfo) { return new Promise((resolve) => { loginBySso(userInfo.state,).then(res => { const data = res.data; if (data.error_description) { Message({ message: data.error_description, type: 'error' }) } else { commit('SET_TOKEN', data.access_token); commit('SET_REFRESH_TOKEN', data.refresh_token); commit('SET_USER_INFO', data); commit('SET_TENANT_ID', data.tenant_id); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); } resolve(); }) }) }, //获取用户信息 GetUserInfo({commit}) { return new Promise((resolve, reject) => { getUserInfo().then((res) => { const data = res.data.data; commit('SET_ROLES', data.roles); resolve(data); }).catch(err => { reject(err); }) }) }, //刷新token refreshToken({state, commit}, userInfo) { window.console.log('handle refresh token'); return new Promise((resolve, reject) => { refreshToken(state.refreshToken, state.tenantId, !validatenull(userInfo) ? userInfo.deptId : state.userInfo.dept_id, !validatenull(userInfo) ? userInfo.roleId : state.userInfo.role_id ).then(res => { const data = res.data; commit('SET_TOKEN', data.access_token); commit('SET_REFRESH_TOKEN', data.refresh_token); commit('SET_USER_INFO', data); resolve(); }).catch(error => { reject(error) }) }) }, // 登出 LogOut({commit}) { return new Promise((resolve, reject) => { logout().then(() => { commit('SET_TOKEN', ''); commit('SET_MENU', []); commit('SET_MENU_ALL_NULL', []); commit('SET_ROLES', []); commit('SET_TAG_LIST', []); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); removeToken(); removeRefreshToken(); resolve(); }).catch(error => { reject(error) }) }) }, //注销session FedLogOut({commit}) { return new Promise(resolve => { commit('SET_TOKEN', ''); commit('SET_MENU_ALL_NULL', []); commit('SET_MENU', []); commit('SET_ROLES', []); commit('SET_TAG_LIST', []); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); removeToken(); removeRefreshToken(); resolve(); }) }, //获取顶部菜单 GetTopMenu() { return new Promise(resolve => { getTopMenu().then((res) => { const data = res.data.data || []; resolve(data) }) }) }, //获取系统菜单 GetMenu({commit, dispatch}, topMenuId) { return new Promise(resolve => { getRoutes('modelManagmentNode').then((res) => { const list =[ { "action": null, "actionName": null, "alias": "资源库", "category": null, "categoryName": null, "children": [ { "action": null, "actionName": null, "alias": "知识库", "category": null, "categoryName": null, "children": [ { "action": null, "actionName": null, "alias": "resourcelib", "category": null, "categoryName": null, "children": [], "code": "resourcelib", "hasChildren": false, "id": "2C5FABD2-535F-8568-8E61-C643BA7D77A1", "isOpen": null, "isOpenName": null, "meta": { "keepAlive": false }, "name": "设备资源库", "parentId": "9B00AD2C-A407-7F71-B35C-58E466E53A33", "parentName": null, "path": "bs=test?image=resource&type=folder&context=resourcemanager&querytype=0&querytemplate=resourcelibroot", "remark": null, "sort": 1, "source": "" }, { "action": null, "actionName": null, "alias": "工艺知识库", "category": null, "categoryName": null, "children": [], "code": "gongyi", "hasChildren": false, "id": "AC04E222-F14B-F4FF-11BB-DFE8917A2756", "isOpen": null, "isOpenName": null, "meta": { "keepAlive": false }, "name": "工艺知识库", "parentId": "9B00AD2C-A407-7F71-B35C-58E466E53A33", "parentName": null, "path": "bs=UI?image=report&type=folder&context=knowledgemanager&querytype=0&querytemplate=knowledgelibroot", "remark": null, "sort": 2, "source": "" } ], "code": "zhishiku", "hasChildren": true, "id": "9B00AD2C-A407-7F71-B35C-58E466E53A33", "isOpen": null, "isOpenName": null, "meta": { "keepAlive": false }, "name": "知识库", "parentId": "4EDC91B8-E3B2-D126-E75C-D2CEC59F53CE", "parentName": null, "path": "bs=/base", "remark": null, "sort": 1, "source": "" }, { "action": null, "actionName": null, "alias": "TemplateLib", "category": null, "categoryName": null, "children": [ { "action": null, "actionName": null, "alias": "CardTemplateLib", "category": null, "categoryName": null, "children": [], "code": "CardTemplateLib", "hasChildren": false, "id": "E6E963E7-2DF6-80EE-2A61-FA86E0F3D5F2", "isOpen": null, "isOpenName": null, "meta": { "keepAlive": false }, "name": "卡片模板", "parentId": "8493A92A-13DA-8800-140D-9C0C4A722665", "parentName": null, "path": "bs=?image=card&type=folder&context=cardtemplatemanager&querytype=0&querytemplate=cardtemplateroot", "remark": null, "sort": 1, "source": "" } ], "code": "TemplateLib", "hasChildren": true, "id": "8493A92A-13DA-8800-140D-9C0C4A722665", "isOpen": null, "isOpenName": null, "meta": { "keepAlive": false }, "name": "模板库", "parentId": "4EDC91B8-E3B2-D126-E75C-D2CEC59F53CE", "parentName": null, "path": "bs=mb", "remark": null, "sort": 2, "source": "" }, { "action": null, "actionName": null, "alias": "典型数据库", "category": null, "categoryName": null, "children": [ { "action": null, "actionName": null, "alias": "典型规程", "category": null, "categoryName": null, "children": [], "code": "guicheng", "hasChildren": false, "id": "B3EC1413-1A33-61E3-DDD1-CB4D0CFD0C6E", "isOpen": null, "isOpenName": null, "meta": { "keepAlive": false }, "name": "典型规程", "parentId": "BDBD6CFA-2F4C-EEF7-C380-5E9BBF6A37B3", "parentName": null, "path": "bs=?image=typical&type=workorder&context=TypicalProcessLib", "remark": null, "sort": 1, "source": "" } ], "code": "dianxing", "hasChildren": true, "id": "BDBD6CFA-2F4C-EEF7-C380-5E9BBF6A37B3", "isOpen": null, "isOpenName": null, "meta": { "keepAlive": false }, "name": "典型数据库", "parentId": "4EDC91B8-E3B2-D126-E75C-D2CEC59F53CE", "parentName": null, "path": "bs=dx", "remark": null, "sort": 3, "source": "" } ], "code": "ziyuanku", "hasChildren": true, "id": "4EDC91B8-E3B2-D126-E75C-D2CEC59F53CE", "isOpen": null, "isOpenName": null, "meta": { "keepAlive": false }, "name": "资源库", "parentId": "modelManagmentNode", "parentName": null, "path": "bs=zy", "remark": null, "sort": 913, "source": "" } ]; const data = res.data.obj; let menu = deepClone(list); menu.forEach(ele => { addPath(ele, true); }); updateCode(menu) function updateCode(items) { items.forEach(item => { // 将字符串分割成数组,以'?'作为分隔符 let parts = item.path.split("?"); // 如果数组的长度大于1,表示有'?',则取第一个元素的第一个部分,否则直接取整个字符串 let bsValue = parts.length > 1 ? parts[0].split("=")[1] : item.path.split("=")[1]; if (bsValue ==='' || bsValue === undefined || bsValue === null) { bsValue = "UI"; } item.path = bsValue === 'UI' ? '/base/UIContentViewer' : `/custom-ui/${bsValue}`; // 如果children不为空,递归调用这个函数 if (item.children && item.children.length > 0) { updateCode(item.children); } }); } commit('SET_MENU_ALL', menu) commit('SET_MENU', menu) //dispatch('GetButtons');s resolve(menu) }) }) }, //获取系统按钮 GetButtons({commit}) { return new Promise((resolve) => { getButtons().then(res => { const data = res.data.data; commit('SET_PERMISSION', data); resolve(); }) }) }, }, mutations: { SET_TOKEN: (state, token) => { debugger; setToken(token); state.token = token; setStore({name: 'token', content: state.token}) }, SET_MENU_ID(state, menuId) { state.menuId = menuId; }, SET_MENU_ALL: (state, menuAll) => { let menu = state.menuAll; menuAll.forEach(ele => { if (!menu.find(item => item.label === ele.label && item.path === ele.path)) { menu.push(ele); } }) state.menuAll = menu setStore({ name: 'menuAll', content: state.menuAll }) }, SET_MENU_ALL_NULL: (state) => { state.menuAll = [] setStore({ name: 'menuAll', content: state.menuAll }) }, SET_MENU: (state, menu) => { state.menu = menu setStore({ name: 'menu', content: state.menu }) }, SET_REFRESH_TOKEN: (state, refreshToken) => { setRefreshToken(refreshToken) state.refreshToken = refreshToken; setStore({name: 'refreshToken', content: state.refreshToken}) }, SET_TENANT_ID: (state, tenantId) => { state.tenantId = tenantId; setStore({name: 'tenantId', content: state.tenantId}) }, SET_USER_INFO: (state, userInfo) => { if (validatenull(userInfo.avatar)) { userInfo.avatar = "/img/bg/img-logo.png"; } state.userInfo = userInfo; setStore({name: 'userInfo', content: state.userInfo}) }, SET_ROLES: (state, roles) => { state.roles = roles; }, } } export default user