3.01 用户在确认订单页收货地址操作

用户在确认订单页面,可以针对收货地址做如下操作:

1. 查询用户的所有收货地址列表
2. 新增收货地址
3. 删除收货地址
4. 修改收货地址
5. 设置默认地址

在这里插入图片描述

步骤1:创建对应用户地址BO

public class AddressBO {private String addressId;private String userId;private String receiver;private String mobile;private String province;private String city;private String district;private String detail;
}

步骤2:创建实现类和对应的接口

import com.one.bo.AddressBO;
import com.one.pojo.UserAddress;
import java.util.List;
public interface AddressService {/*** 根据用户id查询用户的收货地址列表* @param userId* @return*/public List<UserAddress> queryAll(String userId);/*** 用户新增地址* @param addressBO*/public void addNewUserAddress(AddressBO addressBO);/*** 用户修改地址* @param addressBO*/public void updateUserAddress(AddressBO addressBO);/*** 根据用户id和地址id,删除对应的用户地址信息* @param userId* @param addressId*/public void deleteUserAddress(String userId, String addressId);/*** 修改默认地址* @param userId* @param addressId*/public void updateUserAddressToBeDefault(String userId, String addressId);/*** 根据用户id和地址id,查询具体的用户地址对象信息* @param userId* @param addressId* @return*/public UserAddress queryUserAddres(String userId, String addressId);
}

===================================================================

import com.one.bo.AddressBO;
import com.one.enums.YesOrNo;
import com.one.mapper.UserAddressMapper;
import com.one.pojo.UserAddress;
import com.one.service.address.AddressService;
import org.n3r.idworker.Sid;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@Service
public class AddressServiceImpl implements AddressService {@Autowiredprivate UserAddressMapper userAddressMapper;@Autowiredprivate Sid sid;  //获取唯一主键对象@Transactional(propagation = Propagation.SUPPORTS)@Overridepublic List<UserAddress> queryAll(String userId) {UserAddress ua = new UserAddress();ua.setUserId(userId);return userAddressMapper.select(ua);}@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void addNewUserAddress(AddressBO addressBO) {// 1. 判断当前用户是否存在地址,如果没有,则新增为‘默认地址’Integer isDefault = 0;List<UserAddress> addressList = this.queryAll(addressBO.getUserId());if (addressList == null || addressList.isEmpty() || addressList.size() == 0) {isDefault = 1;}String addressId = sid.nextShort();// 2. 保存地址到数据库UserAddress newAddress = new UserAddress();BeanUtils.copyProperties(addressBO, newAddress);newAddress.setId(addressId);newAddress.setIsDefault(isDefault);newAddress.setCreatedTime(new Date());newAddress.setUpdatedTime(new Date());userAddressMapper.insert(newAddress);}@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void updateUserAddress(AddressBO addressBO) {String addressId = addressBO.getAddressId();UserAddress pendingAddress = new UserAddress();BeanUtils.copyProperties(addressBO, pendingAddress);pendingAddress.setId(addressId);pendingAddress.setUpdatedTime(new Date());userAddressMapper.updateByPrimaryKeySelective(pendingAddress);}@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void deleteUserAddress(String userId, String addressId) {UserAddress address = new UserAddress();address.setId(addressId);address.setUserId(userId);userAddressMapper.delete(address);}@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void updateUserAddressToBeDefault(String userId, String addressId) {// 1. 查找默认地址,设置为不默认UserAddress queryAddress = new UserAddress();queryAddress.setUserId(userId);queryAddress.setIsDefault(YesOrNo.YES.type);  //1List<UserAddress> list  = userAddressMapper.select(queryAddress);for (UserAddress ua : list) {ua.setIsDefault(YesOrNo.NO.type); //0userAddressMapper.updateByPrimaryKeySelective(ua);}// 2. 根据地址id修改为默认的地址UserAddress defaultAddress = new UserAddress();defaultAddress.setId(addressId);defaultAddress.setUserId(userId);defaultAddress.setIsDefault(YesOrNo.YES.type);userAddressMapper.updateByPrimaryKeySelective(defaultAddress);}@Transactional(propagation = Propagation.SUPPORTS)@Overridepublic UserAddress queryUserAddres(String userId, String addressId) {UserAddress singleAddress = new UserAddress();singleAddress.setId(addressId);singleAddress.setUserId(userId);return userAddressMapper.selectOne(singleAddress);}
}

