为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA web项目学习:从入门到实践的详细指南

标签:
Java WebApp SSM
概述

本文详细介绍了JAVA web项目学习的相关内容,涵盖了从开发环境搭建到常用框架的使用,再到前端技术的基础和实战演练,帮助读者全面掌握Java Web开发技能。

Java Web开发简介

Java Web开发的基础概念

Java Web开发是一种广泛应用于企业级应用开发的技术,它能够帮助开发者构建可扩展、高性能的Web应用。Java Web应用通常包含一个或多个Web服务器,这些服务器接收来自客户端(如浏览器)的HTTP请求,处理这些请求,并将相应的响应返回给客户端。Java Web应用通常运行在Web容器中,如Tomcat或Jetty,这些容器负责加载和执行Java Web应用的组件。

在Java Web开发中,常用的技术包括Servlet、JSP(JavaServer Pages)、JavaBeans等。Servlet是一种运行在Web容器中的Java类,能够接收HTTP请求并生成HTTP响应,是Java Web应用的核心。JSP是一种动态网页技术,允许开发者在HTML中嵌入Java代码,方便生成动态网页内容。JavaBeans是一种轻量级的Java组件,用于封装和操作数据。

Java Web技术生态介绍

Java Web技术生态非常丰富,除了传统的Servlet和JSP,还有很多现代的框架和库。Spring框架是最受欢迎的Java Web框架之一,它提供了一整套用于构建企业级应用的工具和库。Spring Boot是Spring框架的一个子项目,它简化了Spring应用的开发,提供了许多开箱即用的功能,并能够自动配置依赖和组件,使得开发者可以快速构建完整的Web应用。

除了Spring,还有其他流行的技术栈,如Hibernate(用于对象关系映射)和MyBatis(用于数据库操作)。此外,Java Web开发还离不开前端技术,如HTML、CSS和JavaScript,它们与后端技术共同构建Web应用的前端界面。

开发环境搭建

在开始Java Web开发之前,需要搭建一个基本的开发环境。以下是搭建Java Web开发环境的步骤:

  1. 安装Java

    • 可以从Oracle官网下载Java SE开发工具包(JDK)。
    • 安装完成后,配置环境变量,确保JDK路径添加到系统PATH环境变量中。
  2. 安装IDE

    • 推荐使用IntelliJ IDEA、Eclipse或STS(Spring Tools Suite)。这些IDE都提供了丰富的Java Web开发工具和插件。
    • 下载并安装IDE。
  3. 配置Web容器

    • 下载并安装Tomcat或Jetty等Web容器。这里以Tomcat为例:
      • 下载Tomcat并解压到指定目录。
      • 配置环境变量,将Tomcat的bin目录路径添加到系统PATH环境变量中。
  4. 配置Maven或Gradle

    • Maven和Gradle是常用的构建工具,用于管理项目的依赖和构建过程。
    • 下载并安装Maven或Gradle。
    • 配置环境变量,将Maven或Gradle的bin目录路径添加到系统PATH环境变量中。
  5. 创建第一个Java Web应用
    • 使用IDE创建一个Java Web项目。
      ibli
    • 在项目中添加必要的依赖,如Servlet API、Spring Boot等。

Java Web项目的基础框架

常用框架简介(如Spring Boot)

Spring Boot是Spring框架的一个子项目,旨在简化Spring应用的开发过程。它提供了一系列开箱即用的功能,使开发者能够快速构建完整的Web应用。以下是Spring Boot的主要特性:

  • 自动配置:Spring Boot能够自动配置许多常见的依赖和组件,如数据库连接、Web服务器等。
  • 嵌入式Web服务器:Spring Boot内置了Tomcat或Jetty等Web服务器,方便开发和测试。
  • 依赖管理和打包:Spring Boot使用Maven或Gradle管理项目依赖,并能够生成可执行的WAR或JAR文件。
  • 健康检查和监控:Spring Boot提供了健康检查和监控功能,方便开发者监控应用运行状态。
  • 外部化配置:Spring Boot支持从各种源(如环境变量、命令行参数等)加载外部化配置。

