5.根据uid获取用户所有收货地址信息和设置默认地址

1.总结:昨天主要是实现了根据uid获取该用户的所有收货地址以及设置默认地址;再对默认地址的实现里面让我认识到它的具体操作,首先我们根据aid查询收货地址

    再根据收货地址查询到地址归属人的信息,判断uid是否相同进而判断该用户是否合法进行后续操作;再根据uid将用户的所有设置为非默认地址,最后根据

    aid将用户的地址设置为默认地址

mapper

package com.ku.store.mapper;

import com.ku.store.entity.Address;
import org.apache.ibatis.annotations.Param;
import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration;

import java.util.Date;
import java.util.List;

public interface AddressMapper {
    /**
     *  从插入收货地址数据
     * @param address 收货地址数据
     * @return 受影响行数
     */
    Integer insert(Address address);

    /**
     *  统计某用户的收货地址数量
     * @param uid 用户id
     * @return 该用户收货地址数量
     */
    Integer countByUid(Integer uid);

    /**
     * 跟汇聚于uid获取当前用户收货地址列表
     * @param uid
     * @return
     */
    List<Address> findByUid(Integer uid);

    /**
     *  将用户的所有收货地址设置为非默认地址
     * @param uid 收货地址归属用户id
     * @return 受影响行数
     */
    Integer updateNonDefaultByUid(Integer uid);

    /**
     * 将指定收货地址设置为默认地址
     * @param aid 收货地址id
     * @param modifiedUser 修改执行人
     * @param modifiedTime 修改时间
     * @return 受影响行数
     */
    Integer updateDefaultByAid(@Param("aid") Integer aid,
                               @Param("modifiedUser") String modifiedUser,
                               @Param("modifiedTime") Date modifiedTime);

    /**
     *  根据收货地址aid,查询收货地址详情
     * @param aid 收货地址 id
     * @return 匹配的收货地址详情,如果没有,则返回null
     */
    Address findByAid(Integer aid);

}

<?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.ku.store.mapper.AddressMapper">
    <resultMap id="AddressEntityMap" type="com.ku.store.entity.Address">
        <id column="aid" property="aid"/>
        <result column="province_code" property="provinceCode"/>
        <result column="province_name" property="provinceName"/>
        <result column="city_code" property="cityCode"/>
        <result column="city_name" property="cityName"/>
        <result column="area_code" property="areaCode"/>
        <result column="area_name" property="areaName"/>
        <result column="is_default" property="isDefault"/>
        <result column="created_user" property="createdUser"/>
        <result column="created_time" property="createdTime"/>
        <result column="modified_user" property="modifiedUser"/>
        <result column="modified_time" property="modifiedTime"/>
    </resultMap>

    <insert id="insert" useGeneratedKeys="true" keyProperty="aid">
        insert into store.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="countByUid" resultType="java.lang.Integer">
        select
            COUNT(*)
        from
            store.t_address
        where
            uid = #{uid}
    </select>

    <!--resultMap与resultType区别:-->
    <select id="findByUid" resultMap="AddressEntityMap">
        select
            *
        from
            store.t_address
        where
            uid = #{uid}
        order by
            is_default desc, created_time desc
    </select>

    <update id="updateNonDefaultByUid">
        update
            store.t_address
        set
            is_default = 0
        where
            uid = #{uid}
    </update>
    
    <update id="updateDefaultByAid">
        update
            store.t_address
        set
            is_default = 1,
            modified_user = #{modifiedUser},
            modified_time = #{modifiedTime}
        where
            aid = #{aid}
    </update>

    <select id="findByAid" resultMap="AddressEntityMap">
        select
            *
        from
            store.t_address
        where
            aid = #{aid}
    </select>

</mapper>

service

package com.ku.store.service;

import com.ku.store.entity.Address;

import java.util.List;

public interface IAddressService {
    /**
     *  创建新的收货地址
     * @param uid 当前登录用户uid
     * @param username 当前登录用户username
     * @param address 用户提交的收货地址
     */
    void addNewAddress(Integer uid, String username, Address address);

    /**
     *  查询某用户的收货地址列表数据
     * @param uid 收货地址附属用户的用户id
     * @return 改用户的收货地址列表数据
     */
    List<Address> getByUid(Integer uid);

