开发环境
- JDK8
- 不要用OpenJDK
-
数据库选型
MariaDB
- 下载地址:https://downloads.mariadb.org/
-
开发工具
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的,为了兼容,能够正常保存到数据库当中)

TODO:数据表的关系和连接用PDMan设计
构建父子工程
创建Maven工程
创建子模块
父工程
使用dependencyManagement的目的是为了保证父工程的干净,
也就是说父工程他只负责管理依赖,以及依赖的版本,而不会导入额外的jar依赖。
如此一来父工程的职责就很单一了,而且也符合了面向对象开发的父子继承关系,
依赖的导入只有在各自的子工程中才会进行导入。
<dependencyManagement><dependencies><dependency>...........................</dependency></dependencies></dependencyManagement>
pom.xml
子工程
API
pom.xml文件
Common
mapper
model
service
Maven依赖加载
API层配置yaml文件
测试项目是否能够正常运行
编写Hello测试类

成功运行项目

后端接口测试页面

Hello接口测试
优雅Restful设计风格和开发方式
Restful封装类
GraceJSONResult
package com.yau.grace.result;import java.util.Map;/*** 自定义响应数据类型枚举升级版本** @Title: IMOOCJSONResult.java* @Package com.imooc.utils* @Description: 自定义响应数据结构* 本类可提供给 H5/ios/安卓/公众号/小程序 使用* 前端接受此类数据(json object)后,可自行根据业务去实现相关功能** @Copyright: Copyright (c) 2020* @Company: www.imooc.com* @author 慕课网 - 风间影月* @version V2.0*/public class GraceJSONResult {// 响应业务状态码private Integer status;// 响应消息private String msg;// 是否成功private Boolean success;// 响应数据,可以是Object,也可以是List或Map等private Object data;/*** 成功返回,带有数据的,直接往OK方法丢data数据即可* @param data* @return*/public static GraceJSONResult ok(Object data) {return new GraceJSONResult(data);}/*** 成功返回,不带有数据的,直接调用ok方法,data无须传入(其实就是null)* @return*/public static GraceJSONResult ok() {return new GraceJSONResult(ResponseStatusEnum.SUCCESS);}public GraceJSONResult(Object data) {this.status = ResponseStatusEnum.SUCCESS.status();this.msg = ResponseStatusEnum.SUCCESS.msg();this.success = ResponseStatusEnum.SUCCESS.success();this.data = data;}/*** 错误返回,直接调用error方法即可,当然也可以在ResponseStatusEnum中自定义错误后再返回也都可以* @return*/public static GraceJSONResult error() {return new GraceJSONResult(ResponseStatusEnum.FAILED);}/*** 错误返回,map中包含了多条错误信息,可以用于表单验证,把错误统一的全部返回出去* @param map* @return*/public static GraceJSONResult errorMap(Map map) {return new GraceJSONResult(ResponseStatusEnum.FAILED, map);}/*** 错误返回,直接返回错误的消息* @param msg* @return*/public static GraceJSONResult errorMsg(String msg) {return new GraceJSONResult(ResponseStatusEnum.FAILED, msg);}/*** 错误返回,token异常,一些通用的可以在这里统一定义* @return*/public static GraceJSONResult errorTicket() {return new GraceJSONResult(ResponseStatusEnum.TICKET_INVALID);}/*** 自定义错误范围,需要传入一个自定义的枚举,可以到[ResponseStatusEnum.java[中自定义后再传入* @param responseStatus* @return*/public static GraceJSONResult errorCustom(ResponseStatusEnum responseStatus) {return new GraceJSONResult(responseStatus);}public static GraceJSONResult exception(ResponseStatusEnum responseStatus) {return new GraceJSONResult(responseStatus);}public GraceJSONResult(ResponseStatusEnum responseStatus) {this.status = responseStatus.status();this.msg = responseStatus.msg();this.success = responseStatus.success();}public GraceJSONResult(ResponseStatusEnum responseStatus, Object data) {this.status = responseStatus.status();this.msg = responseStatus.msg();this.success = responseStatus.success();this.data = data;}public GraceJSONResult(ResponseStatusEnum responseStatus, String msg) {this.status = responseStatus.status();this.msg = msg;this.success = responseStatus.success();}public GraceJSONResult() {}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public Boolean getSuccess() {return success;}public void setSuccess(Boolean success) {this.success = success;}}
IMOOCJSONResult
package com.yau.grace.result;/**** @Title: IMOOCJSONResult.java* @Package com.imooc.utils* @Description: 自定义响应数据结构* 本类可提供给 H5/ios/安卓/公众号/小程序 使用* 前端接受此类数据(json object)后,可自行根据业务去实现相关功能** 200:表示成功* 500:表示错误,错误信息在msg字段中* 501:bean验证错误,不管多少个错误都以map形式返回* 502:拦截器拦截到用户token出错* 555:异常抛出信息* 556: 用户qq校验异常* 557: 校验用户是否在CAS登录,用户门票的校验* @Copyright: Copyright (c) 2020* @Company: www.imooc.com* @author 慕课网 - 风间影月* @version V1.0*/public class IMOOCJSONResult {// 响应业务状态private Integer status;// 响应消息private String msg;// 响应中的数据private Object data;private String ok; // 不使用public static IMOOCJSONResult build(Integer status, String msg, Object data) {return new IMOOCJSONResult(status, msg, data);}public static IMOOCJSONResult build(Integer status, String msg, Object data, String ok) {return new IMOOCJSONResult(status, msg, data, ok);}public static IMOOCJSONResult ok(Object data) {return new IMOOCJSONResult(data);}public static IMOOCJSONResult ok() {return new IMOOCJSONResult(null);}public static IMOOCJSONResult errorMsg(String msg) {return new IMOOCJSONResult(500, msg, null);}public static IMOOCJSONResult errorUserTicket(String msg) {return new IMOOCJSONResult(557, msg, null);}public static IMOOCJSONResult errorMap(Object data) {return new IMOOCJSONResult(501, "error", data);}public static IMOOCJSONResult errorTokenMsg(String msg) {return new IMOOCJSONResult(502, msg, null);}public static IMOOCJSONResult errorException(String msg) {return new IMOOCJSONResult(555, msg, null);}public static IMOOCJSONResult errorUserQQ(String msg) {return new IMOOCJSONResult(556, msg, null);}public IMOOCJSONResult() {}public IMOOCJSONResult(Integer status, String msg, Object data) {this.status = status;this.msg = msg;this.data = data;}public IMOOCJSONResult(Integer status, String msg, Object data, String ok) {this.status = status;this.msg = msg;this.data = data;this.ok = ok;}public IMOOCJSONResult(Object data) {this.status = 200;this.msg = "OK";this.data = data;}public Boolean isOK() {return this.status == 200;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public String getOk() {return ok;}public void setOk(String ok) {this.ok = ok;}}
ResponseStatusEnum
package com.yau.grace.result;/*** 响应结果枚举,用于提供给GraceJSONResult返回给前端的* 本枚举类中包含了很多的不同的状态码供使用,可以自定义* 便于更优雅的对状态码进行管理,一目了然*/public enum ResponseStatusEnum {SUCCESS(200, true, "操作成功!"),FAILED(500, false, "操作失败!"),// 50xUN_LOGIN(501,false,"请登录后再继续操作!"),TICKET_INVALID(502,false,"会话失效,请重新登录!"),NO_AUTH(503,false,"您的权限不足,无法继续操作!"),MOBILE_ERROR(504,false,"短信发送失败,请稍后重试!"),SMS_NEED_WAIT_ERROR(505,false,"短信发送太快啦~请稍后再试!"),SMS_CODE_ERROR(506,false,"验证码过期或不匹配,请稍后再试!"),USER_FROZEN(507,false,"用户已被冻结,请联系管理员!"),USER_UPDATE_ERROR(508,false,"用户信息更新失败,请联系管理员!"),USER_INACTIVE_ERROR(509,false,"请前往[账号设置]修改信息激活后再进行后续操作!"),USER_INFO_UPDATED_ERROR(5091,false,"用户信息修改失败!"),USER_INFO_UPDATED_NICKNAME_EXIST_ERROR(5092,false,"昵称已经存在!"),USER_INFO_UPDATED_IMOOCNUM_EXIST_ERROR(5092,false,"慕课号已经存在!"),USER_INFO_CANT_UPDATED_IMOOCNUM_ERROR(5092,false,"慕课号无法修改!"),FILE_UPLOAD_NULL_ERROR(510,false,"文件不能为空,请选择一个文件再上传!"),FILE_UPLOAD_FAILD(511,false,"文件上传失败!"),FILE_FORMATTER_FAILD(512,false,"文件图片格式不支持!"),FILE_MAX_SIZE_500KB_ERROR(5131,false,"仅支持500kb大小以下的图片上传!"),FILE_MAX_SIZE_2MB_ERROR(5132,false,"仅支持2MB大小以下的图片上传!"),FILE_NOT_EXIST_ERROR(514,false,"你所查看的文件不存在!"),USER_STATUS_ERROR(515,false,"用户状态参数出错!"),USER_NOT_EXIST_ERROR(516,false,"用户不存在!"),// 自定义系统级别异常 54xSYSTEM_INDEX_OUT_OF_BOUNDS(541, false, "系统错误,数组越界!"),SYSTEM_ARITHMETIC_BY_ZERO(542, false, "系统错误,无法除零!"),SYSTEM_NULL_POINTER(543, false, "系统错误,空指针!"),SYSTEM_NUMBER_FORMAT(544, false, "系统错误,数字转换异常!"),SYSTEM_PARSE(545, false, "系统错误,解析异常!"),SYSTEM_IO(546, false, "系统错误,IO输入输出异常!"),SYSTEM_FILE_NOT_FOUND(547, false, "系统错误,文件未找到!"),SYSTEM_CLASS_CAST(548, false, "系统错误,类型强制转换错误!"),SYSTEM_PARSER_ERROR(549, false, "系统错误,解析出错!"),SYSTEM_DATE_PARSER_ERROR(550, false, "系统错误,日期解析出错!"),// admin 管理系统 56xADMIN_USERNAME_NULL_ERROR(561, false, "管理员登录名不能为空!"),ADMIN_USERNAME_EXIST_ERROR(562, false, "管理员登录名已存在!"),ADMIN_NAME_NULL_ERROR(563, false, "管理员负责人不能为空!"),ADMIN_PASSWORD_ERROR(564, false, "密码不能为空后者两次输入不一致!"),ADMIN_CREATE_ERROR(565, false, "添加管理员失败!"),ADMIN_PASSWORD_NULL_ERROR(566, false, "密码不能为空!"),ADMIN_NOT_EXIT_ERROR(567, false, "管理员不存在或密码错误!"),ADMIN_FACE_NULL_ERROR(568, false, "人脸信息不能为空!"),ADMIN_FACE_LOGIN_ERROR(569, false, "人脸识别失败,请重试!"),CATEGORY_EXIST_ERROR(570, false, "文章分类已存在,请换一个分类名!"),// 媒体中心 相关错误 58xARTICLE_COVER_NOT_EXIST_ERROR(580, false, "文章封面不存在,请选择一个!"),ARTICLE_CATEGORY_NOT_EXIST_ERROR(581, false, "请选择正确的文章领域!"),ARTICLE_CREATE_ERROR(582, false, "创建文章失败,请重试或联系管理员!"),ARTICLE_QUERY_PARAMS_ERROR(583, false, "文章列表查询参数错误!"),ARTICLE_DELETE_ERROR(584, false, "文章删除失败!"),ARTICLE_WITHDRAW_ERROR(585, false, "文章撤回失败!"),ARTICLE_REVIEW_ERROR(585, false, "文章审核出错!"),ARTICLE_ALREADY_READ_ERROR(586, false, "文章重复阅读!"),// 人脸识别错误代码FACE_VERIFY_TYPE_ERROR(600, false, "人脸比对验证类型不正确!"),FACE_VERIFY_LOGIN_ERROR(601, false, "人脸登录失败!"),// 系统错误,未预期的错误 555SYSTEM_ERROR(555, false, "系统繁忙,请稍后再试!"),SYSTEM_OPERATION_ERROR(556, false, "操作失败,请重试或联系管理员"),SYSTEM_RESPONSE_NO_INFO(557, false, ""),SYSTEM_ERROR_GLOBAL(558, false, "全局降级:系统繁忙,请稍后再试!"),SYSTEM_ERROR_FEIGN(559, false, "客户端Feign降级:系统繁忙,请稍后再试!"),SYSTEM_ERROR_ZUUL(560, false, "请求系统过于繁忙,请稍后再试!");// 响应业务状态private Integer status;// 调用是否成功private Boolean success;// 响应消息,可以为成功或者失败的消息private String msg;ResponseStatusEnum(Integer status, Boolean success, String msg) {this.status = status;this.success = success;this.msg = msg;}public Integer status() {return status;}public Boolean success() {return success;}public String msg() {return msg;}}
lombok插件
配置日志级别
利用数据库逆向工具生成文件,放置到对应的model里面

运行GeneratorDisplay.java 文件
生成失败
未配置数据源,参数未设置 useSSL=false

成功生成
将生成的文件移动到对应的mapper模块和model模块
使用knife4j实现接口文档



