fix(api): 修复专区白名单和商品移除假成功问题

- 调整 .env.development 中 VITE_API_URL 配置为正式接口地址
- 修复 ShopGoods.sectionIds 字段更新时 null 被忽略导致移除专区商品假成功问题
- 通过 UpdateWrapper 显式设置 section_ids 字段避免 MyBatis-Plus 全局更新策略影响
- 补充后端下单接口白名单强校验,防止绕过前端受限专区限制
- 澄清买家用户体系为 sys_user,确认白名单弹窗使用 pageUsers 数据源正确
- 删除白名单弹窗 isStaff 限制,白名单覆盖所有 sys_user 用户
- 记录专区白名单功能设计与实现细节,明确前后端联动机制
- 提示“专区管理”菜单入口需后端菜单表动态下发,确保后台导航可见
This commit is contained in:
2026-08-17 02:00:05 +08:00
parent 4a7b217c2b
commit f986efce8c
3 changed files with 45 additions and 2 deletions
+15
View File
@@ -65,3 +65,18 @@
- 下单校验 `DeliveryRegionChecker``regionIds` 直接生效(regionMode=2 为不发货黑名单)。
- ⚠️ 教训:第一版误用 `provinceIds`/`cityIds` 字段名,与后端 `regionMode`/`regionIds` 不匹配,MyBatis-Plus 自动忽略未知字段导致"没存"。改字段名对接即可,不必新增后端字段。
### 专区白名单用户体系(2026-08-17 用户确认澄清)
- **结论:本项目买家(小程序用户)就是 `sys_user` 体系,不存在用户体系错配。** 之前怀疑"pageUsers(sys_user) vs 小程序买家(shop_user) 错配"是误判——`pageShopUser`(@/api/shop/shopUser) 在本项目实际不用/返回为空。
- 白名单弹窗 `UserSelectModal.vue``pageUsers`(@/api/system/user`sys_user`) 选用户是**正确**的;存到 `shop_home_section_user.user_id` 与下单校验 `checkPermission` 用的 `getLoginUser().getUserId()` 同体系,能正确匹配。
- 8-16 已去掉 `isStaff:true` 限制,白名单搜索覆盖全部 sys_user 用户(不局限于后台员工)。
- ⚠️ 不要再把白名单弹窗数据源改成 pageShopUser(用户明确说 pageShopUser 没用)。
- **后端下单白名单强校验(2026-08-17 已补)**`OrderBusinessService.createOrder` 新增 `validateSectionPermissionIfNeeded(request, shopOrder, loginUser)`,遍历订单商品的 `section_ids` 找受限专区(restricted=1),校验下单用户是否在 `shop_home_section_user` 白名单,不在则抛 "该商品属于受限专区,仅限指定白名单用户购买"。这是前端 `check-permission` 的后端兜底,防直接调下单接口绕过。
- 前端 guilixu-taro `pages/shop/checkout.tsx` 已调用 `check-permission` 做前端拦截(受限专区强制余额/block)。
- **当前状态:专区白名单功能完整可用**(前端拦截 + 后端兜底)。另:专区管理菜单入口由后端菜单表下发(动态路由),若后台左侧导航看不到"专区管理",仍需在后端菜单表补一条记录(component=special/zone, tenant_id=10606)。
### ⚠️ ShopGoods.sectionIds 字段更新陷阱(MyBatis-Plus 字段策略)
- `ShopGoods.sectionIds``@TableField(updateStrategy)`,走全局默认 `NOT_NULL`application.yml 未配 `update-strategy`)。
-`updateById`/`updateBatchById``section_ids` 设为 `null`(清空所属专区)时,MP **忽略该 null 字段、不生成 SET**,表现"更新成功但库未变"(假成功)。
- **正确做法**:清空/置空场景改用 `UpdateWrapper.set("section_ids", newVal)` 显式 setnewVal 可 null),绕过字段策略。
- 已修复点:`ShopHomeSectionController.addGoods`/`removeGoods`(2026-08-17)改用此模式。同项目其它"置空某字段"的更新都要警惕此坑。