Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | 1x 1x 12x 12x 12x 2x 10x 4x 12x 1x 9x 1x 8x 1x 8x | import { createRouter, createWebHistory } from "vue-router";
import OperationsHomeView from "./views/OperationsHomeView.vue";
import CatalogReadOnlyView from "./views/CatalogReadOnlyView.vue";
import NotFoundView from "./views/NotFoundView.vue";
import StaffLoginView from "./views/StaffLoginView.vue";
import ForbiddenView from "./views/ForbiddenView.vue";
import FulfillmentWorkspaceView from "./views/FulfillmentWorkspaceView.vue";
import AfterSaleWorkspaceView from "./views/AfterSaleWorkspaceView.vue";
import InventoryWorkspaceView from "./views/InventoryWorkspaceView.vue";
import GovernanceWorkspaceView from "./views/GovernanceWorkspaceView.vue";
import MarketingWorkspaceView from "./views/MarketingWorkspaceView.vue";
import ChatWorkspaceView from "./views/ChatWorkspaceView.vue";
import ReviewWorkspaceView from "./views/ReviewWorkspaceView.vue";
import { resolveStaffRedirect } from "./navigation";
import { pinia } from "./stores/pinia";
import { hasAnyRole, useStaffSessionStore } from "./stores/session";
export const router = createRouter({
history: createWebHistory(),
routes: [
{
path: "/",
name: "operations-home",
component: OperationsHomeView,
meta: {
title: "工作区|素简记管理端",
requiresAuth: true,
roles: ["ADMIN", "OPERATOR", "WAREHOUSE"],
},
},
{
path: "/catalog",
name: "catalog-read-only",
component: CatalogReadOnlyView,
meta: {
title: "商品目录|素简记管理端",
requiresAuth: true,
roles: ["ADMIN", "OPERATOR"],
},
},
{
path: "/fulfillment",
name: "fulfillment-workspace",
component: FulfillmentWorkspaceView,
meta: {
title: "履约与退货|素简记管理端",
requiresAuth: true,
roles: ["ADMIN", "WAREHOUSE"],
},
},
{
path: "/after-sales",
name: "after-sale-workspace",
component: AfterSaleWorkspaceView,
meta: {
title: "售后审核|素简记管理端",
requiresAuth: true,
roles: ["ADMIN"],
},
},
{
path: "/inventory",
name: "inventory-workspace",
component: InventoryWorkspaceView,
meta: {
title: "库存工作区|素简记管理端",
requiresAuth: true,
roles: ["ADMIN", "WAREHOUSE"],
},
},
{
path: "/marketing",
name: "marketing-workspace",
component: MarketingWorkspaceView,
meta: {
title: "营销权益|素简记管理端",
requiresAuth: true,
roles: ["ADMIN", "OPERATOR"],
},
},
{
path: "/governance",
name: "governance-workspace",
component: GovernanceWorkspaceView,
meta: {
title: "补偿与对账|素简记管理端",
requiresAuth: true,
roles: ["ADMIN"],
},
},
{
path: "/chat",
name: "chat-workspace",
component: ChatWorkspaceView,
meta: {
title: "客服会话|素简记管理端",
requiresAuth: true,
roles: ["ADMIN", "OPERATOR"],
},
},
{
path: "/chat/:conversationId",
name: "chat-workspace-detail",
component: ChatWorkspaceView,
meta: {
title: "客服会话详情|素简记管理端",
requiresAuth: true,
roles: ["ADMIN", "OPERATOR"],
},
},
{
path: "/reviews",
name: "review-workspace",
component: ReviewWorkspaceView,
meta: {
title: "评价治理|素简记管理端",
requiresAuth: true,
roles: ["ADMIN", "OPERATOR"],
},
},
{
path: "/login",
name: "staff-login",
component: StaffLoginView,
meta: { title: "员工登录|素简记管理端", publicLayout: true },
},
{
path: "/forbidden",
name: "forbidden",
component: ForbiddenView,
meta: { title: "权限不足|素简记管理端", publicLayout: true },
},
{
path: "/:pathMatch(.*)*",
component: NotFoundView,
meta: { title: "页面不存在|素简记管理端" },
},
],
});
router.beforeEach(async (to) => {
const session = useStaffSessionStore(pinia);
await session.restore();
if (to.meta.requiresAuth && !session.authenticated) {
return session.accessDenied
? { name: "forbidden" }
: {
name: "staff-login",
query: { redirect: to.fullPath },
};
}
const requiredRoles = Array.isArray(to.meta.roles)
? to.meta.roles.filter((role): role is string => typeof role === "string")
: [];
if (
to.meta.requiresAuth
&& session.profile
&& !hasAnyRole(session.profile.roles, requiredRoles)
) {
return { name: "forbidden" };
}
if (to.name === "staff-login" && session.authenticated) {
return resolveStaffRedirect(to.query.redirect);
}
return true;
});
router.afterEach((to) => {
document.title = typeof to.meta.title === "string"
? to.meta.title
: "素简记管理端";
});
|