From e731ee7a2e21d5dc46af32947d55eec0e619b3ab Mon Sep 17 00:00:00 2001 From: marsal Date: Tue, 7 Jul 2026 15:25:47 +0800 Subject: [PATCH] feat(web): add login, auth store and router guard --- admin-web/src/components/Layout.vue | 37 +++++++- admin-web/src/main.ts | 2 + admin-web/src/router/index.ts | 28 ++++++ admin-web/src/stores/auth.ts | 31 +++++++ admin-web/src/views/FlowTrace.vue | 5 ++ admin-web/src/views/Login.vue | 110 +++++++++++++++++++++++ admin-web/src/views/MessageTest.vue | 5 ++ admin-web/src/views/TenantManagement.vue | 5 ++ admin-web/src/views/UserManagement.vue | 5 ++ 9 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 admin-web/src/stores/auth.ts create mode 100644 admin-web/src/views/FlowTrace.vue create mode 100644 admin-web/src/views/Login.vue create mode 100644 admin-web/src/views/MessageTest.vue create mode 100644 admin-web/src/views/TenantManagement.vue create mode 100644 admin-web/src/views/UserManagement.vue diff --git a/admin-web/src/components/Layout.vue b/admin-web/src/components/Layout.vue index 598843d..15444aa 100644 --- a/admin-web/src/components/Layout.vue +++ b/admin-web/src/components/Layout.vue @@ -27,11 +27,27 @@ 入站流程 + + 流程追踪 + + + 消息测试 + + + 租户管理 + + + 用户管理 + {{ $route.meta.title || '消息中台' }} +
+ + 退出登录 +
@@ -41,8 +57,17 @@ diff --git a/admin-web/src/main.ts b/admin-web/src/main.ts index 5496f34..4440bd0 100644 --- a/admin-web/src/main.ts +++ b/admin-web/src/main.ts @@ -1,4 +1,5 @@ import { createApp } from 'vue' +import { createPinia } from 'pinia' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import './style.css' @@ -6,6 +7,7 @@ import App from './App.vue' import router from './router' const app = createApp(App) +app.use(createPinia()) app.use(ElementPlus) app.use(router) app.mount('#app') diff --git a/admin-web/src/router/index.ts b/admin-web/src/router/index.ts index 050f7a9..9b7d78a 100644 --- a/admin-web/src/router/index.ts +++ b/admin-web/src/router/index.ts @@ -8,8 +8,19 @@ import Person from '../views/Person.vue' import Tag from '../views/Tag.vue' import SendRecord from '../views/SendRecord.vue' import InboundFlow from '../views/InboundFlow.vue' +import FlowTrace from '../views/FlowTrace.vue' +import MessageTest from '../views/MessageTest.vue' +import TenantManagement from '../views/TenantManagement.vue' +import UserManagement from '../views/UserManagement.vue' +import Login from '../views/Login.vue' +import { useAuthStore } from '../stores/auth' const routes = [ + { + path: '/login', + component: Login, + meta: { public: true }, + }, { path: '/', component: Layout, @@ -23,6 +34,10 @@ const routes = [ { path: 'tag', component: Tag, meta: { title: '标签' } }, { path: 'send-record', component: SendRecord, meta: { title: '发送记录' } }, { path: 'inbound-flow', component: InboundFlow, meta: { title: '入站流程' } }, + { path: 'flow-trace', component: FlowTrace, meta: { title: '流程追踪' } }, + { path: 'message-test', component: MessageTest, meta: { title: '消息测试' } }, + { path: 'tenant-management', component: TenantManagement, meta: { title: '租户管理' } }, + { path: 'user-management', component: UserManagement, meta: { title: '用户管理' } }, ], }, ] @@ -32,4 +47,17 @@ const router = createRouter({ routes, }) +router.beforeEach((to, from, next) => { + const authStore = useAuthStore() + const isPublic = to.meta?.public === true + + if (!isPublic && !authStore.isLoggedIn) { + next('/login') + } else if (to.path === '/login' && authStore.isLoggedIn) { + next('/dashboard') + } else { + next() + } +}) + export default router diff --git a/admin-web/src/stores/auth.ts b/admin-web/src/stores/auth.ts new file mode 100644 index 0000000..8ee8c1f --- /dev/null +++ b/admin-web/src/stores/auth.ts @@ -0,0 +1,31 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' + +export const useAuthStore = defineStore('auth', () => { + const token = ref(localStorage.getItem('mci-token') || '') + const tenantCode = ref(localStorage.getItem('mci-tenant-code') || '') + const username = ref('') + const roleCodes = ref([]) + + const isLoggedIn = computed(() => !!token.value) + + function setAuth(t: string, tc: string, user: string, roles: string[]) { + token.value = t + tenantCode.value = tc + username.value = user + roleCodes.value = roles + localStorage.setItem('mci-token', t) + localStorage.setItem('mci-tenant-code', tc) + } + + function clearAuth() { + token.value = '' + tenantCode.value = '' + username.value = '' + roleCodes.value = [] + localStorage.removeItem('mci-token') + localStorage.removeItem('mci-tenant-code') + } + + return { token, tenantCode, username, roleCodes, isLoggedIn, setAuth, clearAuth } +}) diff --git a/admin-web/src/views/FlowTrace.vue b/admin-web/src/views/FlowTrace.vue new file mode 100644 index 0000000..ae8e5f8 --- /dev/null +++ b/admin-web/src/views/FlowTrace.vue @@ -0,0 +1,5 @@ + diff --git a/admin-web/src/views/Login.vue b/admin-web/src/views/Login.vue new file mode 100644 index 0000000..f8eb947 --- /dev/null +++ b/admin-web/src/views/Login.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/admin-web/src/views/MessageTest.vue b/admin-web/src/views/MessageTest.vue new file mode 100644 index 0000000..564feb3 --- /dev/null +++ b/admin-web/src/views/MessageTest.vue @@ -0,0 +1,5 @@ + diff --git a/admin-web/src/views/TenantManagement.vue b/admin-web/src/views/TenantManagement.vue new file mode 100644 index 0000000..3a79991 --- /dev/null +++ b/admin-web/src/views/TenantManagement.vue @@ -0,0 +1,5 @@ + diff --git a/admin-web/src/views/UserManagement.vue b/admin-web/src/views/UserManagement.vue new file mode 100644 index 0000000..1168f11 --- /dev/null +++ b/admin-web/src/views/UserManagement.vue @@ -0,0 +1,5 @@ +