IDEA中的SpringBoot+JSP+MySQL简单登录注册应用实现

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本教程指导初学者在IntelliJ IDEA中使用Spring Boot、JSP和MySQL数据库搭建一个基础的登录注册系统。首先介绍Spring Boot框架的便利性,其次讨论Java编程语言和JSP在Web开发中的应用,以及MySQL数据库的高效管理。教程详细阐述了从创建项目到配置数据库、实体类、数据源、JPA、Repository接口、Service层、Controller以及JSP页面的每一步流程,还涉及到了Web安全配置。通过实践这个Demo项目,学习者可以掌握后端开发的基础和关键集成技术。 SpringBoot

1. IntelliJ IDEA环境配置

IntelliJ IDEA的安装

IntelliJ IDEA是由JetBrains公司开发的一款功能强大的Java集成开发环境(IDE),深受广大开发者的喜爱。要开始使用IntelliJ IDEA,首先必须进行安装。以下是安装步骤:

  1. 访问 JetBrains官网 下载对应操作系统的安装包。
  2. 双击下载的安装包,按照向导提示完成安装过程。
  3. 安装完成后,首次运行时,可以选择“Create New Project”来创建新的项目或者从现有代码中导入。

Java开发工具包(JDK)的配置

安装好IDE之后,配置JDK是必不可少的步骤,JDK是Java程序开发的基础。在IntelliJ IDEA中配置JDK的步骤如下:

  1. 打开IntelliJ IDEA,点击右上角的“File”选项,选择“Project Structure”。
  2. 在弹出窗口中选择“Project”菜单,然后在右侧的“Project SDK”中选择“New...”来添加新的JDK。
  3. 在“Add JDK”对话框中,指定JDK的安装目录并点击“OK”。

与SpringBoot集成所必需的插件和工具的安装

为了使IntelliJ IDEA支持SpringBoot项目,需要安装相应的插件和工具,例如Spring Assistant插件,可以极大地方便项目开发。操作步骤如下:

  1. 在IntelliJ IDEA中打开“Settings”(Windows/Linux)或“Preferences”(Mac),选择“Plugins”。
  2. 在“Marketplace”标签页中搜索“Spring Assistant”,点击安装并重启IDE。
  3. 在“Tools”菜单中,选择“Create Application Context”,以确保能快速创建SpringBoot应用上下文。

以上步骤完成后,开发SpringBoot+JSP+MySQL集成Demo项目的环境配置就已经准备就绪。开发者可以开始创建项目并进行相关开发工作。

2. Spring Boot框架应用

2.1 Spring Boot入门

2.1.1 Spring Boot的核心优势

Spring Boot是一种创新性的技术,它简化了基于Spring的应用开发过程。开发者不必处理繁杂的配置文件,这是Spring Boot与传统Spring框架相比最显著的优势之一。自动配置机制自动寻找并配置项目所需的组件,大大减少了开发者的工作量。通过Starter POMs,Spring Boot可以快速集成众多的常用库,从而使得项目的依赖关系管理变得更为便捷。此外,Spring Boot提供了一个内嵌的Servlet容器(如Tomcat或Jetty),这意味着开发的应用可以被打包成一个独立的可执行的jar文件,提高了部署效率。内嵌容器的使用,加上对生产就绪型特性(如指标、健康检查和外部化配置)的支持,使得Spring Boot成为开发微服务架构的理想选择。

2.1.2 创建Spring Boot项目的基本步骤

创建Spring Boot项目可以使用Spring官方提供的Spring Initializr服务,或者选择你喜欢的IDE,如IntelliJ IDEA或Eclipse,它们都提供了快速创建Spring Boot项目的向导。以下是使用Spring Initializr创建Spring Boot项目的基本步骤:

  1. 访问 https://start.spring.io/ 并选择项目信息。
  2. 选择Maven或Gradle作为构建工具。
  3. 选择Java语言版本。
  4. 添加项目依赖项,如Spring Web, Thymeleaf, Spring Data JPA等。
  5. 点击“Generate”按钮下载项目压缩包。
  6. 解压下载的项目并在你喜欢的IDE中打开。
  7. 使用IDE的构建工具导入项目,例如在IntelliJ IDEA中使用Maven导入项目。
  8. 运行Spring Boot应用程序的主类,通常是带有 @SpringBootApplication 注解的类。

