first
This commit is contained in:
258
admin-web/src/router/index.ts
Normal file
258
admin-web/src/router/index.ts
Normal file
@@ -0,0 +1,258 @@
|
||||
import { createRouter, createWebHashHistory } from "vue-router";
|
||||
import { adminApi } from "../api/admin";
|
||||
import { clearAdminSession, getAdminInfo, getAdminToken, hasPermission, setAdminInfo } from "../utils/auth";
|
||||
|
||||
const adminChildren = [
|
||||
{
|
||||
path: "dashboard",
|
||||
name: "dashboard",
|
||||
component: () => import("../pages/dashboard/index.vue"),
|
||||
meta: {
|
||||
title: "工作台",
|
||||
desc: "查看当前订单、报告与处理进度概览。",
|
||||
permission: "dashboard.view",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "orders",
|
||||
name: "orders",
|
||||
component: () => import("../pages/orders/index.vue"),
|
||||
meta: {
|
||||
title: "订单中心",
|
||||
desc: "管理订单流转、查看补图任务与处理详情。",
|
||||
permission: "orders.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "appraisal-tasks",
|
||||
name: "appraisal-tasks",
|
||||
component: () => import("../pages/appraisal-tasks/index.vue"),
|
||||
meta: {
|
||||
title: "鉴定作业台",
|
||||
desc: "查看鉴定任务、资料详情与当前作业结论。",
|
||||
permission: "appraisal_tasks.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "catalog",
|
||||
name: "catalog",
|
||||
component: () => import("../pages/catalog/index.vue"),
|
||||
meta: {
|
||||
title: "商品资料中心",
|
||||
desc: "查看品类、品牌、上传模板与鉴定模板等基础配置数据。",
|
||||
permission: "catalog.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "reports",
|
||||
name: "reports",
|
||||
component: () => import("../pages/reports/index.vue"),
|
||||
meta: {
|
||||
title: "报告中心",
|
||||
desc: "查看已生成报告、报告状态与验真信息。",
|
||||
permission: "reports.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "messages",
|
||||
name: "messages",
|
||||
component: () => import("../pages/messages/index.vue"),
|
||||
meta: {
|
||||
title: "消息中心",
|
||||
desc: "查看消息模板、触发规则与发送记录概览。",
|
||||
permission: "messages.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "tickets",
|
||||
name: "tickets",
|
||||
component: () => import("../pages/tickets/index.vue"),
|
||||
meta: {
|
||||
title: "客服与售后",
|
||||
desc: "查看工单、用户留言与售后处理记录。",
|
||||
permission: "tickets.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "users",
|
||||
name: "users",
|
||||
component: () => import("../pages/users/index.vue"),
|
||||
meta: {
|
||||
title: "用户管理",
|
||||
desc: "查看用户资料、地址、消息和工单等用户侧资产概览。",
|
||||
permission: "users.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "customers",
|
||||
name: "customers",
|
||||
component: () => import("../pages/customers/index.vue"),
|
||||
meta: {
|
||||
title: "客户管理",
|
||||
desc: "维护大客户资料、开放接口应用 Key、订单映射和 Webhook 推送记录。",
|
||||
permission: "customers.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "warehouses",
|
||||
name: "warehouses",
|
||||
component: () => import("../pages/warehouses/index.vue"),
|
||||
meta: {
|
||||
title: "仓库中心",
|
||||
desc: "维护收货仓库、检测中心地址信息,并为后续多仓库扩展预留能力。",
|
||||
permission: "warehouses.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "materials",
|
||||
name: "materials",
|
||||
component: () => import("../pages/materials/index.vue"),
|
||||
meta: {
|
||||
title: "物料管理",
|
||||
desc: "批量生成吊牌二维码,管理批次下载、条码搜索与报告绑定状态。",
|
||||
permission: "materials.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "access",
|
||||
name: "access",
|
||||
component: () => import("../pages/access/index.vue"),
|
||||
meta: {
|
||||
title: "权限中心",
|
||||
desc: "管理管理员账号、角色配置与权限点分配。",
|
||||
permission: "access.manage",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "content",
|
||||
name: "content",
|
||||
component: () => import("../pages/content/index.vue"),
|
||||
redirect: { name: "content-home" },
|
||||
meta: {
|
||||
title: "内容中心",
|
||||
desc: "维护首页展示内容与帮助中心文章等用户端内容配置。",
|
||||
permission: "system.manage",
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: "home",
|
||||
name: "content-home",
|
||||
component: () => import("../pages/content/home.vue"),
|
||||
meta: {
|
||||
title: "内容中心",
|
||||
desc: "首页内容维护:Banner、服务入口、快捷入口和信任信息。",
|
||||
permission: "system.manage",
|
||||
menuIndex: "content",
|
||||
contentTab: "home",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "policy",
|
||||
name: "content-policy",
|
||||
component: () => import("../pages/content/policy.vue"),
|
||||
meta: {
|
||||
title: "内容中心",
|
||||
desc: "协议与说明维护:设置页说明入口和下单确认协议。",
|
||||
permission: "system.manage",
|
||||
menuIndex: "content",
|
||||
contentTab: "policy",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "meta",
|
||||
name: "content-meta",
|
||||
component: () => import("../pages/content/meta.vue"),
|
||||
meta: {
|
||||
title: "内容中心",
|
||||
desc: "分类与文案维护:帮助分类、消息事件、工单文案和风险提示。",
|
||||
permission: "system.manage",
|
||||
menuIndex: "content",
|
||||
contentTab: "meta",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "articles",
|
||||
name: "content-articles",
|
||||
component: () => import("../pages/content/articles.vue"),
|
||||
meta: {
|
||||
title: "内容中心",
|
||||
desc: "帮助文章维护:文章正文、推荐状态和排序。",
|
||||
permission: "system.manage",
|
||||
menuIndex: "content",
|
||||
contentTab: "articles",
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: "system-config",
|
||||
name: "system-config",
|
||||
component: () => import("../pages/system-config/index.vue"),
|
||||
meta: {
|
||||
title: "系统配置",
|
||||
desc: "配置小程序、H5、支付与商户平台等上线核心参数。",
|
||||
permission: "system.manage",
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHashHistory(),
|
||||
routes: [
|
||||
{
|
||||
path: "/login",
|
||||
name: "login",
|
||||
component: () => import("../pages/login/index.vue"),
|
||||
meta: {
|
||||
public: true,
|
||||
title: "登录",
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "/",
|
||||
component: () => import("../layouts/AdminLayout.vue"),
|
||||
redirect: "/dashboard",
|
||||
children: adminChildren,
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
function firstAccessibleRoute() {
|
||||
const target = adminChildren.find((route) => hasPermission(route.meta.permission as string));
|
||||
return target?.name || "dashboard";
|
||||
}
|
||||
|
||||
router.beforeEach(async (to) => {
|
||||
if (to.meta.public) {
|
||||
if (getAdminToken()) {
|
||||
return { name: firstAccessibleRoute() };
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
const token = getAdminToken();
|
||||
if (!token) {
|
||||
clearAdminSession();
|
||||
return { name: "login" };
|
||||
}
|
||||
|
||||
if (!getAdminInfo()) {
|
||||
try {
|
||||
const response = await adminApi.getAuthMe();
|
||||
setAdminInfo(response.data.admin_info);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
clearAdminSession();
|
||||
return { name: "login" };
|
||||
}
|
||||
}
|
||||
|
||||
const permission = to.meta.permission as string | undefined;
|
||||
if (permission && !hasPermission(permission)) {
|
||||
return { name: firstAccessibleRoute() };
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
export default router;
|
||||
Reference in New Issue
Block a user