diff --git a/docs/操作日志_购物车关联名称展示_20260815.md b/docs/操作日志_购物车关联名称展示_20260815.md new file mode 100644 index 0000000..a16aa0c --- /dev/null +++ b/docs/操作日志_购物车关联名称展示_20260815.md @@ -0,0 +1,44 @@ +# 购物车关联名称展示操作日志 + +操作时间:2026-08-15 + +操作类型:修改 + +影响模块:平台总后台电商平台管理、购物车只读列表 + +## 操作前状态 + +- 购物车列表将用户与商品关系按普通唯一标识字段渲染。 +- 页面表头显示“用户唯一标识”“商品唯一标识”,单元格直接显示 UUID。 +- 现有关系补载能力已具备,但购物车资源未启用名称优先展示配置。 + +## 具体操作 + +1. 将购物车用户关系列表标题调整为“用户”,并启用用户名称优先展示。 +2. 将购物车商品关系列表标题调整为“商品”,并启用商品名称优先展示。 +3. 保留两类关系 UUID 的复制入口和关联详情跳转能力。 +4. 增加静态契约检查,防止购物车关系列退回裸 UUID 展示。 + +## 代码变更 + +- `frontend/platform_admin/src/api/resources.ts`:补齐 `ec_cart` 用户、商品关系的名称展示配置。 +- `frontend/platform_admin/scripts/check-resource-display-contracts.mjs`:增加购物车关系列回归检查。 +- `docs/项目文档_平台资源中文展示统一_v1.0.md`:记录 v1.3 展示规则变更。 + +## 行为变化 + +- 修改前:购物车列表以“用户唯一标识”“商品唯一标识”为主要内容并直接展示 UUID。 +- 修改后:购物车列表以“用户”“商品”为列名并展示关联名称;UUID 仅通过复制入口和悬浮提示提供。 +- 购物车记录自身仍按既有契约显示“系统唯一标识”,接口、权限和只读行为不变。 + +## 验证结果 + +- `pnpm resource-display-contracts:check`:通过。 +- `pnpm type:check`:通过。 +- `pnpm build`:通过,Vite 成功完成 2621 个模块的生产构建。 +- `git diff --check`:通过,仅出现仓库既有的 LF/CRLF 转换提示。 + +## 风险评估 + +- 关联资源加载失败时仍会显示“名称加载失败”,并保留 UUID 供排障。 +- 本次仅修改前端展示契约,不改变 API、数据库、权限和业务数据。 diff --git a/docs/项目文档_平台资源中文展示统一_v1.0.md b/docs/项目文档_平台资源中文展示统一_v1.0.md index 0b570be..945ddbd 100644 --- a/docs/项目文档_平台资源中文展示统一_v1.0.md +++ b/docs/项目文档_平台资源中文展示统一_v1.0.md @@ -64,3 +64,4 @@ frontend/platform_admin/ - v1.1:修复树标题插槽误读 `title` 导致中文名称为空的问题,并增加树节点名称回归检查。 - v1.2:树形资源统一改为树形表格,明确展示名称、排序、状态、系统标识和操作,唯一标识降级为复制入口。 - v1.2.1:补齐 Arco 表格 `columns` 插槽,修复树形表格容器存在但列和数据不渲染的问题。 +- v1.3:购物车列表的用户与商品关系列统一展示可读名称,UUID 降级为复制和排障信息。 diff --git a/frontend/platform_admin/scripts/check-resource-display-contracts.mjs b/frontend/platform_admin/scripts/check-resource-display-contracts.mjs index dba21ea..f9e5ebd 100644 --- a/frontend/platform_admin/scripts/check-resource-display-contracts.mjs +++ b/frontend/platform_admin/scripts/check-resource-display-contracts.mjs @@ -79,6 +79,29 @@ for (const [key, label] of [ } } +// 购物车关联列必须展示用户和商品名称,UUID仅作为复制与排障信息保留。 +const cartDefinition = resources.match( + /define\('ec_cart',[\s\S]*?\n\s*\]\),/, +)?.[0]; +if (!cartDefinition) throw new Error('无法读取购物车资源定义'); +for (const [key, label] of [ + ['user_account_identity', '用户'], + ['ec_product_identity', '商品'], +]) { + const field = cartDefinition.match( + new RegExp(`relation\\('${key}'[\\s\\S]*?\\}\\)`), + )?.[0]; + if ( + !field || + !field.includes(`listLabel: '${label}'`) || + !field.includes('listRelationNameOnly: true') || + !field.includes('displayRelationLabel: true') || + !field.includes('showIdentityCopy: true') + ) { + throw new Error(`购物车的${label}列必须以业务名称展示并保留唯一标识复制入口`); + } +} + if (/title="ID"|data-index="id"/.test(listPage)) { throw new Error('标准资源列表不得把数据库ID作为业务列展示'); } diff --git a/frontend/platform_admin/src/api/resources.ts b/frontend/platform_admin/src/api/resources.ts index feabfc2..2f934e3 100644 --- a/frontend/platform_admin/src/api/resources.ts +++ b/frontend/platform_admin/src/api/resources.ts @@ -695,7 +695,14 @@ export const resources: ResourceUiDefinition[] = [ define('ec_product_attribute', '商品属性', 'writable', [relation('ec_product_identity', '/ec_product', true), f('name', { required: true }), f('value', { required: true }), f('sort_no')]), define('ec_product_image', '商品图片', 'writable', [relation('ec_product_identity', '/ec_product', true), f('image_uri', { required: true }), f('sort_no'), f('is_cover')]), define('ec_cart', '购物车', 'readonly', [ - relation('user_account_identity', '/user_account'), relation('ec_product_identity', '/ec_product'), + relation('user_account_identity', '/user_account', false, { + label: '用户', listLabel: '用户', listRelationNameOnly: true, + displayRelationLabel: true, showIdentityCopy: true, + }), + relation('ec_product_identity', '/ec_product', false, { + label: '商品', listLabel: '商品', listRelationNameOnly: true, + displayRelationLabel: true, showIdentityCopy: true, + }), f('quantity'), f('selected'), ]), define('ec_order', '商城订单', 'readonly', [