2.2 Spring Boot项目结构与配置

2.2.1 项目目录结构解析

一个标准的Spring Boot项目结构通常包含以下几个主要目录和文件:

  • /src/main/java :存放项目的主要Java代码。
  • /src/main/resources :存放项目资源文件,如配置文件、静态资源(images, CSS, JavaScript)和模板文件(如Thymeleaf)。
  • /src/test/java :存放JUnit测试代码。
  • pom.xml (Maven项目)或 build.gradle (Gradle项目):定义项目构建配置和依赖关系。
  • application.properties application.yml :存放Spring Boot配置信息。

一个典型的Spring Boot项目结构示例如下:

my-spring-boot-app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── myapp/
│   │   │               ├── MyApplication.java
│   │   │               ├── controller/
│   │   │               ├── service/
│   │   │               └── repository/
│   │   └── resources/
│   │       ├── static/
│   │       ├── templates/
│   │       └── application.properties
│   └── test/
│       └── java/
│           └── com/
│               └── example/
│                   └── myapp/
│                       └── MyApplicationTests.java
└── pom.xml

2.2.2 application.properties配置详解

application.properties 文件是Spring Boot项目中非常重要的配置文件,它允许开发者自定义应用的行为而无需修改代码。它通常包含数据库连接信息、服务端口、日志级别等配置。以下是一些常见的配置项:

# 服务器配置
server.port=8080

# 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=secret

# 日志配置
logging.level.root=INFO
logging.level.com.example.myapp=DEBUG

# 应用上下文路径
server.servlet.context-path=/myapp

# 服务器端口
server.port=8080

# 会话cookie配置
server.servlet.session.cookie.http-only=true
server.servlet.session.timeout=30

# 应用配置
spring.application.name=MySpringBootApp

2.3 Spring Boot与Maven的集成

2.3.1 Maven依赖管理基础

Maven是一种项目管理和综合工具,它依赖于一个中央信息片段XML文件(pom.xml),其中包含了项目的构建配置、开发依赖和报告。在Spring Boot项目中,Maven被用来管理项目依赖,定义构建生命周期和生成可执行的jar文件。

一个基本的 pom.xml 文件结构通常包括以下元素:

  • <modelVersion> :定义POM使用的对象模型版本。
  • <groupId> :项目的组织唯一标识符。
  • <artifactId> :项目的唯一标识符。
  • <version> :项目的版本号。
  • <dependencies> :项目所依赖的库。
  • <build> :定义编译和打包等构建时的设置。

示例 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-spring-boot-app</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>my-spring-boot-app</name>
    <description>Demo project for Spring Boot application</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 其他依赖项 -->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.3.2 通过Maven构建Spring Boot应用

使用Maven构建Spring Boot应用非常简单,只需要几个步骤即可完成:

  1. 安装Maven,并确保它已经添加到系统的环境变量PATH中。
  2. 打开命令行或终端,切换到项目根目录下(包含 pom.xml 文件的目录)。
  3. 执行 mvn clean install 命令,这将会清理旧的构建结果,并安装项目到本地Maven仓库。
  4. 运行 mvn spring-boot:run 命令,将启动Spring Boot应用。
  5. 如果需要打包应用,可以执行 mvn clean package ,Maven将构建出一个可执行的jar文件。

该jar文件位于 target 目录下,可以通过运行 java -jar target/my-spring-boot-app-0.0.1-SNAPSHOT.jar 命令来启动应用。

3. JSP技术的Web开发

3.1 JSP基础与语法

3.1.1 JSP的基本概念与组成

Java Server Pages(JSP)是一种基于Java的服务器端技术,用于创建动态的网页内容。JSP页面通常被编译为Servlet,并由Java服务器执行,支持将静态的HTML内容和动态生成的Java代码结合在一起。JSP文件通常以 .jsp 为扩展名。

一个JSP页面可以分为几个主要部分:

  • 指令(Directives):用于设置页面级别的指令,如页面依赖的类、引用的库、错误页面等。
  • 脚本元素(Scripting elements):用于插入Java代码。
  • 表达式(Expressions):用于输出Java表达式的值到页面中。
  • 动作(Actions):用于指定预定义的代码执行,如创建对象、转发请求等。
  • 注释(Comments):用于提供页面的说明信息,不会被发送到客户端。

