From 9a23ab2f5a85a3b656e8168133fc81253c162ac5 Mon Sep 17 00:00:00 2001 From: czl231 <3286836406@qq.com> Date: Mon, 31 Aug 2026 20:49:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=85=8D=E9=80=81=E7=AB=AF?= =?UTF-8?q?=E5=90=88=E5=90=8C=E4=B8=8E=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/api/internal/logic/delivery/order.go | 5 ++- .../order_contract_attachment_test.go | 21 +++++++++- backend/api/internal/logic/delivery/user.go | 20 +++++++++- .../logic/delivery/user_error_test.go | 33 ++++++++++++++++ ...“作日志_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_20260831.md | 29 ++++++++++++++ .../æ“作日志_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_20260831.md | 29 ++++++++++++++ ...作日志_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_20260831.md | 30 +++++++++++++++ docs/项目文档_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_v1.0.md | 24 ++++++++++++ docs/项目文档_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_v1.0.md | 22 +++++++++++ .../项目文档_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_v1.0.md | 27 +++++++++++++ .../scripts/check-resource-pages.mjs | 3 ++ .../src/views/shared/RelationNameText.vue | 21 ++++++++-- .../src/views/shared/ResourceListPage.vue | 38 +++++++++++++++++-- 13 files changed, 290 insertions(+), 12 deletions(-) create mode 100644 backend/api/internal/logic/delivery/user_error_test.go create mode 100644 docs/æ“作日志_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_20260831.md create mode 100644 docs/æ“作日志_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_20260831.md create mode 100644 docs/æ“作日志_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_20260831.md create mode 100644 docs/项目文档_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_v1.0.md create mode 100644 docs/项目文档_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_v1.0.md create mode 100644 docs/项目文档_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_v1.0.md diff --git a/backend/api/internal/logic/delivery/order.go b/backend/api/internal/logic/delivery/order.go index 9e62fb5..9a4c993 100644 --- a/backend/api/internal/logic/delivery/order.go +++ b/backend/api/internal/logic/delivery/order.go @@ -1,5 +1,5 @@ // 功能æè¿°ï¼šå®žçްé…é€ç‚¹èŒƒå›´å†…çš„åˆåŒã€åˆåŒæ°”ç“¶å’Œé…é€è®¢å•接å£ã€‚ -// 版本:v1.4.0。 +// 版本:v1.4.1。 package delivery import ( @@ -74,7 +74,8 @@ func ListContract(ctx *gin.Context) { infra.Response.Error(ctx, err) return } - var list []platformgasorder.ContractPartyDisplay + // 空结果也åˆå§‹åŒ–为空切片,确ä¿å…¬å¼€å“åº”ä¿æŒ JSON æ•°ç»„è€Œä¸æ˜¯ null。 + list := make([]platformgasorder.ContractPartyDisplay, 0) if err := query.Order("gasorder_contract.created_at desc").Offset((page - 1) * size).Limit(size).Scan(&list).Error; err != nil { infra.Response.Error(ctx, err) return diff --git a/backend/api/internal/logic/delivery/order_contract_attachment_test.go b/backend/api/internal/logic/delivery/order_contract_attachment_test.go index 74f5f2a..0a1330f 100644 --- a/backend/api/internal/logic/delivery/order_contract_attachment_test.go +++ b/backend/api/internal/logic/delivery/order_contract_attachment_test.go @@ -1,5 +1,5 @@ // 功能æè¿°ï¼šéªŒè¯é…é€åˆåŒé™„件列表脱æ•ä¸Žå…¬å¼€çŠ¶æ€æŠ•å½±ã€‚ -// 版本:v1.0.0。 +// 版本:v1.1.0。 package delivery import ( @@ -44,3 +44,22 @@ func TestProtectDeliveryContractListResponse(t *testing.T) { t.Fatal("无附件的åˆåŒå¿…须返回 has_attachment=false") } } + +// TestProtectDeliveryContractListEmptyResponse éªŒè¯æ²¡æœ‰å¯ç”¨åˆåŒæ—¶ä»è¿”回空数组。 +func TestProtectDeliveryContractListEmptyResponse(t *testing.T) { + gin.SetMode(gin.TestMode) + ctx, _ := gin.CreateTestContext(httptest.NewRecorder()) + ctx.Request = httptest.NewRequest("GET", "/gasorder_contract?candidate=order", nil) + contracts := make([]models.GasorderContract, 0) + response, err := common.PublicResourceResponse(contracts) + if err != nil { + t.Fatalf("构造空åˆåŒå…¬å¼€å“应失败: %v", err) + } + protected, err := protectDeliveryContractListResponse(ctx, response, contracts) + if err != nil { + t.Fatalf("空åˆåŒåˆ—表ä¸åº”返回结构错误: %v", err) + } + if protected == nil || len(protected) != 0 { + t.Fatalf("空åˆåŒåˆ—è¡¨å¿…é¡»è¿”å›žéž nil 空数组,实际值: %#v", protected) + } +} diff --git a/backend/api/internal/logic/delivery/user.go b/backend/api/internal/logic/delivery/user.go index 87d4c7f..2134beb 100644 --- a/backend/api/internal/logic/delivery/user.go +++ b/backend/api/internal/logic/delivery/user.go @@ -1,5 +1,5 @@ // 功能æè¿°ï¼šå®žçްé…é€ç‚¹èŒƒå›´å†…çš„ç”¨æˆ·ã€æœåŠ¡å…³ç³»å’Œæ”¶è´§åœ°å€ç®¡ç†ã€‚ -// 版本:v1.1.0。 +// 版本:v1.2.0。 package delivery import ( @@ -12,9 +12,25 @@ import ( "git.apinb.com/heqiapp/platforms/backend/api/internal/logic/upload" "git.apinb.com/heqiapp/platforms/backend/api/internal/models" "github.com/gin-gonic/gin" + "github.com/jackc/pgx/v5/pgconn" "gorm.io/gorm" ) +const deliveryUserUsernameConstraint = "idx_user_account_username" + +var errDeliveryUserUsernameExists = errors.New("用户å已存在,请更æ¢ç”¨æˆ·å") + +// deliveryUserCreateError 仅转æ¢é…é€ç‚¹æ–°å»ºç”¨æˆ·æ—¶çš„用户å唯一约æŸå†²çªã€‚ +// 傿•°ï¼šerr 为用户和æœåŠ¡å…³ç³»äº‹åŠ¡è¿”å›žçš„é”™è¯¯ã€‚ +// 返回值:用户å冲çªè¿”回中文æç¤ºï¼Œå…¶ä»–é”™è¯¯ä¿æŒåŽŸæ ·ã€‚ +func deliveryUserCreateError(err error) error { + var postgresError *pgconn.PgError + if errors.As(err, &postgresError) && postgresError.Code == "23505" && postgresError.ConstraintName == deliveryUserUsernameConstraint { + return errDeliveryUserUsernameExists + } + return err +} + func userQuery(pointID uint64) *gorm.DB { return common.ActiveRecords(db().Model(&models.UserAccount{})). Joins("JOIN user_service_relation ON user_service_relation.user_account_id = user_account.id AND user_service_relation.status <> ?", @@ -116,7 +132,7 @@ func CreateUser(ctx *gin.Context) { relation.UserAccountID = user.ID return tx.Create(&relation).Error }); err != nil { - infra.Response.Error(ctx, err) + infra.Response.Error(ctx, deliveryUserCreateError(err)) return } common.RespondCreatedResource(ctx, user) diff --git a/backend/api/internal/logic/delivery/user_error_test.go b/backend/api/internal/logic/delivery/user_error_test.go new file mode 100644 index 0000000..8d1b672 --- /dev/null +++ b/backend/api/internal/logic/delivery/user_error_test.go @@ -0,0 +1,33 @@ +// 功能æè¿°ï¼šéªŒè¯é…é€ç‚¹æ–°å»ºç”¨æˆ·çš„用户åå†²çªæç¤ºè½¬æ¢ã€‚ +// 版本:v1.0.0。 +package delivery + +import ( + "errors" + "fmt" + "testing" + + "github.com/jackc/pgx/v5/pgconn" +) + +// TestDeliveryUserCreateErrorUsernameConflict 验è¯ç”¨æˆ·å唯一约æŸå†²çªè¿”回指定中文æç¤ºã€‚ +// 傿•°ï¼št 为 Go 测试上下文。 +// 返回值:无。 +func TestDeliveryUserCreateErrorUsernameConflict(t *testing.T) { + databaseError := &pgconn.PgError{Code: "23505", ConstraintName: deliveryUserUsernameConstraint} + wrapped := fmt.Errorf("create delivery user: %w", databaseError) + + if actual := deliveryUserCreateError(wrapped).Error(); actual != "用户å已存在,请更æ¢ç”¨æˆ·å" { + t.Fatalf("用户åå†²çªæç¤ºä¸æ­£ç¡®ï¼Œå®žé™…为 %q", actual) + } +} + +// TestDeliveryUserCreateErrorKeepsOtherErrors 验è¯å…¶ä»–错误ä¸è¢«æœ¬æ¬¡å±€éƒ¨æ˜ å°„改å˜ã€‚ +// 傿•°ï¼št 为 Go 测试上下文。 +// 返回值:无。 +func TestDeliveryUserCreateErrorKeepsOtherErrors(t *testing.T) { + original := errors.New("other error") + if actual := deliveryUserCreateError(original); !errors.Is(actual, original) { + t.Fatalf("å…¶ä»–é”™è¯¯åº”ä¿æŒåŽŸæ ·ï¼Œå®žé™…ä¸º %v", actual) + } +} diff --git a/docs/æ“作日志_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_20260831.md b/docs/æ“作日志_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_20260831.md new file mode 100644 index 0000000..db8383b --- /dev/null +++ b/docs/æ“作日志_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_20260831.md @@ -0,0 +1,29 @@ +# æ“作日志:é…é€ç‚¹åˆåŒç”¨æˆ·å称显示 + +æ“作时间:2026-08-31 +æ“作类型:修改 +影哿¨¡å—:é…é€ç‚¹åˆåŒåˆ—表 + +## æ“作å‰çŠ¶æ€ + +“用户账户â€åˆ—直接显示系统唯一标识片段,与气站管ç†ç«¯çš„用户å称展示ä¸ä¸€è‡´ã€‚ + +## 具体æ“作 + +1. å…³ç³»åˆ—è¡¨å­—æ®µä¼˜å…ˆè¯»å–æœåŠ¡ç«¯æ´¾ç”Ÿä¸šåŠ¡å称。 +2. å¤ç”¨åç§°ã€å…³è”详情和唯一标识å¤åˆ¶çš„组åˆå±•示。 +3. å¢žåŠ é™æ€å¥‘约检查,防止回退为裸唯一标识。 + +## æ“作åŽçŠ¶æ€ + +é…é€ç‚¹åˆåŒåˆ—è¡¨æŒ‰æ°”ç«™ç«¯æ ·å¼æ˜¾ç¤ºç”¨æˆ·ä¸šåŠ¡å称,并ä¿ç•™å®Œæ•´å”¯ä¸€æ ‡è¯†çš„å¤åˆ¶èƒ½åŠ›ã€‚ + +## 验è¯ç»“æžœ + +- `npm.cmd run type:check`:通过。 +- `npm.cmd run resource-pages:check`:通过,详情 17ã€æ–°å»º 9ã€ç¼–辑 5。 +- `npm.cmd run build`:通过,2648 个模å—完æˆç”Ÿäº§æž„建。 + +## 风险评估 + +仅调整å‰ç«¯å…³ç³»åˆ—表字段渲染,æäº¤å­—段ã€åŽç«¯å“应和æƒé™èŒƒå›´å‡ä¸æ”¹å˜ã€‚ diff --git a/docs/æ“作日志_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_20260831.md b/docs/æ“作日志_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_20260831.md new file mode 100644 index 0000000..6c89771 --- /dev/null +++ b/docs/æ“作日志_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_20260831.md @@ -0,0 +1,29 @@ +# æ“作日志:é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º + +æ“作时间:2026-08-31 +æ“作类型:修改 +影哿¨¡å—:é…é€ç‚¹ç”¨æˆ·ç®¡ç†â€”新建用户 + +## æ“作å‰çŠ¶æ€ + +é‡å¤ç”¨æˆ·å直接å‘页é¢è¿”回 PostgreSQL 唯一约æŸé”™è¯¯åŠ SQLSTATE。 + +## 具体æ“作 + +1. 识别用户åçº¦æŸ `idx_user_account_username` çš„ `23505` 冲çªã€‚ +2. 将该冲çªè½¬æ¢ä¸ºâ€œç”¨æˆ·å已存在,请更æ¢ç”¨æˆ·åâ€ã€‚ +3. å…¶ä»–æ•°æ®åº“é”™è¯¯ä¿æŒåŽŸæœ‰å¤„ç†ï¼Œé¿å…æ‰©å¤§æœ¬æ¬¡å˜æ›´èŒƒå›´ã€‚ + +## æ“作åŽçŠ¶æ€ + +é‡å¤åˆ›å»ºåŒåç”¨æˆ·æ—¶é¡µé¢æ˜¾ç¤ºæ˜Žç¡®ä¸­æ–‡æç¤ºï¼Œä¸å†æ˜¾ç¤ºè¯¥çº¦æŸçš„æ•°æ®åº“英文错误。 + +## 验è¯ç»“æžœ + +- `go test ./api/internal/logic/delivery`:通过。 +- 已覆盖包装åŽçš„ PostgreSQL `23505` 用户å约æŸå†²çªã€‚ +- 已验è¯å…¶ä»–é”™è¯¯ä¿æŒåŽŸæ ·ã€‚ + +## 风险评估 + +仅改å˜ä¸€ä¸ªå·²çŸ¥å”¯ä¸€çº¦æŸå†²çªçš„æç¤ºæ–‡æœ¬ï¼Œä¸å½±å“æˆåŠŸåˆ›å»ºè·¯å¾„ä¸Žå…¶ä»–é”™è¯¯ç±»åž‹ã€‚ diff --git a/docs/æ“作日志_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_20260831.md b/docs/æ“作日志_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_20260831.md new file mode 100644 index 0000000..0515f71 --- /dev/null +++ b/docs/æ“作日志_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_20260831.md @@ -0,0 +1,30 @@ +# æ“作日志:é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—è¡¨ä¿®å¤ + +æ“作时间:2026-08-31 +æ“作类型:修改 +影哿¨¡å—:é…é€ç‚¹è®¢å•创建ã€é…é€åˆåŒå€™é€‰åˆ—表 + +## æ“作å‰çŠ¶æ€ + +没有å¯å±¥çº¦åˆåŒæ—¶ï¼ŒåˆåŒæŸ¥è¯¢ç»“果为 nil 切片,公开å“应åºåˆ—åŒ–æˆ `null`,éšåŽè¢«åˆ—表结构校验拒ç»ã€‚ + +## 具体æ“作 + +1. å°†åˆåŒæŸ¥è¯¢æŽ¥æ”¶å®¹å™¨åˆå§‹åŒ–为空切片。 +2. 增加零æ¡åˆåŒçš„å›žå½’æµ‹è¯•ï¼Œè¦æ±‚è¿”å›žéž nil 空数组。 +3. ä¿æŒæŽ¥å£è·¯å¾„ã€ç­›é€‰æ¡ä»¶å’Œå“应字段ä¸å˜ã€‚ + +## æ“作åŽçŠ¶æ€ + +æ— å¯ç”¨åˆåŒæ—¶æŽ¥å£æ­£å¸¸è¿”回 `total: 0`ã€`list: []`,页é¢åªæ˜¾ç¤ºæ— å¯ç”¨åˆåŒæç¤ºã€‚ + +## 验è¯ç»“æžœ + +- `go test ./api/internal/logic/delivery`:通过。 +- 新增空åˆåŒåˆ—表用例,确认公开å“åº”ä¸ºéž nil 空数组。 +- åŽç«¯å·²é‡æ–°æž„建并é‡å¯ï¼Œ12426 端å£ç›‘嬿­£å¸¸ã€‚ +- æµè§ˆå™¨ä¼šè¯çš„原登录令牌已失效并跳转登录页,登录åŽé¡µé¢éªŒè¯å¾…执行。 + +## 风险评估 + +å˜æ›´ä»…å½±å“é›¶æ¡è®°å½•çš„åºåˆ—化形å¼ï¼›æœ‰æ•°æ®åˆ—表和åˆåŒç­›é€‰é€»è¾‘ä¸å˜ï¼Œå…¼å®¹é£Žé™©ä½Žã€‚ diff --git a/docs/项目文档_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_v1.0.md b/docs/项目文档_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_v1.0.md new file mode 100644 index 0000000..f16cf42 --- /dev/null +++ b/docs/项目文档_é…é€ç‚¹åˆåŒç”¨æˆ·å称显示_v1.0.md @@ -0,0 +1,24 @@ +# 项目文档:é…é€ç‚¹åˆåŒç”¨æˆ·å称显示 v1.0 + +## 项目概述 + +é…é€ç‚¹åˆåŒåˆ—表的“用户账户â€åˆ—与气站管ç†ç«¯ä¿æŒä¸€è‡´ï¼Œä»¥ç”¨æˆ·ä¸šåŠ¡å称为主展示,ä¸å†æŠŠç³»ç»Ÿå”¯ä¸€æ ‡è¯†ä½œä¸ºä¸»æ–‡æœ¬ã€‚ + +## 核心文件说明 + +- `frontend/delivery_admin/src/views/shared/ResourceListPage.vue`:渲染æœåŠ¡ç«¯è¿”å›žçš„ `user_account_display_name`,并ä¿ç•™å…³è”详情入å£å’Œå”¯ä¸€æ ‡è¯†å¤åˆ¶èƒ½åŠ›ã€‚ +- `frontend/delivery_admin/src/views/shared/RelationNameText.vue`:支æŒå¯ç‚¹å‡»çš„关系å称展示。 +- `frontend/delivery_admin/scripts/check-resource-pages.mjs`:增加关系åç§°å±•ç¤ºçš„é™æ€å¥‘约检查。 + +## 行为å˜åŒ– + +- 修改å‰ï¼šåˆåŒåˆ—表显示用户账户唯一标识片段。 +- 修改åŽï¼šåˆåŒåˆ—表显示用户业务å称,例如 `ccc`ã€`xc`ã€`cyy`ï¼›åç§°å¯è¿›å…¥ç”¨æˆ·è¯¦æƒ…,æ—边按钮å¯å¤åˆ¶å®Œæ•´å”¯ä¸€æ ‡è¯†ã€‚ + +## 接å£å…¼å®¹æ€§ + +å¤ç”¨çŽ°æœ‰åˆåŒåˆ—表å“应中的 `user_account_display_name`,ä¸ä¿®æ”¹åŽç«¯æŽ¥å£å’Œæ•°æ®åº“。 + +## 测试方法 + +在 `frontend/delivery_admin` 目录执行类型检查ã€èµ„æºé¡µé¢å¥‘约检查和生产构建。 diff --git a/docs/项目文档_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_v1.0.md b/docs/项目文档_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_v1.0.md new file mode 100644 index 0000000..d7c6066 --- /dev/null +++ b/docs/项目文档_é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º_v1.0.md @@ -0,0 +1,22 @@ +# 项目文档:é…é€ç‚¹ç”¨æˆ·åé‡å¤æç¤º v1.0 + +## 项目概述 + +é…é€ç‚¹ç®¡ç†ç«¯æ–°å»ºç”¨æˆ·æ—¶ï¼Œå°†ç”¨æˆ·å唯一约æŸå†²çªè½¬æ¢ä¸ºå¯ç†è§£çš„中文æç¤ºã€‚ + +## 核心文件说明 + +- `backend/api/internal/logic/delivery/user.go`:识别 `idx_user_account_username` 唯一约æŸå†²çªå¹¶è¿”回“用户å已存在,请更æ¢ç”¨æˆ·åâ€ã€‚ +- `backend/api/internal/logic/delivery/user_error_test.go`:验è¯å·²çŸ¥å†²çªæç¤ºä¸Žå…¶ä»–é”™è¯¯ä¿æŒåŽŸæ ·ã€‚ + +## å˜æ›´èŒƒå›´ + +仅修改é…é€ç‚¹ç®¡ç†ç«¯æ–°å»ºç”¨æˆ·çš„é‡å¤ç”¨æˆ·åæç¤ºï¼Œä¸ä¿®æ”¹æ•°æ®åº“约æŸã€ç”¨æˆ·åˆ›å»ºæµç¨‹ã€å­—段校验或其他错误处ç†ã€‚ + +## 测试方法 + +在 `backend` 目录执行: + +```text +go test ./api/internal/logic/delivery +``` diff --git a/docs/项目文档_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_v1.0.md b/docs/项目文档_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_v1.0.md new file mode 100644 index 0000000..33cbd56 --- /dev/null +++ b/docs/项目文档_é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—表修å¤_v1.0.md @@ -0,0 +1,27 @@ +# 项目文档:é…é€ç‚¹è®¢å•åˆåŒç©ºåˆ—è¡¨ä¿®å¤ v1.0 + +## 项目概述 + +ä¿®å¤é…é€ç‚¹ç®¡ç†ç«¯åˆ›å»ºé…é€è®¢å•æ—¶ï¼Œå½“å‰æ²¡æœ‰å¯å±¥çº¦åˆåŒæ—¶é”™è¯¯æç¤ºâ€œé…é€åˆåŒåˆ—表å“应结构无效â€çš„问题。 + +## 核心文件说明 + +- `backend/api/internal/logic/delivery/order.go`:查询é…é€åˆåŒå€™é€‰é¡¹ï¼›ç©ºç»“æžœåˆå§‹åŒ–ä¸ºéž nil 空切片,ä¿è¯æŽ¥å£è¾“出 `list: []`。 +- `backend/api/internal/logic/delivery/order_contract_attachment_test.go`:覆盖åˆåŒç©ºåˆ—表公开å“应的回归测试。 + +## 行为å˜åŒ– + +- ä¿®å¤å‰ï¼šé›¶æ¡åˆåŒè¢«åºåˆ—化为 `null`,åŽç«¯å“应结构校验失败。 +- ä¿®å¤åŽï¼šé›¶æ¡åˆåŒè¿”回空数组,å‰ç«¯æ­£å¸¸æ˜¾ç¤ºâ€œæš‚æ— å¯ä¸‹å•的生效åˆåŒâ€ã€‚ + +## 接å£å…¼å®¹æ€§ + +接å£åœ°å€å’Œå­—æ®µä¿æŒä¸å˜ï¼Œä»…将异常的 `list: null` 规范为 `list: []`,兼容现有调用方。 + +## 测试方法 + +在 `backend` 目录执行: + +```text +go test ./api/internal/logic/delivery +``` diff --git a/frontend/delivery_admin/scripts/check-resource-pages.mjs b/frontend/delivery_admin/scripts/check-resource-pages.mjs index 7397f4f..5e0fda4 100644 --- a/frontend/delivery_admin/scripts/check-resource-pages.mjs +++ b/frontend/delivery_admin/scripts/check-resource-pages.mjs @@ -74,6 +74,9 @@ const listPage = read('src/views/shared/ResourceListPage.vue'); assert(!listPage.includes('title="ID"'), 'æ ‡å‡†åˆ—è¡¨ä»æš´éœ²æ•°æ®åº“自增 ID'); assert(listPage.includes('ProtectedAvatarThumbnail'), 'è´¦æˆ·åˆ—è¡¨å°šæœªæŽ¥å…¥å—æŽ§å¤´åƒç¼©ç•¥å›¾'); assert(listPage.includes('avatarLoader.reset()'), '列表刷新未清ç†å¤´åƒç¼“存和请求'); +assert(listPage.includes('field.listRelationNameOnly && fieldValue(field, record)'), '关系列表字段尚未按气站端显示业务åç§°'); +assert(listPage.includes('relationListName(field, record)'), '关系列表字段缺少æœåŠ¡ç«¯æ´¾ç”Ÿå称读å–'); +assert(listPage.includes('@open="openRelation(field, record)"'), '关系列表å称缺少关è”详情入å£'); const avatarLoader = read('src/views/shared/protected-list-avatar-loader.ts'); assert(avatarLoader.includes('MAX_CONCURRENT_REQUESTS = 6'), '头åƒè¯·æ±‚å¹¶å‘ä¸Šé™æœªä¸Ž 5173 对é½'); assert(avatarLoader.includes("new Set(['staff_account', 'user_account'])"), '头åƒåˆ—表资æºç™½åå•䏿­£ç¡®'); diff --git a/frontend/delivery_admin/src/views/shared/RelationNameText.vue b/frontend/delivery_admin/src/views/shared/RelationNameText.vue index 084c55b..7926282 100644 --- a/frontend/delivery_admin/src/views/shared/RelationNameText.vue +++ b/frontend/delivery_admin/src/views/shared/RelationNameText.vue @@ -1,8 +1,14 @@ - +