Commit Graph

151 Commits

Author SHA1 Message Date
yuliang_guo
b02f249166 fix(practice): 修复结束会话接口 DetachedInstanceError
All checks were successful
continuous-integration/drone/push Build is passing
- 将 ORM 对象转换为 PracticeSessionResponse 后再返回
- 添加 COZE_WORKSPACE_ID 配置到 .env.ex

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-04 14:56:36 +08:00
yuliang_guo
8f2bd92ee0 Merge branch 'test'
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-04 12:34:36 +08:00
yuliang_guo
205ae6aa4e feat(course): 岗位选择器添加全选按钮
- 在选择岗位弹窗中添加全选/取消全选功能
- 支持对当前筛选结果进行全选操作

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-04 12:34:28 +08:00
yuliang_guo
2de394ccae feat: 添加租户部署脚本
- 添加 deploy-tenant.sh 用于标准化租户后端部署
- 自动挂载 secrets 目录解决 Coze OAuth 问题
- 禁用 Watchtower 避免配置被覆盖
2026-02-04 10:32:36 +08:00
yuliang_guo
3bc9304fa9 chore: trigger rebuild [all]
Some checks are pending
continuous-integration/drone/push Build is running
2026-02-03 18:32:59 +08:00
yuliang_guo
a2ba73e33d fix: 增加 Node.js 内存限制避免构建 OOM
Some checks are pending
continuous-integration/drone/push Build is running
2026-02-03 18:02:57 +08:00
yuliang_guo
bb669ef422 fix: npm install 添加 --include=dev 确保安装 vite
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-03 17:56:42 +08:00
yuliang_guo
44beaa164d fix: 前端构建添加 --target production 参数
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-03 17:53:05 +08:00
yuliang_guo
2f38a0b77a refactor: 改造 CI/CD 使用阿里云 ACR 镜像仓库
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-03 17:38:01 +08:00
yuliang_guo
ed47286955 style: 优化陪练记录页面UI设计
All checks were successful
continuous-integration/drone/push Build is passing
- 统计卡片改用 el-statistic 组件,与错题分析保持一致
- 搜索框改为圆角胶囊形状,添加 hover 聚焦效果
- 下拉选择框使用统一的圆角灰底设计,添加 emoji 图标前缀
- 筛选标签改为胶囊形状
- 重置按钮仅在有筛选条件时显示
- 添加表格行悬浮效果和操作按钮悬浮样式
- 优化响应式布局

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 16:38:45 +08:00
yuliang_guo
4c1b70e9d6 fix: 修复陪练记录回放对话功能
All checks were successful
continuous-integration/drone/push Build is passing
- 回放对话时调用 API 获取对话详情
- 添加加载状态显示
- 添加空数据提示

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 16:27:02 +08:00
yuliang_guo
149cc5f6b0 fix: 权限和显示优化
All checks were successful
continuous-integration/drone/push Build is passing
1. 侧边栏:根据角色过滤菜单,无可访问子菜单时隐藏父菜单
2. Dashboard:智能工牌分析、统计卡片、最近考试仅对学员显示
3. 快捷操作:根据角色显示不同的操作入口
4. 欢迎语:根据角色显示不同的欢迎信息
5. 学习天数:改为基于注册日期计算(至少为1天)
6. 成长路径:AI分析按钮仅对学员显示

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 15:41:56 +08:00
yuliang_guo
7555de2275 fix: 修复课程库加载 - 后端限制每页最多100条
All checks were successful
continuous-integration/drone/push Build is passing
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 15:12:34 +08:00
yuliang_guo
344d8c1770 feat: 完善成长路径管理功能
All checks were successful
continuous-integration/drone/push Build is passing
新增功能:
1. 阶段自定义管理 - 添加/删除/编辑阶段名称
2. 列表分页功能
3. 状态筛选(启用/禁用)
4. 课程分类筛选
5. 岗位全选按钮
6. 创建时间列显示
7. 点击必修/选修标签直接切换

画布高度根据阶段数量动态调整

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 15:05:57 +08:00
yuliang_guo
8892511f10 fix: 后端保存和返回节点位置坐标(position_x, position_y)
Some checks failed
continuous-integration/drone/push Build is failing
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 15:00:54 +08:00
yuliang_guo
973ce53bf3 feat: 完善成长路径画布设计器
All checks were successful
continuous-integration/drone/push Build is passing
后端:
- 添加 position_x, position_y 字段保存节点位置