3.1.2 JSP的指令和脚本元素

指令

JSP指令用于在页面中声明属性、导入包或者指定JSP页面的错误页面。常见的指令包括:

<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page errorPage="error.jsp" %>

上面的示例中, import 指令用于导入需要的类, contentType 指定输出内容类型和编码, errorPage 设置错误处理页面。

脚本元素

脚本元素包括声明、脚本片段和表达式。它们用于在JSP页面中插入可执行的Java代码。

  • 声明:用于声明变量或方法,它们的生命周期和JSP页面的生命周期一样。
<%! int a = 10; %>
  • 脚本片段:包含可以在Servlet的 _jspService 方法中执行的任何有效的Java代码。
<% String b = "Hello"; %>
  • 表达式:用于输出变量或表达式的值。
<%= a + b %>

3.1.3 JSP的动作

动作可以分为标准动作和自定义动作。标准动作由JSP规范定义,并用于执行通用任务,如请求转发、包含页面等。自定义动作由开发者或第三方库定义。

常见的标准动作包括:

  • <jsp:forward> :用于请求转发到另一个资源。
  • <jsp:param> :用于添加参数到请求。
  • <jsp:include> :用于包含其他资源的输出。

例如:

<jsp:forward page="anotherPage.jsp" />

通过JSP的这些基础和语法,开发者可以创建灵活且动态的网页应用,让数据和页面逻辑紧密结合,极大地提高了Web开发的效率和可维护性。

在JSP与JavaBean的数据交互章节,我们将进一步深入了解如何通过JavaBean封装和处理业务数据,以及JSP页面如何与这些JavaBean进行交互。

4. MySQL数据库集成

4.1 MySQL数据库设计

4.1.1 数据库设计的原则和步骤

在进行数据库设计时,我们遵循一系列的原则和步骤来确保设计的高效性、扩展性和维护性。首先,要根据实际需求确定数据库的范围,这包括确定需要存储的数据类型、数据间的关系以及数据的使用频率。然后,定义实体并确定实体属性,设计表结构以及实体间的关系,确保满足第三范式,以避免数据冗余。

接着,应进行逻辑设计,将实体转化为数据库表,确保为每个表选择合适的数据类型和大小,同时设置主键和外键约束来维护数据的完整性。此外,设计索引以优化查询性能。在确定了所有这些设计决策之后,进行物理设计,包括选择合适的存储引擎以及配置其他数据库特有的优化选项。

为了确保设计的灵活性和扩展性,在设计过程中,需要考虑到未来可能的需求变化,预留一些可扩展的空间,比如设计额外的字段来存储动态信息,或者使用灵活的数据类型。在设计完成之后,通过编写SQL脚本来创建数据库,并用真实的测试数据填充数据库进行测试,验证设计的合理性和实用性。

4.1.2 创建用户登录注册相关的数据库表结构

为了实现用户登录注册功能,我们需要创建至少两张表:一张是用户表(user),用于存储用户的基本信息,包括用户名、密码等;另一张是权限表(role),用于定义用户权限的种类。下面是一个简单的示例SQL脚本,用于创建这两张表:

CREATE TABLE IF NOT EXISTS `user` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL,
  `password` VARCHAR(50) NOT NULL,
  `email` VARCHAR(100),
  PRIMARY KEY (`id`),
  UNIQUE INDEX `username_UNIQUE` (`username` ASC)
);

CREATE TABLE IF NOT EXISTS `role` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `name_UNIQUE` (`name` ASC)
);

在用户表中,我们为每条记录分配了一个唯一的ID号(id),以及用户名(username)、密码(password)等字段。其中用户名设置了唯一索引(username_UNIQUE),以避免重复注册。角色表(role)用来存储不同的用户角色信息,比如管理员、普通用户等。

4.2 实体类的创建与配置

4.2.1 实体类映射数据库表

在Java中,我们通过定义实体类(Entity)来映射数据库中的表。使用JPA(Java Persistence API)注解,可以将实体类的属性与数据库表的列进行关联。比如,对于用户表(user),我们可以创建一个对应的实体类 User

import javax.persistence.*;

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    @Column(nullable = false)
    private String password;

    private String email;

    // 其他字段、getter和setter方法省略
}

