Files
AIclinicalresearch/docs/03-业务模块/ADMIN-运营管理端/01-需求分析/02-通用能力层_07-运营与机构管理端PRD_v2.1.md
HaHafeng 66255368b7 feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
2026-01-16 13:42:10 +08:00

8.5 KiB
Raw Blame History

壹证循AI平台 - 运营与机构管理端 PRD

文档版本: v2.1
状态: 待开发 (Ready for Dev)
优先级: P0
架构模式: 模块化单体 (Modular Monolith)
更新摘要: 新增“品牌定制”需求;定义专属登录页 URL 规范;细化租户配置字段。

1. 业务背景与需求分析 (Context & Requirements)

1.1 为什么要做管理端?(Why)

目前的系统User App是一个强大的单兵作战工具但要转化为可规模化销售的 SaaS 商业产品,我们面临“管理真空”:

  1. 无法交付 B 端:医院买了系统,科主任无法把账号分给医生,药企买了系统,无法监控项目进度。
  2. AI 成本黑洞:缺乏全局视角的 Token 消耗监控,单次大规模任务可能导致亏损。
  3. 研发效能瓶颈:每次调整 Prompt提示词都需要改代码、发版无法快速响应临床专家对 AI 效果的反馈。

1.2 差异化需求画像 (Who needs what)

A. 运营管理端 (Ops) - "上帝视角"

  • 痛点:不知道谁在用,不知道花了多少钱,不敢随便发新版。
  • 核心诉求
    • 开户:给医院/药企开通租户,配置模块(卖什么给谁)。
    • 调优:在不打扰用户的情况下,调试 AI Prompt。
    • 风控:监控 Token 消耗,异常熔断。

B. 医院机构端 (Hospital Admin) - "管人与管钱"

  • 痛点:医生流动性大,科研经费分配难。
  • 核心诉求
    • 品牌归属感:登录页必须是医院自己的大楼照片和 Logo体现“本院科研平台”的专属感。
    • 层级管理:按“科室”管理医生(如心内科、肿瘤科)。
    • 配额分配:将购买的总 Token 额度分配给不同科室或个人。

C. 药企机构端 (Pharma Admin) - "管项目与合规"

  • 痛点IIT 项目分散在多家医院,数据进度不透明,合规风险大。
  • 核心诉求
    • 品牌定制:药企 Logo 必须时刻可见,符合企业 VI 规范。
    • 项目视图:不是管人,而是管“项目”(如某抗癌药临床研究)。
    • 审计合规所有操作必须有痕迹Audit Log

2. 核心架构决策 (Architecture)

  1. 模块化单体:继续沿用 /frontend-v2 单一代码库。通过路由懒加载区分不同端。
  2. 数据隔离逻辑隔离tenant_id
  3. 生产环境灰度:支持管理员/调试者在生产环境使用 Draft 版 Prompt。
  4. 动态品牌渲染:前端根据 URL 路径或租户 ID动态加载 CSS 变量和图片资源,实现“千人千面”的 UI。

3. 角色与权限体系 (RBAC v2)

设计原则基于租户类型Tenant Type动态衍生角色。

角色 Code 归属 权限范围 URL 前缀 核心职责
SUPER_ADMIN 平台 全局数据 /admin 租户开通、品牌配置、Prompt 调优
HOSPITAL_ADMIN 医院租户 本院数据 /org/hospital 科室管理、配额分配
PHARMA_ADMIN 药企租户 本企项目 /org/pharma 项目监控、CRO 管理、审计
USER 任意租户 个人/被授权数据 /app 科研业务操作

4. 品牌定制与专属登录设计 (Tenant Branding) [v2.1 新增]

4.1 URL 策略 (URL Strategy)

为了低成本实现专属登录页,采用 路径前缀 方案,而非子域名方案。

4.2 租户配置字段 (Tenant Config)

在 platform_schema.tenants 表的 config JSONB 字段中扩展以下属性:

{
"branding": {
"logoUrl": "https://oss.../jst_logo.png", // 机构 Logo (透明背景)
"loginBackgroundUrl": "https://oss.../jst_bldg.jpg", // 登录页背景大图
"primaryColor": "#0056b3", // 品牌主色调 (积水潭蓝)
"welcomeTitle": "北京积水潭医院 AI 临床科研平台", // 登录页大标题
"welcomeSubTitle": "智能化 · 规范化 · 高效率" // 登录页副标题
}
}

