9f6d26c650
账号唯一性是 (tenant_id, username),跨租户重名本身是合法行为(登录靠租户码区分);但默认值与 e2e 残留会让它变成默认状态:不带租户码登录会撞上 40012(该账号存在于多个单位),平台侧看账号也分不清哪个 admin 属于哪所学校。三处一起收口 —— 1) scripts/e2e-m0.py 跑完不再留租户:以前每跑一次就留下一个 e2e###### 租户 + 里面叫 admin 的管理员 + demo 下 3 个测试组织,库里那两个孤儿租户就是这么来的。现在按本次跑出的 id 自清(崩溃路径也兜住),不越界成 LIKE 'e2e%' 全清。 2) scripts/e2e-m1-tenant-domain.py 自己造、自己清「另一个租户里也有 admin」的夹具:它原本靠第 1 条的残留凑出 40012 这个前提,残留一被清掉就会静默反转成 8 条 FAIL。顺带修掉同族的第二处隐式依赖 —— 它假定 t14.localhost 是个真实租户,而那个租户早就不存在了。 3) PC 端「开通租户」的登录账号默认值不再写死 admin,改为跟随租户编码生成 admin_<编码>;运营一旦手改就不再被编码覆盖。 验证:全量 python scripts/verify-all.py --with-e2e 通过(37 脚本 / 1597 断言 / 0 失败),跑完库里仍只有 1 个租户、0 处跨租户重名;PC 端 pnpm typecheck 0 错、pnpm lint 干净、check-wiring 未接线 0 条,浏览器实演默认值跟随与手改不回退。
PC 管理端(frontend-pc)
深学在线 · 管理端。纯 Vue 3 + Naive UI(2026-10 从 Gi Admin Pro + Arco Design Vue 重搭)。
上一版这份 README 是 Gi Admin Pro 的模板原文(含它的演示账号
admin / 123456),已整体替换 —— 那个账号在本项目里不存在。
技术栈
| 项 | 值 |
|---|---|
| 框架 | Vue 3.5 + TypeScript + Vite 7 |
| UI | Naive UI 2.42(无 Arco / Gi 依赖) |
| 状态 | Pinia(pinia-plugin-persistedstate) |
| 请求 | axios(src/utils/http.ts 统一封装) |
| 样式 | SCSS(Stylelint 已移除,只有 ESLint) |
常用命令
pnpm install
pnpm dev # → http://localhost:5173(/api 代理到 http://localhost:8080)
pnpm build # 生产构建 → dist/
pnpm typecheck # vue-tsc(当前 0 错)
pnpm lint # ESLint(@antfu/eslint-config)
- 没有 Mock:
pnpm dev把/api代理到后端 8080 → 后端不起着就没有数据 - 路径别名:
@→src/
演示账号(本地 dev)
| 账号 | 密码 | 租户码 | 角色 |
|---|---|---|---|
admin |
Admin@123 |
demo |
学校管理员 |
platform |
Platform@123 |
— | 平台运营 |
账号在多个单位下重名时,登录页才会出现「租户码」输入框(服务端返回
40012)。 一键登录脚本:python scripts/dev-login.py。
目录
src/
├── apis/xt/ 接口模块(按业务域分文件)+ types.ts
├── composables/ pagination.ts(列表页分页器统一参数)
├── config/ xt-routes.ts(业务菜单表:菜单键 ↔ 路由 ↔ 视图 ↔ 分组)
├── icons/ AppIcon.vue + icon-data.ts(由 scripts/extract-pc-icons.py 生成)
├── layout/ AppSider / AppHeader / index.vue
├── router/ 本地菜单表按后端 menuKeys 过滤后注册
├── stores/ user.ts / acting-tenant.ts / app.ts
├── styles/ index.scss(只放跨页面样式)
├── utils/ http.ts / naive.ts / tag.ts / format.ts / auth.ts / rsa.ts
└── views/ 页面(每个菜单一个目录)
写代码前必读
AGENTS.md 与 .agents/(本目录内的规范,已按 Naive UI 重写)。四条最容易写错的:
- 没有 auto-import —— 组件与 API 全部显式
import; - 没有
v-hasPerm—— 权限判断写useUserStore().has('码'),字符串与后端PermissionDef逐字一致; n-tag的type必须过@/utils/tag.ts—— Arco 色词直接透传会静默变灰;- 图标集升级后重跑
scripts/extract-pc-icons.py—— 缺图标是空占位、不报错。