first commit

This commit is contained in:
JaguarJack
2022-12-05 23:01:12 +08:00
commit 0024080c28
322 changed files with 27698 additions and 0 deletions

View 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
},
},
})

View 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)
})
})
},
},
})

View 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, '')
},
},
})