删除收货地址【项目 商城】

简介: 删除收货地址【项目 商城】

删除收货地址



1 持久层

1.1 规划需要执行的SQL语句

1.在删除之前判断改数据是否存在,判断该条地址数据的归属是否是当前的用户。

不用重复开发

2.执行删除收货地址的信息。

delete from t_address where aid=?

3.如果用户删除的是默认收货地址,将剩下的地址中的某一条设置为默认的收货地址。规则可以自定义:最新修改的收货地址设置为默认的收货地址(modified_time的字段值).

# limit (n-1)*n,pageSize
select * from t_address where uid=? order by modified_time DESC limit 0,1

4.如果用户本身就只有一条收货地址的数据,删除后,其他的操作就可以不进行了。

1.2 设计抽象方法

在AddressMapper接口中进抽象方法的设计。

     /**
     * 根据收货地址id删除收货地址数据
     * @param aid 收货地址id
     * @return 受影响的行数
     */
    Integer deleteByAid(Integer aid);
    /**
     * 根据用户uid查询当前用户最后一次被修改的收货地址数据
     * @param uid 用户id
     * @return 收货地址
     */
    Address findLastModified(Integer uid);

1.3 映射SQL语句

在AddressMapper.xml文件中进行映射。

   <select id="findByAid" resultMap="AddressEntityMap">
        SELECT  * FROM t_address WHERE aid=#{aid}
    </select>
    <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>

AddressMapper–deleteByAid


测试

单元测试方法

    @Test
    void deleteByAid(){
        Integer rows = addressMapper.deleteByAid(1);
        System.out.println(rows);
    }
    @Test
    void findLastModified(){
        System.out.println(addressMapper.findLastModified(8));
    }

AddressMapperTests–deleteByAid


2 业务层

2.1 规划异常

在执行删除的时候可能会产生未知的删除异常导致数据不能够删除成功,则抛出DeleteException异常。需要定义和创建。

/**删除数据时产生的异常*/
public class DeleteException extends ServiceException{
  //Ctrl+O
}

DeleteException


2.2 抽象方法设计

在IAddressService接口中进行设计抽象方法、

  /**
     * 删除用户选中的收货地址数据
     * @param aid 收货地址id
     * @param uid 用户id
     * @param username 用户名
     */
    void delete(Integer aid,Integer uid,String username);

2.3 实现抽象方法

业务层方法的设计和实现。

  @Override
    public void delete(Integer aid, Integer uid, String username) {
        Address result = addressMapper.findByAid(aid);
        if (result == null) {
            throw new AddressNotFoundException("尝试访问的收货地址数据不存在");
        }
        if (!result.getUid().equals(uid)) {
            throw new AccessDeniedException("非法数据访问的异常");
        }
        Integer rows = addressMapper.deleteByAid(aid);
        if (rows!=1){
            throw new DeleteException("删除数据产生未知的异常");
        }
        Integer count = addressMapper.countByUid(uid);
        if (count==0){
            //直接终止程序
            return;
        }
        if (result.getIsDefault()==0){
            return;
        }
        //将这条数据中is_default字符设置为1
        Address address = addressMapper.findLastModified(uid);
        rows=addressMapper.updateDefaultByAid(address.getAid(),username,new Date());
        if (rows!=1){
            throw new UpdateException("更新数据时产生未知的异常");
        }
    }

AddressService–delete


测试

在测试类测试该方法的功能

  @Test
    public void delete(){
        addressService.delete(3,8,"管理员");
    }

AddressServiceTests–delete

3 控制层

1.需要处理异常DeleteException。

    else if (e instanceof DeleteException){
            result.setState(5002);
            result.setMessage("删除数据时产生未知的异常");
        }

BaseController–DeleteException


2.设计请求方法

/addresses/{aid}/delete
POST
Integer aid,HttpSession session
JsonResult<Void>

3.编写请求处理方法实现。

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

AddressController–delete


测试

4 前端页面

在address.html页面中添加删除按钮的事件。

+ '<td><a οnclick="deleteByAid(#{aid})" class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>'

