在Spring Boot框架下的web评论系统,实体有评论、子评论、用户和回复,实现浏览、发布、更新和删除功能。

时间: 2023-06-18 08:08:39 浏览: 56
好的,首先你需要定义四个实体类,分别为Comment、SubComment、User和Reply。其中Comment和SubComment是一对多的关系(即一个Comment下可以有多个SubComment),SubComment和Reply也是一对多的关系(即一个SubComment下可以有多个Reply),User则是一对多的关系(即一个User可以对应多个Comment和SubComment)。 下面是针对这四个实体类的建表语句: ``` CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `comment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ); CREATE TABLE `sub_comment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL, `comment_id` int(11) NOT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`comment_id`) REFERENCES `comment`(`id`), FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ); CREATE TABLE `reply` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL, `sub_comment_id` int(11) NOT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`sub_comment_id`) REFERENCES `sub_comment`(`id`), FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ); ``` 接下来是Spring Boot框架下的web评论系统的实现: 1. 在pom.xml文件中添加依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 2. 在application.properties文件中添加数据库连接信息: ``` spring.datasource.url=jdbc:mysql://localhost:3306/comment_system spring.datasource.username=root spring.datasource.password=123456 spring.jpa.hibernate.ddl-auto=update ``` 3. 编写实体类: User.java ```java @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Comment> comments; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<SubComment> subComments; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Reply> replies; // 省略getter和setter } ``` Comment.java ```java @Entity @Table(name = "comment") public class Comment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String content; @ManyToOne @JoinColumn(name = "user_id") private User user; @OneToMany(mappedBy = "comment", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<SubComment> subComments; // 省略getter和setter } ``` SubComment.java ```java @Entity @Table(name = "sub_comment") public class SubComment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String content; @ManyToOne @JoinColumn(name = "comment_id") private Comment comment; @ManyToOne @JoinColumn(name = "user_id") private User user; @OneToMany(mappedBy = "subComment", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Reply> replies; // 省略getter和setter } ``` Reply.java ```java @Entity @Table(name = "reply") public class Reply { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String content; @ManyToOne @JoinColumn(name = "sub_comment_id") private SubComment subComment; @ManyToOne @JoinColumn(name = "user_id") private User user; // 省略getter和setter } ``` 4. 编写Repository: UserRepository.java ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { } ``` CommentRepository.java ```java @Repository public interface CommentRepository extends JpaRepository<Comment, Long> { } ``` SubCommentRepository.java ```java @Repository public interface SubCommentRepository extends JpaRepository<SubComment, Long> { } ``` ReplyRepository.java ```java @Repository public interface ReplyRepository extends JpaRepository<Reply, Long> { } ``` 5. 编写Service: UserService.java ```java @Service public class UserService { @Autowired private UserRepository userRepository; public User save(User user) { return userRepository.save(user); } public User findById(Long id) { return userRepository.findById(id).orElse(null); } public List<User> findAll() { return userRepository.findAll(); } public void delete(Long id) { userRepository.deleteById(id); } } ``` CommentService.java ```java @Service public class CommentService { @Autowired private CommentRepository commentRepository; public Comment save(Comment comment) { return commentRepository.save(comment); } public Comment findById(Long id) { return commentRepository.findById(id).orElse(null); } public List<Comment> findAll() { return commentRepository.findAll(); } public void delete(Long id) { commentRepository.deleteById(id); } } ``` SubCommentService.java ```java @Service public class SubCommentService { @Autowired private SubCommentRepository subCommentRepository; public SubComment save(SubComment subComment) { return subCommentRepository.save(subComment); } public SubComment findById(Long id) { return subCommentRepository.findById(id).orElse(null); } public List<SubComment> findAll() { return subCommentRepository.findAll(); } public void delete(Long id) { subCommentRepository.deleteById(id); } } ``` ReplyService.java ```java @Service public class ReplyService { @Autowired private ReplyRepository replyRepository; public Reply save(Reply reply) { return replyRepository.save(reply); } public Reply findById(Long id) { return replyRepository.findById(id).orElse(null); } public List<Reply> findAll() { return replyRepository.findAll(); } public void delete(Long id) { replyRepository.deleteById(id); } } ``` 6. 编写Controller: UserController.java ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @PostMapping("/save") public User save(@RequestBody User user) { return userService.save(user); } @GetMapping("/find/{id}") public User findById(@PathVariable("id") Long id) { return userService.findById(id); } @GetMapping("/find-all") public List<User> findAll() { return userService.findAll(); } @DeleteMapping("/delete/{id}") public void delete(@PathVariable("id") Long id) { userService.delete(id); } } ``` CommentController.java ```java @RestController @RequestMapping("/comment") public class CommentController { @Autowired private CommentService commentService; @PostMapping("/save") public Comment save(@RequestBody Comment comment) { return commentService.save(comment); } @GetMapping("/find/{id}") public Comment findById(@PathVariable("id") Long id) { return commentService.findById(id); } @GetMapping("/find-all") public List<Comment> findAll() { return commentService.findAll(); } @DeleteMapping("/delete/{id}") public void delete(@PathVariable("id") Long id) { commentService.delete(id); } } ``` SubCommentController.java ```java @RestController @RequestMapping("/sub-comment") public class SubCommentController { @Autowired private SubCommentService subCommentService; @PostMapping("/save") public SubComment save(@RequestBody SubComment subComment) { return subCommentService.save(subComment); } @GetMapping("/find/{id}") public SubComment findById(@PathVariable("id") Long id) { return subCommentService.findById(id); } @GetMapping("/find-all") public List<SubComment> findAll() { return subCommentService.findAll(); } @DeleteMapping("/delete/{id}") public void delete(@PathVariable("id") Long id) { subCommentService.delete(id); } } ``` ReplyController.java ```java @RestController @RequestMapping("/reply") public class ReplyController { @Autowired private ReplyService replyService; @PostMapping("/save") public Reply save(@RequestBody Reply reply) { return replyService.save(reply); } @GetMapping("/find/{id}") public Reply findById(@PathVariable("id") Long id) { return replyService.findById(id); } @GetMapping("/find-all") public List<Reply> findAll() { return replyService.findAll(); } @DeleteMapping("/delete/{id}") public void delete(@PathVariable("id") Long id) { replyService.delete(id); } } ``` 7. 编写前端页面: 在src/main/resources/static目录下添加index.html文件,内容如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Web评论系统</title> </head> <body> <h1>Web评论系统</h1> <h2>用户管理</h2> <form id="user-form"> <label for="username">用户名:</label> <input type="text" id="username" name="username"> <br> <label for="password">密码:</label> <input type="password" id="password" name="password"> <br> <button type="button" onclick="saveUser()">保存</button> </form> <table id="user-table"> <thead> <tr> <th>id</th> <th>用户名</th> <th>密码</th> <th>操作</th> </tr> </thead> <tbody> </tbody> </table> <h2>评论管理</h2> <form id="comment-form"> <label for="content">评论内容:</label> <input type="text" id="content" name="content"> <br> <label for="user-id">用户ID:</label> <input type="text" id="user-id" name="user-id"> <br> <button type="button" onclick="saveComment()">保存</button> </form> <table id="comment-table"> <thead> <tr> <th>id</th> <th>评论内容</th> <th>用户ID</th> <th>操作</th> </tr> </thead> <tbody> </tbody> </table> <h2>子评论管理</h2> <form id="sub-comment-form"> <label for="content">子评论内容:</label> <input type="text" id="content" name="content"> <br> <label for="comment-id">评论ID:</label> <input type="text" id="comment-id" name="comment-id"> <br> <label for="user-id">用户ID:</label> <input type="text" id="user-id" name="user-id"> <br> <button type="button" onclick="saveSubComment()">保存</button> </form> <table id="sub-comment-table"> <thead> <tr> <th>id</th> <th>子评论内容</th> <th>评论ID</th> <th>用户ID</th> <th>操作</th> </tr> </thead> <tbody> </tbody> </table> <h2>回复管理</h2> <form id="reply-form"> <label for="content">回复内容:</label> <input type="text" id="content" name="content"> <br> <label for="sub-comment-id">子评论ID:</label> <input type="text" id="sub-comment-id" name="sub-comment-id"> <br> <label for="user-id">用户ID:</label> <input type="text" id="user-id" name="user-id"> <br> <button type="button" onclick="saveReply()">保存</button> </form> <table id="reply-table"> <thead> <tr> <th>id</th> <th>回复内容</th> <th>子评论ID</th> <th>用户ID</th> <th>操作</th> </tr> </thead> <tbody> </tbody> </table> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> function saveUser() { $.ajax({ url: "/user/save", type: "POST", dataType: "json", contentType: "application/json;charset=utf-8", data: JSON.stringify({ username: $("#username").val(), password: $("#password").val() }), success: function (result) { alert("保存成功!"); $("#user-form")[0].reset(); loadUserTable(); } }); } function loadUserTable() { $.ajax({ url: "/user/find-all", type: "GET", dataType: "json", success: function (result) { var tbody = $("#user-table tbody"); tbody.empty(); $.each(result, function (index, item) { var tr = $("<tr></tr>"); tr.append($("<td></td>").text(item.id)); tr.append($("<td></td>").text(item.username)); tr.append($("<td></td>").text(item.password)); var td = $("<td></td>"); td.append($("<button type='button'>删除</button>").click(function () { deleteUser(item.id); })); tr.append(td); tbody.append(tr); }); } }); } function deleteUser(userId) { $.ajax({ url: "/user/delete/" + userId, type: "DELETE", success: function () { alert("删除成功!"); loadUserTable(); } }); } function saveComment() { $.ajax({ url: "/comment/save", type: "POST", dataType: "json", contentType: "application/json;charset=utf-8", data: JSON.stringify({ content: $("#content").val(), user: {id: $("#user-id").val()} }), success: function (result) { alert("保存成功!"); $("#comment-form")[0].reset(); loadCommentTable(); } }); } function loadCommentTable() { $.ajax({ url: "/comment/find-all", type: "GET", dataType: "json", success: function (result) { var tbody = $("#comment-table tbody"); tbody.empty(); $.each(result, function (index, item) { var tr = $("<tr></tr>"); tr.append($("<td></td>").text(item.id)); tr.append($("<td></td>").text(item.content)); tr.append($("<td></td>").text(item.user.id)); var td = $("<td></td>"); td.append($("<button type='button'>删除</button>").click(function () { deleteComment(item.id); })); tr.append(td); tbody.append(tr); }); } }); } function deleteComment(commentId) { $.ajax({ url: "/comment/delete/" + commentId, type: "DELETE", success: function () { alert("删除成功!"); loadCommentTable(); } }); } function saveSubComment() { $.ajax({ url: "/sub-comment/save", type: "POST", dataType: "json", contentType: "application/json;charset=utf-8", data: JSON.stringify({ content: $("#content").val(), comment: {id: $("#comment-id").val()}, user: {id: $("#user-id").val()} }), success: function (result) { alert("保存成功!"); $("#sub-comment-form")[0].reset(); loadSubCommentTable(); } }); } function loadSubCommentTable() { $.ajax({ url: "/sub-comment/find-all", type: "GET", dataType: "json", success: function (result) { var tbody = $("#sub-comment-table tbody"); tbody.empty(); $.each(result, function (index, item) { var tr = $("<tr></tr>"); tr.append($("<td></td>").text(item.id)); tr.append($("<td></td>").text(item.content)); tr.append($("<td></td>").text(item.comment.id)); tr.append($("<td></td>").text(item.user.id)); var td = $("<td></td>"); td.append($("<button type='button'>删除</button>").click(function () { deleteSubComment(item.id); })); tr.append(td); tbody.append(tr); }); } }); } function deleteSubComment(subCommentId) { $.

相关推荐

最新推荐

recommend-type

基于SpringBoot的代码生成器的设计和实现.doc

本文在基于减少Java Web开发者代码编写量的需求上,使用Java EE技术和Spring Boot框架设计了一个B/S模式的代码生成器系统。本设计包含了以下3个主要内容:1. 用户对数据库的实体模型进行设计和管理;2. 系统根据实体...
recommend-type

基于Java实现的明日知道系统.zip

基于Java实现的明日知道系统
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

HSV转为RGB的计算公式

HSV (Hue, Saturation, Value) 和 RGB (Red, Green, Blue) 是两种表示颜色的方式。下面是将 HSV 转换为 RGB 的计算公式: 1. 将 HSV 中的 S 和 V 值除以 100,得到范围在 0~1 之间的值。 2. 计算色相 H 在 RGB 中的值。如果 H 的范围在 0~60 或者 300~360 之间,则 R = V,G = (H/60)×V,B = 0。如果 H 的范围在 60~120 之间,则 R = ((120-H)/60)×V,G = V,B = 0。如果 H 的范围在 120~180 之间,则 R = 0,G = V,B =
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、
recommend-type

已知自动控制原理中通过更高的频率特征来评估切割频率和库存——相位稳定。确定封闭系统的稳定性。求Wcp 和ψ已知W(p)=30•(0.1p+1)•(12.5p+1)/p•(10p+1)•(0.2p+1)•(p+1)

根据相位稳定的定义,我们需要找到一个频率 Wcp,使得相位满足 -ψ = -180°,即 ψ = 180°。此时系统的相位裕度为 0°,系统处于边缘稳定状态。 首先,我们需要将 W(p) 表示成极点和零点的形式。将分母和分子分别因式分解,得到: W(p) = 30 • (0.1p+1) • (12.5p+1) / [p • (10p+1) • (0.2p+1) • (p+1)] = 375p/(p+1) - 3750/(10p+1) + 750p/(0.2p+1) - 3750p/(10p+1) + 150p/(p+1) + 30 因此,系统的极点为 -1、-0.1、-0.2、