开发环境

  • JDK8
  • 不要用OpenJDK
  • Maven

    数据库选型

  • MariaDB

  • 下载地址:https://downloads.mariadb.org/
  • Mysql 5.6/5.7/8

    开发工具

  • IDEA

  • RESP(管理Redis缓存中间件)
  • VM ware 虚拟机内部配置Centos 7.9
  • HbuilderX
  • Navicat
  • SSH连接工具
    • XShell
    • Xftp

      拓展:

      • DevEco-Studio(开发鸿蒙OS的软件)
      • XCode(开发IOS的软件)
      • CocosCreator(开发游戏)
      • ApiPost7(接口测试工具)
      • Postman(接口测试工具)
      • PDMan(数据表设计工具)
      • Studio 3T(MongoDB管理)
      • UltraEdit(文本工具,可编辑二进制文件,适合逆向工程)

数据库选型

  • MariaDB
  • 与MySql的关系
    • MySql开源数据库,被Oracle收购,由于Oracle是一家商业性质的公司,为了避免未来某天MySql避免,原先开发MySql的创造者就开发了一个MySql的分支,即MariaDB
  • 下载地址:https://mariadb.org/
  • MySql 5.6/7 8
  • 部分情况下超过Mysql

    创建MySql表

    Tips:

    • 字符集设置未utf8mb4(因为评论区可能会有一些emoji的,为了兼容,能够正常保存到数据库当中)

image.png


TODO:数据表的关系和连接用PDMan设计


构建父子工程

创建Maven工程

image.png

创建子模块

image.png

父工程

使用dependencyManagement的目的是为了保证父工程的干净,
也就是说父工程他只负责管理依赖,以及依赖的版本,而不会导入额外的jar依赖。
如此一来父工程的职责就很单一了,而且也符合了面向对象开发的父子继承关系,
依赖的导入只有在各自的子工程中才会进行导入。

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. .........
  5. .........
  6. .........
  7. </dependency>
  8. </dependencies>
  9. </dependencyManagement>

pom.xml

image.png

子工程

API

pom.xml文件

image.png

Common

image.png

mapper

image.png

model

image.png

service

image.png

Maven依赖加载

image.png
image.png

API层配置yaml文件

image.png

测试项目是否能够正常运行

编写Hello测试类

image.png

成功运行项目

image.png

后端接口测试页面

image.png

Hello接口测试

image.png

优雅Restful设计风格和开发方式

Restful封装类

image.png