User 类中, @Entity 注解标识了这个类为一个实体类, @Table(name = "user") 注解指定了该实体类映射到数据库中的 user 表。 @Id 注解定义了主键, @GeneratedValue(strategy = GenerationType.IDENTITY) 注解表示主键的生成策略是自增长。 @Column 注解用来映射实体类属性到数据库表的列,其中 nullable = false 表示该字段不允许为空, unique = true 表示该字段的值在数据库中是唯一的。

4.2.2 JPA注解及其实体类配置

为了进一步配置实体类,我们通常还会使用 @Entity @Table 之外的其他JPA注解,比如 @Column @OneToMany @ManyToOne 等,来控制实体类和数据库表之间的映射细节。

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name = "role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String name;

    @OneToMany(mappedBy = "role", fetch = FetchType.LAZY)
    private List<User> users;

    // 其他字段、getter和setter方法省略
}

在这个 Role 实体类中, @OneToMany 注解表示一个角色可以对应多个用户, mappedBy 属性指定了在多对一关系中由对方(即User实体)维护关系, fetch = FetchType.LAZY 表示当通过角色查询用户列表时,用户信息是按需加载的,这样可以提升性能,尤其是在用户列表数据量较大时。

4.3 数据源和JPA配置

4.3.1 配置数据源

在Spring Boot项目中,数据源(DataSource)通常通过配置文件进行配置。具体来说,可以在 application.properties application.yml 文件中指定数据源的URL、用户名和密码,以及数据源的驱动类名。

# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=pass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

配置数据源后,Spring Boot将自动配置 DataSource 的bean,无需手动配置。此外,还可以通过在Spring Boot应用中配置 DataSourceBuilder 来自定义数据源。

4.3.2 JPA配置详解

JPA配置通常在 application.properties application.yml 文件中完成,可以配置持久化单元(persistence unit)、事务管理器(transaction manager)等。

# application.properties
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
  • spring.jpa.hibernate.ddl-auto :这个配置项用于控制Hibernate创建表的行为, update 表示根据实体类自动更新数据库表结构。
  • spring.jpa.show-sql :此配置项控制是否在控制台打印SQL语句,有助于调试。
  • spring.jpa.properties.hibernate.dialect :指定数据库使用的方言,这确保了Hibernate生成的SQL语句能被MySQL正确理解和执行。

4.4 Repository接口的定义与操作

4.4.1 创建Repository接口

为了简化数据访问操作,Spring Data JPA提供了一套基于约定优于配置的Repository接口。我们只需要定义接口,Spring Data JPA会为我们提供相应的方法实现。

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

这里, UserRepository 接口继承了 JpaRepository 接口,其中 User 是实体类, Long 是实体类主键的类型。通过继承 JpaRepository 接口,我们已经获得了基本的CRUD操作方法。 findByUsername 方法是根据用户名查找用户,这是Spring Data JPA根据方法名约定自动生成的方法。

4.4.2 使用JPA Query实现数据操作

JPA不仅提供了基于方法名约定的查询方法,还支持使用JPQL(Java Persistence Query Language)或原生SQL查询来实现复杂的数据操作。我们可以通过 @Query 注解来定义这些查询。

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.username = :username")
    User findByUsername(@Param("username") String username);
    @Query(value = "SELECT * FROM user WHERE username = :username", nativeQuery = true)
    User findByUsernameNative(@Param("username") String username);
}

在上述代码中, findByUsername 方法首先定义了通过JPQL查询来获取用户实例,其中 :username 是占位符,用于传递参数。然后, findByUsernameNative 方法展示了如何使用原生SQL查询来获取用户,其中 nativeQuery = true 表示使用原生SQL查询。

我们通过这种方式可以轻松地实现复杂的查询逻辑,并且将数据库操作代码与业务逻辑分离,提高代码的可维护性和可读性。

5. 应用的运行与测试

5.1 项目构建与运行

5.1.1 Maven项目的构建过程

在本小节中,我们将了解如何使用Maven来构建我们的SpringBoot+JSP+MySQL集成Demo项目。Maven是一个项目管理和构建自动化工具,它基于项目对象模型(POM)的概念,可以通过简单的一组约定来管理项目的构建、报告和文档。

为了构建项目,首先确保你已经在你的机器上安装了Maven,并配置了环境变量。然后在项目根目录打开命令行工具,执行以下命令来构建项目:

mvn clean package

