当前位置:   article > 正文

黑马头条--day01.环境搭建_黑马头条用到哪些数据库表的

黑马头条用到哪些数据库表的

目录

一.前言

二.环境搭建

 1.数据库

 2.虚拟机搭建

3.1docker更换源

3.docker安装nacos

 4.初始化工程

 三.全局异常处理

 四.登录加密

五.nacos公共配置数据源和mybatis-plus 

六.user模块创建

1.配置文件bootstrap.yml

 2.日志文件配置logback.xml

 3.登录接口

 七.统一结果处理

  1.统一结果枚举类

2.统一结果返回类

3.统一分页结果返回类

4.分页结果dto类

八.登录逻辑

 1.controller

2.service

九.postman测试

 1.测试登录成功

2.输错密码

3.游客登录

4.输错手机号

 十.swagger接口文档

 十一.knfie4j接口文档

 十二.gateway网关

1)在heima-leadnews-gateway导入以下依赖

(2)在heima-leadnews-gateway下创建heima-leadnews-app-gateway微服务

3.bootstrap.yml 

4.nacos中配置文件 ​编辑

 十三.前端项目启动

9.2)配置nginx


一.前言

 该项目学习自黑马程序员,由我整理如下,版权归黑马程序员所有

二.环境搭建

 1.数据库

    第一天,先创建如下库和表:

sql文件如下:

  1. CREATE DATABASE IF NOT EXISTS leadnews_user DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  2. USE leadnews_user;
  3. SET NAMES utf8;
  4. /*
  5. Navicat MySQL Data Transfer
  6. Source Server : localhost
  7. Source Server Version : 50721
  8. Source Host : localhost:3306
  9. Source Database : leadnews_user
  10. Target Server Type : MYSQL
  11. Target Server Version : 50721
  12. File Encoding : 65001
  13. Date: 2021-04-12 13:58:42
  14. */
  15. SET FOREIGN_KEY_CHECKS=0;
  16. -- ----------------------------
  17. -- Table structure for ap_user
  18. -- ----------------------------
  19. DROP TABLE IF EXISTS `ap_user`;
  20. CREATE TABLE `ap_user` (
  21. `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  22. `salt` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码、通信等加密盐',
  23. `name` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
  24. `password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码,md5加密',
  25. `phone` varchar(11) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号',
  26. `image` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '头像',
  27. `sex` tinyint(1) unsigned DEFAULT NULL COMMENT '0 男\r\n 1 女\r\n 2 未知',
  28. `is_certification` tinyint(1) unsigned DEFAULT NULL COMMENT '0 未\r\n 1 是',
  29. `is_identity_authentication` tinyint(1) DEFAULT NULL COMMENT '是否身份认证',
  30. `status` tinyint(1) unsigned DEFAULT NULL COMMENT '0正常\r\n 1锁定',
  31. `flag` tinyint(1) unsigned DEFAULT NULL COMMENT '0 普通用户\r\n 1 自媒体人\r\n 2 大V',
  32. `created_time` datetime DEFAULT NULL COMMENT '注册时间',
  33. PRIMARY KEY (`id`) USING BTREE
  34. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='APP用户信息表';
  35. -- ----------------------------
  36. -- Records of ap_user
  37. -- ----------------------------
  38. INSERT INTO `ap_user` VALUES ('1', 'abc', 'zhangsan', 'abc', '13511223453', null, '1', null, null, '1', '1', '2020-03-19 23:22:07');
  39. INSERT INTO `ap_user` VALUES ('2', 'abc', 'lisi', 'abc', '13511223454', '', '1', null, null, '1', '1', '2020-03-19 23:22:07');
  40. INSERT INTO `ap_user` VALUES ('3', 'sdsa', 'wangwu', 'wangwu', '13511223455', null, null, null, null, null, '1', null);
  41. INSERT INTO `ap_user` VALUES ('4', '123abc', 'admin', '81e158e10201b6d7aee6e35eaf744796', '13511223456', null, '1', null, null, '1', '1', '2020-03-30 16:36:32');
  42. INSERT INTO `ap_user` VALUES ('5', '123', 'suwukong', 'suwukong', '13511223458', null, '1', null, null, '1', '1', '2020-08-01 11:09:57');
  43. INSERT INTO `ap_user` VALUES ('6', null, null, null, null, null, null, null, null, null, null, null);
  44. -- ----------------------------
  45. -- Table structure for ap_user_fan
  46. -- ----------------------------
  47. DROP TABLE IF EXISTS `ap_user_fan`;
  48. CREATE TABLE `ap_user_fan` (
  49. `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  50. `user_id` int(11) unsigned DEFAULT NULL COMMENT '用户ID',
  51. `fans_id` int(11) unsigned DEFAULT NULL COMMENT '粉丝ID',
  52. `fans_name` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '粉丝昵称',
  53. `level` tinyint(1) unsigned DEFAULT NULL COMMENT '粉丝忠实度\r\n 0 正常\r\n 1 潜力股\r\n 2 勇士\r\n 3 铁杆\r\n 4 老铁',
  54. `created_time` datetime DEFAULT NULL COMMENT '创建时间',
  55. `is_display` tinyint(1) unsigned DEFAULT NULL COMMENT '是否可见我动态',
  56. `is_shield_letter` tinyint(1) unsigned DEFAULT NULL COMMENT '是否屏蔽私信',
  57. `is_shield_comment` tinyint(1) unsigned DEFAULT NULL COMMENT '是否屏蔽评论',
  58. PRIMARY KEY (`id`) USING BTREE
  59. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='APP用户粉丝信息表';
  60. -- ----------------------------
  61. -- Records of ap_user_fan
  62. -- ----------------------------
  63. -- ----------------------------
  64. -- Table structure for ap_user_follow
  65. -- ----------------------------
  66. DROP TABLE IF EXISTS `ap_user_follow`;
  67. CREATE TABLE `ap_user_follow` (
  68. `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  69. `user_id` int(11) unsigned DEFAULT NULL COMMENT '用户ID',
  70. `follow_id` int(11) unsigned DEFAULT NULL COMMENT '关注作者ID',
  71. `follow_name` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '粉丝昵称',
  72. `level` tinyint(1) unsigned DEFAULT NULL COMMENT '关注度\r\n 0 偶尔感兴趣\r\n 1 一般\r\n 2 经常\r\n 3 高度',
  73. `is_notice` tinyint(1) unsigned DEFAULT NULL COMMENT '是否动态通知',
  74. `created_time` datetime DEFAULT NULL COMMENT '创建时间',
  75. PRIMARY KEY (`id`) USING BTREE
  76. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='APP用户关注信息表';
  77. -- ----------------------------
  78. -- Records of ap_user_follow
  79. -- ----------------------------
  80. -- ----------------------------
  81. -- Table structure for ap_user_realname
  82. -- ----------------------------
  83. DROP TABLE IF EXISTS `ap_user_realname`;
  84. CREATE TABLE `ap_user_realname` (
  85. `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  86. `user_id` int(11) unsigned DEFAULT NULL COMMENT '账号ID',
  87. `name` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '用户名称',
  88. `idno` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '资源名称',
  89. `font_image` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '正面照片',
  90. `back_image` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '背面照片',
  91. `hold_image` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手持照片',
  92. `live_image` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '活体照片',
  93. `status` tinyint(1) unsigned DEFAULT NULL COMMENT '状态\r\n 0 创建中\r\n 1 待审核\r\n 2 审核失败\r\n 9 审核通过',
  94. `reason` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '拒绝原因',
  95. `created_time` datetime DEFAULT NULL COMMENT '创建时间',
  96. `submited_time` datetime DEFAULT NULL COMMENT '提交时间',
  97. `updated_time` datetime DEFAULT NULL COMMENT '更新时间',
  98. PRIMARY KEY (`id`) USING BTREE
  99. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='APP实名认证信息表';
  100. -- ----------------------------
  101. -- Records of ap_user_realname
  102. -- ----------------------------
  103. INSERT INTO `ap_user_realname` VALUES ('1', '1', 'zhangsan', '512335455602781278', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbHSAQlqFAAXIZNzAq9E126.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbF6AR16RAAZB2e1EsOg460.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbDeAH2qoAAbD_WiUJfk745.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9ba9qANVEdAAS25KJlEVE291.jpg', '9', '', '2019-07-30 14:34:28', '2019-07-30 14:34:30', '2019-07-12 06:48:04');
  104. INSERT INTO `ap_user_realname` VALUES ('2', '2', 'lisi', '512335455602781279', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbHSAQlqFAAXIZNzAq9E126.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbF6AR16RAAZB2e1EsOg460.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbDeAH2qoAAbD_WiUJfk745.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9ba9qANVEdAAS25KJlEVE291.jpg', '1', '', '2019-07-11 17:21:18', '2019-07-11 17:21:20', '2019-07-12 06:48:04');
  105. INSERT INTO `ap_user_realname` VALUES ('3', '3', 'wangwu6666', '512335455602781276', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbHSAQlqFAAXIZNzAq9E126.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbF6AR16RAAZB2e1EsOg460.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbDeAH2qoAAbD_WiUJfk745.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9ba9qANVEdAAS25KJlEVE291.jpg', '9', '', '2019-07-11 17:21:18', '2019-07-11 17:21:20', '2019-07-12 06:48:04');
  106. INSERT INTO `ap_user_realname` VALUES ('5', '5', 'suwukong', '512335455602781279', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbHSAQlqFAAXIZNzAq9E126.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbF6AR16RAAZB2e1EsOg460.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9bbDeAH2qoAAbD_WiUJfk745.jpg', 'http://161.189.111.227/group1/M00/00/00/rBFwgF9ba9qANVEdAAS25KJlEVE291.jpg', '1', '', '2020-08-01 11:10:31', '2020-08-01 11:10:34', '2020-08-01 11:10:36');

 2.虚拟机搭建

 

然后就是用finalshell连接虚拟机了

3.1docker更换源

 一、国内常用镜像源

  1. Docker中国官方镜像加速
  2. --registry-mirror=https://registry.docker-cn.com
  3.  
  4. 网易163镜像加速
  5. --registry-mirror=http://hub-mirror.c.163.com
  6.  
  7. 中科大镜像加速
  8. --registry-mirror=https://docker.mirrors.ustc.edu.cn
  9.  
  10. 阿里云镜像加速(需要注册账号后使用)
  11. --registry-mirror=https://{your_id}.mirror.aliyuncs.com


二、创建daemon.json文件

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4.   "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
  5. }
  6. EOF


三、重载Docker配置文件

sudo systemctl daemon-reload


四、重启Docker服务

sudo systemctl restart docker


五、查看配置结果

docker info|grep Mirrors -A 1

3.docker安装nacos

 

 

注意:一定要访问ip:8848/nacos,不要少了nacos,否则会报404 

 4.初始化工程

 三.全局异常处理

 四.登录加密

通过加盐,可以保证每个人最终生成的md5加密字符串不同,使其难以破解 

五.nacos公共配置数据源和mybatis-plus 

 公共配置:

  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.jdbc.Driver
  4. url: jdbc:mysql://localhost:3306/leadnews_user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
  5. username: root
  6. password: root
  7. # 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
  8. mybatis-plus:
  9. mapper-locations: classpath*:mapper/*.xml
  10. # 设置别名包扫描路径,通过该属性可以给包中的类注册别名
  11. type-aliases-package: com.heima.model.user.pojos

六.user模块创建

 

1.配置文件bootstrap.yml

 

  1. server:
  2. port: 51801
  3. spring:
  4. application:
  5. name: leadnews-user
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 192.168.200.130:8848
  10. config:
  11. server-addr: 192.168.200.130:8848
  12. file-extension: yml

 2.日志文件配置logback.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <!--定义日志文件的存储地址,使用绝对路径-->
  4. <property name="LOG_HOME" value="e:/logs"/>
  5. <!-- Console 输出设置 -->
  6. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  7. <encoder>
  8. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
  9. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  10. <charset>utf8</charset>
  11. </encoder>
  12. </appender>
  13. <!-- 按照每天生成日志文件 -->
  14. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  15. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  16. <!--日志文件输出的文件名-->
  17. <fileNamePattern>${LOG_HOME}/leadnews.%d{yyyy-MM-dd}.log</fileNamePattern>
  18. </rollingPolicy>
  19. <encoder>
  20. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  21. </encoder>
  22. </appender>
  23. <!-- 异步输出 -->
  24. <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
  25. <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
  26. <discardingThreshold>0</discardingThreshold>
  27. <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
  28. <queueSize>512</queueSize>
  29. <!-- 添加附加的appender,最多只能添加一个 -->
  30. <appender-ref ref="FILE"/>
  31. </appender>
  32. <logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">
  33. <appender-ref ref="CONSOLE"/>
  34. </logger>
  35. <logger name="org.springframework.boot" level="debug"/>
  36. <root level="info">
  37. <!--<appender-ref ref="ASYNC"/>-->
  38. <appender-ref ref="FILE"/>
  39. <appender-ref ref="CONSOLE"/>
  40. </root>
  41. </configuration>

 3.登录接口

 七.统一结果处理

  1.统一结果枚举类

  1. package com.heima.model.common.enums;
  2. public enum AppHttpCodeEnum {
  3. // 成功段固定为200
  4. SUCCESS(200,"操作成功"),
  5. // 登录段1~50
  6. NEED_LOGIN(1,"需要登录后操作"),
  7. LOGIN_PASSWORD_ERROR(2,"密码错误"),
  8. // TOKEN50~100
  9. TOKEN_INVALID(50,"无效的TOKEN"),
  10. TOKEN_EXPIRE(51,"TOKEN已过期"),
  11. TOKEN_REQUIRE(52,"TOKEN是必须的"),
  12. // SIGN验签 100~120
  13. SIGN_INVALID(100,"无效的SIGN"),
  14. SIG_TIMEOUT(101,"SIGN已过期"),
  15. // 参数错误 500~1000
  16. PARAM_REQUIRE(500,"缺少参数"),
  17. PARAM_INVALID(501,"无效参数"),
  18. PARAM_IMAGE_FORMAT_ERROR(502,"图片格式有误"),
  19. SERVER_ERROR(503,"服务器内部错误"),
  20. // 数据错误 1000~2000
  21. DATA_EXIST(1000,"数据已经存在"),
  22. AP_USER_DATA_NOT_EXIST(1001,"ApUser数据不存在"),
  23. DATA_NOT_EXIST(1002,"数据不存在"),
  24. // 数据错误 3000~3500
  25. NO_OPERATOR_AUTH(3000,"无权限操作"),
  26. NEED_ADMIND(3001,"需要管理员权限");
  27. int code;
  28. String errorMessage;
  29. AppHttpCodeEnum(int code, String errorMessage){
  30. this.code = code;
  31. this.errorMessage = errorMessage;
  32. }
  33. public int getCode() {
  34. return code;
  35. }
  36. public String getErrorMessage() {
  37. return errorMessage;
  38. }
  39. }

2.统一结果返回类

 

  1. package com.heima.model.common.dtos;
  2. import com.alibaba.fastjson.JSON;
  3. import com.heima.model.common.enums.AppHttpCodeEnum;
  4. import java.io.Serializable;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. /**
  10. * 通用的结果返回类
  11. * @param <T>
  12. */
  13. public class ResponseResult<T> implements Serializable {
  14. private String host;
  15. private Integer code;
  16. private String errorMessage;
  17. private T data;
  18. public ResponseResult() {
  19. this.code = 200;
  20. }
  21. public ResponseResult(Integer code, T data) {
  22. this.code = code;
  23. this.data = data;
  24. }
  25. public ResponseResult(Integer code, String msg, T data) {
  26. this.code = code;
  27. this.errorMessage = msg;
  28. this.data = data;
  29. }
  30. public ResponseResult(Integer code, String msg) {
  31. this.code = code;
  32. this.errorMessage = msg;
  33. }
  34. public static ResponseResult errorResult(int code, String msg) {
  35. ResponseResult result = new ResponseResult();
  36. return result.error(code, msg);
  37. }
  38. public static ResponseResult okResult(int code, String msg) {
  39. ResponseResult result = new ResponseResult();
  40. return result.ok(code, null, msg);
  41. }
  42. public static ResponseResult okResult(Object data) {
  43. ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getErrorMessage());
  44. if(data!=null) {
  45. result.setData(data);
  46. }
  47. return result;
  48. }
  49. public static ResponseResult errorResult(AppHttpCodeEnum enums){
  50. return setAppHttpCodeEnum(enums,enums.getErrorMessage());
  51. }
  52. public static ResponseResult errorResult(AppHttpCodeEnum enums, String errorMessage){
  53. return setAppHttpCodeEnum(enums,errorMessage);
  54. }
  55. public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums){
  56. return okResult(enums.getCode(),enums.getErrorMessage());
  57. }
  58. private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String errorMessage){
  59. return okResult(enums.getCode(),errorMessage);
  60. }
  61. public ResponseResult<?> error(Integer code, String msg) {
  62. this.code = code;
  63. this.errorMessage = msg;
  64. return this;
  65. }
  66. public ResponseResult<?> ok(Integer code, T data) {
  67. this.code = code;
  68. this.data = data;
  69. return this;
  70. }
  71. public ResponseResult<?> ok(Integer code, T data, String msg) {
  72. this.code = code;
  73. this.data = data;
  74. this.errorMessage = msg;
  75. return this;
  76. }
  77. public ResponseResult<?> ok(T data) {
  78. this.data = data;
  79. return this;
  80. }
  81. public Integer getCode() {
  82. return code;
  83. }
  84. public void setCode(Integer code) {
  85. this.code = code;
  86. }
  87. public String getErrorMessage() {
  88. return errorMessage;
  89. }
  90. public void setErrorMessage(String errorMessage) {
  91. this.errorMessage = errorMessage;
  92. }
  93. public T getData() {
  94. return data;
  95. }
  96. public void setData(T data) {
  97. this.data = data;
  98. }
  99. public String getHost() {
  100. return host;
  101. }
  102. public void setHost(String host) {
  103. this.host = host;
  104. }
  105. }

3.统一分页结果返回类

  1. package com.heima.model.common.dtos;
  2. import java.io.Serializable;
  3. public class PageResponseResult extends ResponseResult implements Serializable {
  4. private Integer currentPage;
  5. private Integer size;
  6. private Integer total;
  7. public PageResponseResult(Integer currentPage, Integer size, Integer total) {
  8. this.currentPage = currentPage;
  9. this.size = size;
  10. this.total = total;
  11. }
  12. public PageResponseResult() {
  13. }
  14. public int getCurrentPage() {
  15. return currentPage;
  16. }
  17. public void setCurrentPage(int currentPage) {
  18. this.currentPage = currentPage;
  19. }
  20. public int getSize() {
  21. return size;
  22. }
  23. public void setSize(int size) {
  24. this.size = size;
  25. }
  26. public int getTotal() {
  27. return total;
  28. }
  29. public void setTotal(int total) {
  30. this.total = total;
  31. }
  32. }

4.分页结果dto类

 

  1. package com.heima.model.common.dtos;
  2. import lombok.Data;
  3. import lombok.extern.slf4j.Slf4j;
  4. @Data
  5. @Slf4j
  6. public class PageRequestDto {
  7. protected Integer size;
  8. protected Integer page;
  9. public void checkParam() {
  10. if (this.page == null || this.page < 0) {
  11. setPage(1);
  12. }
  13. if (this.size == null || this.size < 0 || this.size > 100) {
  14. setSize(10);
  15. }
  16. }
  17. }

八.登录逻辑

 1.controller

  1. @RestController
  2. @RequestMapping("/api/v1/login")
  3. @Api(value = "app端用户登录",tags = "app端用户登录")
  4. public class ApUserLoginController {
  5. @Autowired
  6. private ApUserService apUserService;
  7. @PostMapping("/login_auth")
  8. @ApiOperation("用户登录")
  9. public ResponseResult login(@RequestBody LoginDto dto){
  10. return apUserService.login(dto);
  11. }
  12. }

2.service

 

  1. @Service
  2. @Transactional
  3. @Slf4j
  4. public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {
  5. /**
  6. * app端登录功能
  7. * @param dto
  8. * @return
  9. */
  10. @Override
  11. public ResponseResult login(LoginDto dto) {
  12. //1.正常登录 用户名和密码
  13. if(StringUtils.isNotBlank(dto.getPhone()) && StringUtils.isNotBlank(dto.getPassword())){
  14. //1.1 根据手机号查询用户信息
  15. ApUser dbUser = getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
  16. if(dbUser == null){
  17. return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"用户信息不存在");
  18. }
  19. //1.2 比对密码
  20. String salt = dbUser.getSalt();
  21. String password = dto.getPassword();
  22. String pswd = DigestUtils.md5DigestAsHex((password + salt).getBytes());
  23. if(!pswd.equals(dbUser.getPassword())){
  24. return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
  25. }
  26. //1.3 返回数据 jwt user
  27. String token = AppJwtUtil.getToken(dbUser.getId().longValue());
  28. Map<String,Object> map = new HashMap<>();
  29. map.put("token",token);
  30. dbUser.setSalt("");
  31. dbUser.setPassword("");
  32. map.put("user",dbUser);
  33. return ResponseResult.okResult(map);
  34. }else {
  35. //2.游客登录
  36. Map<String,Object> map = new HashMap<>();
  37. map.put("token",AppJwtUtil.getToken(0L));
  38. return ResponseResult.okResult(map);
  39. }
  40. }
  41. }

九.postman测试

 1.测试登录成功

2.输错密码

 

3.游客登录

 

4.输错手机号

 

 十.swagger接口文档

引入依赖,在heima-leadnews-model和heima-leadnews-common模块中引入该依赖

  1. <dependency>
  2. <groupId>io.springfox</groupId>
  3. <artifactId>springfox-swagger2</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>io.springfox</groupId>
  7. <artifactId>springfox-swagger-ui</artifactId>
  8. </dependency>
  • 在heima-leadnews-common工程中添加一个配置类

新增:com.heima.common.swagger.SwaggerConfiguration

  1. package com.heima.common.swagger;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import springfox.documentation.builders.ApiInfoBuilder;
  5. import springfox.documentation.builders.PathSelectors;
  6. import springfox.documentation.builders.RequestHandlerSelectors;
  7. import springfox.documentation.service.ApiInfo;
  8. import springfox.documentation.service.Contact;
  9. import springfox.documentation.spi.DocumentationType;
  10. import springfox.documentation.spring.web.plugins.Docket;
  11. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  12. @Configuration
  13. @EnableSwagger2
  14. public class SwaggerConfiguration {
  15. @Bean
  16. public Docket buildDocket() {
  17. return new Docket(DocumentationType.SWAGGER_2)
  18. .apiInfo(buildApiInfo())
  19. .select()
  20. // 要扫描的API(Controller)基础包
  21. .apis(RequestHandlerSelectors.basePackage("com.heima"))
  22. .paths(PathSelectors.any())
  23. .build();
  24. }
  25. private ApiInfo buildApiInfo() {
  26. Contact contact = new Contact("黑马程序员","","");
  27. return new ApiInfoBuilder()
  28. .title("黑马头条-平台管理API文档")
  29. .description("黑马头条后台api")
  30. .contact(contact)
  31. .version("1.0.0").build();
  32. }
  33. }

 

在heima-leadnews-common模块中的resources目录中新增以下目录和文件

文件:resources/META-INF/Spring.factories

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2.  com.heima.common.swagger.SwaggerConfiguration

(3)Swagger常用注解

在Java类中添加Swagger的注解即可生成Swagger接口文档,常用Swagger注解如下:

@Api:修饰整个类,描述Controller的作用

@ApiOperation:描述一个类的一个方法,或者说一个接口

@ApiParam:单个参数的描述信息

@ApiModel:用对象来接收参数

@ApiModelProperty:用对象接收参数时,描述对象的一个字段

@ApiResponse:HTTP响应其中1个描述

@ApiResponses:HTTP响应整体描述

@ApiIgnore:使用该注解忽略这个API

@ApiError :发生错误返回的信息

@ApiImplicitParam:一个请求参数

@ApiImplicitParams:多个请求参数的描述信息

 启动user微服务,访问地址:http://localhost:51801/swagger-ui.html

 

 十一.knfie4j接口文档

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!

 在heima-leadnews-common模块中的pom.xml文件中引入knife4j的依赖,如下:

  1. <dependency>
  2. <groupId>com.github.xiaoymin</groupId>
  3. <artifactId>knife4j-spring-boot-starter</artifactId>
  4. </dependency>

 

  • 创建Swagger配置文件

在heima-leadnews-common模块中新建配置类

新建Swagger的配置文件SwaggerConfiguration.java文件,创建springfox提供的Docket分组对象,代码如下:

  1. package com.heima.common.knife4j;
  2. import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.context.annotation.Import;
  6. import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
  7. import springfox.documentation.builders.ApiInfoBuilder;
  8. import springfox.documentation.builders.PathSelectors;
  9. import springfox.documentation.builders.RequestHandlerSelectors;
  10. import springfox.documentation.service.ApiInfo;
  11. import springfox.documentation.spi.DocumentationType;
  12. import springfox.documentation.spring.web.plugins.Docket;
  13. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  14. @Configuration
  15. @EnableSwagger2
  16. @EnableKnife4j
  17. @Import(BeanValidatorPluginsConfiguration.class)
  18. public class Swagger2Configuration {
  19. @Bean(value = "defaultApi2")
  20. public Docket defaultApi2() {
  21. Docket docket=new Docket(DocumentationType.SWAGGER_2)
  22. .apiInfo(apiInfo())
  23. //分组名称
  24. .groupName("1.0")
  25. .select()
  26. //这里指定Controller扫描包路径
  27. .apis(RequestHandlerSelectors.basePackage("com.heima"))
  28. .paths(PathSelectors.any())
  29. .build();
  30. return docket;
  31. }
  32. private ApiInfo apiInfo() {
  33. return new ApiInfoBuilder()
  34. .title("黑马头条API文档")
  35. .description("黑马头条API文档")
  36. .version("1.0")
  37. .build();
  38. }
  39. }

 

以上有两个注解需要特别说明,如下表:

注解说明
@EnableSwagger2该注解是Springfox-swagger框架提供的使用Swagger注解,该注解必须加
@EnableKnife4j该注解是knife4j提供的增强注解,Ui提供了例如动态参数、参数过滤、接口排序等增强功能,如果你想使用这些增强功能就必须加该注解,否则可以不用加
  • 添加配置

在Spring.factories中新增配置

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2.  com.heima.common.swagger.Swagger2Configuration, \
  3.  com.heima.common.swagger.SwaggerConfiguration
  • 访问

在浏览器输入地址:http://host:port/doc.html

 

 十二.gateway网关

1)在heima-leadnews-gateway导入以下依赖

 

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-gateway</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba.cloud</groupId>
  8. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.alibaba.cloud</groupId>
  12. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>io.jsonwebtoken</groupId>
  16. <artifactId>jjwt</artifactId>
  17. </dependency>
  18. </dependencies>

(2)在heima-leadnews-gateway下创建heima-leadnews-app-gateway微服务

  1. package com.heima.app.gateway;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. @SpringBootApplication
  6. @EnableDiscoveryClient //开启注册中心
  7. public class AppGatewayApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(AppGatewayApplication.class,args);
  10. }
  11. }

3.bootstrap.yml 

  1. server:
  2. port: 51601
  3. spring:
  4. application:
  5. name: leadnews-app-gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 192.168.200.130:8848
  10. config:
  11. server-addr: 192.168.200.130:8848
  12. file-extension: yml

4.nacos中配置文件 

  1. spring:
  2. cloud:
  3. gateway:
  4. globalcors:
  5. add-to-simple-url-handler-mapping: true
  6. corsConfigurations:
  7. '[/**]':
  8. allowedHeaders: "*"
  9. allowedOrigins: "*"
  10. allowedMethods:
  11. - GET
  12. - POST
  13. - DELETE
  14. - PUT
  15. - OPTION
  16. routes:
  17. # 平台管理
  18. - id: user
  19. uri: lb://leadnews-user
  20. predicates:
  21. - Path=/user/**
  22. filters:
  23. - StripPrefix= 1

环境搭建完成以后,启动项目网关和用户两个服务,使用postman进行测试

请求地址:http://localhost:51601/user/api/v1/login/login_auth

 

 

思路分析:

  1. 用户进入网关开始登陆,网关过滤器进行判断,如果是登录,则路由到后台管理微服务进行登录

  2. 用户登录成功,后台管理微服务签发JWT TOKEN信息返回给用户

  3. 用户再次进入网关开始访问,网关过滤器接收用户携带的TOKEN

  4. 网关过滤器解析TOKEN ,判断是否有权限,如果有,则放行,如果没有则返回未认证错误

具体实现:

第一:

在认证过滤器中需要用到jwt的解析,所以需要把工具类拷贝一份到网关微服务

第二:

在网关微服务中新建全局过滤器:

  1. package com.heima.app.gateway.filter;
  2. import com.heima.app.gateway.util.AppJwtUtil;
  3. import io.jsonwebtoken.Claims;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.commons.lang.StringUtils;
  6. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  7. import org.springframework.cloud.gateway.filter.GlobalFilter;
  8. import org.springframework.core.Ordered;
  9. import org.springframework.http.HttpStatus;
  10. import org.springframework.http.server.reactive.ServerHttpRequest;
  11. import org.springframework.http.server.reactive.ServerHttpResponse;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.web.server.ServerWebExchange;
  14. import reactor.core.publisher.Mono;
  15. @Component
  16. @Slf4j
  17. public class AuthorizeFilter implements Ordered, GlobalFilter {
  18. @Override
  19. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  20. //1.获取request和response对象
  21. ServerHttpRequest request = exchange.getRequest();
  22. ServerHttpResponse response = exchange.getResponse();
  23. //2.判断是否是登录
  24. if(request.getURI().getPath().contains("/login")){
  25. //放行
  26. return chain.filter(exchange);
  27. }
  28. //3.获取token
  29. String token = request.getHeaders().getFirst("token");
  30. //4.判断token是否存在
  31. if(StringUtils.isBlank(token)){
  32. response.setStatusCode(HttpStatus.UNAUTHORIZED);
  33. return response.setComplete();
  34. }
  35. //5.判断token是否有效
  36. try {
  37. Claims claimsBody = AppJwtUtil.getClaimsBody(token);
  38. //是否是过期
  39. int result = AppJwtUtil.verifyToken(claimsBody);
  40. if(result == 1 || result == 2){
  41. response.setStatusCode(HttpStatus.UNAUTHORIZED);
  42. return response.setComplete();
  43. }
  44. }catch (Exception e){
  45. e.printStackTrace();
  46. response.setStatusCode(HttpStatus.UNAUTHORIZED);
  47. return response.setComplete();
  48. }
  49. //6.放行
  50. return chain.filter(exchange);
  51. }
  52. /**
  53. * 优先级设置 值越小 优先级越高
  54. * @return
  55. */
  56. @Override
  57. public int getOrder() {
  58. return 0;
  59. }
  60. }

测试:

启动user服务,继续访问其他微服务,会提示需要认证才能访问,这个时候需要在heads中设置设置token才能正常访问。

 十三.前端项目启动

 

 

9.2)配置nginx

①:解压资料文件夹中的压缩包nginx-1.18.0.zip

②:解压资料文件夹中的前端项目app-web.zip

③:配置nginx.conf文件

在nginx安装的conf目录下新建一个文件夹leadnews.conf,在当前文件夹中新建heima-leadnews-app.conf文件

heima-leadnews-app.conf配置如下: 

  1. upstream heima-app-gateway{
  2. server localhost:51601;
  3. }
  4. server {
  5. listen 8801;
  6. location / {
  7. root D:/workspace/app-web/;
  8. index index.html;
  9. }
  10. location ~/app/(.*) {
  11. proxy_pass http://heima-app-gateway/$1;
  12. proxy_set_header HOST $host; # 不改变源请求头的值
  13. proxy_pass_request_body on; #开启获取请求体
  14. proxy_pass_request_headers on; #开启获取请求头
  15. proxy_set_header X-Real-IP $remote_addr; # 记录真实发出请求的客户端IP
  16. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息
  17. }
  18. }

nginx.conf 把里面注释的内容和静态资源配置相关删除,引入heima-leadnews-app.conf文件加载

  1. #user nobody;
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. sendfile on;
  10. keepalive_timeout 65;
  11. # 引入自定义配置文件
  12. include leadnews.conf/*.conf;
  13. }

 

④ :启动nginx

在nginx安装包中使用命令提示符打开,输入命令nginx启动项目

可查看进程,检查nginx是否启动

重新加载配置文件:nginx -s reload

⑤:打开前端项目进行测试 -- > http://localhost:8801

用谷歌浏览器打开,调试移动端模式进行访问

 

 

 

可以看到前端已经启动起来了! 

关于windows中对nginx的操作:

1.停止nginx服务

taskkill /f /t /im nginx.exe

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/988187
推荐阅读
相关标签
  

闽ICP备14008679号