This commit is contained in:
sion
2026-04-05 19:43:31 +08:00
parent 5b9a80e3fe
commit 2fbc47117c
94 changed files with 1032 additions and 882 deletions

View File

@@ -1,10 +1,13 @@
import { storeToRefs } from 'pinia'
import { useQueryClient } from '@tanstack/vue-query'
import { useAdminLoginMutation } from '@/services/api/monisuo-admin.api'
import { useAuthStore } from '@/stores/auth'
export function useAuth() {
const router = useRouter()
const queryClient = useQueryClient()
const authStore = useAuthStore()
const { isLogin, adminInfo } = storeToRefs(authStore)
@@ -15,6 +18,7 @@ export function useAuth() {
function logout() {
authStore.logout()
queryClient.clear()
router.push({ path: '/auth/sign-in' })
}
@@ -52,7 +56,7 @@ export function useAuth() {
}
catch (e: any) {
console.error('Login error:', e)
error.value = e.response?.data?.msg || '网络错误,请稍后重试'
error.value = e.message || e.response?.data?.msg || '网络错误,请稍后重试'
}
finally {
loading.value = false

View File

@@ -22,6 +22,10 @@ export function useAxios() {
})
axiosInstance.interceptors.response.use((response) => {
const data = response.data as any
if (data && data.code && data.code !== '0000') {
return Promise.reject(new Error(data.msg || '请求失败'))
}
return response
}, (error: AxiosError) => {
if (error.response?.status === 401) {

View File

@@ -1,21 +1,28 @@
import { Coins, DollarSign, Palette, Receipt, Settings, TrendingUp, Users } from 'lucide-vue-next'
import { CircleDollarSign, Coins, DollarSign, Palette, Receipt, Settings, ShieldCheck, TrendingUp, Users } from 'lucide-vue-next'
import type { NavGroup } from '@/components/app-sidebar/types'
import { useAuthStore } from '@/stores/auth'
export function useSidebar() {
const authStore = useAuthStore()
const role = computed(() => authStore.adminInfo?.role ?? 2)
const isSuperAdmin = computed(() => role.value === 1)
const settingsNavItems = [
{ title: '外观设置', url: '/settings/appearance', icon: Palette },
]
const navData = ref<NavGroup[]>([
const allNavItems: NavGroup[] = [
{
title: 'Monisuo 管理',
items: [
{ title: '数据看板', url: '/monisuo/dashboard', icon: DollarSign },
{ title: '用户管理', url: '/monisuo/users', icon: Users },
{ title: '币种管理', url: '/monisuo/coins', icon: Coins },
{ title: '订单审批', url: '/monisuo/orders', icon: Receipt },
{ title: '业务分析', url: '/monisuo/analytics', icon: TrendingUp },
{ title: '数据看板', url: '/monisuo/dashboard', icon: DollarSign, roles: [1] },
{ title: '用户管理', url: '/monisuo/users', icon: Users, roles: [1] },
{ title: '币种管理', url: '/monisuo/coins', icon: Coins, roles: [1] },
{ title: '订单审批', url: '/monisuo/orders', icon: Receipt, roles: [1, 2] },
{ title: '财务审批', url: '/monisuo/finance-orders', icon: CircleDollarSign, roles: [1, 3] },
{ title: '业务分析', url: '/monisuo/analytics', icon: TrendingUp, roles: [1] },
{ title: '管理员管理', url: '/monisuo/admins', icon: ShieldCheck, roles: [1] },
],
},
{
@@ -24,7 +31,19 @@ export function useSidebar() {
{ title: 'Settings', icon: Settings, items: settingsNavItems },
],
},
])
]
const navData = computed<NavGroup[]>(() => {
return allNavItems.map(group => ({
title: group.title,
items: group.items.filter((item) => {
const roles = (item as any).roles as number[] | undefined
if (!roles)
return true
return roles.includes(role.value)
}),
})).filter(group => group.items.length > 0)
})
const otherPages = ref<NavGroup[]>([])
@@ -32,5 +51,6 @@ export function useSidebar() {
navData,
otherPages,
settingsNavItems,
isSuperAdmin,
}
}