项目结构
XYGo Admin 2026-04-01 38 次阅读
web-tenant 目录结构与主项目差异说明
项目结构
租户前端项目 web-tenant 是一个独立的 Vue3 + Vite 工程,与主项目 web 共享技术栈和组件体系,但在路由、API 命名空间和业务定位上有明确区分。
目录树
web-tenant/
├── src/
│ ├── api/ # API 请求封装
│ │ ├── site.ts # 站点公开接口(/site/index)
│ │ ├── common/ # 验证码等公共接口
│ │ └── backend/ # 租户后台接口
│ │ ├── auth/ # 登录认证
│ │ ├── system/ # 菜单、角色、用户等
│ │ ├── member/ # 租户下的会员管理
│ │ ├── tenant/ # 租户管理专属接口
│ │ ├── cms/ # 文档管理
│ │ ├── monitor/ # 系统监控
│ │ └── develop/ # 开发工具
│ ├── components/ # 公共组件(与 web/ 一致)
│ ├── directives/ # 自定义指令(v-auth/v-roles)
│ ├── hooks/ # 组合式函数
│ ├── locales/ # 国际化语言包
│ ├── router/
│ │ ├── index.ts # Hash 路由实例
│ │ ├── routesAlias.ts # ADMIN_BASE_PATH = /tenant
│ │ ├── routes/
│ │ │ └── staticRoutes.ts # / → /tenant/login
│ │ ├── guards/ # 路由守卫
│ │ └── core/ # MenuProcessor/RouteRegistry
│ ├── store/modules/ # Pinia:user/site/menu/setting
│ ├── utils/
│ │ ├── http/ # Axios 封装(tenantRequest)
│ │ ├── navigation/ # 菜单跳转工具
│ │ ├── storage/ # 本地存储
│ │ └── ... # 表格/UI/表单工具
│ ├── views/
│ │ ├── backend/ # 租户后台页面
│ │ └── common/ # 403/404/500/Iframe
│ ├── App.vue
│ └── main.ts
├── .env # 通用变量(端口/路径/加密密钥)
├── .env.development # 开发变量(API 代理地址)
├── .env.production # 生产变量(API 基础 URL)
├── vite.config.ts # Vite 配置(代理/别名/构建)
├── package.json
└── tsconfig.json
与主项目 web/ 的关键差异
| 维度 | web-tenant | web |
|---|---|---|
| 定位 | 纯租户后台管理 | 平台后台 + 前台门户 |
| 路由前缀 | /tenant |
/admin(后台)+ /(前台) |
| API 命名空间 | /tenant/* |
/admin/* + /member/* + /site/* |
| 前台门户 | 无(/ 直接跳转登录) |
有(首页/文档/社区/案例) |
| 端口 | 3007 | 3006 |
| Token Header | Authorization: Bearer(租户 JWT) |
后台同 + 前台 Xy-User-Token |
| member 用户态 | 拦截器中无 member Store | 拦截器中注入 member Token |
| 部署路径 | VITE_BASE_URL = /tenant/ |
VITE_BASE_URL = / |
| 锁屏密钥 | s3cur3k3y4tenant |
独立密钥 |
组件与依赖复用
web-tenant 的 package.json 与 web 保持一致的依赖版本,公共组件(表格、表单、图标、布局等)代码相同,确保 UI 风格统一。
当主项目 web 中的公共组件更新时,只需同步对应文件到 web-tenant 即可。
路由体系
租户端是纯后台项目,不包含前台门户:
typescript
// routesAlias.ts
export const ADMIN_BASE_PATH = import.meta.env.VITE_ADMIN_PATH || '/admin'
// 实际值:/tenant
typescript
// staticRoutes.ts
{
path: '/',
redirect: `${ADMIN_BASE_PATH}/login` // → /tenant/login
}
动态路由的加载流程与主项目一致:登录后从 /tenant/menu/routes 获取菜单树,由 MenuProcessor 转换并注册。