搭建第一个Web应用

在本节中,我们将使用Spring Boot搭建一个简单的Web应用,展示如何处理HTTP请求并返回响应。

  1. 创建Spring Boot项目

    • 使用Spring Initializr(可以从Spring Boot官网获取)创建一个新的Spring Boot项目。
    • 选择所需依赖,如Spring Web、Thymeleaf等。
    • 下载项目并导入到IDE中。
  2. 编写第一个Controller
    • 创建一个Java类,该类需要使用@Controller注解。
    • 在该类中,定义一个方法,该方法使用@GetMapping注解处理HTTP GET请求,并返回一个字符串。
    • 示例代码如下:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}
  1. 启动应用并测试
    • 在IDE中运行应用(通常需要在主类中添加main方法)。
    • 打开浏览器,访问http://localhost:8080/hello,可以看到返回的“Hello, World!”字符串。

Maven/Gradle项目构建工具介绍

Maven和Gradle是常用的构建工具,用于管理项目的依赖和构建过程。以下是Maven和Gradle的基本介绍:

  • Maven
    • Maven使用POM(Project Object Model)文件(pom.xml)来描述项目的依赖和构建过程。
    • Maven提供了一套标准的生命周期(如compile、test、package)和插件(如maven-compiler-plugin、maven-surefire-plugin)。
    • 示例pom.xml文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-web-app</artifactId>
    <version>1.0.0</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.6.3</version>
        </dependency>
    </dependencies>
</project>
  • Gradle
    • Gradle使用build.gradle文件来描述项目的依赖和构建过程。
    • Gradle使用Groovy语法来编写构建脚本,提供了灵活的构建任务和插件。
    • 示例build.gradle文件如下:
plugins {
    id 'org.springframework.boot' version '2.6.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '1.0.0'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

Java Web项目的开发流程

设计数据库模型

在设计数据库模型时,需要考虑应用的业务需求和数据结构。以下是设计数据库模型的基本步骤:

  1. 确定实体

    • 确定应用需要操作的主要实体,例如用户、文章、评论等。
    • 每个实体需要有一组属性,定义实体的字段。
  2. 确定关系

    • 确定实体之间的关系,例如一对多、多对多等。
    • 如果存在关系,需要定义外键等。
  3. 设计表结构

    • 根据实体和关系设计数据库表结构。
    • 为每个表定义字段类型和约束。
  4. 编写SQL脚本
    • 使用SQL脚本创建数据库表。
    • 示例SQL脚本如下:
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL,
    email VARCHAR(50) NOT NULL
);

CREATE TABLE articles (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(100) NOT NULL,
    content TEXT NOT NULL,
    author_id INT NOT NULL,
    FOREIGN KEY (author_id) REFERENCES users(id)
);

数据库连接与操作

在Java Web应用中,通常使用JDBC或ORM框架(如Spring Data JPA)进行数据库连接和操作。以下是如何使用JDBC进行数据库操作的示例:

  1. 加载驱动
    • 在应用启动时加载数据库驱动。
    • 示例代码如下:
Class.forName("com.mysql.jdbc.Driver");
  1. 获取连接
    • 使用数据库连接URL、用户名和密码获取连接。
    • 示例代码如下:
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "root";
String password = "password";
Connection connection = DriverManager.getConnection(url, username, password);
  1. 执行SQL语句
    • 使用PreparedStatement执行SQL语句。
    • 示例代码如下:
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, "admin");
ResultSet resultSet = statement.executeQuery();
  1. 处理结果集
    • 遍历结果集并处理数据。
    • 示例代码如下:
while (resultSet.next()) {
    String username = resultSet.getString("username");
    String password = resultSet.getString("password");
    // 处理数据
}
  1. 关闭资源
    • 关闭PreparedStatement、ResultSet和Connection。
    • 示例代码如下:
