新增收货地址

news2024/11/25 0:30:33

目录

🧂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;
}

注意逻辑之间的调用

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAJViewer8.1下载地址及安装教程

CAJViewer是中国学术期刊&#xff08;CAJ&#xff09;全文数据库的专用阅读软件。CAJViewer是中国知识资源总库&#xff08;CNKI&#xff09;开发的一款软件&#xff0c;旨在方便用户在线阅读和下载CAJ数据库中的学术论文、期刊和会议论文等文献资源。 CAJViewer具有直观的界面…

2000-2021年各省技术市场发展水平数据(原始数据+计算结果)

2000-2021年各省技术市场发展水平数据&#xff08;原始数据计算结果&#xff09; 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;国家统计局、统计年鉴 3、范围&#xff1a;30省 4、指标&#xff1a;技术市场成交额、国内生产总值、技术市场发展水平 5、计算说明“技…

java字符串(一)-- 字符串API,StringBuffer 和 StringBuilder,Object

String字符串相关的类 String的特性 String类&#xff1a;代表字符串。Java 程序中的所有字符串字面值&#xff08;如"abc" &#xff09;都作为此类的实例实现。String类是引用数据类型。 在 Java 8 中&#xff0c;String 内部使用 char 数组存储数据。 public fi…

C++的入门学习

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一、C关键字(C98) 二、命名空间 2.1 引入 ​编辑2.2 命名空间定义 2.3 命名空间的使用 三. C输入&输出 四.缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 1.全缺省参数 2…

MCGS学习——水位控制

要求 插入一个水罐&#xff0c;液位最大值为37插入一个滑动输入器&#xff0c;用来调节水罐水位&#xff0c;滑动输入器最大调节为液位最大值&#xff0c;并能清楚的显示出液位情况用仪表显示水位变化情况&#xff0c;仪表最大显示设置直观清楚方便读数&#xff0c;主划线为小…

基于spark的大数据分析预测地震受灾情况的系统设计

基于spark的大数据分析预测地震受灾情况的系统设计 在本篇博客中,我们将介绍如何使用Apache Spark框架进行地震受灾情况的预测。我们将结合数据分析、特征工程、模型训练和评估等步骤,最终建立一个预测模型来预测地震造成的破坏程度,同时使用可视化大屏的方式展示数据的分布…

提升 RAG 效果的实践

提升 RAG 效果的实践 0. 引言1. 测试数据2. cohere/embed-multilingual-v3.0 的几组测试结果2-1. 第1组测试2-2. 第2组测试 3. BAAI/bge-m3 的几组测试结果3-1. 第1组测试 0. 引言 AI 大语言模型的主要应用方式之一就是 RAG&#xff0c;接下来计划陆续分享工作中提升 RAG 效果…

vue3封装Element表格

配置表头配置多选配置序号自定义操作列按钮 封装表格 Table.vue <template><el-table:data"tableData"width"100%":maxHeight"maxHeight"v-bind"$attrs"selection-change"handleSelectChange"row-click"hand…

考研数学|听完一遍汤家凤基础,1800都没思路,怎么办?

看了我这篇回答&#xff0c;保证你可以顺利的做1800题&#xff01; 如果你听了汤家凤老师的课&#xff0c;但是做题没思路&#xff0c;请不要担心&#xff0c;也不要急着换老师&#xff0c;你很有可能是方法错了。 请你反思一下&#xff1a; 1、你是不是听完课立刻就去做题。…

linux系统基础命令

1、Linux中文件的权限包括哪些&#xff1f;某个文件的权限列为644代表该文件属主、属组和其它用户分别有什么权限&#xff1f; 1&#xff09;Linux中文件的权限包括哪些&#xff1f; 在Linux系统中&#xff0c;文件的权限包括读取&#xff08;r&#xff09;、写入&#xff08;w…

ARP类型

地址解析协议ARP即可实现将IP地址解析为MAC地址 动态ARP 动态ARP表项由ARP协议通过ARP报文自动生成和维护&#xff0c;可以被老化&#xff0c;可以被新的ARP报文更新&#xff0c;也可以被静态ARP表项覆盖。 动态ARP适用于拓扑结构复杂、通信实时性要求高的网络。 静态ARP …

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍模型描述程序…

(React组件基础)前端八股文Day6

一 类组件与函数组件有什么异同 在React中&#xff0c;类组件和函数组件是创建组件的两种主要方式。随着React的发展&#xff0c;尤其是自Hooks在React 16.8中引入以来&#xff0c;函数组件的功能变得更加强大&#xff0c;使得它们能够更加方便地与类组件相竞争。下面是类组件…

雷卯有1.8V的ESD供您选择

一&#xff0e;雷卯有1.8V的ESD供您选择&#xff0c;如下是型号&#xff0c;体积小。 二. 为什么要用低压1.8V 做静电保护呢 省电&#xff0c;省电&#xff01; 1.8V的电压&#xff0c;内阻也小的话&#xff0c;那就是非常省电的电路。现在很多产品号称10年不用换电池。电池技…

基于Springboot旅游网站管理系统设计和实现

基于Springboot旅游网站管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

内网渗透-(黄金票据和白银票据)详解(一)

目录 一、Kerberos协议 二、下面我们来具体分析Kerberos认证流程的每个步骤&#xff1a; 1、KRB_AS-REQ请求包分析 PA-ENC-TIMESTAMP PA_PAC_REQUEST 2、 KRB_AS_REP回复包分析&#xff1a; TGT认购权证 Logon Session Key ticket 3、然后继续来讲相关的TGS的认证过程…

在react项目用echarts绘制中国地图

文章目录 一、引入echarts二、下载地图json数据三、编写react组件四、组件使用 一、引入echarts 安装&#xff1a;npm i echarts --save 二、下载地图json数据 由于echarts内部不再支持地图数据&#xff0c;所以要绘制地图需要自己去下载数据。建议使用阿里云的。 地址&…

mysql 用户管理-权限管理

学习了用户管理&#xff0c;再学习下权限管理。 3&#xff0c;权限管理 权限管理主要是对登录到MySQL的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中&#xff0c;不合理的权限规划会给MySQL服务器带来安全隐患。数据库管理员要对所有用户的权限进行合理规…

14 - grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)

@[TOC](grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)) 空域法的基本思想是假设地面某区域的质量变化是由一系列位置已知、质量未知的质量块(小范围区域)引起的,那么将GRACE反演的结果归算到n个质量块上的过程就是泄露信号恢复的过程。个人理解是这样的:假定已知研…

EfficientNetV2:谷歌又来了,最小的模型,最高的准确率,最快的训练速度 | ICML 2021

论文基于training-aware NAS和模型缩放得到EfficientNetV2系列&#xff0c;性能远优于目前的模型。另外&#xff0c;为了进一步提升训练速度&#xff0c;论文提出progressive learning训练方法&#xff0c;在训练过程中同时增加输入图片尺寸和正则化强度。从实验结果来看&#…