2.线上论坛项目
一、项目介绍
线上论坛
- 相关技术:SpringBoot+SpringMvc+Mybatis+Mysql+Swagger
- 项目简介:本项目是一个功能丰富的线上论坛,用户可编辑、发布、删除帖子,并评论、点赞。帖子按版块分类,方便查找。同时,用户可以修改和展示个人信息,还能发送私信与其他用户交流。
- 项目描述:
- 采用前后端分离架构,通过JSON格式传输数据,基于SpringBoot和Mybatis框架构建。
- 设计统一的数据返回格式,全局处理错误信息,提升用户体验。
- 利用@ControllerAdvice和@ExceptionHandler实现全局异常处理,确保系统稳定性。
- 使用HandlerInterceptor拦截器实现用户登录校验,并采用MD5算法对密码进行加密存储。
- 集成Swagger自动生成API测试接口,方便开发者进行测试和调试。
- 利用Mybatis Generator自动生成常用的增删改查方法,提高开发效率。
二、项目实现效果
部分页面展示:
帖子页面(首页显示所有帖子,切换版块则显示对应帖子):
用户个人信息展示页面(包含用户发布的帖子):
个人信息修改页面:
帖子详情页面(下方为评论):
用户之间私信:
部分功能说明:
页面上方 :帖子搜索功能并未实现,月亮按钮为可切换夜间模式,铃铛按钮为用户私信功能。
个人中心:其中头像修改功能并未实现。
三、项目具体实现
1.软件生命周期
一个软件的生命周期可以划分为
- 可行性研究
- 需求分析
- 概要设计
- 详细设计
- 编码实现
- 测试
- 使用及维护
- 退役
2.项目需求分析
- 用户 注册(设置用户名,昵称,密码,且需要同意隐私条款才可注册)、登录、退出登录 的功能。
- 个人中心可修改个人信息(包括 昵称,邮箱地址,电话号码,个人简介)和修改密码(需确认原密码)。
- 用户信息页:显示用户信息(昵称,发帖数,邮箱,注册时间,个人简介)及该用户发布的帖子(各个帖子显示其 标题 ,作者 ,发布时间,阅读量,点赞数,评论数),帖子按发布时间倒序排列,用户访问其他用户主页时可发送私信。
- 帖子列表页:首页显示所有帖子(各个帖子显示其 标题 ,作者 ,发布时间,阅读量,点赞数,评论数),切换版块则显示对应版块帖子,并且统计该版块下所有帖子数量,帖子按发布时间倒序排列。
- 查看全文:显示帖子信息(标题,正文,作者,发布时间,阅读量,点赞数,评论数),并且可点赞,评论帖子(下方评论按时间倒序排列),以及给作者发私信,若查看本人帖子,则还有修改,删除帖子功能。
- 添加,修改,删除帖子功能(除了标题,正文外,还要选择帖子版块)。
- 私信功能:显示信息状态(未读,已读,已回复),且无法给自己发送私信。
- 评论,点赞帖子功能。
- 页面可切换为白天,夜间显示。
- 用户权限限制:访问所有页面均要登录(未登录无法访问,强制跳转至登录页面)。
3.设计
设计数据库存储 用户,帖子,帖子评论,用户私信,帖子版块 信息。
其中用户信息表结构:
4.编码实现
4.1项目构建及相关配置
基于SpringBoot和Mybatis框架构建项目,及MySQL,MyBatis等相关配置...
4.2创建实体类(依据数据库中表结构)
例如:
@Data
public class User {private Long id;private String username;@JsonIgnore //不参与Json序列化private String password;private String nickname;private String phoneNum;private String email;private Byte gender;@JsonIgnore //不参与Json序列化private String salt;@JsonInclude(JsonInclude.Include.ALWAYS) // 不论任何情况都参与JSON序列化private String avatarUrl;private Integer articleCount;private Byte isAdmin;private String remark;private Byte state;@JsonIgnore //不参与Json序列化private Byte deleteState;private Date createTime;private Date updateTime;}
4.3数据库持久层(涉及到增删改查)
例如:
@Mapper
public interface ArticleMapper {int insert(Article row);int insertSelective(Article row);Article selectByPrimaryKey(Long id);int updateByPrimaryKeySelective(Article row);int updateByPrimaryKeyWithBLOBs(Article row);int updateByPrimaryKey(Article row);/*** 显示首页列表* @return*/List<Article> selectAll ();/*** 显示版块列表* @param boardId* @return*/List<Article> selectAllByBoardId(Long boardId);/*** 帖子详情* @param id* @return*/Article selectDetailById(Long id);/*** 根据用户id查询对应用户帖子列表* @param userId* @return*/List<Article> selectByUserId (Long userId);}
4.4统一前后端数据交互对象
/*** Created with IntelliJ IDEA.* Description:统一的前后端交互对象* User: 林* Date: 2024-02-29* Time: 19:39*/
public class AppResult<T> {@JsonInclude(JsonInclude.Include.ALWAYS) // 不论任何情况都参与JSON序列化private long code;@JsonInclude(JsonInclude.Include.ALWAYS) // 不论任何情况都参与JSON序列化private String message;@JsonInclude(JsonInclude.Include.ALWAYS) // 不论任何情况都参与JSON序列化private T data;//泛型public AppResult(long code, String message, T data) {this.code = code;this.message = message;this.data = data;}public AppResult(long code, String message) {this(code,message,null);}public long getCode() {return code;}public void setCode(long code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}//提供一些常用的静态方法/*** 成功*///不需要返回数据public static AppResult success(){return new AppResult(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMessage());}//不需要返回数据,自定义描述信息public static AppResult success(String message){return new AppResult(ResultCode.SUCCESS.getCode(),message);}//有数据public static <T> AppResult<T> success(T data){return new AppResult(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMessage(),data);}//有数据,自定义描述信息public static <T> AppResult<T> success(String message,T data){return new AppResult(ResultCode.SUCCESS.getCode(),message,data);}/*** 失败*/public static AppResult failed(){return new AppResult(ResultCode.FAILED.getCode(),ResultCode.FAILED.getMessage());}//自定义描述信息public static AppResult failed(String message){return new AppResult(ResultCode.FAILED.getCode(),message);}//直接接收一个状态码对象,因为失败原因有多个public static AppResult failed(ResultCode resultCode){return new AppResult(resultCode.getCode(),resultCode.getMessage());}
}
4.5全局统一异常处理
使用@ControllerAdvice配和@ExceptionHandler实现全局异常处理:
/*** Created with IntelliJ IDEA.* Description:全局统一异常处理* User: 林* Date: 2024-03-01* Time: 15:57*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {//处理自定义的异常@ResponseBody@ExceptionHandler(ApplicationException.class)public AppResult applicationExceptionHandler (ApplicationException e) {// 打印异常信息e.printStackTrace(); // 上生产之前要删除,生产环境使用日志记录的// 打印日志log.error(e.getMessage());if (e.getErrorResult() != null) {return e.getErrorResult();}// 非空校验if (e.getMessage() == null || e.getMessage().equals("")) {return AppResult.failed(ResultCode.ERROR_SERVICES);}// 返回具体的异常信息return AppResult.failed(e.getMessage());}//处理非自定义的异常@ResponseBody@ExceptionHandler(Exception.class)public AppResult exceptionHandler (Exception e) {// 打印异常信息e.printStackTrace();// 打印日志log.error(e.getMessage());// 非空校验if (e.getMessage() == null || e.getMessage().equals("")) {return AppResult.failed(ResultCode.ERROR_SERVICES);}// 返回异常信息return AppResult.failed(e.getMessage());}
}
4.6注册、登录、退出登录
利用MD5对密码进行加密存储:
public class MD5Util {/*** 对字符串进行MD5加密* @param str 明文* @return 密文*/public static String md5 (String str) {return DigestUtils.md5Hex(str);}/*** 对用户密码进行加密* @param str 密码明文* @param salt 扰动字符,盐值* @return 密文*/public static String md5Salt (String str, String salt) {return md5(md5(str) + salt);//将原密码加密,拼上盐值,再一起加密成密文}
}
4.7修改个人信息
先查询到之前的用户信息,再修改(修改密码则要还检验原密码)。
4.8用户主页信息
查询操作:根据用户id查询用户信息和用户所发布的帖子(按发布时间倒序排列)。
4.9帖子列表
查询操作:首页查询所有帖子,切换版块则查询对应版块帖子(按发布时间倒序排列)。
4.10查看全文
查询加修改操作:查询帖子,更新阅读量+1。
4.11添加、修改、删除帖子
增加,修改,删除操作:这些操作声明为事务
/*** 创建帖子* @param article*/@Transactional//事务void create (Article article);
4.12私信功能
发送,回复私信:增加操作。
信息查看和信息状态更新(涉及到查询,修改操作):用户点开私信列表(查询所有收到的私信),有新的消息,则该消息此时状态为未读。点开该消息(查询该消息详情),则状态为已读(修改操作,修改消息状态)。回复该消息,则该消息状态为已回复(修改操作,修改消息状态)。
public interface IMessageService {/*** 创建一个私信,用于发送给其他用户* @param message*/void create (Message message);/*** 根据用户id统计未读的信息* @param receiveUserId* @return*/Integer selectUnreadCount(Long receiveUserId);/*** 据id查询用户接收的私信列表,包括发送者信息和私信内容* @param receiveUserId* @return*/List<Message> selectByReceiveUserId (Long receiveUserId);/*** 根据id更新私信状态* @param id* @param state*/void updateStateById(Long id, Byte state);/*** 根据id查找私信* @param id* @return*/Message selectById(Long id);/*** 回复私信* @param repliedId* @param message*/@Transactionalvoid reply (Long repliedId, Message message);
}
4.13评论,点赞帖子
评论帖子:增加操作...
点赞帖子:修改操作,+1.
4.14白天,夜间效果
前端实现...
4.15用户权限限制
使用HandlerInterceptor拦截器实现用户登录校验:
/*** Created with IntelliJ IDEA.* Description:登录拦截器* User: 林* Date: 2024-03-05* Time: 22:13*/
@Component
public class LoginInterceptor implements HandlerInterceptor {@Value("${lin-forum.login.url}")private String defaultURL;//对拦截的内容做前置处理@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取sessionHttpSession session=request.getSession(false);//判断sessionif(session!=null && session.getAttribute(USER_SESSION)!=null){//用户已经登录return true;}//还未登录,重定向到登录页面//校验url地址是否以/开头if(!defaultURL.startsWith("/")){defaultURL="/"+defaultURL;}response.sendRedirect(defaultURL);return false;}
}
四、项目代码(gitee地址)
forum · new林/项目 - 码云 - 开源中国 (gitee.com)
(服务器过期了,没部署...)
相关文章:

2.线上论坛项目
一、项目介绍 线上论坛 相关技术:SpringBootSpringMvcMybatisMysqlSwagger项目简介:本项目是一个功能丰富的线上论坛,用户可编辑、发布、删除帖子,并评论、点赞。帖子按版块分类,方便查找。同时,用户可以…...
Java面试题:讨论synchronized关键字和java.util.concurrent包中的同步工具,如Lock和Semaphore
在 Java 中,synchronized 关键字和 java.util.concurrent 包中的同步工具都是用来控制多线程环境下的并发访问,以防止数据竞争和确保线程安全。下面是对 synchronized 关键字和 java.util.concurrent 包中的一些同步工具的讨论,包括它们的特点…...
酱香型白酒派系介绍
酱香型白酒作为中国传统白酒的重要流派,以其独特的酱香和复杂的酿造工艺而著称。在酱香型白酒中,形成了多个派系,各具特色。 以下是关于北派、茅派、川派和黔派等各个派系的详细介绍。 一、北派 地理位置:主要产于秦岭和淮河以…...
编译chamfer3D报错
python setup.py install编译chamfer3D报错 出现nvcc fatal : Unsupported gpu architecture ‘compute_86‘的问题,是因为显卡与cuda版本支持的算力不匹配。 nvcc fatal : Unsupported gpu architecture ‘compute_86’ ninja: build stopped: subcommand failed. …...
BuildConfig类找不到,BuildConfig.java类不在编译加载路径问题解决
今天用buildConfigField设置编译时常量遇到了问题,访问不到BuildConfig类,import导包也找不到类,具体设置如下: defaultConfig {applicationId com.sample.abcminSdk 28targetSdk 33versionCode getVerInt()//1versionName getVer…...

海外版coze前端代码助手
定位 解决前端同事的开发问题 参数配置 测试 支持 最屌的大模型及语音播报。 体验地址 海外版前端代码助手 需要魔法才能体验油...

python pyautogui实现图片识别点击失败后重试
安装库 pip install Pillow pip install opencv-python confidence作用 confidence 参数是用于指定图像匹配的信度(或置信度)的,它表示图像匹配的准确程度。这个参数的值在 0 到 1 之间,数值越高表示匹配的要求越严格。 具体来…...

怎么看电脑实时充电功率
因为我想测试不同的充电器给电脑充电的速度,所以就想找一款软件可以看电脑当前充电功率的软件,我给一个图 直接搜索就可以下载了,charge rate就是功率,这里是毫瓦,换算单位是 1000mw1w 所以我这里充电功率是65w&…...
Qt 实战(4)信号与槽 | 4.2、自定义信号与槽
文章目录 一、自定义信号与槽1、自定义信号2、自定义槽3、连接信号与槽4、总结 前言: 在Qt框架中,信号(signals)和槽(slots)机制是对象间通信的核心。这种机制允许对象在特定事件发生时发出信号,…...

Android开发系列(六)Jetpack Compose之Box
Box是一个用来组合和控制子元素布局的组件。它可以在一个矩形区域内排列一个或多个子元素,并根据所提供的参数来控制它们的位置、大小和样式。 Box的功能类似传统的FrameLayout。 下面通过示例了解Box的使用方法,首先看一个最简单的示例,如下…...

51单片机STC89C52RC——4.1 独立按键(数码管显示按键值)
目录 目录 目的 一,STC单片机模块 二,矩阵按键模块 2.1 针脚定义 编辑 2.2 矩阵按键位置 2.3 如何理解按键按下后针脚的高低电平 2.3.1 错误理解1 2.3.2 错误理解2 2.3.3 正确判定按下的是那个按键的逻辑 2.3.4 判定按键按下的依次扫描程…...

解决双击bootstrap.bat没有生成b2.exe文件
双击bootstrap.bat但是并没有没有生成b2.exe文件,会报如下错误: "cl" 不是内部或外部命令,也不是可运行的程序 或批处理文件。D:\cppsoft\boost_1_85_0\tools\build\src\engine>dir *.exe 驱动器 D 中的卷是 Data 卷的序列号是…...

AI穿戴设备是未来手机的终结者?中国AI商业化的未来预测
AI技术的发展正处于商业化应用的关键阶段,而中国在互联网时代已凭借商业化应用逆袭。AI算法大模型虽强大,但真正普惠民众需与设备深度结合。穿戴式智能设备就成为了新战场,AI算法与穿戴设备结合能释放更大工作效率。私人助理AI将成趋势&#…...

FPGA+Nvidia Orin NX+AI 异构视频图像处理开发平台在高端医疗和工业检测的应用,支持定制,支持国产化
FPGAGPU 异构架构视频图像处理开发平台,它结合了 AMD Zynq UltraScale MPSoC(FPGA)与 NVIDIA Jetson Orin NX(GPU)的强大功能,能够应用于对图像精准度和实时性有着严苛要求的行业领域。 Zynq UltraScale MP…...

2000-2023年各省名义GDP、实际GDP、GDP平减指数数据(含原始数据+计算过程+计算结果)(以2000年为基期)
2000-2023年各省名义GDP、实际GDP、GDP平减指数数据(含原始数据计算过程计算结果)(以2000年为基期) 1、时间:2000-2023年 2、范围:31省 3、指标:名义GDP、国内生产总值指数、实际GDP、GDP平减…...
python学习—字典(Dictionary)
系列文章目录 python学习—列表和元组 python学习—循环语句-控制流 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停,游戏抽签抽奖 python学习—合并多个Ex…...

鸿蒙开发:【组件启动规则(FA模型)】
组件启动规则(FA模型) 启动组件是指一切启动或连接应用组件的行为: 启动PageAbility、ServiceAbility,如使用startAbility()等相关接口。连接ServiceAbility、DataAbility,如使用connectAbility()、acquireDataAbili…...

网络编程5----初识http
1.1 请求和响应的格式 http协议和前边学过的传输层、网络层协议不同,它是“一问一答”形式的,所以要分为请求和响应两部分看待,同时,请求和响应的格式是不同的,我们来具体介绍一下。 1.1.1 请求 在介绍请求之前&…...

“用友审批+民生付款”,YonSuite让企业发薪更准时
随着现代企业经营模式的不断创新和市场竞争的加剧,企业薪资管理和发放的效率、准确性和及时性已成为企业管理的重要一环。然而,在实际操作中,许多企业面临着薪资管理复杂、发放流程繁琐、数据不准确等难点和痛点。为了解决这些问题࿰…...

EtherCAT扫盲,都是知识点
1. 什么是EtherCAT EtherCAT,全称Ethernet for Control Automation Technology,字面意思就是用于控制自动化技术的以太网。它是一种基于以太网的实时工业通信协议,简单说,就是让机器们通过网线互相聊天的高级方式。 EtherCAT 是最…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...