文章目录

    • 开发过程的坑或者细节总结
      • 1.注意后端返回的数据格式要与前端一致
    • 有效练习
  • 开发用到的工具类都在这
    • 生成商品快照ID
    • 购物车设置时间格式
    • Swagger-ui开发文档
    • 逆向工程
    • 全局类
    • MD5工具类
  • 一.环境搭建
    • 1.聚合工程环境搭建
    • 2.模块依赖图
    • 3.父工程配置
    • 4.注意点:
  • 二.用户模块
    • 2.1登录模块
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
    • 2.2注册模块
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
  • 三.首页模块
    • 3.1轮播图
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
    • 3.2三级分类
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
    • 3.3新品推荐
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
    • 3.4分类推荐
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
  • 四.商品模块
    • 4.1商品基本信息
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
    • 4.2 商品参数
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
    • 4.3商品评论分页查询
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
    • 4.4商品评论统计
      • 1请求路径
      • 2.流程图分析
      • 3.接口测试
  • 五.购物车模块
    • 5.1添加购物车
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
      • 4.效果图
    • 5.2 购物车列表
      • 1.请求路径
      • 2.流程图
      • 3.接口测试
      • 4.效果图
    • 5.3更新购物车
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
      • 4.效果图
    • 5.4 确认购物车
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
      • 4.效果图
  • 六.地址模块
    • 6.1收货地址
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
      • 4.效果图
  • 七.订单模块
    • 7.1提交订单
      • 1.请求路径
      • 2.流程图分析
      • 3.接口测试
      • 4.业务层完整代码

开发过程的坑或者细节总结

1.注意后端返回的数据格式要与前端一致


我一直困惑这里为什么要返回第一条数据
明明就是通过id去查的参数表,我看了数据库表,一个id只有一个参数,
那返回结果肯定也是一条,但是我的前端页面始终映射不出来
到后面对比了接口返回的数据
如果没加get(0) 返回的是一个数组格式,而前端要的不是数组,所以映射不出来

有效练习

总会有一种感觉发现你跟着视频敲完一个项目之后
你发现你啥也没学会的感觉
那是因为你依赖于视频,没有直接单独写一遍
可以流程图来写代码
只有当你能完完整整不看视频教程自己写出来
才代表你已经吸收了这个项目 

开发用到的工具类都在这

生成商品快照ID

String itemId = System.currentTimeMillis()+""+ (new Random().nextInt(89999)+10000);

购物车设置时间格式

private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
cart.setCartTime(sdf.format(new Date()));

Swagger-ui开发文档

后端开发需要写开发文档,费时间
可以直接使用swagger-ui,还可以进行接口测试,真香
使用方法:
1.导入依赖
2.创建配置类
3.修改配置类里面的扫描路径即可
.apis(RequestHandlerSelectors.basePackage("org.example.fmmall.controller"))
修改为你的controller类的路径即可小结:还是比较容易使用的,配置类直接拷贝就可以了,测试也可以直接在页面进行测试
  • 导入依赖
<!--   第三方页面依赖 doc.html 两个页面二选一即可 --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency><!--        swagger依赖--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!--        swagger页面依赖 swagger-ui.html  --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency>
  • 配置类

