yuliang_guo
|
149cc5f6b0
|
fix: 权限和显示优化
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条
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: 完善成长路径管理功能
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)
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: 完善成长路径画布设计器
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: 恢复成长路径画布式设计器
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: 成长路径管理添加拖拽排序功能
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数量
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对象存储配置文档
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对象存储服务
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: 优化路由加载失败的错误处理
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
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设计
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: 优化错题分析页面的答案选项显示格式
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有效期并支持自动刷新
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课程管理权限
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分配课程到岗位
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]
continuous-integration/drone/push Build is passing
|
2026-02-02 16:27:42 +08:00 |
|
yuliang_guo
|
7857b4fb22
|
fix: 修复仪表盘用户数统计和岗位筛选问题
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]
continuous-integration/drone/push Build is passing
|
2026-02-02 16:21:10 +08:00 |
|
yuliang_guo
|
659f60e765
|
fix: 修复课程权限和添加409冲突统一处理
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]
continuous-integration/drone/push Build is failing
|
2026-02-02 13:21:08 +08:00 |
|
yuliang_guo
|
82f8e6596c
|
fix: 修复CozeService初始化时get_bot_config缺少参数的问题
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]
continuous-integration/drone/push Build is passing
|
2026-02-02 13:09:14 +08:00 |
|
yuliang_guo
|
8024c38c32
|
fix: 修复钉钉同步误删用户的问题
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状态比较大小写问题
continuous-integration/drone/push Build is passing
- COMPLETED -> completed (枚举值是小写)
|
2026-02-02 13:02:19 +08:00 |
|
yuliang_guo
|
cf71fabef0
|
fix: 修复企业看板API 500错误
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: 团队统计只计算未删除的活跃用户
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: 任务中心标签页显示真实任务数量
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: 任务列表优先级显示英文转中文
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
continuous-integration/drone/push Build is passing
任务中心需要加载全部用户列表,将限制从100提升到500
|
2026-01-31 18:38:25 +08:00 |
|
yuliang_guo
|
ebf196686f
|
fix: 修复任务API枚举值访问错误
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异步加载错误
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: 修复创建任务时优先级转换错误
continuous-integration/drone/push Build is failing
前端优先级使用中文(高/中/低),需要转换为英文(high/medium/low)
.toLowerCase() 无法转换中文字符
|
2026-01-31 18:19:19 +08:00 |
|
yuliang_guo
|
506e9ea2e2
|
feat: 员工同步增加离职处理功能
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: 修复员工同步统计错误
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: 添加员工同步立即执行按钮
continuous-integration/drone/push Build is passing
在系统设置页面的员工同步配置中增加"立即同步"按钮,
允许管理员手动触发钉钉员工数据同步
|
2026-01-31 17:51:41 +08:00 |
|
yuliang_guo
|
940777a86e
|
fix: 修复员工同步功能开关保存失败的问题
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检查错误
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 |
|
yuliang_guo
|
18d6d5aff3
|
refactor: 员工同步复用钉钉免密登录配置
continuous-integration/drone/push Build is failing
- 移除员工同步独立的 API 凭证配置
- 复用 dingtalk 配置组的 CorpId、AppKey、AppSecret
- 简化前端界面,只保留开关和测试连接
|
2026-01-31 17:29:10 +08:00 |
|
yuliang_guo
|
7be1ac1787
|
feat: 员工同步改为钉钉开放API方式
continuous-integration/drone/push Build is passing
- 新增 dingtalk_service.py 调用钉钉开放API
- 支持获取 Access Token、部门列表、员工列表
- employee_sync_service 改为从钉钉API获取员工
- 前端配置界面支持配置 CorpId、ClientId、ClientSecret
- 移除外部数据库表依赖
|
2026-01-31 17:25:44 +08:00 |
|
yuliang_guo
|
cabc3c3442
|
fix: 修复练习结束时的DetachedInstanceError
continuous-integration/drone/push Build is passing
- 在第二次commit后refresh session对象
- 避免异步session管理导致的对象脱离错误
|
2026-01-31 17:13:00 +08:00 |
|
yuliang_guo
|
07638152fc
|
refactor: 员工同步数据库配置改为环境变量
continuous-integration/drone/push Build is passing
- 前端隐藏数据库连接配置输入
- 只保留"启用开关"和"表名"配置
- 数据库连接从 EMPLOYEE_SYNC_DB_URL 环境变量读取
- 显示数据源配置状态
- 保留默认值用于向后兼容
|
2026-01-31 17:07:55 +08:00 |
|
yuliang_guo
|
78e1bb3dc3
|
feat: 员工同步配置支持多租户
continuous-integration/drone/push Build is passing
- 后端新增员工同步配置API(获取/保存/测试连接)
- employee_sync_service 从数据库读取配置
- 前端系统设置页面添加"员工同步"Tab
- 支持配置:数据库主机、端口、库名、用户名、密码、表名
- 保留默认配置用于向后兼容
|
2026-01-31 17:01:30 +08:00 |
|
yuliang_guo
|
8500308919
|
feat: 添加功能开关机制
continuous-integration/drone/push Build is passing
- 添加环境变量配置 VITE_FEATURE_DUO_PRACTICE 等
- env.ts 新增 isFeatureEnabled 方法
- 菜单根据功能开关动态显示/隐藏
- 路由守卫拦截未启用功能的直接访问
- 开发环境默认开启双人对练,生产环境默认关闭
|
2026-01-31 14:26:52 +08:00 |
|
yuliang_guo
|
d2e6abfc80
|
feat: 完善任务中心全部功能
continuous-integration/drone/push Build is passing
1. 动态加载选项数据
- 从API获取团队、成员、课程列表
- 替换硬编码选项为动态渲染
2. 编辑任务功能
- 复用创建对话框,添加编辑模式
- 填充表单数据并调用updateTask API
3. 查看详情弹窗
- 展示任务基本信息、进度、课程、要求
- 调用getTaskDetail API获取详情
4. 结束任务功能
- 确认后调用updateTask API更新状态为completed
- 刷新列表和统计数据
5. 复制任务功能
- 复制任务内容到表单(标题添加"副本"后缀)
- 打开创建对话框
6. 发送提醒功能
- 后端新增 /tasks/{id}/remind API
- 前端调用API并显示结果
|
2026-01-31 14:05:55 +08:00 |
|
yuliang_guo
|
9bd9e58439
|
fix: 课程资料schema支持PPT/PPTX文件类型
continuous-integration/drone/push Build is passing
|
2026-01-31 12:02:11 +08:00 |
|
yuliang_guo
|
0b8f8aa6ca
|
fix: 前端上传组件支持PPT/PPTX文件
continuous-integration/drone/push Build is passing
- edit-course.vue: 更新accept属性添加.ppt和.pptx
- 更新提示文字显示支持PPT格式
|
2026-01-31 11:54:16 +08:00 |
|
yuliang_guo
|
c3aa4e85e7
|
feat: 添加PPT/PPTX文件类型支持
continuous-integration/drone/push Build is passing
1. upload.py: 添加ppt/pptx到允许上传的文件类型
2. knowledge_analysis_v2.py: 添加PPT内容提取方法_extract_ppt_content
3. requirements.txt: 添加python-pptx依赖
|
2026-01-31 11:49:10 +08:00 |
|
yuliang_guo
|
4e817f6eef
|
fix: 修复exam_service解析questions JSON格式
continuous-integration/drone/push Build is passing
questions可能是{"questions":[...]}或直接是列表,需要兼容处理
|
2026-01-31 11:28:00 +08:00 |
|