Spring Boot 应用开发课程技术心得

在学习 Spring Boot 应用开发课程的过程中,我收获颇丰,对项目开发流程、各类工具及技术有了深入的理解与实践。以下是我对课程中几个关键部分的心得总结。

一、完整的项目开发流程

  1. 需求分析
    在项目开始阶段,明确业务需求至关重要。这涉及与客户或相关利益者的沟通,梳理出系统的功能模块、性能要求、数据需求等。例如在开发一个博客系统时,需要确定用户注册登录、文章发布与管理、评论功能等具体需求。
  2. 设计阶段
    • 架构设计:基于 Spring Boot 框架,确定整体的架构分层,如表现层(Controller)负责处理 HTTP 请求与响应,业务层(Service)处理具体业务逻辑,数据访问层(Repository)负责与数据库交互。同时,考虑系统的扩展性与可维护性,合理设计模块间的接口与交互方式。
    • 数据库设计:根据业务需求,设计数据库的表结构。例如博客系统中,可能需要设计用户表、文章表、评论表等,定义各表的字段、主键、外键以及表与表之间的关系。
  3. 编码实现
    • 搭建 Spring Boot 项目:利用 Spring Initializr 快速创建项目骨架,配置好所需的依赖,如 Spring Web 用于 Web 开发、Spring Data JPA 用于数据库操作等。
    • 开发各层代码:在 Controller 层编写处理请求的方法,调用 Service 层的业务逻辑方法,Service 层调用 Repository 层进行数据持久化操作。例如,实现用户注册功能时,Controller 接收用户注册信息,Service 层进行数据验证与加密处理,Repository 层将用户信息保存到数据库。
  4. 测试阶段
    • 单元测试:使用 JUnit 对各个组件进行单元测试,确保每个方法的功能正确性。例如对 Service 层的业务方法进行测试,验证输入不同参数时的输出结果是否符合预期。
    • 集成测试:测试不同组件之间的集成是否正常,如 Controller 与 Service 之间、Service 与 Repository 之间的交互是否正确。可以使用 Spring Boot 提供的测试支持来模拟 HTTP 请求进行集成测试。
  5. 部署上线
    将开发好的项目部署到服务器上。可以选择云服务器,如阿里云、腾讯云等,通过打包项目为 Jar 包,上传到服务器并使用命令行启动。同时,配置好服务器的网络、安全组等相关设置,确保项目能够对外提供服务。

二、Postman 测试接口的使用教程

  1. 安装与启动
    从 Postman 官网下载并安装适合自己操作系统的版本,安装完成后启动 Postman。
  2. 创建请求
    • 选择请求方法:根据接口的定义,选择相应的 HTTP 请求方法,如 GET、POST、PUT、DELETE 等。例如,获取文章列表接口通常使用 GET 方法,创建文章接口使用 POST 方法。
    • 填写请求 URL:输入接口的完整 URL 地址,包括主机地址、端口号(如果有)和接口路径。例如:http://localhost:8080/api/articles
  3. 设置请求参数
    • GET 请求参数:如果是 GET 请求,参数通常在 URL 中以查询字符串的形式传递。例如:http://localhost:8080/api/articles?page=1&size=10,其中pagesize就是请求参数。
    • POST 请求参数:对于 POST 请求,若接口接收 JSON 数据,在 Body 选项卡中选择raw,并将数据格式设置为JSON (application/json),然后在文本框中输入 JSON 格式的请求数据。例如:
{
    "title": "New Article",
    "content": "This is the content of the new article"
}
  1. 发送请求与查看响应
    点击 Send 按钮发送请求,Postman 会显示接口的响应结果。在响应区域,可以查看响应状态码(如 200 表示成功,400 表示请求错误等)、响应头信息以及响应体内容。如果响应体是 JSON 格式数据,Postman 会自动格式化显示,方便查看。