package org.example.fmmall.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2
public class SwaggerConfig {/*swagger会帮助我们生成接口文档* 1:配置生成的文档信息* 2: 配置生成规则*//*Docket封装接口文档信息*/@Beanpublic Docket getDocket(){//创建封面信息对象ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();apiInfoBuilder.title("《锋迷商城》后端接口说明").description("此文档详细说明了锋迷商城项目后端接口规范....").version("v 2.0.1").contact( new Contact("亮哥","www.liangge.com","liangge@wang.com") );ApiInfo apiInfo =  apiInfoBuilder.build();Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo) //指定生成的文档中的封面信息:文档标题、版本、作者.select().apis(RequestHandlerSelectors.basePackage("org.example.fmmall.controller")).paths(PathSelectors.any()).build();return docket;}}

逆向工程

xml配置类

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/><!-- 配置 GeneralDAO --><plugin type="tk.mybatis.mapper.generator.MapperPlugin"><property name="mappers" value="org.example.fmmall.general.GeneralDAO"/></plugin><!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 --><commentGenerator><property name="suppressAllComments" value="true"/></commentGenerator><!-- 配置数据库连接 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/fmmall?characterEncoding=utf-8&amp;useSSL=false"userId="root" password="legend" ></jdbcConnection><!-- 配置实体类存放路径 --><javaModelGenerator  targetPackage="org.example.fmmall.entity" targetProject="src/main/java"/><!-- 配置 XML 存放路径 --><sqlMapGenerator targetPackage="/" targetProject="src/main/resources/mappers"/><!-- 配置 DAO 存放路径 --><javaClientGenerator targetPackage="org.example.fmmall.dao" targetProject="src/main/java" type="XMLMAPPER"/><!-- 配置需要指定生成的数据库和表,% 代表所有表 --><table tableName="%"></table></context>
</generatorConfiguration>

pom.xml配置

<!--    逆向工程入口--><build><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>3.4.4</version></dependency></dependencies><configuration>
<!--                   自定义的generatorConfig文件载入进去就可以逆向工程了 --><configurationFile>${basedir}/src/main/resources/genetator/generatorConfig.xml</configurationFile></configuration></plugin></plugins></build>

全局类

ResultVO

@Data
@NoArgsConstructor
@AllArgsConstructor
//返回前端的信息封装类
public class ResultVO {private int code;//状态码private String msg;//返回信息private Object data;//返回数据
}

ResStatus


//状态码类
public class ResStatus {public static final int OK=10000;//成功public static final int NO=10001;//失败public static final int LOGIN_SUCCESS = 2000;  //认证成功public static final int LOGIN_FAIL_NOT = 20001; //用户未登录public static final int LOGIN_FAIL_OVERDUE = 20002; //用户登录失效
}

MD5工具类

//MD5 生成器
public class MD5Utils {public static String md5(String password){//生成一个md5加密器try {MessageDigest md = MessageDigest.getInstance("MD5");//计算MD5 的值md.update(password.getBytes());//BigInteger 将8位的字符串 转成16位的字符串 得到的字符串形式是哈希码值//BigInteger(参数1,参数2) 参数1 是 1为正数 0为0 -1为负数return new BigInteger(1, md.digest()).toString(16);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}
}

一.环境搭建

1.聚合工程环境搭建

聚合工程:通过一个父工程来管理子工程,可以降低冗余

2.模块依赖图

可以看到上面的依赖图,这样做有一个好处:
父类依赖可以得到子类的依赖,但子类得不到父类的依赖
就是比如说mapper的pom.xml引入了beans模块的依赖
则mapper可以使用到自身和beans下的依赖
再比如service模块引入了mapper模块的依赖
则service可以使用到自身和mapper和beans下的模块

3.父工程配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><modules><module>common</module><module>beans</module><module>mapper</module><module>service</module><module>api</module></modules><!--    继承spring-boot-starter-parent--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.4.4</version></parent><groupId>org.example</groupId><artifactId>fmmall</artifactId><version>2.0.1</version><!--    设置为pom--><packaging>pom</packaging><!--    将api里的其他文件复制到父类工程--><properties><java.version>1.8</java.version></properties>
<!--    版本统一控制--><dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency></dependencies></dependencyManagement><!--    构建--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

4.注意点:

父工程里面要设置为pom<packaging>pom</packaging>
子工程里面要设置为jar<packaging>jar</packaging>还有就是包名记得要写一致,看下图这样我们的环境就搭配好了,下面就来具体的业务实现

二.用户模块

2.1登录模块

1.请求路径

请求路径: /user/login?
请求参数: username,password
请求方法: get
提交方式: 表单形式?

2.流程图分析

3.接口测试

---------------------------成功---------------------------
{"code": 10000,"msg": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI5MzI2MjIwMCIsImlhdCI6MTY1NTQ0NDQzMCwianRpIjoiMTAiLCJleHAiOjE2NTU1MzA4MzB9.RbVa4GW5JVS2NIBQ6tBDi_q5DBVE7Mmj4IG287VzVLo","data": {"userId": 10,"username": "93262200","password": "25d55ad283aa400af464c76d713c07ad","nickname": null,"realname": null,"userImg": "img/default.png","userMobile": null,"userEmail": null,"userSex": null,"userBirth": null,"userRegtime": "2022-06-03T03:43:46.000+00:00","userModtime": "2022-06-03T03:43:46.000+00:00"}
}
---------------------------失败---------------------------
{"code": 10001,"msg": "密码错误","data": null
}---------------------------失败---------------------------
{"code": 10001,"msg": "用户名不存在","data": null
}

2.2注册模块

1.请求路径

请求路径:localhost:8080/user/register
请求方式:post
请求参数:user

2.流程图分析

3.接口测试

---------------------------成功---------------------------
{"code": 10000,"msg": "注册成功","data": {"userId": 15,"username": "932622001","password": "25d55ad283aa400af464c76d713c07ad","nickname": null,"realname": null,"userImg": null,"userMobile": null,"userEmail": null,"userSex": null,"userBirth": null,"userRegtime": "2022-06-17T05:38:03.174+00:00","userModtime": "2022-06-17T05:38:03.174+00:00"}
}---------------------------失败---------------------------
{"code": 10001,"msg": "用户名已存在","data": null
}

三.首页模块

3.1轮播图

1.请求路径

请求路径:localhost:8080/index/indeximg
请求方法:get
请求参数:无
sql语句: 查出status=1,按照seq排序的所有数据

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": [{"imgId": "1","imgUrl": "ad1.jpg","imgBgColor": "green","prodId": "101","categoryId": null,"indexType": 1,"seq": 1,"status": 1,"createTime": "2021-04-14T09:21:13.000+00:00","updateTime": "2021-04-14T09:21:18.000+00:00"},{"imgId": "2","imgUrl": "ad2.jpg","imgBgColor": "pink","prodId": null,"categoryId": "1","indexType": 2,"seq": 2,"status": 1,"createTime": "2021-04-14T09:21:49.000+00:00","updateTime": "2021-04-14T09:21:52.000+00:00"},{"imgId": "3","imgUrl": "ad3.jpg","imgBgColor": "black","prodId": "103","categoryId": null,"indexType": 1,"seq": 3,"status": 1,"createTime": "2021-04-14T09:22:23.000+00:00","updateTime": "2021-04-14T09:22:27.000+00:00"},{"imgId": "4","imgUrl": "ad4.jpg","imgBgColor": "orange","prodId": null,"categoryId": "2","indexType": 2,"seq": 4,"status": 1,"createTime": "2021-04-14T09:23:06.000+00:00","updateTime": "2021-04-14T09:23:08.000+00:00"}]
}

3.2三级分类

1.请求路径

请求路径:/index/category-list
请求方式:get
请求参数:无
sql语句:商品分类一般会有三级分类,要查出三级分类的数据,用到inner join和left join

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": [{"categoryId": 1,"categoryName": "点心/蛋糕","categoryLevel": 1,"parentId": 0,"categoryIcon": "cake.png","categorySlogan": "每一道甜品都有一个故事","categoryPic": "act1.png","categoryBgColor": null,"categories": [{"categoryId": 11,"categoryName": "蛋糕","categoryLevel": 2,"parentId": 1,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": [{"categoryId": 35,"categoryName": "蒸蛋糕","categoryLevel": 3,"parentId": 11,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null},{"categoryId": 36,"categoryName": "脱水蛋糕","categoryLevel": 3,"parentId": 11,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null},{"categoryId": 37,"categoryName": "瑞士卷","categoryLevel": 3,"parentId": 11,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null},{"categoryId": 38,"categoryName": "软面包","categoryLevel": 3,"parentId": 11,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null},{"categoryId": 39,"categoryName": "马卡龙","categoryLevel": 3,"parentId": 11,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null},{"categoryId": 40,"categoryName": "千层饼","categoryLevel": 3,"parentId": 11,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null},{"categoryId": 41,"categoryName": "甜甜圈","categoryLevel": 3,"parentId": 11,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null},{"categoryId": 42,"categoryName": "蒸三明治","categoryLevel": 3,"parentId": 11,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null},{"categoryId": 43,"categoryName": "铜锣烧","categoryLevel": 3,"parentId": 11,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null}]},{"categoryId": 12,"categoryName": "点心","categoryLevel": 2,"parentId": 1,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": [{"categoryId": 44,"categoryName": "华夫饼","categoryLevel": 3,"parentId": 12,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null},{"categoryId": 45,"categoryName": "老婆饼","categoryLevel": 3,"parentId": 12,"categoryIcon": null,"categorySlogan": null,"categoryPic": null,"categoryBgColor": null,"categories": null}]}]},

3.3新品推荐

1.请求路径

请求路径:/index/list-recommends
请求方式:get
请求参数:无

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": [{"productId": "3","productName": "咪咪小虾条","categoryId": 50,"rootCategoryId": 2,"soldNum": 199,"productStatus": 1,"createTime": "2021-04-26T07:58:09.000+00:00","updateTime": "2021-04-25T07:58:11.000+00:00","content": "<img src=\"static/pimgs/mmxt_desc.jpg\"/>","imgs": [{"id": "5","itemId": "3","url": "mmxt_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-25T07:59:28.000+00:00","updatedTime": "2021-04-25T07:59:31.000+00:00"}],"skus": null},{"productId": "2","productName": "旺旺华夫饼","categoryId": 22,"rootCategoryId": 1,"soldNum": 202,"productStatus": 1,"createTime": "2021-04-26T07:27:22.000+00:00","updateTime": "2021-04-25T07:27:25.000+00:00","content": "旺旺华夫饼商品内容","imgs": [{"id": "3","itemId": "2","url": "hfb_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-24T07:30:09.000+00:00","updatedTime": "2021-04-25T07:30:19.000+00:00"}],"skus": null},{"productId": "1","productName": "奥利奥小饼干666","categoryId": 46,"rootCategoryId": 2,"soldNum": 196,"productStatus": 1,"createTime": "2021-04-26T07:20:51.000+00:00","updateTime": "2021-04-23T07:20:58.000+00:00","content": "<label style=\"color:red;font-size:18px\">1.全新包装</label><br/><img src=\"static/pimgs/ala_desc1.png\"/><br/><label style=\"color:green;font-size:18px\">2.全新口味</label><br/><img src=\"static/pimgs/ala_desc2.png\"/><label style=\"color:blue;font-size:18px\">3.全新体验</label><br/><img src=\"static/pimgs/ala_desc3.png\"/>","imgs": [{"id": "1","itemId": "1","url": "ala_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-22T07:25:08.000+00:00","updatedTime": "2021-04-22T07:25:15.000+00:00"}],"skus": null}]
}
  • 记录图

