SpringBoot应用开发

1.如何配置开发环境(JDK、Maven、IDEA等);

一、安装和配置JDK

  1. 下载JDK

    • 访问Oracle官网或其他OpenJDK发行版网站,如AdoptOpenJDK,下载适合你操作系统的JDK版本。建议使用JDK 17或更高版本。
  2. 安装JDK

    • 运行下载的JDK安装包,并按照安装向导的指示进行操作。部分操作系统可能需要管理员权限。
    • 选择JDK的安装路径,可以自定义路径或安装至默认路径。
  3. 配置环境变量

    • 打开系统设置中的环境变量窗口。
    • 新建系统变量,变量名为JAVA_HOME,变量值为JDK的安装路径。
    • 在系统变量中找到Path变量,点击编辑,在编辑窗口中点击“新建”,输入%JAVA_HOME%\bin
    • 保存所有设置。
  4. 验证安装
    • 打开命令提示符或终端窗口,输入java -version,如能够正确显示Java版本信息,则说明安装成功。

二、安装和配置Maven

  1. 下载Maven

    • 访问Apache Maven官方网站,下载最新版本的Maven二进制压缩包。
  2. 安装Maven

    • 解压下载的Maven压缩包至任意位置,建议解压至一个稳定的目录中,如C:\Program Files\Apache\maven(Windows)或/usr/local/apache-maven(macOS/Linux)。
  3. 配置环境变量

    • 新建系统变量,变量名为MAVEN_HOME,变量值为Maven的解压路径。
    • 在系统变量中找到Path变量,点击编辑,在编辑窗口中点击“新建”,输入%MAVEN_HOME%\bin
    • 保存所有设置。
  4. 验证安装
    • 打开命令提示符或终端窗口,输入mvn -version,如能够正确显示Maven版本信息,则说明安装成功。
  5. 配置Maven仓库

    • 打开Maven的安装目录,进入conf文件夹,找到settings.xml配置文件。
    • 使用文本编辑器打开settings.xml文件,配置本地仓库路径和远程仓库地址。例如,可以配置阿里云远程仓库以提高依赖下载速度。

三、安装和配置IntelliJ IDEA

  1. 下载IDEA

    • 访问JetBrains官网,下载IntelliJ IDEA社区版,该版本是免费的,适合大多数开发需求。
  2. 安装IDEA

    • 运行下载的IDEA安装包,并按照安装向导的指示进行操作。
    • 在安装向导中,可以选择安装位置和其他选项。
  3. 启动和激活IDEA

    • 安装完成后,通过桌面上的快捷方式或启动菜单中的图标打开IntelliJ IDEA。
    • IDEA第一次启动时,会出现欢迎界面,可以选择“Evaluate for free”免费试用30天,或选择“Activate”进行激活。激活可以通过购买正式激活码或使用免费的学生许可证来完成。
  4. 配置IDEA

    • 打开IDEA设置,配置JDK版本。
    • 配置Maven,指定Maven的安装路径和settings.xml文件的存放路径。

四、创建Spring Boot项目

  1. 使用Spring Initializr创建项目

    • 打开IDEA,选择“新建项目”。
    • 选择“Spring Initializr”,点击“下一步”。
    • 填写项目信息,如Group、Artifact、Name、Package name等。
    • 选择JDK版本和依赖项,如Spring Web、Spring Data JPA、Spring Boot DevTools等。
    • 点击“完成”,IDEA会自动生成项目结构和必要的文件。
  2. 运行项目

    • 在IDEA中找到主类(通常是Application类),右键点击该类,选择“运行”。
    • 控制台中会显示启动日志,如看到类似“Tomcat started on port(s): 8080”的信息,说明项目启动成功。
    • 打开浏览器,访问http://localhost:8080,如项目中没有定义任何接口,则可以创建一个简单的控制器进行测试。

2.如何快速搭建SpringBoot项目;

