Java 实战范例之线上新闻平台系统的实现
目录
概述
本篇文档是针对实现一个线上新闻平台系统的完整攻略。该系统包括用户注册和登录,新闻分类和展示,新闻发布和编辑等功能。
技术选型
本系统使用的技术包括:
- Spring Boot: 快速开发框架,提供多个组件如Web、Security、JPA等。
- MySQL: 开源关系型数据库管理系统。
- Thymeleaf: 一个现代化服务器端 Java 模板引擎,可以处理HTML、XML、JavaScript、CSS甚至纯文本。
- Lombok: 简化Java代码的工具。
系统架构
该系统采用B/S架构。前端使用Thymeleaf模板引擎渲染页面,后端使用Spring Boot实现后台业务逻辑,持久化数据使用 MySQL数据库实现。
实现步骤
1. 创建数据库和表
创建一个名为 news_platform
的数据库,包括用户表 user
和新闻表 news
两张表。用户表包括 id
、username
、password
、email
四个字段。新闻表包括 id
、title
、content
、category
、 create_time
五个字段。以下是创建表的SQL语句:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) NOT NULL,
`password` varchar(60) NOT NULL,
`email` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username_UNIQUE` (`username`)
);
CREATE TABLE `news` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`content` longtext NOT NULL,
`category` varchar(20) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`)
);
2. 用户注册和登录功能的实现
使用Spring Security提供的用户认证和授权功能,实现用户的注册和登录。用户注册时需要填写用户名、密码和邮箱,注册信息将存储在用户表中。登录时,用户需要输入用户名和密码,系统验证通过后,将会创建一个用户登录状态。
以下是示例代码:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailServiceImpl userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.and()
.logout()
.logoutSuccessUrl("/");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
}
}
@Service("userDetailsService")
public class UserDetailServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if(user != null) {
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
} else {
throw new UsernameNotFoundException("User not found.");
}
}
}
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/register")
public String showRegistrationForm() {
return "register";
}
@PostMapping("/register")
public String registerUser(@Valid User user, BindingResult bindingResult, Model model) {
if(bindingResult.hasErrors()) {
return "register";
}
if(userService.isUsernameTaken(user.getUsername())) {
model.addAttribute("usernameTakenError", true);
return "register";
}
userService.saveUser(user);
return "redirect:/login";
}
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
public boolean isUsernameTaken(String username) {
User user = userRepository.findByUsername(username);
return user != null;
}
public void saveUser(User user) {
String encodedPassword = passwordEncoder.encode(user.getPassword());
user.setPassword(encodedPassword);
userRepository.save(user);
}
}
3. 新闻分类和展示功能的实现
在新闻表中添加一个 category
字段表示新闻的分类。使用Thymeleaf模板引擎实现分类展示。首先在页面中展示所有分类的链接,用户点击链接后将展示该分类的新闻列表。
以下是示例代码:
<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>News Platform</title>
</head>
<body>
<ul>
<li><a href="/news?category=all">All</a></li>
<li><a href="/news?category=politics">Politics</a></li>
<li><a href="/news?category=sports">Sports</a></li>
<li><a href="/news?category=entertainment">Entertainment</a></li>
</ul>
<table>
<thead>
<tr>
<th>Title</th>
<th>Category</th>
<th>Create Time</th>
</tr>
</thead>
<tbody>
<tr th:each="news : ${newsList}">
<td th:text="${news.title}"></td>
<td th:text="${news.category}"></td>
<td th:text="${news.createTime}"></td>
</tr>
</tbody>
</table>
</body>
</html>
控制器中处理 /news
请求,根据 category
参数查询新闻列表。如果没有传入 category
参数,则返回所有新闻列表。
以下是示例代码:
@RestController
public class NewsController {
@Autowired
private NewsService newsService;
@GetMapping("/news")
public String showNewsList(@RequestParam(defaultValue = "all") String category, Model model) {
List<News> newsList;
if("all".equals(category)) {
newsList = newsService.getAllNews();
} else {
newsList = newsService.getNewsByCategory(category);
}
model.addAttribute("newsList", newsList);
return "news";
}
}
@Service
public class NewsService {
@Autowired
private NewsRepository newsRepository;
public List<News> getAllNews() {
return newsRepository.findAll();
}
public List<News> getNewsByCategory(String category) {
return newsRepository.findByCategory(category);
}
}
4. 新闻发布和编辑功能的实现
实现新闻的发布和编辑功能。发布新闻时需要填写新闻标题、内容和分类等信息。编辑新闻时,用户可以修改新闻的标题、内容和分类信息。
以下是示例代码:
@Entity
public class News {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(max = 100)
private String title;
@NotBlank
@Lob
private String content;
@NotBlank
@Size(max = 20)
private String category;
@NotNull
private LocalDateTime createTime;
// getter and setter
}
@Repository
public interface NewsRepository extends JpaRepository<News, Long> {
List<News> findByCategory(String category);
}
@RestController
public class NewsController {
@Autowired
private NewsService newsService;
@Autowired
private UserService userService;
@GetMapping("/news/add")
public String showAddNewsForm(Model model) {
News news = new News();
news.setCreateTime(LocalDateTime.now());
model.addAttribute("news", news);
return "addNews";
}
@PostMapping("/news/add")
public String addNews(@ModelAttribute News news, Principal principal) {
User user = userService.getUserByUsername(principal.getName());
news.setCreateTime(LocalDateTime.now());
news.setUser(user);
newsService.saveNews(news);
return "redirect:/news";
}
@GetMapping("/news/{id}/edit")
public String showEditNewsForm(@PathVariable Long id, Model model) {
News news = newsService.getNewsById(id);
model.addAttribute("news", news);
return "editNews";
}
@PostMapping("/news/{id}/edit")
public String editNews(@ModelAttribute News news) {
newsService.saveNews(news);
return "redirect:/news";
}
}
@Service
public class NewsService {
@Autowired
private NewsRepository newsRepository;
public News getNewsById(Long id) {
return newsRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Invalid news id:" + id));
}
public List<News> getAllNews() {
return newsRepository.findAll();
}
public List<News> getNewsByCategory(String category) {
return newsRepository.findByCategory(category);
}
public void saveNews(News news) {
newsRepository.save(news);
}
}
结语
本文介绍了一个线上新闻平台系统的实现方法,包括用户注册和登录,新闻分类和展示,新闻发布和编辑等功能。其中,用户认证和授权使用了Spring Security提供的功能,持久化数据使用了MySQL。这个项目可以用来学习Spring Boot的入门级别。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 实战范例之线上新闻平台系统的实现 - Python技术站