1. 奖章条件优化 - 修复统计查询 SQL 语法 - 添加按类别检查奖章方法 2. 移动端适配 - 登录页、课程中心、课程详情 - 考试页面、成长路径、排行榜 3. 证书系统 - 数据库模型和迁移脚本 - 证书颁发/列表/下载/验证 API - 前端证书列表页面 4. 数据大屏 - 企业级/团队级数据 API - ECharts 可视化大屏页面
This commit is contained in:
188
CHANGELOG-2026-01-29.md
Normal file
188
CHANGELOG-2026-01-29.md
Normal file
@@ -0,0 +1,188 @@
|
||||
# KPL 考培练系统 功能迭代更新日志
|
||||
|
||||
**日期**: 2026-01-29
|
||||
**版本**: v1.5.0
|
||||
|
||||
---
|
||||
|
||||
## 一、奖章条件优化
|
||||
|
||||
### 修复内容
|
||||
- 修复 `badge_service.py` 中统计查询的 SQL 语法问题
|
||||
- 将非标准 `func.if_` 替换为 SQLAlchemy 标准 `case` 语句
|
||||
- 优化考试统计逻辑:通过数、满分数、优秀数分开查询
|
||||
- 添加 `func.coalesce` 处理空值
|
||||
|
||||
### 新增功能
|
||||
- `check_badges_by_category()` - 按类别检查奖章
|
||||
- `check_exam_badges()` - 考试后触发
|
||||
- `check_practice_badges()` - 练习后触发
|
||||
- `check_streak_badges()` - 签到后触发
|
||||
- `check_level_badges()` - 等级变化后触发
|
||||
|
||||
### 文件变更
|
||||
- `backend/app/services/badge_service.py`
|
||||
|
||||
---
|
||||
|
||||
## 二、移动端适配
|
||||
|
||||
### 适配页面
|
||||
| 页面 | 文件 | 适配要点 |
|
||||
|------|------|----------|
|
||||
| 登录页 | `views/login/index.vue` | 表单全宽、背景动画隐藏、钉钉安全区域 |
|
||||
| 课程中心 | `views/trainee/course-center.vue` | 单列卡片、分类横向滚动、操作按钮网格化 |
|
||||
| 课程详情 | `views/trainee/course-detail.vue` | 侧边栏折叠、视频自适应、工具栏响应式 |
|
||||
| 考试页面 | `views/exam/practice.vue` | 选项垂直排列、按钮放大、弹窗全屏 |
|
||||
| 成长路径 | `views/trainee/growth-path.vue` | 雷达图缩放、卡片堆叠、统计区折叠 |
|
||||
| 排行榜 | `views/trainee/leaderboard.vue` | 列表简化、签到按钮全宽 |
|
||||
|
||||
### 技术方案
|
||||
- 使用 `@media (max-width: 768px)` 和 `@media (max-width: 480px)` 断点
|
||||
- 钉钉环境使用 `env(safe-area-inset-*)` 适配安全区域
|
||||
|
||||
---
|
||||
|
||||
## 三、证书系统
|
||||
|
||||
### 数据库设计
|
||||
```sql
|
||||
-- 证书模板表
|
||||
CREATE TABLE certificate_templates (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
type ENUM('course', 'exam', 'achievement') NOT NULL,
|
||||
background_url VARCHAR(500),
|
||||
template_html TEXT,
|
||||
template_style TEXT,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
...
|
||||
);
|
||||
|
||||
-- 用户证书表
|
||||
CREATE TABLE user_certificates (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id INT NOT NULL,
|
||||
template_id INT NOT NULL,
|
||||
certificate_no VARCHAR(50) UNIQUE NOT NULL,
|
||||
title VARCHAR(200) NOT NULL,
|
||||
...
|
||||
);
|
||||
```
|
||||
|
||||
### 后端实现
|
||||
- **模型**: `CertificateTemplate`, `UserCertificate`, `CertificateType`
|
||||
- **服务**: `CertificateService`
|
||||
- `issue_course_certificate()` - 颁发课程证书
|
||||
- `issue_exam_certificate()` - 颁发考试证书
|
||||
- `issue_achievement_certificate()` - 颁发成就证书
|
||||
- `generate_certificate_image()` - 生成分享图片
|
||||
- `get_certificate_by_no()` - 验证证书
|
||||
|
||||
### API 端点
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/certificates/me` | 我的证书列表 |
|
||||
| GET | `/certificates/{id}` | 证书详情 |
|
||||
| GET | `/certificates/{id}/image` | 获取分享图片 |
|
||||
| GET | `/certificates/{id}/download` | 下载证书 |
|
||||
| GET | `/certificates/verify/{no}` | 验证证书(无需登录) |
|
||||
| POST | `/certificates/issue/course` | 颁发课程证书 |
|
||||
| POST | `/certificates/issue/exam` | 颁发考试证书 |
|
||||
|
||||
### 前端实现
|
||||
- **API**: `frontend/src/api/certificate.ts`
|
||||
- **页面**: `frontend/src/views/trainee/my-certificates.vue`
|
||||
- **功能**: 证书列表、分类筛选、预览、分享、下载
|
||||
|
||||
### 文件变更
|
||||
- `backend/migrations/add_certificate_system.sql` (新增)
|
||||
- `backend/app/models/certificate.py` (新增)
|
||||
- `backend/app/services/certificate_service.py` (新增)
|
||||
- `backend/app/api/v1/endpoints/certificate.py` (新增)
|
||||
- `backend/app/models/__init__.py` (修改)
|
||||
- `backend/app/api/v1/__init__.py` (修改)
|
||||
- `frontend/src/api/certificate.ts` (新增)
|
||||
- `frontend/src/views/trainee/my-certificates.vue` (新增)
|
||||
- `frontend/src/router/index.ts` (修改)
|
||||
|
||||
---
|
||||
|
||||
## 四、数据大屏
|
||||
|
||||
### 数据指标
|
||||
| 类别 | 指标 |
|
||||
|------|------|
|
||||
| 概览 | 总学员数、今日活跃、周活跃、月活跃、总学习时长、签到率 |
|
||||
| 考试 | 总次数、通过率、平均分、满分人数 |
|
||||
| 部门 | 成员数、通过率、平均学习时长、平均等级 |
|
||||
| 趋势 | 近7天活跃用户、学习时长、考试次数 |
|
||||
| 分布 | 1-10级用户数量分布 |
|
||||
| 动态 | 最新学习活动实时滚动 |
|
||||
|
||||
### 后端实现
|
||||
- **服务**: `DashboardService`
|
||||
- `get_enterprise_overview()` - 企业级概览
|
||||
- `get_department_comparison()` - 部门对比
|
||||
- `get_learning_trend()` - 学习趋势
|
||||
- `get_level_distribution()` - 等级分布
|
||||
- `get_realtime_activities()` - 实时动态
|
||||
- `get_team_dashboard()` - 团队级数据
|
||||
- `get_course_ranking()` - 课程热度排行
|
||||
|
||||
### API 端点
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/dashboard/enterprise/overview` | 企业概览 |
|
||||
| GET | `/dashboard/enterprise/departments` | 部门对比 |
|
||||
| GET | `/dashboard/enterprise/trend` | 学习趋势 |
|
||||
| GET | `/dashboard/enterprise/level-distribution` | 等级分布 |
|
||||
| GET | `/dashboard/enterprise/activities` | 实时动态 |
|
||||
| GET | `/dashboard/enterprise/course-ranking` | 课程排行 |
|
||||
| GET | `/dashboard/team` | 团队数据 |
|
||||
| GET | `/dashboard/all` | 完整数据(一次性) |
|
||||
|
||||
### 前端实现
|
||||
- **API**: `frontend/src/api/dashboard.ts`
|
||||
- **页面**: `frontend/src/views/admin/data-dashboard.vue`
|
||||
- **图表**: ECharts (横向柱状图、折线图、仪表盘、饼图)
|
||||
- **功能**: 全屏模式、5分钟自动刷新、响应式布局
|
||||
|
||||
### 文件变更
|
||||
- `backend/app/services/dashboard_service.py` (新增)
|
||||
- `backend/app/api/v1/endpoints/dashboard.py` (新增)
|
||||
- `backend/app/api/v1/__init__.py` (修改)
|
||||
- `frontend/src/api/dashboard.ts` (新增)
|
||||
- `frontend/src/views/admin/data-dashboard.vue` (新增)
|
||||
- `frontend/src/router/index.ts` (修改)
|
||||
|
||||
---
|
||||
|
||||
## 部署说明
|
||||
|
||||
### 数据库迁移
|
||||
需执行以下 SQL 脚本:
|
||||
```bash
|
||||
# 证书系统迁移
|
||||
mysql -u root -p kaopeilian < backend/migrations/add_certificate_system.sql
|
||||
```
|
||||
|
||||
### 依赖安装
|
||||
后端新增依赖(用于证书图片生成):
|
||||
```bash
|
||||
pip install Pillow qrcode
|
||||
```
|
||||
|
||||
### 路由变更
|
||||
新增前端路由:
|
||||
- `/trainee/my-certificates` - 我的证书
|
||||
- `/manager/data-dashboard` - 数据大屏
|
||||
|
||||
---
|
||||
|
||||
## 待办事项
|
||||
|
||||
- [ ] 证书 PDF 生成(需安装 weasyprint)
|
||||
- [ ] 课程完成进度追踪(user_course_progress 表)
|
||||
- [ ] 数据大屏数据缓存优化
|
||||
- [ ] 钉钉环境下底部导航适配
|
||||
Reference in New Issue
Block a user