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
11 KiB
11 KiB
数据库架构说明
创建日期: 2025-11-06
文档目的: 澄清数据库部署方式和架构
📋 核心澄清
✅ 您有自己独立的PostgreSQL数据库!
关键事实:
- ✅ PostgreSQL是通过Docker部署的(
docker-compose.yml) - ✅ 这是您项目的独立数据库,不是Dify的
- ✅ Dify有自己完全独立的数据库(在
dify/docker/目录下) - ✅ 您不需要手动安装PostgreSQL,Docker会自动创建
🐳 Docker部署详情
docker-compose.yml配置
# 位置:AIclinicalresearch/docker-compose.yml
services:
# PostgreSQL 数据库
postgres:
image: postgres:15-alpine # 使用官方PostgreSQL镜像
container_name: ai-clinical-postgres
environment:
POSTGRES_DB: ai_clinical_research # 数据库名
POSTGRES_USER: postgres # 用户名
POSTGRES_PASSWORD: postgres123 # 密码
ports:
- "5432:5432" # 端口映射
volumes:
- postgres_data:/var/lib/postgresql/data # 数据持久化
networks:
- ai-clinical-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
# Redis 缓存
redis:
image: redis:7-alpine
container_name: ai-clinical-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- ai-clinical-network
volumes:
postgres_data: # PostgreSQL数据卷(数据持久化存储)
redis_data: # Redis数据卷
🚀 启动流程
一键启动脚本(一键启动.bat)
[步骤2/7] 启动PostgreSQL和Redis容器
docker-compose up -d
这个命令会:
1. 自动下载PostgreSQL 15镜像(如果本地没有)
2. 创建PostgreSQL容器
3. 创建Redis容器
4. 创建数据卷(postgres_data)用于持久化存储
5. 启动容器并在后台运行
您不需要手动安装PostgreSQL!
- ✅ Docker会自动创建和管理
- ✅ 数据存储在Docker数据卷中,不会丢失
- ✅ 可以通过
localhost:5432连接
🗄️ 数据库连接信息
连接配置
数据库连接字符串(DATABASE_URL):
postgresql://postgres:postgres123@localhost:5432/ai_clinical_research
拆解:
- 协议: postgresql://
- 用户名: postgres
- 密码: postgres123
- 主机: localhost(Docker映射到本地)
- 端口: 5432
- 数据库名: ai_clinical_research
后端配置(backend/.env)
# 数据库连接
DATABASE_URL=postgresql://postgres:postgres123@localhost:5432/ai_clinical_research
# 这个连接的是您自己的PostgreSQL,不是Dify的!
🔍 两个独立的数据库系统
系统对比
| 项目 | 您的数据库 | Dify的数据库 |
|---|---|---|
| 位置 | AIclinicalresearch/docker-compose.yml |
dify/docker/docker-compose.yml |
| 容器名 | ai-clinical-postgres |
dify-db(猜测) |
| 端口 | 5432 |
可能是5433或不暴露 |
| 数据库名 | ai_clinical_research |
dify |
| 用途 | 存储您项目的业务数据 | 存储Dify的数据 |
| 访问方式 | 直接Prisma访问 | 通过Dify API访问 |
架构图
┌─────────────────────────────────────────────────────────┐
│ AIclinicalresearch项目 │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Backend │──────│ PostgreSQL │ │
│ │ (Node.js) │ SQL │ (Docker) │ │
│ │ │ │ │ │
│ │ Prisma │ │ Port: 5432 │ │
│ └──────────────┘ └──────────────┘ │
│ │ │
│ │ HTTP API │
│ ↓ │
│ ┌──────────────┐ │
│ │ Dify │──────> Dify自己的PostgreSQL │
│ │ (Docker) │ (完全独立) │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
📊 当前数据库表结构
您的PostgreSQL中的表
-- 来源:backend/prisma/schema.prisma
-- 用户模块
users -- 用户表
-- 项目模块
projects -- 项目表
-- AI问答模块
conversations -- 对话表
messages -- 消息表
general_conversations -- 通用对话表
general_messages -- 通用消息表
-- 知识库模块
knowledge_bases -- 知识库表
documents -- 文档表
-- 批处理模块(Phase 3)
batch_tasks -- 批处理任务表
batch_results -- 批处理结果表
task_templates -- 任务模板表
-- 稿件审查模块
review_tasks -- 稿件审查任务表
-- 运营管理模块
admin_logs -- 管理员日志表
总计:16张表,全部在您自己的PostgreSQL中。
🔧 常用操作
查看Docker容器状态
# 查看所有容器
docker ps
# 应该能看到:
# ai-clinical-postgres (PostgreSQL)
# ai-clinical-redis (Redis)
连接到PostgreSQL
方法1:使用Docker命令
# 进入PostgreSQL容器
docker exec -it ai-clinical-postgres psql -U postgres -d ai_clinical_research
# 然后可以执行SQL:
\dt # 查看所有表
\d users # 查看users表结构
SELECT * FROM users LIMIT 10;
方法2:使用数据库客户端
- DBeaver / pgAdmin / DataGrip / Navicat
- 连接信息:
- Host:
localhost - Port:
5432 - Database:
ai_clinical_research - User:
postgres - Password:
postgres123
- Host:
停止和启动数据库
# 停止(但不删除数据)
docker-compose down
# 启动
docker-compose up -d
# 重启
docker-compose restart postgres
查看数据库日志
# 查看PostgreSQL日志
docker logs ai-clinical-postgres
# 实时查看日志
docker logs -f ai-clinical-postgres
💾 数据持久化
数据存储位置
数据卷(Volume):
postgres_data:/var/lib/postgresql/data
实际存储位置:
- Windows:
C:\ProgramData\Docker\volumes\aiclinicalresearch_postgres_data\_data - Mac/Linux:
/var/lib/docker/volumes/aiclinicalresearch_postgres_data/_data
重要:
- ✅ 即使删除容器(
docker-compose down),数据不会丢失 - ✅ 数据存储在Docker数据卷中,持久化保存
- ⚠️ 只有执行
docker-compose down -v(删除数据卷)才会清空数据
备份数据库
# 备份(导出SQL)
docker exec ai-clinical-postgres pg_dump -U postgres ai_clinical_research > backup.sql
# 恢复(导入SQL)
docker exec -i ai-clinical-postgres psql -U postgres ai_clinical_research < backup.sql
🎯 未来:Schema隔离计划
当前状态
-- 所有表都在public schema
public.users
public.projects
public.conversations
public.knowledge_bases
public.documents
public.review_tasks
...
目标架构(Schema隔离)
-- 平台层Schema
CREATE SCHEMA platform_schema;
platform_schema.users
platform_schema.roles
platform_schema.permissions
-- 业务模块Schema
CREATE SCHEMA aia_schema; -- AI智能问答
aia_schema.projects
aia_schema.conversations
aia_schema.messages
CREATE SCHEMA pkb_schema; -- 个人知识库
pkb_schema.knowledge_bases
pkb_schema.documents
CREATE SCHEMA asl_schema; -- AI智能文献
asl_schema.projects
asl_schema.literature_items
asl_schema.screening_results
CREATE SCHEMA review_schema; -- 稿件审查
review_schema.review_tasks
review_schema.review_journals
实施计划:
- 阶段一(立即): 逻辑隔离,使用表名前缀(
aia_projects,asl_projects) - 阶段二(微服务拆分时): 物理隔离,创建真正的Schema
🔍 Dify数据库(独立系统)
Dify的部署
dify/docker/docker-compose.yml
├── dify-db (PostgreSQL)
├── dify-redis
├── dify-web
├── dify-api
└── ...
关键点:
- ✅ Dify有自己完全独立的docker-compose.yml
- ✅ Dify的PostgreSQL是独立的容器
- ✅ 您的项目不直接访问Dify的数据库
- ✅ 通过Dify API(HTTP REST)调用Dify功能
您的项目如何使用Dify
// 不是直接访问Dify数据库,而是通过API
// 创建知识库
const response = await fetch('http://localhost/v1/datasets', {
method: 'POST',
headers: {
'Authorization': `Bearer ${DIFY_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '我的知识库'
})
});
// 上传文档
const formData = new FormData();
formData.append('file', file);
await fetch(`http://localhost/v1/datasets/${datasetId}/document/create-by-file`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${DIFY_API_KEY}`
},
body: formData
});
您的数据库中存储:
-- knowledge_bases表
{
id: 'uuid',
name: '我的知识库',
dify_dataset_id: 'xxx' -- 关联Dify的dataset_id
}
🎯 总结
核心要点
-
✅ 您有自己的PostgreSQL数据库
- 通过Docker部署(
docker-compose.yml) - 容器名:
ai-clinical-postgres - 数据库名:
ai_clinical_research
- 通过Docker部署(
-
✅ 您不需要手动安装PostgreSQL
docker-compose up -d会自动创建- 数据持久化存储在Docker数据卷中
-
✅ Dify是完全独立的系统
- 有自己的PostgreSQL数据库
- 您通过Dify API访问,不直接访问数据库
-
✅ 当前16张表全部在您的PostgreSQL中
- 用户、项目、对话、知识库、文档、批处理、稿件审查等
- 全部在
publicschema(未来需要隔离)
为什么您不记得安装PostgreSQL?
因为您根本没有手动安装! 😊
- ✅ Docker自动下载镜像
- ✅ Docker自动创建容器
- ✅ 一键启动脚本自动启动
- ✅ 您只需要运行
一键启动.bat
这就是Docker的魔力!
需要进一步了解的内容:
- 如何备份和恢复数据库?
- 如何迁移到Schema隔离架构?
- 如何连接数据库进行手动查询?
- Prisma如何管理数据库迁移?