From 8d6ffca1e29f5bf9ca7f5e63524f696ebec424af Mon Sep 17 00:00:00 2001 From: czl231 <3286836406@qq.com> Date: Tue, 11 Aug 2026 21:33:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=9C=B0=E5=9D=80=E8=B4=A6=E6=88=B7=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + .../操作日志_用户地址账户名称展示_20260811.md | 48 ++++++++++++ docs/项目文档_用户地址受控展示_v1.1.md | 60 +++++++++++++++ frontend/platform_admin/package.json | 1 + .../check-user-address-relation-display.mjs | 31 ++++++++ frontend/platform_admin/src/api/resources.ts | 3 +- .../src/views/shared/CrudListPage.vue | 36 ++++----- .../src/views/shared/RelationNameText.vue | 76 +++++++++++++++++++ .../shared/resource-list-field-display.ts | 44 +++++++++++ 9 files changed, 281 insertions(+), 22 deletions(-) create mode 100644 docs/操作日志_用户地址账户名称展示_20260811.md create mode 100644 docs/项目文档_用户地址受控展示_v1.1.md create mode 100644 frontend/platform_admin/scripts/check-user-address-relation-display.mjs create mode 100644 frontend/platform_admin/src/views/shared/RelationNameText.vue create mode 100644 frontend/platform_admin/src/views/shared/resource-list-field-display.ts diff --git a/.gitignore b/.gitignore index e67a0e0..f499d9a 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,7 @@ tmp/ caddy/bin/ # apps-repository/ scripts/fixtures/platform-demo-seed-result.json + +# 后端本机运行日志与上传文件不得进入版本库。 +backend/api/logs/ +backend/api/runtime/ diff --git a/docs/操作日志_用户地址账户名称展示_20260811.md b/docs/操作日志_用户地址账户名称展示_20260811.md new file mode 100644 index 0000000..1661b0e --- /dev/null +++ b/docs/操作日志_用户地址账户名称展示_20260811.md @@ -0,0 +1,48 @@ +# 用户地址账户名称展示操作日志 + +操作时间:2026-08-11 + +操作类型:扩展 + +影响模块:平台总后台用户地址列表 + +## 操作前状态 + +用户地址列表的“用户唯一标识”列直接显示截断标识,详情页则显示“账户名称+标识”,同一关系在两个页面的识别方式不一致。 + +## 具体操作 + +1. 为资源字段增加仅列表生效的关系名称展示配置。 +2. 用户地址列表列名改为“用户账户”,主内容显示账户名称。 +3. 名称悬停展示完整唯一标识,名称旁提供复制按钮。 +4. 关系名称缺失时降级显示完整唯一标识。 +5. 详情页及其他资源保持原展示规则。 +6. 新增静态回归检查和 v1.1 项目文档。 + +## 操作后状态 + +用户地址列表可以直接按账户名称识别所属用户,同时仍可查看、复制完整唯一标识。详情页继续显示账户名称和唯一标识。 + +## 代码变更 + +- `frontend/platform_admin/src/api/resources.ts`:新增字段级列表关系名称配置并应用于用户地址。 +- `frontend/platform_admin/src/views/shared/CrudListPage.vue`:新增配置驱动的关系名称列表分流及名称降级。 +- `frontend/platform_admin/src/views/shared/RelationNameText.vue`:新增关系名称、标识悬停与复制组件。 +- `frontend/platform_admin/src/views/shared/resource-list-field-display.ts`:拆分关系名称、标识读取和列宽判断,控制共享列表文件规模。 +- `frontend/platform_admin/scripts/check-user-address-relation-display.mjs`:新增静态回归检查。 +- `frontend/platform_admin/package.json`:新增检查命令。 +- `docs/项目文档_用户地址受控展示_v1.1.md`:新增版本化项目文档。 + +## 验证结果 + +- `pnpm.cmd user-address-display:check`:通过,账户名称、标识降级、悬停与复制入口均已覆盖。 +- `pnpm.cmd type:check`:通过。 +- 项目内 Biome 对本次前端文件执行定向检查:通过;仅报告项目现有的 Vue 模板识别告警,无错误。 +- `pnpm.cmd contract:check`:通过,共校验 48 个资源。 +- `pnpm.cmd build`:通过,Vite 成功构建 2611 个模块。 +- `git diff --check`:通过。 +- `http://localhost:5173`:服务可访问并启用 Vite 热更新;自动化浏览器无平台登录态,未读取受保护的真实用户地址列表。 + +## 风险评估 + +风险较低。新配置默认关闭且只应用于用户地址所属用户字段;不改变接口、权限、详情页或其他资源展示。关系数据加载失败时通过标识降级避免空白。 diff --git a/docs/项目文档_用户地址受控展示_v1.1.md b/docs/项目文档_用户地址受控展示_v1.1.md new file mode 100644 index 0000000..4f25073 --- /dev/null +++ b/docs/项目文档_用户地址受控展示_v1.1.md @@ -0,0 +1,60 @@ +# 用户地址受控展示项目文档 v1.1 + +## 1. 项目概述 + +- 项目名称:平台总后台用户地址受控展示。 +- 实施范围:平台 API 的 `user_address` 资源,以及端口 5173 的平台总后台列表、详情和编辑页。 +- 主要功能:受控展示真实地址及坐标;用户地址列表以账户名称识别所属用户,并保留唯一标识查看与复制能力。 +- 技术栈:Go、Gin、GORM、Vue 3、TypeScript、Arco Design。 + +## 2. 目录结构 + +```text +platforms/ +├── backend/api/internal/logic/platform/user/ +│ └── relation.go # 用户地址受控位置字段恢复 +├── frontend/platform_admin/ +│ ├── scripts/ +│ │ └── check-user-address-relation-display.mjs # 用户账户列表展示检查 +│ └── src/ +│ ├── api/resources.ts # 用户地址字段级列表展示配置 +│ └── views/shared/ +│ ├── CrudListPage.vue # 字段配置驱动的列表分流 +│ ├── RelationNameText.vue # 名称、标识悬停与复制组件 +│ └── resource-list-field-display.ts # 列表字段展示工具 +└── docs/ + └── 11-数据接口与安全.md # 用户地址资源级安全例外 +``` + +## 3. 核心文件说明 + +### 3.1 用户地址字段配置 + +`frontend/platform_admin/src/api/resources.ts` 通过 `listRelationNameOnly` 明确声明列表以关系名称展示。该配置只在用户地址的所属用户字段启用,详情页和其他资源不读取该规则。 + +### 3.2 列表展示组件 + +`RelationNameText.vue` 以账户名称作为列表主内容,悬停显示完整用户唯一标识,并提供独立复制按钮。关系选项尚未加载或账户名称缺失时,列表降级显示完整唯一标识,确保记录仍可定位。 + +## 4. 行为变化 + +| 场景 | 变更前 | 变更后 | +| --- | --- | --- | +| 用户地址列表列名 | 用户唯一标识 | 用户账户 | +| 用户地址列表内容 | 截断的唯一标识 | 账户名称 | +| 完整标识获取 | 点击标识复制 | 悬停查看、复制按钮复制 | +| 关系名称缺失 | 显示原始标识 | 保持显示完整原始标识 | +| 用户地址详情 | 名称与标识 | 保持不变 | +| 其他资源关系字段 | 原有规则 | 保持不变 | + +## 5. 安全与兼容性 + +- 不修改后端接口、数据库结构或敏感字段授权范围。 +- 唯一标识来自已授权列表响应,不新增敏感数据请求。 +- 字段级开关默认关闭,其他资源保持向下兼容。 + +## 6. 维护与验证 + +- 新增类似关系名称列表展示时,应显式配置字段,不按资源名称硬编码。 +- 执行 `pnpm user-address-display:check` 验证目标交互规则。 +- 执行 `pnpm type:check`、定向 Biome 检查和 `pnpm build` 验证前端。 diff --git a/frontend/platform_admin/package.json b/frontend/platform_admin/package.json index 86153bf..761210e 100644 --- a/frontend/platform_admin/package.json +++ b/frontend/platform_admin/package.json @@ -18,6 +18,7 @@ "avatar-retry:check": "node scripts/check-avatar-upload-cache.mjs", "staff-organization:check": "node scripts/check-staff-organization-linkage.mjs", "staff-relations:check": "node scripts/check-staff-relation-policy.mjs", + "user-address-display:check": "node scripts/check-user-address-relation-display.mjs", "audit:platform": "node scripts/check-backend-contract.mjs", "lint": "biome lint .", "lint:fix": "biome lint --write .", diff --git a/frontend/platform_admin/scripts/check-user-address-relation-display.mjs b/frontend/platform_admin/scripts/check-user-address-relation-display.mjs new file mode 100644 index 0000000..06c4bb0 --- /dev/null +++ b/frontend/platform_admin/scripts/check-user-address-relation-display.mjs @@ -0,0 +1,31 @@ +/** + * 功能:静态检查用户地址列表的账户名称展示、标识降级与复制入口。 + * 版本:v1.0.0 + */ +import { readFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const appRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); + +function source(path) { + return readFileSync(resolve(appRoot, path), 'utf8'); +} + +function expectIncludes(content, marker, message) { + if (!content.includes(marker)) throw new Error(`用户地址展示检查失败:${message}`); +} + +const resources = source('src/api/resources.ts'); +const listPage = source('src/views/shared/CrudListPage.vue'); +const relationName = source('src/views/shared/RelationNameText.vue'); +const fieldDisplay = source('src/views/shared/resource-list-field-display.ts'); + +expectIncludes(resources, "listLabel: '用户账户'", '列表列名未改为用户账户'); +expectIncludes(resources, 'listRelationNameOnly: true', '用户地址未启用账户名称展示'); +expectIncludes(listPage, '