前端:
- 支持从节点右侧圆点拖拽出箭头连接到其他课程
- 自动根据节点Y坐标识别所属阶段
- 保存并恢复节点位置,不再重置
- 阶段区域高亮显示
- 循环依赖检测

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 14:55:01 +08:00
yuliang_guo
9c916195c6 feat: 恢复成长路径画布式设计器
All checks were successful
continuous-integration/drone/push Build is passing
- 右侧改为画布式设计器,节点可自由拖拽定位
- 支持箭头连接线显示前置课程依赖关系
- 阶段分隔线可视化显示
- 设置前置课程弹窗,用箭头连接
- 自动布局和清空画布功能
- 保留列表管理、多岗位关联等功能

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 14:46:42 +08:00
yuliang_guo
20905b72cc feat: 成长路径管理添加拖拽排序功能
All checks were successful
continuous-integration/drone/push Build is passing
- 已选课程支持拖拽调整顺序
- 支持跨阶段拖拽移动课程
- 拖拽时显示视觉反馈(高亮线条)
- 拖拽到空阶段时显示占位提示
- 自动更新课程排序编号

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 14:34:37 +08:00
yuliang_guo
e110067840 feat: 添加统一启动脚本,支持通过环境变量配置workers数量
All checks were successful
continuous-integration/drone/push Build is passing
- 新增 start.sh 启动脚本,根据 WORKERS/RELOAD 环境变量自动配置
- 修改 Dockerfile 使用启动脚本,默认 WORKERS=4
- 更新 docker-compose.prod-multi.yml,所有租户使用环境变量配置
- 生产环境默认4个workers,提升并发处理能力

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 14:25:34 +08:00
yuliang_guo
879247c8e9 docs: 添加MinIO对象存储配置文档
All checks were successful
continuous-integration/drone/push Build is passing
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 14:11:09 +08:00
yuliang_guo
2f47193059 feat: 集成MinIO对象存储服务
All checks were successful
continuous-integration/drone/push Build is passing
- 新增storage_service.py封装MinIO操作
- 修改upload.py使用storage_service上传文件
- 修改course_service.py使用storage_service删除文件
- 适配preview.py支持从MinIO获取文件
- 适配knowledge_analysis_v2.py支持MinIO存储
- 在config.py添加MinIO配置项
- 添加minio依赖到requirements.txt

支持特性:
- 自动降级到本地存储(MinIO不可用时)
- 保持URL格式兼容(/static/uploads/)
- 文件自动缓存到本地(用于预览和分析)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 14:06:22 +08:00
yuliang_guo
fca82e2d44 fix: 优化路由加载失败的错误处理
All checks were successful
continuous-integration/drone/push Build is passing
- 检测chunk加载失败(部署后旧文件被清理)
- 自动刷新页面加载最新资源
- 改进错误提示,告知用户正在刷新

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 13:42:42 +08:00
yuliang_guo
99ded54616 style: 优化错题卡片操作按钮UI
All checks were successful
continuous-integration/drone/push Build is passing
- 操作按钮改为实心渐变样式,更加醒目
- 添加View和Check图标增强辨识度
- 按钮hover时上浮+阴影效果
- 查看解析:蓝色渐变,hover变深蓝
- 标记已掌握:绿色渐变,hover变深绿
- 表格视图按钮同步优化

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 13:19:43 +08:00
yuliang_guo
c66b355a5a style: 优化错题分析筛选框UI设计
All checks were successful
continuous-integration/drone/push Build is passing
- 重新设计筛选工具栏布局,采用flex横向排列
- 搜索框改为圆角胶囊形状,添加hover聚焦效果
- 下拉选择框使用统一的圆角灰底设计
- 添加emoji图标前缀增加辨识度
- 筛选标签改为胶囊形状
- 重置按钮仅在有筛选条件时显示
- 整体视觉更加现代简洁

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 11:16:46 +08:00
yuliang_guo
078117807d style: 优化错题分析页面的答案选项显示格式
All checks were successful
continuous-integration/drone/push Build is passing
1. 重新设计答案对比区域UI:
   - 添加渐变色背景和圆角边框
   - 添加图标徽章(✓/✗)区分正确和错误答案
   - 添加hover悬浮效果增强交互感
   - 响应式布局适配移动端

2. 优化错题详情弹窗:
   - 重新设计弹窗头部为渐变色
   - 答案对比采用卡片式布局
   - 知识点使用标签样式展示
   - 整体视觉更加专业美观

3. 新增formatAnswer函数:
   - 支持JSON数组格式解析
   - 多选答案用顿号分隔显示
   - 空值友好显示"未作答"

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 10:49:32 +08:00
yuliang_guo
ac686c27e7 feat: 优化登录策略 - 延长token有效期并支持自动刷新
Some checks failed
continuous-integration/drone/push Build is failing
1. 后端配置 (.env.ex):
   - ACCESS_TOKEN_EXPIRE_MINUTES: 30 -> 480 (8小时)

