0


SpringBoot项目之前后端界面搭建

1.项目搭建

技术点介绍:

前端:Freemarker、jQuery
后端:SpringBoot、MyBatisPlus、Lombok
中间件:Redis

1.1.项目前准备

导入数据库表

用户表:t_user

商品表:t_goods

订单表:t_order

订单项表:t_order_item

数据源表:t_dict_type

数据项表:t_dict_data

** 创建一个springboot项目,注意不要勾选如何组件**

1.2导入pom依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.3.9.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  1. <properties>
  2. <java.version>1.8</java.version>
  3. </properties>
  4. <dependencies>
  5. <!--freemarker-->
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-freemarker</artifactId>
  9. </dependency>
  10. <!--spring web-->
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-web</artifactId>
  14. </dependency>
  15. <!--mysql-->
  16. <dependency>
  17. <groupId>mysql</groupId>
  18. <artifactId>mysql-connector-java</artifactId>
  19. <scope>runtime</scope>
  20. <version>5.1.44</version>
  21. </dependency>
  22. <!--lombok-->
  23. <dependency>
  24. <groupId>org.projectlombok</groupId>
  25. <artifactId>lombok</artifactId>
  26. <optional>true</optional>
  27. </dependency>
  28. <!--junit-->
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. <exclusions>
  34. <exclusion>
  35. <groupId>org.junit.vintage</groupId>
  36. <artifactId>junit-vintage-engine</artifactId>
  37. </exclusion>
  38. </exclusions>
  39. </dependency>
  40. <dependency>
  41. <groupId>junit</groupId>
  42. <artifactId>junit</artifactId>
  43. <scope>test</scope>
  44. </dependency>
  45. <!-- mybatis plus依赖 -->
  46. <dependency>
  47. <groupId>com.baomidou</groupId>
  48. <artifactId>mybatis-plus-boot-starter</artifactId>
  49. <version>3.4.0</version>
  50. </dependency>
  51. <!-- mybatis-plus-generator依赖 -->
  52. <dependency>
  53. <groupId>com.baomidou</groupId>
  54. <artifactId>mybatis-plus-generator</artifactId>
  55. <version>3.4.0</version>
  56. </dependency>
  57. <!--hariki-->
  58. <dependency>
  59. <groupId>com.zaxxer</groupId>
  60. <artifactId>HikariCP</artifactId>
  61. </dependency>
  62. <!-- MD5依赖 -->
  63. <dependency>
  64. <groupId>commons-codec</groupId>
  65. <artifactId>commons-codec</artifactId>
  66. </dependency>
  67. <dependency>
  68. <groupId>org.apache.commons</groupId>
  69. <artifactId>commons-lang3</artifactId>
  70. <version>3.6</version>
  71. </dependency>
  72. <!-- valid验证依赖 -->
  73. <dependency>
  74. <groupId>org.springframework.boot</groupId>
  75. <artifactId>spring-boot-starter-validation</artifactId>
  76. </dependency>
  77. <!--redis-->
  78. <dependency>
  79. <groupId>org.springframework.boot</groupId>
  80. <artifactId>spring-boot-starter-data-redis</artifactId>
  81. </dependency>
  82. <!--commons-pool2 对象池依赖 2.0版本的lettuce需要-->
  83. <dependency>
  84. <groupId>org.apache.commons</groupId>
  85. <artifactId>commons-pool2</artifactId>
  86. </dependency>
  87. <!--spring-session将session借助于第三方存储(redis/mongodb等等),默认redis-->
  88. <!--<dependency>
  89. <groupId>org.springframework.session</groupId>
  90. <artifactId>spring-session-data-redis</artifactId>
  91. </dependency>-->
  92. <dependency>
  93. <groupId>com.alipay.sdk</groupId>
  94. <artifactId>alipay-easysdk</artifactId>
  95. <version>2.0.1</version>
  96. </dependency>
  97. </dependencies>
  98. <build>
  99. <plugins>
  100. <plugin>
  101. <groupId>org.springframework.boot</groupId>
  102. <artifactId>spring-boot-maven-plugin</artifactId>
  103. </plugin>
  104. </plugins>
  105. </build>

