mirror of
https://github.com/Cccc-owo/CheckInApp.git
synced 2026-06-17 05:56:29 +00:00
docs: update
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
# 架构设计
|
||||
|
||||
## 系统概述
|
||||
|
||||
CheckIn App V2 采用用户-任务分离架构,一个用户可管理多个打卡任务,全局 Token 刷新,任务级别独立控制。
|
||||
|
||||
## 核心架构
|
||||
|
||||
### V2 关键改进
|
||||
|
||||
- **用户-任务分离**: User 和 CheckInTask 独立管理
|
||||
- **全局 Token**: 用户级别的 authorization token,一次扫码更新所有任务
|
||||
- **任务级控制**: 每个任务独立的启用状态和邮箱配置
|
||||
- **任务模板**: TaskTemplate 系统,快速创建标准化任务
|
||||
|
||||
### 数据模型
|
||||
|
||||
#### User(用户)
|
||||
|
||||
```python
|
||||
- id: 主键
|
||||
- jwt_sub: QQ ID(唯一)
|
||||
- alias: 用户名
|
||||
- email: 邮箱
|
||||
- password_hash: 密码(可选)
|
||||
- authorization: QQ Token(全局)
|
||||
- jwt_exp: Token 过期时间
|
||||
- role: admin/user
|
||||
- is_approved: 审批状态
|
||||
```
|
||||
|
||||
#### CheckInTask(任务)
|
||||
|
||||
```python
|
||||
- id: 主键
|
||||
- user_id: 所属用户
|
||||
- name: 任务名称
|
||||
- payload_config: JSON 配置(包含打卡字段)
|
||||
- cron_expression: 定时表达式(如 "0 20 * * *")
|
||||
- is_active: 是否启用
|
||||
```
|
||||
|
||||
#### CheckInRecord(记录)
|
||||
|
||||
```python
|
||||
- id: 主键
|
||||
- task_id: 所属任务
|
||||
- status: success/failed/already_submitted
|
||||
- response_text: API 响应
|
||||
- trigger_type: scheduled/manual/admin
|
||||
- check_in_time: 打卡时间
|
||||
```
|
||||
|
||||
#### TaskTemplate(模板)
|
||||
|
||||
```python
|
||||
- id: 主键
|
||||
- name: 模板名称
|
||||
- field_config: JSON 字段配置
|
||||
- parent_id: 父模板(可选)
|
||||
- is_active: 是否启用
|
||||
```
|
||||
|
||||
## 技术栈
|
||||
|
||||
### 后端
|
||||
|
||||
- **FastAPI**: Web 框架,自动生成 API 文档
|
||||
- **SQLAlchemy**: ORM,支持多数据库
|
||||
- **APScheduler**: 任务调度,动态加载 cron 任务
|
||||
- **Selenium**: 浏览器自动化,获取 QQ Token 和打卡 payload
|
||||
- **JWT**: 身份认证
|
||||
- **SMTP**: 邮件通知
|
||||
|
||||
### 前端
|
||||
|
||||
- **Vue 3**: Composition API
|
||||
- **Ant Design Vue**: UI 组件库
|
||||
- **Pinia**: 状态管理
|
||||
- **Axios**: HTTP 客户端,拦截器处理 Token
|
||||
|
||||
## 认证流程
|
||||
|
||||
### QQ 扫码登录
|
||||
|
||||
1. 用户输入 alias
|
||||
2. 后端检查 alias 可用性和频率限制
|
||||
3. Selenium 启动 headless Chrome,打开接龙登录页
|
||||
4. 生成 QR code,返回给前端
|
||||
5. 用户手机 QQ 扫码
|
||||
6. Selenium 检测登录成功,提取 authorization token 和 jwt
|
||||
7. 存储用户信息(待审批状态)
|
||||
8. 管理员审批后用户可登录
|
||||
|
||||
### 密码登录
|
||||
|
||||
1. 用户设置密码后可使用 alias + password 登录
|
||||
2. 后端验证密码,返回 JWT token
|
||||
|
||||
## 打卡流程
|
||||
|
||||
### 手动打卡
|
||||
|
||||
1. 用户点击任务的"立即打卡"按钮
|
||||
2. 后端异步执行打卡任务
|
||||
3. Selenium 获取最新 x-api-request-payload
|
||||
4. 使用用户的 authorization token 调用接龙 API
|
||||
5. 解析响应,存储记录
|
||||
6. 返回结果
|
||||
|
||||
### 定时打卡
|
||||
|
||||
1. 系统启动时加载所有启用的任务
|
||||
2. APScheduler 根据 cron_expression 调度
|
||||
3. 到达时间后自动执行打卡流程
|
||||
4. 发送邮件通知到任务配置的邮箱
|
||||
|
||||
## 调度任务
|
||||
|
||||
### Token 监控
|
||||
|
||||
- 间隔: 30 分钟(可配置)
|
||||
- 功能: 检查 Token 过期时间
|
||||
- 30 分钟内过期: 发送预警邮件
|
||||
- 已过期 30 分钟内: 发送过期通知
|
||||
|
||||
### 会话清理
|
||||
|
||||
- 间隔: 24 小时
|
||||
- 功能: 删除旧的 Selenium 会话文件
|
||||
|
||||
### 用户清理
|
||||
|
||||
- 间隔: 1 小时
|
||||
- 功能: 删除 24 小时未审批的用户
|
||||
|
||||
## 权限控制
|
||||
|
||||
### 角色
|
||||
|
||||
- **admin**: 所有权限
|
||||
- **user**: 仅操作自己的数据
|
||||
|
||||
### 验证机制
|
||||
|
||||
- 任务所有权验证: 确保用户只能操作自己的任务
|
||||
- JWT 认证: 所有 API 需要有效 token
|
||||
- 审批机制: 新用户需管理员审批
|
||||
|
||||
## 目录结构
|
||||
|
||||
### 后端分层
|
||||
|
||||
```
|
||||
backend/
|
||||
├── api/ # 路由层(29 个端点)
|
||||
├── services/ # 业务逻辑层
|
||||
├── models/ # 数据模型层
|
||||
├── schemas/ # 请求响应模型
|
||||
├── workers/ # Selenium 工作模块
|
||||
└── scripts/ # 工具脚本
|
||||
```
|
||||
|
||||
### 前端分层
|
||||
|
||||
```
|
||||
frontend/src/
|
||||
├── api/ # API 调用封装
|
||||
├── views/ # 页面组件
|
||||
├── components/ # 可复用组件
|
||||
├── stores/ # Pinia 状态
|
||||
├── router/ # 路由配置
|
||||
└── composables/ # 组合式函数
|
||||
```
|
||||
|
||||
## 扩展性
|
||||
|
||||
- 数据库可切换到 PostgreSQL/MySQL
|
||||
- 调度任务可扩展到 Celery
|
||||
- 前端可独立部署到 CDN
|
||||
- 支持 Docker 容器化部署
|
||||
Reference in New Issue
Block a user