GraceJSONResult

  1. package com.yau.grace.result;
  2. import java.util.Map;
  3. /**
  4. * 自定义响应数据类型枚举升级版本
  5. *
  6. * @Title: IMOOCJSONResult.java
  7. * @Package com.imooc.utils
  8. * @Description: 自定义响应数据结构
  9. * 本类可提供给 H5/ios/安卓/公众号/小程序 使用
  10. * 前端接受此类数据(json object)后,可自行根据业务去实现相关功能
  11. *
  12. * @Copyright: Copyright (c) 2020
  13. * @Company: www.imooc.com
  14. * @author 慕课网 - 风间影月
  15. * @version V2.0
  16. */
  17. public class GraceJSONResult {
  18. // 响应业务状态码
  19. private Integer status;
  20. // 响应消息
  21. private String msg;
  22. // 是否成功
  23. private Boolean success;
  24. // 响应数据,可以是Object,也可以是List或Map等
  25. private Object data;
  26. /**
  27. * 成功返回,带有数据的,直接往OK方法丢data数据即可
  28. * @param data
  29. * @return
  30. */
  31. public static GraceJSONResult ok(Object data) {
  32. return new GraceJSONResult(data);
  33. }
  34. /**
  35. * 成功返回,不带有数据的,直接调用ok方法,data无须传入(其实就是null)
  36. * @return
  37. */
  38. public static GraceJSONResult ok() {
  39. return new GraceJSONResult(ResponseStatusEnum.SUCCESS);
  40. }
  41. public GraceJSONResult(Object data) {
  42. this.status = ResponseStatusEnum.SUCCESS.status();
  43. this.msg = ResponseStatusEnum.SUCCESS.msg();
  44. this.success = ResponseStatusEnum.SUCCESS.success();
  45. this.data = data;
  46. }
  47. /**
  48. * 错误返回,直接调用error方法即可,当然也可以在ResponseStatusEnum中自定义错误后再返回也都可以
  49. * @return
  50. */
  51. public static GraceJSONResult error() {
  52. return new GraceJSONResult(ResponseStatusEnum.FAILED);
  53. }
  54. /**
  55. * 错误返回,map中包含了多条错误信息,可以用于表单验证,把错误统一的全部返回出去
  56. * @param map
  57. * @return
  58. */
  59. public static GraceJSONResult errorMap(Map map) {
  60. return new GraceJSONResult(ResponseStatusEnum.FAILED, map);
  61. }
  62. /**
  63. * 错误返回,直接返回错误的消息
  64. * @param msg
  65. * @return
  66. */
  67. public static GraceJSONResult errorMsg(String msg) {
  68. return new GraceJSONResult(ResponseStatusEnum.FAILED, msg);
  69. }
  70. /**
  71. * 错误返回,token异常,一些通用的可以在这里统一定义
  72. * @return
  73. */
  74. public static GraceJSONResult errorTicket() {
  75. return new GraceJSONResult(ResponseStatusEnum.TICKET_INVALID);
  76. }
  77. /**
  78. * 自定义错误范围,需要传入一个自定义的枚举,可以到[ResponseStatusEnum.java[中自定义后再传入
  79. * @param responseStatus
  80. * @return
  81. */
  82. public static GraceJSONResult errorCustom(ResponseStatusEnum responseStatus) {
  83. return new GraceJSONResult(responseStatus);
  84. }
  85. public static GraceJSONResult exception(ResponseStatusEnum responseStatus) {
  86. return new GraceJSONResult(responseStatus);
  87. }
  88. public GraceJSONResult(ResponseStatusEnum responseStatus) {
  89. this.status = responseStatus.status();
  90. this.msg = responseStatus.msg();
  91. this.success = responseStatus.success();
  92. }
  93. public GraceJSONResult(ResponseStatusEnum responseStatus, Object data) {
  94. this.status = responseStatus.status();
  95. this.msg = responseStatus.msg();
  96. this.success = responseStatus.success();
  97. this.data = data;
  98. }
  99. public GraceJSONResult(ResponseStatusEnum responseStatus, String msg) {
  100. this.status = responseStatus.status();
  101. this.msg = msg;
  102. this.success = responseStatus.success();
  103. }
  104. public GraceJSONResult() {
  105. }
  106. public Integer getStatus() {
  107. return status;
  108. }
  109. public void setStatus(Integer status) {
  110. this.status = status;
  111. }
  112. public String getMsg() {
  113. return msg;
  114. }
  115. public void setMsg(String msg) {
  116. this.msg = msg;
  117. }
  118. public Object getData() {
  119. return data;
  120. }
  121. public void setData(Object data) {
  122. this.data = data;
  123. }
  124. public Boolean getSuccess() {
  125. return success;
  126. }
  127. public void setSuccess(Boolean success) {
  128. this.success = success;
  129. }
  130. }

IMOOCJSONResult

  1. package com.yau.grace.result;
  2. /**
  3. *
  4. * @Title: IMOOCJSONResult.java
  5. * @Package com.imooc.utils
  6. * @Description: 自定义响应数据结构
  7. * 本类可提供给 H5/ios/安卓/公众号/小程序 使用
  8. * 前端接受此类数据(json object)后,可自行根据业务去实现相关功能
  9. *
  10. * 200:表示成功
  11. * 500:表示错误,错误信息在msg字段中
  12. * 501:bean验证错误,不管多少个错误都以map形式返回
  13. * 502:拦截器拦截到用户token出错
  14. * 555:异常抛出信息
  15. * 556: 用户qq校验异常
  16. * 557: 校验用户是否在CAS登录,用户门票的校验
  17. * @Copyright: Copyright (c) 2020
  18. * @Company: www.imooc.com
  19. * @author 慕课网 - 风间影月
  20. * @version V1.0
  21. */
  22. public class IMOOCJSONResult {
  23. // 响应业务状态
  24. private Integer status;
  25. // 响应消息
  26. private String msg;
  27. // 响应中的数据
  28. private Object data;
  29. private String ok; // 不使用
  30. public static IMOOCJSONResult build(Integer status, String msg, Object data) {
  31. return new IMOOCJSONResult(status, msg, data);
  32. }
  33. public static IMOOCJSONResult build(Integer status, String msg, Object data, String ok) {
  34. return new IMOOCJSONResult(status, msg, data, ok);
  35. }
  36. public static IMOOCJSONResult ok(Object data) {
  37. return new IMOOCJSONResult(data);
  38. }
  39. public static IMOOCJSONResult ok() {
  40. return new IMOOCJSONResult(null);
  41. }
  42. public static IMOOCJSONResult errorMsg(String msg) {
  43. return new IMOOCJSONResult(500, msg, null);
  44. }
  45. public static IMOOCJSONResult errorUserTicket(String msg) {
  46. return new IMOOCJSONResult(557, msg, null);
  47. }
  48. public static IMOOCJSONResult errorMap(Object data) {
  49. return new IMOOCJSONResult(501, "error", data);
  50. }
  51. public static IMOOCJSONResult errorTokenMsg(String msg) {
  52. return new IMOOCJSONResult(502, msg, null);
  53. }
  54. public static IMOOCJSONResult errorException(String msg) {
  55. return new IMOOCJSONResult(555, msg, null);
  56. }
  57. public static IMOOCJSONResult errorUserQQ(String msg) {
  58. return new IMOOCJSONResult(556, msg, null);
  59. }
  60. public IMOOCJSONResult() {
  61. }
  62. public IMOOCJSONResult(Integer status, String msg, Object data) {
  63. this.status = status;
  64. this.msg = msg;
  65. this.data = data;
  66. }
  67. public IMOOCJSONResult(Integer status, String msg, Object data, String ok) {
  68. this.status = status;
  69. this.msg = msg;
  70. this.data = data;
  71. this.ok = ok;
  72. }
  73. public IMOOCJSONResult(Object data) {
  74. this.status = 200;
  75. this.msg = "OK";
  76. this.data = data;
  77. }
  78. public Boolean isOK() {
  79. return this.status == 200;
  80. }
  81. public Integer getStatus() {
  82. return status;
  83. }
  84. public void setStatus(Integer status) {
  85. this.status = status;
  86. }
  87. public String getMsg() {
  88. return msg;
  89. }
  90. public void setMsg(String msg) {
  91. this.msg = msg;
  92. }
  93. public Object getData() {
  94. return data;
  95. }
  96. public void setData(Object data) {
  97. this.data = data;
  98. }
  99. public String getOk() {
  100. return ok;
  101. }
  102. public void setOk(String ok) {
  103. this.ok = ok;
  104. }
  105. }

