Commit 6a87f73b authored by uuo00_n's avatar uuo00_n

docs: 更新项目文档结构和内容

- 重构 ACCOUNTS.md 文件,补充初始化脚本来源和详细账号信息
- 删除过时的 ARCHITECTURE_REDESIGN.md 文件
- 优化 DEVELOPMENT.md 文件结构,简化启动说明
- 重写 README.md,完善模块说明和架构细节
- 更新技术白皮书内容,调整架构描述和数据存储策略
parent 15c33bcb
# 默认初始化账号清单
以下账号已在数据库中初始化完成,可直接用于测试。所有账号的默认密码均为:**`password123`**
以下账号会在初始化脚本执行后写入 PostgreSQL,可直接用于测试。所有账号的默认密码均为:**`password123`**
初始化来源:
- 用户账号:`scripts/init_postgres.sql`
- 教务演示数据(班级/人员/绑定/课表/考勤/操行/通知):`scripts/init_edu_postgres.py`
- LLM 侧演示数据(敏感词等):`scripts/init_mongo.py`
## 🎓 教育版 (Edu Edition)
......@@ -10,17 +15,17 @@
| 角色 | 账号 | 角色等级 | 姓名 | 班级 | 说明 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **学生** | `student_101` | 1 (User) | 张一 | 高一(1)班 | 理科创新班 |
| **学生** | `student_102` | 1 (User) | 李二 | 高一(2)班 | 理科普通班 |
| **学生** | `student_103` | 1 (User) | 王三 | 高一(3)班 | 文科普通班 |
| **学生** | `student_101` | 1 (User) | 张一 | 软件2301班 | 绑定学号:S20230101 |
| **学生** | `student_102` | 1 (User) | 李二 | 软件2302班 | 绑定学号:S20230102 |
| **学生** | `student_103` | 1 (User) | 王三 | 网络2301班 | 绑定学号:S20230103 |
### 教师账号 (Teachers)
| 角色 | 账号 | 角色等级 | 姓名 | 职务 | 说明 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **班主任** | `teacher_101` | 2 (Manager) | 赵老师 | 班主任 | 负责高一(1)班 |
| **班主任** | `teacher_102` | 2 (Manager) | 钱老师 | 班主任 | 负责高一(2)班 |
| **班主任** | `teacher_103` | 2 (Manager) | 孙老师 | 班主任 | 负责高一(3)班 |
| **班主任** | `teacher_101` | 2 (Manager) | 赵老师 | 班主任 | 软件2301班 |
| **班主任** | `teacher_102` | 2 (Manager) | 钱老师 | 班主任 | 软件2302班 |
| **班主任** | `teacher_103` | 2 (Manager) | 孙老师 | 班主任 | 网络2301班 |
### 管理层账号 (Administration)
......@@ -44,14 +49,17 @@
系统初始化了以下核心业务数据:
- **班级**: 3个高一年级班级 (1班、2班、3班),包含不同的文理科方向
- **班级**: 3 个班级(软件2301、软件2302、网络2301)
- **人员**: 覆盖了学生、班主任、教务主任、年级组长、校长等多种角色。
- **课表**: 为每个班级生成了一周的完整课表,包含主科(语数英)和副科,且配置了对应的授课老师
- **考勤与操行**: 生成了当天的考勤记录和操行评分示例
- **通知公告**: 生成了校级、年级级、部门级的多层级通知数据
- **课表**: 为每个班级生成工作日课表(示例课程包含 Java/前端/网络等)
- **考勤与操行**: 生成当天考勤与操行示例数据
- **通知公告**: 生成校园/部门/年级等层级的通知示例
## ⚠️ 注意事项
1. **密码安全**: 上述密码仅用于开发测试环境,**切勿在生产环境使用**
2. **数据重置**: 运行 `scripts/init_mongo.py` 会清空 MongoDB 中的相关集合,请谨慎操作。
3. **ID 关联**: MongoDB 中的 `account_id` 字段严格对应 PostgreSQL 中生成的自增 ID。若重新初始化数据库,请确保两边脚本配套执行。
2. **数据重置**:
- `scripts/init_postgres.sql` 会清空并重建(TRUNCATE)PostgreSQL 中的核心表,且会重置自增 ID。
- `scripts/init_edu_postgres.py` 会清理并重新写入教务演示数据(依赖 `init_postgres.sql` 生成的用户 ID)。
- `scripts/init_mongo.py` 会清空 MongoDB 中 LLM 相关集合并写入演示敏感词。
3. **跨服务用户标识**: JWT 的 `sub` 字段对应 PostgreSQL `users.id`,LLM 服务在 MongoDB 中的对话/审计数据使用该用户 ID 作为关联键。
# 微服务架构重构方案
## 1. 现状分析
当前项目是一个基于 Python FastAPI 的单体应用,主要包含以下业务领域:
- **认证与用户管理**:用户注册、登录、角色权限。
- **教育教务管理**:学生、教师、班级、课表、人员档案、绑定关系。
- **LLM 对话与过滤**:对话管理、敏感词过滤、对接 Ollama。
- **数据统计**:仪表盘。
**痛点(为什么感觉乱):**
1. **控制层与数据层耦合**:API 路由函数中直接包含大量 MongoDB 查询逻辑(如 `app/api/v1/auth.py`),缺乏独立的 Service 层封装。
2. **业务边界模糊**`bindings`(绑定关系)逻辑穿插在 Auth 和各个实体模块中。
3. **单体膨胀风险**:教务逻辑(复杂的实体关系)与 AI 逻辑(无状态、流式、计算密集)混在一起,扩展性受限。
## 2. 拆分建议
建议将项目拆分为三个独立微服务,根据业务特性选择最适合的语言:
### 服务 A: 身份认证中心 (Identity Service)
- **职责**:用户注册、登录、JWT 签发与验证、权限管理 (RBAC)、绑定关系管理。
- **建议语言****Go** (Golang)
- **数据库****PostgreSQL**
- **理由**:用户账户、角色权限是典型的结构化数据,关系型数据库能提供更好的事务支持和数据一致性保障。
- **接管路由**`/auth`, `/admin` (部分用户管理), `/bindings`
### 服务 B: 教务核心服务 (Edu Core Service)
- **职责**:学生、教师、班级、课表、人员档案的 CRUD 与业务逻辑。
- **建议语言****Java (Spring Boot)**
- **数据库****PostgreSQL**
- **理由**:教务数据之间存在复杂的关联关系(如班级-学生、课程-教师),使用外键约束能有效维护数据完整性。Spring Data JPA 提供了强大的 ORM 支持。
- **接管路由**`/students`, `/teachers`, `/classes`, `/schedules`, `/persons`
### 服务 C: LLM 智能服务 (LLM Filter Service)
- **职责**:LLM 对话管理、敏感词过滤算法、Ollama 接口对接。
- **建议语言****Python** (保持现状)
- **数据库****PostgreSQL (JSONB)****MongoDB**
- **理由**:对话记录虽然是非结构化的,但 PostgreSQL 的 JSONB 性能非常强劲,且便于与用户表做关联查询。为了简化运维,推荐全栈统一使用 PostgreSQL。
- **接管路由**`/conversations`, `/admin` (敏感词管理)
### 服务 D: 聚合层 / 网关 (API Gateway / BFF)
- **职责**:统一入口,路由转发,或者聚合 Dashboard 数据。
- **实现**:Nginx, Kong, 或一个轻量级的 Node.js/Go 服务。
## 3. 架构图示
```mermaid
graph TD
Client[前端应用] --> Gateway[API 网关]
Gateway -->|/auth, /bindings| AuthSvc[身份认证服务 (Go)]
Gateway -->|/students, /classes| EduSvc[教务核心服务 (Go/Java)]
Gateway -->|/conversations| LLMSvc[LLM 智能服务 (Python)]
AuthSvc --> DB_PG[(PostgreSQL: AuthDB)]
EduSvc --> DB_PG[(PostgreSQL: EduDB)]
LLMSvc --> DB_PG[(PostgreSQL: LLMDB)]
LLMSvc --> Ollama[Ollama LLM]
```
## 4. 迁移路线 (Strangler Fig Pattern)
1. **第一步:提取公共依赖**
- 确定服务间通信协议(推荐 RESTful HTTP 或 gRPC)。
- 统一数据库设计(目前是共享 Mongo,微服务建议分库或分 Collection)。
2. **第二步:剥离身份认证 (Auth Service)**
- 优先用 Go 重写 `/auth` 模块。
- 网关将 `/auth` 流量转发至新服务。
- Python 单体保留 JWT 验证逻辑(作为中间件),信任 Go 服务签发的 Token。
3. **第三步:剥离教务业务**
-`/students` 等模块迁移至新服务。
4. **第四步:瘦身 Python 服务**
- 最后 Python 服务仅保留 LLM 相关核心业务,成为纯粹的 AI 服务。
## 5. 示例:用 Go 重构 Auth 服务
我们可以先尝试用 Go 重写 `register``login` 接口,展示微服务的结构。
# 🚀 LLM Filter 项目开发与启动指南
# LLM Filter 项目启动与开发指南
本文档旨在帮助开发人员快速搭建环境、启动服务并参与开发。本项目采用微服务架构,包含 Auth (Go), Edu (Java), LLM (Python) 三大核心服务
本文档旨在帮助开发人员快速搭建环境、启动服务并参与开发。本项目采用微服务架构,包含 Gateway (Nginx), Auth (Go), Edu (Java), LLM (Python) 四个服务组件
---
## 🏗️ 架构概览
| 服务名称 | 端口 | 技术栈 | 职责 | 目录 |
| :--- | :--- | :--- | :--- | :--- |
| **Auth Service** | **8081** | Go (Gin) | 用户认证、JWT、绑定管理 | `microservices/auth-service` |
| **Edu Service** | **8082** | Java (Spring Boot) | 学生、教师、课表、教务数据 | `microservices/edu-service` |
| **LLM Service** | **8000** | Python (FastAPI) | AI 对话、RAG、敏感词过滤 | `microservices/llm-service` |
| **Postgres** | 5433 | PostgreSQL 15 | 存储 Auth 和 Edu 数据 | (Docker) |
| **Mongo** | 27017 | MongoDB | 存储对话历史、敏感词库 | (Docker) |
---
## ⚡ 快速启动 (Docker 模式)
这是最简单的启动方式,适合预览或部署。
## 快速启动(Docker)
### 前置要求
- Docker & Docker Compose
- 根目录下已配置 `.env` 文件
- 可选:根目录 `.env`(建议生产/团队环境使用,避免把密钥写进配置文件)
### 启动命令
在项目根目录执行:
......@@ -36,13 +22,20 @@ docker-compose logs -f
```
### 访问服务
- **Swagger 文档 (LLM)**: [http://localhost:8000/docs](http://localhost:8000/docs)
- **Auth API**: [http://localhost:8081/api/v1/auth/health](http://localhost:8081/api/v1/auth/health)
- **Edu API**: [http://localhost:8082/api/v1/edu/health](http://localhost:8082/api/v1/edu/health)
- **统一入口(网关)**: [http://localhost:8080](http://localhost:8080)
- **LLM Swagger(通过网关)**: [http://localhost:8080/docs](http://localhost:8080/docs)
- **Edu Swagger(通过网关)**: [http://localhost:8080/swagger-ui.html](http://localhost:8080/swagger-ui.html)
- **Auth Swagger(直连)**: [http://localhost:8081/swagger/index.html](http://localhost:8081/swagger/index.html)
端口约定:
- Gateway: 8080
- Auth Service: 8081
- Edu Service: 8082
- LLM Service: 8000
---
## 🛠️ 本地开发指南 (Local Development)
## 本地开发指南
如果你需要修改代码,建议在本地分别启动服务。
......@@ -94,13 +87,13 @@ source venv/bin/activate # macOS/Linux
# 安装依赖
pip install -r requirements.txt
# 运行服务 (会自动向上查找根目录的 .env)
python main.py
# 运行服务
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```
---
## 🧪 接口测试流程
## 接口测试流程
### 1. 注册与登录 (Auth Service)
所有操作都需要 Token。
......@@ -127,22 +120,28 @@ curl http://localhost:8082/api/v1/classes \
```
### 3. AI 对话 (LLM Service)
LLM Service 会自动调用 Auth Service 验证 Token
LLM Service 会在本地校验 JWT(要求 `SECRET_KEY` 与 Auth Service 的 `JWT_SECRET` 保持一致)
```bash
# 发起对话
curl -X POST http://localhost:8000/api/v1/conversations/chat \
# 1) 创建对话,拿到 conversation_id
curl -X POST http://localhost:8000/api/v1/conversations \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json"
# 2) 向对话发送消息
curl -X POST http://localhost:8000/api/v1/conversations/<CONVERSATION_ID>/messages \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"message": "你好,请介绍一下你自己"}'
-d '{"content": "你好,请介绍一下你自己"}'
```
---
## 📂 目录结构说明
## 目录结构说明
```text
/llm-filter
├── gateway/ # Nginx 网关配置
├── docker-compose.yml # 容器编排文件
├── .env # 全局环境变量 (数据库密码、密钥等)
└── microservices/ # 微服务源码目录
......@@ -151,8 +150,8 @@ curl -X POST http://localhost:8000/api/v1/conversations/chat \
└── llm-service/ # [Python] LLM 核心服务
```
## ⚠️ 常见问题
## 常见问题
1. **端口冲突**:如果 `5432` 被本地 Postgres 占用,Docker 会映射到 `5433`。代码中已默认适配 `5433`,如需修改请检查 `.env` 和各服务的配置文件。
2. **Maven 下载慢**:请使用项目提供的 `microservices/edu-service/settings.xml`,已配置阿里云镜像。
3. **Python 找不到 .env**`config.py` 已内置自动向上查找逻辑,确保在 `microservices/llm-service` 目录下运行即可
3. **LLM 无法鉴权**:请确保 `SECRET_KEY` 与 Auth Service 的 `JWT_SECRET` 一致,否则会出现 401
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment