Commit Graph

79 Commits

Author SHA1 Message Date
zou
7c9d91af1f feat(F006-P0BC): 7 view API 路径修正 + categoryGood 接真 API - feedback/lunbo/aftersale/refund/enterpriselevel/rating/score 假数据→真数据 (8/8 PASS) 2026-08-07 11:19:10 +08:00
zou
7e85188576 feat(F006-P0A): 9 条 mock 路由切真 view - 消息(短信/邮件×4) + 行业/资讯分类 + 用户通知 + 待处理消息 + userManagement redirect 2026-08-07 11:05:09 +08:00
zou
e16033bf13 feat(F006-P1): 12 条 MockTableView 路由切真 view - 运营中心/财务流水/资讯/帮助/内容/系统消息 2026-08-07 10:40:08 +08:00
zou
1d5d739b0e feat(F006): 企业登记管理真页面 + 路由修复 — 8 条 mock→真 view 切换 + 企业后台入口 + 8 条 /admin/sys nginx SPA fallback (Playwright 14/14 通过 0 JS 错误) 2026-08-07 10:14:56 +08:00
zou
f2adaf3392 feat(F006): 品牌管理页改真页面(分页/审核/删除/查看授权企业), 路由改指真view 2026-08-05 16:25:54 +08:00
zou
4d1e125840 feat(price-formula-variable): 运营后台价格变量管理页 P4
- 新增 /other/priceFormulaVariable 路由
- PriceFormulaVariableListView.vue:
  · 变量列表 (标识/名称/单位/当前值/取值方式/状态)
  · 快速改值: 行内编辑当前值, 保存后相关商品价格自动变化
  · 新增/编辑弹窗: 手工维护 / AKShare采集 两种模式
  · 采集代码 + 换算公式配置
  · 启停/删除
2026-08-04 16:16:34 +08:00
Sisyphus
e0534ee365 fix(F006-W18): LoginView 2 处永久修复 /api 前缀
改前: line 48 captchaUrl = /auth/captcha (img src 不走 axios baseURL)
      line 68 axios.post(/auth/oauth/token) (不走 http 实例 baseURL)
      巨变数字 nginx 只代理 /api/ 前缀, /auth/* 全 404

改后: line 48 /api/auth/captcha
      line 68 /api/auth/oauth/token

验证 (0 命中才通过):
  grep /auth/captcha dist/*.js | grep -v /api  → 0 ✅
  grep /auth/oauth dist/*.js | grep -v /api   → 0 ✅
2026-07-15 11:51:10 +08:00
Sisyphus
8be1fd3fba fix(F006-W18): LoginView captcha URL 加 /api 前缀 2026-07-15 11:45:45 +08:00
Sisyphus
eaeb9f1aef fix(F006-W18): EnterpriseListView 完整重写 (UI规范+真实字段映射)
*** v2: 解决 v1 的两个根本问题 ***

问题 1: v1 的 endpoints page() 返回 EnterpriseFeignDTO (仅4个字段),
         导致 administrator/industry/supplierLevel 等30+字段全缺。
   根因: 上次 F002 修复把原始全字段 page 替换成了精简版 feign 端点。
   修法: 把 F002 page 改名为 pageSimple, 恢复原始 EnterpriseDTO page 端点。

问题 2: v1 用原生 el-table 不守 UI 规范。
   修法: 套 PageHeader/SearchBar/DataTable 组件 + 按项目设计规范。

改动:
- 后端: ApiEnterpriseController +pageSimple (F002 feign精简版) +page (全字段)
- 后端: EnterpriseFeign/fallback/OpenApiCustomerController 调 pageSimple
- 前端: EnterpriseListView 完整重写:
  - PageHeader + SearchBar (企业名称/行业/供应商等级) + 批量操作栏
  - DataTable: selection/企业名称(头像)/管理员+手机(两行)/行业+等级(两行)/标签/业务员/状态/入驻时间/操作
  - 操作列: 详情/更换管理员/更多(审核/标签/评级/禁用/隐藏/推荐/分配/删除)
  - 详情弹窗: EnterpriseDTO 全字段(含驳回原因/工商号/注册时间/法人)
  - 字段映射: 完全来自后端 EnterpriseDTO (编译反编译确认所有字段存在)
  - API: /user/enterprise/page 传 enterpriseName/industry/supplierLevel/salesperson/supplierLabel/status/homeShow 过滤
2026-07-15 10:32:56 +08:00
Sisyphus
ba729acaed fix(F006-W18): 企业列表 EnterpriseListView.vue 功能对齐老 vue (Phase 1)
Phase 1 移植老 vue 企业管理-企业列表完整功能:
1. 搜索区: 企业名称 + 行业类型 + 供应商等级 + 高级搜索(业务员/标签/审核状态/推荐显示)
2. 操作按钮: 导入/批量审核/批量设置标签/批量分配业务员/删除/导出
3. 表格列: checkbox + 企业名称(头像) + 管理员手机号 + 行业等级 + 标签 + 业务员 + 状态 + 入驻时间 + 操作
4. 操作列: 详情 + 更换管理员 + 更多下拉(审核/标签/评级/禁用/隐藏/推荐/分配业务员/删除)
5. 详情弹窗升级: 全字段展示(含审核驳回原因/工商号/注册时间等)

数据字段来自 EnterpriseDTO (后端 ApiEnterpriseController):
- administrator/administratorMobile, industry, supplierLevel, supplierLabel
- salesperson/salespersonMobile, status(1-3), enabled, showFlag, homeShow
- createDate(入驻时间), failReason(审核驳回原因)

注: 批量操作(审核/标签/分配业务员)和导入/导出的具体弹窗和文件上传
待 Phase 2 实现, 当前桩函数提示待实现

deploy: dist rsync + docker rebuild + recreate + curl 200 验证
2026-07-15 10:20:36 +08:00
Sisyphus
4899bc1793 fix(F006-W18): admin 前端 BUG A/B/C (客户运维反馈)
BUG A: APIKey 申请搜企业搜不到
  - ApplyApiKeyDialog.vue loadCustomers 加 name 参数调后端, 不再本地 filter
  - 去掉 filteredCustomers computed, 表格直接用 customers
  - searchKey 输入加 debounce 300ms watch 调 loadCustomers

BUG B: 企业列表/行业/标签管理等菜单不显示
  - menu.ts filterByFrontendTruth 加 url 规范化匹配
  - 后端 url 带 / (如 /user/enterprise/enterprise), MENU_LABELS 不带 /
  - normalizeUrl = url.replace(/^\//,"") 后再 has() 匹配

BUG C: baseURL 空串 巨变数字 nginx 不通
  - request.ts baseURL:"" 改 "/api"
  - 巨变数字 nginx 只有 /api/ location (没独立 /sys/ /auth/ 等)
  - devbox nginx /api/ 也去前缀 (rewrite ^/api/(.*)\$ /\$1), 兼容

dist 验证: baseURL:"/api" ✓
devbox 实测: name=郑州巨变 返 1 条命中
2026-07-14 19:15:48 +08:00
Sisyphus
cf00136340 feat(F006): APIKey申请结果+详情弹窗显示MCP地址
后端 apply/detail 返回 mcpEndpoint (从 -Dmcp.endpoint 注入),
前端申请弹窗加 MCP地址列, 详情弹窗加 MCP地址行,
用户复制 appId/appSecret/MCP地址 三值到平台助手配置
2026-07-10 11:54:04 +08:00
Sisyphus
44fd765aa7 fix(F006): 重置密钥弹窗复制按钮显示不全
el-input append插槽被长密钥挤压, 改flex布局按钮独立放置 flex-shrink:0
2026-07-10 11:41:08 +08:00
Sisyphus
34e3c7cd71 fix(F006): 申请APIKey弹窗删除ConnectCode/过期时间列
无用字段清理, 弹窗结果表只保留公司名/AppID/AppSecret
2026-07-10 11:22:04 +08:00
Sisyphus
366056dcac fix(F006-W18): 申请APIKey Step3表格格式错乱+复制失败修复
1. 复制失败根因: navigator.clipboard API 要求 HTTPS/localhost,
   frp 走 http://direv.cloud:8080 是非安全上下文不可用。
   修法: 加 execCommand(copy) 降级方案 (复用 OpenAppListView copyText 逻辑)

2. 表格格式错乱根因: 5 列固定宽 (160+280+弹性+180+320) 超 640px 弹窗,
   AppSecret 列 input+button 横排挤不下。
   修法: 列宽重新分配 (公司120/AppID180/ConnectCode160/过期100/Secret200),
   AppSecret 单元格改 flex-column 竖排 (input 上 button 下),
   code 文本加 text-overflow ellipsis 防撑宽
2026-07-10 11:15:02 +08:00
Sisyphus
3efa5db533 fix(F006): 删除重发二维码功能 + 详情页ConnectCode字段
connectCode/扫码绑定场景从未落地(平台助手/小程序/PC均未消费),
重发二维码按钮和详情页ConnectCode/过期时间是无用功能, 删除清理.
后端端点/数据库字段保留不动(铁律8 不碰没坏的东西)
2026-07-10 11:01:56 +08:00
Sisyphus
8af8ed143d fix(F006-W18): 申请APIKey弹窗表格细节优化
1. 列名 客户名 → 公司名称 (Step1 + Step3 两处)
2. selection 选择框居中 (cell text-align center + padding 0)
3. 列宽重分配: 公司名称 min-width 200 左对齐, 联系人/电话居中
4. 表格圆角修复: 加 rr-apply-table class, border-radius 8px + overflow hidden
2026-07-10 10:54:55 +08:00
Sisyphus
4e525cf6dd fix(F006): OpenApp revoke/delete id 改 String 避免 Number 精度丢失
雪花ID 19位 > Number.MAX_SAFE_INTEGER(16位), Number() 截断
导致撤销/删除传错 id. 改 String(id), 后端 Long.parseLong(string) 兼容
2026-07-10 10:45:05 +08:00
Sisyphus
15294f5c1c feat(F006-W17.6): 用户列表数据列居中显示 (9 列加 align center, 余额保留 right) 2026-07-10 08:45:38 +08:00
Sisyphus
ee52bed129 fix(F006-W18): 暗主题全面适配 (EP token 补齐 + v1 token 清理 + 业务硬编码色修)
用户反馈: dark 主题下大量页面卡片/表头是白底, 文字看不清, 视觉割裂

根因 (W5.x v2 token 迁移遗漏):
- v1 token (--rr-page-bg / --rr-bg-card / --rr-table-header-bg / --rr-row-hover / --rr-border-color / --rr-text-secondary) 在 themes.scss 完全没定义
- v2 用 --bg-soft / --surface / --surface-2 / --border / --ink-2 / --ink-3, 但大量组件没改 fallback, 永远走 hex fallback (#F1F5F9 / #FFFFFF)
- EP el-table 内部用 getCssVar(color, white) = --el-color-white, 未在 tokens.scss 重定向, dark 下仍是 #FFFFFF
- CSS 变量级联问题: :root 块 var(--surface) 解析时, dark 块的 --surface 重写还没生效

修法 (3 类共 11 文件):
1. EP token 补齐 (themes.scss dark 块 + tokens.scss :root 块):
   - --el-color-white / --el-color-black: #1E293B / #F8FAFC
   - --el-fill-color-blank / --el-fill-color-light: surface / bg-soft
   - --el-table-tr-bg-color / --el-table-bg-color: surface
   - --el-table-expanded-cell-bg-color: surface
   - --el-table-header-bg-color: surface-2 (表头略亮区分)
   - --el-table-row-hover-bg-color: bg-soft

2. v1 token 清理 (4 组件):
   - AppLayout.vue: 13 处 --rr-page-bg → --bg-soft
   - DataTable.vue: --rr-table-header-bg/--rr-text-secondary/--rr-row-hover/--rr-bg-card/--rr-border-color → v2 token
   - SearchBar.vue / ListTabs.vue: 同上

3. 业务页硬编码色 (5 业务页):
   - OpenAppListView.vue: 4 状态 badge + 表格头 #F8FAFC → var(--*-soft)
   - ApplyApiKeyDialog.vue: header #F8FAFC → var(--surface-2)
   - InquiryListView.vue / LogOperationView.vue / LogErrorView.vue: 4 类 badge → var(--amber/brand/green/red-soft)

Playwright 1920 视口 dark 主题实测 (5 个典型页):
- Dashboard: 侧栏 rgb(30,41,59), 主区 rgb(15,23,42), 表格 rgb(30,41,59) ✅
- 用户列表 / 应用列表 / 订单列表 / 询价列表: 全部统一深色 ✅
- 之前: elTableBg rgb(255,255,255) 纯白 → 现在: rgb(30,41,59) 暗 surface
- 文字、badge、按钮、分页器、搜索条全部 dark 适配

不动调色板 (按用户要求 严重问题优先): --border/--ink-2 等保持原值
2026-07-09 17:22:12 +08:00
Sisyphus
bae319fe98 feat(F006-W17.6): 服务商品页 PageHeader 加 SKU 总数 (type=2) 2026-07-09 17:11:43 +08:00
Sisyphus
8116e04291 feat(F006-W17.6): PageHeader 加 SKU 总数显示 (实物商品页 sub 改为 共 N 个商品, M 个SKU) 2026-07-09 16:44:17 +08:00
Sisyphus
c34035434a fix(F006-W17.8.3): openapi/app 隐藏权限范围列 + 操作列加宽到 220
用户反馈: 隐藏权限范围列, 操作列加宽

列宽重新分配 (1920 视口, 8 列, 表格 1630px 撑满):
- 删除 权限范围列 (scopes, minWidth 160)
- 应用名称 minWidth 180 → 220 (吸收差额 60px)
- 操作列 width 160 → 220 (加宽 60px, 给重发二维码+⋯ 充足空间)
- 其他列保持不变

实测 (Playwright):
- 客户名 260 / 应用名称 380 / AppID 240 / 调用次数 100
- 状态 90 / 创建时间 170 / 最后调用 170 / 操作 220
- 总列宽 1630px, 右边距 29px (与参考页用户列表一致)

操作列按钮完整性:
- 行 0 (已撤销): [详情, 删除] ✅
- 行 1/2 (已激活): [详情, 重发二维码] + ⋯ ✅
2026-07-09 16:20:11 +08:00
Sisyphus
d4441c051e fix(F006-W17.8.2): openapi/app 列宽优化 (AppID 缩到 240 + 操作列 160 + 加 2 业务列)
用户反馈: AppID 列右侧留白太多, 操作列窄按钮显示不全

列宽重新调整 (Playwright 1920 视口实测):
- 客户名 minWidth 150 → 150 (内容 14 字符, 实际 215px)
- 应用名称 minWidth 180 → 180 (内容 19 字符, 实际 257px)
- AppID minWidth 200 → width 240 + showOverflowTooltip (硬性不被内容撑大)
- 新增 权限范围列 (scopes, minWidth 160) - 真实业务字段
- 新增 调用次数列 (totalCallCount, width 100) - 真实业务字段
- 状态 width 100 → 90
- 创建时间 width 170
- 最后调用 width 170 (新增列)
- 操作 width 200 → 160 + fixed right + align center

实测列宽 (1920 视口, 表格 1630px 撑满):
- 客户名 215 / 应用名称 257 / AppID 240 / 权限范围 228
- 调用次数 100 / 状态 90 / 创建时间 170 / 最后调用 170 / 操作 160
- 9 列共 1630px, 右边距 29px (项目标准)

操作列按钮完整性:
- 行 0 (已撤销): [详情, 删除] ✅
- 行 1/2 (已激活): [详情, 重发二维码] + ⋯ ✅

新加 2 个真实业务列 (权限范围/调用次数) 充实表格, 避免列过少
2026-07-09 16:06:54 +08:00
Sisyphus
d4cda618b8 fix(F006-W17.8.1): 表格撑满容器 (1920 视口)
用户反馈: 集成管理-应用列表 (openapi/app) 在 1920 视口下右侧大面积留空,
操作列按钮显示不全。参考用户列表 (图二) 已撑满做统一标准。

根因 (W17 早期遗留):
- .rr-openapi-app { max-width: 1400px } 锁死容器宽度
- 适合 1440 视口, 但 1920 视口暴露问题
- 用户列表用 .rr-page { max-width: 100% } 早已不受限

修法 (统一标准):
- openapi/app .rr-openapi-app { max-width: 1400px } → 100%
- DataTable 组件增强: 加 tableRef + lastColMinWidth 状态
  * mounted/resize/data 变化时测量: 容器宽 vs 列总宽
  * 差额自动加到最后一列 minWidth (统一标准: 视口撑满)
  * 即使其他页面 max-width 仍写 1400px, 也能通过 JS 撑满

W17.8 列宽调整 (W17.8 已 commit, 现 +W17.8.1):
- 应用名称 minWidth 180 → 220
- AppID minWidth 220 → 240
- 新增最后调用列 (lastUsedAt, width 170)
- 操作列 width 140 → 160 + align: center + fixed: right

Playwright 1920 视口实测:
- 用户列表 (参考): 1632px 表格 / 28px 右边距 ✅
- 应用列表 (修后): 1630px 表格 / 29px 右边距 ✅ (与参考页一致)

操作列按钮完整性:
- 行 0/2/3 (status=0/1): [详情, 重发二维码] + ⋯ ✅
- 行 1 (status=2): [详情, 删除] (无⋯, 符合规则) ✅
2026-07-09 15:33:42 +08:00
Sisyphus
458adb15af fix(F006-W17.8): openapi/app 表格撑满 + 操作列按钮完整显示
用户反馈: 应用列表表格不撑满 + 操作列按钮显示不全
对比参考页 (用户列表) 修复:

列宽调整 (参考 RoleListView/UserListView 列宽方案):
- 应用名称 minWidth 180 → 220 (让列总宽超过容器, el-table 自然撑满)
- AppID minWidth 220 → 240 (增加密度)
- 新增最后调用列 (lastUsedAt, width 170) - 真实业务字段, 表格更充实
- 操作列 width 140 → 160 + align: center + fixed: right
  * 加宽 20px 给重发二维码 + ⋯ 留出空间
  * fixed: right 避免 el-table 重排时把操作列挤压到中间
  * align: center 跟其他列 (W17.7) 表头居中保持一致

测量对比 (1440 视口, 左菜单 260 + 主区 padding 28x2 = 316 可用):
- 用户列表 (参考):  表格 1152px, 右边距 28px
- openapi/app (修后): 表格 1150px, 右边距 29px → 视觉一致 ✅

操作列按钮完整性 (Playwright 实测):
- 行 0/2 (status=0/1): [详情, 重发二维码] + ⋯ (4按钮前2+⋯) ✅
- 行 1 (status=2):    [详情, 删除] (1按钮无⋯) ✅
2026-07-09 15:22:41 +08:00
Sisyphus
87e278749b style(F006-W17.7): list 页表头统一居中显示
- DataTable 组件 header-cell-style textAlign: left → center (覆盖大多数 list 页)
- 3 个裸 el-table list 页补 header-cell-style (categoryGood/region/coupon)
- 单元格内容对齐不变 (仍 left), 只动表头
2026-07-09 14:56:31 +08:00
Sisyphus
2f7ec67903 refactor(F006-W17.6.1): TableActions 按数量自动收纳 (≤3 全显示, >3 前2+⋯)
用户反馈: 操作列只显示一个文字按钮+⋯ 不方便, 期望按按钮数量智能显示
- 过滤 when 后 ≤3 个: 全部显示文字按钮, 不显示 ⋯
- 过滤 when 后 ≥4 个: 前 2 个常驻文字按钮 + ⋯ (收纳剩余)
- 默认 visibleCount=2 (可配置)

TableActions API 调整 (W17.6 → W17.6.1):
- 原来: :primary=[A] + :more=[B,C,D] (人为主次划分)
- 现在: :actions=[A,B,C,D] (按数组顺序自动前 2 显 + ⋯)

16 文件改动 (1 组件 + 15 view 调用方式):
- 15 view 合并 :primary/:more → :actions
- 3 按钮页 (10 个): 现在全部显示文字按钮无 ⋯, 体验更直接
- 4/5 按钮页 (5 个): 前 2 显 + ⋯, 比之前详情+⋯更直观
2026-07-09 13:55:34 +08:00
Sisyphus
cb2790d318 refactor(F006-W17.6): 操作列主次分离 (15 个 list 页 + TableActions 组件)
- 新建 TableActions 通用组件 (src/components/TableActions/, ~120 行)
  * primary 常驻主操作 (el-button text)
  * more 次操作收进 ⋯ el-dropdown (MoreFilled 触发)
  * label/type 支持 string 或函数 (覆盖动态: 上架/下架, 禁用/启用)
  * when 条件渲染 (替代散落各处的 v-if)
  * danger 项自动 divided + 红字
  * 复用 global-popper.scss 已铺好的 el-dropdown 主题

- 15 个按钮≥3 的 list 页改造 (按钮≤2 的 27 页不动):
  5 按钮: GoodListView/ServiceGoodListView/CouponListView
  4 按钮: OrderListView/OpenAppListView
  3 按钮: user/UserListView/CompanyAccountListView/LabelListView/
          ScheduleListView/sys/UserListView/EnterpriselevelListView/
          OrderCommentListView/PromoterListView/CategoryGoodListView/
          RegionListView

- 列宽统一 240/280/220/200/320 → 140 (固定窄列)
- 清理 4 个 rr-actions 页不再使用的 .rr-actions/.rr-actions__sep 样式
- 业务逻辑全保留 (onClick 函数/二次确认/条件渲染逻辑)
- OrderListView 退款条件修正: [1,2,3,4].includes → ===4 (原 v-else-if 链语义)
2026-07-09 12:08:48 +08:00
Sisyphus
557db07231 refactor(F006-W17.5): 3 个日志页标准化 (LogError/LogLogin/LogOperation 套 PageHeader+SearchBar)
- 最后 3 个老写法 list 页收尾, 全部 list 页风格 100% 统一
- rr-page-header div -> <PageHeader> 组件
- rr-filters-row div + el-input -> <SearchBar> 组件 (fields 配置)
- DataTable 加 :page-sizes=[10,20,50,100] (W17.3.7 统一规范)
- limit 默认 20 -> 10 (W17.3.6 pager 字号统一)
- 清理不再使用的老 style class (rr-page-*/rr-filters-row/rr-*-input)
- 业务逻辑全保留 (method tag/status 映射/详情弹窗/errorInfo 预览)
2026-07-09 11:07:19 +08:00
Sisyphus
a36dda7ccc fix(F006-W17.4.6): UserFormDialog 关联企业下拉改从 user/user/page 聚合
用户反馈: 关联企业的下拉框是空的

排查:
1. nginx-vue.conf 加 /enterprise/ location (W17.4.5) ✅
2. gateway.json 加 enterprise 路由 + 推 nacos ✅
3. 但 gateway 启动时 bootstrap.yml 没订阅 gateway.json dataId
   (bootstrap.yml 只订阅 datasource.yaml + common.yaml + gateway-server.yaml/-dev.yaml)
   gateway.json 仅供运维手工管理, 实际不参与路由
4. /enterprise/list 在 user-server 也 404 (jar 是旧版本, ApiEnterpriseController
   @RequestMapping 路径未生效)

修法: 前端从 /user/user/page 拉用户列表聚合 (enterpriseId, enterpriseName) 去重
- 端点 100% 可用 (已在 W11 验收过 2284 用户)
- 字段 enterpriseId + enterpriseName 已在 user 表
- 聚合 Map<id, name> 去重, 按 id 排序
- 弹窗打开时拉一次缓存, 后续复用

nginx /enterprise/ location + gateway.json 路由保留: future-proof,
等后端 jar 重打包后会自动生效

前端聚合方式短期可行, 但仅用于下拉选项场景;
如要真正查询某企业的所有用户等场景, 仍需后端打 jar 暴露 /enterprise/page
2026-07-08 11:15:47 +08:00
Sisyphus
25a0db5cb2 refactor(F006-W17.4.5): UserFormDialog 去备注 + 去tip + 配合 nginx /enterprise/ 修复
用户原话:
- 关联企业的下拉框是空的, 需要带出来平台注册的企业信息
- 下面的备注去掉, 这个字段是关联企业的选择, 并不是修改企业认证状态的选项

理解:
- 用户原意是去掉"关联企业"字段下的 tip 文字 (我之前误写"由企业认证流程自动带过来..." 给用户误导)
- 同时去掉"备注"字段 (业务上不需要)
- 关联企业下拉空是因为 nginx 没配 /enterprise/ location → 404

修法:
1. nginx-vue.conf 加 /enterprise/ 走 user-server (ApiEnterpriseController 在 renren-user-server)
   备份: nginx-vue.conf.bak-20260708-105000
   重启: docker compose restart frontend (改 nginx 必须 restart, nginx -s reload 不生效 - W3xC P1 已记)
2. UserFormDialog 去掉"备注"字段 (form.remark / payload / 表单项 / style)
3. UserFormDialog 去掉 tip 文字 "由企业认证流程自动带过来..."
4. 保留"关联企业"单选下拉 + 弹窗打开时 /enterprise/list 拉取

新建后保存关联关系:
- POST /user/user/save payload 含 enterpriseId 字段
- 后端 save 接口吃 UserDTO, UserDTO 含 enterpriseId
- save 成功 → tb_user 表 enterprise_id 字段写入
- 下次加载该用户 getUserInfo 时 enterpriseId 回显
- 关联关系保存已确认落库
2026-07-08 10:58:39 +08:00
Sisyphus
ec473af046 refactor(F006-W17.4.4): UserFormDialog 优化 (去头像URL + 去是否企业认证 + 加关联企业)
用户原话: 新增用户界面部分内容要优化
- 头像 URL 字段去掉 (UI 无意义, 用户用默认头像)
- 是否企业认证 去掉 (这个由企业认证流程带过来, 不是手工字段)
- 增加关联企业字段 (可以选择用户属于哪些企业 - 多选)

实施:
- 单选 enterpriseId (当前 tb_user 表只支持单值, 真多对多需后端新增 user_enterprise_bind 中间表, 待用户决策)
- 企业下拉从 /enterprise/list 拉取, 弹窗打开时拉一次缓存
- 字段名沿用后端 UserFeignDTO.enterpriseId (认证企业id)

CRUD 验证 (SQL 直查 product_network_user.tb_user):
- 当前 2284 用户, 2283 正常 + 1 禁用, max_id 2318 (前后端完全一致)
- 后端 login() 在 enabled=1 时抛 "账号已被禁用" (UserServiceImpl.java 行 142)
  → 禁用会阻止登录, 已确认
- save/update/delete 三个端点都直接走 MyBatis-Plus baseDao, 改完即落库
  → 新增/禁用/删除真实写库, 已确认

修改:
- UserFormDialog.vue 234 → 294 行
- 去 header, isEnterprise 字段
- 加 enterpriseId (关联企业) 单选下拉 + enterpriseOptions 缓存
- 加关联企业下拉 tip 提示用户此字段语义
2026-07-08 10:49:47 +08:00
Sisyphus
a978b1572b fix(F006-W17.4.3): 单位列 width 70 → 90 + minWidth 90 (列宽足够)
用户反馈: 单位列"单/位"两字换行
- DataTable 已全局强制表头不换行 (W17.4.2)
- 单位列实际 width 70 太窄, 即使 nowrap 也撑不下"单位"两字
- 加宽到 90 + minWidth 90 兜底
2026-07-07 18:40:11 +08:00
Sisyphus
04728fb7a6 refactor(F006-W17.4.1): 商品/服务页列宽精细化 + 删审核意见列
用户原话:
- 商品ID 宽度太多 → 140 缩到 100
- 商品名称/服务名称 列再加宽一些 → minWidth 240 加到 320 (业务核心, 最长字段)
- 分类列调窄一些 → GoodListView minWidth 240 缩到 180 (3 级合并后 180 足够)
- 单位的标题不应该换行 → width 80 + minWidth 80 (DataTable 已有 whiteSpace: nowrap)
- 审核意见列不用在列表中展示 → 整列删除 (详情弹窗内可看)

改动:
- GoodListView columns 11 列 → 10 列
- ServiceGoodListView columns 12 列 → 11 列
- 整体宽度收敛给商品/服务名称 (核心信息)
2026-07-07 18:34:37 +08:00
c69fa216f8 feat(F006-W17.4): UserListView 新建/修改/导出 完整化
- 新增 UserFormDialog.vue (新建+修改共用弹窗)
  字段: 昵称/手机号/密码/头像/性别/企业认证/禁用标识/备注
  新建: POST /user/user/save
  修改: GET /user/user/getUserInfo 回填, POST /user/user/update
- 新建按钮: 顶部 + 新建用户 → 打开弹窗(空表单)
- 修改按钮: 操作列 修改 → 打开弹窗(回填)
- 导出按钮: 顶部 导出 → 调 GET /user/user/export (Excel 流, 自动下载)
  带当前搜索条件, 后端响应头 filename 自动识别
2026-07-07 18:31:54 +08:00
Sisyphus
9664b3d954 refactor(F006-W17.4): 实物/服务商品页套 PageHeader+SearchBar+ListTabs+DataTable 标准化
用户原话: 按照同样的列表页面的UI规范, 调整实物商品/服务商品的页面样式

实物商品 GoodListView (547→564 行):
- 顶部 rr-page-header 改用 <PageHeader title="商品管理" :sub="..."> 包导出/新增按钮
- 裸 el-form 搜索改用 <SearchBar :fields=[title, enterpriseName]>
- 裸 .rr-tabs-row/.rr-tabs 改用 <ListTabs> (4 状态 tab, count pill)
- 裸 el-table + el-pagination 改用 <DataTable> (:borderless + :page-sizes)
- 操作列 5 个 el-button 改用 el-link + 分隔符, 不再换行
- 新增 checkStats reactive (pending/approved/rejected) 跟 tab 解耦
- 新增 loadStats() 并发拉 3 个状态的 total, stats 与 tab 解耦
- tabItems 全部 = pending+approved+rejected (跨 tab 一致)
- onSearch/onReset/toggleEnabled 并发刷 list + stats

服务商品 ServiceGoodListView (308→352 行):
- 已经有 PageHeader/SearchBar, 补 ListTabs + DataTable + el-link 操作列
- 同样的 checkStats + loadStats (跨 tab 一致)
- 表格所有列改为 slot 透传
- 价格列 / 铺货 / 状态 都有 slot

保留业务独有:
- 详情弹窗 (含 SKU 子表 for 实物商品)
- 审核弹窗 (单个/批量)
- 修改分类弹窗 (单个/批量)
- 批量操作栏 (业务独有, 业务 page 才用)
- el-table selection 列 (DataTable 内置支持)
2026-07-07 18:27:42 +08:00
Sisyphus
296ba6a966 fix(F006-W17.3.10): UserListView "全部" count = 正常+禁用 (跨 tab 一致)
用户反馈: 切已禁用 tab 后, 顶部全部数字变成 1 (跟当前 tab 过滤后的 total 走)
期望: 全部 = 正常 + 禁用, 三个 tab 看到的数字一致

根因: tabItems 的 all 用 total.value, 而 total 是当前 tab 后端返的分页总数
       (已禁用 tab 下, total=1 因为只有 1 条禁用用户)

修法:
- tabItems.all count = enabledStats.normal + enabledStats.disabled (跨 tab 一致)
- PageHeader sub 也改成 enabledStats.normal + enabledStats.disabled (跟搜索条件关联)
- 三个 tab 看到的数字自然一致: 2284 = 2283 + 1
2026-07-07 17:18:19 +08:00
Sisyphus
a1336fe9b7 fix(F006-W17.3.9): UserListView stats 与 tab 解耦 (跨 tab 全量计数一致)
用户反馈: 切 tab 时"正常/已禁用"两个统计数会变化 (全部 10/0, 正常 10/0, 已禁用 0/1)
期望: stats 是全量统计, 切 tab 不应变化

根因: enabledStats 是在 load() 内"基于当前页 10 条结果"累加, 切 tab 后数据不同, stats 跟着变

修法:
- 拆 load() → loadList() + loadStats()
- buildSearchParams(): 排除 enabled (tab) 的搜索参数 (userId/nickName/mobile/isEnterprise/enterpriseName)
- loadStats(): 并发拉 enabled=0/1 的 page=1&limit=1, 用 resp.total 当 stats (后端只 count 不返列表, 开销可忽略)
- onTabChange: 只调 loadList(), stats 不重算
- onSearch/onReset/onPageChange/onLimitChange/toggleEnabled: 调 load() (并发刷 list + stats)

效果: 三个 tab 看到的正常/已禁用计数一致 (因为跟 tab 解耦, 只跟搜索条件关联)
2026-07-07 17:14:11 +08:00
Sisyphus
5a7adb9075 fix(F006-W17.3.8): UserListView enabled 语义反转 (后端 0=正常 1=禁用)
用户反馈: 切 tab 时全部(2284) vs 已禁用(2283) vs 正常(1) 数据不一致
根因: 后端 /user/user/page 接口 enabled 字段语义 0=正常 1=禁用, 但前端 UI label 与字段值反了:
- 切"正常" tab 发 enabled=1 (后端当禁用查) → 只返 1 条
- 切"已禁用" tab 发 enabled=0 (后端当正常查) → 返 2283 条
- enabledStats 计数 filter 与 UI 标签反
- el-tag 颜色: enabled===1 显示绿色正常 (反了)
- toggleEnabled: 当前 1 改为 0 (方向反了)
- 操作按钮: enabled===1 显示禁用 (凑巧对了但跟实际语义反)

修法: 保留后端字段值, 把前端 UI 判断全部对齐后端语义 (0=正常 1=禁用)
- onTabChange: normal → enabled=0, disabled → enabled=1
- enabledStats.normal = filter === 0, disabled = filter === 1
- el-tag: === 0 绿色正常, === 1 红色禁用
- 操作按钮: === 0 显示禁用(橙色), === 1 显示启用(绿色)
- toggleEnabled: row.enabled===0 → next=1 (禁用), === 1 → next=0 (启用)
2026-07-07 17:09:42 +08:00
Sisyphus
4b77d67dc2 fix(F006-W17.3.7): list 页统一规范 (:borderless + :page-sizes) + product/shop redirect
- 33 个 ListView.vue 加 :borderless=true + :page-sizes=[10,20,50,100]
  覆盖: order/inquiry/finance/operateguide/sys/Dept|Menu|File|Notice|
        Params|User|Role|Post|DictType|DictData|Product|Schedule|RoleGroup
        user/Enterprise|enterpriselevel|enterprisescore|enterpriserating
        supplier/promoter|couponscope|historylog|logistics|ordercomment|Activity
        other/goodunit|label|textconfig
        api/feedback|help|lunbo
        openapi/AuditLog|CompanyAccount
- OrderListView: columns 抽到 script setup (computed) + :borderless +
  :page-sizes + sub 动态显示选中数
- router/index.ts: /product/shop → redirect /supplier/good
  (删 src/modules/product/shop/ShopListView.vue 旧占位, 后端 404 无意义)
- 沿用 W17 设计规范 v2 (PageHeader+SearchBar+DataTable+ListTabs)
2026-07-07 16:54:37 +08:00
Sisyphus
79e039c975 fix(F006-W17.3.4): UserListView + OperateguideListView 补上 @limit-change 监听, 修复每页多少条不刷新 2026-07-07 16:01:33 +08:00
Sisyphus
f97a0fb049 feat(components): 设计细节优化 (表格圆角/按钮尺寸统一/扁平阴影) W17.2.2 2026-07-07 13:07:22 +08:00
Sisyphus
fe07612f29 feat(components): 按 ui-preview-v2.html 模板 v2 整改 (PageHeader扁平/SearchBar无label/ListTabs pill/Table uppercase左对齐) W17.2.1 2026-07-07 13:02:07 +08:00
Sisyphus
7724b4a3b1 feat(components): 通用组件设计规范整改 (ListTabs/PageHeader白卡/SearchBar chip/DataTable var/Content bg) W17.2 2026-07-07 12:56:11 +08:00
Sisyphus
5c35297555 feat(user): 整改 UserListView 符合设计规范 (列宽/操作列 el-link/竖线分隔) W17.1.1 2026-07-07 12:50:20 +08:00
Sisyphus
9c75bd53c4 feat(user): 完整化用户列表 (9 列 + 6 搜索 + 4 操作, 老 vue 等价) W17.1 2026-07-07 11:58:59 +08:00
Sisyphus
c3295c3f57 fix(auth): 移除登录请求 client: front 头,恢复 captcha 校验 (W15.1.5) 2026-07-07 11:43:36 +08:00
Sisyphus
675d27dd2f fix(F006-W17): nginx proxy_hide_header WWW-Authenticate 去除浏览器原生认证弹窗
根因: Spring Security /auth/oauth/token 401 响应带 WWW-Authenticate: Basic realm="oauth2/client"
浏览器拦截该响应头后弹出原生 HTTP Basic Auth 对话框("身份验证"),
在 axios/JS 处理响应之前就触发,前端代码无法拦截.

修法: nginx-vue.conf /auth/ location 加 proxy_hide_header WWW-Authenticate;
同时 PlaceholderView/AppLayout fetch 调用加 credentials: omit 兜底.

验证: curl 测试 401 响应已无 WWW-Authenticate 头,登录流程不再触发浏览器弹窗.
2026-07-07 11:03:15 +08:00
Sisyphus
4b4625df9f feat(F006-W16): 7 supplier 子页 + 3 enterprise 子页 接前端 max-effort mock 2026-07-07 10:22:09 +08:00