3.4分类推荐

1.请求路径

请求路径:/index/category-recommends
请求方法: get
请求参数: 无

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": [{"categoryId": 1,"categoryName": "点心/蛋糕","categoryLevel": 1,"parentId": 0,"categoryIcon": "cake.png","categorySlogan": "每一道甜品都有一个故事","categoryPic": "act1.png","categoryBgColor": "black","categories": null,"products": [{"productId": "2","productName": "旺旺华夫饼","categoryId": 22,"rootCategoryId": 1,"soldNum": 202,"productStatus": 1,"createTime": "2021-04-26T07:27:22.000+00:00","updateTime": "2021-04-25T07:27:25.000+00:00","content": "旺旺华夫饼商品内容","imgs": [{"id": "3","itemId": "2","url": "hfb_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-24T07:30:09.000+00:00","updatedTime": "2021-04-25T07:30:19.000+00:00"}],"skus": null},{"productId": "11","productName": "商品11","categoryId": 10,"rootCategoryId": 1,"soldNum": 128,"productStatus": 1,"createTime": "2021-04-26T03:11:11.000+00:00","updateTime": "2021-04-26T03:11:11.000+00:00","content": "商品说明","imgs": [{"id": "15","itemId": "11","url": "wwxb_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-26T03:11:11.000+00:00","updatedTime": "2021-04-26T03:11:11.000+00:00"}],"skus": null},{"productId": "10","productName": "商品10","categoryId": 10,"rootCategoryId": 1,"soldNum": 127,"productStatus": 1,"createTime": "2021-04-26T03:11:11.000+00:00","updateTime": "2021-04-26T03:11:11.000+00:00","content": "商品说明","imgs": [{"id": "14","itemId": "10","url": "wwxb_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-26T03:11:11.000+00:00","updatedTime": "2021-04-26T03:11:11.000+00:00"}],"skus": null},{"productId": "9","productName": "商品9","categoryId": 10,"rootCategoryId": 1,"soldNum": 126,"productStatus": 1,"createTime": "2021-04-26T03:11:11.000+00:00","updateTime": "2021-04-26T03:11:11.000+00:00","content": "商品说明","imgs": [{"id": "13","itemId": "9","url": "wwxb_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-26T03:11:11.000+00:00","updatedTime": "2021-04-26T03:11:11.000+00:00"}],"skus": null},{"productId": "8","productName": "商品8","categoryId": 10,"rootCategoryId": 1,"soldNum": 125,"productStatus": 1,"createTime": "2021-04-26T03:11:11.000+00:00","updateTime": "2021-04-26T03:11:11.000+00:00","content": "商品说明","imgs": [{"id": "12","itemId": "8","url": "wwxb_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-26T03:11:11.000+00:00","updatedTime": "2021-04-26T03:11:11.000+00:00"}],"skus": null},{"productId": "7","productName": "商品7","categoryId": 10,"rootCategoryId": 1,"soldNum": 124,"productStatus": 1,"createTime": "2021-04-26T03:11:11.000+00:00","updateTime": "2021-04-26T03:11:11.000+00:00","content": "商品说明","imgs": [{"id": "11","itemId": "7","url": "wwxb_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-26T03:11:11.000+00:00","updatedTime": "2021-04-26T03:11:11.000+00:00"}],"skus": null}]},{"categoryId": 2,"categoryName": "饼干/膨化","categoryLevel": 1,"parentId": 0,"categoryIcon": "cookies.png","categorySlogan": "健康饮食远离我","categoryPic": "act2.png","categoryBgColor": "black","categories": null,"products": [{"productId": "4","productName": "旺旺雪饼","categoryId": 46,"rootCategoryId": 2,"soldNum": 201,"productStatus": 1,"createTime": "2021-04-25T07:58:59.000+00:00","updateTime": "2021-04-25T07:59:03.000+00:00","content": "旺旺雪饼商品内容","imgs": [{"id": "7","itemId": "4","url": "wwxb_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-25T08:00:12.000+00:00","updatedTime": "2021-04-25T08:00:17.000+00:00"}],"skus": null},{"productId": "3","productName": "咪咪小虾条","categoryId": 50,"rootCategoryId": 2,"soldNum": 199,"productStatus": 1,"createTime": "2021-04-26T07:58:09.000+00:00","updateTime": "2021-04-25T07:58:11.000+00:00","content": "<img src=\"static/pimgs/mmxt_desc.jpg\"/>","imgs": [{"id": "5","itemId": "3","url": "mmxt_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-25T07:59:28.000+00:00","updatedTime": "2021-04-25T07:59:31.000+00:00"}],"skus": null},{"productId": "20","productName": "加力加虾条2","categoryId": 49,"rootCategoryId": 2,"soldNum": 199,"productStatus": 1,"createTime": "2021-03-04T01:53:14.000+00:00","updateTime": "2021-05-10T01:53:20.000+00:00","content": "加力加虾条说明","imgs": [],"skus": null},{"productId": "1","productName": "奥利奥小饼干666","categoryId": 46,"rootCategoryId": 2,"soldNum": 196,"productStatus": 1,"createTime": "2021-04-26T07:20:51.000+00:00","updateTime": "2021-04-23T07:20:58.000+00:00","content": "<label style=\"color:red;font-size:18px\">1.全新包装</label><br/><img src=\"static/pimgs/ala_desc1.png\"/><br/><label style=\"color:green;font-size:18px\">2.全新口味</label><br/><img src=\"static/pimgs/ala_desc2.png\"/><label style=\"color:blue;font-size:18px\">3.全新体验</label><br/><img src=\"static/pimgs/ala_desc3.png\"/>","imgs": [{"id": "1","itemId": "1","url": "ala_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-22T07:25:08.000+00:00","updatedTime": "2021-04-22T07:25:15.000+00:00"}],"skus": null},{"productId": "21","productName": "加力加虾条3","categoryId": 49,"rootCategoryId": 2,"soldNum": 168,"productStatus": 1,"createTime": "2021-03-04T01:53:14.000+00:00","updateTime": "2021-05-10T01:53:20.000+00:00","content": "加力加虾条说明","imgs": [],"skus": null},{"productId": "22","productName": "加力加虾条4","categoryId": 49,"rootCategoryId": 2,"soldNum": 168,"productStatus": 1,"createTime": "2021-03-04T01:53:14.000+00:00","updateTime": "2021-05-10T01:53:20.000+00:00","content": "加力加虾条说明","imgs": [],"skus": null}]},{"categoryId": 3,"categoryName": "熟食/肉类","categoryLevel": 1,"parentId": 0,"categoryIcon": "meat.png","categorySlogan": "nice!nice!nice!","categoryPic": "act3.png","categoryBgColor": "black","categories": null,"products": []},{"categoryId": 4,"categoryName": "素食/卤味","categoryLevel": 1,"parentId": 0,"categoryIcon": "bamboo.png","categorySlogan": null,"categoryPic": "act1.png","categoryBgColor": "black","categories": null,"products": []},{"categoryId": 5,"categoryName": "坚果/炒货","categoryLevel": 1,"parentId": 0,"categoryIcon": "nut.png","categorySlogan": "酥酥脆脆,回味无穷","categoryPic": "act2.png","categoryBgColor": "black","categories": null,"products": []},{"categoryId": 6,"categoryName": "糖果/蜜饯","categoryLevel": 1,"parentId": 0,"categoryIcon": "candy.png","categorySlogan": null,"categoryPic": "act3.png","categoryBgColor": "black","categories": null,"products": []},{"categoryId": 7,"categoryName": "巧克力","categoryLevel": 1,"parentId": 0,"categoryIcon": "chocolate.png","categorySlogan": null,"categoryPic": "act1.png","categoryBgColor": "black","categories": null,"products": []},{"categoryId": 8,"categoryName": "海味/河鲜","categoryLevel": 1,"parentId": 0,"categoryIcon": "fish.png","categorySlogan": null,"categoryPic": "act2.png","categoryBgColor": "black","categories": null,"products": []},{"categoryId": 9,"categoryName": "花茶/果茶","categoryLevel": 1,"parentId": 0,"categoryIcon": "tea.png","categorySlogan": "健康快乐每一天","categoryPic": "act3.png","categoryBgColor": "black","categories": null,"products": []},{"categoryId": 10,"categoryName": "品牌/礼包","categoryLevel": 1,"parentId": 0,"categoryIcon": "package.png","categorySlogan": "每日一个小惊喜","categoryPic": "act1.png","categoryBgColor": "black","categories": null,"products": []}]
}
  • 记录

