新增收货地址

目录

🧂1.创建controller层

🥓2.创建service层 

🌭3.注意细节 

🍿4.避免dao数据暴漏 


1.创建controller层

controller不做逻辑操作,只接受前端的数据

  • 1.添加@Api设置swagger模块名称
  • 2.@RestController以json形式返回数据给前端
  • 3.@RequestMapping映射地址
  • 4.调用service层
/**
 * 地址
 */
@Api(tags ="收货地址模块")
@RestController()
@RequestMapping("api/address/v1")
public class AddressController {

    @Autowired
    private AddressService addressService;


    @ApiOperation("新增收获地址")
    @PostMapping("/addAddress")
    public JsonData addAddress(@ApiParam(value = "地址对象") @RequestBody AddressRequest addressRequest) {
        addressService.add(addressRequest);

        return JsonData.buildSuccess();
    }
}

2.创建service层 

service处理业务逻辑

  • 1.根据拦截器获取threadLocal,进一步获取登录者信息
  • 2.创建实体类UserDo(数据库类),并设置创建时间和用户id
  • 3.判断是否有默认收货地址
    • 如果没有,则新增收获地址
    • 如果有默认收货地址(1),将其状态改为非默认地址(0),在新增默认地址
@Slf4j
@Service
public class AddressServiceImpl implements AddressService {

    @Autowired
    private AddressMapper addressMapper;

    /**
     * 添加收获地址
     */
    @Override
    public void add(AddressRequest addressRequest) {

        //根据拦截器获取threadLocal,获取当前登录者信息
        LoginUser loginUser = LoginInterceptor.threadLocal.get();
        //创建地址对象
        AddressDO addressDO = new AddressDO();
        //设置创建时间
        addressDO.setCreateTime(new Date());
        //设置用户地址
        addressDO.setUserId(loginUser.getId());
        //属性对拷
        BeanUtils.copyProperties(addressRequest, addressDO);

        //判断是否有默认收货地址
        if (addressDO.getDefaultStatus() == AddressEnum.DEFAULT_STATUS.getStatus()) {
            //有默认收货地址
            //查找照默认收货地址
            AddressDO defaultAddressUserDo = addressMapper.selectOne(new QueryWrapper<AddressDO>().eq("user_id", loginUser.getId()).eq("default_status", AddressEnum.DEFAULT_STATUS.getStatus()));
            if (defaultAddressUserDo != null) {
                //修改默认地址为非默认
                defaultAddressUserDo.setDefaultStatus(AddressEnum.COMMON_STATUS.getStatus());
                int rows = addressMapper.update(defaultAddressUserDo, new QueryWrapper<AddressDO>().eq("id", defaultAddressUserDo.getId()));
                log.info("更新地址{}条,更新后地址状态:{}", rows, defaultAddressUserDo.getDefaultStatus());
            }
        }
        //添加新的地址
        int rows = addressMapper.insert(addressDO);
        log.info("新增记录{}条,默认收货地址为:{}", rows, addressDO);
    }
}

3.注意细节 

为了避免收货地址状态写死,创建枚举类,并设置枚举状态,在实际操作中,设置默认/非默认地址状态时,直接调用枚举获取,虽然麻烦,但后期方便管控

/**
 * 收货地址状态
 */

public enum AddressEnum {


    /**
     * 默认收货地址
     */
    DEFAULT_STATUS(1),

    /**
     * 非默认收货地址
     */
    COMMON_STATUS(0);


    private int status;

    private AddressEnum(int status) {
        this.status = status;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}

4.避免dao数据暴漏 

在实际项目中,我们不会将数据dao层(数据库类)直接暴露返回,而是创建与其属性字段一致的新的类,并包含其中一部分属性,我们将其返回,既保证dao的安全性,又将前端页面数据封装

例如,我么在新增用户地址时,我们并不是用AddressDo作为对象返回,而是创建新的类AddressRequest作为返回对象,并且我们新增swagger的各种信息方便调试

@Data
@ApiModel(value = "地址对象", description = "新增收获地址")
public class AddressRequest {


    /**
     * 是否默认收货地址:0->否;1->是
     */
    @ApiModelProperty(value = "是否是默认收获地址", example = "0")
    @JsonProperty("default_status")
    private Integer defaultStatus;

    /**
     * 收发货人姓名
     */
    @ApiModelProperty(value = "收发货人姓名", example = "小张家")
    @JsonProperty("receive_name")
    private String receiveName;

    /**
     * 收货人电话
     */
    @ApiModelProperty(value = "收货人电话", example = "18337082672")
    private String phone;

    /**
     * 省/直辖市
     */
    @ApiModelProperty(value = "直辖市", example = "河南")
    private String province;

    /**
     * 市
     */
    @ApiModelProperty(value = "市", example = "商丘")

    private String city;

    /**
     * 区
     */
    @ApiModelProperty(value = "区", example = "龙华")
    private String region;

    /**
     * 详细地址
     */
    @ApiModelProperty(value = "详细地址", example = "张家镇")
    @JsonProperty("detail_address")
    private String detailAddress;
}

注意逻辑之间的调用

小疑惑:地址可以重复吗?? 

如果不可以,怎末避免重复,我想到的是数据库设置唯一索引,你们的回答呢??

相关推荐

  1. 购物车页面收地址实现

    2024-04-01 14:20:04       43 阅读
  2. 添加的远程仓库地址

    2024-04-01 14:20:04       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-01 14:20:04       50 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-01 14:20:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-04-01 14:20:04       43 阅读
  4. Python语言-面向对象

    2024-04-01 14:20:04       54 阅读

热门阅读

  1. C++常见算法有哪些

    2024-04-01 14:20:04       33 阅读
  2. 东北大学软件学院计算机网络专业课-第一章总结

    2024-04-01 14:20:04       32 阅读
  3. 3月份 月总结

    2024-04-01 14:20:04       36 阅读
  4. SSRF漏洞详解

    2024-04-01 14:20:04       35 阅读
  5. 1、初识drf

    2024-04-01 14:20:04       39 阅读
  6. 音视频过滤器实战---视频处理

    2024-04-01 14:20:04       31 阅读
  7. 知识图谱:构建智能应用的大脑

    2024-04-01 14:20:04       33 阅读
  8. 搜索算法练习——拼图问题

    2024-04-01 14:20:04       31 阅读
  9. CentOS 7查看磁盘空间

    2024-04-01 14:20:04       30 阅读
  10. Spring boot 使用shardingsphere 分表使用

    2024-04-01 14:20:04       30 阅读
  11. 线程池 核心原理

    2024-04-01 14:20:04       34 阅读