4.3 交互流程 (User Flow)

  1. 访问:用户点击医院内网链接 /t/jst-hospital/login。
  2. 加载配置:前端解析 URL 中的 jst-hospital调用公开 API /api/public/tenant-config?code=jst-hospital。
  3. 渲染
    • 替换默认背景图为 loginBackgroundUrl。
    • 替换 "壹证循 AI" 标题为 "北京积水潭医院..."。
    • 替换登录框上方的 Logo。
  4. 登录:用户输入账号密码。
  5. 进入系统
    • 跳转至 /app/dashboard。
    • 关键点:顶部导航栏 (Global Header) 左上角显示 医院 Logo,而非平台 Logo。
    • Ant Design 主题色自动切换为医院品牌色。

5. 运营管理端功能详解 (Super Admin)

路由: /admin/*

5.1 租户与商业化配置 (Provisioning) [更新]

  • 租户开通
    • 基础信息:名称、租户代码 (Code用于 URL)。
    • 类型选择HOSPITAL | PHARMA | JOURNAL。
    • 品牌配置 (新增):上传 Logo、背景图设置 Slogan。
    • 模块订阅:勾选 ASL, DC, IIT 等。
  • 配置预览:在后台可以预览该租户的登录页效果。

5.2 Prompt 工程化平台 (Prompt Ops)

  • 编辑器Markdown + 变量高亮。
  • 生产预览开关:开启后,管理员在 /app 端操作时自动加载 Draft 版。

5.3 成本监控 (Cost)

  • Token 水位:今日消耗 vs 预算。

6. 机构管理端:医院版 (Hospital Admin)

路由: /org/hospital/*

6.1 科室与成员管理

  • 科室树:建立医院组织架构。
  • 成员管理:批量导入医生,关联科室。

6.2 经费与配额

  • 配额下发:将总 Token 额度分配给科室。

7. 机构管理端:药企版 (Pharma Admin)

路由: /org/pharma/*

7.1 项目管理中心

  • 项目列表:查看本药企发起的所有 IIT/IST 项目。
  • 进度监控:接入 IIT Manager Agent 数据。

7.2 合规与审计

  • 操作审计:查看数据修改痕迹。

8. 统一登录与路由分发 (Unified Entry)

8.1 智能路由策略

用户登录成功后,前端根据 user.role 和 tenant.type 进行跳转:

function getRedirectPath(user, tenant) {
if (user.role === 'SUPER_ADMIN') return '/admin/dashboard';

if (user.role === 'TENANT_ADMIN') {
if (tenant.type === 'HOSPITAL') return '/org/hospital/dashboard';
if (tenant.type === 'PHARMA') return '/org/pharma/dashboard';
}

if (tenant.type === 'JOURNAL') return '/app/rvw/dashboard';

return '/app/dashboard';
}

9. 技术实现规格 (Technical Specs)

9.1 数据库 Schema 变更

-- platform_schema.tenants
ALTER TABLE tenants
ADD COLUMN code VARCHAR(50) UNIQUE, -- 租户代码 (如 jst-hospital)
ADD COLUMN type VARCHAR(20) NOT NULL DEFAULT 'HOSPITAL',
ADD COLUMN config JSONB DEFAULT '{}';
-- config 包含 branding: { logoUrl, loginBackgroundUrl, ... }

-- platform_schema.users
ALTER TABLE users
ADD COLUMN department VARCHAR(100);

9.2 API 接口新增

  • GET /api/public/tenant-config?code={code}
    • 权限:无需登录 (Public)。
    • 功能:根据租户代码返回品牌配置信息(脱敏,只返回 UI 相关的)。

9.3 前端目录结构

src/modules/
├── auth/
│ ├── LoginPage.tsx # 通用登录页
│ ├── TenantLoginPage.tsx # 动态渲染的专属登录页 (路由 /t/:code/login)
├── admin/ # 运营管理端
├── org/ # 机构管理端
└── ...

10. 实施路线图 (Roadmap v2.1)

  • P0 (Week 1):
    • DB Schema 变更(增加 Tenant Code, Config
    • 实现 /api/public/tenant-config 接口。
    • 开发 TenantLoginPage 组件,实现动态换肤。
  • P1 (Week 2):
    • 运营端增加“品牌配置”表单(上传图片到 OSS
    • 实现全局 Header 根据当前用户 Tenant 自动切换 Logo。
  • P2 (Week 3):
    • 实现 /org/hospital 基础版。