feat(address): 修复默认地址唯一性并新增用户浏览记录功能
- 后端新增 clearDefault 方法,保存默认地址前清除其他默认状态,避免多默认地址 - 前端地址编辑页保存成功后若为默认,调用 setDefaultAddress 触发后端清理逻辑 - useAddress hook 加入 ensureSingleDefault,前端保证地址数据中只有一个默认地址 - 新增 shop_goods_browse 表及相关实体、Mapper、服务和控制器,实现用户商品浏览记录功能 - 商品详情页接入浏览记录上报,支持登录用户浏览记录服务端同步 - 浏览历史页支持登录用户服务端分页查询,未登录用户使用本地存储兜底 - 浏览历史页支持浏览记录单条删除、清空、上拉加载和下拉刷新功能 - 调整用户中心入口,恢复浏览历史菜单项显示 - 文档和内存文件更新,包括数据库建表 SQL、接口定义和项目编译说明
This commit is contained in:
@@ -78,3 +78,41 @@
|
||||
- province/city/region: 广西壮族自治区/南宁市/西乡塘区 ✓
|
||||
- address: 西乡塘街道大学东路9号瀚林御景3栋1单元1101号房 ✓(街道+详细地址完整保留)
|
||||
- 项目 type-check (`npx tsc --noEmit`) 无报错
|
||||
|
||||
## 修复默认地址唯一性 bug
|
||||
- 问题:新增/编辑地址时勾选"设为默认"后,后端直接保存 `isDefault=true`,不清除其他地址的默认状态,导致出现多个默认地址
|
||||
- 后端修复(`/Users/gxwebsoft/JAVA/guilixu-java`,3 个文件):
|
||||
1. `ShopUserAddressService.java` — 新增 `clearDefault(userId, excludeId)` 接口方法
|
||||
2. `ShopUserAddressServiceImpl.java` — 实现 `clearDefault`:查询该用户所有 `isDefault=true` 的地址(可排除指定 id),批量设为 false
|
||||
3. `ShopUserAddressController.java` — `save()` 新增时若 `isDefault=true` 先调 `clearDefault(userId, null)`;`update()` 编辑时若 `isDefault=true` 先调 `clearDefault(userId, id)` 排除当前地址
|
||||
- 前端修复(`src/pages/user/address-edit.tsx`):
|
||||
- 保存成功后若 `isDefault=true`,再调一次 `setDefaultAddress(savedId)` 触发后端清理逻辑(双重保险)
|
||||
- 新增时从返回结果中提取 savedId
|
||||
- 修复 `getShopUserAddress` 返回值类型断言(`as ShopUserAddress`)
|
||||
- 前端渲染兜底(`src/hooks/useAddress.ts`):
|
||||
- `loadAddresses` 中加 `ensureSingleDefault` 工具函数:若后端返回多个 `isDefault=true`,只保留 createTime 最早的为默认,其余置 false
|
||||
- 后端 Maven 编译命令:`"/Applications/IntelliJ IDEA Ultimate.app/Contents/plugins/maven/lib/maven3/bin/mvn" compile`(guilixu 的 mvnw 损坏,用 IntelliJ 自带 Maven)
|
||||
- 编译结果:成功无报错
|
||||
- 注意:之前误改了 paopao-java 和 websopy-java 两个项目(已废弃),正确后端是 guilixu-java
|
||||
|
||||
## 用户商品浏览记录功能(全栈实现)
|
||||
- 需求:后台记录用户浏览商品的痕迹
|
||||
- 方案:去重累加模式(同一用户+商品只留一条,visit_count 累加,5分钟内去重防刷)
|
||||
- 后端(`/Users/gxwebsoft/JAVA/guilixu-java`,7 个文件 + 1 SQL):
|
||||
1. `sql/shop_goods_browse.sql` — 建表 SQL(含3个索引:uk_user_goods 唯一 / idx_user_time / idx_goods_time)
|
||||
2. `ShopGoodsBrowse.java` — Entity(参照 ShopGoodsFavorite 范式,含 visitCount/lastVisitTime/browseSource + 关联商品快照字段)
|
||||
3. `ShopGoodsBrowseParam.java` — 查询参数(merchantId 用 Long 与 BaseParam 一致,含 startTime/endTime 时间范围)
|
||||
4. `ShopGoodsBrowseMapper.java` + XML — Mapper(关联 shop_goods 表查询商品名称/图片/价格)
|
||||
5. `ShopGoodsBrowseService.java` + Impl — Service(核心 recordBrowse 去重累加逻辑:查已有→5分钟内忽略/超过则累加→首次插入)
|
||||
6. `ShopGoodsBrowseController.java` — Controller(POST 上报 / GET page 我的足迹 / DELETE 删单条 / DELETE 清空 / GET admin/page 后台查询)
|
||||
- 前端(`xinlong-shop-taro`,4 个文件):
|
||||
1. `src/api/shop/shopGoodsBrowse/model/index.ts` — ShopGoodsBrowse + ShopGoodsBrowseParam 类型
|
||||
2. `src/api/shop/shopGoodsBrowse/index.ts` — reportBrowse(静默)/pageBrowseHistory/deleteBrowseRecord/clearBrowseHistory
|
||||
3. `src/pages/shop/product-detail.tsx` — addToHistory() 已登录时异步调 reportBrowse 上报
|
||||
4. `src/pages/user/history-list/index.tsx` — 改为服务端分页(登录)/ 本地兜底(未登录),支持删除单条、清空、上拉加载
|
||||
5. `src/pages/user/user.tsx` — 恢复浏览历史入口(取消注释)
|
||||
- 编译验证:后端 Maven compile 成功;前端 tsc --noEmit 无新增类型错误
|
||||
- 编译踩坑:BaseController.success() 有 success(IPage<T>) 重载,泛型方法返回类型用 ApiResult<?> 避免 fail() 分支类型不兼容
|
||||
- 待执行:数据库需手动执行 `shop_goods_browse.sql` 建表
|
||||
- 后续可选:后台管理页面(`/Users/gxwebsoft/VUE/guilixu-admin`,Vue3+AntD Vue)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user