四.商品模块

4.1商品基本信息

1.请求路径

请求路径:/product/detail-info/{pid}
请求方式: get
请求参数: pid

2.流程图分析

  • 表结构分析
可以看到上图
商品的基本信息包括商品信息,商品图片,套餐的信息
所以要都查出来返回

3.接口测试

{"code": 10000,"msg": "success","data": {"imgs": [{"id": "1","itemId": "1","url": "ala_1.png","sort": 1,"isMain": 1,"createdTime": "2021-04-22T07:25:08.000+00:00","updatedTime": "2021-04-22T07:25:15.000+00:00"},{"id": "2","itemId": "1","url": "ala_2.png","sort": 2,"isMain": 0,"createdTime": "2021-04-22T07:25:39.000+00:00","updatedTime": "2021-04-22T07:25:44.000+00:00"}],"skus": [{"skuId": "4","productId": "1","skuName": "奥利奥分享装","skuImg": "ala_1.png","untitled": "{口味:[\"草莓\",\"巧克力\",\"牛奶\",\"原味\"]}","originalPrice": 10,"sellPrice": 8,"discounts": 0.8,"stock": 137,"createTime": "2021-04-27T03:38:55.000+00:00","updateTime": "2021-04-27T03:39:00.000+00:00","status": 1}],"products": [{"productId": "1","productName": "奥利奥小饼干666","categoryId": 46,"rootCategoryId": 2,"soldNum": 196,"productStatus": 1,"createTime": "2021-04-26T07:20:51.000+00:00","updateTime": "2021-04-23T07:20:58.000+00:00","content": "<label style=\"color:red;font-size:18px\">1.全新包装</label><br/><img src=\"static/pimgs/ala_desc1.png\"/><br/><label style=\"color:green;font-size:18px\">2.全新口味</label><br/><img src=\"static/pimgs/ala_desc2.png\"/><label style=\"color:blue;font-size:18px\">3.全新体验</label><br/><img src=\"static/pimgs/ala_desc3.png\"/>"}]}
}