步骤3:创建对应接口访问类controller类

import com.one.bo.AddressBO;
import com.one.pojo.UserAddress;
import com.one.service.address.AddressService;
import com.one.utils.JSONResult;
import com.one.utils.MobileEmailUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@Api(value = "地址相关", tags = {"地址相关的api接口"})
@RequestMapping("address")
@RestController
public class AddressController {/*** 用户在确认订单页面,可以针对收货地址做如下操作:* 1. 查询用户的所有收货地址列表* 2. 新增收货地址* 3. 删除收货地址* 4. 修改收货地址* 5. 设置默认地址*/@Autowiredprivate AddressService addressService;@ApiOperation(value = "根据用户id查询收货地址列表", notes = "根据用户id查询收货地址列表", httpMethod = "POST")@PostMapping("/list")public JSONResult list(@RequestParam String userId) {if (StringUtils.isBlank(userId)) {return JSONResult.errorMsg("");}List<UserAddress> list = addressService.queryAll(userId);return JSONResult.ok(list);}@ApiOperation(value = "用户新增地址", notes = "用户新增地址", httpMethod = "POST")@PostMapping("/add")public JSONResult add(@RequestBody AddressBO addressBO) {JSONResult checkRes = checkAddress(addressBO);if (checkRes.getStatus() != 200) {return checkRes;}addressService.addNewUserAddress(addressBO);return JSONResult.ok();}@ApiOperation(value = "用户修改地址", notes = "用户修改地址", httpMethod = "POST")@PostMapping("/update")public JSONResult update(@RequestBody AddressBO addressBO) {if (StringUtils.isBlank(addressBO.getAddressId())) {return JSONResult.errorMsg("修改地址错误:addressId不能为空");}JSONResult checkRes = checkAddress(addressBO);if (checkRes.getStatus() != 200) {return checkRes;}addressService.updateUserAddress(addressBO);return JSONResult.ok();}@ApiOperation(value = "用户删除地址", notes = "用户删除地址", httpMethod = "POST")@PostMapping("/delete")public JSONResult delete(@RequestParam String userId, @RequestParam String addressId) {if (StringUtils.isBlank(userId) || StringUtils.isBlank(addressId)) {return JSONResult.errorMsg("");}addressService.deleteUserAddress(userId, addressId);return JSONResult.ok();}@ApiOperation(value = "用户设置默认地址", notes = "用户设置默认地址", httpMethod = "POST")@PostMapping("/setDefalut")public JSONResult setDefalut(@RequestParam String userId, @RequestParam String addressId) {if (StringUtils.isBlank(userId) || StringUtils.isBlank(addressId)) {return JSONResult.errorMsg("");}addressService.updateUserAddressToBeDefault(userId, addressId);return JSONResult.ok();}private JSONResult checkAddress(AddressBO addressBO) {String receiver = addressBO.getReceiver();if (StringUtils.isBlank(receiver)) {return JSONResult.errorMsg("收货人不能为空");}if (receiver.length() > 12) {return JSONResult.errorMsg("收货人姓名不能太长");}String mobile = addressBO.getMobile();if (StringUtils.isBlank(mobile)) {return JSONResult.errorMsg("收货人手机号不能为空");}if (mobile.length() != 11) {return JSONResult.errorMsg("收货人手机号长度不正确");}boolean isMobileOk = MobileEmailUtils.checkMobileIsOk(mobile);if (!isMobileOk) {return JSONResult.errorMsg("收货人手机号格式不正确");}String province = addressBO.getProvince();String city = addressBO.getCity();String district = addressBO.getDistrict();String detail = addressBO.getDetail();if (StringUtils.isBlank(province) ||StringUtils.isBlank(city) ||StringUtils.isBlank(district) ||StringUtils.isBlank(detail)) {return JSONResult.errorMsg("收货地址信息不能为空");}return JSONResult.ok();}}

