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

yizhihongxing

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日

相关文章

  • 基于java语言实现快递系统

    为了实现一个基于Java语言的快递系统,我们需要采取以下步骤: 第一步:需求分析 首先,我们需要对开发的快递系统进行需求分析,确定系统的基本功能和特性。这一步需要和客户或用户沟通,收集需求并进行分析,以确保快递系统能够满足用户期望并达到预期效果。 第二步:设计系统架构 在确定了快递系统的需求之后,我们需要对系统进行设计,确定系统的结构和运行机制。针对一些功能…

    Java 2023年5月18日
    00
  • Java开发学习 Java数组操作工具

    Java开发学习 Java数组操作工具完整攻略 简介 在Java程序开发中,数组操作是非常重要的一部分。Java的数组操作工具可以帮助开发人员快速地对数组进行各种操作,包括创建、初始化、排序、查找等。本篇学习笔记将详细讲解Java数组操作工具的使用方法,帮助初学者快速了解Java数组的基本知识点。 安装Java开发环境 从官方网站https://www.or…

    Java 2023年5月23日
    00
  • Mybatis下的SQL注入漏洞原理及防护方法解析

    Mybatis是一个流行的Java持久层框架,它具有方便的ORM(对象关系映射)实现方式和优秀的性能。然而,一些开发人员对Mybatis的SQL注入漏洞缺乏足够的认识,导致了许多Mybatis系统的漏洞。 SQL注入漏洞原理 所谓SQL注入,是指攻击者在Web应用中注入恶意的SQL语句,从而执行一些数据篡改、信息泄露等恶意操作。Mybatis中的SQL注入漏…

    Java 2023年5月20日
    00
  • Spring框架初始化解析

    Spring框架初始化解析 Spring框架是由Java编写的一个轻量级的开源框架,主要用于开发企业级应用程序。Spring框架核心是IoC(控制反转)和AOP(面向切面编程)。在使用Spring框架之前,需要先对Spring框架的初始化有一定的认识。 Spring框架初始化步骤 Spring框架的初始化步骤如下: 创建BeanFactory对象 解析Bea…

    Java 2023年5月19日
    00
  • Gson之toJson和fromJson方法的具体使用

    标题: Gson之toJson和fromJson方法的具体使用攻略 概述:GSON 是 Google 提供的 JSON 库,在 Android 应用开发中是经常被用到的,在实现 JSON 的序列化和反序列化时会用到 toJson() 和 fromJson() 方法。 toJson() 方法是将 Java 对象转换成 JSON 对象,而fromJson() 方…

    Java 2023年5月26日
    00
  • Spring事务管理的使用细则浅析

    Spring事务管理的使用细则浅析 随着应用程序的复杂度增加,使用事务管理来保证数据的一致性和完整性变得越来越重要。Spring框架提供了一个强大的事务管理机制,可以让我们方便地定义和使用事务。 在本文中,我们将讨论Spring事务管理的使用细则,包括如何配置和使用事务、不同的传播机制、事务的隔离级别和异常处理等方面内容。 配置和使用事务 首先,我们需要配置…

    Java 2023年5月20日
    00
  • Springboot使用Security实现OAuth2授权验证完整过程

    下面我为大家详细讲解Spring boot使用Security实现OAuth2授权验证的完整流程。 1. OAuth2介绍 OAuth2是一种常用的授权框架,可以使得第三方应用程序获得用户的授权才能访问用户的资源。OAuth2的主要授权方式有4种: 1.1 授权码模式(Authorization Code) 授权码模式是OAuth2中最常用的一种模式。其要求…

    Java 2023年5月20日
    00
  • JAVA的Random类的用法详解

    JAVA的Random类的用法详解 java.util.Random类是一个用于生成伪随机数的类,它在Java中的使用非常广泛。在今天的攻略中,我们将详细讲解Random类的各种用法,以帮助您更好地掌握它的使用方法。 生成随机数 首先,我们来看下如何使用Random类来生成随机数。 随机数的类型可以是整数或浮点数。 生成整数随机数 生成整数随机数的方法是使用…

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