1.3.转换yml文件

application.yml:

  1. server:
  2. port: 8081
  3. servlet:
  4. context-path: /
  5. spring:
  6. datasource:
  7. url: jdbc:mysql://localhost:3306/mybatis_ssm?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=UTF8
  8. driver-class-name: com.mysql.jdbc.Driver
  9. password: 123456
  10. username: root
  11. hikari:
  12. # 最小空闲连接数量
  13. minimum-idle: 5
  14. # 空闲连接存活最大时间,默认600000(10分钟)
  15. idle-timeout: 180000
  16. # 连接池最大连接数,默认是10
  17. maximum-pool-size: 10
  18. # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
  19. auto-commit: true
  20. # 连接池名称
  21. pool-name: MyHikariCP
  22. # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
  23. max-lifetime: 1800000
  24. # 数据库连接超时时间,默认30秒,即30000
  25. connection-timeout: 30000
  26. freemarker:
  27. #设置编码格式
  28. charset: UTF-8
  29. #后缀
  30. suffix:
  31. #文档类型
  32. content-type: text/html
  33. #模板前端
  34. template-loader-path: classpath:/templates/
  35. #启用模板
  36. enabled: true
  37. mvc:
  38. static-path-pattern: /static/**
  39. redis:
  40. ** #服务端IP
  41. host: 47.100.191.44
  42. #端口
  43. port: 6379
  44. #密码
  45. password: (不准看!!!)**
  46. #选择数据库
  47. database: 0
  48. #超时时间
  49. timeout: 10000ms
  50. #Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问
  51. #Lettuce线程安全,Jedis线程非安全
  52. lettuce:
  53. pool:
  54. #最大连接数,默认8
  55. max-active: 8
  56. #最大连接阻塞等待时间,默认-1
  57. max-wait: 10000ms
  58. #最大空闲连接,默认8
  59. max-idle: 200
  60. #最小空闲连接,默认0
  61. min-idle: 5
  62. #mybatis-plus配置
  63. mybatis-plus:
  64. #所对应的 XML 文件位置
  65. mapper-locations: classpath*:/mapper/*Mapper.xml
  66. #别名包扫描路径
  67. type-aliases-package: com.xbb.spbootpro.model
  68. configuration:
  69. #驼峰命名规则
  70. map-underscore-to-camel-case: true
  71. #日志配置
  72. logging:
  73. level:
  74. com.xbb.spbootpro.mapper: debug

**在spbootproApplication.java里面加两个注解辅助 **

** 导入相关文件:如果需要学习请私信我!!!**

1.4.测试

创建一个测试类进行测试:

  1. package com.xbb.spbootpro.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. /**
  5. * @author冰冰
  6. * @create 2022-11-08 16:37
  7. */
  8. @Controller
  9. public class IndexController {
  10. @RequestMapping("/")
  11. public String index(){
  12. return "index.html";
  13. }
  14. }

先把后台代码跑起来,在访问即可!!

直接访问localhost:8081

如果** **能访问成功说明 项目搭建完成!!!

2.首页功能

2.1.代码生成

导入我们提前准备好的文件夹

打开generator里面的CodeGenerator运行项目

** 生成的代码:**

2.2.前台界面的编写

  1. **IndexController:**
  1. package com.xbb.spbootpro.controller;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
  4. import com.xbb.spbootpro.model.Goods;
  5. import com.xbb.spbootpro.service.IGoodsService;
  6. import com.xbb.spbootpro.utils.DataUtils;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.ui.Model;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import java.util.List;
  12. import java.util.Map;
  13. /**
  14. * @author冰冰
  15. * @create 2022-11-08 16:37
  16. */
  17. @Controller
  18. public class IndexController {
  19. @Autowired
  20. private IGoodsService goodsService;
  21. @RequestMapping("/")
  22. public String index(Model model){
  23. //摆件花艺
  24. List<Goods> goods01 = goodsService.list(new QueryWrapper<Goods>()
  25. .eq("goods_type",01)
  26. .last("limit 6"));
  27. //壁挂
  28. List<Goods> goods07 = goodsService.list(new QueryWrapper<Goods>()
  29. .eq("goods_type",07)
  30. .last("limit 12"));
  31. //为了方便首页数据展示
  32. DataUtils<Goods> dataUtils = new DataUtils<Goods>();
  33. Map<String ,List<Goods>> gt01 = dataUtils.transfor(3,goods01);
  34. Map<String ,List<Goods>> gt07 = dataUtils.transfor(4,goods07);
  35. model.addAttribute("gt01",gt01);
  36. model.addAttribute("gt07",gt07);
  37. return "index.html";
  38. }
  39. }

