first commit
This commit is contained in:
76
resources/admin/stores/modules/app/index.ts
Normal file
76
resources/admin/stores/modules/app/index.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import Cache from '/admin/support/cache'
|
||||
|
||||
/**
|
||||
* app
|
||||
*/
|
||||
type app = {
|
||||
size: 'small' | 'medium' | 'large'
|
||||
|
||||
isExpand: boolean
|
||||
|
||||
locale: 'zh' | 'en'
|
||||
|
||||
isMobile: boolean
|
||||
|
||||
isDarkMode: boolean
|
||||
|
||||
activeMenu: string
|
||||
}
|
||||
|
||||
export const useAppStore = defineStore('app', {
|
||||
state: (): app => ({
|
||||
size: 'small',
|
||||
isExpand: true,
|
||||
locale: Cache.get('language'),
|
||||
isMobile: false,
|
||||
isDarkMode: false,
|
||||
activeMenu: '/dashboard',
|
||||
}),
|
||||
|
||||
getters: {
|
||||
getSize(): string {
|
||||
return this.size
|
||||
},
|
||||
|
||||
getLocale(): string {
|
||||
return this.locale
|
||||
},
|
||||
|
||||
getIsMobile(): boolean {
|
||||
return this.isMobile
|
||||
},
|
||||
|
||||
getIsDarkMode(): boolean {
|
||||
return this.isDarkMode
|
||||
},
|
||||
|
||||
getActiveMenu(): string {
|
||||
return this.activeMenu
|
||||
},
|
||||
},
|
||||
|
||||
actions: {
|
||||
changeSize(size: 'small' | 'medium' | 'large'): void {
|
||||
this.size = size
|
||||
},
|
||||
|
||||
changeLocale(locale: 'zh' | 'en'): void {
|
||||
Cache.set('language', locale)
|
||||
|
||||
this.locale = locale
|
||||
},
|
||||
|
||||
changeExpaned(): void {
|
||||
this.isExpand = !this.isExpand
|
||||
},
|
||||
|
||||
setDarkMode(isDarkMode: boolean): void {
|
||||
this.isDarkMode = isDarkMode
|
||||
},
|
||||
|
||||
setActiveMenu(activeMenu: string): void {
|
||||
this.activeMenu = activeMenu.startsWith('/') ? activeMenu : '/' + activeMenu
|
||||
},
|
||||
},
|
||||
})
|
152
resources/admin/stores/modules/user/index.ts
Normal file
152
resources/admin/stores/modules/user/index.ts
Normal file
@@ -0,0 +1,152 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { User } from '/admin/types/user'
|
||||
import http from '/admin/support/http'
|
||||
import { rememberAuthToken, removeAuthToken } from '/admin/support/helper'
|
||||
import Message from '/admin/support/message'
|
||||
import router from '/admin/router'
|
||||
import { Permission } from '/admin/types/permission'
|
||||
|
||||
export const useUserStore = defineStore('UserStore', {
|
||||
state: (): User => {
|
||||
return {
|
||||
id: 0,
|
||||
|
||||
nickname: '',
|
||||
|
||||
avatar: '',
|
||||
|
||||
email: '',
|
||||
|
||||
remember_token: '',
|
||||
|
||||
status: 0,
|
||||
|
||||
permissions: [] as Permission[],
|
||||
|
||||
roles: [] as string[],
|
||||
}
|
||||
},
|
||||
|
||||
getters: {
|
||||
getId(): number {
|
||||
return this.id
|
||||
},
|
||||
getNickname(): string {
|
||||
return this.nickname
|
||||
},
|
||||
|
||||
getAvatar(): string {
|
||||
return this.avatar
|
||||
},
|
||||
|
||||
getRoles(): string[] | undefined {
|
||||
return this.roles
|
||||
},
|
||||
|
||||
getPermissions(): Permission[] | undefined {
|
||||
return this.permissions
|
||||
},
|
||||
},
|
||||
|
||||
actions: {
|
||||
isSuperAdmin(): boolean {
|
||||
return this.id === 1
|
||||
},
|
||||
setNickname(nickname: string) {
|
||||
this.nickname = nickname
|
||||
},
|
||||
|
||||
setId(id: number) {
|
||||
this.id = id
|
||||
},
|
||||
|
||||
setRememberToken(token: string) {
|
||||
this.remember_token = token
|
||||
},
|
||||
|
||||
setAvatar(avatar: string) {
|
||||
this.avatar = avatar
|
||||
},
|
||||
|
||||
setRoles(roles: string[]) {
|
||||
this.roles = roles
|
||||
},
|
||||
|
||||
setPermissions(permissions: Permission[]) {
|
||||
this.permissions = permissions
|
||||
},
|
||||
|
||||
setEmail(email: string) {
|
||||
this.email = email
|
||||
},
|
||||
|
||||
setStatus(status: number) {
|
||||
this.status = status
|
||||
},
|
||||
|
||||
/**
|
||||
* login
|
||||
*
|
||||
* @param params
|
||||
* @returns
|
||||
*/
|
||||
login(params: Object) {
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
http
|
||||
.post('/login', params)
|
||||
.then(response => {
|
||||
const { token } = response.data.data
|
||||
rememberAuthToken(token)
|
||||
this.setRememberToken(token)
|
||||
resolve()
|
||||
})
|
||||
.catch(e => {
|
||||
reject(e)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* logout
|
||||
*/
|
||||
logout() {
|
||||
http
|
||||
.post('/logout')
|
||||
.then(() => {
|
||||
removeAuthToken()
|
||||
this.$reset()
|
||||
router.push({ path: '/login' })
|
||||
})
|
||||
.catch(e => {
|
||||
Message.error(e.message)
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* user info
|
||||
*/
|
||||
getUserInfo() {
|
||||
return new Promise((resolve, reject) => {
|
||||
http
|
||||
.get('/user/info')
|
||||
.then(response => {
|
||||
const { id, nickname, email, avatar, permissions, roles, rememberToken, status } = response.data.data
|
||||
// set user info
|
||||
this.setId(id)
|
||||
this.setNickname(nickname)
|
||||
this.setEmail(email)
|
||||
this.setRoles(roles)
|
||||
this.setRememberToken(rememberToken)
|
||||
this.setStatus(status)
|
||||
this.setAvatar(avatar)
|
||||
this.setPermissions(permissions)
|
||||
|
||||
resolve(response.data.data)
|
||||
})
|
||||
.catch(e => {
|
||||
reject(e)
|
||||
})
|
||||
})
|
||||
},
|
||||
},
|
||||
})
|
193
resources/admin/stores/modules/user/permissions.ts
Normal file
193
resources/admin/stores/modules/user/permissions.ts
Normal file
@@ -0,0 +1,193 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { Permission } from '/admin/types/permission'
|
||||
import { MenuType } from '/admin/enum/app'
|
||||
import { Menu } from '/admin/types/Menu'
|
||||
import { constantRoutes } from '/admin/router'
|
||||
import { RouteRecordRaw } from 'vue-router'
|
||||
|
||||
interface Permissions {
|
||||
menus: Menu[]
|
||||
|
||||
asyncMenus: Menu[]
|
||||
|
||||
permissions: Permission[]
|
||||
|
||||
menuPathMap: Map<string, string>
|
||||
}
|
||||
|
||||
export const usePermissionsStore = defineStore('PermissionsStore', {
|
||||
state: (): Permissions => {
|
||||
return {
|
||||
menus: [],
|
||||
|
||||
asyncMenus: [],
|
||||
|
||||
permissions: [],
|
||||
|
||||
menuPathMap: new Map(),
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* get
|
||||
*/
|
||||
getters: {
|
||||
getMenus(): Menu[] {
|
||||
return this.menus
|
||||
},
|
||||
|
||||
getAsyncMenus(): Menu[] {
|
||||
return this.asyncMenus
|
||||
},
|
||||
|
||||
getPermissions(): Permission[] {
|
||||
return this.permissions
|
||||
},
|
||||
|
||||
getMenuPathMap(): Map<string, string> {
|
||||
return this.menuPathMap
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* actions
|
||||
*/
|
||||
actions: {
|
||||
/**
|
||||
* generate async menus
|
||||
* @param permissions
|
||||
* @param force
|
||||
* @returns
|
||||
*/
|
||||
getAsyncMenusFrom(permissions: Permission[], force: boolean = false): Menu[] {
|
||||
// 如果非强制获取并且 menu 有值,直接返回
|
||||
if (!force && this.asyncMenus.length > 0) {
|
||||
return this.asyncMenus
|
||||
}
|
||||
|
||||
const menus: Permission[] = []
|
||||
|
||||
permissions.forEach(permission => {
|
||||
if (permission.type === MenuType.PAGE_TYPE) {
|
||||
menus.push(permission)
|
||||
}
|
||||
|
||||
// set map
|
||||
this.menuPathMap.set(permission.route, permission.title)
|
||||
})
|
||||
|
||||
this.setAsyncMenus(this.getAsnycMenus(menus))
|
||||
|
||||
return this.asyncMenus
|
||||
},
|
||||
|
||||
/**
|
||||
* get menus
|
||||
* @param permissions
|
||||
* @param force
|
||||
* @returns
|
||||
*/
|
||||
getMenusFrom(permissions: Permission[], force: boolean = false): Menu[] {
|
||||
// 如果非强制获取并且 menu 有值,直接返回
|
||||
if (!force && this.menus.length > 0) {
|
||||
return this.menus
|
||||
}
|
||||
const asyncMenus = this.getAsyncMenusFrom(permissions, force)
|
||||
|
||||
this.setMenus(asyncMenus)
|
||||
|
||||
return this.menus
|
||||
},
|
||||
|
||||
/**
|
||||
* set menus
|
||||
*
|
||||
* @param menus
|
||||
*/
|
||||
setMenus(menus: Menu[]) {
|
||||
this.menus = this.transformRoutesToMenus(constantRoutes).concat(menus)
|
||||
},
|
||||
|
||||
setAsyncMenus(menus: Menu[]) {
|
||||
this.asyncMenus = menus
|
||||
},
|
||||
|
||||
/**
|
||||
* 生成 Menus
|
||||
*
|
||||
* @param permissions
|
||||
* @param parentId
|
||||
* @param path
|
||||
* @returns
|
||||
*/
|
||||
getAsnycMenus(permissions: Permission[], parentId: number = 0, path: string = ''): Menu[] {
|
||||
const menus: Menu[] = []
|
||||
|
||||
permissions.forEach(permission => {
|
||||
if (permission.parent_id === parentId) {
|
||||
// menu
|
||||
const menu: Menu = Object.assign({
|
||||
path: this.resoulveRoutePath(permission.route, path),
|
||||
name: permission.module + '_' + permission.permission_mark,
|
||||
redirect: permission.redirect,
|
||||
meta: Object.assign({ title: permission.title, icon: permission.icon, hidden: permission.hidden, is_inner: permission.is_inner }),
|
||||
})
|
||||
|
||||
// child menu
|
||||
const children = this.getAsnycMenus(permissions, permission.id, menu.path)
|
||||
if (children.length > 0) {
|
||||
menu.children = children
|
||||
}
|
||||
menus.push(menu)
|
||||
}
|
||||
})
|
||||
|
||||
return menus
|
||||
},
|
||||
|
||||
/**
|
||||
* transform routes to menus
|
||||
* @param routes
|
||||
* @param path
|
||||
* @returns
|
||||
*/
|
||||
transformRoutesToMenus(routes: Menu[] | Array<RouteRecordRaw>, path: string = ''): Menu[] {
|
||||
const menus: Menu[] = []
|
||||
|
||||
routes.forEach(route => {
|
||||
if (route.meta?.hidden) {
|
||||
return false
|
||||
}
|
||||
|
||||
const menu: Menu = Object.assign({
|
||||
path: this.resoulveRoutePath(route.path, path),
|
||||
name: route.name,
|
||||
meta: route.meta,
|
||||
component: route.component,
|
||||
})
|
||||
|
||||
if (route.children?.length) {
|
||||
menu.children = this.transformRoutesToMenus(route.children, menu.path)
|
||||
}
|
||||
|
||||
menus.push(menu)
|
||||
})
|
||||
return menus
|
||||
},
|
||||
|
||||
/**
|
||||
* resoulve route path
|
||||
* @param route
|
||||
* @param path
|
||||
* @returns
|
||||
*/
|
||||
resoulveRoutePath(route: string, path: string): string {
|
||||
if (path.length) {
|
||||
return (path + (route.indexOf('/') === -1 ? '/' : '') + route).replace(/\/$/g, '')
|
||||
}
|
||||
|
||||
// 去除尾部的 /
|
||||
return route.replace(/\/$/g, '')
|
||||
},
|
||||
},
|
||||
})
|
Reference in New Issue
Block a user