三、JUnit 单元测试的简单教程

  1. 添加依赖
    在 Spring Boot 项目的pom.xml文件中添加 JUnit 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

  1. 创建测试类
    src/test/java目录下创建与被测试类相对应的测试类,命名规则通常为被测试类名 + Test。例如,要测试UserService类,创建UserServiceTest类。
  2. 编写测试方法
    • 测试方法的注解:使用@Test注解标记测试方法。例如:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testFindUserById() {
        Long userId = 1L;
        User user = userService.findUserById(userId);
        // 断言用户不为空
        org.junit.jupiter.api.Assertions.assertNotNull(user);
    }
}

  • 断言:使用Assertions类中的方法对测试结果进行断言,验证是否符合预期。如上述代码中使用assertNotNull方法断言findUserById方法返回的用户对象不为空。

四、函数式编程的 lambda 表达式教程

  1. 基本概念
    Lambda 表达式是 Java 8 引入的一种简洁的匿名函数表示方式,用于简化代码,尤其是在处理函数式接口时。函数式接口是指只包含一个抽象方法的接口。
  2. 语法结构
    Lambda 表达式的基本语法为:(参数列表) -> { 方法体 }。例如:

// 定义一个函数式接口
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

// 使用Lambda表达式实现函数式接口
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(3, 5); // result为8

  1. 常用场景
    • 集合遍历:在 Java 8 中,集合框架提供了forEach方法,支持使用 Lambda 表达式进行遍历。例如:

import java.util.Arrays;
import java.util.List;

public class LambdaExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        numbers.forEach((number) -> System.out.println(number));
    }
}

  • 排序:可以使用 Lambda 表达式定义排序规则。例如:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class LambdaExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        names.sort((a, b) -> a.compareTo(b));
        System.out.println(names);
    }
}

五、前后端分离博客系统的部分内容教程

  1. 后端开发
    • 用户模块:实现用户注册、登录功能。使用 Spring Security 进行用户认证与授权,对用户密码进行加密存储。例如,使用 BCryptPasswordEncoder 对密码进行加密:

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

public class UserService {
    private BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

    public void registerUser(User user) {
        String encryptedPassword = passwordEncoder.encode(user.getPassword());
        user.setPassword(encryptedPassword);
        // 保存用户到数据库
    }
}

  • 文章模块:提供文章的增删改查接口。在 Controller 层处理 HTTP 请求,调用 Service 层进行业务逻辑处理,如验证文章内容、检查用户权限等,Repository 层与数据库交互。例如:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/articles")
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @PostMapping
    public Article createArticle(@RequestBody Article article) {
        return articleService.createArticle(article);
    }
}

  1. 前端开发
    可以使用 Vue.js、React.js 等前端框架。以 Vue.js 为例,首先创建项目并安装相关依赖。
    • 创建组件:如创建ArticleList.vue组件用于展示文章列表,ArticleCreate.vue组件用于创建文章。在ArticleList.vue组件中,使用axios库发送 HTTP 请求获取文章列表数据:

<template>
    <div>
        <ul>
            <li v - for="article in articles" :key="article.id">{{ article.title }}</li>
        </ul>
    </div>
</template>

<script>
import axios from 'axios';

export default {
    data() {
        return {
            articles: []
        };
    },
    mounted() {
        axios.get('/api/articles')
         .then(response => {
                this.articles = response.data;
            });
    }
};
</script>

  • 路由配置:使用 Vue Router 进行路由管理,将不同的组件映射到不同的 URL 路径,实现单页应用的页面切换。

通过对 Spring Boot 应用开发课程的学习,我不仅掌握了完整的项目开发流程,还熟练运用了 Postman、JUnit 等工具,深入理解了 Lambda 表达式以及前后端分离开发模式,为今后开发更复杂的应用奠定了坚实的基础。

写一篇有关学习SpringBoot应用开发课程相关的技术心得 1.如何配置开发环境(JDK、Maven、IDEA等); 2.如何快速搭建SpringBoot项目; 3.如何在SpringBoot中整合持久层框架(Mabatis、Mabatis-Plus、JPA等); 4.如何进行数据缓存管理。 5.如何写一个具有RESTFul风格的后端接口。 6.如何进行权限控制和安全控制。 7.消息服务和任务管理。 8.完整的项目开发流程等。 9.postman测试接口的使用教程。 10.junit单元测试的简单教程。 11.函数式编程的lambda表达式教程。 12.前后端分离博客系统的部分内容教程。 13.统一请求响应的代码以及实现过程和结果。 14.使用jwt的带token的登录方式。