index.html:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <#include "common/head.html">
  5. <link rel="stylesheet" type="text/css" href="css/public.css"/>
  6. <link rel="stylesheet" type="text/css" href="css/index.css" />
  7. </head>
  8. <body>
  9. <!------------------------------head------------------------------>
  10. <#include "common/top.html">
  11. <!-------------------------banner--------------------------->
  12. <div class="block_home_slider">
  13. <div id="home_slider" class="flexslider">
  14. <ul class="slides">
  15. <li>
  16. <div class="slide">
  17. <img src="img/banner2.jpg"/>
  18. </div>
  19. </li>
  20. <li>
  21. <div class="slide">
  22. <img src="img/banner1.jpg"/>
  23. </div>
  24. </li>
  25. </ul>
  26. </div>
  27. </div>
  28. <!------------------------------thImg------------------------------>
  29. <div class="thImg">
  30. <div class="clearfix">
  31. <a href="${ctx}/page/vase_proList.html"><img src="img/i1.jpg"/></a>
  32. <a href="${ctx}/page/proList.html"><img src="img/i2.jpg"/></a>
  33. <a href="#2"><img src="img/i3.jpg"/></a>
  34. </div>
  35. </div>
  36. <!------------------------------news------------------------------>
  37. <div class="news">
  38. < class="wrapper">
  39. <h2><img src="img/ih1.jpg"/></h2>
  40. <div class="top clearfix">
  41. <a href="${ctx}/page/proDetail.html"><img src="img/n1.jpg"/><p></p></a>
  42. <a href="${ctx}/page/proDetail.html"><img src="img/n2.jpg"/><p></p></a>
  43. <a href="${ctx}/page/proDetail.html"><img src="img/n3.jpg"/><p></p></a>
  44. </div>
  45. <div class="bott clearfix">
  46. <a href="${ctx}/page/proDetail.html"><img src="img/n4.jpg"/><p></p></a>
  47. <a href="${ctx}/page/proDetail.html"><img src="img/n5.jpg"/><p></p></a>
  48. <a href="${ctx}/page/proDetail.html"><img src="img/n6.jpg"/><p></p></a>
  49. </div>
  50. <h2><img src="img/ih2.jpg"/></h2>
  51. <#if gt01?? && gt01?size gt 0>
  52. <#-- 遍历gt01中所有的key,是为了该key中的对象-->
  53. <#list gt01?keys as key>
  54. <div class="flower clearfix tran">
  55. <#list gt01[key] as g>
  56. <a href="proDetail.html" class="clearfix">
  57. <dl>
  58. <dt>
  59. <span class="abl"></span>
  60. <img src="${g.goodsImg}"/>
  61. <span class="abr"></span>
  62. </dt>
  63. <dd>${g.goodsName}</dd>
  64. <dd><span>¥ ${g.goodsPrice}</span></dd>
  65. </dl>
  66. </a>
  67. </#list>
  68. </div>
  69. </#list>
  70. </#if>
  71. </div>
  72. </div>
  73. <!------------------------------ad------------------------------>
  74. <a href="#" class="ad"><img src="img/ib1.jpg"/></a>
  75. <!------------------------------people------------------------------>
  76. <div class="people">
  77. <div class="wrapper">
  78. <h2><img src="img/ih3.jpg"/></h2>
  79. <#if gt07?? && gt07?size gt 0>
  80. <#list gt07?keys as key>
  81. <div class="pList clearfix tran">
  82. <#list gt07[key] as g>
  83. <a href="proDetail.html">
  84. <dl>
  85. <dt>
  86. <span class="abl"></span>
  87. <img src="${g.goodsImg}"/>
  88. <span class="abr"></span>
  89. </dt>
  90. <dd>${g.goodsName}</dd>
  91. <dd><span>¥${g.goodsPrice}</span></dd>
  92. </dl>
  93. </a>
  94. </#list>
  95. </div>
  96. </#list>
  97. </#if>
  98. </div>
  99. </div>
  100. <#include "common/footer.html"/>
  101. <script src="js/public.js" type="text/javascript" charset="utf-8"></script>
  102. <script src="js/nav.js" type="text/javascript" charset="utf-8"></script>
  103. <script src="js/jquery.flexslider-min.js" type="text/javascript" charset="utf-8"></script>
  104. <script type="text/javascript">
  105. $(function() {
  106. $('#home_slider').flexslider({
  107. animation: 'slide',
  108. controlNav: true,
  109. directionNav: true,
  110. animationLoop: true,
  111. slideshow: true,
  112. slideshowSpeed:2000,
  113. useCSS: false
  114. });
  115. });
  116. </script>
  117. </body>
  118. </html>