这个命令将执行清理操作(删除之前构建生成的target目录),并开始打包过程,最终生成一个可执行的JAR文件。构建过程中,Maven将会下载所有必需的依赖,执行测试,并将项目打包。

5.1.2 启动Spring Boot应用

在Maven构建完成后,我们得到了一个可执行的JAR文件,通常位于 target/ 目录下。接下来,我们将使用Java命令来启动这个Spring Boot应用。

在命令行中,切换到JAR文件所在的目录,然后运行以下命令:

java -jar your-application.jar

请将 your-application.jar 替换为你的实际JAR文件名。当Spring Boot应用启动时,你应该会看到类似于下面的日志输出,表明应用已成功启动:

.   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
/  ___)| |_)| | | | | || (_| |  ) ) ) )
\____/| .__/|_| |_|_| |_\__, | / / / /
       |_|             |___/

接下来,打开浏览器并输入 http://localhost:8080 ,如果一切正常,你应该能看到你的Web应用的首页。

5.2 功能测试与调试

5.2.1 测试登录注册功能

登录和注册是Web应用中常见的功能,为了测试这些功能是否正常工作,你需要模拟用户的行为来验证功能的正确性。

首先,访问注册页面并创建一个新用户,然后使用注册的账户登录应用。确保每一步都严格按照用户流程进行操作,并检查是否有任何错误信息或异常行为。

5.2.2 调试与问题排查

如果在测试过程中发现任何问题,你可以使用IDEA自带的调试工具来帮助你定位问题。设置断点,逐步执行代码,查看变量的值以及程序的执行流程。

要启动调试模式,你需要在IDEA中右键点击要运行的类或方法,选择 Debug 选项。如果你已经在运行模式下启动了应用,你可以在需要调试的地方添加断点,然后通过Debug视图重新启动应用。

5.3 Spring Security安全配置

5.3.1 安全框架Spring Security介绍

Spring Security是一个功能强大、可高度定制的身份验证和访问控制框架,它在Spring生态系统中扮演着重要的角色。Spring Security提供了全面的安全服务,包括但不限于Web安全、方法安全、活动用户管理等。

5.3.2 配置Spring Security实现用户认证与授权

为了实现用户认证与授权,你需要在你的Spring Boot应用中配置Spring Security。以下是一个简单的Spring Security配置示例:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER");
    }
}

在这个配置中,我们使用内存中的认证机制定义了一个用户,并允许访问首页和登录页面。

5.4 应用的性能优化与维护

5.4.1 性能优化策略

性能优化是确保应用稳定和高效运行的关键。下面是一些常见的性能优化策略:

  • 数据库连接池优化:调整连接池的参数,如最大连接数、最小空闲数等。
  • 缓存的使用:合理使用缓存可以减少数据库的访问次数,提升性能。
  • 异步处理:对于耗时的操作,使用异步处理可以提升用户体验。
  • 代码优化:优化热点代码,减少不必要的计算和资源消耗。

5.4.2 应用维护的最佳实践

应用的维护不应该仅限于发布后,应该从一开始就考虑到维护性。以下是维护应用的一些最佳实践:

  • 日志记录:详细记录操作日志,以便于问题追踪和性能监控。
  • 监控:实施应用监控,定期检查应用的健康状态。
  • 备份:定期备份数据库和应用配置,以防数据丢失。
  • 文档:编写和维护清晰的开发和运营文档,以减少信息不对称和知识传递的成本。
  • 定期更新:定期更新依赖库和框架,以确保系统安全和稳定。

通过本章的介绍,我们已经了解了如何运行和测试SpringBoot+JSP+MySQL集成的Demo项目,包括项目的构建、运行、功能测试、安全配置以及性能优化和维护的最佳实践。这些知识点将有助于开发出更健壮、更安全、更高效的Web应用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本教程指导初学者在IntelliJ IDEA中使用Spring Boot、JSP和MySQL数据库搭建一个基础的登录注册系统。首先介绍Spring Boot框架的便利性,其次讨论Java编程语言和JSP在Web开发中的应用,以及MySQL数据库的高效管理。教程详细阐述了从创建项目到配置数据库、实体类、数据源、JPA、Repository接口、Service层、Controller以及JSP页面的每一步流程,还涉及到了Web安全配置。通过实践这个Demo项目,学习者可以掌握后端开发的基础和关键集成技术。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值