Files
piano-plan/docs/STRUCTURE.md
T
hmo e50a9207b4 feat: v1.4.0 - 典型方案采纳、推荐方案列表、审计字段、导航优化
- 添加典型方案采纳功能 (POST /api/plans/<id>/adopt)
- 添加推荐方案列表 (GET /api/students/<id>/recommended-plans)
- PracticePlan 新增 created_by/updated_by/updated_at 审计字段
- 方案编辑/详情页导航优化 (bfcache 处理、pageshow 事件)
- 方案列表支持删除功能
- 学员列表'暂无方案/问题'样式统一
- 更新文档:问题文件已废弃(迁移到数据库)
- 更新部署脚本和验证清单
2026-04-27 02:01:22 +08:00

295 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目结构说明
## 目录概览
```
练习方案系统/
├── docs/ # 项目文档
│ ├── API.md # API接口文档
│ ├── MODELS.md # 数据模型说明
│ └── STRUCTURE.md # 本文件 - 项目结构
├── app/ # Flask应用主目录
│ ├── __init__.py # 应用工厂
│ ├── config.py # 配置管理
│ ├── models.py # 数据库模型
│ │
│ ├── routes/ # 路由模块
│ │ ├── __init__.py # 蓝图注册
│ │ ├── auth.py # 登录认证
│ │ ├── students.py # 学员管理API
│ │ ├── problems.py # 问题记录API
│ │ ├── plans.py # 方案生成API
│ │ ├── settings.py # 系统设置API
│ │ ├── classes.py # 班级管理API
│ │ ├── goals.py # 目标管理 API
│ │ └── student_goals.py # 学员目标 API
│ │
│ ├── services/ # 业务逻辑
│ │ ├── plan_generator.py # 方案生成器
│ │ └── pdf_generator.py # PDF生成器
│ │
│ └── templates/ # 前端模板
│ ├── fragments/ # 可复用模态窗体片段({% include %})
│ │ └── assign_goal_modal.html # 分配目标模态窗体
│ ├── base.html # 基础模板(所有页面继承,统一侧边栏)
│ ├── index.html # 学员管理页面(继承base)
│ ├── home.html # 默认首页(显示统计信息)
│ ├── student.html # 学员详情页(URL导航)
│ ├── plan_detail.html # 方案详情页(URL导航)
│ ├── plan_edit.html # 方案编辑页(URL导航)
│ ├── plans.html # 方案管理列表页
│ ├── settings.html # 问题配置页面(继承base)
│ ├── login.html # 登录页面(独立)
│ ├── setup.html # 初始设置页面(独立)
│ ├── users.html # 用户管理页面(继承base)
│ ├── classes.html # 班级管理页面(继承base)
│ ├── goals.html # 目标管理页面
│ ├── templates.html # 模板管理页面(继承base)
│ ├── api_settings.html # API设置页面(继承base
│ └── wechat_card.html # 微信卡片模板(独立)
├── data/ # 数据目录(运行时创建)
│ └── piano_plans.db # SQLite数据库
├── output/ # PDF输出目录(运行时创建)
├── config/ # 配置目录(运行时创建)
│ └── api_config.json # API配置文件
├── run.py # 应用入口
├── run.bat # 启动脚本
├── requirements.txt # Python依赖
└── README.md # 项目说明
```
---
## 核心模块
### app/__init__.py
应用工厂,负责:
- 创建Flask应用实例
- 加载配置
- 初始化数据库
- 注册蓝图
- 创建必要目录
```python
def create_app():
app = Flask(__name__)
# 加载配置...
db.init_app(app)
app.register_blueprint(main_bp)
# 创建目录...
return app
```
### app/config.py
配置文件,包含:
- 数据库路径
- 问题文件目录
- PDF输出目录
- API配置加载/保存函数
- 权限配置
### app/models.py
数据库模型定义:
- `User` - 用户(登录认证、权限管理)
- `Student` - 学员
- `StudentProblem` - 问题记录(关联 Problem 表)
- `Problem` - 问题定义(15种预定义问题,已从文件迁移到数据库)
- `Class` - 班级
- `PracticePlan` - 练习方案
---
## 路由详解
### routes/auth.py
| 路由 | 方法 | 说明 |
|------|------|------|
| `/login` | GET | 登录页面 |
| `/api/login` | POST | 登录API |
| `/api/logout` | POST | 登出API |
| `/api/check-login` | GET | 检查登录状态 |
| `/setup` | GET | 初始设置页面 |
| `/api/setup` | POST | 初始设置API |
### routes/students.py
| 路由 | 方法 | 说明 |
|------|------|------|
| `/api/students` | GET | 获取学员列表 |
| `/api/students` | POST | 创建学员 |
| `/api/students/<id>` | GET | 获取学员详情 |
| `/api/students/<id>` | PUT | 更新学员 |
| `/api/students/<id>` | DELETE | 删除学员 |
### routes/problems.py
| 路由 | 方法 | 说明 |
|------|------|------|
| `/api/students/<id>/problems` | GET | 获取学员问题 |
| `/api/students/<id>/problems` | POST | 添加问题 |
| `/api/students/<id>/problems/<pid>` | DELETE | 删除问题 |
### routes/plans.py
| 路由 | 方法 | 说明 |
|------|------|------|
| `/api/generate-plan` | POST | 生成练习方案(SSE |
| `/api/generate-plan/preview` | POST | 预览提示词 |
| `/api/plans/<id>` | GET | 获取方案详情 |
| `/api/plans/<id>/content` | PUT | 更新方案内容 |
| `/api/plans/<id>/pdf` | GET | 导出PDF |
| `/api/plans/<id>/md` | GET | 导出Markdown |
| `/plans/<id>/wechat` | GET | 微信卡片 |
| `/api/plans/<id>` | DELETE | 删除方案 |
| `/api/plans/<id>/typical` | POST | 设为典型方案 |
| `/api/plans/<id>/adopt` | POST | 采纳典型方案 |
| `/api/students/<id>/plans` | GET | 获取学员方案列表 |
| `/api/students/<id>/recommended-plans` | GET | 获取推荐方案列表 |
### routes/settings.py
| 路由 | 方法 | 说明 | 权限 |
|------|------|------|------|
| `/settings` | GET | 设置页面 | 管理员 |
| `/api/problems` | GET | 获取问题列表 | 管理员 |
| `/api/problems` | POST | 创建问题 | 管理员 |
| `/api/problems/<id>` | GET | 问题详情 | 管理员 |
| `/api/problems/<id>` | PUT | 更新问题 | 管理员 |
| `/api/problems/<id>` | DELETE | 删除问题 | 管理员 |
| `/api/config` | GET | 获取API配置 | 管理员 |
| `/api/config` | POST | 更新API配置 | 管理员 |
| `/api/config/test` | POST | 测试API连接 | 管理员 |
### routes/classes.py(新增)
| 路由 | 方法 | 说明 | 权限 |
|------|------|------|------|
| `/api/classes` | GET | 班级列表 | 登录用户 |
| `/api/classes` | POST | 新增班级 | 管理员 |
| `/api/classes/<id>` | PUT | 编辑班级 | 管理员 |
| `/api/classes/<id>` | DELETE | 删除班级 | 管理员 |
| `/api/classes/<id>/students` | GET | 班级学员 | 登录用户 |
| `/api/classes/<id>/assign` | POST | 分配学员 | 登录用户 |
| `/api/classes/<id>/goals` | POST | 批量分配目标 | 登录用户 |
### routes/users.py(新增)
| 路由 | 方法 | 说明 | 权限 |
|------|------|------|------|
| `/users` | GET | 用户管理页面 | 管理员 |
| `/api/users` | GET | 用户列表 | 管理员 |
| `/api/users` | POST | 新增用户 | 管理员 |
| `/api/users/<id>` | PUT | 编辑用户 | 管理员 |
| `/api/users/<id>` | DELETE | 删除用户 | 管理员 |
| `/api/users/<id>/reset-password` | POST | 重置密码 | 管理员 |
| `/api/users/change-password` | POST | 修改自己密码 | 登录用户 |
---
## 服务层
### services/plan_generator.py
核心业务逻辑:
```python
# 生成基础练习方案
generate_practice_plan(student_name, problems, problems_dir)
# 生成AI报告(调用LLM
generate_ai_report(student_name, problems, practice_time, time_config)
```
### services/pdf_generator.py
使用 reportlab 生成中文PDF
```python
generate_pdf(plan_id, student_name, content, output_dir)
```
---
## 权限系统
### 角色
| 角色 | 说明 |
|------|------|
| admin | 管理员,拥有所有权限 |
| user | 普通用户,受限权限 |
### 权限矩阵
| 模块 | 管理员 | 普通用户 |
|------|--------|----------|
| 用户管理 | 增删改查 | ❌ |
| 班级管理 | 增删改 | 查询+分配 |
| 学员管理 | 增删改查 | 增删改查 |
| 问题记录 | 增删改查 | 增删改查 |
| 方案生成 | ✅ | ✅ |
| 系统设置 | ✅ | ❌ |
| 修改密码 | ✅ | ✅ |
### 权限装饰器
```python
# 后端权限装饰器
@admin_required # 仅管理员
@login_required # 需登录
# 前端根据 role 动态显示菜单和按钮
```
---
## 启动流程
1. 双击 `run.bat`
2. 脚本自动:
- 删除旧venv(如有)
- 创建新venv
- 安装依赖
- 启动Flask服务
3. 首次访问 `/setup` 创建管理员
4. 登录后使用系统
---
## 扩展开发
### 新增功能步骤
1. **数据模型**:在 `app/models.py` 添加新模型
2. **路由**:在 `app/routes/` 添加新路由文件
3. **业务逻辑**:在 `app/services/` 添加服务
4. **前端**:在 `app/templates/` 添加模板
5. **文档**:更新 `docs/` 目录
### 添加新依赖
1. 修改 `requirements.txt`
2. 运行 `pip install -r requirements.txt`
3. 更新 `run.bat` 中的安装命令
---
## 版本历史
| 版本 | 日期 | 说明 |
|------|------|------|
| V1.0 | 2026-04-17 | 初始版本:学员管理、问题记录、方案生成 |
| V1.1 | 2026-04-17 | 添加用户登录认证系统 |
| V1.2 | 2026-04-18 | 添加用户管理、角色权限、班级管理 |
| V1.2.0 | 2026-04-23 | 问题迁移到数据库;URL导航改造;侧边栏统一 |
| V1.3 | 2026-04-25 | 目标管理模块上线;班级级别属性;{student_goals}参数;提示词预览 |
| V1.4 | 2026-04-27 | 典型方案采纳;推荐方案列表;方案编辑/详情页导航优化;审计字段完善 |