注意:要重启服务!!

前台的价格发生的改变

3.用户文明登陆

3.1.实现登陆界面跳转

在controller里面创建一个PageController类

  1. package com.xbb.spbootpro.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.PathVariable;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. /**
  6. * @author冰冰
  7. * @create 2022-11-09 11:05
  8. */
  9. @Controller
  10. public class PageController {
  11. @RequestMapping("/page/{page}")
  12. private String page(@PathVariable("page") String page){
  13. return page;
  14. }
  15. @RequestMapping("/page/dir/{page}")
  16. private String page(@PathVariable("dir")String dir
  17. ,@PathVariable("page") String page){
  18. return dir +"/"+ page;
  19. }
  20. }
  1. **重启服务,点击登陆即可跳到登陆界面如下图:**

创建一个login.js:

在login.html里面添加:

在到login.js里面进行测试

刷新项目点击登陆看是否能不能弹出1,能弹1说明这个方法能用。

3.2.登陆验证

部分代码:

  1. **UserDto:**
  1. package com.xbb.spbootpro.model.dto;
  2. import com.xbb.spbootpro.validator.IsMobile;
  3. import lombok.Data;
  4. import javax.validation.constraints.NotBlank;
  5. /**
  6. * @author冰冰
  7. * @create 2022-11-10 14:45
  8. */
  9. @Data
  10. public class UserDto {
  11. @NotBlank(message = "手机号码不能为空!")
  12. @IsMobile
  13. private String mobile;
  14. @NotBlank(message = "密码不能为空!")
  15. private String password;
  16. }
  1. **IsMobile:**
  1. package com.xbb.spbootpro.validator;
  2. import javax.validation.Constraint;
  3. import javax.validation.Payload;
  4. import java.lang.annotation.*;
  5. @Documented
  6. @Constraint(
  7. validatedBy = {MobileValidator.class}
  8. )
  9. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
  10. @Retention(RetentionPolicy.RUNTIME)
  11. public @interface IsMobile {
  12. boolean required() default true;
  13. String message() default "手机号码格式错误!";
  14. Class<?>[] groups() default {};
  15. Class<? extends Payload>[] payload() default {};
  16. }
  1. **UserController:**
  1. package com.xbb.spbootpro.controller;
  2. import com.xbb.spbootpro.model.dto.UserDto;
  3. import com.xbb.spbootpro.service.IUserService;
  4. import com.xbb.spbootpro.utils.JsonResponseBody;
  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 javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.validation.Valid;
  11. /**
  12. * <p>
  13. * 用户信息表 前端控制器
  14. * </p>
  15. *
  16. * @author xbb
  17. * @since 2022-11-09
  18. */
  19. @RestController
  20. @RequestMapping("/user")
  21. public class UserController {
  22. @Autowired
  23. private IUserService userService;
  24. @RequestMapping("/toLogin")
  25. public JsonResponseBody toLogin(@Valid UserDto userDto,
  26. HttpServletRequest req,
  27. HttpServletResponse resp){
  28. return userService.toLogin(userDto,req,resp);
  29. }
  30. }
  1. **UserServiceImpl:**
  1. package com.xbb.spbootpro.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.xbb.spbootpro.exception.BusinessException;
  4. import com.xbb.spbootpro.model.User;
  5. import com.xbb.spbootpro.mapper.UserMapper;
  6. import com.xbb.spbootpro.model.dto.UserDto;
  7. import com.xbb.spbootpro.service.IUserService;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import com.xbb.spbootpro.utils.JsonResponseBody;
  10. import com.xbb.spbootpro.utils.JsonResponseStatus;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. /**
  16. * <p>
  17. * 用户信息表 服务实现类
  18. * </p>
  19. *
  20. * @author xbb
  21. * @since 2022-11-09
  22. */
  23. @Service
  24. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
  25. @Autowired
  26. private UserMapper userMapper;
  27. @Override
  28. public JsonResponseBody toLogin(UserDto userDto, HttpServletRequest req, HttpServletResponse resp) {
  29. // 1.5.1)判断mobile和password是否为空
  30. // 1.5.2)判断mobile格式是否正确
  31. // 1.5.3)根据用户手机号码查询用户是否存在
  32. User user= userMapper.selectOne(new QueryWrapper<User>().eq("id",userDto.getMobile()));
  33. // 1.5.4)校验账号
  34. if(user==null){
  35. throw new BusinessException(JsonResponseStatus.USER_USERNAME_ERROR);
  36. }
  37. // 1.5.5)校验密码
  38. if(userDto.getPassword().equals(user.getPassword())){
  39. throw new BusinessException(JsonResponseStatus.USER_USERNAME_ERROR);
  40. }
  41. return new JsonResponseBody();
  42. }
  43. }

