@@ -170,15 +153,15 @@ onBeforeUnmount(() => {
用户名
- {{ user?.userName || '-' }}
+ {{ userStore.user?.userName || '-' }}
用户ID
- {{ user?.id || '-' }}
+ {{ userStore.user?.id || '-' }}
角色ID
- {{ user?.roleId || '-' }}
+ {{ userStore.user?.roleId || '-' }}
diff --git a/src/pages/org/list.vue b/src/pages/org/list.vue
new file mode 100644
index 0000000..06ca181
--- /dev/null
+++ b/src/pages/org/list.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
diff --git a/src/router/index.js b/src/router/index.js
index a5565ed..d1a4fe3 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -6,7 +6,6 @@ import Projects from '../pages/Projects.vue'
import Analytics from '../pages/Analytics.vue'
import QrLogin from '../pages/QrLogin.vue'
import AdminLayout from '../pages/admin/AdminLayout.vue'
-import AdminDashboard from '../pages/admin/Dashboard.vue'
import { getToken } from '../lib/auth'
const router = createRouter({
@@ -46,12 +45,13 @@ const router = createRouter({
path: '/admin',
component: AdminLayout,
children: [
- { path: '', name: 'admin-home', component: AdminDashboard },
- { path: 'dashboard', redirect: '/admin' },
+ { path: '', redirect: '/admin/archives' },
+ { path: 'dashboard', component: Home },
{ path: 'archives', name: 'admin-archives', component: Archives },
{ path: 'inspections', name: 'admin-inspections', component: Inspections },
{ path: 'projects', name: 'admin-projects', component: Projects },
{ path: 'analytics', name: 'admin-analytics', component: Analytics },
+ { path: 'org/list', name: 'admin-org', component: () => import('../pages/org/list.vue') },
],
},
],
diff --git a/src/stores/menu.js b/src/stores/menu.js
new file mode 100644
index 0000000..d23897f
--- /dev/null
+++ b/src/stores/menu.js
@@ -0,0 +1,37 @@
+import { defineStore } from 'pinia'
+import { apiFetch } from '../lib/api'
+import { getToken } from '../lib/auth'
+
+// 定义菜单 store
+export const useMenuStore = defineStore('menu', {
+ state: () => ({
+ menus: [],
+ loading: false,
+ error: null
+ }),
+
+ getters: {
+ hasMenus: (state) => state.menus.length > 0
+ },
+
+ actions: {
+ async loadMenus() {
+ if (!getToken()) return
+
+ this.loading = true
+ this.error = null
+
+ try {
+ const res = await apiFetch('/api/menus')
+ if (res?.items) {
+ this.menus = res.items
+ }
+ } catch (err) {
+ this.error = err.message || '加载菜单失败'
+ console.error('加载菜单失败:', err)
+ } finally {
+ this.loading = false
+ }
+ }
+ }
+})
diff --git a/src/stores/user.js b/src/stores/user.js
new file mode 100644
index 0000000..d707937
--- /dev/null
+++ b/src/stores/user.js
@@ -0,0 +1,56 @@
+import { defineStore } from 'pinia'
+import { apiFetch } from '../lib/api'
+import { clearAuth, getToken, getUser, setUser } from '../lib/auth'
+
+// 定义用户 store
+export const useUserStore = defineStore('user', {
+ state: () => ({
+ user: getUser() || null,
+ loading: false,
+ error: null
+ }),
+
+ getters: {
+ isLoggedIn: (state) => !!state.user,
+ userAvatarText: (state) => {
+ if (!state.user) return 'U'
+ const name = state.user.userName || '用户'
+ const t = String(name).trim()
+ return t ? t.slice(0, 1).toUpperCase() : 'U'
+ }
+ },
+
+ actions: {
+ async loadUser() {
+ if (!getToken()) return
+
+ this.loading = true
+ this.error = null
+
+ try {
+ const res = await apiFetch('/api/me')
+ if (res?.user) {
+ this.user = res.user
+ setUser(res.user)
+ }
+ } catch (err) {
+ this.error = err.message || '加载用户信息失败'
+ clearAuth()
+ // 这里可以添加路由跳转逻辑,跳转到登录页
+ } finally {
+ this.loading = false
+ }
+ },
+
+ logout() {
+ clearAuth()
+ this.user = null
+ this.error = null
+ },
+
+ setUser(user) {
+ this.user = user
+ setUser(user)
+ }
+ }
+})
+
+
+ 组织机构管理
+ +加载中...
+ {{ error }}
+
+
+
+
+ {{ org.name }}
+ {{ org.code }}
+
+
+
+
+ 暂无组织机构
+