Java十天上手做一个自己的web商城笔记-收获地址的展示、设置与删除(10)

 该系列博客主要记录笔者的开发过程,参考B站系列视频:【SpringBoot项目实战完整版】SpringBoot+MyBatis+MySQL电脑商城项目实战_哔哩哔哩_bilibili

所用的一些版本信息:

IDEA开发、JDK1.8版本以上、maven3.61版本以上,springboot,DataGrip管理数据库

收获地址的展示、设置与删除: 

1.持久层

1.1 SQL语句

1.数据库查询 select

  按照默认与创建时间排序

2.设置地址为默认

    检测当前用户选中的地址数据是否存在(select)

    先将所有的收获地址设置为非默认(update)

    再将当前地址设置为默认(update)

3.删除一条数据 delete

    (1)如果用户删除的是默认的收获地址,需要将剩下的最新修改的收获地址设置为收获地址。

        select 查询最新修改的收获地址。

    (2)如果用户只有一条地址,就不需要上述过程。

1.2 接口设计

store\src\main\java\com\cy\store\mapper\AddressMapper.java

    /**
     * 根据用户id查询用户收获地址数据
     * @param uid 用户id
     * @return 收获地址列表
     */
    List<Address> findByUid(Integer uid);

    /**
     * 根据aid查询用户收获地址数据
     * @param aid
     * @return
     */
    Address findByAid(Integer aid);

    /**
     * 根据用户id设置所有的地址为非默认
     * @param uid
     * @return 影响行数
     */
    Integer updateNonDefault(Integer uid);

    /**
     * 根据aid设置当前地址为默认地址
     * @param aid
     * @return 影响行数
     */
    Integer updateDefalultByAid(Integer aid, String modifiedUser, Date modifiedTime);

    /**
     * 根据aid删除地址数据
     * @param aid
     * @return 影响行数
     */
    Integer deleteByAid(Integer aid);

    /**
     * 根据用户uid查询当前用户最后一次被修改的收获地址数据
     * @param uid
     * @return
     */
    Address findLastModified(Integer uid);

1.3 SQL映射

store\src\main\resources\mapper\AddressMapper.xml

    <select id="findByUid" resultMap="AddressEntityMap">
        SELECT * FROM t_address WHERE uid = #{uid}
        ORDER BY is_default DESC, created_time DESC
    </select>

    <select id="findByAid" resultMap="AddressEntityMap">
        SELECT * FROM t_address WHERE aid = #{aid}
    </select>

    <update id="updateNonDefault">
        update t_address SET is_default=0 WHERE uid = #{uid}
    </update>

    <update id="updateDefalultByAid">
        update t_address
        SET is_default=1, modified_user = #{modifiedUser}, modified_time = #{modifiedTime}
        WHERE aid = #{aid}
    </update>

    <delete id="deleteByAid">
        DELETE FROM t_address WHERE aid =#{aid}
    </delete>

    <select id="findLastModified" resultMap="AddressEntityMap">
        SELECT * FROM t_address
        WHERE uid=#{uid}
        ORDER BY modified_time DESC LIMIT 0,1
    </select>

1.4 单元测试

store\src\test\java\com\cy\store\mapper\AddressMapperTests.java

    @Test
    public void FindeByUid(){
        System.out.println(addressMapper.findByUid(29));
    }

    @Test
    public void findByAid(){
        System.out.println(addressMapper.findByAid(1));
    }

    @Test
    public void updateNonDefault(){
        addressMapper.updateNonDefault(29);
    }

    @Test
    public void updateDefalultByAid(){
        addressMapper.updateDefalultByAid(10,"管理员", new Date());
    }

    @Test
    public void deleteByAid(){
        addressMapper.deleteByAid(5);
    }

    @Test
    public void findLastModified(){
        System.out.println(addressMapper.findLastModified(29));
    }

2.业务层

2.1 异常规划

1.更新时 UpdateException

2.访问数据不是当前登录用户的数据,非法访问:AccessDeniedException

3.收获地址可能不存在,AddressNotFoundException

4.执行删除时,产生未知的删除异常,DeleteException

store\src\main\java\com\cy\store\service\ex下创建异常,代码略

2.2 设计接口和抽象方法

store\src\main\java\com\cy\store\service\IAddressService.java

    /**
     * 根据UID查询地址
     * @param uid
     * @return
     */
    List<Address> getByUid(Integer uid);

    /**
     * 修改某一条地址数据为默认值
     * @param uid
     * @param aid
     * @param username
     */
    void setDefault(Integer uid, Integer aid, String username);

    /**
     * 删除地址数据
     * @param aid
     * @param uid
     * @param username
     */
    void delete(Integer aid, Integer uid, String username);

2.3 抽象方法实现