方法一:使用Spring Initializr在线生成项目

  1. 访问Spring Initializr网站

  2. 配置项目参数

    • 在网站上填写项目的基本信息,如Project(选择Maven或Gradle)、Language(选择Java)、Spring Boot版本、Group和Artifact(分别输入项目组织名和项目名称)、Name(项目名称,会自动根据Group和Artifact生成)、Description(项目描述,可选)、Package Name(包名,自动生成,通常与Group相同)、Packaging(选择Jar或War)等。
    • 根据项目需求,选择相应的依赖项,如Spring Web、Spring Data JPA、MySQL Driver等。
  3. 生成并下载项目

    • 点击“Generate”按钮,生成项目压缩包。
    • 下载压缩包并解压,将项目导入到IDE(如IntelliJ IDEA或Eclipse)中。

方法二:使用IDE内置功能创建项目

以IntelliJ IDEA为例:

  1. 打开IDEA并创建新项目

    • 打开IntelliJ IDEA,选择“Create New Project”。
    • 在左侧的项目类型列表中,选择“Spring Initializr”。
  2. 填写项目信息

    • 填写Group、Artifact等信息,这些信息与Spring Initializr网站上的配置类似。
    • 在Dependencies选项中,选择你需要的依赖项。
  3. 完成项目创建

    • 点击“Finish”,IDEA会自动下载并设置项目,包括生成pom.xml文件、创建项目结构等。

方法三:手动创建项目并配置依赖

  1. 创建项目目录结构
    • 手动创建一个新的项目目录,并在其中创建src/main/java、src/main/resources等子目录。
  2. 创建pom.xml文件
    • 在项目根目录下创建pom.xml文件,并配置项目的基本信息和依赖项。
    • 可以从Spring Initializr网站或其他Spring Boot项目中复制一个pom.xml文件的模板,并根据需要进行修改。
  3. 添加依赖和配置
    • 在pom.xml文件中添加所需的Spring Boot依赖项,如spring-boot-starter-web、spring-boot-starter-data-jpa等。
    • 在src/main/resources目录下创建application.properties或application.yml文件,并配置项目的相关属性,如数据库连接信息、服务器端口等。
  4. 创建主类和控制器
    • 在src/main/java目录下创建项目的包结构,并在其中创建主类(包含main方法的类,通常带有@SpringBootApplication注解)和控制器类(带有@RestController或@Controller注解的类)。
  5. 运行项目

3.如何在SpringBoot中整合持久层框架(Mabatis、Mabatis-Plus、JPA等);

一、整合MyBatis

  1. 引入依赖

    pom.xml文件中添加MyBatis和数据库驱动的依赖。例如:

    <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>版本号</version>
    </dependency>
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>版本号</version>
    </dependency>
  2. 配置数据源

    application.propertiesapplication.yml文件中配置数据库连接信息。例如:

    spring.datasource.url=jdbc:mysql://localhost:3306/mydb
    spring.datasource.username=root
    spring.datasource.password=password
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  3. 创建Mapper接口和对应的XML文件

    Mapper接口定义数据库操作方法,XML文件编写SQL语句。

  4. 配置MyBatis

    (可选)在application.ymlapplication.properties文件中配置MyBatis的其他属性,如映射器位置、类型别名等。

二、整合MyBatis-Plus

  1. 引入依赖

    pom.xml文件中添加MyBatis-Plus的依赖。例如:

  2. 配置数据源

    与MyBatis的配置相同。

  3. 创建实体类

    使用MyBatis-Plus提供的注解标注实体类。

  4. 创建Mapper接口

    Mapper接口继承自MyBatis-Plus的BaseMapper接口。

  5. 配置MyBatis-Plus

    (可选)在application.ymlapplication.properties文件中配置MyBatis-Plus的全局策略,如主键策略、字段策略等。

三、整合JPA

  1. 引入依赖

    pom.xml文件中添加Spring Data JPA和数据库驱动的依赖。例如:

  2. 配置数据源

    application.propertiesapplication.yml文件中配置数据源信息。例如:

  3. 创建实体类

    使用JPA注解标注实体类,如@Entity@Table@Id@GeneratedValue等。

  4. 创建Repository接口

    Repository接口继承自Spring Data JPA提供的JpaRepositoryCrudRepository接口。

  5. 配置JPA

    (可选)在application.ymlapplication.properties文件中配置JPA的其他属性,如命名策略、查询缓存等。