Spring Boot 应用开发课程技术心得

在学习 Spring Boot 应用开发课程的过程中,我深入探索了从环境搭建到项目完整开发的各个环节,掌握了一系列关键技术和工具的使用。以下是对课程中重点内容的详细心得总结。

1. 开发环境配置

JDK 配置

  1. 首先从 Oracle 官网或 OpenJDK 官网下载适合操作系统的 JDK 安装包。
  2. 安装过程中,记住安装路径。例如在 Windows 系统下,默认路径可能为C:\Program Files\Java\jdk11.0.12
  3. 配置系统环境变量:在系统变量中新建JAVA_HOME变量,值为 JDK 的安装路径。然后在Path变量中添加%JAVA_HOME%\bin%JAVA_HOME%\jre\bin,以便系统能够找到 Java 相关的可执行文件。

Maven 配置

  1. 从 Maven 官网下载二进制压缩包,解压到指定目录,如D:\apache - maven - 3.8.6
  2. 配置MAVEN_HOME系统环境变量,值为 Maven 的解压目录。在Path变量中添加%MAVEN_HOME%\bin
  3. 为了加快依赖下载速度,可以修改 Maven 的settings.xml文件,在<mirrors>标签内添加国内镜像源,例如阿里云镜像:

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

IDEA 配置

  1. 安装 IDEA,打开软件后,进入File -> Project Structure
  2. Project Structure中,选择Project,设置Project SDK为已安装的 JDK。
  3. 对于 Maven,在Settings -> Build, Execution, Deployment -> Build Tools -> Maven中,设置Maven home directory为 Maven 的安装目录,User settings fileLocal repository根据实际情况配置,通常User settings file指向 Maven 安装目录下的conf/settings.xmlLocal repository为本地仓库路径,若不配置,Maven 会使用默认路径。

2. 快速搭建 Spring Boot 项目

  1. 使用 Spring Initializr:访问https://start.spring.io/,在网页上选择项目的构建工具(如 Maven)、Spring Boot 版本、项目元数据(如 Group、Artifact)以及需要的依赖(如 Spring Web、Spring Data JPA 等)。生成项目后,下载压缩包并解压到本地。
  2. 在 IDEA 中创建:打开 IDEA,选择Create New Project,在左侧选择Spring Initializr,按照向导提示填写项目信息,选择依赖,完成项目创建。创建完成后,项目结构清晰,包含src/main/java(存放 Java 代码)、src/main/resources(存放配置文件)等目录。

3. 在 Spring Boot 中整合持久层框架

MyBatis 整合

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

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis - spring - boot - starter</artifactId>
    <version>2.2.0</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql - connector - java</artifactId>
    <scope>runtime</scope>
</dependency>

  1. 配置数据源:在application.properties文件中配置数据库连接信息,如:

spring.datasource.url=jdbc:mysql://localhost:3306/your - database - name
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver - class - name=com.mysql.cj.jdbc.Driver

  1. 创建 Mapper 接口和 XML 映射文件:在src/main/java目录下创建 Mapper 接口,定义数据库操作方法。在src/main/resources目录下创建对应的 XML 映射文件,编写 SQL 语句。例如,UserMapper.java接口和UserMapper.xml映射文件。
  2. 扫描 Mapper:在 Spring Boot 主类上添加@MapperScan注解,指定 Mapper 接口所在的包路径,如@MapperScan("com.example.demo.mapper")

MyBatis - Plus 整合

  1. 添加依赖:在pom.xml中添加 MyBatis - Plus 和数据库驱动依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis - plus - boot - starter</artifactId>
    <version>3.5.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql - connector - java</artifactId>
    <scope>runtime</scope>