ResponseStatusEnum

  1. package com.yau.grace.result;
  2. /**
  3. * 响应结果枚举,用于提供给GraceJSONResult返回给前端的
  4. * 本枚举类中包含了很多的不同的状态码供使用,可以自定义
  5. * 便于更优雅的对状态码进行管理,一目了然
  6. */
  7. public enum ResponseStatusEnum {
  8. SUCCESS(200, true, "操作成功!"),
  9. FAILED(500, false, "操作失败!"),
  10. // 50x
  11. UN_LOGIN(501,false,"请登录后再继续操作!"),
  12. TICKET_INVALID(502,false,"会话失效,请重新登录!"),
  13. NO_AUTH(503,false,"您的权限不足,无法继续操作!"),
  14. MOBILE_ERROR(504,false,"短信发送失败,请稍后重试!"),
  15. SMS_NEED_WAIT_ERROR(505,false,"短信发送太快啦~请稍后再试!"),
  16. SMS_CODE_ERROR(506,false,"验证码过期或不匹配,请稍后再试!"),
  17. USER_FROZEN(507,false,"用户已被冻结,请联系管理员!"),
  18. USER_UPDATE_ERROR(508,false,"用户信息更新失败,请联系管理员!"),
  19. USER_INACTIVE_ERROR(509,false,"请前往[账号设置]修改信息激活后再进行后续操作!"),
  20. USER_INFO_UPDATED_ERROR(5091,false,"用户信息修改失败!"),
  21. USER_INFO_UPDATED_NICKNAME_EXIST_ERROR(5092,false,"昵称已经存在!"),
  22. USER_INFO_UPDATED_IMOOCNUM_EXIST_ERROR(5092,false,"慕课号已经存在!"),
  23. USER_INFO_CANT_UPDATED_IMOOCNUM_ERROR(5092,false,"慕课号无法修改!"),
  24. FILE_UPLOAD_NULL_ERROR(510,false,"文件不能为空,请选择一个文件再上传!"),
  25. FILE_UPLOAD_FAILD(511,false,"文件上传失败!"),
  26. FILE_FORMATTER_FAILD(512,false,"文件图片格式不支持!"),
  27. FILE_MAX_SIZE_500KB_ERROR(5131,false,"仅支持500kb大小以下的图片上传!"),
  28. FILE_MAX_SIZE_2MB_ERROR(5132,false,"仅支持2MB大小以下的图片上传!"),
  29. FILE_NOT_EXIST_ERROR(514,false,"你所查看的文件不存在!"),
  30. USER_STATUS_ERROR(515,false,"用户状态参数出错!"),
  31. USER_NOT_EXIST_ERROR(516,false,"用户不存在!"),
  32. // 自定义系统级别异常 54x
  33. SYSTEM_INDEX_OUT_OF_BOUNDS(541, false, "系统错误,数组越界!"),
  34. SYSTEM_ARITHMETIC_BY_ZERO(542, false, "系统错误,无法除零!"),
  35. SYSTEM_NULL_POINTER(543, false, "系统错误,空指针!"),
  36. SYSTEM_NUMBER_FORMAT(544, false, "系统错误,数字转换异常!"),
  37. SYSTEM_PARSE(545, false, "系统错误,解析异常!"),
  38. SYSTEM_IO(546, false, "系统错误,IO输入输出异常!"),
  39. SYSTEM_FILE_NOT_FOUND(547, false, "系统错误,文件未找到!"),
  40. SYSTEM_CLASS_CAST(548, false, "系统错误,类型强制转换错误!"),
  41. SYSTEM_PARSER_ERROR(549, false, "系统错误,解析出错!"),
  42. SYSTEM_DATE_PARSER_ERROR(550, false, "系统错误,日期解析出错!"),
  43. // admin 管理系统 56x
  44. ADMIN_USERNAME_NULL_ERROR(561, false, "管理员登录名不能为空!"),
  45. ADMIN_USERNAME_EXIST_ERROR(562, false, "管理员登录名已存在!"),
  46. ADMIN_NAME_NULL_ERROR(563, false, "管理员负责人不能为空!"),
  47. ADMIN_PASSWORD_ERROR(564, false, "密码不能为空后者两次输入不一致!"),
  48. ADMIN_CREATE_ERROR(565, false, "添加管理员失败!"),
  49. ADMIN_PASSWORD_NULL_ERROR(566, false, "密码不能为空!"),
  50. ADMIN_NOT_EXIT_ERROR(567, false, "管理员不存在或密码错误!"),
  51. ADMIN_FACE_NULL_ERROR(568, false, "人脸信息不能为空!"),
  52. ADMIN_FACE_LOGIN_ERROR(569, false, "人脸识别失败,请重试!"),
  53. CATEGORY_EXIST_ERROR(570, false, "文章分类已存在,请换一个分类名!"),
  54. // 媒体中心 相关错误 58x
  55. ARTICLE_COVER_NOT_EXIST_ERROR(580, false, "文章封面不存在,请选择一个!"),
  56. ARTICLE_CATEGORY_NOT_EXIST_ERROR(581, false, "请选择正确的文章领域!"),
  57. ARTICLE_CREATE_ERROR(582, false, "创建文章失败,请重试或联系管理员!"),
  58. ARTICLE_QUERY_PARAMS_ERROR(583, false, "文章列表查询参数错误!"),
  59. ARTICLE_DELETE_ERROR(584, false, "文章删除失败!"),
  60. ARTICLE_WITHDRAW_ERROR(585, false, "文章撤回失败!"),
  61. ARTICLE_REVIEW_ERROR(585, false, "文章审核出错!"),
  62. ARTICLE_ALREADY_READ_ERROR(586, false, "文章重复阅读!"),
  63. // 人脸识别错误代码
  64. FACE_VERIFY_TYPE_ERROR(600, false, "人脸比对验证类型不正确!"),
  65. FACE_VERIFY_LOGIN_ERROR(601, false, "人脸登录失败!"),
  66. // 系统错误,未预期的错误 555
  67. SYSTEM_ERROR(555, false, "系统繁忙,请稍后再试!"),
  68. SYSTEM_OPERATION_ERROR(556, false, "操作失败,请重试或联系管理员"),
  69. SYSTEM_RESPONSE_NO_INFO(557, false, ""),
  70. SYSTEM_ERROR_GLOBAL(558, false, "全局降级:系统繁忙,请稍后再试!"),
  71. SYSTEM_ERROR_FEIGN(559, false, "客户端Feign降级:系统繁忙,请稍后再试!"),
  72. SYSTEM_ERROR_ZUUL(560, false, "请求系统过于繁忙,请稍后再试!");
  73. // 响应业务状态
  74. private Integer status;
  75. // 调用是否成功
  76. private Boolean success;
  77. // 响应消息,可以为成功或者失败的消息
  78. private String msg;
  79. ResponseStatusEnum(Integer status, Boolean success, String msg) {
  80. this.status = status;
  81. this.success = success;
  82. this.msg = msg;
  83. }
  84. public Integer status() {
  85. return status;
  86. }
  87. public Boolean success() {
  88. return success;
  89. }
  90. public String msg() {
  91. return msg;
  92. }
  93. }

lombok插件

image.png
image.png

配置日志级别

image.png

利用数据库逆向工具生成文件,放置到对应的model里面

image.png
运行GeneratorDisplay.java 文件
生成失败
image.png

未配置数据源,参数未设置 useSSL=false

image.png
成功生成
将生成的文件移动到对应的mapper模块和model模块
image.png
image.png

使用knife4j实现接口文档

image.png