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.hqwc.cn/news/56707.html

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

相关文章

Unity CanvasGroup组件

文章目录 1. 简介2. 组件属性2.1 Alpha(透明度)2.2 Interactable(是否为可交互)2.3 Blocks Raycasts(是否接受射线监测)2.4 Ignore Parent Groups(忽视上层的画布组带来的影响) 1. 简介 CanvasGroup(画布组) 组件&#xff0c;可集中控制整组 UI 元素(自身和所有子物体)的某些属…

设计模式行为型——迭代器模式

什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;属于行为型模式&#xff0c;其提供一种方法顺序访问一个聚合对象中的各种元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;即不需要知道集合对象的底层表示。编程环境中非常常用的设计模式。 迭代…

链表——LinkedList类的概述和实现

LinkedList类 1.1LinkedList类概述 LinkedList类底层是基于双向链表结构实现的&#xff0c;不同于ArrayList类和Vector类是基于数组实现的&#xff1b;LinkedList类是非线程安全的&#xff1b;LinkedList类元素允许为null&#xff0c;允许重复元素&#xff1b;LinkedList类插…

《孙子兵法》是世界上最著名的中国著作,不服来看,趣讲《孙子兵法》第1讲

《孙子兵法》是世界上最著名的中国著作&#xff0c;不服来看&#xff01;趣讲《孙子兵法》【第1讲】 世界上最有名的中国著作肯定是《孙子兵法》。在著名的美国西点军校是必修课。 在企业管理领域&#xff0c;听一些讲座&#xff0c;经常会引用到《孙子兵法》的一些名句&#…

Java-认识String

目录 一、String概念及创建 1.1 String概念 1.2 String的创建 二、String常用方法 2.1 String对象的比较 2.2 字符串查找 2.3 转化 2.4 字符串替换 2.5 字符串拆分 2.6字符串的截取 2.7 其他操作方法 2.8 字符串修改 三、面试题 一、String概念及创建 1.1 String概念 Java中…

Qt能跨多少个平台?Qt能支持多少个平台?

2023年8月5日&#xff0c;周日下午 目录 Qt所支持的平台更多关于Qt支持的信息 Qt所支持的平台 图中显示的平台都支持。 想要更详细的平台支持信息可以查看&#xff1a;Supported Platforms | Qt 5.15 更多关于Qt支持的信息 Qt - 支持的平台及语言

sentinel组件

目录 定义 4.加SentinelResource,blockHander是超过阈值之后执行的函数 5.设置阈值 6.springboot集成sentinel 定义 1.sentinel知道当前流量大小&#xff0c;在浏览器和后端之间加sentinel控制流量&#xff0c;避免大批量的瞬时请求都达到服务上&#xff0c;将服务压垮 2.…

第一天 什么是CSRF ?

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 每天一个知识点 ✨特色专…

VSCode如何在行内显示变量值

背景 在调试时&#xff0c;我们希望能够直接在代码行显示变量的值&#xff0c;而不是总是去侧边栏查看&#xff0c;如下这种&#xff0c;y12直接显示在代码行。那么VSCode中如何做呢 设置 VSCode提供了“inline values”设置&#xff0c;但为了速度&#xff0c;默认并没有开…

在 React 中渲染大型数据集的 3 种方法

随着 Web 应用程序变得越来越复杂&#xff0c;我们需要找到有效的方法来优化性能和渲染大型数据集。在 React 应用程序中处理大型数据集时&#xff0c;一次呈现所有数据可能会导致性能不佳和加载时间变慢。 虚拟化是一种通过一次仅呈现数据集的一部分来解决此问题的技术&#…

2023年8月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

高速过孔同进同出后续来了!影响大不大由你们自己说

高速先生成员---黄刚 话说Chris在上篇文章的结尾留下的悬念&#xff0c;其实在上周的答题里&#xff0c;也有不少粉丝猜到了接下来要验证的内容。我们知道&#xff0c;任何两个结构如果距离变近了&#xff0c;容性就会增加&#xff0c;无论是孔和孔&#xff0c;线和线&#xf…