11.收货地址模块-新增收货地址①

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.新增收货地址的业务功能

  1. 用户在第一次添加用户地址的时候,将该地址设置成默认,即is_default字段设置成1
  2. 规定用户的收货地址最多是20条,用户在添加收货地址的时候,判断如果超出20,抛出自定义异常AddressCountOverLimitException异常, 定义一个持久层接口selectAddressCountByUid,将用户的地址数查询出来,进行第一条和第二条业务处理
  3. 业务层补全收货地址信息过程中,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);
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于缺乏具体的需求描述和数据结构定义,以下代码仅供参考。 ``` <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.example.mapper.AddressMapper"> <!-- 查询用户的所有地址 --> <select id="findUserAddresses" resultType="com.example.entity.Address"> SELECT * FROM address WHERE user_id=#{userId} </select> <!-- 增收地址 --> <insert id="addAddress" parameterType="com.example.entity.Address"> INSERT INTO address(user_id, name, phone, province, city, district, detail) VALUES(#{userId}, #{name}, #{phone}, #{province}, #{city}, #{district}, #{detail}) </insert> <!--地址 --> <update id="updateAddress" parameterType="com.example.entity.Address"> UPDATE address SET name=#{name}, phone=#{phone}, province=#{province}, city=#{city}, district=#{district}, detail=#{detail} WHERE id=#{id} AND user_id=#{userId} </update> <!-- 删除地址 --> <delete id="deleteAddress" parameterType="int"> DELETE FROM address WHERE id=#{id} AND user_id=#{userId} </delete> </mapper> ``` 其中,`com.example.entity.Address` 是地址的实体类,包含属性:`id`、`userId`、`name`、`phone`、`province`、`city`、`district`和`detail`。`userId`是关联用户表的外键。 该XML中定义了四个SQL语句,分别为: - `findUserAddresses`:查询指定用户的所有地址- `addAddress`:增收地址- `updateAddress`:更地址- `deleteAddress`:删除地址。 每个SQL语句的参数类型和返回结果类型都在XML中定义。使用时,需要将该XML文件与对应的Java接口一起使用,由Dubbo框架自动管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值