2. 前端 (request.ts):
   - 401错误时先尝试使用refresh_token刷新
   - 刷新成功后自动重试原请求
   - 支持并发请求时的token刷新队列
   - 刷新失败才清除状态并跳转登录页
2026-02-02 17:35:29 +08:00
yuliang_guo
58f746cf46 fix: 完整开放manager课程管理权限
All checks were successful
continuous-integration/drone/push Build is passing
将以下API权限从 require_admin 改为 require_admin_or_manager:
- add_course_material: 添加课程资料
- delete_course_material: 删除课程资料
- create_knowledge_point: 创建知识点
- update_knowledge_point: 更新知识点
- delete_knowledge_point: 删除知识点
- create_growth_path: 创建成长路径

Manager现在拥有完整的课程管理权限,包括:
- 课程CRUD
- 课程资料管理
- 知识点管理
- 岗位分配
- 成长路径创建
2026-02-02 16:54:27 +08:00
yuliang_guo
7c9f235a0e fix: 允许manager分配课程到岗位
All checks were successful
continuous-integration/drone/push Build is passing
- assign_course_positions: require_admin -> require_admin_or_manager
- remove_course_position: require_admin -> require_admin_or_manager
2026-02-02 16:39:04 +08:00
yuliang_guo
4b03e56e89 deploy: 部署仪表盘和岗位筛选修复 [ex]
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-02 16:27:42 +08:00
yuliang_guo
7857b4fb22 fix: 修复仪表盘用户数统计和岗位筛选问题
All checks were successful
continuous-integration/drone/push Build is passing
1. 后端 admin.py:
   - 用户总数统计添加 is_deleted=False, is_active=True 过滤
   - 现在只统计有效的活跃用户数

2. 前端 user-management.vue:
   - 岗位筛选从硬编码改为动态加载 positionOptions
   - 岗位列表从API获取,而不是写死的4个选项
2026-02-02 16:27:35 +08:00
yuliang_guo
e357f44e37 deploy: 部署课程权限和409处理修复 [ex]
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-02 16:21:10 +08:00
yuliang_guo
659f60e765 fix: 修复课程权限和添加409冲突统一处理
Some checks failed
continuous-integration/drone/push Build is failing
1. 课程权限修复:
   - 创建课程: require_admin -> require_admin_or_manager
   - 更新课程: require_admin -> require_admin_or_manager
   - 现在manager角色也可以创建和编辑课程

2. 全局409冲突处理:
   - 添加IntegrityError异常处理器
   - 自动识别常见冲突类型(用户名/邮箱/手机号/名称/编码)
   - 返回友好的中文错误提示
2026-02-02 16:21:02 +08:00
yuliang_guo
6317eb2479 deploy: 部署Coze陪练修复到ex环境 [ex]
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-02 13:21:08 +08:00
yuliang_guo
82f8e6596c fix: 修复CozeService初始化时get_bot_config缺少参数的问题
Some checks failed
continuous-integration/drone/push Build is failing
- 移除 __init__ 中对 get_bot_config() 的无参数调用
- 改为在需要时根据 session_type 动态获取 bot_config
- 修复 _get_bot_id_by_type 方法使用正确的配置获取方式
2026-02-02 13:21:00 +08:00
yuliang_guo
5156cbf4d2 deploy: 部署钉钉同步修复到ex环境 [ex]
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-02 13:09:14 +08:00
yuliang_guo
8024c38c32 fix: 修复钉钉同步误删用户的问题
All checks were successful
continuous-integration/drone/push Build is passing
问题原因:钉钉应用缺少手机号读取权限,导致返回的员工手机号全为空,
同步逻辑认为"钉钉没有这些员工"而错误删除了系统中的用户。