效果:

什么也不填:

写了正确的手机号:

密码正确,手机号错误

3.3.盐加密

前端加密:防止客户端浏览器F12导致密码泄露

后端加密:防止数据库数据泄露导致密码泄露

后台加密:

  1. **MD5Utils:**
  1. package com.xbb.spbootpro.utils;
  2. import org.apache.commons.codec.digest.DigestUtils;
  3. import org.springframework.stereotype.Component;
  4. import java.util.UUID;
  5. /**
  6. * MD5加密
  7. * 用户端:password=MD5(明文+固定Salt)
  8. * 服务端:password=MD5(用户输入+随机Salt)
  9. * 用户端MD5加密是为了防止用户密码在网络中明文传输,服务端MD5加密是为了提高密码安全性,双重保险。
  10. */
  11. @Component
  12. public class MD5Utils {
  13. //加密盐,与前端一致
  14. private static String salt="f1g2h3j4";
  15. /**
  16. * md5加密
  17. * @param src
  18. * @return
  19. */
  20. public static String md5(String src){
  21. return DigestUtils.md5Hex(src);
  22. }
  23. /**
  24. * 获取加密的盐
  25. * @return
  26. */
  27. public static String createSalt(){
  28. return UUID.randomUUID().toString().replace("-","");
  29. }
  30. /**
  31. * 将前端的明文密码通过MD5加密方式加密成后端服务所需密码
  32. * 注意:该步骤实际是在前端完成!!!
  33. * @param inputPass 明文密码
  34. * @return
  35. */
  36. public static String inputPassToFormpass(String inputPass){
  37. //混淆固定盐salt,安全性更可靠
  38. String str=salt.charAt(1)+""+salt.charAt(5)+inputPass+salt.charAt(0)+""+salt.charAt(3);
  39. return md5(str);
  40. }
  41. /**
  42. * 将后端密文密码+随机salt生成数据库的密码
  43. * @param formPass
  44. * @param salt
  45. * @return
  46. */
  47. public static String formPassToDbPass(String formPass,String salt){
  48. //混淆固定盐salt,安全性更可靠
  49. String str=salt.charAt(7)+""+salt.charAt(4)+formPass+salt.charAt(1)+""+salt.charAt(5);
  50. return md5(str);
  51. }
  52. /**
  53. * 将用户输入的密码转换成数据库的密码
  54. * @param inputPass 明文密码
  55. * @param salt 盐
  56. * @return
  57. */
  58. public static String inputPassToDbPass(String inputPass,String salt){
  59. String formPass = inputPassToFormpass(inputPass);
  60. String dbPass = formPassToDbPass(formPass, salt);
  61. return dbPass;
  62. }
  63. public static void main(String[] args) {
  64. //d7aaa28e3b8e6c88352bd5e7c23829f9
  65. //5512a78a188b318c074a15f9b056a712
  66. String formPass = inputPassToFormpass("123456");
  67. System.out.println("前端加密密码:"+formPass);
  68. String salt = createSalt();
  69. System.out.println("后端加密随机盐:"+salt);
  70. String dbPass = formPassToDbPass(formPass, salt);
  71. System.out.println("后端加密密码:"+dbPass);
  72. System.out.println("-------------------------------------------");
  73. String dbPass1 = inputPassToDbPass("123456", salt);
  74. System.out.println("最终加密密码:"+dbPass1);
  75. }
  76. }

