Java 实战范例之线上新闻平台系统的实现

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 两张表。用户表包括 idusernamepasswordemail 四个字段。新闻表包括 idtitlecontentcategorycreate_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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • MySQL Packet for query is too large 问题及解决方法

    MySQL Packet for query is too large 是 MySQL 服务器返回的错误信息,意味着 MySQL 的查询语句太大,超出了 MySQL 服务器和客户端之间约定的协议数据包大小(默认为 16MB),导致服务器无法处理该查询请求。此时,我们需要进行以下措施来解决问题。 解决方法一:增加 max_allowed_packet 配置项的…

    Java 2023年6月16日
    00
  • springboot 返回json格式数据时间格式配置方式

    下面是关于“springboot 返回json格式数据时间格式配置方式”的完整攻略。 一、需求分析 在Spring Boot应用中,我们常常需要返回JSON格式数据。而JSON格式中的时间字段经常需要进行格式化,以便更加直观和易读。因此,我们需要对返回的时间字段进行格式化处理。 二、解决方法 Spring Boot提供了多种方式来解决这个问题,下面将介绍两种…

    Java 2023年5月26日
    00
  • Tomcat 配置与优化方案详解

    Tomcat 配置与优化方案详解 1. 什么是 Tomcat? Tomcat 是一个开源的 Web 应用服务器,它实现了 Java Servlet 和 JavaServer Pages 规范,提供了一个用于开发和运行 Java Web 应用的环境。 2. Tomcat 的配置 2.1. 配置文件 Tomcat 的配置文件分为两类: server.xml:To…

    Java 2023年6月2日
    00
  • Java MyBatis 多表查询详解

    首先我会先为大家讲解一下Java MyBatis多表查询的基础知识,然后再通过两个具体的实例进行详细说明。 什么是Java MyBatis Java MyBatis是一款优秀的开源数据持久层框架,它支持定制化SQL、存储过程和高级映射。MyBatis避免了几乎所有JDBC代码和手动设置参数以及获取结果集的工作。相对于传统的Hibernate等ORM框架,My…

    Java 2023年5月20日
    00
  • Maven 项目用Assembly打包可执行jar包的方法

    下面是详细的“Maven 项目用 Assembly 打包可执行 jar 包的方法”的攻略: 一、前提条件 已安装 Maven 并配置环境变量 已经有一个 Maven 项目 二、添加 Assembly 插件到 Maven 项目中 在项目的 pom.xml 文件中添加以下插件配置: <build> <plugins> <plugin…

    Java 2023年6月2日
    00
  • Java时间工具类Date的常用处理方法

    下面是“Java时间工具类Date的常用处理方法”完整攻略: 一、Date类的创建方法 Date类的实例可以用以下两种方法创建: 1. 使用无参构造函数创建 Date date = new Date(); System.out.println(date); //2022-03-16 14:11:52 2. 使用long类型的构造函数创建,参数为从1970年1…

    Java 2023年5月20日
    00
  • jquery分页对象使用示例

    下面就来为您详细讲解“jquery分页对象使用示例”的完整攻略。 什么是jquery分页对象? jQuery分页对象是一个能够帮助我们在前端实现分页功能的js插件。它提供了丰富的分页样式,支持无刷新分页,通过ajax异步请求数据,并将数据渲染到指定位置,是一款非常实用的前端分页插件。 怎样使用jquery分页对象? 要使用jquery分页对象,首先需要引入j…

    Java 2023年6月16日
    00
  • java读取csv文件示例分享(java解析csv文件)

    下面我将详细介绍关于“Java读取CSV文件示例分享”的完整攻略,包含以下内容: CSV文件的基本介绍 Java解析CSV文件的基本思路 Java读取CSV文件的两种示例 1. CSV文件的基本介绍 CSV(Comma-Separated Values)即逗号分隔值文件,是一种简单、通用的文件格式,用于存储数据。它的基本格式是用逗号将一行数据中的内容分隔开来…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部