4.如何进行数据缓存管理。 

一、引入缓存依赖

首先,你需要在pom.xml文件中引入Spring Boot的缓存依赖。这通常是通过添加spring-boot-starter-cache依赖来实现的。例如:

二、配置缓存管理器

Spring Boot提供了多种缓存管理器实现,包括ConcurrentMapCacheManagerEhCacheCacheManagerRedisCacheManager等。你可以根据自己的需求选择合适的缓存管理器,并在application.propertiesapplication.yml文件中进行配置。

例如,如果你选择使用默认的ConcurrentMapCacheManager,则无需额外配置,Spring Boot会自动为你创建一个简单的内存缓存。如果你需要使用Redis作为缓存,则需要配置Redis连接信息,并添加spring-boot-starter-data-redis依赖。

三、启用缓存支持

在你的Spring Boot应用程序的主类上添加@EnableCaching注解,以启用基于注解的缓存支持。例如:

四、使用缓存注解

Spring Boot提供了多个缓存注解,包括@Cacheable@CachePut@CacheEvict等,你可以将这些注解应用于需要缓存的方法上。

  1. @Cacheable:用于声明某个方法的返回值是可缓存的。当方法被调用时,Spring会先检查缓存中是否存在对应的值。如果存在,则直接返回缓存中的值;如果不存在,则调用方法并缓存返回值。

  2. @CachePut:与@Cacheable类似,但@CachePut总是会执行方法,并将结果放入缓存中。这通常用于更新缓存中的值。

  3. @CacheEvict:用于从缓存中移除某个值。你可以指定要移除的缓存名称、键或所有缓存。

五、配置缓存属性

你可以通过注解的属性来配置缓存的详细行为。例如,cacheNamesvalue属性用于指定缓存的名称,key属性用于指定缓存数据的键,keyGenerator属性用于指定自定义的键生成器,unless属性用于指定在符合某条件下不进行数据缓存等。

六、监控和调试缓存

Spring Boot还提供了缓存监控和调试的功能。你可以使用Spring Boot Actuator来监控缓存的使用情况,包括缓存的命中率、缓存的大小等。此外,你还可以在开发过程中使用日志记录来调试缓存的行为。

 5.如何写一个具有RESTFul风格的后端接口。 

一、理解RESTful原则

  1. 资源导向:RESTful接口应该基于资源来设计,每个资源都有一个唯一的URI。

  2. 无状态:服务器不应该存储任何客户端的上下文信息,每次请求都应该包含足够的信息来处理。

  3. 自描述性消息:响应应该包含足够的信息来描述其内容和用途。

  4. HATEOAS(Hypermedia As The Engine Of Application State):客户端可以通过响应中的链接来发现可以执行的操作。

  5. 使用标准方法:通常使用HTTP方法(GET、POST、PUT、DELETE等)来操作资源。

二、设计URI

为资源设计清晰、简洁且易于理解的URI。例如:

  • /users:获取用户列表
  • /users/{id}:获取特定用户
  • /users(POST):创建新用户
  • /users/{id}(PUT):更新特定用户
  • /users/{id}(DELETE):删除特定用户

三、选择HTTP方法

  • GET:用于请求数据。
  • POST:用于提交数据以创建新资源。
  • PUT:用于更新现有资源。
  • DELETE:用于删除资源。
  • PATCH(可选):用于部分更新资源。

四、设计响应格式

通常使用JSON或XML作为响应格式。JSON因其简洁性和易用性而更受欢迎。

五、实现接口

使用你选择的编程语言和框架(如Spring Boot、Express.js等)来实现接口。以下是一个使用Spring Boot实现RESTful接口的简单示例:

@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
// GET /users
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
// GET /users/{id}
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userService.getUserById(id);
if (user == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(user);
}
// POST /users
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User createdUser = userService.createUser(user);
return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
}
// PUT /users/{id}
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User userDetails) {
User updatedUser = userService.updateUser(id, userDetails);
if (updatedUser == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(updatedUser);
}
// DELETE /users/{id}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
boolean deleted = userService.deleteUser(id);
if (!deleted) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.noContent().build();
}
}

六、处理错误和异常

为接口提供清晰的错误处理机制,确保客户端能够理解和处理错误。使用HTTP状态码来表示不同类型的错误(如404表示未找到资源,400表示客户端错误等)。

七、文档和测试

为接口编写文档,描述每个端点的功能、URI、HTTP方法、请求和响应格式以及可能的错误响应。使用工具(如Swagger)自动生成API文档。

编写单元测试来验证接口的正确性。使用工具(如JUnit、Mockito等)来模拟依赖项并测试接口的各种场景。

八、安全性和性能

考虑接口的安全性和性能需求。使用身份验证和授权机制来保护敏感资源。优化数据库查询和缓存策略以提高性能。

通过遵循这些步骤和注意事项,你可以编写出清晰、易于理解和维护的RESTful风格的后端接口。

 6.如何进行权限控制和安全控制。

一、权限控制

  1. 基于角色的访问控制(RBAC)

    RBAC是一种常见的权限控制方法,它通过将权限分配给角色,然后将角色分配给用户来简化权限管理。在Spring Boot中,可以使用Spring Security来实现RBAC。

    • 添加Spring Security依赖:在项目的pom.xml文件中添加Spring Security的依赖。
    • 配置Security配置类:创建一个SecurityConfig类,并配置角色和权限。例如,可以使用@EnableWebSecurity注解来启用Web安全,并使用HttpSecurity来配置请求授权规则。
    • 创建用户实体类和角色实体类:定义User和Role实体类,并设置它们之间的关系(例如,使用@ManyToMany注解)。
    • 实现用户服务和角色服务:创建UserService和RoleService类,用于管理用户和角色的数据。
    • 配置内存中的用户:在SecurityConfig类中,可以使用inMemoryAuthentication()方法来配置内存中的用户和密码,以及它们所拥有的角色。
  2. 基于属性的访问控制(ABAC)

    ABAC是一种更细粒度的权限控制方法,它基于用户、资源和环境属性来决定访问权限。在Spring Boot中,可以使用Spring Security的@PreAuthorize注解来实现ABAC。

    • 启用方法安全性:在SecurityConfig类中,使用@EnableGlobalMethodSecurity(prePostEnabled=true)注解来启用方法安全性。
    • 添加@PreAuthorize注解:在需要保护的方法上添加@PreAuthorize注解,并指定访问控制逻辑(例如,hasRole('ADMIN'))。
  3. 基于访问控制列表(ACL)的权限管理

    ACL是一种为每个资源定义访问控制列表的方法,指定哪些用户或角色可以访问该资源。在Spring Boot中,可以使用Spring Security的ACL模块来实现ACL。

    • 添加Spring Security ACL依赖:在pom.xml文件中添加Spring Security ACL的依赖。
    • 配置ACL数据源、服务和权限评估器:配置ACL所需的数据源、服务类和权限评估器。