步骤4:手机和邮箱验证工具类

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MobileEmailUtils {public static boolean checkMobileIsOk(String mobile) {String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(mobile);boolean isMatch = m.matches();return isMatch;}public static boolean checkEmailIsOk(String email) {boolean isMatch = true;if (!email.matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+")) {isMatch = false;}return isMatch;}
}

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

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

相关文章

高抗干扰LCD液晶屏驱动芯片,低功耗的特性适用于水电气表以及工控仪表类产品

VK2C23是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大224点&#xff08;56SEGx4COM&#xff09;或者最大416点&#xff08;52SEGx8COM&#xff09;的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据&#xff0c;也可通过指令进入省电模式。其高抗干扰&#xff…

zookeeper+kafka

目录 Kafka概述 一、为什么需要消息队列&#xff08;MQ&#xff09; 二、使用消息队列的好处 三、消息队列的两种模式 四、Kafka 定义 五、Kafka 简介 六、Kafka 的特性 七、Kafka 系统架构 分区的原因 八、部署kafka 集群 1.下载安装包 2.安装 Kafka 3.修改…

风控安全产品系统设计的一些思考

背景 本篇文章会从系统架构设计的角度&#xff0c;分享在对业务安全风控相关基础安全产品进行系统设计时遇到的问题难点及其解决方案。 内容包括三部分&#xff1a;&#xff08;1&#xff09;风控业务架构&#xff1b;&#xff08;2&#xff09;基础安全产品的职责&#xff1…

mysql8查看执行sql历史日志、慢sql历史日志,配置开启sql历史日志general_log、慢sql历史日志slow_query_log

0.本博客sql总结 -- 1.查看参数 -- 1.1.sql日志和慢sql日志输出方式(TABLE/FILE)。global参数 SHOW GLOBAL VARIABLES LIKE log_output; -- 1.2.sql日志开关。global参数 SHOW GLOBAL VARIABLES LIKE general_log%; -- 1.3.慢sql日志开关。global参数 SHOW GLOBAL VARIABLE…

AWS Amplify 部署node版本18报错修复

Amplify env&#xff1a;Amazon Linux:2 Build Error : Specified Node 18 but GLIBC_2.27 or GLIBC_2.28 not found on build 一、原因 报错原因是因为默认情况下&#xff0c;AWS Amplify 使用 Amazon Linux:2 作为其构建镜像&#xff0c;并自带 GLIBC 2.26。不过&#xff0c;…

UNIX 入门

与 UNIX 建立连接启动会话登录命令提示符修改口令退出系统 简单的 UNIX 命令命令格式ls 命令who 命令虚拟终端 tty伪终端 ptywho am i 命令 cal 命令help 命令man 命令 shell 概述shell 命令更换 shell临时更改 shell永久更改 shell 登录过程 与 UNIX 建立连接 启动会话 要启…

RabbitMQ 备份交换机和死信交换机

为处理生产者生产者将消息推送到交换机中&#xff0c;交换机按照消息中的路由键即自身策略无法将消息投递到指定队列中造成消息丢失的问题&#xff0c;可以使用备份交换机。 为处理在消息队列中到达TTL的过期消息&#xff0c;可采用死信交换机进行消息转存。 通过上述描述可知&…

P1049 [NOIP2001 普及组] 装箱问题(背包)(内附封面)

[NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V&#xff0c;同时有 n n n 个物品&#xff0c;每个物品有一个体积。 现在从 n n n 个物品中&#xff0c;任取若干个装入箱内&#xff08;也可以不取&#xff09;&#xff0c;使箱子的剩余空间最小。输出这个最…

数据库作业(一)

建立一张表&#xff1a; 表里面有多个字段&#xff0c;每一个字段对应一种数据类型 注意&#xff1a;表名&#xff0c;字段名都要起的有意义 1、首先mysql -uroot -p 进入MySQL 2、选择一个数据库并使用 3、创建一张表定义多个字段使用所有数据类型&#xff0c;数字&…

2. 内存分区模型

一、内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&a…

【SQL应知应会】索引(一)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 索引 • MySQL版 前言一、索引1.简介1.1 索引的优点…

Dockerfile部署golang,docker-compose

使用go镜像打包&#xff0c;运行在容器内 redis和mysql用外部的 项目目录结构 w1go项目&#xff1a; Dockerfile # 这种方式是docker项目加上 本地的mysql和redis环境 # go打包的容器 FROM golang:alpine AS builder# 为我们镜像设置一些必要的环境变量 ENV GO111MODULEon …

音视频技术开发周刊 | 305

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 大神回归学界&#xff1a;何恺明宣布加入 MIT 「作为一位 FAIR 研究科学家&#xff0c;我将于 2024 年加入麻省理工学院&#xff08;MIT&#xff09;电气工程与计算机科学…

国联易安网页防篡改保护系统“渠道招募”启动啦!

作为业内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全的领军企业&#xff0c;国联易安网页防篡改保护系统基于“高效同步”、“安全传输”两项技术&#xff0c;具备了独特的“五重防护”新特性&#xff0c;支持网页的全自动发布、网页监控、报警和自…

P1993 小 K 的农场(差分约束)(内附封面)

小 K 的农场 题目描述 小 K 在 MC 里面建立很多很多的农场&#xff0c;总共 n n n 个&#xff0c;以至于他自己都忘记了每个农场中种植作物的具体数量了&#xff0c;他只记得一些含糊的信息&#xff08;共 m m m 个&#xff09;&#xff0c;以下列三种形式描述&#xff1a;…

Win7之MS12-020死亡蓝屏

一&#xff0c;何为死亡蓝屏 1&#xff0c;简介 死亡蓝屏利用RDP协议&#xff0c;基于3389远程桌面端口对目标主机进行攻击&#xff0c;使目标机系统瘫痪导致蓝屏&#xff0c;严重影响着计算机的正常使用。 2&#xff0c;条件 1>目标操作系统未开启防火墙和杀毒软件等 2&g…

API接口用例生成器

一、前言 随着自动化测试技术的普及&#xff0c;已经有很多公司或项目&#xff0c;多多少少都会进行自动化测试。 目前本部门的自动化测试以接口自动化为主&#xff0c;接口用例采用 Excel 进行维护&#xff0c;按照既定的接口用例编写规则&#xff0c;对于功能测试人员来说只…

element表格+表单+表单验证结合运用

目录​​​​​​​ 一、结果展示 二、实现代码 一、结果展示 1、图片 2、描述 table中放form表单&#xff0c;放输入框或下拉框或多选框等&#xff1b; 点击添加按钮&#xff0c;首先验证表单&#xff0c;如果存在没填的就验证提醒&#xff0c;都填了就向下添加一行表单表…

GATK BaseRecalibratorSpark 过程中因Too many open files终止

Error&#xff1a; GATK BaseRecalibratorSpark 过程中因Too many open files终止 执行命令&#xff1a; nohup time ./gatk --java-options "-Xmx16G" BaseRecalibratorSpark -R ../../alignment/hg38/hg38.fa -I ../../alignment/bam/P368T.sorted.markdup.bam …

element vue2 动态添加 select+tree

难点在 1 添加一组一组的渲染 是往数组里push对象 循环的&#xff1b;但是要注意对象的结构! 因为这涉及到编辑完成后&#xff0c;表单提交时候的 校验&#xff01; 是校验每一个select tree里边 是否勾选 2 是在后期做编辑回显的时候 保证后端返回的值 是渲染到 select中的tr…