    /**
     *  设置默认地址
     * @param aid 收货地址id
     * @param uid 归属用户id
     * @param username 当前登录用户名
     */
    void setDefault(Integer aid, Integer uid, String username);

}

serviceImpl

package com.ku.store.service.impl;

import com.ku.store.entity.Address;
import com.ku.store.mapper.AddressMapper;
import com.ku.store.service.IAddressService;
import com.ku.store.service.IDistrictService;
import com.ku.store.service.exception.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

@Service
public class AddressServiceImpl implements IAddressService {

    @Autowired
    private AddressMapper addressMapper;

    @Autowired
    private IDistrictService districtService;


    //定义最大收货地址数量,这个需要在application.properties中添加收获地址数据上限值配置
    @Value("${user.address.max-count}")
    private int maxCount;

    @Override
    public void addNewAddress(Integer uid, String username, Address address) {
        Integer count = addressMapper.countByUid(uid);
        if (count > maxCount){
            throw new AddressCountLimitException("收货地址达到上限!");
        }
        address.setUid(uid);
        //利用三目表达式来判断
        Integer isDefault = count == 0 ? 1 :0;
        address.setIsDefault(isDefault);
        address.setCreatedUser(username);
        address.setCreatedTime(new Date());
        address.setModifiedUser(username);
        address.setModifiedTime(new Date());
        String provinceName = districtService.getNameByCode(address.getProvinceCode());
        String cityName = districtService.getNameByCode(address.getCityCode());
        String areaName = districtService.getNameByCode(address.getAreaCode());
        address.setProvinceName(provinceName);
        address.setCityName(cityName);
        address.setAreaName(areaName);

        Integer rows = addressMapper.insert(address);
        if (rows != 1){
            throw new InsertException("插入用户地址异常!");
        }
    }

    @Override
    public List<Address> getByUid(Integer uid) {
        List<Address> list = addressMapper.findByUid(uid);
        for (Address address : list) {
            address.setUid(null);
            address.setProvinceCode(null);
            address.setCityCode(null);
            address.setAreaCode(null);
            address.setCreatedUser(null);
            address.setCreatedTime(null);
            address.setModifiedUser(null);
            address.setModifiedTime(null);
        }
        return list;
    }

    @Transactional//基于spring的JDBC事务
    @Override
    public void setDefault(Integer aid, Integer uid, String username) {
        // 根据参数aid,调用addressMapper中的findByAid()查询收货地址数据
        // 判断查询结果是否为null
        // 是:抛出AddressNotFoundException
        Address address = addressMapper.findByAid(aid);
        if (address == null){
            throw new AddressNotFoundException("用户地址没找到!");
        }

        // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
        // 是:抛出AccessDeniedException:非法访问
        if (!address.getUid().equals(uid)){
            throw new AccessDeniedException("非法异常!");
        }

        // 调用addressMapepr的updateNonDefaultByUid()将该用户的所有收货地址全部设置为非默认,并获取返回的受影响的行数
        // 判断受影响的行数是否小于1(不大于0)
        // 是:抛出UpdateException
        Integer rows = addressMapper.updateNonDefaultByUid(uid);
        if (rows < 1){
            throw new UpdateException("修改非默认地址异常!");
        }

        // 调用addressMapepr的updateDefaultByAid()将指定aid的收货地址设置为默认,并获取返回的受影响的行数
        // 判断受影响的行数是否不为1
        // 是:抛出UpdateException
        rows = addressMapper.updateDefaultByAid(aid, username, new Date());

        if (rows != 1){
            throw new  UpdateException("设置默认地址时出现异常!");
        }

    }
}

BaseController

package com.ku.store.controller;

import com.ku.store.service.exception.*;
import com.ku.store.utils.JsonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpSession;

/**
 * 该类用于响应成功的状态码以及统一处理异常 ,简化原来的controller
 */
//控制类基类
public class BaseController {
    public static final int OK = 200;