二、安全控制

  1. 身份验证

    身份验证是确认用户是否具有有效凭证以访问系统的过程。在Spring Boot中,Spring Security提供了身份验证功能。

    • 配置身份验证:在SecurityConfig类中,使用AuthenticationManagerBuilder来配置身份验证。例如,可以使用内存中的用户数据进行身份验证,或者使用数据库中的用户数据进行身份验证。
    • 自定义身份验证过滤器:如果需要自定义身份验证逻辑,可以创建自定义的身份验证过滤器,并在SecurityConfig类中注册它。
  2. 授权

    授权是确认用户是否具有访问特定资源的权限的过程。在Spring Boot中,Spring Security提供了授权功能。

    • 配置授权规则:在SecurityConfig类中,使用HttpSecurity来配置授权规则。例如,可以使用antMatchers()方法来指定需要保护的URL路径,并使用hasRole()hasAuthority()方法来指定访问这些路径所需的角色或权限。
    • 方法级别的授权:除了URL级别的授权外,还可以使用@PreAuthorize@PostAuthorize注解来实现方法级别的授权。
  3. 密码加密

    为了保护用户密码的安全,应该对用户密码进行加密。在Spring Boot中,Spring Security提供了密码加密功能。

    • 配置密码编码器:在SecurityConfig类中,可以使用BCryptPasswordEncoder或其他密码编码器来对用户密码进行加密。
    • 存储加密后的密码:将加密后的密码存储在数据库中,而不是存储明文密码。
  4. 会话管理

    会话管理涉及管理用户的会话信息,包括会话的创建、销毁和超时等。在Spring Boot中,Spring Security提供了会话管理功能。

    • 配置会话管理器:在SecurityConfig类中,可以配置会话管理器来管理会话信息。例如,可以设置会话超时时间、会话固定攻击保护等。
    • 使用HTTPS:为了确保会话信息的安全性,应该使用HTTPS来加密传输的会话信息。
  5. 安全日志和监控

    为了检测和响应潜在的安全威胁,应该记录安全日志并进行监控。

    • 配置日志记录器:使用日志记录器(如Logback或Log4j)来记录安全事件和异常信息。
    • 监控安全事件:使用监控工具(如Spring Boot Actuator)来监控安全事件和性能指标。
  6. 防止常见安全漏洞

    为了防止常见的安全漏洞(如SQL注入、跨站脚本攻击等),应该采取相应的防护措施。

    • 使用预编译语句:在数据库操作中,使用预编译语句来防止SQL注入攻击。
    • 输入验证和消毒:对用户输入进行验证和消毒,以防止跨站脚本攻击和其他注入攻击。
    • 配置CSRF保护:在Spring Security中,可以启用CSRF保护来防止跨站请求伪造攻击

 7.消息服务和任务管理。

一、消息服务

消息服务在现代分布式系统中扮演着至关重要的角色,它不仅可以实现异步处理,还可以进行应用解耦和流量控制。Spring Boot与消息中间件的整合,使得这些功能更加容易实现。

  1. 消息中间件的作用

    • 异步处理:通过消息中间件,可以将耗时任务异步处理,提高系统的响应速度。
    • 应用解耦:消息中间件可以作为不同系统之间的桥梁,降低系统间的耦合度。
    • 流量削峰:在高并发场景下,消息中间件可以对请求进行缓冲,保护后端系统不被压垮。
    • 分布式事务管理:通过消息中间件,可以实现分布式系统中的事务一致性。
  2. 常见的消息中间件

    • ActiveMQ:基于JVM消息代理的规范,是JMS的实现。
    • RabbitMQ:一个开源的消息代理软件,实现了高级消息队列协议(AMQP),具有高可用性和高性能的特点。
    • Kafka:一种高吞吐量的分布式发布-订阅消息系统,它可以处理大量的数据。
    • RocketMQ:阿里巴巴开源的一款分布式消息中间件,支持事务消息、顺序消息、批量消息、定时消息等多种消息类型。
  3. Spring Boot与RabbitMQ的整合

    • 引入依赖:在Spring Boot项目中引入RabbitMQ的依赖。
    • 配置连接信息:在application.propertiesapplication.yml文件中配置RabbitMQ的连接信息。
    • 发送消息:通过RabbitTemplate类发送消息。
    • 接收消息:使用@RabbitListener注解在方法上接收消息。

二、任务管理

