1.前端输入的信息
- 后端用Address实体类对象接收,接收的数据存到对象中的数据有
private String name; // 收货人姓名
private String provinceCode; // 省份编号
private String cityCode; // 城市编号
private String areaCode; // 区县编号
private String zip; // 邮政编号
private String address; // 详细地址
private String phone; // 手机
private String tel; // 固定电话
private String tag; // 地址类型
- 业务层需要补全的其他信息
private Integer uid; // 正在添加新地址的用户,从session中获取即可
// 在持久层通过编号查找省或市或区的名字
private String provinceName;
private String cityName;
private String areaName;
// 在添加地址的业务层做一个判断,如果用户是第一次添加地址,将isDefault设置成1,即该地址就是默认地址
private Integer isDefault;
// 补全日志信息
private String createdUser;
private Date createdTime;
private String modifiedUser;
private Date modifiedTime;
2.新增收货地址的业务功能
- 用户在第一次添加用户地址的时候,将该地址设置成默认,即is_default字段设置成1
- 规定用户的收货地址最多是20条,用户在添加收货地址的时候,判断如果超出20,抛出自定义异常AddressCountOverLimitException异常, 定义一个持久层接口selectAddressCountByUid,将用户的地址数查询出来,进行第一条和第二条业务处理
- 业务层补全收货地址信息过程中,provinceName、cityName、areaName这三个字段是根据前端传过来的provinceCode、cityCode、areaCode查询数据库得到,省市区下拉框选择大体地址的业务先分离出来,后面做,目前先将前两条+新增用户地址实现完成
3.持久层接口及mapper映射文件
package com.cy.store.dao;
import com.cy.store.entity.Address;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
/**
* @author ZhangHailong
* @date 2022/5/13 - 12:33
* @project_name 收货地址持久层接口
*/
public interface AddressDao {
/**
*@描述 新增收获地址
*@参数 收货地址
*@返回值 作用的行数
*@创建人 ZhangHailong
*/
Integer insertAddress(Address address);
/**
*@描述 根据用户id查找用户收获地址的总数
*@参数 用户id
*@返回值 用户收获地址的数量
*@创建人 ZhangHailong
*/
Integer selectAddressCountByUid(Integer uid);
}
<!--..............................新增收货地址start............................-->
<insert id="insertAddress" useGeneratedKeys="true" keyProperty="aid">
INSERT INTO t_address
( uid, name, province_name, province_code, city_name, city_code, area_name, area_code, zip, address, phone, tel, tag, is_default, created_user, created_time, modified_user, modified_time )
VALUES
( #{uid}, #{name}, #{provinceName}, #{provinceCode}, #{cityName}, #{cityCode}, #{areaName}, #{areaCode}, #{zip}, #{address}, #{phone}, #{tel}, #{tag}, #{isDefault}, #{createdUser}, #{createdTime}, #{modifiedUser}, #{modifiedTime} )
</insert>
<select id="selectAddressCountByUid" resultType="java.lang.Integer">
SELECT COUNT(*) FROM t_address WHERE uid=#{uid}
</select>
<!--..............................新增收货地址end............................-->
4.业务层代码
package com.cy.store.service.impl;
import com.cy.store.dao.AddressDao;
import com.cy.store.dao.DistrictDao;
import com.cy.store.entity.Address;
import com.cy.store.service.IAddressService;
import com.cy.store.service.ex.AddressCountOverLimitException;
import com.cy.store.service.ex.AddressNotFoundException;
import com.cy.store.service.ex.InsertException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @author ZhangHailong
* @date 2022/5/13 - 13:42
* @project_name
*/
@Service
public class AddressServiceImpl implements IAddressService {
@Autowired
private AddressDao addressDao;
@Autowired
private DistrictDao districtDao;
// 从配置文件中读取最大新增地址数量限制
@Value("${user.address-max-count}")
private Integer maxCount;
@Override
public void addAddress(Integer uid, String username, Address address) {
Integer addressCount = addressDao.selectAddressCountByUid(uid);
// 判断用户的地址是否超出20,超出的话抛出逻辑超出异常
if (addressCount >= maxCount) {
throw new AddressCountOverLimitException("收货地址过多");
}
// 判断用户是否是第一次添加收货地址,是,将isDefault设置成1,即默认地址
Integer isDefault = addressCount == 0 ? 1 : 0;
address.setIsDefault(isDefault);
// 补全其他信息部分1
address.setUid(uid);
address.setCreatedUser(username);
address.setCreatedTime(new Date());
address.setModifiedUser(username);
address.setModifiedTime(new Date());
// 补全其他信息部分2
// 因为将省市区的选择部分分离出来了,所以此处的业务在后续补全
Integer row = addressDao.insertAddress(address);
if (row != 1) {
throw new InsertException("在插入新的收货地址过程中产生未知异常");
}
}
5.控制层代码
@RequestMapping("address")
@RestController
public class AddressController extends BaseController{
@Autowired
private IAddressService iAddressService;
/**
*@描述 新增收货地址controller
*@参数 收货地址参数值
*@返回值 void
*@创建人 ZhangHailong
*/
@RequestMapping(value = "addAddress", method = RequestMethod.POST)
public JsonResult<Void> addAddressController(Address address, HttpSession session) {
Integer uid = getUidFromSession(session);
String username = getUsernameFromSession(session);
iAddressService.addAddress(uid, username, address);
return new JsonResult<>(OK);
}
}