Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Hooke
/
manulife-weapp
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Graphs
Network
Create a new issue
Commits
Issue Boards
Authored by
hookehuyr
2026-02-11 18:07:14 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
dead4763434b917c58b3a694da96d0024f30c031
dead4763
1 parent
383ec4dd
docs(plan): 记录计划书提交逻辑优化和 API 成功验证经验
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
81 additions
and
4 deletions
docs/CHANGELOG.md
docs/api-docs/API 集成日志.md
docs/lessons-learned/lessons-learned.md
src/composables/useFileOperation.js
docs/CHANGELOG.md
View file @
dead476
This diff is collapsed. Click to expand it.
docs/api-docs/API 集成日志.md
View file @
dead476
...
...
@@ -1267,6 +1267,9 @@
| 2026-02-09 | `src/components/PlanFormContainer.vue` | 表单提交时数据为空 | 修复 submit() 时序问题,移除立即重置 | ✅ 已解决 |
| 2026-02-09 | `src/components/PlanFormContainer.vue` | 金额显示为 10000 而非 100.00 | 添加 formatAmounts() 格式化显示(分 → 元) | ✅ 已解决 |
| 2026-02-10 | `src/api/plan.js` | 后端接口已修复,联调成功 | 接口正常工作 | ✅ 已完成 |
| 2026-02-11 | `src/components/PlanFormContainer.vue` | 前端优化成功判断逻辑 | 修改成功判断从 `res.code === 1` 改为同时检查 `res.code === 1` 和 `res.data?.order_id` | ✅ 已完成 |
| 2026-02-11 | `src/components/PlanFormContainer.vue` | 错误信息路径修正 | 修改错误信息从 `res.data?.message` 改为 `res.data?.msg`,添加降级方案 | ✅ 已完成 |
| 2026-02-11 | `src/pages/product-detail/index.vue`, `src/pages/search/index.vue`, `src/pages/product-center/index.vue`, `src/pages/index/index.vue` | 统一页面处理逻辑 | 修改所有页面的 `handlePlanSubmit` 函数,实现完整的错误处理和导航 | ✅ 已完成 |
**接口状态**: ✅ 已完成
...
...
docs/lessons-learned/lessons-learned.md
View file @
dead476
...
...
@@ -1001,6 +1001,71 @@ export async function fetchProductList(params) {
}
```
### ⚠️ 坑: API 成功验证需要检查状态码和必需字段 ⭐ 2026-02-11 新增
**问题描述**:
在计划书提交功能中,最初只检查 `res.code === 1` 来判断 API 调用是否成功,但这种方式不够严格。
**错误代码**:
```
javascript
// ❌ 只检查状态码
const res = await addAPI(requestData)
if (res.code === 1) {
// 可能 res.data 为空或缺少必需字段
emit('submit', { success: true })
}
```
**问题表现**:
- 即使 API 返回 `{ code: 1, data: null }`,也会判定为成功
- 缺少关键业务数据(如 `order_id`)时仍视为成功
- 后续流程可能因缺少必需数据而失败
**正确做法**:
```
javascript
// ✅ 同时检查状态码和必需字段
const res = await addAPI(requestData)
// 判断成功:既要 code === 1,也要有 order_id
const isSuccess = res.code === 1 && res.data?.order_id
if (isSuccess) {
emit('submit', {
success: true,
order_id: res.data.order_id // 确保必需字段存在
})
} else {
// 失败时,从 res.data.msg 或 res.msg 中获取错误信息
const errorMsg = res.data?.msg || res.msg || '提交失败,请稍后重试'
emit('submit', { success: false })
}
```
**关键原则**:
1. ✅ **双重验证**:同时检查状态码(`code === 1`)和必需数据字段(如 `order_id`)
2. ✅ **字段验证**:对于业务关键接口,验证返回数据中是否包含必需字段
3. ✅ **错误信息路径**:优先从 `res.data.msg` 获取错误信息,其次才是 `res.msg`
4. ✅ **明确的数据契约**:在 API 文档中明确成功响应必须包含的字段
**适用场景**:
- ✅ 提交类 API(订单提交、表单提交等)
- ✅ 创建类 API(创建计划书、创建收藏等)
- ✅ 任何返回业务数据标识符的接口(如 order_id、bill_id 等)
**相关文件**:
- `src/components/plan/PlanFormContainer.vue:308-350` (已修复)
- `src/api/plan.js:27-33` (API 契约文档)
**历史记录**:
- **第 1 次**:发现计划书提交逻辑只检查 `result.success`(接口未返回此字段)
- **第 2 次**:用户指出应该检查 `order_id` 字段
- **第 3 次**:发现错误信息路径应为 `res.data.msg` 而非 `res.data.message`
- **教训**: ⚠️ **API 成功验证必须检查状态码和必需业务字段**
---
### ❌ 坑: API 调用使用了 `fn()` 包装(重复 2 次)
**问题描述**:
...
...
src/composables/useFileOperation.js
View file @
dead476
...
...
@@ -116,12 +116,21 @@ export function useFileOperation() {
showCopyButton
=
!!
item
.
downloadUrl
}
showModal
({
// 构建 showModal 参数
const
modalParams
=
{
title
:
'提示'
,
content
:
message
+
suggestion
,
confirmText
:
showCopyButton
?
'复制链接'
:
'我知道了'
,
cancelText
:
showCopyButton
?
'关闭'
:
undefined
,
showCancel
:
showCopyButton
,
confirmText
:
showCopyButton
?
'复制链接'
:
'我知道了'
}
// 只在有下载链接时才显示取消按钮
if
(
showCopyButton
)
{
modalParams
.
cancelText
=
'关闭'
modalParams
.
showCancel
=
true
}
showModal
({
...
modalParams
,
success
:
(
modalRes
)
=>
{
console
.
log
(
'[文件操作] 用户选择:'
,
modalRes
.
confirm
?
'复制链接'
:
'关闭'
)
...
...
Please
register
or
login
to post a comment