From d994e91883c8886831fb643066d05070df3e94b0 Mon Sep 17 00:00:00 2001 From: pbvfus8to <480171784@qq.com> Date: Wed, 18 Dec 2024 10:40:17 +0800 Subject: [PATCH] Update AddrController.java --- .../shop/api/controller/AddrController.java | 117 +++++++++++++++--- 1 file changed, 97 insertions(+), 20 deletions(-) diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java index 739cd7e..6e64836 100644 --- a/yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java @@ -31,6 +31,8 @@ import java.util.Date; import java.util.List; /** + * 地址相关接口的控制器类,用于处理与用户地址相关的各种操作请求,例如获取地址列表、新增地址、修改地址、删除地址、设置默认地址以及获取单个地址信息等。 + * * @author lanhai */ @RestController @@ -39,120 +41,195 @@ import java.util.List; @AllArgsConstructor public class AddrController { + // 自动注入用户地址服务层接口,通过该接口调用具体的业务逻辑方法来处理用户地址相关业务 @Autowired private UserAddrService userAddrService; /** - * 选择订单配送地址 + * 获取用户地址列表的方法,用于选择订单配送地址时展示所有可用的用户地址。 + * 通过查询数据库,获取当前用户的所有地址信息,并按照是否为常用地址以及更新时间进行降序排序,最后将查询到的地址信息转换为对应的 DTO 类型返回给前端。 + * + * @return 包含用户地址信息列表的 ServerResponseEntity,其中地址信息以 UserAddrDto 类型封装,方便前端展示和使用。 */ @GetMapping("/list") - @Operation(summary = "用户地址列表" , description = "获取用户的所有地址信息") + @Operation(summary = "用户地址列表", description = "获取用户的所有地址信息") public ServerResponseEntity> dvyList() { + // 获取当前用户的 ID,用于筛选属于该用户的地址记录 String userId = SecurityUtils.getUser().getUserId(); - List userAddrs = userAddrService.list(new LambdaQueryWrapper().eq(UserAddr::getUserId, userId).orderByDesc(UserAddr::getCommonAddr).orderByDesc(UserAddr::getUpdateTime)); + // 使用 MyBatis Plus 的 LambdaQueryWrapper 构建查询条件,查询当前用户的所有地址信息,并按照常用地址和更新时间降序排序 + List userAddrs = userAddrService.list(new LambdaQueryWrapper() + .eq(UserAddr::getUserId, userId) + .orderByDesc(UserAddr::getCommonAddr) + .orderByDesc(UserAddr::getUpdateTime)); + // 使用 Hutool 的 BeanUtil 将查询到的 UserAddr 类型的地址列表转换为 UserAddrDto 类型列表,方便返回给前端展示 return ServerResponseEntity.success(BeanUtil.copyToList(userAddrs, UserAddrDto.class)); } + /** + * 新增用户地址的方法,接收包含地址信息的 AddrParam 对象,进行一系列验证和设置后将新地址保存到数据库中,同时处理默认地址缓存相关逻辑。 + * 如果传入的地址 ID 不为空且不为 0,则认为该地址已存在,返回相应的错误提示信息;若用户当前没有地址记录,则新增的地址设置为默认地址;否则设置为非默认地址, + * 最后保存地址信息到数据库,并根据是否为默认地址决定是否清除默认地址缓存,成功保存后返回成功提示信息给前端。 + * + * @param addrParam 包含要新增的用户地址信息的参数对象,通过请求体传入,且经过了参数验证(@Valid 注解) + * @return 包含操作结果提示信息的 ServerResponseEntity,成功则返回 "添加地址成功",地址 ID 不符合要求则返回相应错误提示。 + */ @PostMapping("/addAddr") - @Operation(summary = "新增用户地址" , description = "新增用户地址") + @Operation(summary = "新增用户地址", description = "新增用户地址") public ServerResponseEntity addAddr(@Valid @RequestBody AddrParam addrParam) { + // 获取当前用户的 ID,用于关联新地址到该用户 String userId = SecurityUtils.getUser().getUserId(); - if (addrParam.getAddrId() != null && addrParam.getAddrId() != 0) { + // 如果传入的地址 ID 不为空且不等于 0,说明该地址可能已存在,返回相应的错误提示信息 + if (addrParam.getAddrId()!= null && addrParam.getAddrId()!= 0) { return ServerResponseEntity.showFailMsg("该地址已存在"); } + + // 统计当前用户已有的地址数量,用于判断是否需要将新地址设置为默认地址 long addrCount = userAddrService.count(new LambdaQueryWrapper().eq(UserAddr::getUserId, userId)); + // 使用 Hutool 的 BeanUtil 将 AddrParam 类型的参数对象转换为 UserAddr 类型,方便保存到数据库 UserAddr userAddr = BeanUtil.copyProperties(addrParam, UserAddr.class); + // 如果当前用户没有地址记录,则将新地址设置为默认地址(常用地址,commonAddr 设为 1) if (addrCount == 0) { userAddr.setCommonAddr(1); } else { + // 否则设置为非默认地址(commonAddr 设为 0) userAddr.setCommonAddr(0); } + + // 设置用户 ID,明确该地址所属的用户 userAddr.setUserId(userId); + // 设置地址状态为有效(这里假设 1 表示有效状态) userAddr.setStatus(1); + // 设置地址的创建时间为当前时间 userAddr.setCreateTime(new Date()); + // 设置地址的更新时间为当前时间 userAddr.setUpdateTime(new Date()); + + // 调用用户地址服务层的保存方法,将新地址信息保存到数据库中 userAddrService.save(userAddr); + + // 如果新地址被设置为默认地址(commonAddr 为 1),则清除默认地址缓存,确保缓存数据的一致性 if (userAddr.getCommonAddr() == 1) { - // 清除默认地址缓存 userAddrService.removeUserAddrByUserId(0L, userId); } + return ServerResponseEntity.success("添加地址成功"); } /** - * 修改订单配送地址 + * 修改用户地址的方法,接收包含更新后地址信息的 AddrParam 对象,先验证地址是否存在,然后更新地址信息到数据库中, + * 同时清除当前地址和默认地址的缓存,确保数据的准确性和缓存的一致性,最后返回修改成功的提示信息给前端。 + * + * @param addrParam 包含要修改的用户地址信息的参数对象,通过请求体传入,且经过了参数验证(@Valid 注解) + * @return 包含操作结果提示信息的 ServerResponseEntity,成功则返回 "修改地址成功",若地址不存在则返回相应错误提示。 */ @PutMapping("/updateAddr") - @Operation(summary = "修改订单用户地址" , description = "修改用户地址") + @Operation(summary = "修改订单用户地址", description = "修改用户地址") public ServerResponseEntity updateAddr(@Valid @RequestBody AddrParam addrParam) { + // 获取当前用户的 ID,用于验证地址是否属于该用户以及后续更新操作 String userId = SecurityUtils.getUser().getUserId(); + // 根据传入的地址 ID 和用户 ID,从数据库中查询对应的用户地址记录,若不存在则返回相应的错误提示信息 UserAddr dbUserAddr = userAddrService.getUserAddrByUserId(addrParam.getAddrId(), userId); if (dbUserAddr == null) { return ServerResponseEntity.showFailMsg("该地址已被删除"); } + // 使用 Hutool 的 BeanUtil 将 AddrParam 类型的参数对象转换为 UserAddr 类型,准备更新到数据库 UserAddr userAddr = BeanUtil.copyProperties(addrParam, UserAddr.class); + // 设置用户 ID,确保更新的是正确用户的地址记录 userAddr.setUserId(userId); + // 设置地址的更新时间为当前时间 userAddr.setUpdateTime(new Date()); + + // 调用用户地址服务层的更新方法,将更新后的地址信息保存到数据库中 userAddrService.updateById(userAddr); - // 清除当前地址缓存 + + // 清除当前地址的缓存,保证缓存数据与数据库最新数据一致 userAddrService.removeUserAddrByUserId(addrParam.getAddrId(), userId); - // 清除默认地址缓存 + // 清除默认地址的缓存,确保默认地址相关数据的准确性 userAddrService.removeUserAddrByUserId(0L, userId); + return ServerResponseEntity.success("修改地址成功"); } /** - * 删除订单配送地址 + * 删除用户地址的方法,根据传入的地址 ID,先验证地址是否存在以及是否为默认地址(默认地址不允许删除), + * 若验证通过则从数据库中删除该地址记录,并清除对应地址的缓存,最后返回删除成功的提示信息给前端。 + * + * @param addrId 要删除的用户地址的 ID,通过路径变量传入 + * @return 包含操作结果提示信息的 ServerResponseEntity,成功则返回 "删除地址成功",若地址不存在或为默认地址则返回相应错误提示。 */ @DeleteMapping("/deleteAddr/{addrId}") - @Operation(summary = "删除订单用户地址" , description = "根据地址id,删除用户地址") - @Parameter(name = "addrId", description = "地址ID" , required = true) + @Operation(summary = "删除订单用户地址", description = "根据地址id,删除用户地址") + @Parameter(name = "addrId", description = "地址ID", required = true) public ServerResponseEntity deleteDvy(@PathVariable("addrId") Long addrId) { + // 获取当前用户的 ID,用于验证地址是否属于该用户以及后续删除操作 String userId = SecurityUtils.getUser().getUserId(); + // 根据传入的地址 ID 和用户 ID,从数据库中查询对应的用户地址记录,若不存在则返回相应的错误提示信息 UserAddr userAddr = userAddrService.getUserAddrByUserId(addrId, userId); if (userAddr == null) { return ServerResponseEntity.showFailMsg("该地址已被删除"); } + + // 如果该地址是默认地址(commonAddr 为 1),则不允许删除,返回相应的错误提示信息 if (userAddr.getCommonAddr() == 1) { return ServerResponseEntity.showFailMsg("默认地址无法删除"); } + + // 调用用户地址服务层的删除方法,从数据库中删除该地址记录 userAddrService.removeById(addrId); + // 清除对应地址的缓存,保证缓存数据与数据库数据的一致性 userAddrService.removeUserAddrByUserId(addrId, userId); + return ServerResponseEntity.success("删除地址成功"); } /** - * 设置默认地址 + * 设置默认地址的方法,根据传入的地址 ID,调用服务层方法将该地址设置为当前用户的默认地址, + * 同时清除默认地址和当前地址的缓存,确保缓存数据与数据库最新状态一致,最后返回修改成功的提示信息给前端。 + * + * @param addrId 要设置为默认地址的用户地址的 ID,通过路径变量传入 + * @return 包含操作结果提示信息的 ServerResponseEntity,成功则返回 "修改地址成功"。 */ @PutMapping("/defaultAddr/{addrId}") - @Operation(summary = "设置默认地址" , description = "根据地址id,设置默认地址") + @Operation(summary = "设置默认地址", description = "根据地址id,设置默认地址") public ServerResponseEntity defaultAddr(@PathVariable("addrId") Long addrId) { + // 获取当前用户的 ID,用于关联默认地址到该用户 String userId = SecurityUtils.getUser().getUserId(); + // 调用用户地址服务层的方法,将指定地址 ID 的地址设置为当前用户的默认地址 userAddrService.updateDefaultUserAddr(addrId, userId); + // 清除默认地址的缓存,保证缓存数据与数据库最新数据一致 userAddrService.removeUserAddrByUserId(0L, userId); + // 清除当前设置为默认地址的地址缓存,确保相关数据准确性 userAddrService.removeUserAddrByUserId(addrId, userId); + return ServerResponseEntity.success("修改地址成功"); } /** - * 获取地址信息订单配送地址 + * 获取单个用户地址详细信息的方法,根据传入的地址 ID,先验证地址是否存在,若存在则将对应的地址信息转换为 UserAddrDto 类型返回给前端, + * 若地址不存在则抛出相应的异常(由全局异常处理机制处理,这里假设会返回合适的错误提示给前端)。 + * + * @param addrId 要获取详细信息的用户地址的 ID,通过路径变量传入 + * @return 包含单个用户地址详细信息的 ServerResponseEntity,以 UserAddrDto 类型封装地址信息,若地址不存在则抛出异常。 */ @GetMapping("/addrInfo/{addrId}") - @Operation(summary = "获取地址信息" , description = "根据地址id,获取地址信息") - @Parameter(name = "addrId", description = "地址ID" , required = true) + @Operation(summary = "获取地址信息", description = "根据地址id,获取地址信息") + @Parameter(name = "addrId", description = "地址ID", required = true) public ServerResponseEntity addrInfo(@PathVariable("addrId") Long addrId) { + // 获取当前用户的 ID,用于验证地址是否属于该用户以及查询操作 String userId = SecurityUtils.getUser().getUserId(); + // 根据传入的地址 ID 和用户 ID,从数据库中查询对应的用户地址记录,若不存在则抛出相应的异常 UserAddr userAddr = userAddrService.getUserAddrByUserId(addrId, userId); if (userAddr == null) { throw new YamiShopBindException("该地址已被删除"); } + + // 使用 Hutool 的 BeanUtil 将查询到的 UserAddr 类型的地址信息转换为 UserAddrDto 类型,方便返回给前端展示 return ServerResponseEntity.success(BeanUtil.copyProperties(userAddr, UserAddrDto.class)); } - -} +} \ No newline at end of file