    //统一处理方法抛出的异常,此注解表示专门处理这个类的异常
    //注意:不要使用相同的注解参数,例如:Throwable e
    @ExceptionHandler({ServiceException.class, FileUploadException.class})
    public JsonResult<Void>handleException(Throwable e){
        JsonResult<Void> result = new JsonResult<>();
        if (e instanceof UsernameDuplicateException){
            result.setState(400);
            result.setMessage("用户名已存在!");
        }else if(e instanceof UserNotFoundException){
            result.setState(401);
            result.setMessage("用户名未找到!");
        }else if(e instanceof PasswordNotMatchException){
            result.setState(402);
            result.setMessage("密码不匹配!");
        }else if(e instanceof AddressCountLimitException){
            result.setState(403);
            result.setMessage("地址数量超过上限!");
        }else if (e instanceof AddressNotFoundException) {
            result.setState(404);
            result.setMessage("收货地址没找到!");
        } else if (e instanceof AccessDeniedException) {
            result.setState(405);
            result.setMessage("非法异常!");
        }else if(e instanceof InsertException){
            result.setState(500);
            result.setMessage("插入用户数据出现未知错误!");
        }else if(e instanceof UpdateException){
            result.setState(501);
            result.setMessage("更改用户数据出现未知错误!");
        }else if(e instanceof FileEmptyException){
            result.setState(600);
            result.setMessage("文件不能为空!");
        }else if(e instanceof FileSizeException){
            result.setState(601);
            result.setMessage("文件超过限制!");
        }else if(e instanceof FileTypeException){
            result.setState(602);
            result.setMessage("文件类型不允许!");
        }else if(e instanceof FileStateException){
            result.setState(603);
            result.setMessage("文件状态不正常!");
        }else if(e instanceof FileUploadIOException){
            result.setState(604);
            result.setMessage("文件上传流错误!");
        }
        return result;
    }

    /**
     * 从HttpSession对象中获取uid
     * @param session HttpSession对象
     * @return 当前登录用户id
     */
    protected final Integer getUidFromSession(HttpSession session){
        return Integer.valueOf(session.getAttribute("uid").toString());
    }

    /**
     * 从HttpSession对象中获取username
     * @param session HttpSession对象
     * @return 当前登录用户的username
     */
    protected final String getUsernameFromSession(HttpSession session){
        return session.getAttribute("username").toString();
    }
}

 

AddressController

package com.ku.store.controller;


import com.ku.store.entity.Address;
import com.ku.store.service.impl.AddressServiceImpl;
import com.ku.store.utils.JsonResult;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.List;

@RestController
@RequestMapping("/addresses")
public class AddressController extends BaseController {

    @Autowired
    AddressServiceImpl addressService;

    @RequestMapping("/add_new_address")
    public JsonResult<Void> addNewAddress(Address address, HttpSession session){
        //从session中获取uid和username
        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
        //调用业务对象方法执行业务
        addressService.addNewAddress(uid, username, address);
        return new JsonResult<Void>(OK);
    }

    @GetMapping({"", "/"})
    public JsonResult<List<Address>> getByUid(HttpSession session){
        Integer uid = getUidFromSession(session);
        List<Address> data = addressService.getByUid(uid);
        return new JsonResult<>(OK, data);
    }

    @RequestMapping("{aid}/set_default")
    public JsonResult<Void> setDefault(@PathVariable("aid") Integer aid, HttpSession session){
        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
        addressService.setDefault(aid, uid, username);
        return new JsonResult<Void>(OK);
    }
}

 

2.反思:自己对基础的业务应该要有举一反三的能力,但是柑橘自己还是没办法根据mapper方法自己编写出SQL语句,这是自己写的少了,没有从原理上面进行

    这些小编写,一直都是照着别人的编写,这样是不行的,编写不是为了赶进度,而是逐步实现不按照别人的来,自己编写,随心所欲地编写简单的SQL语句

    ,再就是认识到了一些业务中的逻辑,一些判断都是业务中必不可少的;在设置默认地址中,就是先根据aid查询地址,再根据地址获取uid,再根据uid判断

    登录,合法就根据uid设置该用户所有地址为非默认地址,最后根据aid完成默认地址的设置

 

3.复盘:用户注册,登录,修改信息,修改图像(除咯注册是判断用户名是否已存在,其余都要判断用户信息是否存在、逻辑删除,在登陆和和修改密码还要判断密码是否与存在数据库密码是否一致),以及通过父级代号和编号查询省/市/区

posted @ 2022-10-09 11:21  求知律己  阅读(124)  评论(0编辑  收藏  举报