在线论坛系统

项目概述

实现了基于 Spring 的前后端分离版本的在线论坛系统,实现了用户登录注册、站内私信,帖⼦列表, 发布帖⼦, 回复帖⼦,点赞帖子,搜索帖子等功能。
项目体验:线上论坛 - 用户登录

技术实现过程

  • 使⽤统⼀返回格式+全局错误信息定义处理前后端交互时的返回结果
  • 使⽤@ControllerAdvice+@ExceptionHandler实现全局异常处理
  • 使⽤拦截器实现⽤⼾登录校验
  • 使⽤MybatisGeneratorConfig⽣成常的增删改查⽅法
  • 集成Swagger实现⾃动⽣成API测试接⼝
  • 使⽤jQuery完成AJAX请求,并处理HTML⻚⾯标签

相关技术及⼯具

  • 服务器端技术 :Spring 、Spring Boot 、Spring MVC 、MyBatis
  • 浏览器端技术 :HTML, CSS, JavaScript 、jQuery 、Bootstrap
  • 数据库 :MySQL
  • 项⽬构建⼯具 :Maven
  • 版本控制⼯具 :Git + GITEE

核心功能

  • 登录注册
  • 帖⼦按版块分类,对帖子热度进行排行,按关键字搜索帖子
  • 帖⼦列表, 发布帖⼦, 删除帖⼦, 回复帖⼦,点赞帖子等功能
  • 站内私信其他用户,个⼈主⻚的展⽰,个人信息密码编辑,密码修改

技术实现过程

  • 使⽤统⼀返回格式+全局错误信息定义处理前后端交互时的返回结果
  • 使⽤@ControllerAdvice+@ExceptionHandler实现全局异常处理
  • 使⽤拦截器实现⽤⼾登录校验
  • 使用MD5加盐加密实现密码加密,保护用户账号安全性
  • 使⽤MybatisGeneratorConfig⽣成常的增删改查⽅法
  • 集成Swagger实现⾃动⽣成API测试接⼝
  • 使⽤jQuery完成AJAX请求,并处理HTML⻚⾯标签

数据库设计

经过简单分析:“版块类别” 和 “版块帖⼦数量” 都可以归结到 “版块” 类,做为 “版块” 类的属性;“帖⼦标题” 和 “帖⼦正⽂” 都可以归结到 “帖⼦” 类,做为 “帖⼦” 类的属性;“权限” 可以归结到 “⽤⼾”类,做为“⽤⼾”类的属性。⾄此,针对发布帖⼦这个⽤例,就确定了三个
类,分别是:⽤⼾、版块、帖⼦。
再者就是帖子回复在帖子详情里,站内私信在主页,因此还有帖子回复表和站内私信表。

项目搭建与软件开发

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 # 首页要显示的版块数量

公共部分

创建⼯程结构

  • ⼯具层(common) => 统⼀返回类, 定义状态码
  • 配置层(config) => session,Mybatis,Swagger配置
  • 控制器层(controller) => 提供URL映射,⽤来接收参数并做校验,调⽤Service中的业务代码,返回执⾏结果
  • 持久层(dao) => 数据库访问
  • 异常捕获(exception) => 统⼀异常处理
  • 拦截(interceptor) => 登录拦截器
  • 实体层(model) => 实体类
  • 服务层(service) => 业务处理相关的接⼝与实现,所有业务都在Services中实现
  • 工具类(utils) => MD5+盐加密
  • resources/mapper => Mybaits映射⽂件,配置数据库实体与类之间的映射关系
  • resources/static => 前端资源
  • resources/mybatis => 前端资源

在线论坛系统_第1张图片

定义状态码

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常⽤注解 :

  •  @Api: 作⽤在Controller上,对控制器类的说明
  •  tags=“说明该类的作⽤,可以在前台界⾯上看到的注解”
  •  @ApiModel: 作⽤在响应的类上,对返回响应数据的说明
  •  @ApiModelProerty:作⽤在类的属性上,对属性的说明
  •  @ApiOperation: 作⽤在具体⽅法上,对API接⼝的说明
  •  @ApiParam: 作⽤在⽅法中的每⼀个参数上,对参数的属性进⾏说明

项目具体实现过程,后续还在完善中。。。。。。

你可能感兴趣的:(java)