</dependency>

  1. 配置数据源和 MyBatis - Plus:同 MyBatis 整合时配置数据源,同时可以在application.properties中配置 MyBatis - Plus 的一些属性,如mybatis - plus.mapper - locations=classpath:/mapper/*.xml
  2. 使用 BaseMapper:MyBatis - Plus 提供了BaseMapper接口,自定义 Mapper 接口继承BaseMapper后,无需编写 XML 映射文件即可使用通用的 CRUD 方法。例如,UserMapper.java继承BaseMapper<User>后,可直接使用insertselectById等方法。

JPA 整合

  1. 添加依赖:在pom.xml中添加 Spring Data JPA 和数据库驱动依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring - boot - starter - data - jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql - connector - java</artifactId>
    <scope>runtime</scope>
</dependency>

  1. 配置数据源和 JPA:在application.properties中配置数据库连接信息和 JPA 相关属性,如:

spring.datasource.url=jdbc:mysql://localhost:3306/your - database - name
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver - class - name=com.mysql.cj.jdbc.Driver
spring.jpa.database - platform=mysql
spring.jpa.hibernate.ddl - auto=update

  1. 创建实体类和 Repository 接口:使用@Entity注解标注实体类,使用@Repository或继承JpaRepository接口来创建数据访问层。例如,User.java实体类和UserRepository.java接口,UserRepository继承JpaRepository<User, Long>后可直接使用基本的 CRUD 方法。

4. 数据缓存管理

  1. 使用 Spring Cache:在pom.xml中添加 Spring Cache 依赖,如spring - boot - starter - cache
  2. 配置缓存管理器:在application.properties中配置缓存类型,例如使用 Caffeine 缓存:

spring.cache.type=caffeine

  1. 使用缓存注解:在 Service 层方法上使用@Cacheable@CacheEvict@CachePut等注解。@Cacheable用于从缓存中获取数据,如果不存在则执行方法并将结果存入缓存;@CacheEvict用于清除缓存;@CachePut用于更新缓存。例如:

@Service
public class UserService {

    @Cacheable(value = "users", key = "#id")
    public User findUserById(Long id) {
        // 从数据库查询用户
    }
}

5. 写一个具有 RESTful 风格的后端接口

  1. 使用 Spring Web:在pom.xml中添加spring - boot - starter - web依赖。
  2. 创建 Controller 类:使用@RestController注解标注类,使用@RequestMapping@GetMapping@PostMapping@PutMapping@DeleteMapping等注解来定义不同 HTTP 请求方法对应的接口。例如:

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.findUserById(id);
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
}

  1. 遵循 RESTful 规范:资源使用名词表示,如/users表示用户资源;使用不同的 HTTP 方法表示对资源的不同操作,GET 用于获取资源,POST 用于创建资源,PUT 用于更新资源,DELETE 用于删除资源。

6. 权限控制和安全控制

  1. 使用 Spring Security:在pom.xml中添加spring - boot - starter - security依赖。
  2. 配置 Security:创建一个配置类继承WebSecurityConfigurerAdapter,重写configure方法来配置认证和授权规则。例如:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers("/api/public/**").permitAll()
          .anyRequest().authenticated()
          .and()
          .formLogin()
          .and()
          .httpBasic();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
          .passwordEncoder(new BCryptPasswordEncoder());
    }
}

  1. 自定义用户认证:实现UserDetailsService接口,从数据库中加载用户信息进行认证。例如:

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
    }
}

7. 消息服务和任务管理

消息服务(使用 RabbitMQ 为例)

  1. 添加依赖:在pom.xml中添加spring - boot - starter - amqp依赖。
  2. 配置 RabbitMQ:在application.properties中配置 RabbitMQ 的连接信息,如:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

  1. 发送和接收消息:创建消息发送者,使用AmqpTemplate发送消息。创建消息接收者,使用@RabbitListener注解监听队列。例如:

@Component
public class MessageSender {

    @Autowired
    private AmqpTemplate amqpTemplate;

    public void sendMessage(String message) {
        amqpTemplate.convertAndSend("your - queue - name", message);
    }
}

@Component
public class MessageReceiver {

    @RabbitListener(queues = "your - queue - name")
    public void receiveMessage(String message) {
        System.out.println("Received message: " + message);
    }
}

任务管理(使用 Spring Task)

  1. 启用任务调度:在 Spring Boot 主类上添加@EnableScheduling注解。
  2. 创建定时任务方法:在 Service 类中创建方法,使用@Scheduled注解指定任务执行的时间间隔。例如:

@Service
public class TaskService {

    @Scheduled(fixedRate = 5000) // 每5秒执行一次
    public void scheduledTask() {
        System.out.println("Scheduled task is running...");
    }
}

8. 完整的项目开发流程

  1. 需求分析:与客户或相关方沟通,明确项目的功能需求、性能需求、数据需求等。例如开发博客系统,需要确定用户注册登录、文章发布、评论管理等功能。
  2. 设计阶段
    • 架构设计:确定使用 Spring Boot 框架,设计各层架构,如表现层、业务层、数据访问层。规划各层之间的接口和交互方式,考虑系统的扩展性和可维护性。
    • 数据库设计:根据业务需求设计数据库表结构,确定表之间的关系,如博客系统中用户表、文章表、评论表的设计。
  3. 编码实现:按照设计进行编码,实现各层功能。在 Controller 层处理 HTTP 请求,调用 Service 层业务逻辑,Service 层调用 Repository 层进行数据持久化。
  4. 测试阶段
    • 单元测试:使用 JUnit 对各个组件进行单元测试,确保每个方法功能正确。
    • 集成测试:测试不同组件之间的集成,如 Controller 与 Service、Service 与 Repository 之间的交互。
    • 系统测试:对整个系统进行功能、性能、安全等方面的测试。
  5. 部署上线:将项目打包为 Jar 包,部署到服务器上,如 Linux 服务器。配置服务器环境,启动项目,确保项目能够对外提供服务。

9. Postman 测试接口的使用教程

  1. 安装 Postman:从 Postman 官网下载并安装适合操作系统的版本。
  2. 创建请求
    • 选择请求方法:根据接口定义,选择 GET、POST、PUT、DELETE 等 HTTP 请求方法。
    • 填写请求 URL:输入接口的完整 URL,如http://localhost:8080/api/users/1
  3. 设置请求参数
    • GET 请求:参数在 URL 中以查询字符串形式传递,如http://localhost:8080/api/users?page=1&size=10
    • POST 请求:若接收 JSON 数据,在 Body 选项卡中选择raw,设置格式为JSON (application/json),输入 JSON 数据,如:

{
    "username": "testuser",
    "password": "testpassword"
}

  1. 发送请求并查看响应:点击 Send 按钮发送请求,Postman 显示响应状态码、响应头和响应体。响应体若为 JSON 数据,会自动格式化显示,方便查看。

10. JUnit 单元测试的简单教程

  1. 添加依赖:在pom.xml中添加spring - boot - starter - test依赖。
  2. 创建测试类:在src/test/java目录下创建与被测试类对应的测试类,命名规则通常为被测试类名 + Test。例如,测试UserService类,创建UserServiceTest类。
  3. 编写测试方法:使用@Test注解标记测试方法。例如:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testFindUserById() {
        Long userId = 1L;
        User user = userService.findUserById(userId);
        org.junit.jupiter.api.Assertions.assertNotNull(user);
    }
}

  1. 使用断言:使用Assertions类中的方法对测试结果进行断言,验证是否符合预期,如assertNotNullassertEquals等。

11. 函数式编程的 lambda 表达式教程

  1. 基本概念:Lambda 表达式是 Java 8 引入的匿名函数,用于简化代码,特别是处理函数式接口(只包含一个抽象方法的接口)。
  2. 语法结构(参数列表) -> { 方法体 }。例如:

// 定义函数式接口
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

// 使用Lambda表达式实现函数式接口
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(3, 5); // result为8

  1. 常用场景
    • 集合遍历:在 Java 8 集合框架中,可使用forEach方法结合 Lambda 表达式遍历集合。例如:

import java.util.Arrays;
import java.util.List;

public class LambdaExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        numbers.forEach((number) -> System.out.println(number));
    }
}

  • 排序:使用 Lambda 表达式定义排序规则。例如:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class LambdaExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        names.sort((a, b) -> a.compareTo(b));
        System.out.println(names);
    }
}

   通过对 Spring Boot 应用开发课程的学习,我不仅掌握了完整的项目开发流程,还熟练运用了 Postman、JUnit 等工具,深入理解了 Lambda 表达式以及前后端分离开发模式,为今后开发更复杂的应用奠定了坚实的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值