4.2 商品参数

1.请求路径

请求路径:/product/detail-params/{pid}
请求方法: get
请求参数: pid

2.流程图分析

  • 表结构分析

3.接口测试

{"code": 10000,"msg": "success","data": [{"paramId": "8","productId": "1","productPlace": "中国湖北武汉","footPeriod": "12个月","brand": "良品铺子","factoryName": "贤磊咪咪虾条有限责任公司","factoryAddress": "湖北武汉江夏区光谷大道77号","packagingMethod": "袋装","weight": "50g","storageMethod": "常温保存","eatMethod": "开袋即食","createTime": "2021-04-27T03:53:20.000+00:00","updateTime": "2021-04-27T03:53:35.000+00:00"}]
}

4.3商品评论分页查询

1.请求路径

请求路径:/index/detail-commonts/{pid}
请求方法: get
请求参数: pid;当前页:pageNum;每页显示条数:limit

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": {"count": 7, //总记录数"pageCount": 2, //总页数"list": [{"commId": "6","productId": "3","productName": "咪咪虾条","orderItemId": "10000006","isAnonymous": 1,"commType": 0,"commLevel": 1,"commContent": "评价内容6","commImgs": "{}","sepcName": "2021-04-21T01:39:16.000+00:00","replyStatus": null,"replyContent": null,"replyTime": null,"isShow": 1,"userId": "3","username": "wahaha","nickname": null,"userImg": "img/default.png"},{"commId": "7","productId": "3","productName": "咪咪虾条","orderItemId": "10000007","isAnonymous": 0,"commType": -1,"commLevel": 1,"commContent": "评价内容7","commImgs": "{}","sepcName": "2021-04-06T01:40:01.000+00:00","replyStatus": null,"replyContent": null,"replyTime": null,"isShow": 1,"userId": "4","username": "heihei","nickname": "二狗","userImg": "img/default.png"}]}
}