修复方案:
1. 增加安全检查:如果钉钉返回员工但手机号全为空,跳过删除操作
2. 使用双重匹配:同时考虑手机号和钉钉ID进行员工匹配
3. 增强日志:记录有手机号和钉钉ID的员工数量
4. 增加保护:只有手机号和钉钉ID都不匹配时才删除
2026-02-02 13:09:03 +08:00
yuliang_guo
8bfd5aa3de fix: 修复TrainingSession状态比较大小写问题
All checks were successful
continuous-integration/drone/push Build is passing
- COMPLETED -> completed (枚举值是小写)
2026-02-02 13:02:19 +08:00
yuliang_guo
cf71fabef0 fix: 修复企业看板API 500错误
All checks were successful
continuous-integration/drone/push Build is passing
- 修复 get_realtime_activities() 中字段名错误 (exp_amount -> exp_change)
- 添加 get_enterprise_overview() 的异常处理,防止单个查询失败导致整体失败
- 满分人数查询添加 NULL 值检查
2026-02-02 12:57:31 +08:00
yuliang_guo
99c4ac5473 fix: 团队统计只计算未删除的活跃用户
All checks were successful
continuous-integration/drone/push Build is passing
- get_accessible_team_member_ids 增加 is_deleted=False 和 is_active=True 过滤
- 避免统计已离职/删除的用户导致数量不准
2026-01-31 19:01:01 +08:00
yuliang_guo
616bb7185e fix: 任务中心标签页显示真实任务数量
Some checks failed
continuous-integration/drone/push Build is failing
- 移除硬编码的任务数量(12/5/28/3)
- 加载所有任务后统计各状态数量
- 后端任务API page_size限制调整为500
2026-01-31 18:48:26 +08:00
yuliang_guo
e942a9de2c fix: 任务列表优先级显示英文转中文
Some checks failed
continuous-integration/drone/push Build is failing
API返回英文优先级(high/medium/low),前端显示转换为中文(高/中/低)
2026-01-31 18:42:14 +08:00
yuliang_guo
586c51955e fix: 增加分页参数page_size上限到500
All checks were successful
continuous-integration/drone/push Build is passing
任务中心需要加载全部用户列表,将限制从100提升到500
2026-01-31 18:38:25 +08:00
yuliang_guo
ebf196686f fix: 修复任务API枚举值访问错误
All checks were successful
continuous-integration/drone/push Build is passing
- 使用 hasattr 检查是否为枚举类型,兼容字符串和枚举
- 移除 get_tasks 中多余的 get_task_detail 调用,使用已加载的关联数据
2026-01-31 18:35:17 +08:00
yuliang_guo
fc9775e61f fix: 修复任务服务SQLAlchemy异步加载错误
All checks were successful
continuous-integration/drone/push Build is passing
- create_task 和 get_tasks 现在使用 selectinload 预加载关联关系
- 避免懒加载导致的 MissingGreenlet 错误
2026-01-31 18:31:07 +08:00
yuliang_guo
eca0ed8c9d fix: 修复创建任务时优先级转换错误
Some checks failed
continuous-integration/drone/push Build is failing
前端优先级使用中文(高/中/低),需要转换为英文(high/medium/low)
.toLowerCase() 无法转换中文字符
2026-01-31 18:19:19 +08:00
yuliang_guo
506e9ea2e2 feat: 员工同步增加离职处理功能
Some checks failed
continuous-integration/drone/push Build is failing
- 全量同步 (sync_employees) 现在会检测并软删除离职员工
- 增量同步改为软删除而非物理删除,更安全
- 离职处理:设置 is_active=False, is_deleted=True
- 前端显示离职处理数量统计
2026-01-31 18:10:45 +08:00
yuliang_guo
e5dd6f3acb fix: 修复员工同步统计错误
Some checks failed
continuous-integration/drone/push Build is failing
- create_user 现在返回 (user, status) 元组,区分 created/existing/restored/skipped
- sync_employees 正确统计新增、已存在、恢复、跳过的用户数
- 前端显示更准确的同步结果信息
2026-01-31 18:04:27 +08:00
yuliang_guo
6b7b828854 feat: 添加员工同步立即执行按钮
All checks were successful
continuous-integration/drone/push Build is passing
在系统设置页面的员工同步配置中增加"立即同步"按钮,
允许管理员手动触发钉钉员工数据同步
2026-01-31 17:51:41 +08:00
yuliang_guo
940777a86e fix: 修复员工同步功能开关保存失败的问题
Some checks failed
continuous-integration/drone/push Build is failing
当 feature_switches 表中没有默认记录时,set_feature_switch 函数
现在会使用预定义的默认值创建记录,而不是静默失败
2026-01-31 17:46:35 +08:00
yuliang_guo
41a2f7944a fix: 修复flake8 lint检查错误
All checks were successful
continuous-integration/drone/push Build is passing
- 删除废弃的 admin_positions_backup.py 备份文件
- 修复 courses.py 缺失的 select 导入
- 修复 coze_gateway.py 异常变量作用域问题
- 修复 scheduler_service.py 无用的 global 声明
- 添加 TYPE_CHECKING 导入解决模型前向引用警告
2026-01-31 17:43:39 +08:00