resultSet.close();
statement.close();
connection.close();

后端逻辑实现

在实现后端逻辑时,通常需要处理各种业务逻辑,如用户认证、数据操作等。以下是如何使用Spring Boot实现一个简单的用户认证逻辑的示例:

  1. 创建用户实体类
    • 定义一个User实体类,用于表示用户数据。
    • 示例代码如下:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private String email;

    // Getter和Setter方法
}
  1. 创建用户仓库接口
    • 定义一个UserRepository接口,用于与数据库交互。
    • 示例代码如下:
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}
  1. 创建用户服务类
    • 创建一个UserService类,用于处理用户认证逻辑。
    • 示例代码如下:
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private PasswordEncoder passwordEncoder;

    public User authenticate(String username, String password) {
        User user = userRepository.findByUsername(username);
        if (user != null && passwordEncoder.matches(password, user.getPassword())) {
            return user;
        }
        return null;
    }
}
  1. 创建Controller处理认证请求
    • 创建一个Controller处理HTTP请求并调用UserService进行用户认证。
    • 示例代码如下:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;

@RestController
public class AuthController {
    @Autowired
    private UserService userService;

    @GetMapping("/auth")
    public String authenticate(@RequestParam("username") String username, @RequestParam("password") String password) {
        User user = userService.authenticate(username, password);
        if (user != null) {
            return "Authentication successful";
        }
        return "Authentication failed";
    }
}

Java Web项目的前端技术

HTML/CSS/JavaScript基础

前端技术是构建Web应用用户界面的核心技术。以下是一些基本的概念和用法:

  1. HTML
    • HTML用于定义Web页面的结构和内容。
    • 例如,创建一个简单的HTML页面,包括标题和段落:
<!DOCTYPE html>
<html>
<head>
    <title>My Web Page</title>
</head>
<body>
    <h1>Welcome to My Web Page</h1>
    <p>This is a simple HTML page.</p>
</body>
</html>
  1. CSS
    • CSS用于定义Web页面的样式,如字体、颜色、布局等。
    • 例如,使用内联CSS设置段落的样式:
<!DOCTYPE html>
<html>
<head>
    <title>My Web Page</title>
</head>
<body>
    <p style="font-size: 20px; color: blue;">This is a styled paragraph.</p>
</body>
</html>
  1. JavaScript
    • JavaScript用于添加交互性和动态内容到Web页面。
    • 例如,使用JavaScript处理按钮点击事件:
<!DOCTYPE html>
<html>
<head>
    <title>My Web Page</title>
</head>
<body>
    <button onclick="alert('Button clicked!')">Click Me</button>

    <script>
        function alertMessage() {
            alert("Button clicked!");
        }
    </script>
</body>
</html>

前后端交互基础(AJAX, JSON)

在Web应用中,前后端交互通常通过AJAX(异步JavaScript和XML)和JSON(JavaScript对象表示法)实现。以下是如何使用AJAX和JSON进行前后端交互的示例:

  1. 定义JSON数据
    • JSON是一种轻量级的数据交换格式,通常用于前后端通信。
    • 例如,定义一个用户对象的JSON格式:
{
    "username": "admin",
    "password": "password123",
    "email": "admin@example.com"
}
  1. 使用AJAX发送请求
    • 使用JavaScript的XMLHttpRequest对象或Fetch API发送HTTP请求。
    • 例如,使用Fetch API发送一个POST请求:
<!DOCTYPE html>
<html>
<head>
    <title>AJAX Example</title>
</head>
<body>
    <button id="sendRequest">Send Request</button>

    <script>
        document.getElementById("sendRequest").addEventListener("click", function() {
            fetch("/auth", {
                method: "POST",
                headers: {
                    "Content-Type": "application/json"
                },
                body: JSON.stringify({
                    username: "admin",
                    password: "password123"
                })
            })
            .then(response => response.text())
            .then(data => console.log(data));
        });
    </script>
