185 lines
5.7 KiB
JavaScript
185 lines
5.7 KiB
JavaScript
|
|
import { defineStore } from "pinia"
|
|||
|
|
import loginApi from "@/api/login"
|
|||
|
|
import tool from "@/utils/tool"
|
|||
|
|
import router from "@/router"
|
|||
|
|
import webRouter from "@/router/webRouter"
|
|||
|
|
import { homePage } from "@/router/homePageRoutes"
|
|||
|
|
import { useAppStore } from "@/store"
|
|||
|
|
|
|||
|
|
const useUserStore = defineStore("user", {
|
|||
|
|
state: () => ({
|
|||
|
|
codes: undefined,
|
|||
|
|
roles: undefined,
|
|||
|
|
routers: undefined,
|
|||
|
|
user: undefined,
|
|||
|
|
menus: undefined
|
|||
|
|
}),
|
|||
|
|
|
|||
|
|
getters: {
|
|||
|
|
setUserInfo(state) {
|
|||
|
|
return { ...state }
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
actions: {
|
|||
|
|
setToken(token) {
|
|||
|
|
tool.local.set(import.meta.env.VITE_APP_TOKEN_PREFIX, token)
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
getToken() {
|
|||
|
|
return tool.local.get(import.meta.env.VITE_APP_TOKEN_PREFIX)
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
clearToken() {
|
|||
|
|
tool.local.remove(import.meta.env.VITE_APP_TOKEN_PREFIX)
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
setInfo(data) {
|
|||
|
|
this.$patch(data)
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
resetUserInfo() {
|
|||
|
|
this.$reset()
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
setMenu(data) {
|
|||
|
|
const routers = flatAsyncRoutes(filterAsyncRouter(data))
|
|||
|
|
routers.map((item) => router.addRoute("layout", item))
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// action调用login的getInfo()接口
|
|||
|
|
requestUserInfo() {
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
loginApi.getInfo().then((response) => {
|
|||
|
|
// 如果没有返回res或者res.data,则调用clearToken()的action
|
|||
|
|
// 清除localStorage的token后跳转login
|
|||
|
|
if (!response || !response.data) {
|
|||
|
|
this.clearToken()
|
|||
|
|
router.push({ name: "login" })
|
|||
|
|
reject(false)
|
|||
|
|
} else {
|
|||
|
|
// 如果有数据,则将数据data覆盖state
|
|||
|
|
this.setInfo(response.data)
|
|||
|
|
// 其实下面步骤就是将homePageRoutes.js上面路由
|
|||
|
|
// 放到homePage路由的children里面
|
|||
|
|
homePage.children = webRouter[0].children
|
|||
|
|
this.setMenu(this.routers)
|
|||
|
|
this.routers = removeButtonMenu(this.routers)
|
|||
|
|
this.routers.unshift(homePage)
|
|||
|
|
this.setApp()
|
|||
|
|
resolve(response.data)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
login(form) {
|
|||
|
|
return loginApi
|
|||
|
|
.login(form)
|
|||
|
|
.then((r) => {
|
|||
|
|
if (r.success) {
|
|||
|
|
this.setToken(r.data.token)
|
|||
|
|
return true
|
|||
|
|
} else {
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
.catch((e) => {
|
|||
|
|
console.error(e)
|
|||
|
|
return false
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
async logout() {
|
|||
|
|
await loginApi.logout()
|
|||
|
|
tool.local.remove("tags")
|
|||
|
|
this.clearToken()
|
|||
|
|
this.resetUserInfo()
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
async setApp() {
|
|||
|
|
const appStore = useAppStore()
|
|||
|
|
const setting = this.user.backend_setting
|
|||
|
|
if (setting) {
|
|||
|
|
appStore.toggleMode(setting.mode)
|
|||
|
|
appStore.toggleMenu(setting.menuCollapse)
|
|||
|
|
appStore.toggleTag(setting.tag)
|
|||
|
|
appStore.changeMenuWidth(setting.menuWidth)
|
|||
|
|
appStore.changeLayout(setting.layout)
|
|||
|
|
appStore.useSkin(setting.skin)
|
|||
|
|
appStore.changeColor(setting.color)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
// ~~~~~~~~~~~工具函数~~~~~~~~~~~
|
|||
|
|
// 路由扁平化
|
|||
|
|
const flatAsyncRoutes = (routes, breadcrumb = []) => {
|
|||
|
|
let res = []
|
|||
|
|
routes.forEach((route) => {
|
|||
|
|
const tmp = { ...route }
|
|||
|
|
if (tmp.children) {
|
|||
|
|
// 如果路由有儿子
|
|||
|
|
let childrenBreadcrumb = [...breadcrumb]
|
|||
|
|
childrenBreadcrumb.push(route)
|
|||
|
|
let tmpRoute = { ...route }
|
|||
|
|
tmpRoute.meta.breadcrumb = childrenBreadcrumb
|
|||
|
|
delete tmpRoute.children
|
|||
|
|
res.push(tmpRoute)
|
|||
|
|
let childrenRoutes = flatAsyncRoutes(tmp.children, childrenBreadcrumb)
|
|||
|
|
childrenRoutes.map((item) => {
|
|||
|
|
res.push(item)
|
|||
|
|
})
|
|||
|
|
} else {
|
|||
|
|
let tmpBreadcrumb = [...breadcrumb]
|
|||
|
|
tmpBreadcrumb.push(tmp)
|
|||
|
|
tmp.meta.breadcrumb = tmpBreadcrumb
|
|||
|
|
res.push(tmp)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
return res
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const views = import.meta.glob("../../views/**/**.vue")
|
|||
|
|
const empty = import.meta.glob("../../layout/empty.vue")
|
|||
|
|
|
|||
|
|
// 菜单转换路由
|
|||
|
|
const filterAsyncRouter = (routerMap) => {
|
|||
|
|
const accessedRouters = []
|
|||
|
|
routerMap.forEach((item) => {
|
|||
|
|
if (item.meta.type !== "B") {
|
|||
|
|
if (item.meta.type === "I") {
|
|||
|
|
item.meta.url = item.path
|
|||
|
|
item.path = `/maIframe/${item.name}`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const route = {
|
|||
|
|
path: item.path,
|
|||
|
|
name: item.name,
|
|||
|
|
hidden: item.hidden == 1,
|
|||
|
|
meta: item.meta,
|
|||
|
|
children: item.children ? filterAsyncRouter(item.children) : null,
|
|||
|
|
component: views[`../../views/${item.component}.vue`]
|
|||
|
|
}
|
|||
|
|
accessedRouters.push(route)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
return accessedRouters
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 去除按钮菜单
|
|||
|
|
const removeButtonMenu = (routers) => {
|
|||
|
|
let handlerAfterRouters = []
|
|||
|
|
routers.forEach((item) => {
|
|||
|
|
if (item.meta.type !== "B" && !item.meta.hidden) {
|
|||
|
|
let route = item
|
|||
|
|
if (item.children && item.children.length > 0) {
|
|||
|
|
route.children = removeButtonMenu(item.children)
|
|||
|
|
}
|
|||
|
|
handlerAfterRouters.push(route)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
return handlerAfterRouters
|
|||
|
|
}
|
|||
|
|
export default useUserStore
|