4.4商品评论统计

1请求路径

请求路径:/index/detail-commontscount/{pid}
请求方法: get
请求参数: pid

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": {"goodTotal": 4, //好评数"total": 7, //总评价数"badTotal": 0, //差评数"midTotal": 2, //中评数"comment": "57.14"}
}

五.购物车模块

5.1添加购物车

1.请求路径

请求路径: /shopcart/add
请求方法: post
请求参数: cart;token

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": null
}

4.效果图



5.2 购物车列表

1.请求路径

请求路径:/shopcart/list
请求方法: get
请求参数: userId;token

2.流程图

3.接口测试

{"code": 10000,"msg": "success","data": [{"cartId": 10,"productId": "1","skuId": "4","userId": "9","cartNum": "1","cartTime": null,"productPrice": 8,"skuProps": "口味:草莓;","productName": "奥利奥小饼干666","productImg": "ala_1.png","originalPrice": 10,"sellPrice": 8,"skuName": "奥利奥分享装"},{"cartId": 9,"productId": "3","skuId": "1","userId": "9","cartNum": "1","cartTime": null,"productPrice": 1,"skuProps": "口味:原味;包装:盒装;","productName": "咪咪小虾条","productImg": "mmxt_1.png","originalPrice": 2,"sellPrice": 1,"skuName": "咪咪虾条 单包 50g"}]
}

4.效果图


5.3更新购物车

1.请求路径

http://localhost:8080/shopcart/update/10/2
当你修改购物车的时候,前端是传了2个数字过来,用花括号来接收
第一个数字是购物车id;第二个是购物车数量
请求路径:/shopcart/update/{cid}/{cnum}
请求方法: put
请求参数: cid;cnum;token;

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": null
}

4.效果图


5.4 确认购物车

1.请求路径

请求路径:/shopcart/listbycids
请求方法: get
请求参数: cids,token

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": [{"cartId": 10,"productId": "1","skuId": "4","userId": "9","cartNum": "1","cartTime": null,"productPrice": 8,"skuProps": "口味:草莓;","productName": "奥利奥小饼干666","productImg": "ala_1.png","originalPrice": 10,"sellPrice": 8,"skuName": "奥利奥分享装"},{"cartId": 9,"productId": "3","skuId": "1","userId": "9","cartNum": "2","cartTime": null,"productPrice": 1,"skuProps": "口味:原味;包装:盒装;","productName": "咪咪小虾条","productImg": "mmxt_1.png","originalPrice": 2,"sellPrice": 1,"skuName": "咪咪虾条 单包 50g"}]
}

4.效果图

六.地址模块

6.1收货地址

1.请求路径

请求路径: /useraddr/list
请求方法: get
请求参数: userId;token

2.流程图分析

3.接口测试

{"code": 10000,"msg": "success","data": [{"addrId": "3","userId": "9","receiverName": "韩梅梅","receiverMobile": "13232323322","province": "湖南","city": "长沙","area": "岳麓区","addr": "淅沥淅沥","postCode": "430000","status": 1,"commonAddr": 1,"createTime": "2021-04-30T01:35:49.000+00:00","updateTime": "2021-04-30T01:35:53.000+00:00"}]
}

4.效果图

七.订单模块

7.1提交订单

这个功能可以说在微服务之前是我觉得比较难的一块
提交之后会对微信平台发送请求,然后返回一个支付链接
原作者是把微信请求这块写在controller层
我是写在service层
我尽可能把流程图写清晰一点
逻辑顺了,写代码才能顺

1.请求路径

请求路径: /order/add
请求方法: post
请求参数: cids;order

2.流程图分析

3.接口测试