在去编写deleteByAid(aid)方法的具体实现。

      // <!--delete-->
      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(json) {
            alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + json.status);
            location.href = "login.html";
          }
        });
      }
      // <!--delete-->

address.html–delete


测试

登录系统,在访问收货地址页面进行删除的数据测试。

README–删除收货地址

相关文章
|
算法 前端开发 调度
贪心算法适用于解决什么类型的问题?
贪心算法适用于解决什么类型的问题?
570 1
|
Web App开发 Ubuntu Android开发
亚马逊AWS Kinesis Video Streams with WebRTC demo示例
以下分步说明介绍如何使用下载、构建和运行 Kinesis Video Streams with WebRTC 开发工具包及其相应示例。
950 0
|
8月前
|
JavaScript 前端开发 Java
Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use;端口冲突的原理与解决方案
本文解决了Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use的问题,并通过介绍端口的使用原理和操作系统的端口管理机制,可以更有效地解决端口冲突问题,并确保Web服务器能够顺利启动和运行。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
关系型数据库 Go 数据库
【Go语言专栏】Go语言中的数据库迁移与版本控制
【4月更文挑战第30天】本文介绍了Go语言中的数据库迁移和版本控制。针对数据库迁移,文章提到了使用Flyway和Liquibase两个工具。通过示例展示了如何在Go中集成这两个工具进行数据库结构的修改,以适应业务变化。而对于版本控制,文章以Git为例,说明了如何利用Git进行源代码和配置文件的管理,确保代码一致性与可追溯性。
611 0
|
Java Maven Spring
如何在idea中创建Springboot项目? 手把手带你创建Springboot项目,稳!
文章详细介绍了在IDEA中创建Spring Boot项目的过程,包括选择Spring Initializr、配置项目属性、选择Spring Boot版本、导入依赖、等待依赖下载以及项目结构简介。
14402 1
|
JSON 小程序 JavaScript
超详细微信小程序开发学习笔记,看完你也可以动手做微信小程序项目
这篇文章是一份全面的微信小程序开发学习笔记,涵盖了从小程序介绍、环境搭建、项目创建、开发者工具使用、文件结构、配置文件、模板语法、事件绑定、样式规范、组件使用、自定义组件开发到小程序生命周期管理等多个方面的详细教程和指南。
|
人工智能 安全 物联网
2024年6月后2周重要的大语言模型论文总结:LLM进展、微调、推理和对齐
本文总结了2024年6月后两周发表的一些最重要的大语言模型论文。这些论文涵盖了塑造下一代语言模型的各种主题,从模型优化和缩放到推理、基准测试和增强性能。
578 0
|
JavaScript
【干货】JS 限制input文本框输入
【干货】JS 限制input文本框输入
|
存储 缓存 搜索推荐
复杂系统设计原则与案例
## 一、复杂是软件的本质属性 ### 1.1 复杂是软件的本质属性 正如Brooks所言,软件复杂性是软件固有的属性,这种固有的复杂性主要由4个方面的原因造成的: - 问题域的复杂性 - 管理开发过程的复杂性 - 随处可变的灵活性 - 描绘离散系统行为的问题 上面每一个方面都有极大的挑战,以「问题域的复杂性」为例,现在我们的大型系统中,动不动就几十个应用,组合在一起就是一个复杂的系统,而每个
1686 4
复杂系统设计原则与案例
|
编译器 C语言 C++
初识c语言
一个程序运行起来如果报错或者结果是上一次运行程序的结果那么就是你写的程序有问题,可以用cursor这个编码chatgpt这个软件看一下那里出现的问题,但是要保证自己的代码是完整的我们在vs2022中要创建的源文件,头文件是用来存放自定义函数的。因为我们学习的是c语言所以我们创建的文件的以.c结尾的,不能是.cpp,因为c语言的语法规则和c++的语法规则不一样,要不然写出来的程序会报错。printf()函数在程序的函数体内实现,printf(“”)是负责打印(“”)里面的字符。scanf()函数的使用。