v3.9.0【优化】typescript版本;【优化】App端消息;【优化】弹出层z-index;

This commit is contained in:
zhuoda
2024-11-04 20:15:49 +08:00
parent 17a3e1fd86
commit 69fa9088f5
1376 changed files with 10373 additions and 9712 deletions

View File

@@ -0,0 +1,353 @@
/*
* 登录用户
*
* @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);
},
// 查询未读消息数量
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,
// @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);
}
}