Files
smart-admin/smart-admin-web-javascript/src/store/modules/system/user.js

361 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 登录用户
*
* @Author: 1024创新实验室-主任:卓大
* @Date: 2022-09-06 20:55:09
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*/
import _ from 'lodash';
import { defineStore } from 'pinia';
import localKey from '/@/constants/local-storage-key-const';
import { HOME_PAGE_NAME } from '/@/constants/system/home-const';
import { MENU_TYPE_ENUM } from '/@/constants/system/menu-const';
import { messageApi } from '/@/api/support/message-api.js';
import { smartSentry } from '/@/lib/smart-sentry.js';
import { localRead, localSave, localRemove } from '/@/utils/local-util';
export const useUserStore = defineStore({
id: 'userStore',
state: () => ({
token: '',
//员工id
employeeId: '',
// 头像
avatar: '',
//登录名
loginName: '',
//姓名
actualName: '',
//手机号
phone: '',
//部门id
departmentId: '',
//部门名词
departmentName: '',
//是否需要修改密码
needUpdatePwdFlag: false,
//是否为超级管理员
administratorFlag: true,
//上次登录ip
lastLoginIp: '',
//上次登录ip地区
lastLoginIpRegion: '',
//上次登录 设备
lastLoginUserAgent: '',
//上次登录时间
lastLoginTime: '',
//左侧菜单树形结构
menuTree: [],
//存在页面路由的菜单集合
menuRouterList: [],
//是否完成menuRouter初始化
menuRouterInitFlag: false,
//父类菜单集合
menuParentIdListMap: new Map(),
// 功能点集合
pointsList: [],
// 标签页
tagNav: null,
// 缓存
keepAliveIncludes: [],
// 未读消息数量
unreadMessageCount: 0,
// 待办工作数
toBeDoneCount: 0,
}),
getters: {
getToken(state) {
if (state.token) {
return state.token;
}
return localRead(localKey.USER_TOKEN);
},
getNeedUpdatePwdFlag(state){
return state.needUpdatePwdFlag;
},
//是否初始化了 路由
getMenuRouterInitFlag(state) {
return state.menuRouterInitFlag;
},
//菜单树
getMenuTree(state) {
return state.menuTree;
},
//菜单的路由
getMenuRouterList(state) {
return state.menuRouterList;
},
//菜单的父级id
getMenuParentIdListMap(state) {
return state.menuParentIdListMap;
},
//功能点
getPointList(state) {
if (_.isEmpty(state.pointsList)) {
let localUserPoints = localRead(localKey.USER_POINTS) || '';
state.pointsList = localUserPoints ? JSON.parse(localUserPoints) : [];
}
return state.pointsList;
},
//标签页
getTagNav(state) {
if (_.isNull(state.tagNav)) {
let localTagNav = localRead(localKey.USER_TAG_NAV) || '';
state.tagNav = localTagNav ? JSON.parse(localTagNav) : [];
}
let tagNavList = _.cloneDeep(state.tagNav) || [];
tagNavList.unshift({
menuName: HOME_PAGE_NAME,
menuTitle: '首页',
});
return tagNavList;
},
},
actions: {
logout() {
this.token = '';
this.menuList = [];
this.tagNav = [];
this.unreadMessageCount = 0;
localRemove(localKey.USER_TOKEN);
localRemove(localKey.USER_POINTS);
localRemove(localKey.USER_TAG_NAV);
localRemove(localKey.APP_CONFIG);
localRemove(localKey.HOME_QUICK_ENTRY);
localRemove(localKey.NOTICE_READ);
localRemove(localKey.TO_BE_DONE);
},
// 查询未读消息数量
async queryUnreadMessageCount() {
try {
let result = await messageApi.queryUnreadCount();
this.unreadMessageCount = result.data;
} catch (e) {
smartSentry.captureError(e);
}
},
async queryToBeDoneList() {
try {
let localToBeDoneList = localRead(localKey.TO_BE_DONE);
if (localToBeDoneList) {
this.toBeDoneCount = JSON.parse(localToBeDoneList).filter((e) => !e.doneFlag).length;
}
} catch (err) {
smartSentry.captureError(err);
}
},
//设置登录信息
setUserLoginInfo(data) {
// 用户基本信息
this.token = data.token;
this.employeeId = data.employeeId;
this.avatar = data.avatar;
this.loginName = data.loginName;
this.actualName = data.actualName;
this.phone = data.phone;
this.departmentId = data.departmentId;
this.departmentName = data.departmentName;
this.needUpdatePwdFlag = data.needUpdatePwdFlag;
this.administratorFlag = data.administratorFlag;
this.lastLoginIp = data.lastLoginIp;
this.lastLoginIpRegion = data.lastLoginIpRegion;
this.lastLoginUserAgent = data.lastLoginUserAgent;
this.lastLoginTime = data.lastLoginTime;
//菜单权限
this.menuTree = buildMenuTree(data.menuList);
//拥有路由的菜单
this.menuRouterList = data.menuList.filter((e) => e.path || e.frameUrl);
//父级菜单集合
this.menuParentIdListMap = buildMenuParentIdListMap(this.menuTree);
//功能点
this.pointsList = data.menuList.filter((menu) => menu.menuType === MENU_TYPE_ENUM.POINTS.value && menu.visibleFlag && !menu.disabledFlag);
// 获取用户未读消息
this.queryUnreadMessageCount();
// 获取待办工作数
this.queryToBeDoneList();
},
setToken(token) {
this.token = token;
},
//设置标签页
setTagNav(route, from) {
if (_.isNull(this.tagNav)) {
let localTagNav = localRead(localKey.USER_TAG_NAV) || '';
this.tagNav = localTagNav ? JSON.parse(localTagNav) : [];
}
// name唯一标识
let name = route.name;
if (!name || name === HOME_PAGE_NAME || name === '403' || name === '404') {
return;
}
let findTag = (this.tagNav || []).find((e) => e.menuName === name);
if (findTag) {
// @ts-ignore
findTag.fromMenuName = from.name;
findTag.fromMenuQuery = from.query;
} else {
// @ts-ignore
this.tagNav.push({
// @ts-ignore
menuName: name,
// @ts-ignore
menuTitle: route.meta.title,
menuQuery: route.query,
menuIcon:route.meta?.icon,
// @ts-ignore
fromMenuName: from.name,
fromMenuQuery: from.query,
});
}
localSave(localKey.USER_TAG_NAV, JSON.stringify(this.tagNav));
},
//关闭标签页
closeTagNav(menuName, closeAll) {
if (_.isEmpty(this.getTagNav)) return;
if (closeAll && !menuName) {
this.tagNav = [];
this.clearKeepAliveIncludes();
} else {
let findIndex = (this.tagNav || []).findIndex((e) => e.menuName === menuName);
if (closeAll) {
if (findIndex === -1) {
this.tagNav = [];
this.clearKeepAliveIncludes();
} else {
let tagNavElement = (this.tagNav || [])[findIndex];
this.tagNav = [tagNavElement];
this.clearKeepAliveIncludes(tagNavElement.menuName);
}
} else {
(this.tagNav || []).splice(findIndex, 1);
this.deleteKeepAliveIncludes(menuName);
}
}
localSave(localKey.USER_TAG_NAV, JSON.stringify(this.tagNav));
},
//关闭页面
closePage(route, router, path) {
if (!this.getTagNav || _.isEmpty(this.getTagNav)) return;
if (path) {
router.push({ path });
} else {
// 寻找tagNav
let index = this.getTagNav.findIndex((e) => e.menuName === route.name);
if (index === -1) {
router.push({ name: HOME_PAGE_NAME });
} else {
let tagNav = this.getTagNav[index];
if (tagNav.fromMenuName && this.getTagNav.some((e) => e.menuName === tagNav.fromMenuName)) {
router.push({ name: tagNav.fromMenuName, query: tagNav.fromMenuQuery });
} else {
// 查询左侧tag
let leftTagNav = this.getTagNav[index - 1];
router.push({ name: leftTagNav.menuName, query: leftTagNav.menuQuery });
}
}
}
this.closeTagNav(route.name, false);
},
// 加入缓存
pushKeepAliveIncludes(val) {
if (!val) {
return;
}
if (!this.keepAliveIncludes) {
this.keepAliveIncludes = [];
}
if (this.keepAliveIncludes.length < 30) {
let number = this.keepAliveIncludes.findIndex((e) => e === val);
if (number === -1) {
this.keepAliveIncludes.push(val);
}
}
},
// 删除缓存
deleteKeepAliveIncludes(val) {
if (!this.keepAliveIncludes || !val) {
return;
}
let number = this.keepAliveIncludes.findIndex((e) => e === val);
if (number !== -1) {
this.keepAliveIncludes.splice(number, 1);
}
},
// 清空缓存
clearKeepAliveIncludes(val) {
if (!val || !this.keepAliveIncludes.includes(val)) {
this.keepAliveIncludes = [];
return;
}
this.keepAliveIncludes = [val];
},
},
});
/**
* 构建菜单父级集合
*/
function buildMenuParentIdListMap(menuTree) {
let menuParentIdListMap = new Map();
recursiveBuildMenuParentIdListMap(menuTree, [], menuParentIdListMap);
return menuParentIdListMap;
}
function recursiveBuildMenuParentIdListMap(menuList, parentMenuList, menuParentIdListMap) {
for (const e of menuList) {
// 顶级parentMenuList清空
if (e.parentId === 0) {
parentMenuList = [];
}
let menuIdStr = e.menuId.toString();
let cloneParentMenuList = _.cloneDeep(parentMenuList);
if (!_.isEmpty(e.children) && e.menuName) {
// 递归
cloneParentMenuList.push({ name: menuIdStr, title: e.menuName });
recursiveBuildMenuParentIdListMap(e.children, cloneParentMenuList, menuParentIdListMap);
} else {
menuParentIdListMap.set(menuIdStr, cloneParentMenuList);
}
}
}
/**
* 构建菜单树
*
* @param menuList
* @returns
*/
function buildMenuTree(menuList) {
//1 获取所有 有效的 目录和菜单
let catalogAndMenuList = menuList.filter((menu) => menu.menuType !== MENU_TYPE_ENUM.POINTS.value && menu.visibleFlag && !menu.disabledFlag);
//2 获取顶级目录
let topCatalogList = catalogAndMenuList.filter((menu) => menu.parentId === 0);
for (const topCatalog of topCatalogList) {
buildMenuChildren(topCatalog, catalogAndMenuList);
}
return topCatalogList;
}
function buildMenuChildren(menu, allMenuList) {
let children = allMenuList.filter((e) => e.parentId === menu.menuId);
if (children.length === 0) {
return;
}
menu.children = children;
for (const item of children) {
buildMenuChildren(item, allMenuList);
}
}