前台加密:

login.js:

  1. $(function () {
  2. alert(6);
  3. //登陆向后台发送ajax请求
  4. $("#login").click(function () {
  5. let mobile = $("#mobile").val();
  6. let password = $("#password").val();
  7. //1.密码加密
  8. //1) 定义固定盐
  9. let salt='f1g2h3j4';
  10. //2) 固定盐混淆
  11. let temp=salt.charAt(1)+""+salt.charAt(5)+password+salt.charAt(0)+""+salt.charAt(3);
  12. //3) 使用MD5完成前端第一次加密
  13. let pwd=md5(temp);
  14. $.post("/user/toLogin",{
  15. mobile:mobile,
  16. password:password
  17. },function (res) {
  18. alert(res.msg)
  19. },"json");
  20. });
  21. });
  1. **UserServiceImpl:**
  1. package com.xbb.spbootpro.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.xbb.spbootpro.exception.BusinessException;
  4. import com.xbb.spbootpro.model.User;
  5. import com.xbb.spbootpro.mapper.UserMapper;
  6. import com.xbb.spbootpro.model.dto.UserDto;
  7. import com.xbb.spbootpro.service.IUserService;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import com.xbb.spbootpro.utils.JsonResponseBody;
  10. import com.xbb.spbootpro.utils.JsonResponseStatus;
  11. import com.xbb.spbootpro.utils.MD5Utils;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Service;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16. /**
  17. * <p>
  18. * 用户信息表 服务实现类
  19. * </p>
  20. *
  21. * @author xbb
  22. * @since 2022-11-09
  23. */
  24. @Service
  25. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
  26. @Autowired
  27. private UserMapper userMapper;
  28. @Override
  29. public JsonResponseBody toLogin(UserDto userDto, HttpServletRequest req, HttpServletResponse resp) {
  30. // 1.5.1)判断mobile和password是否为空
  31. // 1.5.2)判断mobile格式是否正确
  32. // 1.5.3)根据用户手机号码查询用户是否存在
  33. User user= userMapper.selectOne(new QueryWrapper<User>().eq("id",userDto.getMobile()));
  34. // 1.5.4)校验账号
  35. if(user==null){
  36. throw new BusinessException(JsonResponseStatus.USER_USERNAME_ERROR);
  37. }
  38. //前台传递到后台的密码,要进过工具类md5加密一次,才有可能跟数据库密码匹配上
  39. String pwd = MD5Utils.formPassToDbPass(userDto.getPassword(),user.getSalt());
  40. // 1.5.5)校验密码
  41. if(!pwd.equals(user.getPassword())){
  42. throw new BusinessException(JsonResponseStatus.USER_USERNAME_ERROR);
  43. }
  44. return new JsonResponseBody();
  45. }
  46. }

4.服务端和客户端登陆密码管理