{"code": 10000,"msg": "提交订单成功","data": {"orderId": "850c7d63ba804347bb5b034140e4af4e","productNames": "咪咪小虾条,","payUrl": "weixin://wxpay/bizpayurl?pr=2Q93QDIzz"//支付二维码}
}

4.业务层完整代码

package org.example.fmmall.service.impl;import com.github.wxpay.sdk.WXPay;
import org.example.fmmall.dao.OrderItemMapper;
import org.example.fmmall.dao.OrdersMapper;
import org.example.fmmall.dao.ProductSkuMapper;
import org.example.fmmall.dao.ShoppingCartMapper;
import org.example.fmmall.entity.OrderItem;
import org.example.fmmall.entity.Orders;
import org.example.fmmall.entity.ProductSku;
import org.example.fmmall.entity.ShoppingCartVO;
import org.example.fmmall.service.OrderService;
import org.example.fmmall.utils.MyPayConfig;
import org.example.fmmall.vo.ResStatus;
import org.example.fmmall.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.*;/*** About:* Date:*/
@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrdersMapper ordersMapper;@Autowiredprivate OrderItemMapper orderItemMapper;@Autowiredprivate ShoppingCartMapper shoppingCartMapper;@Autowiredprivate ProductSkuMapper productSkuMapper;/*** 提交订单* */@Overridepublic ResultVO addByCids(String cids,Orders order) throws SQLException {//用map来接收数据HashMap<String, String> map = new HashMap<>();//将前端传入的购物车id(字符串形式)转换成集合String[] split = cids.split(",");ArrayList<Integer> list = new ArrayList<>();for (int i=0;i<split.length;i++){list.add(Integer.parseInt(split[i]));}//判断是否有库存boolean f = true;//定义一个布尔类型变量//根据购物车id查询购物车表的数据List<ShoppingCartVO> shopVOS = shoppingCartMapper.selectByCids(list);String untitled = "";//定义一个空字符串//遍历数据for (ShoppingCartVO s : shopVOS) {//判断购物车商品数量是否大于商品库存if (Integer.parseInt(s.getCartNum())>s.getSkuStock()){//如果商品数量大于库存,则变为false,后面就不再执行了f=false;}//如果不成立,则将商品名字用逗号隔开,组成一个新的字符串untitled = untitled+s.getProductName()+",";}if (f){//如果有库存,则保存订单order.setUntitled(untitled);//设置商品名字order.setCreateTime(new Date());//设置订单创建时间order.setStatus("1");//设置订单状态 1为代付款//通过UUID生成订单号String orderId = UUID.randomUUID().toString().replace("-", "");order.setOrderId(orderId);//设置订单idordersMapper.insert(order);//将数据添加到订单表//生成订单快照for (ShoppingCartVO so:shopVOS) {int cnum = Integer.parseInt(so.getCartNum());//将商品数量格式改成int类型//生成订单快照idString itemId = System.currentTimeMillis()+""+ (new Random().nextInt(89999)+10000);//创建订单快照对象并且赋值OrderItem orderItem = new OrderItem(itemId,orderId,so.getProductId(),so.getProductName(),so.getProductImg(),so.getSkuId(),so.getSkuName(),new BigDecimal(so.getSellPrice()), cnum, new BigDecimal(so.getSellPrice() * cnum),new Date(), new Date(),0);//添加订单快照orderItemMapper.insert(orderItem);}//扣减库存for (ShoppingCartVO so:shopVOS) {//计算出商品目前的库存 = 商品原库存-购物车商品数量int i = so.getSkuStock() - Integer.parseInt(so.getCartNum());String skuId = so.getSkuId();//获取套餐idProductSku productSku = new ProductSku();//新建套餐对象productSku.setSkuId(skuId);//设置套餐idproductSku.setStock(i);//设置套餐库存productSkuMapper.updateByPrimaryKeySelective(productSku);//执行更新操作}//删除购物车for (int i : list) {shoppingCartMapper.deleteByPrimaryKey(i);//通过购物车id删除购物车表数据}map.put("orderId",orderId);//保存订单idmap.put("productNames",untitled);//保存商品名字}else {return new ResultVO(ResStatus.NO,"库存不足",null); //如果没库存,则返回}//微信支付try{//如果map集合数据不为空if(map!=null){String orderId = map.get("orderId");//获取订单idHashMap<String, String> data = new HashMap<>();data.put("body",map.get("productNames"));//设置商品名data.put("out_trade_no",orderId);//设置订单iddata.put("fee_type","CNY");//设置支付类型为人民币data.put("total_fee","1");//设置支付总金额data.put("trade_type","NATIVE");//设置交易类型data.put("notify_url","/pay/callbcak");//设置回调接口 也就是支付成功后的返回接口WXPay wxPay = new WXPay(new MyPayConfig());Map<String, String> resp = wxPay.unifiedOrder(data);//发起支付请求map.put("payUrl",resp.get("code_url"));//获取支付链接return new ResultVO(ResStatus.OK,"提交订单成功",map);}else {return new ResultVO(ResStatus.NO,"提交订单失败!",null);}}catch (SQLException e){return new ResultVO(ResStatus.NO,"提交订单失败!",null);}catch (Exception e){e.printStackTrace();}return new ResultVO(ResStatus.OK,"提交订单成功",map);}}

锋迷商城spring-vue项目流程和笔记相关推荐

  1. 《锋迷商城》——首页:轮播图

    <锋迷商城>系列项目 链接: <一> 项目搭建 链接: <二>数据库的创建 链接: <三>业务流程设计 链接: <四>业务流程实现:用户管理 ...

  2. 《锋迷商城》——用户认证

    <锋迷商城>系列项目 链接: <一> 项目搭建 链接: <二>数据库的创建 链接: <三>业务流程设计 链接: <四>业务流程实现:用户管理 ...

  3. 锋迷商城项目介绍(一)

    锋迷商城项目介绍 项目模块 一.用户管理 二.首页功能实现 三.商品详情 四.购物车 五.收货地址管理 六.提交订单 七.用户中心 八.订单管理 九.评价管理 十.中心首页数据显示 项目介绍 一.项目 ...

  4. 毕业设计学习锋迷商城的的笔记(自己设计并手写后台商品管理,分类管理,用户,地址管理系统,订单管理,微信支付(内网穿透))

    文章目录 自己添加的后端管理页面 视频演示效果 论文地址 后台代码视频实现讲解思路 1. 商品管理 2.商品分类管理 3.商品地址管理 4.权限管理系统 权限管理系统文章地址 5.订单管理 5.1 6 ...

  5. 毕业设计学习锋迷商城笔记

    文章目录 自己添加的后端管理页面 视频演示效果 1. 商品管理 2.商品分类管理 3.商品地址管理 4.用户中心管理 4. 用户权限管理 5.订单管理 6.商品品牌管理 锋迷商城项目 1.通过Mave ...

  6. Java电商 《锋迷商城》分布式笔记

    目录 ⼀.锋迷商城在互联⽹环境下存在的问题 1.1 ⾼并发带来的服务器访问压⼒问题 1.2 ⾼并发带来的业务处理问题 1.3 系统迭代带来的架构问题 1.4 业务实现问题 1.5 如何解决以上问题? ...

  7. 锋迷商城项目数据库设计(四)

    锋迷商城项目数据库设计 一.用户表 users 二.用户地址表 user_addr 三.登录历史表 user_login_history 四.轮播图 index_img 五.商品分类 category ...

  8. ui vue 创建项目教程 并关闭语法_创建vue项目流程

    创建vue项目流程 1.使用构建工具vue-cli创建项目脚手架 vue-cli是一个官方发布vue.js项目脚手架,使用vue-cli可以快速创建vue项目. (1)安装 确认已安装了node.js ...

  9. Idea创建Vue项目流程

    Vue项目创建流程 完全没有接触过vue的小白,之前还学过js,但是由于这近两年的时候一直在接触后台,前台已经忘的差不多了,想拾起来,学习学习. 用idea完全不知道怎么创建前台项目,然后问了我们项目 ...

  10. Vue vscode 创建 vue 项目流程【超详细】

    文章目录 一.安装node 二.配置淘宝镜像 三.配置 vscode(win10) 四.全局安装脚手架 五.创建项目 六.进入项目 七.项目结构 一.安装node 请在官网下载安装:https://n ...

最新文章

  1. 创业者应该如何看待金钱
  2. signature=89b7a6bcfac55abae5ac369dafee29f4,Capecitabine
  3. Django(二)模板系统
  4. 程序基础:数据结构(郝斌讲解)(2)
  5. 数据结构与算法 / 散列表(HashTable)
  6. TV Battle --HOJ 11915
  7. 将Spring源码转换为工程 + 导入Eclipse时缺失jar包
  8. 开放Nginx在文件夹列表功能
  9. Git服务器-Gogs搭建
  10. 1.45亿元!甲骨文中标中国邮政储蓄银行数据库项目
  11. 打开3DMAX2014报错,Error while registering plugins.
  12. 单片机毕设选题 - stm32心率脉搏血压体征监测手表(嵌入式 物联网)
  13. 基于PHP+Zend Studio 13 + MYSQL+饭店预订管理系统
  14. 面向对象的系统分析(一)-系统分析方法
  15. 2020数学建模国赛A题解题思路
  16. 睿智的目标检测30——Pytorch搭建YoloV4目标检测平台
  17. 计算机保研面试自我介绍,计算机保研面试英文自我介绍范文
  18. 修改ftp更新服务器地址,修改ftp服务器地址
  19. 【坑】MySQL数据库对于毫秒大于500的数据会进位
  20. BINARY和VARBINARY类型--MySql数据库

热门文章

  1. 企业网站建设前如何进行网站策划
  2. html音乐播放心得体会,听音乐讲座心得体会范文3篇
  3. “无人区”行驶8年,李诞的脱口秀路在何方?
  4. python爬虫的线程、进程、异步的基础讲解
  5. 电脑声音有回音 怎么弄回去啊 5
  6. 微软云服务器怎么注销,如何关闭你的 Microsoft 帐户——注销微软账号
  7. linux内核鼠标配置,linux开启鼠标驱动和qt鼠标支持
  8. Codeforces Round #660 (Div. 2) A. Captain Flint and Crew Recruitment
  9. 锆石科技开发板的简单介绍
  10. [转]performSelector延时调用导致的内存泄露