任务管理包括异步任务、事务管理和任务调度等功能,这些功能通过Spring提供的注解和配置,可以方便地实现。

  1. 异步任务

    • 开启异步任务支持:在主类上添加@EnableAsync注解,开启异步任务支持。
    • 创建异步方法:在需要异步执行的方法上添加@Async注解。
    • 调用异步方法:像调用普通方法一样调用这些异步方法,但需要注意的是,由于它们是异步执行的,因此调用线程不会等待它们完成。
  2. 事务管理

    Spring Boot支持声明式事务管理,可以通过注解或XML配置来实现。在声明式事务管理中,事务的边界是由AOP(面向切面编程)代理来划分的。

    • 引入依赖:在pom.xml文件中引入Spring Boot Starter JDBC或Spring Boot Starter Data JPA等依赖。
    • 配置数据源:在application.propertiesapplication.yml文件中配置数据源信息。
    • 开启事务支持:在主类上添加@EnableTransactionManagement注解,开启事务支持。
    • 使用事务注解:在需要事务支持的方法上添加@Transactional注解。
  3. 任务调度

    Spring Boot支持定时任务的执行,可以使用@Scheduled注解来标记方法为定时任务。

    • 开启定时任务支持:在主类上添加@EnableScheduling注解,开启定时任务支持。
    • 创建定时任务:在需要定时执行的方法上添加@Scheduled注解,并配置调度表达式或cron表达式。
    • 任务状态监控:可以使用Spring Boot Actuator来监控定时任务的执行状态和性能指标。

8.完整的项目开发流程等。 

一、项目准备

  1. 安装JDK
    • 确保安装了合适版本的Java Development Kit(JDK),Spring Boot通常需要JDK 8及以上版本。
  2. 安装IDE
    • 选择并安装一个集成开发环境(IDE),如IntelliJ IDEA或Eclipse,这些IDE提供了丰富的功能,方便开发Spring Boot项目。
  3. 配置构建工具
    • Spring Boot项目可以使用Maven或Gradle进行构建管理。确保在开发环境中正确配置了构建工具,并了解其基本使用方法。

二、项目创建

  1. 使用Spring Initializr
    • Spring Initializr是一个快速创建Spring Boot项目的工具。可以通过访问Spring Initializr官网或者在IDE中使用插件来创建项目。
    • 在创建项目时,需要选择项目的基本信息,如项目名称、包名、依赖等。根据项目需求选择合适的依赖,例如Web开发可以选择spring-boot-starter-web。

三、项目结构分析

典型的Spring Boot项目结构包括以下几个主要目录:

  • src/main/java:存放Java源代码。
  • src/main/resources:存放配置文件、静态资源等。
  • src/test/java:存放测试代码。
  • src/test/resources:存放测试资源文件。

四、开发业务逻辑

  1. 创建实体类
    • 根据业务需求创建实体类,通常使用Java对象来表示数据库中的表。
  2. 创建数据访问层(DAO)
    • 使用Spring Data JPA或其他数据库访问技术创建数据访问层,实现对数据库的操作。
  3. 创建服务层(Service)
    • 在服务层实现业务逻辑,调用数据访问层进行数据库操作。
  4. 创建控制器层(Controller)
    • 创建控制器类,处理HTTP请求,调用服务层实现业务逻辑,并返回响应结果。

五、配置文件

  • application.propertiesapplication.yml:项目的配置文件,可以配置数据库连接、日志级别等。
  • pom.xml(Maven)或build.gradle(Gradle):项目的构建文件,用于管理项目依赖。

六、配置数据库

  • 在配置文件中配置数据库连接信息,如数据库URL、用户名、密码等。
  • 根据项目需求选择合适的数据库,如MySQL、PostgreSQL等。

七、运行与测试

  1. 运行应用
    • 在IDE中运行主类的main方法,或使用构建工具(如Maven或Gradle)的命令来运行应用。
  2. 测试API
    • 使用Postman、Curl或其他API测试工具来测试应用的API接口。
    • 进行单元测试、集成测试等,确保应用的稳定性和可靠性。

八、打包与部署

  1. 打包应用

    • 使用构建工具(如Maven或Gradle)的命令来打包应用,生成可执行的JAR文件或WAR文件。
  2. 部署应用

    • 将生成的JAR文件或WAR文件上传到服务器,并使用相应的命令来运行应用。
    • 根据需要配置服务器环境,如Java环境、数据库连接等。

九、项目维护与优化

  • 监控应用的运行状态,及时发现并处理异常。
  • 根据业务需求进行功能迭代和优化。
  • 定期进行代码审查和重构,提高代码质量和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值