• 在线论坛系统


    项目概述

    实现了基于 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⻚⾯标签

    数据库设计

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

    项目搭建与软件开发

    1. application.yml配置
    2. spring:
    3.   application:
    4.     name: 线上论坛 # 项目名
    5.   output:
    6.     ansi:
    7.       enabled: ALWAYS # 控制台输出彩色日志
    8.   profiles:
    9.     active: dev
    10.   mvc:
    11.     pathmatch:
    12.       matching-strategy: ANT_PATH_MATCHER #Springfox-Swagger兼容性配置
    13.     favicon:
    14.       enable: false
    15.   datasource:
    16.     url: jdbc:mysql://127.0.0.1:3306/forum_db?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
    17.     username: root
    18.     password: 123456
    19.     driver-class-name: com.mysql.cj.jdbc.Driver
    20.     # JSON序列化配置
    21.     jackson:
    22. #      date-format: yyyy-MM-dd HH:mm:ss # 日期格式
    23.       date-format: yyyy-MM-dd HH:mm:ss
    24.       time-zone: GMT+8
    25.       default-property-inclusion: NON_NULL # 不为null时序列化
    26. # 设置 Mybatis 的 xml 保存路径
    27. mybatis:
    28.   mapper-locations: classpath:mapper/**/*.xml # 指定 xxxMapper.xml的扫描路径
    29. #  mapper-locations: classpath:/resources/mapper/*Mapper.xml
    30.   type-aliases-package: com.example.forum.dao
    31.   configuration: # 配置打印 MyBatis 执行的 SQL
    32.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    33.     map-underscore-to-camel-case: true  #自动驼峰转换
    34. # 配置打印 MyBatis 执行的 SQL
    35. # 日志配置
    36. logging:
    37.   pattern:
    38.     dateformat: yyyy-MM-dd HH:mm:ss # 日期格式
    39.   level:
    40.     root: info # 默认日志级别
    41.     com.bitejiuyeke.forum: debug # 指定包的日志级别
    42.   file:
    43.     path: ./logs # 日志保存目录
    44. server:
    45.   port: 58080
    46. # 项目自定义相关配置
    47. forum:
    48.   login: # 关于登录的配置项
    49.     url: sign-in.html  # 未登录状况下强制跳转页面
    50.   index: # 关于首页的配置项
    51.     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 => 前端资源

    1692065823387.png

    定义状态码

    1. public enum ResultCode {
    2.     /** 定义状态码 */
    3.     SUCCESS                 (0, "操作成功"),
    4.     FAILED                  (1000, "操作失败"),
    5.     FAILED_UNAUTHORIZED     (1001, "未授权"),
    6.     FAILED_PARAMS_VALIDATE  (1002, "参数校验失败"),
    7.     FAILED_FORBIDDEN        (1003, "禁止访问"),
    8.     FAILED_CREATE           (1004, "新增失败"),
    9.     FAILED_NOT_EXISTS       (1005, "资源不存在"),
    10.     FAILED_USER_EXISTS      (1101, "用户已存在"),
    11.     FAILED_USER_NOT_EXISTS  (1102, "用户不存在"),
    12.     FAILED_LOGIN            (1103, "用户名或密码错误"),
    13.     FAILED_USER_BANNED      (1104, "您已被禁言, 请联系管理员, 并重新登录."),
    14.     FAILED_TWO_PWD_NOT_SAME (1105, "两次输入的密码不一致"),
    15.     // 版块相关的定义
    16.     FAILED_BOARD_EXISTS      (1201, "版块已存在"),
    17.     FAILED_BOARD_NOT_EXISTS  (1202, "版块不存在"),
    18.     ERROR_SERVICES          (2000, "服务器内部错误"),
    19.     ERROR_IS_NULL           (2001, "IS NULL.");
    20.  
    21.     long code;
    22.     String message;
    23.     public long getCode() {
    24.         return code;
    25.     }
    26.     public String getMessage() {
    27.         return message;
    28.     }
    29.     ResultCode(long code, String message) {
    30.         this.code = code;
    31.         this.message = message;
    32.     }
    33.     @Override
    34.     public String toString() {
    35.         return "code = " + code + ", message = " + message + ".";
    36.     }
    37. }

    关于数据库的操作

    使用Mybatis-Generator生成

    实体类
    映射⽂件xxxMapper.xml
    Dao类,xxxMapper.java

    加盐加密

    项⽬中使⽤commons-codec,它是Apache提供的⽤于摘要运算、编码解码的⼯具包。常⻅的编码 解码⼯具Base64、MD5、Hex、SHA1、DES等。

    1.  commons-codec
    2.  commons-codec

    盐生成:

    1. public class UUIDUtils {
    2.     /**
    3. * 生成一个标准的36字符的UUID
    4. * @return
    5. */
    6.     public static String UUID_36 () {
    7.         return UUID.randomUUID().toString();
    8.     }
    9.     /**
    10. * 生成一个32字符的UUID
    11. * @return
    12. */
    13.     public static String UUID_32 () {
    14.         return UUID.randomUUID().toString().replace("-", "");
    15.     }
    16. }

    MD5加密:

    1. public class MD5Utils {
    2.     /**
    3.      * 普通MD5加密
    4.      * @param str 原始字符串
    5.      * @return 一次MD5加密后的密文
    6.      */
    7.     public static String md5 (String str) {
    8.         return DigestUtils.md5Hex(str);
    9.     }
    10.     /**
    11.      * 原始字符串与Key组合进行一次MD5加密
    12.      * @param str 原始字符串
    13.      * @param key
    14.      * @return 组合字符串一次MD5加密后的密文
    15.      */
    16.     public static String md5 (String str, String key) {
    17.         return DigestUtils.md5Hex(str + key);
    18.     }
    19.     /**
    20.      * 原始字符串加密后与扰动字符串组合再进行一次MD5加密
    21.      * @param str 原始字符串
    22.      * @param salt 扰动字符串
    23.      * @return 加密后的密文
    24.      */
    25.     public static String md5Salt (String str, String salt) {
    26.         return DigestUtils.md5Hex(DigestUtils.md5Hex(str) + salt);
    27.     }
    28.     /**
    29.      * 校验原文与盐加密后是否与传入的密文相同
    30.      * @param original 原字符串
    31.      * @param salt 扰动字符串
    32.      * @param ciphertext 密文
    33.      * @return true 相同, false 不同
    34.      */
    35.     public static boolean verifyOriginalAndCiphertext (String original, String salt, String ciphertext) {
    36.         String md5text = md5Salt(original, salt);
    37.         if (md5text.equalsIgnoreCase(ciphertext)) {
    38.             return true;
    39.         }
    40.         return false;
    41.     }
    42. }

    API常⽤注解 :

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

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

  • 相关阅读:
    Android:UI:Drawable:View/ImageView与Drawable
    Web安全研究(五)
    scanf导致程序运行时出现stack smashing
    SQL的 ISNULL 函数
    【数据结构】队列
    阿里云国际版无法连接和访问Windows服务器中的FTP服务
    亚马逊的卫星发射升空,它和“星链”在讲什么故事?
    关于建筑八大员(住建厅七大员)考试难不难?合格技巧
    小白系统初始化配置资源失败怎么办
    Linux下的基本指令(1)
  • 原文地址:https://blog.csdn.net/weixin_56952690/article/details/132536696