UserServiceImpl.java变更如下

  1. package com.xbb.spbootpro.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.xbb.spbootpro.exception.BusinessException;
  4. import com.xbb.spbootpro.model.User;
  5. import com.xbb.spbootpro.mapper.UserMapper;
  6. import com.xbb.spbootpro.model.dto.UserDto;
  7. import com.xbb.spbootpro.service.IRedisService;
  8. import com.xbb.spbootpro.service.IUserService;
  9. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  10. import com.xbb.spbootpro.utils.CookieUtils;
  11. import com.xbb.spbootpro.utils.JsonResponseBody;
  12. import com.xbb.spbootpro.utils.JsonResponseStatus;
  13. import com.xbb.spbootpro.utils.MD5Utils;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import javax.servlet.http.HttpServletRequest;
  17. import javax.servlet.http.HttpServletResponse;
  18. import java.util.UUID;
  19. /**
  20. * <p>
  21. * 用户信息表 服务实现类
  22. * </p>
  23. *
  24. * @author xbb
  25. * @since 2022-11-09
  26. */
  27. @Service
  28. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
  29. @Autowired
  30. private UserMapper userMapper;
  31. @Autowired
  32. private IRedisService iRedisService;
  33. @Override
  34. public JsonResponseBody toLogin(UserDto userDto, HttpServletRequest req, HttpServletResponse resp) {
  35. // 1.5.1)判断mobile和password是否为空
  36. // 1.5.2)判断mobile格式是否正确
  37. // 1.5.3)根据用户手机号码查询用户是否存在
  38. User user= userMapper.selectOne(new QueryWrapper<User>().eq("id",userDto.getMobile()));
  39. // 1.5.4)校验账号
  40. if(user==null){
  41. throw new BusinessException(JsonResponseStatus.USER_USERNAME_ERROR);
  42. }
  43. //前台传递到后台的密码,要进过工具类md5加密一次,才有可能跟数据库密码匹配上
  44. String pwd = MD5Utils.formPassToDbPass(userDto.getPassword(),user.getSalt());
  45. // 1.5.5)校验密码
  46. if(!pwd.equals(user.getPassword())){
  47. throw new BusinessException(JsonResponseStatus.USER_USERNAME_ERROR);
  48. }
  49. //6.将登陆用户对象与token令牌进行绑定保存到cookie和redis
  50. //创建登陆令牌token
  51. String token= UUID.randomUUID().toString().replace("-","");
  52. //将token令牌保存到cookie中
  53. CookieUtils.setCookie(req,resp,"token",token,7200);
  54. //将登陆token令牌与用户对象user绑定到redis中
  55. iRedisService.setUserToRedis(token,user);
  56. //将用户登陆的昵称设置到cookie中
  57. CookieUtils.setCookie(req,resp,"nickname",user.getNickname());
  58. return new JsonResponseBody<>();
  59. }
  60. }
  1. IRedisService.java
  1. package com.xbb.spbootpro.service;
  2. import com.xbb.spbootpro.model.User;
  3. /**
  4. * @author冰冰
  5. * @create 2022-11-10 16:39
  6. */
  7. public interface IRedisService {
  8. void setUserToRedis(String token, User user);
  9. User getUserByToken(String token);
  10. }
  1. RedisServiceImpl:
  1. package com.xbb.spbootpro.service.impl;
  2. import com.xbb.spbootpro.model.User;
  3. import com.xbb.spbootpro.service.IRedisService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import org.springframework.stereotype.Service;
  7. /**
  8. * @author冰冰
  9. * @create 2022-11-10 16:43
  10. */
  11. @Service
  12. public class RedisServiceImpl implements IRedisService {
  13. @Autowired
  14. private RedisTemplate<String,Object> redisTemplate;
  15. @Override
  16. public void setUserToRedis(String token, User user) {
  17. redisTemplate.opsForValue().set("user:"+token,user,7200L);
  18. }
  19. @Override
  20. public User getUserByToken(String token) {
  21. return (User) redisTemplate.opsForValue().get("user:"+token);
  22. }
  23. }
标签: spring boot java spring

本文转载自: https://blog.csdn.net/m0_68211831/article/details/127750313
版权归原作者 冰冰酱哈 所有, 如有侵权,请联系我们删除。

“SpringBoot项目之前后端界面搭建”的评论:

还没有评论