package top.picacho.bbs.controller.rest;
import org.springframework.stereotype.Controller;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import top.picacho.bbs.common.Constants;
import top.picacho.bbs.common.ServiceResultEnum;
import top.picacho.bbs.entity.BBSPost;
import top.picacho.bbs.entity.BBSPostCategory;
import top.picacho.bbs.entity.BBSUser;
import top.picacho.bbs.service.BBSPostCategoryService;
import top.picacho.bbs.service.BBSPostCommentService;
import top.picacho.bbs.service.BBSPostService;
import top.picacho.bbs.service.BBSUserService;
import top.picacho.bbs.util.PageResult;
import top.picacho.bbs.util.Result;
import top.picacho.bbs.util.ResultGenerator;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;
@Controller
public class BBSPostController {
@Resource
private BBSPostCategoryService bbsPostCategoryService;
@Resource
private BBSPostService bbsPostService;
@Resource
private BBSUserService bbsUserService;
@Resource
private BBSPostCommentService bbsPostCommentService;
/**
* 跳转至发帖页面
* @param request
* @return
*/
@GetMapping("/addPostPage")
public String addPostPage(HttpServletRequest request) {
List<BBSPostCategory> bbsPostCategories = bbsPostCategoryService.getBBSPostCategories();
if (CollectionUtils.isEmpty(bbsPostCategories)) {
return "error/error_404";
}
//将分类数据封装到request域中
request.setAttribute("bbsPostCategories", bbsPostCategories);
return "jie/add";
}
/**
* 添加一条帖子数据
*/
@PostMapping("/addPost")
@ResponseBody
public Result addPost(@RequestParam("postTitle") String postTitle,
@RequestParam("postCategoryId") Integer postCategoryId,
@RequestParam("postContent") String postContent,
@RequestParam("verifyCode") String verifyCode,
HttpSession httpSession) {
if (!StringUtils.hasLength(postTitle)) {
return ResultGenerator.genFailResult("postTitle参数错误");
}
if (null == postCategoryId || postCategoryId < 0) {
return ResultGenerator.genFailResult("postCategoryId参数错误");
}
BBSPostCategory bbsPostCategory = bbsPostCategoryService.selectById(postCategoryId);
if (null == bbsPostCategory) {
return ResultGenerator.genFailResult("postCategoryId参数错误");
}
if (!StringUtils.hasLength(postContent)) {
return ResultGenerator.genFailResult("postContent参数错误");
}
if (postTitle.trim().length() > 32) {
return ResultGenerator.genFailResult("标题过长");
}
if (postContent.trim().length() > 100000) {
return ResultGenerator.genFailResult("内容过长");
}
String kaptchaCode = httpSession.getAttribute(Constants.VERIFY_CODE_KEY) + "";
if (!StringUtils.hasLength(kaptchaCode) || !verifyCode.equals(kaptchaCode)) {
return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_VERIFY_CODE_ERROR.getResult());
}
BBSUser bbsUser = (BBSUser) httpSession.getAttribute(Constants.USER_SESSION_KEY);
BBSPost bbsPost = new BBSPost();
bbsPost.setPublishUserId(bbsUser.getUserId());
bbsPost.setPostTitle(postTitle);
bbsPost.setPostContent(postContent);
bbsPost.setPostCategoryId(postCategoryId);
bbsPost.setPostCategoryName(bbsPostCategory.getCategoryName());
if (bbsPostService.savePost(bbsPost) > 0) {
httpSession.removeAttribute(Constants.VERIFY_CODE_KEY);//清空session中的验证码信息
return ResultGenerator.genSuccessResult();
} else {
return ResultGenerator.genFailResult("请求失败,请检查参数及账号是否有操作权限");
}
}
/**
* 跳转帖子详情页
* @param request
* @param postId
* @param commentPage
* @return
*/
@GetMapping("detail/{postId}")
public String postDetail(HttpServletRequest request, @PathVariable(value = "postId") Long postId,
@RequestParam(value = "commentPage", required = false, defaultValue = "1") Integer commentPage) {
List<BBSPostCategory> bbsPostCategories = bbsPostCategoryService.getBBSPostCategories();
if (CollectionUtils.isEmpty(bbsPostCategories)) {
return "error/error_404";
}
//将分类数据封装到request域中
request.setAttribute("bbsPostCategories", bbsPostCategories);
// 帖子内容
BBSPost bbsPost = bbsPostService.getBBSPostForDetail(postId);
if (bbsPost == null) {
return "error/error_404";
}
request.setAttribute("bbsPost", bbsPost);
// 发帖用户信息
BBSUser bbsUser = bbsUserService.getUserById(bbsPost.getPublishUserId());
if (bbsUser == null) {
return "error/error_404";
}
request.setAttribute("bbsUser", bbsUser);
// todo 是否收藏了本贴
// 本周热议的帖子
request.setAttribute("hotTopicBBSPostList", bbsPostService.getHotTopicBBSPostList());
// todo 评论数据
PageResult commentsPage = bbsPostCommentService.getCommentsByPostId(postId, commentPage);
request.setAttribute("commentsPage", commentsPage);
return "jie/detail";
}
/**
* 跳转至编辑页
* @param request
* @param postId
* @return
*/
@GetMapping("editPostPage/{postId}")
public String editPostPage(HttpServletRequest request, @PathVariable(value = "postId") Long postId) {
BBSUser bbsUser = (BBSUser) request.getSession().getAttribute(Constants.USER_SESSION_KEY);
List<BBSPostCategory> bbsPostCategories = bbsPostCategoryService.getBBSPostCategories();
if (CollectionUtils.isEmpty(bbsPostCategories)) {
return "error/error_404";
}
//将分类数据封装到request域中
request.setAttribute("bbsPostCategories", bbsPostCategories);
if (null == postId || postId < 0) {
return "error/error_404";
}
BBSPost bbsPost = bbsPostService.getBBSPostById(postId);
if (bbsPost == null) {
return "error/error_404";
}
if (!bbsUser.getUserId().equals(bbsPost.getPublishUserId())) {
request.setAttribute("message", "非本人发帖,无权限修改");
return "error/error";
}
request.setAttribute("bbsPost", bbsPost);
request.setAttribute("postId", postId);
return "jie/edit";
}
/**
* 修改帖子
* @param postId
* @param postTitle
* @param postCategoryId
* @param postContent
* @param verifyCode
* @param httpSession
* @return
*/
@PostMapping("/editPost")
@ResponseBody
public Result editPost(@RequestParam("postId") Long postId,
@RequestParam("postTitle") String postTitle,
@RequestParam("postCategoryId") Integer postCategoryId,
@RequestParam("postContent") String postContent,
@RequestParam("verifyCode") String verifyCode,
HttpSession httpSession) {
BBSUser bbsUser = (BBSUser) httpSession.getAttribute(Constants.USER_SESSION_KEY);
if (null == postId || postId < 0) {
return ResultGenerator.genFailResult("postId参数错误");
}
BBSPost temp = bbsPostService.getBBSPostById(postId);
if (temp == null) {
return ResultGenerator.genFailResult("po
Spring Boot项目学习13之帖子评论模块
需积分: 0 87 浏览量
更新于2022-08-13
收藏 3.23MB ZIP 举报
在本篇中,我们将深入探讨如何在Spring Boot项目中实现一个帖子评论模块。Spring Boot以其简洁的配置和强大的功能,已经成为Java开发Web应用的首选框架。在这个教程中,我们将利用Spring Boot的特性来构建一个完整的帖子评论系统,涵盖前端交互、数据库操作以及RESTful API设计。
我们需要创建一个新的Spring Boot项目,名为`bbs-springboot`。这可以通过Spring Initializr在线生成,或者使用IDE如IntelliJ IDEA或Eclipse的Spring Boot插件快速搭建。在项目中,我们需要引入以下关键依赖:
1. `spring-boot-starter-data-jpa`:用于集成JPA(Java Persistence API),提供对数据库操作的支持。
2. `spring-boot-starter-web`:包含Spring MVC和Tomcat,用于构建Web应用。
3. `spring-boot-devtools`:开发者工具,提供热部署和实时代码刷新功能。
4. 数据库驱动,例如`mysql-connector-java`,如果选择MySQL作为数据库。
接下来,我们需要定义数据模型。创建两个主要的实体类:`Post`和`Comment`。`Post`类代表论坛中的帖子,包含标题、内容等字段;`Comment`类表示帖子下的评论,包括评论内容、作者、发表时间等,并通过`@ManyToOne`注解与`Post`建立关联关系。
接着,我们创建对应的Repository接口,继承JpaRepository,以利用Spring Data JPA提供的CRUD操作。这些接口允许我们执行基本的数据库查询,例如查找特定帖子的所有评论。
为了处理用户交互,我们需要创建Controller。在`PostController`中,我们可以定义处理帖子相关请求的端点,如创建、查看、更新和删除帖子。同时,还需要一个`CommentController`来处理评论的增删查改操作。这两个控制器都应遵循RESTful设计原则,使用HTTP动词如GET、POST、PUT和DELETE。
前后端交互通常通过JSON进行,因此我们需要在实体类上使用`@Entity`、`@Table`、`@Id`等注解,并在属性上使用`@JsonProperty`来指定序列化和反序列化的字段名称。对于日期字段,可以使用`@DateTimeFormat`和`@JsonFormat`进行格式化。
在项目中,我们还需要配置数据库连接。在`application.properties`或`application.yml`文件中,添加数据库的相关配置,如URL、用户名和密码。
前端部分,我们可以选择Thymeleaf、Mustache或其他模板引擎,或者使用现代前端框架如React、Vue.js。如果选择后者,可以利用Spring Boot的Actuator端点暴露API,前端通过AJAX调用这些API进行数据交互。
测试是确保代码质量的重要环节。使用JUnit和Mockito编写单元测试,验证控制器、服务和repository层的功能是否正常工作。对于端点,可以使用Spring Boot的`@WebMvcTest`和`MockMvc`进行整合测试。
部署应用程序。Spring Boot支持多种方式部署,如内嵌的Tomcat服务器、独立的WAR包、Docker容器等。根据实际需求选择合适的部署策略。
构建一个Spring Boot帖子评论模块涉及了数据库设计、RESTful API设计、前端交互等多个方面,需要理解并运用Spring Boot的核心特性和最佳实践。通过这个过程,你将深入理解Spring Boot如何简化Web应用的开发,并提升你的Java Web开发技能。
picacho_pkq
- 粉丝: 83
- 资源: 40
最新资源
- 西门子siemens plc程序博途V16 V15.1,CPU1214c ,正负压物料混合输送条统,称重仪表485通讯数据读取,模拟量转处理,昆仑通态触摸屏画面
- ESP-SparkBot: ESP32-S3 大模型 AI 桌面机器人(复刻分享)
- 锂电池SOC估计模型SOC估算卡尔曼滤波估算SOC 各大交流论坛搜集的模型合集 图中的12个模型都有 可以直接运行
- (免费资源)RuleApi 规则之树 社区 前后端文件
- 关键词:供需灵活双响应;可替代性负荷;阶梯式碳交易;综合能源系统;有机朗肯循环 主题:考虑阶梯式碳交易与供需灵活双响应的综合能源系统优化调度 提出了供需灵活双响应机制,供应侧引入有机朗肯循环实现热电
- 后端src target.zip
- stm32 AES256加密 串口IAP升级 bootloader程序 通过上位机将keil生成的BIN文件进行AES加密,得到新的加密文件,加密需要自己设置秘钥,加密升级包直接烧录不能运行 通过串
- 前端分析-2023071100789
- 前端分析-2023071100789
- 基于S7-200 PLC与MCGS组态的隧道照明控制系统 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面
- 三相电压型SVPWM整流电路仿真模型 结果包括: 直流侧输出电压电流波形 交流侧输入电压电流波形 三相SVPWM整流电路交流侧电流FFT分析 三相SVPWM整流电路直流纹波系数FFT分析 另有自写文
- carsim停车场低速导航跟踪
- 直流电机的仿真模型simulink 运行仿真前先运行DJCS1.m文件给模型赋值,利用转速电流双闭环结构,实现了电机电流快速跟随给定,电机最大转速在2700转左右,可以自己调节给定电压U*的值实现变
- 永磁同步电机伺服控制,基于三阶自抗扰伺服控制仿真模型,效果很好 模型预测控制,滑模控制,自抗扰控制,广义预测控制,反步控制等各种控制算法任意排列组合都有
- 遗传算法编程分布式电源优化配置问题,配电网电源规划 利用遗传算法对IEEE33节点配电网DG优化配置 针对DG优化配置问题 ,以DG配置总成本最少为 目标构建目标函数 其中总 成本包括发电成本 、
- 笔记本电池包修复软件 BE2Works v4.52版本