</body>
</html>
  1. 处理响应
    • 在后端处理请求并返回JSON响应。
    • 例如,使用Spring Boot处理POST请求并返回JSON响应:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;

@RestController
public class AuthController {
    @PostMapping("/auth")
    public ResponseEntity<String> authenticate(@RequestBody String requestBody) {
        // 解析JSON请求体并进行认证逻辑
        // 处理后返回JSON响应
        return ResponseEntity.ok("Authentication successful");
    }
}

常见前端框架(如Vue.js)

前端框架如Vue.js可以简化前端开发,提供丰富的组件和声明式语法。以下是如何使用Vue.js创建一个简单的应用:

  1. 引入Vue.js
    • 在HTML文件中引入Vue.js库。
    • 例如,使用CDN引入Vue.js:
<!DOCTYPE html>
<html>
<head>
    <title>Vue.js Example</title>
    <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://cdn.jsdelivr.net/npm/vue@2"></script>
</head>
<body>
    <div id="app">
        {{ message }}
    </div>

    <script>
        new Vue({
            el: '#app',
            data: {
                message: 'Hello Vue!'
            }
        });
    </script>
</body>
</html>
  1. 使用Vue组件
    • 定义Vue组件并使用它们构建页面。
    • 例如,创建一个简单的按钮组件:
<!DOCTYPE html>
<html>
<head>
    <title>Vue.js Example</title>
    <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://cdn.jsdelivr.net/npm/vue@2"></script>
</head>
<body>
    <div id="app">
        <my-button message="Click Me"></my-button>
    </div>

    <script>
        Vue.component('my-button', {
            template: '<button @click="onClick">{{ message }}</button>',
            data: function() {
                return {
                    message: 'Click Me'
                };
            },
            methods: {
                onClick: function() {
                    alert('Button clicked!');
                }
            }
        });

        new Vue({
            el: '#app'
        });
    </script>
</body>
</html>

Java Web项目的部署与配置

应用服务器配置(Tomcat, Jetty)

在部署Java Web应用时,需要配置应用服务器。以下是如何配置Tomcat和Jetty的步骤:

  1. 部署WAR文件到Tomcat

    • 将应用打包成WAR文件。
    • 将WAR文件复制到Tomcat的webapps目录。
    • 启动Tomcat,应用将自动部署并运行。
  2. 部署WAR文件到Jetty
    • 将应用打包成WAR文件。
    • 使用Jetty的命令行工具部署WAR文件。
    • 示例命令如下:
java -jar jetty-runner.jar my-app.war

部署应用到服务器

在部署Java Web应用到服务器时,需要考虑服务器环境和配置。以下是如何部署应用到服务器的步骤:

  1. 打包应用
    • 使用Maven或Gradle将应用打包成WAR或JAR文件。
    • 示例Maven命令:
mvn package
  1. 上传文件到服务器

    • 使用SCP、FTP或SFTP等工具将WAR或JAR文件上传到服务器。
  2. 启动应用
    • 在服务器上启动应用。
    • 示例命令:
java -jar my-app.jar

项目上线前的准备

在项目上线前,需要进行一系列的准备工作,确保应用能够稳定运行。以下是一些常见的准备工作:

  1. 性能优化

    • 优化代码和数据库查询,减少响应时间。
    • 使用缓存机制,减少数据库访问。
  2. 安全性检查

    • 检查代码中的安全漏洞,如SQL注入、XSS攻击等。
    • 配置安全相关的设置,如HTTPS、CORS等。
  3. 备份和恢复计划
    • 定期备份数据库和应用文件。
    • 制定恢复计划,确保在发生故障时能够快速恢复。

实战演练:构建一个简单的博客系统

项目需求定义

构建一个简单的博客系统,包括以下功能模块:

  1. 用户注册和登录

    • 用户可以注册账户和登录系统。
    • 用户登录后可以访问博客内容。
  2. 发布和管理文章

    • 用户可以发布新文章,包括标题、内容和分类。
    • 用户可以编辑和删除已发布的文章。
  3. 评论功能

    • 用户可以在文章下发表评论。
    • 用户可以删除自己的评论。
  4. 用户权限管理
    • 普通用户只能查看文章和评论。
    • 管理员可以管理所有用户和文章。

