实现了基于 Spring 的前后端分离版本的在线论坛系统,实现了用户登录注册、站内私信,帖⼦列表, 发布帖⼦, 回复帖⼦,点赞帖子,搜索帖子等功能。
项目体验:线上论坛 - 用户登录
经过简单分析:“版块类别” 和 “版块帖⼦数量” 都可以归结到 “版块” 类,做为 “版块” 类的属性;“帖⼦标题” 和 “帖⼦正⽂” 都可以归结到 “帖⼦” 类,做为 “帖⼦” 类的属性;“权限” 可以归结到 “⽤⼾”类,做为“⽤⼾”类的属性。⾄此,针对发布帖⼦这个⽤例,就确定了三个
类,分别是:⽤⼾、版块、帖⼦。
再者就是帖子回复在帖子详情里,站内私信在主页,因此还有帖子回复表和站内私信表。
application.yml配置
spring:
application:
name: 线上论坛 # 项目名
output:
ansi:
enabled: ALWAYS # 控制台输出彩色日志
profiles:
active: dev
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER #Springfox-Swagger兼容性配置
favicon:
enable: false
datasource:
url: jdbc:mysql://127.0.0.1:3306/forum_db?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# JSON序列化配置
jackson:
# date-format: yyyy-MM-dd HH:mm:ss # 日期格式
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: NON_NULL # 不为null时序列化
# 设置 Mybatis 的 xml 保存路径
mybatis:
mapper-locations: classpath:mapper/**/*.xml # 指定 xxxMapper.xml的扫描路径
# mapper-locations: classpath:/resources/mapper/*Mapper.xml
type-aliases-package: com.example.forum.dao
configuration: # 配置打印 MyBatis 执行的 SQL
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true #自动驼峰转换
# 配置打印 MyBatis 执行的 SQL
# 日志配置
logging:
pattern:
dateformat: yyyy-MM-dd HH:mm:ss # 日期格式
level:
root: info # 默认日志级别
com.bitejiuyeke.forum: debug # 指定包的日志级别
file:
path: ./logs # 日志保存目录
server:
port: 58080
# 项目自定义相关配置
forum:
login: # 关于登录的配置项
url: sign-in.html # 未登录状况下强制跳转页面
index: # 关于首页的配置项
board-num: 10 # 首页要显示的版块数量
创建⼯程结构
public enum ResultCode {
/** 定义状态码 */
SUCCESS (0, "操作成功"),
FAILED (1000, "操作失败"),
FAILED_UNAUTHORIZED (1001, "未授权"),
FAILED_PARAMS_VALIDATE (1002, "参数校验失败"),
FAILED_FORBIDDEN (1003, "禁止访问"),
FAILED_CREATE (1004, "新增失败"),
FAILED_NOT_EXISTS (1005, "资源不存在"),
FAILED_USER_EXISTS (1101, "用户已存在"),
FAILED_USER_NOT_EXISTS (1102, "用户不存在"),
FAILED_LOGIN (1103, "用户名或密码错误"),
FAILED_USER_BANNED (1104, "您已被禁言, 请联系管理员, 并重新登录."),
FAILED_TWO_PWD_NOT_SAME (1105, "两次输入的密码不一致"),
// 版块相关的定义
FAILED_BOARD_EXISTS (1201, "版块已存在"),
FAILED_BOARD_NOT_EXISTS (1202, "版块不存在"),
ERROR_SERVICES (2000, "服务器内部错误"),
ERROR_IS_NULL (2001, "IS NULL.");
long code;
String message;
public long getCode() {
return code;
}
public String getMessage() {
return message;
}
ResultCode(long code, String message) {
this.code = code;
this.message = message;
}
@Override
public String toString() {
return "code = " + code + ", message = " + message + ".";
}
}
使用Mybatis-Generator生成
实体类
映射⽂件xxxMapper.xml
Dao类,xxxMapper.java
项⽬中使⽤commons-codec,它是Apache提供的⽤于摘要运算、编码解码的⼯具包。常⻅的编码 解码⼯具Base64、MD5、Hex、SHA1、DES等。
commons-codec
commons-codec
盐生成:
public class UUIDUtils {
/**
* 生成一个标准的36字符的UUID
* @return
*/
public static String UUID_36 () {
return UUID.randomUUID().toString();
}
/**
* 生成一个32字符的UUID
* @return
*/
public static String UUID_32 () {
return UUID.randomUUID().toString().replace("-", "");
}
}
MD5加密:
public class MD5Utils {
/**
* 普通MD5加密
* @param str 原始字符串
* @return 一次MD5加密后的密文
*/
public static String md5 (String str) {
return DigestUtils.md5Hex(str);
}
/**
* 原始字符串与Key组合进行一次MD5加密
* @param str 原始字符串
* @param key
* @return 组合字符串一次MD5加密后的密文
*/
public static String md5 (String str, String key) {
return DigestUtils.md5Hex(str + key);
}
/**
* 原始字符串加密后与扰动字符串组合再进行一次MD5加密
* @param str 原始字符串
* @param salt 扰动字符串
* @return 加密后的密文
*/
public static String md5Salt (String str, String salt) {
return DigestUtils.md5Hex(DigestUtils.md5Hex(str) + salt);
}
/**
* 校验原文与盐加密后是否与传入的密文相同
* @param original 原字符串
* @param salt 扰动字符串
* @param ciphertext 密文
* @return true 相同, false 不同
*/
public static boolean verifyOriginalAndCiphertext (String original, String salt, String ciphertext) {
String md5text = md5Salt(original, salt);
if (md5text.equalsIgnoreCase(ciphertext)) {
return true;
}
return false;
}
}
API常⽤注解 :