Commit ecd06eebe4fec7db8ea8a753d0b08f977720e849

Authored by guzijian
1 parent 9c55c468

feat: 新增地址管理模块

trash-garbage/src/main/java/com/trash/garbage/controller/GarbageUserController.java
@@ -9,6 +9,7 @@ import com.trash.garbage.service.GarUserService; @@ -9,6 +9,7 @@ import com.trash.garbage.service.GarUserService;
9 import io.swagger.annotations.Api; 9 import io.swagger.annotations.Api;
10 import io.swagger.annotations.ApiOperation; 10 import io.swagger.annotations.ApiOperation;
11 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.validation.annotation.Validated;
12 import org.springframework.web.bind.annotation.*; 13 import org.springframework.web.bind.annotation.*;
13 14
14 import java.util.List; 15 import java.util.List;
@@ -50,13 +51,29 @@ public class GarbageUserController { @@ -50,13 +51,29 @@ public class GarbageUserController {
50 51
51 @ApiOperation("用户接口-获取用户地址") 52 @ApiOperation("用户接口-获取用户地址")
52 @GetMapping("/query/address/{type}") 53 @GetMapping("/query/address/{type}")
53 - public Result<List<GarAddress>> queryAddress(@PathVariable("type") String type){ 54 + public Result<List<GarAddress>> queryAddress(@PathVariable("type") String type) {
54 return Result.OK(garUserService.queryAddress(type)); 55 return Result.OK(garUserService.queryAddress(type));
55 } 56 }
56 57
57 @ApiOperation("用户接口-新增地址") 58 @ApiOperation("用户接口-新增地址")
58 @PostMapping("/save/address") 59 @PostMapping("/save/address")
59 - public Result<String> saveAddress(@RequestBody AddressDto dto){  
60 - return Result.OK(garUserService.saveAddress(dto)); 60 + public Result<String> saveAddress(@Validated @RequestBody AddressDto dto) {
  61 + return Result.OK(null, garUserService.saveAddress(dto));
61 } 62 }
  63 +
  64 +
  65 + @ApiOperation("用户接口-编辑地址")
  66 + @PostMapping("/update/address")
  67 + public Result<String> updateAddress(@Validated @RequestBody AddressDto dto) {
  68 + return Result.OK(null, garUserService.updateAddress(dto));
  69 + }
  70 +
  71 +
  72 + @ApiOperation("用户接口-删除地址")
  73 + @DeleteMapping("/delete/address/{addressId}")
  74 + public Result<String> deleteAddress(@PathVariable("addressId") String addressId) {
  75 + return Result.OK(null, garUserService.deleteAddress(addressId));
  76 + }
  77 +
  78 +
62 } 79 }
trash-garbage/src/main/java/com/trash/garbage/global/GlobalStatus.java
@@ -51,8 +51,7 @@ public class GlobalStatus { @@ -51,8 +51,7 @@ public class GlobalStatus {
51 */ 51 */
52 public enum GarAddressStatus { 52 public enum GarAddressStatus {
53 NORMAL_ADDRESS(0,"地址"), 53 NORMAL_ADDRESS(0,"地址"),
54 - DEFAULT_ADDRESS(1,"默认地址"),  
55 - CURRENT_ADDRESS(2,"当前选中地址"); 54 + CURRENT_ADDRESS(1,"当前地址");
56 GarAddressStatus(Integer status,String description){ 55 GarAddressStatus(Integer status,String description){
57 this.status = status; 56 this.status = status;
58 this.description = description; 57 this.description = description;
trash-garbage/src/main/java/com/trash/garbage/global/Result.java
@@ -39,15 +39,6 @@ public class Result&lt;T extends Object&gt; { @@ -39,15 +39,6 @@ public class Result&lt;T extends Object&gt; {
39 return r; 39 return r;
40 } 40 }
41 41
42 - public static <T> Result<T> OK(ResultCode code,T data){  
43 - Result r = new Result();  
44 - r.setSuccess(true);  
45 - r.setCode(code.getCode());  
46 - r.setMsg("部分成功");  
47 - r.setData(data);  
48 - return r;  
49 - }  
50 -  
51 /** 成功静态方法 */ 42 /** 成功静态方法 */
52 public static <T> Result<T> OK(T data) { 43 public static <T> Result<T> OK(T data) {
53 Result r = new Result(); 44 Result r = new Result();
trash-garbage/src/main/java/com/trash/garbage/pojo/domain/GarAddress.java
@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName; @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
8 import java.io.Serializable; 8 import java.io.Serializable;
9 import java.util.Date; 9 import java.util.Date;
10 10
  11 +import com.fasterxml.jackson.annotation.JsonFormat;
11 import lombok.Data; 12 import lombok.Data;
12 13
13 14
@@ -24,11 +25,12 @@ public class GarAddress implements Serializable { @@ -24,11 +25,12 @@ public class GarAddress implements Serializable {
24 * 地址id 25 * 地址id
25 */ 26 */
26 @TableId 27 @TableId
27 - private Long garAddressId; 28 + private String garAddressId;
28 29
29 /** 30 /**
30 * 用户id 31 * 用户id
31 */ 32 */
  33 + @TableField(select = false)
32 private String garUserId; 34 private String garUserId;
33 35
34 /** 36 /**
@@ -44,13 +46,15 @@ public class GarAddress implements Serializable { @@ -44,13 +46,15 @@ public class GarAddress implements Serializable {
44 /** 46 /**
45 * 创建时间 47 * 创建时间
46 */ 48 */
47 - @TableField(fill = FieldFill.INSERT) 49 + @TableField(fill = FieldFill.INSERT, select = false)
  50 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:dd")
48 private Date garCreateTime; 51 private Date garCreateTime;
49 52
50 /** 53 /**
51 * 修改时间 54 * 修改时间
52 */ 55 */
53 - @TableField(fill = FieldFill.INSERT_UPDATE) 56 + @TableField(fill = FieldFill.INSERT_UPDATE, select = false)
  57 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:dd")
54 private Date garUpdateTime; 58 private Date garUpdateTime;
55 59
56 /** 60 /**
trash-garbage/src/main/java/com/trash/garbage/pojo/domain/GarUser.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
7 import java.io.Serializable; 7 import java.io.Serializable;
8 import java.util.Date; 8 import java.util.Date;
9 9
  10 +import com.fasterxml.jackson.annotation.JsonFormat;
10 import com.trash.garbage.security.UserAbstract; 11 import com.trash.garbage.security.UserAbstract;
11 import lombok.Data; 12 import lombok.Data;
12 13
@@ -53,12 +54,14 @@ public class GarUser extends UserAbstract implements Serializable { @@ -53,12 +54,14 @@ public class GarUser extends UserAbstract implements Serializable {
53 */ 54 */
54 55
55 @TableField(fill = FieldFill.INSERT) 56 @TableField(fill = FieldFill.INSERT)
  57 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:dd")
56 private Date garCreateTime; 58 private Date garCreateTime;
57 59
58 /** 60 /**
59 * 修改时间 61 * 修改时间
60 */ 62 */
61 @TableField(fill = FieldFill.INSERT_UPDATE) 63 @TableField(fill = FieldFill.INSERT_UPDATE)
  64 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:dd")
62 private Date garUpdateTime; 65 private Date garUpdateTime;
63 66
64 /** 67 /**
trash-garbage/src/main/java/com/trash/garbage/pojo/dto/AddressDto.java
@@ -2,14 +2,24 @@ package com.trash.garbage.pojo.dto; @@ -2,14 +2,24 @@ package com.trash.garbage.pojo.dto;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
  5 +import javax.validation.constraints.NotBlank;
  6 +import javax.validation.constraints.NotEmpty;
  7 +import javax.validation.constraints.NotNull;
  8 +
5 /** 9 /**
6 * @author 20412 10 * @author 20412
7 */ 11 */
8 @Data 12 @Data
9 public class AddressDto { 13 public class AddressDto {
10 - private String address;  
11 - private String details;  
12 - private String contactName;  
13 - private String contactTel;  
14 - private Integer defaultFlag; 14 + private String garAddressId;
  15 + @NotBlank(message = "所在地区不能为空")
  16 + private String addressArea;
  17 + @NotBlank(message = "详细地址不能为空")
  18 + private String addressDetail;
  19 + @NotBlank(message = "联系人不能为空")
  20 + private String contactPerson;
  21 + @NotBlank(message = "联系电话不能为空")
  22 + private String contactIphoneNumber;
  23 + @NotNull(message = "defaultFlag不能为空")
  24 + private Boolean defaultFlag;
15 } 25 }
trash-garbage/src/main/java/com/trash/garbage/pojo/dto/LoginDto.java
@@ -13,7 +13,7 @@ public class LoginDto { @@ -13,7 +13,7 @@ public class LoginDto {
13 @ApiModelProperty(value = "登录vo-手机号") 13 @ApiModelProperty(value = "登录vo-手机号")
14 private String tel; 14 private String tel;
15 @ApiModelProperty(value = "登录vo-验证码") 15 @ApiModelProperty(value = "登录vo-验证码")
16 - private Integer code; 16 + private String code;
17 @ApiModelProperty(value = "登录vo-用户昵称") 17 @ApiModelProperty(value = "登录vo-用户昵称")
18 private String nickname; 18 private String nickname;
19 @ApiModelProperty(value = "登录vo-wxCode") 19 @ApiModelProperty(value = "登录vo-wxCode")
trash-garbage/src/main/java/com/trash/garbage/service/GarUserService.java
@@ -23,4 +23,8 @@ public interface GarUserService extends IService&lt;GarUser&gt; { @@ -23,4 +23,8 @@ public interface GarUserService extends IService&lt;GarUser&gt; {
23 List<GarAddress> queryAddress(String type); 23 List<GarAddress> queryAddress(String type);
24 24
25 String saveAddress(AddressDto dto); 25 String saveAddress(AddressDto dto);
  26 +
  27 + String updateAddress(AddressDto dto);
  28 +
  29 + String deleteAddress(String addressId);
26 } 30 }
trash-garbage/src/main/java/com/trash/garbage/service/impl/GarUserServiceImpl.java
@@ -4,6 +4,7 @@ import cn.hutool.http.HttpUtil; @@ -4,6 +4,7 @@ import cn.hutool.http.HttpUtil;
4 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
5 import com.aliyuncs.exceptions.ClientException; 5 import com.aliyuncs.exceptions.ClientException;
6 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7 +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
7 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 8 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
8 import com.trash.garbage.config.WxConfig; 9 import com.trash.garbage.config.WxConfig;
9 import com.trash.garbage.custom.BizException; 10 import com.trash.garbage.custom.BizException;
@@ -33,6 +34,7 @@ import javax.crypto.Cipher; @@ -33,6 +34,7 @@ import javax.crypto.Cipher;
33 import javax.crypto.spec.IvParameterSpec; 34 import javax.crypto.spec.IvParameterSpec;
34 import javax.crypto.spec.SecretKeySpec; 35 import javax.crypto.spec.SecretKeySpec;
35 import java.security.spec.AlgorithmParameterSpec; 36 import java.security.spec.AlgorithmParameterSpec;
  37 +import java.util.ArrayList;
36 import java.util.Arrays; 38 import java.util.Arrays;
37 import java.util.List; 39 import java.util.List;
38 import java.util.Objects; 40 import java.util.Objects;
@@ -77,8 +79,8 @@ public class GarUserServiceImpl extends ServiceImpl&lt;GarUserMapper, GarUser&gt; @@ -77,8 +79,8 @@ public class GarUserServiceImpl extends ServiceImpl&lt;GarUserMapper, GarUser&gt;
77 } 79 }
78 } 80 }
79 // 验证码验证 81 // 验证码验证
80 - Integer code = (Integer) redisUtils.get(GlobalRedisProperties.REDIS_USER_CODE.getValue() + user.getTel());  
81 - if (!code.equals(user.getCode())) { 82 + String code = (String) redisUtils.get(GlobalRedisProperties.REDIS_USER_CODE.getValue() + user.getTel());
  83 + if (user.getCode() == null || !user.getCode().equals(code)) {
82 throw new BizException(ResultCode.CODE_400, "验证码错误!!"); 84 throw new BizException(ResultCode.CODE_400, "验证码错误!!");
83 } 85 }
84 // 封装成authentication对象 86 // 封装成authentication对象
@@ -98,7 +100,7 @@ public class GarUserServiceImpl extends ServiceImpl&lt;GarUserMapper, GarUser&gt; @@ -98,7 +100,7 @@ public class GarUserServiceImpl extends ServiceImpl&lt;GarUserMapper, GarUser&gt;
98 @Override 100 @Override
99 public void sendVerify(String tel) throws ClientException { 101 public void sendVerify(String tel) throws ClientException {
100 //随机生成6位数字验证码 102 //随机生成6位数字验证码
101 - Integer validateCode = ValidateCodeUtil.generatorCode(4); 103 + String validateCode = ValidateCodeUtil.generatorCode(4);
102 //给用户发送验证码 104 //给用户发送验证码
103 // SMSUtils.sendMessage("", tel, validateCode.toString(), ""); 105 // SMSUtils.sendMessage("", tel, validateCode.toString(), "");
104 // 保存redis 106 // 保存redis
@@ -115,29 +117,72 @@ public class GarUserServiceImpl extends ServiceImpl&lt;GarUserMapper, GarUser&gt; @@ -115,29 +117,72 @@ public class GarUserServiceImpl extends ServiceImpl&lt;GarUserMapper, GarUser&gt;
115 String garUserId = userCustom.getUser().getGarUserId(); 117 String garUserId = userCustom.getUser().getGarUserId();
116 LambdaQueryWrapper<GarAddress> qw = new LambdaQueryWrapper<>(); 118 LambdaQueryWrapper<GarAddress> qw = new LambdaQueryWrapper<>();
117 qw.eq(GarAddress::getGarUserId, garUserId); 119 qw.eq(GarAddress::getGarUserId, garUserId);
118 - List<GarAddress> addressList = garAddressService.list(qw);  
119 if (GlobalStatus.QUERY_ADDRESS_TYPE_CURRENT.equals(type)) { 120 if (GlobalStatus.QUERY_ADDRESS_TYPE_CURRENT.equals(type)) {
120 - for (GarAddress garAddress : addressList) {  
121 - if (GlobalStatus.GarAddressStatus.CURRENT_ADDRESS.getValue().equals(garAddress.getGarUserDefault())) {  
122 - return Arrays.asList(garAddress);  
123 - }  
124 - } 121 + qw.eq(GarAddress::getGarUserDefault, GlobalStatus.GarAddressStatus.CURRENT_ADDRESS.getValue());
  122 + GarAddress one = garAddressService.getOne(qw);
  123 + return Arrays.asList(one);
125 } 124 }
126 - return addressList; 125 + return garAddressService.list(qw);
127 } 126 }
128 127
129 @Override 128 @Override
130 public String saveAddress(AddressDto dto) { 129 public String saveAddress(AddressDto dto) {
131 UserCustom userCustom = SecurityUtil.getUserCustom(); 130 UserCustom userCustom = SecurityUtil.getUserCustom();
132 - GarAddress garAddress = new GarAddress();  
133 - garAddress.setGarUserId(userCustom.getUser().getGarUserId());  
134 - garAddress.setGarUserAddress(dto.getAddress());  
135 - garAddress.setGarUserDefault(dto.getDefaultFlag());  
136 - garAddress.setGarUserContactName(dto.getContactName());  
137 - garAddress.setGarUserContactTel(dto.getContactTel());  
138 - garAddress.setGarRemark(dto.getDetails());  
139 - garAddressService.save(garAddress);  
140 - return "新增地址成功"; 131 + // 限制地址数
  132 + LambdaQueryWrapper<GarAddress> qw = new LambdaQueryWrapper<>();
  133 + qw.eq(GarAddress::getGarUserId, userCustom.getUser().getGarUserId());
  134 + List<GarAddress> list = garAddressService.list(qw);
  135 + if (list.size() > 19) {
  136 + throw new BizException(ResultCode.CODE_201, "新增地址数已达上线,请删除地址后新增地址或编辑已有地址!");
  137 + }
  138 + GarAddress address = new GarAddress();
  139 + address.setGarUserId(userCustom.getUser().getGarUserId());
  140 + address.setGarUserAddress(dto.getAddressArea());
  141 + address.setGarUserDefault(dto.getDefaultFlag() ? GlobalStatus.GarAddressStatus.CURRENT_ADDRESS.getValue() : GlobalStatus.GarAddressStatus.NORMAL_ADDRESS.getValue());
  142 + address.setGarUserContactName(dto.getContactPerson());
  143 + address.setGarUserContactTel(dto.getContactIphoneNumber());
  144 + address.setGarRemark(dto.getAddressDetail());
  145 + handleCurrentAddress(address);
  146 + garAddressService.save(address);
  147 + return "新增地址成功!";
  148 + }
  149 +
  150 + @Override
  151 + public String updateAddress(AddressDto dto) {
  152 + GarAddress address = new GarAddress();
  153 + String userId = SecurityUtil.getUserCustom().getUser().getGarUserId();
  154 + address.setGarAddressId(dto.getGarAddressId());
  155 + address.setGarUserId(userId);
  156 + address.setGarUserAddress(dto.getAddressArea());
  157 + address.setGarRemark(dto.getAddressDetail());
  158 + address.setGarUserDefault(dto.getDefaultFlag() ? GlobalStatus.GarAddressStatus.CURRENT_ADDRESS.getValue() : GlobalStatus.GarAddressStatus.NORMAL_ADDRESS.getValue());
  159 + handleCurrentAddress(address);
  160 + address.setGarUserContactName(dto.getContactPerson());
  161 + address.setGarUserContactTel(dto.getContactIphoneNumber());
  162 + LambdaUpdateWrapper<GarAddress> up = new LambdaUpdateWrapper<>();
  163 + up.eq(GarAddress::getGarUserId, address.getGarUserId())
  164 + .eq(GarAddress::getGarAddressId, address.getGarAddressId());
  165 + garAddressService.update(address, up);
  166 + return "地址修改成功!";
  167 + }
  168 +
  169 + private void handleCurrentAddress(GarAddress address) {
  170 + if (address.getGarUserDefault().equals(GlobalStatus.GarAddressStatus.CURRENT_ADDRESS.getValue())) {
  171 + LambdaUpdateWrapper<GarAddress> wrapper = new LambdaUpdateWrapper<>();
  172 + wrapper.eq(GarAddress::getGarUserId, address.getGarUserId())
  173 + .set(GarAddress::getGarUserDefault, GlobalStatus.GarAddressStatus.NORMAL_ADDRESS.getValue());
  174 + garAddressService.update(wrapper);
  175 + }
  176 + }
  177 +
  178 + @Override
  179 + public String deleteAddress(String addressId) {
  180 + String garUserId = SecurityUtil.getUserCustom().getUser().getGarUserId();
  181 + LambdaQueryWrapper<GarAddress> qw = new LambdaQueryWrapper<>();
  182 + qw.eq(GarAddress::getGarUserId, garUserId)
  183 + .eq(GarAddress::getGarAddressId, addressId);
  184 + garAddressService.remove(qw);
  185 + return "删除成功!";
141 } 186 }
142 187
143 188
trash-garbage/src/main/java/com/trash/garbage/utils/ValidateCodeUtil.java
@@ -3,11 +3,11 @@ package com.trash.garbage.utils; @@ -3,11 +3,11 @@ package com.trash.garbage.utils;
3 import java.util.Random; 3 import java.util.Random;
4 4
5 public class ValidateCodeUtil { 5 public class ValidateCodeUtil {
6 - public static Integer generatorCode(int bit){  
7 - int code = 0; 6 + public static String generatorCode(int bit){
  7 + StringBuilder code = new StringBuilder();
8 for (int i = 0; i < bit; i++) { 8 for (int i = 0; i < bit; i++) {
9 - code = code * 10 + new Random().nextInt(10); 9 + code = code.append(new Random().nextInt(10));
10 } 10 }
11 - return code; 11 + return code.toString();
12 } 12 }
13 } 13 }
trash-garbage/src/main/resources/application-dev.yml
@@ -71,9 +71,9 @@ spring: @@ -71,9 +71,9 @@ spring:
71 # #连接池最大阻塞等待时间(使用负值表示没有限制) 71 # #连接池最大阻塞等待时间(使用负值表示没有限制)
72 max-wait: -1ms 72 max-wait: -1ms
73 #返回json的全局时间格式 73 #返回json的全局时间格式
74 - jackson:  
75 - date-format: yyyy-MM-dd HH:mm:ss  
76 - time-zone: GMT+8 74 + jackson:
  75 + date-format: yyyy-MM-dd HH:mm:ss
  76 + time-zone: GMT+8
77 77
78 # mybaits 配置 78 # mybaits 配置
79 mybatis-plus: 79 mybatis-plus:
trash-garbage/src/main/resources/mapper/GarAddressMapper.xml
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <mapper namespace="com.trash.garbage.mapper.GarAddressMapper"> 5 <mapper namespace="com.trash.garbage.mapper.GarAddressMapper">
6 6
7 <resultMap id="BaseResultMap" type="com.trash.garbage.pojo.domain.GarAddress"> 7 <resultMap id="BaseResultMap" type="com.trash.garbage.pojo.domain.GarAddress">
8 - <id property="garAddressId" column="gar_address_id" jdbcType="BIGINT"/> 8 + <id property="garAddressId" column="gar_address_id" jdbcType="VARCHAR"/>
9 <result property="garUserId" column="gar_user_id" jdbcType="VARCHAR"/> 9 <result property="garUserId" column="gar_user_id" jdbcType="VARCHAR"/>
10 <result property="garUserAddress" column="gar_user_address" jdbcType="VARCHAR"/> 10 <result property="garUserAddress" column="gar_user_address" jdbcType="VARCHAR"/>
11 <result property="garUserDefault" column="gar_user_default" jdbcType="TINYINT"/> 11 <result property="garUserDefault" column="gar_user_default" jdbcType="TINYINT"/>