功能模块划分

根据项目需求,将博客系统划分为以下几个模块:

  1. 用户模块

    • 用户注册和登录功能。
    • 用户信息管理。
  2. 文章模块

    • 文章的发布、编辑和删除功能。
    • 文章的分类和标签管理。
  3. 评论模块

    • 评论的发布、编辑和删除功能。
    • 评论的审核和回复功能。
  4. 权限管理模块
    • 用户权限的分配和管理。
    • 用户角色的定义和管理。

编码实现与调试

以下是实现博客系统的一些关键代码示例:

  1. 用户模块的实现
    • 创建User实体类:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private String email;

    // Getter和Setter方法
}
  • 创建UserRepository接口:
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}
  • 创建UserService类:
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private PasswordEncoder passwordEncoder;

    public User registerUser(String username, String password, String email) {
        User user = new User();
        user.setUsername(username);
        user.setPassword(passwordEncoder.encode(password));
        user.setEmail(email);
        return userRepository.save(user);
    }

    public User authenticate(String username, String password) {
        User user = userRepository.findByUsername(username);
        if (user != null && passwordEncoder.matches(password, user.getPassword())) {
            return user;
        }
        return null;
    }
}
  1. 文章模块的实现
    • 创建Article实体类:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;
    @ManyToOne
    private User author;

    // Getter和Setter方法
}
  • 创建ArticleRepository接口:
import org.springframework.data.jpa.repository.JpaRepository;

public interface ArticleRepository extends JpaRepository<Article, Long> {
    List<Article> findByAuthor(User author);
}
  • 创建ArticleService类:
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class ArticleService {
    @Autowired
    private ArticleRepository articleRepository;

    public Article createArticle(String title, String content, User author) {
        Article article = new Article();
        article.setTitle(title);
        article.setContent(content);
        article.setAuthor(author);
        return articleRepository.save(article);
    }

    public List<Article> getArticlesByAuthor(User author) {
        return articleRepository.findByAuthor(author);
    }
}
  1. 评论模块的实现
    • 创建Comment实体类:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Comment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String content;
    @ManyToOne
    private User author;
    @ManyToOne
    private Article article;

    // Getter和Setter方法
}
  • 创建CommentRepository接口:
import org.springframework.data.jpa.repository.JpaRepository;

public interface CommentRepository extends JpaRepository<Comment, Long> {
    List<Comment> findByArticle(Article article);
}
  • 创建CommentService类:
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class CommentService {
    @Autowired
    private CommentRepository commentRepository;

    public Comment createComment(String content, User author, Article article) {
        Comment comment = new Comment();
        comment.setContent(content);
        comment.setAuthor(author);
        comment.setArticle(article);
        return commentRepository.save(comment);
    }

    public List<Comment> getCommentsByArticle(Article article) {
        return commentRepository.findByArticle(article);
    }
}
  1. 权限管理模块的实现
    • 创建Role实体类:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    // Getter和Setter方法
}
  • 创建RoleRepository接口:
import org.springframework.data.jpa.repository.JpaRepository;

public interface RoleRepository extends JpaRepository<Role, Long> {
    Role findByName(String name);
}
  • 创建RoleService类:
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class RoleService {
    @Autowired
    private RoleRepository roleRepository;

    public Role createRole(String name) {
        Role role = new Role();
        role.setName(name);
        return roleRepository.save(role);
    }

    public Role getRoleByName(String name) {
        return roleRepository.findByName(name);
    }
}

通过以上代码示例,我们可以实现一个简单的博客系统,包括用户注册、登录、文章发布和评论等功能。这些代码仅作为示例,实际项目中需要考虑更多细节和安全问题。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
205
获赞与收藏
1008

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消