import { reject } from 'lodash-es' import useRouteStore from './route' import useMenuStore from './menu' import { doLogin, doAppLogin, getConfig, getInfo, getUserMenus, logoutApi } from '@/api/system/login' import { changePwd } from '@/api/system/user' import type { Menu } from '@/global' import { getPrivateKey, privateStr, setPrivateKey } from '@/utils/auth' import indexDB from '@/utils/indexDB' import { decrypt, isEncrypt } from '@/utils/security1' import { fetchCacheDevice, fetchCacheWell, fetchCacheStation, fetchCacheDept, fetchCacheWell95, fetchCacheVideo, fetchCacheLeak } from '@/utils/sessionData' import { ElMessage } from 'element-plus' const useUserStore = defineStore( // 唯一ID 'user', { state: () => ({ username: localStorage.username || '', // 账户 token: localStorage.token || '', // token id: '', // 用户id name: '', // 姓名 deptId: '', // 部门id deptName: '', // 部门名称 avatar: '', // 头像 attr1: '', // 备用属性 tenantId: '', // 租户id publicKey: localStorage.publicKey || '', // 公钥 privateKey: getPrivateKey() || '', // 私钥 roleList: [] as string[], // 角色id集合 roleNames: [] as string[], // 角色名称集合 roleTips: [] as string[], // 角色标签集合 systems: [] as Menu.menu[], // 子系统权限 menus: [] as Menu.menu[], // 菜单权限 btns: [] as Menu.menu[], // 按钮权限 dataScope: [] as string[], isLogout: 0, // 是否被退出登录 }), getters: { isLogin: (state) => { let retn = false if (state.token) { retn = true } return retn }, // 是否已获取用户信息 hasUserInfo: (state) => { if (state.roleList && state.roleList.length > 0) { return true } else { return false } }, getPublicKey: (state) => { return state.publicKey }, getPrivateKey: (state) => { return state.privateKey }, getMenus: (state): Menu.menu[] => { return state.menus }, getBtns: (state): Menu.menu[] => { return state.btns }, }, actions: { // 获取项目基础配置 getBaseConfig() { return new Promise<any>((resolve, reject) => { getConfig().then((res) => { this.publicKey = res.data.publicKey localStorage.setItem('publicKey', res.data.publicKey) // 保存私钥 setPrivateKey(privateStr) this.privateKey = privateStr this.isLogout = 0 resolve(res.data) }).catch((e) => { reject(e) }) }) }, // 登录 login(data: { username: string password: string kaptcha: string sid: string }) { return new Promise<void>((resolve, reject) => { doLogin(data).then((res) => { localStorage.setItem('token', res.data.token) this.username = res.data.username this.token = res.data.token this.isLogout = 0 resolve() }).catch((error) => { reject(error) }) }) }, appLogin(data: { username: string password: string }) { return new Promise<void>((resolve, reject) => { doAppLogin(data).then((res) => { localStorage.setItem('token', res.data.token) this.username = res.data.username this.token = res.data.token this.isLogout = 0 resolve() }).catch((error) => { reject(error) }) }) }, // 注销 logout() { return new Promise<void>((resolve) => { logoutApi().then(() => { this.isLogout += 1 const routeStore = useRouteStore() const menuStore = useMenuStore() localStorage.removeItem('username') localStorage.removeItem('token') localStorage.removeItem('nameId') localStorage.removeItem('depId') this.username = '' this.token = '' this.roleList = [] this.roleNames = [] this.dataScope = [] routeStore.removeRoutes() menuStore.setActived(0) menuStore.resetBreadcrumb() // 清空缓存 indexDB.deleteAll() resolve() }) .catch((error) => { reject(error) }) }) }, // 获取用户信息 getUserInfo() { return new Promise<any>((resolve) => { getInfo().then((res) => { const hanlder = () => { this.isLogout += 1 const routeStore = useRouteStore() const menuStore = useMenuStore() localStorage.removeItem('username') localStorage.removeItem('token') localStorage.removeItem('nameId') localStorage.removeItem('depId') this.username = '' this.token = '' this.roleList = [] this.roleNames = [] this.dataScope = [] routeStore.removeRoutes() menuStore.setActived(0) menuStore.resetBreadcrumb() } if (window.localStorage.getItem('browser-type-bj-well') === 'pc') { // pc端 if (res.data.avatar && !res.data.avatar.includes('.')) { reject('厂商账号,不允许跨系统登录') // 这是移动端账号,不让登录pc hanlder() ElMessage.error('厂商账号,不允许跨系统登录') // 刷新页面 setTimeout(() => { window.location.reload() }, 1000); return } } else { // 移动端 if (!res.data.avatar || res.data.avatar.includes('.')) { reject('只允许厂商账号登录') hanlder() ElMessage.error('只允许厂商账号登录') // 刷新页面 setTimeout(() => { window.location.reload() }, 1000); } } if (res.data.roleIds && res.data.roleIds.length > 0) { this.roleList = res.data.roleIds this.roleNames = res.data.roleNames this.roleTips = res.data.roleTips this.dataScope = res.data.dataScope localStorage.setItem('nameId', res.data.id) localStorage.setItem('depId', res.data.deptId) } else { reject('该用户无角色') } if (res.data.deptId) { this.deptId = res.data.deptId this.deptName = res.data.deptName } else { reject('该用户无组织机构') } this.id = res.data.id this.avatar = res.data.avatar this.username = res.data.account this.name = isEncrypt(res.data.name) ? decrypt(res.data.name) : res.data.name resolve(res.data) }).catch(() => { reject('获取用户信息错误') }) }) }, // 获取菜单按钮权限 getPermissions(currentSystem?: { name: string; code: string }) { const params = { resourceType: '', parentCode: '', } if (currentSystem) { params.parentCode = currentSystem.code // 子系统code } // // 判断本地存储 // if (localStorage.getItem('currentSys')) { // params.parentCode = JSON.parse(localStorage.getItem('currentSys') as string).code // } return new Promise<Menu.menu[]>((resolve) => { getUserMenus(params).then((response) => { const data = response.data const menus = [] // 仅菜单 const btns = [] // 非菜单 if (data.menus && data.menus.length > 0) { const allmenus = [...data.menus] this.menus = allmenus for (const menu of allmenus) { // 遍历菜单,获取所有的权限项 if (menu.resourceType === '02' || menu.resourceType === '03') { // 将是菜单的放入menus const menu_tmp = { url: menu.url, name: menu.name, icon: menu.icon, } menus.push(menu_tmp) } const btn_tmp = { url: menu.url, name: menu.name, icon: menu.icon, } btns.push(btn_tmp) } } this.menus = menus this.btns = btns if (indexDB.getStatus() && window.localStorage.getItem('browser-type-bj-well') === 'pc') { console.log('获取缓存') // 重新拉取缓存 fetchCacheDept() fetchCacheVideo() fetchCacheWell95() fetchCacheDevice() fetchCacheLeak() setTimeout(() => { fetchCacheWell() fetchCacheStation() }, 5000) } resolve(btns) }) }) }, // 修改密码 editPassword(data: { oldPwd: string newPwd: string }) { return new Promise<object>((resolve) => { changePwd(data).then((response) => { resolve(response) }) }) }, // 被退出登录 toLogout() { this.isLogout += 1 }, }, }, ) export default useUserStore