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 |
|
yuliang_guo
|
64a70d5c2c
|
fix: 修复考试API路由冲突和响应验证问题
continuous-integration/drone/push Build is passing
1. 调整路由顺序:将/records和/statistics放在/{exam_id}之前
2. 修复RecentExamItem.start_time允许None值
|
2026-01-31 11:26:54 +08:00 |
|
yuliang_guo
|
e1d10605c9
|
fix: ExamService.start_exam返回ID避免懒加载
continuous-integration/drone/push Build is passing
修改start_exam返回exam.id而不是整个Exam对象,
彻底避免SQLAlchemy异步会话的懒加载问题
|
2026-01-31 11:21:39 +08:00 |
|
yuliang_guo
|
50c511d825
|
fix: 修复考试API的SQLAlchemy懒加载问题
continuous-integration/drone/push Build is passing
在访问current_user属性前先提取到局部变量,避免MissingGreenlet错误
|
2026-01-31 11:20:09 +08:00 |
|
yuliang_guo
|
2334a2544c
|
fix: 修复exam_service异常类导入错误
continuous-integration/drone/push Build is passing
将不存在的BusinessException/ErrorCode替换为现有的NotFoundError/ValidationError
|
2026-01-31 11:15:52 +08:00 |
|
yuliang_guo
|
ae4ba8afd3
|
fix: 修复考试API的ExamService导入缺失
continuous-integration/drone/push Build is passing
考试开始/提交等API因缺少ExamService导入返回500错误
|
2026-01-31 11:14:17 +08:00 |
|
yuliang_guo
|
4a273e627a
|
fix: 成长路径管理API添加权限控制
continuous-integration/drone/push Build is passing
管理端所有成长路径API现在需要管理员或经理权限才能访问:
- GET/POST /manager/growth-paths
- GET/PUT/DELETE /manager/growth-paths/{path_id}
|
2026-01-31 11:06:02 +08:00 |
|
yuliang_guo
|
bdb91aabea
|
fix: SQL执行器仅允许管理员访问
continuous-integration/drone/push Build is passing
- 所有SQL执行器端点改用 require_admin 权限校验
- /sql/execute - 执行SQL
- /sql/validate - 验证SQL
- /sql/tables - 获取表列表
- /sql/table/{name}/schema - 获取表结构
|
2026-01-31 11:01:35 +08:00 |
|
yuliang_guo
|
79b55cfd12
|
fix: 修复权限提升漏洞和添加安全头
continuous-integration/drone/push Build is passing
安全修复:
- 创建 UserSelfUpdate schema,禁止用户修改自己的 role 和 is_active
- /users/me 端点现在使用 UserSelfUpdate 而非 UserUpdate
安全增强:
- 添加 SecurityHeadersMiddleware 中间件
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY
- X-XSS-Protection: 1; mode=block
- Referrer-Policy: strict-origin-when-cross-origin
- Permissions-Policy: 禁用敏感功能
- Cache-Control: API响应不缓存
|
2026-01-31 10:57:41 +08:00 |
|
yuliang_guo
|
52dccaab79
|
feat: 添加API限流和优化错误处理
continuous-integration/drone/push Build is failing
- 添加 RateLimitMiddleware 限流中间件 (200请求/分钟)
- 优化 Content-Type 错误返回 400 而非 500
- 添加 JSON 解析错误处理
- 统一 HTTP 异常处理格式
|
2026-01-31 10:50:27 +08:00 |
|
yuliang_guo
|
d59a4355a5
|
fix: 修复安全问题 - 登录失败返回401 + XSS过滤
continuous-integration/drone/push Build is passing
- 登录失败返回 HTTP 401 而非 200
- 添加 XSS 输入过滤工具函数
- 课程名称和描述字段添加 XSS 过滤验证器
|
2026-01-31 10:39:07 +08:00 |
|
yuliang_guo
|
0b7c07eb7f
|
feat: 添加请求验证错误详细日志
continuous-integration/drone/push Build is passing
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-01-31 10:03:54 +08:00 |
|
yuliang_guo
|
fadeaadd65
|
fix: 修复学员端成长路径数据解析,兼容直接返回数据格式
continuous-integration/drone/push Build is passing
|
2026-01-30 18:32:51 +08:00 |
|
yuliang_guo
|
67b3c28d33
|
debug: 添加成长路径返回数据日志
continuous-integration/drone/push Build is passing
|
2026-01-30 18:28:58 +08:00 |
|
yuliang_guo
|
1f60012a97
|
fix: 修复学员端成长路径按用户岗位匹配的逻辑,支持多岗位
continuous-integration/drone/push Build is passing
|
2026-01-30 18:20:18 +08:00 |
|
yuliang_guo
|
3dcaaaaa35
|
feat: 成长路径页面增加岗位全选按钮,调整下方区域高度
continuous-integration/drone/push Build is passing
|
2026-01-30 18:12:08 +08:00 |
|
yuliang_guo
|
ceb0ae966b
|
fix: 修复模板结构错误
continuous-integration/drone/push Build is passing
|
2026-01-30 17:56:12 +08:00 |
|
yuliang_guo
|
52236ff2a8
|
feat: 重构成长路径编辑页面布局 - 上方基本信息/阶段/统计,下方左右分栏课程配置
continuous-integration/drone/push Build is failing
|
2026-01-30 17:55:06 +08:00 |
|
yuliang_guo
|
ebcc0da4c7
|
fix: 修复课程加载 size 参数超过后端限制的问题
continuous-integration/drone/push Build is passing
|
2026-01-30 17:47:55 +08:00 |
|
yuliang_guo
|
a6a87e2d41
|
fix: 修复课程列表API路径和数据结构
continuous-integration/drone/push Build is passing
|
2026-01-30 17:39:40 +08:00 |
|
yuliang_guo
|
14e2e948f5
|
feat: 优化课程列表显示,双列布局展示更多课程
continuous-integration/drone/push Build is passing
|
2026-01-30 16:34:40 +08:00 |
|
yuliang_guo
|
b2e1ed02d1
|
feat: 增强课程搜索功能,添加分类筛选
continuous-integration/drone/push Build is passing
|
2026-01-30 16:27:34 +08:00 |
|
yuliang_guo
|
920c6a64c8
|
feat: 成长路径支持多岗位关联 + 增强拖拽功能
continuous-integration/drone/push Build is passing
前端:
- 岗位选择改为多选模式
- 增强拖拽视觉反馈(高亮、动画提示)
- 列表显示多个岗位标签
后端:
- 添加 position_ids 字段支持多岗位
- 兼容旧版 position_id 单选数据
- 返回 position_names 数组
|
2026-01-30 16:19:40 +08:00 |
|