store\src\main\java\com\cy\store\service\impl\AddressServiceImpl.java

    @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 addressMapper.findByUid(uid);
    }

    @Override
    public void setDefault(Integer uid, Integer aid, String username) {
        Address result = addressMapper.findByAid(aid);
        if(result==null){
            throw new AddressNotFountException("收获地址不存在");
        }
        //当前的地址数据是否归属与当前用户
        if(!result.getUid().equals(uid)){
            throw new AccessDeniedException("非法访问数据");
        }
        //更新操作
        Integer rows = addressMapper.updateNonDefault(uid);
        if(rows<1){
            throw new UpdateException("更新时产生位置异常");
        }
        rows = addressMapper.updateDefalultByAid(aid, username, new Date());
        if(rows!=1){
            throw new UpdateException("更新时产生位置异常");
        }
    }

    @Override
    public void delete(Integer aid, Integer uid, String username) {
        Address result = addressMapper.findByAid(aid);
        if(result==null){
            throw new AddressNotFountException("收获地址不存在");
        }
        //当前的地址数据是否归属与当前用户
        if(!result.getUid().equals(uid)){
            throw new AccessDeniedException("非法访问数据");
        }
        Integer rows = addressMapper.deleteByAid(aid);
        if(rows!=1){
            throw new UpdateException("删除时产生位置异常");
        }
        Integer cnt = addressMapper.countByUid(uid);
        if(cnt == 0){
            return;
        }
        if(result.getIsDefault()==1){ //将最新的地址数据修改为默认
            Address address = addressMapper.findLastModified(uid);
            rows = addressMapper.updateDefalultByAid(address.getAid(),username,new Date());
        }
        if(rows!=1){
            throw new UpdateException("更新时产生位置异常");
        }
    }

2.4 单元测试

store\src\test\java\com\cy\store\service\AddressServiceImplTests.java

    @Test
    public void findByUid(){
        List<Address> list = addressService.getByUid(29);
        for(Address add:list){
            System.out.println(add);
        }
    }

    @Test
    public void setDefault(){
        try {
            addressService.setDefault(29,10,"小明");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void delete(){
        addressService.delete(9,29,"tt");
    }

3.控制层

3.0 处理异常

在store\src\main\java\com\cy\store\controller\BaseController.java中统一处理异常

3.1 请求设计

查询地址:

URL:/addresses
请求参数:HttpSession session
请求方式:GET
返回值:JsonResult<List<Address>>

修改地址的默认值(使用restful风格提交数据):

URL:/addresses/{aid}/set_default
请求参数:@PathVariable("aid")Integer aid, HttpSession session
请求方式:GET
返回值:JsonResult<Void>

删除地址:

URL:/addresses/{aid}/delete
请求参数:@PathVariable("aid")Integer aid, HttpSession session
请求方式:POST
返回值:JsonResult<Void>

3.2 处理请求

在store\src\main\java\com\cy\store\controller\AddressController.java中添加如下接口

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

    //Restful风格进行请求
    @RequestMapping("{aid}/set_default")
    public JsonResult<Void> setDefault(@PathVariable("aid")Integer aid, HttpSession session){
        addressService.setDefault(getuidFromSession(session),
                aid, getusernameFromSession(session));
        return new JsonResult<>(OK);
    }

    @RequestMapping("{aid}/delete")
    public JsonResult<Void> delete(@PathVariable("aid")Integer aid, HttpSession session){
        addressService.delete(aid,
                getuidFromSession(session),
                getusernameFromSession(session));
        return new JsonResult<>(OK);
    }

3.3 测试

使用对应的接口在浏览器中进行测试.

4.前端页面

在store\src\main\resources\static\web\address.html中添加如下代码:

		<script type="text/javascript">
			$(document).ready(function () {
				showAddressList();
			});

			function showAddressList() {
				$("#address-list").empty();
				$.ajax({
					url: "/addresses",
					type: "GET",
					dataType: "JSON",
					success: function (json) {
						let list = json.data;
						for (let i = 0; i < list.length; i++) {
							console.log(list[i].name);
							let address = '<tr>'
									+ '<td>#{tag}</td>'
									+ '<td>#{name}</td>'
									+ '<td>#{province}#{city}#{area}#{address}</td>'
									+ '<td>#{phone}</td>'
									+ '<td><a class="btn btn-xs btn-info"><span class="fa fa-edit"></span> 修改</a></td>'
									+ '<td><a onclick="deleteByAid(#{aid})" class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>'
									+ '<td><a onclick="setDefault(#{aid})" class="btn btn-xs add-def btn-default">设为默认</a></td>'
									+ '</tr>';

							address = address.replace(/#{aid}/g, list[i].aid);
							address = address.replace(/#{tag}/g, list[i].tag);
							address = address.replace("#{name}", list[i].name);
							address = address.replace("#{province}", list[i].provinceName);
							address = address.replace("#{city}", list[i].cityName);
							address = address.replace("#{area}", list[i].areaName);
							address = address.replace("#{address}", list[i].address);
							address = address.replace("#{phone}", list[i].phone);

							$("#address-list").append(address);
						}
						$(".add-def:eq(0)").hide();
					}
				});
			}

			function setDefault(aid) {
				$.ajax({
					url: "/addresses/" + aid + "/set_default",
					type: "POST",
					dataType: "JSON",
					success: function(json) {
						if (json.state == 200) {
							showAddressList();
						} else {
							alert("设置默认收货地址失败!" + json.message);
						}
					},
					error: function(json) {
						alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + json.status);
						location.href = "login.html";
					}
				});
			}

			function deleteByAid(aid) {
				$.ajax({
					url: "/addresses/" + aid + "/delete",
					type: "POST",
					dataType: "JSON",
					success: function(json) {
						if (json.state == 200) {
							showAddressList();
						} else {
							alert("删除收货地址失败!" + json.message);
						}
					},
					error: function(xhr) {
						alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status);
						location.href = "login.html";
					}
				});
			}
		</script>

测试前端功能

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值