Newer
Older
smartwell_front / src / store / modules / user.ts
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