• 基于springboot框架的电脑商城项目(六)


    🎁🎁静态资源及sql文件分享
    链接:https://pan.baidu.com/s/1X-yjmQcPD3PqS21x0HplNA?pwd=23gr
    提取码:23gr

    删除收货地址

    (一)删除收货地址(持久层

    1.规划sql

    在删除之前判断该数据是否存在,需要执行查询语句看能否查到该数据,还需要根据返回的aid获取uid并和session中的uid进行比较判断归属是否正确,这一条SQL语句在设置收货地址时已经开发,无需重复开发

    delete from t_address where aid=?
    
    • 1

    需要判断删除的地址是否是默认地址(使用aid查询到的地址对象的getIsDefault方法),如果判断出删的是默认地址,则还需要定义把哪个地址设为默认,这里定义最新修改的为默认地址(如果用户本身就只有一条地址,那么删除后其他操作就可以不进行了,所以需要查询该用户的所有地址数量,在设置收货地址时已经开发,无需重复开发).

    select * from t_address where uid=? order by modified_time DESC limit 0,1
    
    • 1

    其中limit 0,1表示查询到的第一条数据(limit (n-1),pageSize),这样查询后就只会获得第一条数据

    2.设计接口和抽象方法

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

    //删除地址
        Integer deleteByAid(Integer aid);
    //查找最后修改的一条收货地址
      Address findLastModifedTime(Integer uid);
    
    • 1
    • 2
    • 3
    • 4

    在AddressMapper.xml文件中进行映射

        <delete id="deleteByAid">
    delete from t_address where aid=#{aid}
        </delete>
        <select id="findLastModifedTime" resultMap="AddressEntityMap">
    
    select * from t_address where uid=#{uid} order by modified_time desc limit 0,1
        </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (二)删除收货地址(业务层)

    1.规划异常

    可能没有该条地址数据(已开发)
    可能地址数据归属错误(已开发)
    在执行删除的时候可能会产生未知的异常导致数据不能够删除成功,则抛出DeleteException异常,在service创建该异常并使其继承业务层异常

    /**删除数据时产生的异常*/
    public class DeleteException extends ServiceException{
        /**重写ServiceException的所有构造方法*/
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2.设计接口和抽象方法及实现

    在IAddressService接口中定义抽象方法

    根据分析可得,该抽象方法的实现依赖于持久层的以下方法:
    1.findByAid:查询该条地址数据是否存在,参数是aid
    2.判断地址数据归属是否正确
    3.deleteByAid:删除地址数据,参数是aid
    4.判断删除的是否是默认地址
    5.countByUid:统计用户地址数量,参数是uid
    6.findLastModified:查询得到最后修改的一条地址,参数是uid
    7.updateDefaultByAid:设置默认收货地址,参数是aid,modifiedUser,modifiedTime

    稍加分析可以得出接下来定义的抽象方法的参数是:aid,uid,username

    /**
    * 删除用户选中的收货地址数据
    * @param aid 收货地址id
    * @param uid 用户id
    * @param username 用户名
    */
    void delete(Integer aid,Integer uid,String username);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在addressServiceImpl中实现该方法

        @Override
        public void deleteAddress(Integer aid, Integer uid, String username) {
            Address aid1 = addressMapper.findByAid(aid);
            if (aid1==null){
                throw new AddressNotFoundException("收货地址不存在");
            }
            if (!aid1.getUid().equals(uid)){
                throw new AccessDeniedException("非法数据访问");
            }
            //判断是否为默认地址
            Integer deleteByAid = addressMapper.deleteByAid(aid);
            if (deleteByAid!=1){
                throw new DeleteException("删除收货地址时出现错误");
            }
            if (addressMapper.countByUid(uid)==0){
                return;
            }
    if (aid1.getIsDefault()==1){
    
        Address address = addressMapper.findLastModifedTime(uid);
        Integer integer = addressMapper.updateDefaultByAid(address.getAid(), username, new Date());
        if (integer!=1){
            throw new UpdateException("设置默认地址时产生异常");
        }
    }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    (三)删除收货地址(控制层)

    1.处理异常

    需要在BaseController类中处理异常类

    else if (e instanceof DeleteException) {
        result.setState(5002);
        result.setMessage("删除数据时产生未知的异常");
    }
    
    • 1
    • 2
    • 3
    • 4
    2.设计请求

    请求路径:/addresses/{aid}/delete
    请求方式:POST
    请求参数:Integer aid,HttpSession session
    响应结果:JsonResult< Void>

    3.处理请求

    在adressController中实现该请求

    @PostMapping("{aid}/delete")
        public JsonResult<Void> deleteAddress(@PathVariable("aid") Integer aid,HttpSession session){
        String getusernamesession = getusernamesession(session);
        Integer getuidfromsession = getuidfromsession(session);
        addressService.deleteAddress(aid,getuidfromsession,getusernamesession);
        return new JsonResult<>(ok);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (四)删除收货地址(前端页面)

    给"删除"按钮添加onclick属性并指向deleteByAid(aid)方法

    <td><a onclick="deleteByAid(#{aid})" class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>
    
    
    • 1
    • 2

    2.给占位符赋值
    因为处理"设置默认收货地址"时已经编写tr = tr.replace(“#{aid}”,list[i].aid);用来给占位符#{aid}赋值,所以这里不需要再写.但是需要把replace改为replaceAll

    完成deleteByAid(aid)方法的声明

     function deleteByAid(aid){
    				  $.ajax({
    					  url: "/addresses/"+aid+"/delete",
    					  type: "POST",
    					  dataType: "JSON",
    					  success: function (json) {
    						  if (json.state == 200) {
    							  //重新加载收货地址列表页面
    							  showAddressList();
    						  } else {
    							  alert("删除收货地址失败")
    						  }
    					  },
    					  error: function (xhr) {
    						  alert("删除收货地址时产生未知的异常!"+xhr.message);
    					  }
    				  });
    			  }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    商品热销排行

    (一)创建数据表

    1.在store数据库中创建t_product数据表

    CREATE TABLE t_product (
      id int(20) NOT NULL COMMENT '商品id',
      category_id int(20) DEFAULT NULL COMMENT '分类id',
      item_type varchar(100) DEFAULT NULL COMMENT '商品系列',
      title varchar(100) DEFAULT NULL COMMENT '商品标题',
      sell_point varchar(150) DEFAULT NULL COMMENT '商品卖点',
      price bigint(20) DEFAULT NULL COMMENT '商品单价',
      num int(10) DEFAULT NULL COMMENT '库存数量',
      image varchar(500) DEFAULT NULL COMMENT '图片路径',
      `status` int(1) DEFAULT '1' COMMENT '商品状态  1:上架   2:下架   3:删除',
      priority int(10) DEFAULT NULL COMMENT '显示优先级',
      created_time datetime DEFAULT NULL COMMENT '创建时间',
      modified_time datetime DEFAULT NULL COMMENT '最后修改时间',
      created_user varchar(50) DEFAULT NULL COMMENT '创建人',
      modified_user varchar(50) DEFAULT NULL COMMENT '最后修改人',
      PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.向该表插入数据

    LOCK TABLES t_product WRITE;
    INSERT INTO t_product VALUES (10000001,238,'牛皮纸记事本','广博(GuangBo)10本装40张A5牛皮纸记事本子日记本办公软抄本GBR0731','经典回顾!超值特惠!',23,99999,'/images/portal/00GuangBo1040A5GBR0731/',1,62,'2017-10-25 15:08:55','2017-10-25 15:08:55','admin','admin'),等等等等;
    UNLOCK TABLES;
    
    • 1
    • 2
    • 3

    (三)创建商品的实体类

    创建Product实体类并使其继承BaseEntity类

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Product extends baseEntity implements Serializable {
        private Integer id;
        private Integer categoryId;
        private String itemType;
        private String title;
        private String sellPoint;
        private Long price;
        private Integer num;
        private String image;
        private Integer status;
        private Integer priority;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    (四)商品热销排行(持久层)

    1.规划sql

    查询热销商品列表的SQL语句

    SELECT * FROM t_product WHERE status=1 ORDER BY priority DESC LIMIT 0,4
    
    • 1
    2.设计接口和抽象方法

    在mapper包下创建ProductMapper接口并在接口中添加查询热销商品findHotList()的方法

    public interface ProductMapper {
        List<Product> findHotList();
    }
    
    • 1
    • 2
    • 3

    在main\resources\mapper文件夹下创建ProductMapper.xml文件,并在文件中配置findHotList()方法的映射

    <mapper namespace="com.cy.store.mapper.ProductMapper">
        <resultMap id="ProductEntityMap" type="com.cy.store.entity.Product">
            <id column="id" property="id"/>
            <result column="category_id" property="categoryId"/>
            <result column="item_type" property="itemType"/>
            <result column="sell_point" property="sellPoint"/>
            <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>
    
    <select id="findHotList" resultMap="ProductEntityMap">
        select *
        from t_product where status=1 order by priority desc limit 0,4;
    </select>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    (五)商品热销排行(业务层)

    1.规划异常

    只要是查询,不涉及到增删改的,都没有异常,无非就是没有该数据然后返回空

    2.设计接口和抽象方法及实现

    创建IProductService接口,并在接口中添加findHotList()方法

    public interface IProductService {
    List<Product> findHotList();
    }
    
    
    • 1
    • 2
    • 3
    • 4

    在业务层创建ProductServiceImpl类并实现该方法

    @Service
    public class ProductServiceImpl implements IProductService {
        @Resource
        private ProductMapper productMapper;
    
        @Override
        public List<Product> findHotList() {
            List<Product> hotList = productMapper.findHotList();
            for (Product product : hotList) {
                product.setPriority(null);
                product.setCreatedUser(null);
                product.setCreatedTime(null);
                product.setModifiedUser(null);
                product.setModifiedTime(null);
            }
            return hotList;
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    (六)商品热销排行(控制层)

    1.处理异常

    无异常处理

    2.设计请求

    请求路径:/products/hot_list
    请求方式:GET
    请求参数:不需要请求参数
    响应结果:JsonResult>

    3.处理请求

    创建ProductController类并使其继承BaseController类,在类中编写处理请求的方法

    @RequestMapping("products")
    @RestController
    public class ProductController extends BaseController{
    @Autowired
    private IProductService productService;
    
    @GetMapping("hot_list")
        public JsonResult<List<Product>> findHotList(){
        List<Product> hotList = productService.findHotList();
        return new JsonResult<>(ok,hotList);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    为了能不登录也可以访问该数据,需要将products/**请求添加到白名单中,在LoginInterceptorConfigure类的addInterceptors方法中添加代码:

    patterns.add("/products/**");
    
    • 1

    (七)商品热销排行(前端页面)

    在index.html页面给“热销排行”列表的div标签设置id属性值

    <div id="hot-list" class="panel-body panel-item">
    	<!-- ... -->
    </div>
    
    
    • 1
    • 2
    • 3
    • 4

    在index.html页面中添加展示热销排行商品的js代码

    <script type="text/javascript">
        $(document).ready(function() {
        showHotList();
    });
    
    function showHotList() {
        $("#hot-list").empty();
        $.ajax({
            url: "/products/hot_list",
            type: "GET",
            dataType: "JSON",
            success: function(json) {
                var list = json.data;
                for (var i = 0; i < list.length; i++) {
                    console.log(list[i].title);//调试用
                    var html = '
    ' + '<div class="col-md-7 text-row-2"><a href="product.html?id=#{id}">#{title}</a></div>' + '<div class="col-md-2">¥#{price}</div>' + '<div class="col-md-3"><img src="..#{image}collect.png" class="img-responsive" /></div>' + '
    '
    ; html = html.replace(/#{id}/g, list[i].id); html = html.replace(/#{title}/g, list[i].title); html = html.replace(/#{price}/g, list[i].price); html = html.replace(/#{image}/g, list[i].image); $("#hot-list").append(html); } } }); } </script>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    后记
    👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

  • 相关阅读:
    C++ 字符串哈希(hush)讲解
    23.4 Bootstrap 框架5
    小李学知识之redis相关(redis面试题)
    Spring Boot 2.7.5 整合 Swagger 3 实现可交互的后端接口文档
    【得到日期对象NSDate的各个部分 Objective-C语言】
    Android 关于IC卡的读写和加密
    八大排序之堆排序
    如何在 Spring Boot 优雅关闭加入一些自定义机制
    聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用
    重启人生,重新出发
  • 原文地址:https://blog.csdn.net/m0_59230408/article/details/130519063