以下是一个简单的Spring Boot论坛系统示例代码:
- 首先是数据库设计,我们创建以下几张表:
- user表,存储用户信息,包括id、username、password、email、create_time等字段。
- topic表,存储帖子信息,包括id、title、content、user_id、create_time等字段。
- comment表,存储评论信息,包括id、content、user_id、topic_id、create_time等字段。
- 创建实体类
2.1 User实体类:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String username;
@Column
private String password;
@Column
private String email;
@Column(name = "create_time")
private Date createTime;
// getter/setter省略
}
2.2 Topic实体类:
@Entity
@Table(name = "topic")
public class Topic {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String title;
@Column
private String content;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@Column(name = "create_time")
private Date createTime;
// getter/setter省略
}
2.3 Comment实体类:
@Entity
@Table(name = "comment")
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String content;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@ManyToOne
@JoinColumn(name = "topic_id")
private Topic topic;
@Column(name = "create_time")
private Date createTime;
// getter/setter省略
}
- 创建Repository
3.1 UserRepository:
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
3.2 TopicRepository:
public interface TopicRepository extends JpaRepository<Topic, Long> {
}
3.3 CommentRepository:
public interface CommentRepository extends JpaRepository<Comment, Long> {
}
- 创建Service
4.1 UserService:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public boolean checkUser(User user) {
User userInDb = userRepository.findByUsername(user.getUsername());
if (userInDb != null && userInDb.getPassword().equals(user.getPassword())) {
return true;
} else {
return false;
}
}
public void saveUser(User user) {
user.setCreateTime(new Date());
userRepository.save(user);
}
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
}
4.2 TopicService:
@Service
public class TopicService {
@Autowired
private TopicRepository topicRepository;
public List<Topic> getAllTopics() {
return topicRepository.findAll();
}
public Topic getTopicById(Long id) {
return topicRepository.findById(id).orElse(null);
}
public void saveTopic(Topic topic) {
topic.setCreateTime(new Date());
topicRepository.save(topic);
}
}
4.3 CommentService:
@Service
public class CommentService {
@Autowired
private CommentRepository commentRepository;
public void saveComment(Comment comment) {
comment.setCreateTime(new Date());
commentRepository.save(comment);
}
public List<Comment> getCommentsByTopicId(Long topicId) {
return commentRepository.findAllByTopicId(topicId);
}
}
- 创建Controller
5.1 UserController:
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String doLogin(User user, HttpSession session) {
boolean result = userService.checkUser(user);
if (result) {
session.setAttribute("user", user);
return "redirect:/";
} else {
return "login";
}
}
@GetMapping("/logout")
public String logout(HttpSession session) {
session.removeAttribute("user");
return "redirect:/";
}
@GetMapping("/register")
public String register() {
return "register";
}
@PostMapping("/register")
public String doRegister(User user) {
userService.saveUser(user);
return "redirect:/login";
}
}
5.2 TopicController:
@Controller
public class TopicController {
@Autowired
private TopicService topicService;
@Autowired
private CommentService commentService;
@GetMapping("/")
public String index(Model model) {
List<Topic> topics = topicService.getAllTopics();
model.addAttribute("topics", topics);
return "index";
}
@GetMapping("/topic/{id}")
public String topic(@PathVariable Long id, Model model) {
Topic topic = topicService.getTopicById(id);
List<Comment> comments = commentService.getCommentsByTopicId(id);
model.addAttribute("topic", topic);
model.addAttribute("comments", comments);
return "topic";
}
@GetMapping("/new-topic")
public String newTopic() {
return "new-topic";
}
@PostMapping("/new-topic")
public String doNewTopic(Topic topic, HttpSession session) {
User user = (User) session.getAttribute("user");
topic.setUser(user);
topicService.saveTopic(topic);
return "redirect:/";
}
}
5.3 CommentController:
@Controller
public class CommentController {
@Autowired
private CommentService commentService;
@PostMapping("/new-comment")
public String doNewComment(Comment comment, HttpSession session) {
User user = (User) session.getAttribute("user");
comment.setUser(user);
commentService.saveComment(comment);
return "redirect:/topic/" + comment.getTopic().getId();
}
}
- 创建视图页面
6.1 index.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>论坛首页</title>
</head>
<body>
<h1>论坛首页</h1>
<div>
<a href="/new-topic">发表新帖</a>
</div>
<ul>
<li th:each="topic : ${topics}">
<a th:href="@{'/topic/' + ${topic.id}}"><h3 th:text="${topic.title}"></h3></a>
<p th:text="${topic.content}"></p>
<p>
<span th:text="${topic.user.username}"></span>
<span th:text="${#dates.format(topic.createTime, 'yyyy-MM-dd HH:mm:ss')}"></span>
</p>
</li>
</ul>
</body>
</html>
6.2 topic.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>话题详情</title>
</head>
<body>
<h1 th:text="${topic.title}"></h1>
<p th:text="${topic.content}"></p>
<p>
<span th:text="${topic.user.username}"></span>
<span th:text="${#dates.format(topic.createTime, 'yyyy-MM-dd HH:mm:ss')}"></span>
</p>
<hr>
<h2>评论</h2>
<ul>
<li th:each="comment : ${comments}">
<p th:text="${comment.content}"></p>
<p>
<span th:text="${comment.user.username}"></span>
<span th:text="${#dates.format(comment.createTime, 'yyyy-MM-dd HH:mm:ss')}"></span>
</p>
</li>
</ul>
<hr>
<form action="/new-comment" method="post">
<input type="hidden" name="topic.id" th:value="${topic.id}">
<textarea name="content"></textarea>
<br>
<button type="submit">提交评论</button>
</form>
</body>
</html>
6.3 new-topic.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>发表新帖</title>
</head>
<body>
<h1>发表新帖</h1>
<form action="/new-topic" method="post">
<input type="text" name="title">
<br>
<textarea name="content"></textarea>
<br>
<button type="submit">发布帖子</button>
</form>
</body>
</html>
6.4 login.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<form action="/login" method="post">
<input type="text" name="username">