refactor: 重构后端目录结构和命名规范

- 将后端目录名从大写改为小写 (Controller->controller 等)
- 将命名空间从 App\ 改为 app\ (符合 webman 官方规范)
- 移除不必要的 bootstrap 目录
- 完善出差审批业务功能:
  - 添加删除草稿功能
  - 添加审批操作功能(同意/拒绝)
  - 完善审批详情页,显示审批人和审批记录
- 前端优化:
  - 调整列表页行高
  - 隐藏底部导航栏
  - 仪表盘只显示3个快捷入口

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-25 18:09:04 +08:00
parent 09d4cb8054
commit 582f454a5a
47 changed files with 1297 additions and 360 deletions
+27
View File
@@ -251,6 +251,33 @@ const handleSubmit = async () => {
- `frontend/src/pages/business-trip/select-cc.tsx`
- `frontend/src/pages/business-trip/apply.tsx`
#### 问题3:导航时草稿保存不及时
**现象:** 用户输入内容后快速点击选择人员,返回时输入的内容丢失
**原因:** React 的 useEffect 是异步执行的,用户快速导航时,useEffect 可能还没来得及保存到 sessionStorage
**解决方案:** 在导航处理函数中立即保存草稿
```tsx
const handleSelectApprovers = () => {
// 导航前立即保存草稿
const draftData = { reason, itineraries }
sessionStorage.setItem('businessTripDraft', JSON.stringify(draftData))
navigate('/business-trip/apply/select-approver', { state: { selected: approvers, type: 'approver' } })
}
const handleSelectCc = () => {
// 导航前立即保存草稿
const draftData = { reason, itineraries }
sessionStorage.setItem('businessTripDraft', JSON.stringify(draftData))
navigate('/business-trip/apply/select-cc', { state: { selected: ccUsers, type: 'cc' } })
}
```
**关键点:**
- ✅ 导航前同步保存草稿数据,不依赖 useEffect
- ✅ 保留 useEffect 自动保存作为备份机制(防止用户不导航就离开页面)
### Ant Design Mobile DatePicker 点击无反应
**问题:** DatePicker 组件使用 children render prop 方式时,点击无法弹出选择框