import pinia from '~src/store/init' import appConfig from '~src/config/app' import { useAppStore } from '~src/store' import { getRoutes } from '~api/menu' import themeData from '~src/config/theme' import tokenData from '~src/router/modules/token' import { getStoreValue, setStoreValue } from '~src/utils/storage' import { logout, refreshToken, userLogin } from '~api/user' import { userConfigInfo, userConfigSave } from '~api/other' import { ArrToOneObj, arrIndex, getArrValue, getObjValue } from 'js-fast-way' import { useOsTheme } from 'hc-vue3-ui' import { setAppName } from '~uti/tools' import logoIcon from '~src/assets/logo/icon.png' import logoName from '~src/assets/logo/name.png' import website from '~src/config' //初始变量 const store = useAppStore(pinia) //登录 export const useAppLogin = async (form) => { const { error, status, res, message } = await userLogin(form) if (!error && status === 200) { const info = await setUserAppInfo(res) return { error: info.error, msg: info.msg } } else { return { error: true, msg: message } } } //设置用户信息 export const setUserAppInfo = async (res) => { store.setTokenVal(res['access_token']) store.setRefreshTokenVal(res['refresh_token']) store.setTenantId(res['tenant_id']) store.setRoleId(res['role_id']) store.setUserInfo(res) const routerRes = await setRouterData() if (routerRes.length <= 0) { return { error: true, msg: '路由异常' } } await getHomeRouter() await initUserConfigInfo() return { error: false, msg: '成功' } } //设置租户信息 export const setUserTenantInfo = async (res = {}) => { const { tenantAvatar, tenantAvatarText, tenantTitle, tenantId } = res //设置标题 const title = tenantTitle ? tenantTitle : website.title store.setTitle(title) setAppName(title) //设置logo图标 const icon = tenantAvatar ? tenantAvatar : logoIcon store.setLogoIcon(icon) //设置logo文字 const name = tenantAvatarText ? tenantAvatarText : logoName store.setLogoName(name) //设置租户ID const id = tenantId ? tenantId : '000000' store.setTenantId(id) //返回数据 return { title, icon, name, id } } //用户信息初始化 export const initUserConfigInfo = async () => { const { error, data } = await userConfigInfo() if (error) { return Promise.reject(false) } const res = getObjValue(data) if (res?.theme) { const { theme, color, opinionView } = res //设置主题 store.setTheme(theme) //设置模式 if (theme === 'auto') { store.setThemeVal(useOsTheme()) } else { store.setThemeVal(theme) } //获取主色调和首页主题数据 let themeColor = themeData.color let colorIndex = arrIndex(themeColor, 'name', color) //设置主色调 if (colorIndex !== -1) { store.setColor(themeColor[colorIndex]) } //设置工单服务的弹出框 store.setOrderServiceTipModal(opinionView ?? 1) return Promise.resolve(true) } else { await userConfigSave({ theme: appConfig?.theme || '', color: appConfig?.color?.name || '', opinionView: 1, }) return Promise.resolve(true) } } //设置路由信息 export const setRouterData = async () => { //请求接口,获取路由数据 const { error, data } = await getRoutes() if (error) return [] const resData = getArrValue(data) //数据转换 let routesObj = {}, routesArr = [] await ArrToOneObj(resData, 'code', routesObj, routesArr) const routes = [...tokenData, ...routesArr] //合并 //数据缓存 store.setMenus(resData) setStoreValue('route', routesObj) setStoreValue('routes', routes) setStoreValue('routesArr', routesArr) return resData } //获取路由菜单的主入口路径 const getHomeRouter = async () => { const routes = getStoreValue('routesArr') ?? [] //没有菜单路由数据 if (routes.length <= 0) { store.setHomeUrl('home') return 'home' } //设置主入口 const isUsingStats = routes.indexOf('using-stats') const code = isUsingStats !== -1 ? 'using-stats' : routes[0] store.setHomeUrl(code) return code } //刷新token export const RefreshToken = async () => { try { window.console.log('刷新 token') const { dept_id, role_id } = store.getUserInfo const refresh = store.getRefreshToken const tenantId = store.getTenantId const { error, status, res } = await refreshToken(refresh, tenantId, dept_id, role_id) if (!error && status === 200) { store.setTokenVal(res['access_token']) store.setRefreshTokenVal(res['refresh_token']) store.setTenantId(res['tenant_id']) store.setUserInfo(res) return Promise.resolve(res) } else { return Promise.reject(res) } } catch (e) { window.console.warn('token 刷新失败: ', e) return Promise.reject(e) } } //登出 export const LogOut = async () => { return await logout() }