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
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,19 +1,19 @@
# <EFBFBD>唳旿摨𤘪沲<EFBFBD><EFBFBD><EFBFBD>?
# 数据库架构说明
> **<EFBFBD>𥕦遣<EFBFBD><EFBFBD>嚗?* 2025-11-06
> **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?* 瞉<><E79E89><EFBFBD>唳旿摨㯄<E691A8>蝵脫䲮撘誩<E69298><E8AAA9><EFBFBD>
> **创建日期:** 2025-11-06
> **文档目的:** 澄清数据库部署方式和架构
---
## 📋 核心澄清
### <EFBFBD>?<3F><EFBFBD><E586BD>芸楛<E88AB8><EFBFBD><E7A589><EFBFBD>ostgreSQL<EFBFBD>唳旿摨橒<EFBFBD>
### ✅ 您有自己独立的PostgreSQL数据库!
**<EFBFBD>喲睸鈭见<EFBFBD>嚗?*
1. <EFBFBD>?PostgreSQL<EFBFBD><EFBFBD><EFBFBD>Docker<EFBFBD>函蔡<EFBFBD><EFBFBD><EFBFBD>`docker-compose.yml`嚗?
2. <EFBFBD>?餈蹱糓<E8B9B1>券★<E588B8><EFBFBD><E6A183><EFBFBD><E7A589>唳旿摨橒<E691A8>銝齿糓Dify<EFBFBD>?
3. <EFBFBD>?Dify<EFBFBD>㕑䌊撌勗<EFBFBD><EFBFBD>函𡠺蝡讠<EFBFBD><EFBFBD>唳旿摨橒<EFBFBD><EFBFBD>dify/docker/`<EFBFBD><EFBFBD>銝页<EFBFBD>
4. <EFBFBD>?<3F><EFBFBD><E585B6><EFBFBD><EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD>ostgreSQL嚗㷉ocker隡朞䌊<EFBFBD><EFBFBD>撱?
**关键事实:**
1. PostgreSQL是通过Docker部署的(`docker-compose.yml`
2. ✅ 这是您项目的独立数据库,不是Dify
3. Dify有自己完全独立的数据库(在`dify/docker/`目录下)
4. ✅ 您不需要手动安装PostgreSQLDocker会自动创建
---
@@ -25,18 +25,18 @@
# 位置AIclinicalresearch/docker-compose.yml
services:
# PostgreSQL <EFBFBD>唳旿摨?
# PostgreSQL 数据库
postgres:
image: postgres:15-alpine # 使用官方PostgreSQL镜像
container_name: ai-clinical-postgres
environment:
POSTGRES_DB: ai_clinical_research # 数据库名
POSTGRES_USER: postgres # <EFBFBD><EFBFBD><EFBFBD>?
POSTGRES_USER: postgres # 用户名
POSTGRES_PASSWORD: postgres123 # 密码
ports:
- "5432:5432" # 端口映射
volumes:
- postgres_data:/var/lib/postgresql/data # <EFBFBD>唳旿<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- postgres_data:/var/lib/postgresql/data # 数据持久化
networks:
- ai-clinical-network
healthcheck:
@@ -58,14 +58,14 @@ services:
volumes:
postgres_data: # PostgreSQL数据卷数据持久化存储
redis_data: # Redis<EFBFBD>唳旿<EFBFBD>?
redis_data: # Redis数据卷
```
---
## 🚀 启动流程
### <EFBFBD><EFBFBD>桀鍳<EFBFBD><EFBFBD><EFBFBD>穿<EFBFBD><EFBFBD><EFBFBD>桀鍳<EFBFBD>?bat嚗?
### 一键启动脚本(一键启动.bat
```batch
[步骤2/7] 启动PostgreSQL和Redis容器
@@ -79,14 +79,14 @@ docker-compose up -d
5. 启动容器并在后台运行
```
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ostgreSQL嚗?*
- <EFBFBD>?Docker隡朞䌊<EFBFBD><EFBFBD>撱箏<EFBFBD>蝞∠<EFBFBD>
- <EFBFBD>?<3F>唳旿摮睃<E691AE><E79D83>求ocker<65>唳旿<E594B3>瑚葉嚗䔶<E59A97>隡帋腺憭?
- <EFBFBD>?<3F>臭誑<E887AD><EFBFBD>`localhost:5432`餈墧𦻖
**您不需要手动安装PostgreSQL**
- Docker会自动创建和管理
- ✅ 数据存储在Docker数据卷中不会丢失
- ✅ 可以通过`localhost:5432`连接
---
## <EFBFBD><EFBFBD>儭?<3F>唳旿摨栞<E691A8><E6A09E>乩縑<E4B9A9>?
## 🗄️ 数据库连接信息
### 连接配置
@@ -95,18 +95,18 @@ docker-compose up -d
postgresql://postgres:postgres123@localhost:5432/ai_clinical_research
```
**<EFBFBD><EFBFBD>圾嚗?*
- **<EFBFBD>讛悅嚗?* postgresql://
**拆解:**
- **协议:** postgresql://
- **用户名:** postgres
- **<EFBFBD><EFBFBD>嚗?* postgres123
- **銝餅㦤嚗?* localhost嚗㇄ocker<EFBFBD><EFBFBD><EFBFBD>唳𧋦<EFBFBD><EFBFBD>
- **蝡臬藁嚗?* 5432
- **<EFBFBD>唳旿摨枏<EFBFBD>嚗?* ai_clinical_research
- **密码:** postgres123
- **主机:** localhostDocker映射到本地)
- **端口:** 5432
- **数据库名:** ai_clinical_research
### <EFBFBD>𡒊垢<EFBFBD>滨蔭嚗Ê̄ackend/.env嚗?
### 后端配置backend/.env
```bash
# <EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>?
# 数据库连接
DATABASE_URL=postgresql://postgres:postgres123@localhost:5432/ai_clinical_research
# 这个连接的是您自己的PostgreSQL不是Dify的
@@ -118,85 +118,85 @@ DATABASE_URL=postgresql://postgres:postgres123@localhost:5432/ai_clinical_resear
### 系统对比
| 憿寧𤌍 | <20><EFBFBD><E587BD>唳旿摨?| Dify<66><79><EFBFBD><EFBFBD> |
| 项目 | 您的数据库 | Dify的数据库 |
|------|----------|-------------|
| **位置** | `AIclinicalresearch/docker-compose.yml` | `dify/docker/docker-compose.yml` |
| **摰孵膥<EFBFBD>?* | `ai-clinical-postgres` | `dify-db`<EFBFBD><EFBFBD>瘚页<EFBFBD> |
| **容器名** | `ai-clinical-postgres` | `dify-db`(猜测) |
| **端口** | `5432` | 可能是`5433`或不暴露 |
| **数据库名** | `ai_clinical_research` | `dify` |
| **<EFBFBD><EFBFBD>?* | 摮睃<E691AE><E79D83>券★<E588B8><EFBFBD>銝𡁜𦛚<F0A1819C>唳旿 | 摮睃<E691AE>Dify<66><79><EFBFBD>?|
| **用途** | 存储您项目的业务数据 | 存储Dify的数据 |
| **访问方式** | 直接Prisma访问 | 通过Dify API访问 |
### <EFBFBD><EFBFBD><EFBFBD>?
### 架构图
```
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>? AIclinicalresearch憿寧𤌍 <EFBFBD>?
<EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>? Backend <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? PostgreSQL <EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>? (Node.js) <EFBFBD>?SQL <EFBFBD>? (Docker) <EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>? <EFBFBD>? <20>? <EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>? Prisma <EFBFBD>? <EFBFBD>?Port: 5432 <EFBFBD>? <EFBFBD>?
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20><EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <EFBFBD>?
<EFBFBD>? <EFBFBD>? <EFBFBD>?
<EFBFBD>? <EFBFBD>?HTTP API <EFBFBD>?
<EFBFBD>? <EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>? Dify <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>> Dify<EFBFBD>芸楛<EFBFBD><EFBFBD>ostgreSQL <EFBFBD>?
<EFBFBD>? <20>? (Docker) <EFBFBD>? (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD>?
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <EFBFBD>?
<EFBFBD>? <EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
┌─────────────────────────────────────────────────────────┐
AIclinicalresearch项目
│ ┌──────────────┐ ┌──────────────┐
│ │ Backend │──────│ PostgreSQL
│ │ (Node.js) SQL (Docker)
│ │
│ │ Prisma Port: 5432
│ └──────────────┘ └──────────────┘
HTTP API
│ ┌──────────────┐
│ │ Dify │──────> Dify自己的PostgreSQL
│ │ (Docker) (完全独立)
│ └──────────────┘
└─────────────────────────────────────────────────────────┘
```
---
## 📊 当前数据库表结构
### <EFBFBD><EFBFBD>PostgreSQL銝剔<EFBFBD>銵?
### 您的PostgreSQL中的表
```sql
-- 来源backend/prisma/schema.prisma
-- 用户模块
users -- <EFBFBD><EFBFBD>銵?
users -- 用户表
-- 项目模块
projects -- 憿寧𤌍銵?
projects -- 项目表
-- AI问答模块
conversations -- 撖寡<EFBFBD>銵?
messages -- <EFBFBD><EFBFBD>銵?
general_conversations -- <EFBFBD>𡁶鍂撖寡<EFBFBD>銵?
general_messages -- <EFBFBD>𡁶鍂瘨<EFBFBD><EFBFBD>銵?
conversations -- 对话表
messages -- 消息表
general_conversations -- 通用对话表
general_messages -- 通用消息表
-- <20><EFBFBD>摨𤘪芋<F0A498AA>?
-- 知识库模块
knowledge_bases -- 知识库表
documents -- <EFBFBD><EFBFBD>﹝銵?
documents -- 文档表
-- <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD>Phase 3嚗?
-- 批处理模块(Phase 3
batch_tasks -- 批处理任务表
batch_results -- 批处理结果表
task_templates -- 隞餃𦛚璅⊥踎銵?
task_templates -- 任务模板表
-- 稿件审查模块
review_tasks -- 蝔蹂辣摰⊥䰻隞餃𦛚銵?
review_tasks -- 稿件审查任务表
-- 运营管理模块
admin_logs -- 管理员日志表
```
**<EFBFBD>餉恣嚗?6撘㰘”嚗<E2809D><E59A97><EFBFBD>典銁<E585B8>刻䌊撌梁<E6928C>PostgreSQL銝准<EFBFBD>?*
**总计16张表全部在您自己的PostgreSQL中。**
---
## 🔧 常用操作
### <EFBFBD><EFBFBD>Docker摰孵膥<EFBFBD><EFBFBD>?
### 查看Docker容器状态
```bash
# <20><EFBFBD><E4BAA6><EFBFBD><EFBFBD>匧捆<E58CA7>?
# 查看所有容器
docker ps
# 应该能看到:
@@ -211,15 +211,15 @@ docker ps
# 进入PostgreSQL容器
docker exec -it ai-clinical-postgres psql -U postgres -d ai_clinical_research
# <EFBFBD><EFBFBD><EFBFBD>臭誑<EFBFBD><EFBFBD>SQL嚗?
# 然后可以执行SQL
\dt # 查看所有表
\d users # <EFBFBD><EFBFBD>users銵函<EFBFBD><EFBFBD>?
\d users # 查看users表结构
SELECT * FROM users LIMIT 10;
```
**<EFBFBD><EFBFBD>2嚗帋蝙<EFBFBD>冽㺭<EFBFBD><EFBFBD><EFBFBD>蝡?*
**方法2使用数据库客户端**
- **DBeaver** / **pgAdmin** / **DataGrip** / **Navicat**
- 餈墧𦻖靽⊥<E99DBD>嚗?
- 连接信息:
- Host: `localhost`
- Port: `5432`
- Database: `ai_clinical_research`
@@ -239,7 +239,7 @@ docker-compose up -d
docker-compose restart postgres
```
### <EFBFBD><EFBFBD><EFBFBD>唳旿摨𤘪𠯫敹?
### 查看数据库日志
```bash
# 查看PostgreSQL日志
@@ -251,7 +251,7 @@ docker logs -f ai-clinical-postgres
---
## <EFBFBD>𠒣 <20>唳旿<E594B3><E697BF><EFBFBD><EFBFBD>?
## 💾 数据持久化
### 数据存储位置
@@ -260,22 +260,22 @@ docker logs -f ai-clinical-postgres
postgres_data:/var/lib/postgresql/data
```
**摰鮋<EFBFBD>摮睃<EFBFBD>雿滨蔭嚗?*
**实际存储位置:**
- Windows: `C:\ProgramData\Docker\volumes\aiclinicalresearch_postgres_data\_data`
- Mac/Linux: `/var/lib/docker/volumes/aiclinicalresearch_postgres_data/_data`
**<EFBFBD><EFBFBD>嚗?*
- <20>?<3F>喃蝙<E59683>𣳇膄摰孵膥嚗Ǒdocker-compose down`嚗㚁<EFBFBD><EFBFBD>唳旿銝滢<EFBFBD>
- <EFBFBD>?<3F>唳旿摮睃<E691AE><E79D83>求ocker<65>唳旿<E594B3>瑚葉嚗峕<E59A97><EFBFBD><E98A8B>靽嘥<E99DBD>
- <EFBFBD>𩤃<EFBFBD> <20><EFBFBD><E88AA3><EFBFBD>`docker-compose down -v`<EFBFBD><EFBFBD><EFBFBD>斗㺭<EFBFBD>桀㭘嚗㗇<EFBFBD>隡𡁏<EFBFBD>蝛箸㺭<EFBFBD>?
**重要:**
- ✅ 即使删除容器(`docker-compose down`),数据不会丢失
- ✅ 数据存储在Docker数据卷中持久化保存
- ⚠️ 只有执行`docker-compose down -v`(删除数据卷)才会清空数据
### <EFBFBD><EFBFBD>唳旿摨?
### 备份数据库
```bash
# <EFBFBD>遢嚗<EFBFBD><EFBFBD>搴QL嚗?
# 备份导出SQL
docker exec ai-clinical-postgres pg_dump -U postgres ai_clinical_research > backup.sql
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD>兄QL嚗?
# 恢复导入SQL
docker exec -i ai-clinical-postgres psql -U postgres ai_clinical_research < backup.sql
```
@@ -283,7 +283,7 @@ docker exec -i ai-clinical-postgres psql -U postgres ai_clinical_research < back
## 🎯 未来Schema隔离计划
### 敶枏<EFBFBD><EFBFBD><EFBFBD>?
### 当前状态
```sql
-- 所有表都在public schema
@@ -296,7 +296,7 @@ public.review_tasks
...
```
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𠄎chema<EFBFBD>𠉛氖嚗?
### 目标架构Schema隔离
```sql
-- 平台层Schema
@@ -311,7 +311,7 @@ aia_schema.projects
aia_schema.conversations
aia_schema.messages
CREATE SCHEMA pkb_schema; -- 銝芯犖<EFBFBD><EFBFBD>摨?
CREATE SCHEMA pkb_schema; -- 个人知识库
pkb_schema.knowledge_bases
pkb_schema.documents
@@ -325,15 +325,15 @@ review_schema.review_tasks
review_schema.review_journals
```
**摰墧鴌霈<EFBFBD>嚗?*
- **<EFBFBD>嗆挾銝<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?* <20><EFBFBD><E9A489>𠉛氖嚗䔶蝙<E494B6>刻”<E588BB><EFBFBD><EFBFBD>嚗Ǒaia_projects`, `asl_projects`嚗?
**实施计划:**
- **阶段一(立即):** 逻辑隔离,使用表名前缀(`aia_projects`, `asl_projects`
- **阶段二(微服务拆分时):** 物理隔离创建真正的Schema
---
## <EFBFBD><EFBFBD> Dify<EFBFBD>唳旿摨橒<EFBFBD><EFBFBD><EFBFBD>蝟餌<EFBFBD>嚗?
## 🔍 Dify数据库(独立系统)
### Dify<EFBFBD><EFBFBD><EFBFBD>蝵?
### Dify的部署
```
dify/docker/docker-compose.yml
@@ -345,17 +345,17 @@ dify/docker/docker-compose.yml
```
**关键点:**
- <EFBFBD>?Dify<EFBFBD>㕑䌊撌勗<EFBFBD><EFBFBD>函𡠺蝡讠<EFBFBD>docker-compose.yml
- <EFBFBD>?Dify<EFBFBD><EFBFBD>ostgreSQL<EFBFBD>舐𡠺蝡讠<EFBFBD>摰孵膥
- <EFBFBD>?<3F><EFBFBD>憿寧𤌍銝滨凒<E6BBA8>亥挪<E4BAA5>唏ify<66><79><EFBFBD><EFBFBD>
- <EFBFBD>?<3F><EFBFBD>Dify API嚗𠃍TTP REST嚗㕑<EFBFBD><EFBFBD>求ify<EFBFBD><EFBFBD>
- Dify有自己完全独立的docker-compose.yml
- Dify的PostgreSQL是独立的容器
- ✅ 您的项目不直接访问Dify的数据库
- ✅ 通过Dify APIHTTP REST调用Dify功能
### 您的项目如何使用Dify
```typescript
// 不是直接访问Dify数据库而是通过API
// <EFBFBD>𥕦遣<EFBFBD><EFBFBD>摨?
// 创建知识库
const response = await fetch('http://localhost/v1/datasets', {
method: 'POST',
headers: {
@@ -363,7 +363,7 @@ const response = await fetch('http://localhost/v1/datasets', {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '<EFBFBD>𤑳<EFBFBD><EFBFBD><EFBFBD>摨?
name: '我的知识库'
})
});
@@ -379,12 +379,12 @@ await fetch(`http://localhost/v1/datasets/${datasetId}/document/create-by-file`,
});
```
**<EFBFBD><EFBFBD><EFBFBD>唳旿摨㮖葉摮睃<EFBFBD>嚗?*
**您的数据库中存储:**
```sql
-- knowledge_bases銵?
-- knowledge_bases
{
id: 'uuid',
name: '<EFBFBD>𤑳<EFBFBD><EFBFBD><EFBFBD>摨?,
name: '我的知识库',
dify_dataset_id: 'xxx' -- 关联Dify的dataset_id
}
```
@@ -395,39 +395,39 @@ await fetch(`http://localhost/v1/datasets/${datasetId}/document/create-by-file`,
### 核心要点
1. <EFBFBD>?**<2A><EFBFBD><E586BD>芸楛<E88AB8><E6A59B>ostgreSQL<EFBFBD>唳旿摨?*
- <EFBFBD><EFBFBD>Docker<EFBFBD>函蔡嚗Ǒdocker-compose.yml`嚗?
1. **您有自己的PostgreSQL数据库**
- 通过Docker部署(`docker-compose.yml`
- 容器名:`ai-clinical-postgres`
- 数据库名:`ai_clinical_research`
2. <EFBFBD>?**<2A><EFBFBD><E585B6><EFBFBD><EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD>ostgreSQL**
- `docker-compose up -d`隡朞䌊<EFBFBD><EFBFBD>撱?
2. **您不需要手动安装PostgreSQL**
- `docker-compose up -d`会自动创建
- 数据持久化存储在Docker数据卷中
3. <EFBFBD>?**Dify<EFBFBD><EFBFBD><EFBFBD>函𡠺蝡讠<EFBFBD>蝟餌<EFBFBD>**
- <EFBFBD>㕑䌊撌梁<EFBFBD>PostgreSQL<EFBFBD>唳旿摨?
- <EFBFBD><EFBFBD><EFBFBD>Dify API霈輸䔮嚗䔶<EFBFBD><EFBFBD>湔𦻖霈輸䔮<EFBFBD>唳旿摨?
3. **Dify是完全独立的系统**
- 有自己的PostgreSQL数据库
- 您通过Dify API访问,不直接访问数据库
4. <EFBFBD>?**敶枏<E695B6>16撘㰘”<E3B098><EFBFBD><E588B8><EFBFBD><E586BD><EFBFBD>ostgreSQL銝?*
4. **当前16张表全部在您的PostgreSQL**
- 用户、项目、对话、知识库、文档、批处理、稿件审查等
- 全部在`public` schema未来需要隔离
### 銝箔<EFBFBD><EFBFBD><EFBFBD>銝滩扇敺堒<EFBFBD><EFBFBD>ostgreSQL嚗?
### 为什么您不记得安装PostgreSQL
**因为您根本没有手动安装!** 😊
- <EFBFBD>?Docker<EFBFBD>芸𢆡銝贝蝸<EFBFBD>𨅯<EFBFBD>
- <EFBFBD>?Docker<EFBFBD>芸𢆡<EFBFBD>𥕦遣摰孵膥
- <EFBFBD>?銝<><E98A9D>桀鍳<E6A180><EFBFBD><E588BB>祈䌊<E7A588>典鍳<E585B8>?
- <EFBFBD>?<3F>典蘨<E585B8><E898A8><EFBFBD><E996AC>銵䈣銝<E488A3><E98A9D>桀鍳<E6A180>?bat`
- Docker自动下载镜像
- Docker自动创建容器
- ✅ 一键启动脚本自动启动
- ✅ 您只需要运行`一键启动.bat`
**这就是Docker的魔力**
---
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>甇乩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>捆嚗?*
1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憭齿㺭<EFBFBD><EFBFBD>嚗?
2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>訕chema<EFBFBD>𠉛氖<EFBFBD><EFBFBD>嚗?
**需要进一步了解的内容:**
1. 如何备份和恢复数据库?
2. 如何迁移到Schema隔离架构
3. 如何连接数据库进行手动查询?
4. Prisma如何管理数据库迁移