# mmall **Repository Path**: yu20/mmall ## Basic Information - **Project Name**: mmall - **Description**: 基于Spring Boot + MyBatis Plus + Thymeleaf + MySQL的电商项目 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-06-17 - **Last Updated**: 2024-06-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 笔记 # mmall介绍 基于Spring Boot + MyBatis Plus + Thymeleaf + MySQL的电商项目 # 项目截图 ![输入图片说明](src/main/resources/readme_pic/0.png) ![输入图片说明](src/main/resources/readme_pic/1.png) ![输入图片说明](src/main/resources/readme_pic/2.png) ![输入图片说明](src/main/resources/readme_pic/3.png) # 注册功能的实现过程 ## 基本步骤 1、进行数据效验 2、进行数据存储,保存注册用户 ## 注册时的数据校验 1、前端代码中使用关键字required进行校验、 2、前端表单提交后,将传过来的数据封装到一个UserRegisterForm类中, 该类里面的成员添加了一些注解:@NotEmpty(message = "登录名不能为空"), 可以用来进行后端校验 3、在控制器里面进行判断,作出相应的处理。 `public String register(@Valid UserRegisterForm userRegisterForm, BindingResult bindingResult` @Valid 注解。错误信息放到BindingResult ## 统一异常处理 如果我们在controller中通过try catch来处理异常的话, 会出现一个问题就是每个函数里都加一个Try catch,代码会变的很乱。 下面通过spring boot的注解来省略掉controller中的try-catch, 帮助我们来封装异常信息并返回给前端,这样用户也不会得到一些奇奇怪怪的错误提示。 1:定义返回值结构信息, 结果为: ```json { "result": false, "code": 3000, "message": "THIS IS AN UNKNOW EXCEPTION", "data": null } ``` 2:定义返回值和对应code的信息public enum CodeAndMsg {} 3:自定义异常 public class UserDefinedException extends RuntimeException {} 4:RestControllerAdvice来捕获全局异常, @RestControllerAdvice,可以全局捕获spring mvc抛的异常。 @ExceptionHandler(value = Exception.class)用于处理异常的方法上,ExceptionHandler的作用是用来捕获指定的异常。 作者:蓉漂里的小白 链接:https://www.jianshu.com/p/47aeeba6414c # 登录功能的实现过程 1、修改前端login.html页面 添加错误提示`` 2、登录和注册是需要的数据不一样故需要添加一个新的UserLoginForm @Valid 结合 BindingResult实例,Spring将对被注解的实体进行约束校验,原理是AOP `login(@Valid UserLoginForm userLoginForm,BindingResult bindingResult){}` 3、判断用户名是否存在;判断密码是否正确,用工具类效验。若两个条件都满足,就返回user。 # 商品详情 1、商品信息 2、购物车 3、商品分类 # 添加商品到购物车 1、首先判断是否为登录用户, 使用过滤器(UserFilter.java)来实现, 然后在相应的配置类(FilterConfiguration.java)中指定过滤文件: `filterRegistrationBean.setFilter(new UserFilter());` # 随机生成无重复订单编号(字符串型) 1、创建一个StringBuffer存储生成的字符 2、生成一个随机的int值,该值介于[0,16)的区间`new Random().nextInt(16)` 3、将生成的int型数字转换为十六进制数字的字符`Integer.toHexString()`, 即 9<=>9、10<=>a、11<=>b,也就是(9,10,11)==>(9,a,b) 4、循环依次添加到StringBuffer中,最后转换为字符串,并将全部小写字符转换为大写 ```js String seriaNumber = null; try { StringBuffer result = new StringBuffer(); for(int i=0;i<32;i++) { //此方法返回的字符串表示的无符号整数参数所表示的值以十六进制(基数为16). result.append(Integer.toHexString(new Random().nextInt(16))); System.out.println(result); } seriaNumber = result.toString().toUpperCase(); //toUpperCase() 方法用于将小写字符转换为大写 } catch (Exception e) { e.printStackTrace(); } System.out.println(seriaNumber); ```