• springboot的商品设计热销排行实现


    一.SpringBoot是什么?

    SpringBoot是spring家族中微型框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。

    Spring Boot可以轻松创建独立的,生产级的基于Spring的应用程序,您可以“运行”。

    特征:

    • 创建独立的Spring应用程序
    • 直接嵌入Tomcat,Jetty或Undertow(无需部署WAR文件)
    • 提供自以为是的“入门”依赖项以简化构建配置
    • 尽可能自动配置Spring和第三方库
    • 提供生产就绪功能,例如指标,运行状况检查和外部化配置
    • 绝对没有代码生成,也不需要XML配置

    SpringBoot要解决的问题?

    随着Java语言的慢慢发展,Java的开发显得格外的笨重,繁多的配置,低下的开发效率,复杂的部署流程以及第三方技术集成难度非常大而且杂。

    在上述环境中,SpringBoot营运而生,它使用“习惯由于配置”的理念让你的项目快速的运行起来,使用SpringBoot很容易创建一个独立运行。它内置Tomcat,Servlet,Spring等等基本开发的功能。

    SpringBoot的优势?

    快速构建项目,敏捷式开发

    项目可独立运行,无须外部依赖Servlet容器。

    对主流框架无配置支持,简化开发,也可以修改默认值。

    提供运行时的应用监控。极大的提高了开发、部署效率。

    与spring cloud天然集成。

    限制:将现有或传统的Spring Framework项目转换为Spring Boot应用程序是一个非常困难和耗时的过程。它仅适用于全新Spring项目

    什么是微服务?

    首先微服务并没有一个官方的定义,想要直接描述微服务比较困难。

    它是一种“软件的架构风格”,一个应用应该是一组小型服务。各个小型服务运行在各自的环境中,通过http的方式进行互通。

    微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库

    二、springboot是什么

    spring是一个为了解决企业级应用开发的复杂性而创建的,简化开发

    三、spring是如何简化开发的?

    为了降低Java开发的复杂性,Spring提供了以下四种关键策略:

    1.基于pojo的轻量级和最小侵入性编程

    2.通过IOC、依赖注入(DI)和面向接口实现松耦合

    3.基于切面(AOP)和惯例进行声明式编程

    4.通过切面和模板减少样式代码

    四、springboot

    springboot基于spring开发,springboot本身不提供spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于spring框架的应用程序。也就是说,它并不是用来替代spring的解决方案,而是和spring框架紧密结合用于提升spring开发者体验的工具。springboot以约定大于配置的核心思想,默认帮我们进行了很多设置,多数springboot应用只需要很少的spring配置。同时它集成了大量常用的第三方库配置(例如Redis、MongoDB、Jpa、RabbitMQ、Quartz等等),springboot应用中这些第三方库几乎可以零配置的开箱即用。所以,springboot是整合了所有的框架,它不是什么新框架。

    商品热销排行

    1 商品-创建数据表

    1.使用use命令先选中store数据库。

    1. USE store;
    2. 复制代码

    2.在store数据库中创建t_product数据表。

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

    2 商品-创建实体类

    创建com.cy.store.entity.Product类,并继承自BaseEntity类。在类中声明与数据表中对应的属性。

    1. package com.cy.store.entity;
    2. /** 商品数据的实体类 */
    3. public class Product extends BaseEntity implements Serializable {
    4. private Integer id;
    5. private Integer categoryId;
    6. private String itemType;
    7. private String title;
    8. private String sellPoint;
    9. private Long price;
    10. private Integer num;
    11. private String image;
    12. private Integer status;
    13. private Integer priority;
    14. // Generate: Getter and Setter、Generate hashCode() and equals()、toString()
    15. }
    16. 复制代码

    3 商品-热销排行-持久层

    3.1 规划需要执行的SQL语句

    查询热销商品列表的SQL语句大致是。

    1. SELECT * FROM t_product WHERE status=1 ORDER BY priority DESC LIMIT 0,4
    2. 复制代码

    3.2 接口与抽象方法

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

    1. package com.cy.store.mapper;
    2. import com.cy.store.entity.Product;
    3. import java.util.List;
    4. /** 处理商品数据的持久层接口 */
    5. public interface ProductMapper {
    6. /**
    7. * 查询热销商品的前四名
    8. * @return 热销商品前四名的集合
    9. */
    10. List<Product> findHotList();
    11. }
    12. 复制代码

    3.3 配置SQL映射

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

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.cy.store.mapper.ProductMapper">
    6. <resultMap id="ProductEntityMap" type="com.cy.store.entity.Product">
    7. <id column="id" property="id"/>
    8. <result column="category_id" property="categoryId"/>
    9. <result column="item_type" property="itemType"/>
    10. <result column="sell_point" property="sellPoint"/>
    11. <result column="created_user" property="createdUser"/>
    12. <result column="created_time" property="createdTime"/>
    13. <result column="modified_user" property="modifiedUser"/>
    14. <result column="modified_time" property="modifiedTime"/>
    15. </resultMap>
    16. <!-- 查询热销商品的前四名:List<Product> findHostList() -->
    17. <select id="findHotList" resultMap="ProductEntityMap">
    18. SELECT
    19. *
    20. FROM
    21. t_product
    22. WHERE
    23. status=1
    24. ORDER BY
    25. priority DESC
    26. LIMIT 0,4
    27. </select>
    28. </mapper>
    29. 复制代码

    2.在com.cy.store.mapper包下创建ProductMapperTests测试类,并添加测试方法。

    1. package com.cy.store.mapper;
    2. import com.cy.store.entity.Product;
    3. import org.junit.Test;
    4. import org.junit.runner.RunWith;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.boot.test.context.SpringBootTest;
    7. import org.springframework.test.context.junit4.SpringRunner;
    8. import java.util.List;
    9. @RunWith(SpringRunner.class)
    10. @SpringBootTest
    11. public class ProductMapperTests {
    12. @Autowired
    13. private ProductMapper productMapper;
    14. @Test
    15. public void findHotList() {
    16. List list = productMapper.findHotList();
    17. System.out.println("count=" + list.size());
    18. for (Product item : list) {
    19. System.out.println(item);
    20. }
    21. }
    22. }
    23. 复制代码

    4 商品-热销排行-业务层

    4.1 规划异常

    说明:无异常。

    4.2 接口与抽象方法

    创建com.cy.store.service.IProductService接口,并在接口中添加findHotList()方法。

    1. package com.cy.store.service;
    2. import com.cy.store.entity.Product;
    3. import java.util.List;
    4. /** 处理商品数据的业务层接口 */
    5. public interface IProductService {
    6. /**
    7. * 查询热销商品的前四名
    8. * @return 热销商品前四名的集合
    9. */
    10. List<Product> findHotList();
    11. }
    12. 复制代码

    4.3 实现抽象方法

    1.创建com.cy.store.service.impl.ProductServiceImpl类,并添加@Service注解;在类中声明持久层对象以及实现接口中的方法。

    1. package com.cy.store.service.impl;
    2. import com.cy.store.entity.Product;
    3. import com.cy.store.mapper.ProductMapper;
    4. import com.cy.store.service.IProductService;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. import java.util.List;
    8. /** 处理商品数据的业务层实现类 */
    9. @Service
    10. public class ProductServiceImpl implements IProductService {
    11. @Autowired
    12. private ProductMapper productMapper;
    13. @Override
    14. public List findHotList() {
    15. List list = productMapper.findHotList();
    16. for (Product product : list) {
    17. product.setPriority(null);
    18. product.setCreatedUser(null);
    19. product.setCreatedTime(null);
    20. product.setModifiedUser(null);
    21. product.setModifiedTime(null);
    22. }
    23. return list;
    24. }
    25. }
    26. 复制代码

    2.在com.cy.store.service包下创建测试类ProductServiceTests,并编写测试方法。

    1. package com.cy.store.service;
    2. import com.cy.store.entity.Product;
    3. import com.cy.store.service.ex.ServiceException;
    4. import org.junit.Test;
    5. import org.junit.runner.RunWith;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.boot.test.context.SpringBootTest;
    8. import org.springframework.test.context.junit4.SpringRunner;
    9. import java.util.List;
    10. @RunWith(SpringRunner.class)
    11. @SpringBootTest
    12. public class ProductServiceTests {
    13. @Autowired
    14. private IProductService productService;
    15. @Test
    16. public void findHotList() {
    17. try {
    18. List list = productService.findHotList();
    19. System.out.println("count=" + list.size());
    20. for (Product item : list) {
    21. System.out.println(item);
    22. }
    23. } catch (ServiceException e) {
    24. System.out.println(e.getClass().getSimpleName());
    25. System.out.println(e.getMessage());
    26. }
    27. }
    28. }
    29. 复制代码

    5 商品-热销排行-控制器

    5.1 处理异常

    说明:无异常。

    5.2 设计请求

    1.设计用户提交的请求,并设计响应的方式。

    1. 请求路径:/products/hot_list
    2. 请求参数:无
    3. 请求类型:GET
    4. 响应结果:JsonResult<List<Product>>
    5. 是否拦截:否,需要将index.html和products/**添加到白名单
    6. 复制代码

    2.在LoginInterceptorConfigurer类中将index.html页面和products/**请求添加到白名单。

    1. patterns.add("/web/index.html");
    2. patterns.add("/products/**");
    3. 复制代码

    5.3 处理请求

    1.创建com.cy.controller.ProductController类继承自BaseController类,类添加@RestController和@RequestMapping("products")注解,并在类中添加业务层对象。

    1. package com.cy.store.controller;
    2. import com.cy.store.entity.Product;
    3. import com.cy.store.service.IProductService;
    4. import com.cy.store.util.JsonResult;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. import org.springframework.web.bind.annotation.RestController;
    8. import java.util.List;
    9. @RestController
    10. @RequestMapping("products")
    11. public class ProductController extends BaseController {
    12. @Autowired
    13. private IProductService productService;
    14. }
    15. 复制代码

    2.在类中添加处理请求的getHotList()方法。

    1. @RequestMapping("hot_list")
    2. public JsonResult<List<Product>> getHotList() {
    3. List<Product> data = productService.findHotList();
    4. return new JsonResult<List<Product>>(OK, data);
    5. }
    6. 复制代码

    3.完成后启动项目,直接访问http://localhost:8080/products/hot_list进行测试。

    6 商品-热销排行-前端页面

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

    1. <div id="hot-list" class="panel-body panel-item">
    2. div>
    3. 复制代码

    2.在index.html页面中body标签内部的最后,添加展示热销排行商品的代码。

    1. <script type="text/javascript">
    2. $(document).ready(function() {
    3. showHotList();
    4. });
    5. function showHotList() {
    6. $("#hot-list").empty();
    7. $.ajax({
    8. url: "/products/hot_list",
    9. type: "GET",
    10. dataType: "JSON",
    11. success: function(json) {
    12. let list = json.data;
    13. console.log("count=" + list.length);
    14. for (let i = 0; i < list.length; i++) {
    15. console.log(list[i].title);
    16. let html = '
      '
    17. + '
      ¥#{price}
      '
    18. + '
      '
    19. + '
      ';
  • 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>
  • 复制代码
  • 3.完成后启动项目,直接访问http://localhost:8080/web/index.html进行测试。

    显示商品详情

    1 商品-显示商品详情-持久层

    1.1 规划需要执行的SQL语句

    根据商品id显示商品详情的SQL语句大致是。

    1. SELECT * FROM t_product WHERE id=?
    2. 复制代码

    1.2 接口与抽象方法

    在ProductMapper接口中添加抽象方法。

    1. /**
    2. * 根据商品id查询商品详情
    3. * @param id 商品id
    4. * @return 匹配的商品详情,如果没有匹配的数据则返回null
    5. */
    6. Product findById(Integer id);
    7. 复制代码

    1.3 配置SQL映射

    1.在ProductMapper.xml文件中配置findById(Integer id)方法的映射。

    1. <!-- 根据商品id查询商品详情:Product findById(Integer id) -->
    2. <select id="findById" resultMap="ProductEntityMap">
    3. SELECT
    4. *
    5. FROM
    6. t_product
    7. WHERE
    8. id=#{id}
    9. </select>
    10. 复制代码

    2.在ProductMapperTests测试类中添加测试方法。

    1. @Test
    2. public void findById() {
    3. Integer id = 10000017;
    4. Product result = productMapper.findById(id);
    5. System.out.println(result);
    6. }
    7. 复制代码

    2 商品-显示商品详情-业务层

    2.1 规划异常

    如果商品数据不存在,应该抛出ProductNotFoundException,需要创建com.cy.store.service.ex.ProductNotFoundException异常。

    1. package com.cy.store.service.ex;
    2. /** 商品数据不存在的异常 */
    3. public class ProductNotFoundException extends ServiceException {
    4. // Override Methods...
    5. }
    6. 复制代码

    2.2 接口与抽象方法

    在业务层IProductService接口中添加findById(Integer id)抽象方法。

    1. /**
    2. * 根据商品id查询商品详情
    3. * @param id 商品id
    4. * @return 匹配的商品详情,如果没有匹配的数据则返回null
    5. */
    6. Product findById(Integer id);
    7. 复制代码

    2.3 实现抽象方法

    1.在ProductServiceImpl类中,实现接口中的findById(Integer id)抽象方法。

    1. @Override
    2. public Product findById(Integer id) {
    3. // 根据参数id调用私有方法执行查询,获取商品数据
    4. Product product = productMapper.findById(id);
    5. // 判断查询结果是否为null
    6. if (product == null) {
    7. // 是:抛出ProductNotFoundException
    8. throw new ProductNotFoundException("尝试访问的商品数据不存在");
    9. }
    10. // 将查询结果中的部分属性设置为null
    11. product.setPriority(null);
    12. product.setCreatedUser(null);
    13. product.setCreatedTime(null);
    14. product.setModifiedUser(null);
    15. product.setModifiedTime(null);
    16. // 返回查询结果
    17. return product;
    18. }
    19. 复制代码

    2.在ProductServiceTests测试类中编写测试方法。

    1. @Test
    2. public void findById() {
    3. try {
    4. Integer id = 100000179;
    5. Product result = productService.findById(id);
    6. System.out.println(result);
    7. } catch (ServiceException e) {
    8. System.out.println(e.getClass().getSimpleName());
    9. System.out.println(e.getMessage());
    10. }
    11. }
    12. 复制代码

    3 商品-显示商品详情-控制器

    3.1 处理异常

    在BaseController类中的handleException()方法中添加处理ProductNotFoundException的异常。

    1. // ...
    2. else if (e instanceof ProductNotFoundException) {
    3. result.setState(4006);
    4. }
    5. // ...
    6. 复制代码

    3.2 设计请求

    设计用户提交的请求,并设计响应的方式。

    1. 请求路径:/products/{id}/details
    2. 请求参数:@PathVariable("id") Integer id
    3. 请求类型:GET
    4. 响应结果:JsonResult<Product>
    5. 复制代码

    3.3 处理请求

    1.在ProductController类中添加处理请求的getById()方法。

    1. @GetMapping("{id}/details")
    2. public JsonResult<Product> getById(@PathVariable("id") Integer id) {
    3. // 调用业务对象执行获取数据
    4. Product data = productService.findById(id);
    5. // 返回成功和数据
    6. return new JsonResult<Product>(OK, data);
    7. }
    8. 复制代码

    2.完成后启动项目,直接访问http://localhost:8080/products/10000017/details进行测试。

    4 商品-显示商品详情-前端页面

    1.检查在product.html页面body标签内部的最后是否引入jquery-getUrlParam.js文件,如果引入无需重复引入。

    1. <script type="text/javascript" src="../js/jquery-getUrlParam.js"></script>
    2. 复制代码

    2.在product.html页面中body标签内部的最后添加获取当前商品详情的代码。

    1. <script type="text/javascript">
    2. let id = $.getUrlParam("id");
    3. console.log("id=" + id);
    4. $(document).ready(function() {
    5. $.ajax({
    6. url: "/products/" + id + "/details",
    7. type: "GET",
    8. dataType: "JSON",
    9. success: function(json) {
    10. if (json.state == 200) {
    11. console.log("title=" + json.data.title);
    12. $("#product-title").html(json.data.title);
    13. $("#product-sell-point").html(json.data.sellPoint);
    14. $("#product-price").html(json.data.price);
    15. for (let i = 1; i <= 5; i++) {
    16. $("#product-image-" + i + "-big").attr("src", ".." + json.data.image + i + "_big.png");
    17. $("#product-image-" + i).attr("src", ".." + json.data.image + i + ".jpg");
    18. }
    19. } else if (json.state == 4006) { // 商品数据不存在的异常
    20. location.href = "index.html";
    21. } else {
    22. alert("获取商品信息失败!" + json.message);
    23. }
    24. }
    25. });
    26. });
    27. </script>

  • 相关阅读:
    mysql 主从配置
    FITC-PSA豌豆凝集素,PSA-FITC,豌豆凝集素修饰绿色荧光素
    手把手教你使用Vite构建第一个Vue3项目
    Swift Combine — Publisher、Operator、Subscriber概念介绍
    Vue---插槽
    智慧能源解决方案-最新全套文件
    Jenkins安装多个jdk版本,并在项目中选择对应jdk版本
    linux上系统磁盘满了的问题
    ARM开发(一)预备知识——半导体器件,模拟数字部分,计算机组成及原理
    极速PDF编辑器提示缺少字体如何解决
  • 原文地址:https://blog.csdn.net/BASK2312/article/details/128183039