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日

相关文章

  • MyEclipse CI 2019怎么安装?MyEclipse CI 2019.4安装激活方法+使用教程

    以下是“MyEclipse CI 2019怎么安装?MyEclipse CI 2019.4安装激活方法+使用教程”的完整攻略。 安装MyEclipse CI 2019 首先进入MyEclipse官网,点击下载按钮,选择MyEclipse CI 2019版本进行下载。 安装过程较为简单,按下一步指示即可。注意在安装过程中选择想要安装的插件。 示例说明:选择安装…

    Java 2023年6月15日
    00
  • 基于字符串常用API(详解)

    基于字符串常用API(详解) 字符串是计算机编程中最为常用的数据类型之一,而字符串常用API是在操作字符串时使用的一些函数或方法,可以方便地完成对字符串的操作。本篇文章将详细解释字符串常用API并给出相关示例说明。 获取字符串长度 获取字符串长度是一项基本操作,可以用以下代码实现: string = "Hello, world!" len…

    Java 2023年5月27日
    00
  • String.replaceAll方法详析(正则妙用)

    String.replaceAll方法详析(正则妙用) 介绍 在Java程序开发中,字符串的常见操作之一就是字符串替换。String类提供了replaceAll方法,可以基于正则表达式进行替换操作。本文将详细介绍String.replaceAll的用法,以及正则表达式的妙用。 方法定义 String类中用于替换的方法有两个:replace和replaceAl…

    Java 2023年5月27日
    00
  • SpringBoot参数校验之@Validated的使用详解

    下面就为大家详细讲解“SpringBoot参数校验之@Validated的使用详解”。 什么是@Validated 在Spring框架中,我们经常需要对方法入参的校验,以保证参数的正确性。 SpringBoot基于Hibernate Validator,为开发者提供了方便简洁的实现方式:@Validated。 @Validated 用于校验方法入参,可以将该…

    Java 2023年5月20日
    00
  • Hibernate中5个核心接口知识点整理

    当我们使用Hibernate进行数据库操作时,会经常接触到如下5个核心接口: SessionFactory Session Transaction Query Criteria 它们分别是什么,有何作用?下面我们进行详细讲解。 SessionFactory SessionFactory是Hibernate的核心接口之一,通常也是Hibernate启动过程中的…

    Java 2023年5月19日
    00
  • SpringBoot 集成MongoDB实现文件上传功能

    SpringBoot是一个轻量级的JavaEE(Enterprise Edition)应用程序框架,集成MongoDB实现文件上传功能是一种非常实用的功能。下面,将详细讲解SpringBoot集成MongoDB实现文件上传功能的完整攻略。 创建SpringBoot项目 首先,需要创建一个SpringBoot项目,并添加相应的依赖。 在pom.xml文件中添加…

    Java 2023年6月3日
    00
  • JSP 中Spring的Resource类读写中文Properties实例代码

    当 JSP 中使用 Spring 框架时,常常需要读写中文 Properties 文件。在这种情况下,可以使用 Spring 框架中的 Resource 类来实现文件的读取和写入。下面是详细的攻略: 步骤一:导入 Spring 框架 在 JSP 中使用 Spring 框架时,需要先导入 Spring 相关的 jar 包。一般来说,需要导入以下 jar 包: …

    Java 2023年6月15日
    00
  • 史上最全面的Spring Boot配置文件深入讲解

    史上最全面的Spring Boot配置文件深入讲解 Spring Boot是一个快速构建企业级应用程序的框架,它允许我们通过配置文件来快速配置和启动应用程序。在Spring Boot中,我们可以使用application.properties或application.yml等配置文件来配置应用程序的属性,以满足我们的需求。本文将深入讲解Spring Boot…

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