root
|
7cd2aacd7b
|
fix: 添加 redirectUri 参数和详细调试日志
|
2026-02-28 09:12:47 +08:00 |
|
root
|
4667590feb
|
fix: 修复飞书免登功能,添加 H5 JSSDK 和 appId 自动获取
后端改动:
- 新增 /api/v1/auth/feishu-config 接口,根据 company 参数返回对应 appId
前端改动:
- 添加飞书 H5 JSSDK (h5-js-sdk-1.5.19.js)
- 修改登录页免登逻辑:先从后端获取 appId,再调用 tt.requestAuthCode
- 新增飞书环境检测测试页面 (/feishu-env-test)
- 移除测试页面的自动轮询逻辑
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-28 08:58:51 +08:00 |
|
root
|
4c3b750884
|
fix: 优化飞书内免登功能,移除外部 JSBridge SDK 加载
- tt 对象由飞书客户端自动注入,无需加载外部 SDK
- 增加轮询超时时间到 10 秒
- 添加更详细的调试日志
- 超时时降级到扫码登录
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 23:05:43 +08:00 |
|
root
|
5855546a7c
|
fix: 修复飞书内免登功能
- 动态加载飞书 JSBridge SDK(多 CDN 备用)
- 等待 tt 对象加载后尝试免登
- 超时后降级为二维码登录
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 22:34:03 +08:00 |
|
root
|
ba9b1f9d2b
|
fix: 飞书内环境自动显示二维码登录
- 移除 JSBridge SDK(URL 不可用)
- 飞书内环境自动触发二维码登录
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 22:30:36 +08:00 |
|
root
|
ea86a4d68c
|
fix: 修复飞书 JSBridge SDK URL
正确的路径: /lark/passport/h5-jsbridge-1.0.3.js
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 22:21:26 +08:00 |
|
root
|
3b5107d4cd
|
fix: 移除过期的飞书 JSBridge SDK
JSBridge 仅用于飞书内免登,扫码登录不需要
QRCode SDK 已包含所需功能
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 21:47:34 +08:00 |
|
root
|
2df57fb5d5
|
feat: 更新部署配置和发布流程
- 修复前端 TypeScript 编译错误
- 更新部署文档(前端本地构建,后端 Git 部署)
- 新增服务器端部署脚本
- 优化部署流程
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 18:39:20 +08:00 |
|
root
|
c1e54d9457
|
chore: 移除已迁移的旧文件
|
2026-02-27 18:01:32 +08:00 |
|
root
|
1004aea725
|
feat: 审批功能优化和拒绝原因弹窗
后端改动:
- ApprovalService: 添加调试日志,简化详情页 URL 生成逻辑
- BusinessTripService: 优化出差审批详情展示
前端改动:
- approval/detail: 审批详情页优化,支持查看完整审批流程
- approval/reject: 新增拒绝原因弹窗组件
- business-trip/detail: 出差详情页增强,展示审批状态和操作
功能特性:
- 审批详情页显示完整审批流程和记录
- 拒绝操作支持填写拒绝原因
- 出差申请详情页优化展示
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 17:57:56 +08:00 |
|
root
|
b1ca2c58b7
|
feat: 飞书登录支持多租户和用户工号管理
后端改动:
- FeishuService: 从飞书用户信息获取 tenant_key 和手机号
- FeishuService: 新增 user_sn 表工号分配机制
- FeishuService: 优先使用 enterprise_email,支持手机号
- AuthController: 飞书免登支持 company 参数
前端改动:
- FeishuAutoLogin: 支持多租户 company 参数
- login/index: 支持 redirect 参数和已登录检测
- QRCodeLogin: 支持多租户参数传递
- router: 新增路由守卫和参数处理
- api.ts: 优化飞书登录 API 调用
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 17:57:49 +08:00 |
|
root
|
ea185eb6cc
|
fix: 移除快速审批页面中重复的 return 语句
修复白屏问题:
- 移除组件末尾的重复 return 语句
- 这些代码是死代码,导致组件无法正常渲染
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:34:38 +08:00 |
|
root
|
390bdc348c
|
fix: 修复快速审批页面路由和错误处理
修复内容:
1. router/index.tsx - 将 QuickAction 路由移到 MobileLayout 外部
2. quick-action.tsx - 修复导入错误,增强错误处理和调试信息
问题分析:
- QuickAction 不需要 MobileLayout,应该作为独立页面
- 添加详细的调试日志便于排查问题
- 增强页面关闭逻辑(支持多种方式)
工作流程:
1. 用户点击飞书消息按钮
2. 打开快速审批页面
3. 检查登录状态,未登录则跳转登录页
4. 已登录则自动执行审批操作
5. 显示操作结果
6. 尝试关闭页面或跳转到列表
相关文件:
- frontend/src/router/index.tsx
- frontend/src/pages/approval/quick-action.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:33:33 +08:00 |
|
root
|
09a7220e76
|
feat: 实现无感快速审批操作
问题:
- 用户点击飞书消息按钮需要跳转到web界面
- 需要登录才能操作,体验不流畅
解决方案:
1. 创建快速审批页面 (quick-action.tsx)
2. 用户点击按钮后自动执行审批操作
3. 操作成功后自动关闭页面或返回
4. 全流程无需用户手动跳转
工作流程:
1. 用户在飞书中点击"通过"/"拒绝"按钮
2. 打开快速审批页面
3. 自动执行审批操作(如果已登录)
4. 显示操作成功/失败
5. 自动关闭页面(飞书客户端)或返回列表
优势:
- 一步完成审批,无需跳转
- 已登录用户无感操作
- 未登录用户会引导登录后返回
相关文件:
- frontend/src/pages/approval/quick-action.tsx (新建)
- frontend/src/router/index.tsx
- backend/app/service/FeishuNotificationService.php
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:30:12 +08:00 |
|
root
|
e31cf88eab
|
fix: 添加与登录页相同的 tt 对象刷新机制
问题:
- 登录页可以飞书免登,但审批详情页不能
- 原因:登录页有刷新机制等待 tt 对象注入,审批详情页没有
修复:
- approval/detail.tsx - 添加与登录页相同的刷新逻辑
- 在飞书中但 tt 对象不存在时,自动刷新页面(最多3次)
- 每次刷新后重新检测 tt 对象是否已注入
工作流程:
1. 用户点击飞书消息按钮
2. 打开审批详情页
3. 检测到在飞书中但 tt 对象不存在
4. 自动刷新页面(最多3次)
5. tt 对象注入成功后自动免登
6. 免登成功后加载审批详情
相关文件:
- frontend/src/pages/approval/detail.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:28:04 +08:00 |
|
root
|
6d08695a7d
|
feat: 优化飞书免登失败后的用户体验
问题:
- 移动端飞书 WebView 中 JSBridge SDK 未注入
- 导致免登功能不可用
修复:
1. debug-feishu.tsx - 多次检测环境,添加重试和重新检测功能
2. login/index.tsx - 支持 redirect 参数,登录成功后返回原页面
3. QRCodeLogin.tsx - 支持 redirect 参数
用户体验改进:
- 免登失败时,友好提示用户使用其他登录方式
- 登录成功后自动返回到原页面(审批详情页)
- 用户完成登录后可直接进行审批操作
替代方案:
1. 点击飞书消息中的"查看详情"按钮
2. 跳转到登录页面
3. 使用邮箱/密码或扫码登录
4. 登录成功后自动返回审批详情页
5. 直接进行审批操作
相关文件:
- frontend/src/pages/debug-feishu.tsx
- frontend/src/pages/login/index.tsx
- frontend/src/pages/login/QRCodeLogin.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:24:20 +08:00 |
|
root
|
7e57e8720b
|
feat: 添加飞书 JSBridge SDK 支持
问题:
- 移动端飞书 WebView 中 tt 对象没有被注入
- 导致免登功能无法使用
修复:
1. index.html - 引入飞书 H5 JSBridge SDK
2. approval/detail.tsx - 添加对多种飞书 API 的支持
3. debug-feishu.tsx - 更新调试页面,检测所有可能的 API 对象
支持的飞书 API:
- window.tt (标准 H5 应用)
- window.h5sdk (JSBridge)
- window.bridge (JSBridge)
- window.ttjsBridge (旧版)
相关文件:
- frontend/index.html
- frontend/src/pages/approval/detail.tsx
- frontend/src/pages/debug-feishu.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:21:01 +08:00 |
|
root
|
f31abf2c68
|
feat: 添加飞书环境调试页面和详细日志
修改内容:
1. 新增 debug-feishu.tsx - 飞书环境调试页面
2. approval/detail.tsx - 添加详细的调试日志
3. router/index.tsx - 添加调试页面路由
4. business-trip.ts - 修复 import 错误
调试页面功能:
- 检测是否在飞书客户端内
- 显示 window.tt 等对象状态
- 测试飞书免登功能
使用方法:
1. 在飞书客户端中打开: https://xsm.dev.hnxinyouhe.com/debug-feishu
2. 查看环境信息
3. 点击"测试飞书免登"按钮
相关文件:
- frontend/src/pages/debug-feishu.tsx
- frontend/src/pages/approval/detail.tsx
- frontend/src/router/index.tsx
- frontend/src/services/business-trip.ts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:16:33 +08:00 |
|
root
|
3ad8f34914
|
feat: 添加飞书免登自动登录功能
修改内容:
1. approval/detail.tsx - 在加载详情前检查登录状态,如果在飞书内则自动免登
2. login/index.tsx - 改进飞书环境检测和tt对象注入逻辑
业务流程:
1. 用户在飞书中点击消息按钮
2. 打开审批详情页 → 检测未登录
3. 如果在飞书客户端内 → 自动调用 tt.requestAuthCode
4. 免登成功 → 自动加载详情
5. 免登失败 → 跳转到登录页面
相关文件:
- frontend/src/pages/approval/detail.tsx
- frontend/src/pages/login/index.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:14:19 +08:00 |
|
root
|
df0d592ee4
|
feat: 飞书审批消息添加操作按钮
功能:
1. 审批通知卡片添加"通过"和"拒绝"按钮
2. 点击按钮跳转到审批详情页,自动弹出审批确认框
3. 保留"查看详情"按钮
实现:
- FeishuNotificationService.buildApprovalCard() - 添加审批操作按钮
- ApprovalService.notifyNextApprovers() - 传递 order_id 参数
- approval/detail.tsx - 处理 URL 中的 action 参数
按钮样式:
- 通过按钮:绿色 (primary)
- 拒绝按钮:红色 (danger)
- 查看详情:默认样式
相关文件:
- backend/app/service/FeishuNotificationService.php
- backend/app/service/ApprovalService.php
- frontend/src/pages/approval/detail.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 18:57:59 +08:00 |
|
root
|
8ce070bd77
|
fix: 使用 sessionStorage 保持 tab 状态
问题:navigate(-1) 浏览器后退不会传递 location.state
解决方案:
- 切换 tab 时保存到 sessionStorage
- 页面加载时优先从 sessionStorage 恢复 tab
修改文件:
- frontend/src/pages/business-trip/list.tsx
- frontend/src/pages/approval/list.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 18:38:42 +08:00 |
|
root
|
f3a9e442e9
|
fix: 返回列表时保持之前的 tab 状态
问题:从详情页返回时,列表总是重置到"我发起的" tab
解决方案:
1. 导航到详情页时传递 state: { fromTab: activeTab }
2. 列表页从 location.state.fromTab 恢复 tab 状态
修改文件:
- frontend/src/pages/approval/list.tsx
- frontend/src/pages/business-trip/list.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 18:36:41 +08:00 |
|
root
|
ea7f0f8820
|
feat: 添加"抄送我的"审批列表选项
后端修改:
- ApprovalService::getList 添加 'cc' 类型查询
- 从 form_data.cc_users 中查找包含当前用户的订单
- 兼容两种数据格式:[{id:29}] 或 [29]
前端修改:
- 添加"抄送我的"标签页
- 更新类型定义支持 'cc' 类型
- approvalListParams 类型添加 'cc' 选项
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 18:33:53 +08:00 |
|
root
|
0942cb1af0
|
fix: 修复旧审批记录状态并添加前端调试日志
1. 手动修复旧审批记录的状态(在代码修复之前审批的)
2. 添加前端 console.log 调试输出
3. 验证后端API返回正确的 approved 状态数据
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 18:25:56 +08:00 |
|
root
|
2e5f570b40
|
feat: 完善鉴权和密码功能,添加飞书通知模块
- 完善Token过期/不存在时跳转登录重新认证
- 实现正常的账号密码登录验证(邮箱/手机号+密码)
- 用户初始化密码设为工号(sn)
- 添加修改密码功能(API+前端页面)
- 修复扫码登录后跳转问题(zustand persist格式)
- 创建飞书通知服务 FeishuNotificationService
- 设置页面添加修改密码入口
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 15:19:37 +08:00 |
|
root
|
ba555a59b7
|
debug: 添加轮询和跳转的详细日志
|
2026-02-26 12:00:56 +08:00 |
|
root
|
826989d6bf
|
style: 只保留带 emoji 的提示,移除状态文字
|
2026-02-26 11:59:46 +08:00 |
|
root
|
716d39f0b6
|
style: 恢复带 emoji 的飞书扫码提示文字
|
2026-02-26 11:58:33 +08:00 |
|
root
|
32a0ba57cb
|
style: 移除冗余的飞书扫码提示文字
|
2026-02-26 11:58:02 +08:00 |
|
root
|
6b9addf35d
|
style: 调整弹框左右留白为 10px
|
2026-02-26 11:57:28 +08:00 |
|
root
|
40d4d88f98
|
style: 继续减少弹框留白为 8px 20px
|
2026-02-26 11:57:02 +08:00 |
|
root
|
49f8e30839
|
style: 继续减少弹框留白为 12px 20px
|
2026-02-26 11:56:48 +08:00 |
|
root
|
947cbdd571
|
style: 继续减少弹框留白为 16px 20px
|
2026-02-26 11:56:38 +08:00 |
|
root
|
e82e6988a1
|
style: 减少弹框留白为 24px 20px
|
2026-02-26 11:56:22 +08:00 |
|
root
|
88a25e21c2
|
style: 调整二维码弹框的四周留白为 40px 30px
|
2026-02-26 11:56:08 +08:00 |
|
root
|
b12842a338
|
style: 更新 QR SDK 配置参数,添加 style 属性
- width/height: 250x250
- style: width:300px;height:270px;border:none
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 11:55:07 +08:00 |
|
root
|
9836525c81
|
style: 进一步增大二维码尺寸到 280x280
|
2026-02-26 11:49:40 +08:00 |
|
root
|
a691675411
|
style: 调整二维码尺寸为 240x240,增加容器高度
|
2026-02-26 11:47:30 +08:00 |
|
root
|
79cef9ac91
|
fix: 修复 QRLogin SDK 二维码不显示的问题
1. 使用 getElementById 获取容器,避免清空容器本身
2. 确保 DOM 渲染完成后再调用 SDK
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 11:36:46 +08:00 |
|
root
|
d76ee80ecc
|
fix: 修正飞书 SDK 全局变量名为 QRLogin
SDK 的全局变量是 window.QRLogin 而不是 window.QR
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 11:30:35 +08:00 |
|
root
|
983f58ee98
|
fix: 增加 SDK 加载等待时间,确保 window.QR 已初始化
|
2026-02-26 11:23:47 +08:00 |
|
root
|
6eb621cd95
|
fix: 在 HTML 中直接引入飞书 QR SDK
根据官方文档,SDK 应该在 HTML 中通过 script 标签引入,
而不是动态加载。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 11:19:46 +08:00 |
|
root
|
429a8605fc
|
fix: 添加 QR SDK 加载失败的降级方案
1. 优先尝试加载飞书官方 QR SDK
2. 如果 SDK 加载超时(5秒)或失败,自动降级到普通二维码
3. 添加详细的加载日志,方便调试
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 11:16:40 +08:00 |
|
root
|
474c532666
|
fix: 使用飞书官方 QR SDK,扫码后不打开浏览器
使用飞书官方 LarkSSOSDKWebQRCode-1.0.3.js 生成二维码,
飞书APP会识别为登录二维码并在APP内直接处理,
不会打开任何浏览器窗口。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 11:13:43 +08:00 |
|
root
|
b1d58ece61
|
fix: 使用飞书官方 passport 授权端点
后端修改:
- 授权 URL 从 open-apis 改为 passport.feishu.cn
- 使用 passport 端点获取 user_access_token
- 添加 httpGet 方法
前端修改:
- 使用官方 tt.requestAuthCode() API(飞书内免登)
- 保留轮询方式实现扫码登录
参考文档: https://open.feishu.cn/document/sso/web-application-sso/qr-sdk-documentation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 10:20:48 +08:00 |
|
root
|
fa8843d9e0
|
fix: 使用官方 tt.requestAuthCode API 替代 ttjsBridge
- 添加 tt 对象类型声明(官方 H5 API)
- 优先使用 tt.requestAuthCode() 获取授权码
- 保留 ttjsBridge 作为降级兼容方案
- 修正环境检测逻辑
参考文档: https://open.feishu.cn/document/quickly-create-a-login-free-web-app/introduction
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 10:14:03 +08:00 |
|
root
|
4ca47f0d33
|
fix: 修复 CustomEvent 语法错误,缺少闭合括号
|
2026-02-26 10:02:24 +08:00 |
|
root
|
77668d0323
|
fix: 修正 Toast 导入方式,使用命名导入
|
2026-02-26 10:01:21 +08:00 |
|
root
|
2bde4ae10f
|
fix: 安装 qrcode.react 依赖
|
2026-02-26 09:59:41 +08:00 |
|
root
|
df07b16c7a
|
feat: 实现多端飞书登录功能
1. 飞书客户端内:静默自动登录
- 检测飞书环境 (userAgent + ttjsBridge)
- 调用 ttjsBridge.getAuthCode() 获取授权码
- 自动登录到后台
2. 飞书客户端外:扫码登录
- 后端新增三个接口:
* POST /api/v1/auth/qrcode-login - 生成登录会话和二维码
* GET /api/v1/auth/qrcode-login/status - 轮询登录状态
* GET /login/qrcode/{id} - 飞书授权回调
- 前端新增 QRCodeLogin 组件:
* 使用 qrcode.react 生成二维码
* 每 2 秒轮询登录状态
* 状态:loading → pending → scanning → success/expired
3. 数据库表:feishu_login_session
- 存储 session_id, auth_url, status, user_id
- 状态:pending, scanning, success, expired
- 2 分钟过期机制
4. 其他优化
- 移除审批详情页的 header
- 更新 PROJECT_ISSUES.md 文档
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 09:58:19 +08:00 |
|