多端前端后台管理
工程结构
后台前端是标准的 Vue 3 + Vite 工程,外加一个平台特有的 plugins/appmarket/ 和 app-market-dist/。读这一页的目标是:知道新页面、新接口、新远程应用分别该放哪。
目录
plus-ui/
├── index.html ★ import map(裸模块 → /app-runtime/*.js)
├── vite.config.ts 端口、/dev-api 代理、插件
├── .env.development 开发环境变量
├── app-market-dist/ ★ 远程应用产物(构建期复制进 dist)
│ ├── remote-apps/<appCode>/ index.js / index.css
│ └── app-runtime/ vue.js、element-plus.js、dromara-*.js
├── scripts/
│ ├── gen-runtime-shims.mjs 生成运行时垫片
│ ├── check-runtime-shims.mjs 校验垫片
│ ├── check-remote-apps.mjs 校验远程应用产物
│ └── check-remote-globals.mjs 校验 AutoImport 清单
└── src/
├── api/ 接口函数,按业务域分文件
├── assets/ 静态资源
├── components/ 通用组件
├── layout/ 顶栏 / 侧边栏 / 标签页
├── plugins/
│ ├── appmarket/ ★ 远程应用宿主(loader / runtime / bootstrap)
│ └── ... 全局插件
├── router/ 静态路由 + 动态菜单路由
├── store/ Pinia(用户、权限、应用、设置)
├── utils/ request / auth / 加密 / 下载
└── views/ 页面
├── appstore/ 应用市场、我的应用、应用上架
├── dashboard/ 工作台
├── system/ 系统管理
├── monitor/ 系统监控
├── workflow/ 工作流
└── ...请求链路
页面组件
→ src/api/xxx.ts
→ src/utils/request.ts(axios 实例)
→ /dev-api/...(开发)或 /prod-api/...(生产)
→ Vite / Nginx 代理
→ 后端 8086- 开发:
vite.config.ts把VITE_APP_BASE_API(默认/dev-api)代理到http://127.0.0.1:8086,并去掉前缀。 - 生产:由 Nginx 把
/prod-api转发到后端;前端代码里不写死后端域名。 - 加密:
VITE_APP_ENCRYPT打开时,请求与响应走 RSA;必须和后端同时开/关。
新增一个页面
- 在
src/views/<业务>/下新建.vue; - 在
src/api/下补接口函数; - 菜单由后端
sys_menu下发,component填页面路径(宿主页面)或remote:<appCode>/<viewKey>(远程应用页面); - 权限按钮由后端菜单的
perms控制,页面里用v-hasPermi/hasPermi判断。
远程应用页面不是文件路径
菜单里写 remote:exam/exam/settings 时,exam/exam/settings 只是视图键,不是 src/views 下的路径。真实代码在应用仓库的 frontend/exam-app/src/views/ 里,由运行时 import() 加载。
新增一个远程应用(宿主侧)
宿主侧通常不需要改代码,只要产物到位:
- 应用打包时把前端产物放到
app-market-dist/remote-apps/<appCode>/; - 后端返回的
GET /app/runtime/remote-apps里带上{ appCode, entry }; - 菜单的
component使用remote:<appCode>/<viewKey>; - 刷新页面,
loader.ts会注册视图与路由。
如果产物是本地开发目录,可以用 WUJIES_FRONTEND_DIST 指过去,避免手工复制:
$env:WUJIES_FRONTEND_DIST = '<宿主根>\app-market-dist\remote-apps'哪些文件不要动
| 文件 | 原因 |
|---|---|
index.html 的 import map | 与运行时垫片、gen-runtime-shims.mjs 三方一致,改错会双 Vue |
app-market-dist/app-runtime/*.js | 生成物;改源文件后重跑 gen:runtime |
src/plugins/appmarket/loader.ts 的加载契约 | 影响所有远程应用,改前先读 远程应用接入 |
check-* 脚本 | 它们是硬约定的守门人,不要为了让检查通过而放宽 |