Skip to content

admin

路径:packages/shared/admin
包名:@xichen-full-stack/admin

Web 与 Desktop 共用的 RBAC 管理后台(登录、Layout、Tab 多开、系统管理 CRUD)。

启动方式

typescript
import 'element-plus/dist/index.css'
import '@xichen-full-stack/admin/styles.css'
import { bootstrapAdminApp } from '@xichen-full-stack/admin'
import { createWebHashHistory } from 'vue-router'

// 宿主业务视图(web/desktop 各自目录)
const hostViews = import.meta.glob('./views/**/*.vue')

const { app } = await bootstrapAdminApp({
  baseURL: import.meta.env.VITE_API_BASE_URL ?? 'http://localhost:8080',
  base: import.meta.env.BASE_URL,           // Web
  history: createWebHashHistory(),         // Desktop
  client: 'desktop',
  layout: 'enterprise',
  viewModules: hostViews,
})
app.mount('#app')

布局模式

菜单数据共用(auth.menus),Web / Desktop 默认统一 NC 企业壳

布局说明
enterprise(默认)NC 风格:顶栏信息区 + 左侧模块导航 + 功能树 + 多页签
sidebar简洁侧栏(旧版)
topbarCursor 式顶栏菜单(旧版 Desktop)
typescript
// 默认即为 enterprise,两端同一套壳
bootstrapAdminApp({ client: 'web', viewModules: hostViews })
bootstrapAdminApp({ client: 'desktop', history: createWebHashHistory(), viewModules: hostViews })

NC 企业壳结构:

text
EnterpriseHeader        顶栏①品牌/窗口控制 + 顶栏②用户/工具
EnterpriseSidebar       左侧大模块 + 右侧功能树
EnterprisePageTabs      多文档页签
AdminMainContent        业务内容区

未传 layout 时默认为 enterpriseshowTabs 默认 true

动态路由

  1. 登录后 menus 传入 setupDynamicRoutes(按 client 过滤)
  2. component 先匹配宿主 viewModules,再匹配 admin 内置 views/**
  3. 菜单 component 示例:system/users/indexinstrument/DeviceConsole
菜单字段说明
path路由,如 /instrument
component视图 key
clientall / web / desktop
permission可见菜单所需权限码

扩展新页面(业务在宿主)

  1. web/src/viewsdesktop/src/views 新增 Vue 文件
  2. 后台菜单管理配置 path、component、client、permission
  3. 页面内按钮使用 v-permission="'xxx:yyy:action'"

平台管理页(system/*)仍在 admin 包内。

依赖模型(workspace + peer + catalog)

admin 把 vue / element-plus 打进自己的 bundle,由宿主(web/desktop)提供:

json
{
  "dependencies": {
    "@xichen-full-stack/api-client": "workspace:^"
  },
  "peerDependencies": {
    "vue": "^3.5.0",
    "element-plus": "^2.9.0",
    "pinia": "^3.0.0",
    "vue-router": "^4.5.0"
  },
  "devDependencies": {
    "vue": "catalog:",
    "typescript": "catalog:"
  }
}
类型含义
workspace:^内部 shared 包
peerDependencies声明「宿主必须安装」,兼容范围
catalog:本 monorepo 内 dev/build 用的统一版本(见 pnpm-workspace.yaml

web/desktop 在 dependencies 中用 catalog: 安装 vue、element-plus 等,满足 admin 的 peer 要求。

目录结构

text
src/
├── setup.ts           # bootstrapAdminApp
├── api/client.ts      # initApiClient / getApi
├── router/            # 静态路由 + 动态菜单路由
├── stores/auth.ts     # 登录、session、权限
├── stores/tabs.ts     # 多页签
├── layouts/           # AdminLayout / Sidebar / Topbar
├── composables/useAdminLayout.ts
├── views/             # login、dashboard、system/*
├── directives/permission.ts  # v-permission
└── components/ChangePasswordDialog.vue

导出 API

typescript
export { bootstrapAdminApp, useAuthStore, useTabsStore, tokenStorage, getApi }
export type { AdminBootstrapOptions, AdminBootstrapResult, AdminLayoutMode }

Web vs Desktop

WebDesktop
路由history(默认)hash
布局enterprise NC 企业壳(与 Web 相同)同上
窗口控制顶栏右侧 − □ ×
多页签默认开启默认开启
端口51735174
入口packages/web/src/main.tspackages/desktop/src/main.ts

扩展新页面

见上文「扩展新页面(业务在宿主)」;DeviceConsole 示例见 desktop/src/views/instrument/DeviceConsole.vue

相关文档

Xichen Full Stack 内部文档