Spring Boot 多模块怎么统一管理

告别混乱配置:用Nacos配置中心统一管理Spring Boot 3多模块项目(附完整代码) 本文详细介绍了如何使用Nacos配置中心统一管理Spring Boot 3多模块项目的配置,解决微服务架构中的配置管理痛点。通过版本选择、环境搭建、多模块配置管理实战及高级技巧,帮助开发者实现配置的优雅管理,提升项目维护效率。附完整代码示例,助力快速落地。 阅读详情

在 Spring Boot 中,多模块项目是一种常见的架构模式,尤其适用于构建大型、复杂的应用程序。将应用程序拆分成多个模块可以提高代码的可维护性、可重用性和团队协作效率。然而,多模块项目也带来了一些管理上的挑战,例如依赖版本管理、构建配置管理、模块间的依赖关系管理等。 为了解决这些问题,统一管理变得至关重要。

下面我将详细解释 Spring Boot 多模块项目如何进行统一管理,并提供一些最佳实践和技巧。

一、为什么需要统一管理多模块 Spring Boot 项目?

在没有统一管理的情况下,多模块项目可能会遇到以下问题:

  1. 依赖版本冲突:

    • 每个模块独立管理依赖,容易引入不同版本的相同依赖库。
    • 版本不兼容可能导致运行时冲突、编译错误或不可预测的行为。
    • 排查和解决依赖冲突会变得非常耗时和复杂。
  2. 构建配置不一致:

    • 不同模块可能使用不同的 Maven 或 Gradle 插件版本和配置。
    • 构建过程不一致,可能导致不同模块的构建结果不一致,增加集成风险。
    • 维护和更新构建配置变得分散且容易出错。
  3. 重复配置:

    • 每个模块都需要重复配置一些通用的信息,例如 Spring Boot 版本、公共依赖、插件配置等。
    • 代码冗余,降低维护效率,修改时需要同步多个模块。
  4. 模块依赖关系混乱:

    • 模块间的依赖关系如果没有清晰地定义和管理,容易形成复杂的依赖环路或不必要的依赖关系。
    • 影响模块的编译顺序和构建效率,增加模块间的耦合度。
  5. 升级和维护困难:

    • 当需要升级 Spring Boot 版本或公共依赖库时,需要逐个模块进行修改和测试,工作量大且容易遗漏。
    • 维护成本高,升级风险大。

二、统一管理的核心思想

Spring Boot 多模块项目统一管理的核心思想是: 集中化配置,约定优于配置,减少重复性工作,提高一致性和可维护性。

主要通过以下几个方面来实现:

  1. 使用父模块 (Parent POM/Build Script):

    • 创建一个父模块作为整个项目的根模块。
    • 父模块的 pom.xml (Maven) 或 build.gradle (Gradle) 文件用于集中管理公共的配置和依赖。
    • 其他模块作为子模块,继承父模块的配置。
  2. 依赖管理 (Dependency Management):

    • 在父模块的 dependencyManagement 部分声明所有公共依赖的版本信息。
    • 子模块只需要声明依赖的 groupId 和 artifactId,版本信息从父模块继承。
    • 确保整个项目使用统一的依赖版本,避免版本冲突。
  3. 插件管理 (Plugin Management):

    • 在父模块的 pluginManagement 部分声明公共插件的版本和配置信息。
    • 子模块只需要声明需要使用的插件,版本和公共配置从父模块继承。
    • 保证整个项目使用一致的插件版本和配置,提高构建过程的一致性。
  4. 属性管理 (Property Management):

    • 在父模块的 properties 部分定义一些公共属性,例如 Spring Boot 版本、Java 版本、公共依赖版本等。
    • 子模块可以直接引用父模块定义的属性,方便统一修改和管理。
  5. 构建 Profile 管理 (Build Profile):

    • 在父模块中定义构建 Profile,例如 dev、test、prod 等,用于管理不同环境下的构建配置。
    • 子模块可以继承父模块的 Profile 配置,或者根据需要自定义 Profile。
  6. 模块依赖关系管理 (Module Dependency):

    • 在模块的 pom.xml 或 build.gradle 中明确声明模块之间的依赖关系。
    • Maven 或 Gradle 会根据依赖关系自动管理模块的编译顺序和构建顺序。

三、Maven 和 Gradle 的统一管理实践

无论是使用 Maven 还是 Gradle 构建工具,都可以实现 Spring Boot 多模块项目的统一管理。 下面分别介绍 Maven 和 Gradle 的实践方式:

1. Maven 多模块统一管理

  • 父模块 pom.xml 示例 (简化版):

    <?xml version="1.0" encoding="UTF-8"?>
    <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>parent-module</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>pom</packaging>  <!-- 父模块packaging必须为pom -->
    
        <modules>
            <module>module-a</module>
            <module>module-b</module>
            <module>module-c</module>
            </modules>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-boot.version>2.7.0</spring-boot.version>
            <commons-lang3.version>3.12.0</commons-lang3.version>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${spring-boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                    <version>${commons-lang3.version}</version>
                </dependency>
                <!-- 其他公共依赖 -->
            </dependencies>
        </dependencyManagement>
    
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <version>${spring-boot.version}</version>
                    </plugin>
                    <!-- 其他公共插件配置 -->
                </plugins>
            </pluginManagement>
        </build>
    
    </project>
    
  • 子模块 pom.xml 示例 (例如 module-a):

    <?xml version="1.0" encoding="UTF-8"?>
    <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>
        <parent>
            <groupId>com.example</groupId>
            <artifactId>parent-module</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <relativePath>../pom.xml</relativePath>  <!-- 指向父模块的pom.xml -->
        </parent>
    
        <artifactId>module-a</artifactId>
        <version>1.0.0-SNAPSHOT</version>  <!-- 版本号可以省略,默认继承父模块 -->
        <packaging>jar</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>  <!-- 版本号从父模块继承 -->
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>module-b</artifactId> <!-- 模块间依赖 -->
                <version>1.0.0-SNAPSHOT</version> <!-- 版本号从父模块继承,但显式声明更清晰 -->
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

Maven 统一管理关键点:

  • 父模块 packaging 为 pom: 声明父模块为 POM 类型,用于管理其他模块。
  • <modules> 标签: 在父模块中列出所有子模块。
  • <parent> 标签: 子模块 pom.xml 中使用 <parent> 标签指向父模块,建立继承关系。
  • <dependencyManagement>: 父模块中使用 dependencyManagement 集中管理依赖版本。
  • <pluginManagement>: 父模块中使用 pluginManagement 集中管理插件版本和配置。
  • 属性 properties: 父模块中定义公共属性,子模块可以直接引用。
  • relativePath: <parent> 标签中的 relativePath 指向父模块 pom.xml 的相对路径。
  • 模块间依赖: 使用 <dependency> 标签声明模块之间的依赖关系,groupId 和 version 保持一致。

2. Gradle 多模块统一管理

  • settings.gradle.kts (根目录): 声明项目包含的模块

    rootProject.name = "parent-module"
    include("module-a")
    include("module-b")
    include("module-c")
    
  • 根目录 build.gradle.kts (父模块 build script):

    plugins {
        java
        // 使用 Spring Boot 插件,但不应用到父模块 (apply false)
        id("org.springframework.boot") version "2.7.0" apply false
        id("io.spring.dependency-management") version "1.0.11.RELEASE" apply false
    }
    
    allprojects {
        group = "com.example"
        version = "1.0.0-SNAPSHOT"
    }
    
    subprojects {
        apply(plugin = "java")
        apply(plugin = "io.spring.dependency-management")
    
        repositories {
            mavenCentral()
        }
    
        dependencies {
            implementation("org.apache.commons:commons-lang3:3.12.0")
            // 其他公共依赖
        }
    
        dependencyManagement {
            imports {
                mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
            }
        }
    }
    
  • 子模块 module-a/build.gradle.kts 示例:

    plugins {
        id("org.springframework.boot")
        id("io.spring.dependency-management")
    }
    
    dependencies {
        implementation("org.springframework.boot:spring-boot-starter-web")
        implementation(project(":module-b")) // 模块间依赖
    }
    

Gradle 统一管理关键点:

  • settings.gradle.kts: 使用 include() 函数声明子模块。
  • 根目录 build.gradle.kts: 作为父模块的构建脚本,使用 subprojects {} 配置所有子模块的通用配置。
  • dependencyManagement: 在父模块中使用 dependencyManagement 导入 Spring Boot 的 BOM (Bill of Materials) 和管理公共依赖版本。
  • allprojects {}: 配置所有模块通用的属性 (例如 group, version)。
  • 模块间依赖: 使用 implementation(project(":module-b")) 声明模块之间的依赖关系。

四、最佳实践和技巧

  1. 明确模块划分: 合理划分模块边界,确保模块职责单一,高内聚低耦合。
  2. 父模块职责明确: 父模块只负责统一管理配置和依赖,不包含业务代码。
  3. 依赖版本统一: 始终在父模块的 dependencyManagement 中管理依赖版本,避免在子模块中显式指定版本。
  4. 公共依赖和插件集中管理: 将所有公共依赖和插件配置放在父模块中,减少子模块的重复配置。
  5. 使用属性管理: 使用父模块的 properties 定义公共属性,例如 Spring Boot 版本、公共依赖版本等,方便统一修改。
  6. 模块依赖清晰: 明确声明模块之间的依赖关系,避免循环依赖和不必要的依赖。
  7. 合理使用依赖 Scope: 根据依赖的用途选择合适的 Scope (例如 compile, runtime, test 等)。
  8. 使用构建 Profile: 合理使用构建 Profile 管理不同环境下的构建配置。
  9. 持续集成和自动化构建: 结合 CI/CD 工具,实现多模块项目的自动化构建、测试和部署。
  10. IDE 支持: 使用 IDE 的多模块项目支持功能,例如 IntelliJ IDEA 或 Eclipse,可以方便地管理和开发多模块项目。

五、总结

Spring Boot 多模块项目的统一管理是构建大型、可维护应用程序的关键。 通过使用父模块、依赖管理、插件管理、属性管理等技术,可以有效地解决多模块项目带来的管理挑战,提高开发效率、降低维护成本,并最终构建出更加健壮和可扩展的 Spring Boot 应用。

Spring Boot 3.0 + Java 17 微服务实战:用Gradle统一管理多模块依赖与版本,告别配置混乱 本文详细介绍了如何利用Gradle在Spring Boot 3.0和Java 17的微服务项目中实现多模块依赖与版本的统一管理。通过实战示例,展示了Gradle的声明式DSL、增量构建和灵活依赖解析等特性,帮助开发者告别配置混乱,提升工程化水平。 阅读详情

相关推荐

Spring Boot多模块打包与Maven实战指南

本章详细讲解了父模块在Spring Boot多模块项目中的作用、创建流程、依赖管理机制、模块间依赖配置以及常见问题的解决方案。通过合理配置父模块,可以有效提升项目的可维护性、构建效率和团队协作能力。下一章我们将深入探讨核心模块的设计与实现,包括核心业务逻辑的封装、领域模型的设计、模块测试与发布等内容,进一步夯实多模块项目的开发基础。抽象类和接口是核心模块中非常重要的设计元素。它们可以定义通用的行为规范,供子类或实现类继承或实现。逻辑说明。

weixin_34163588的博客 885

springboot整合之版本号统一管理

springboot整合实战 springboot整合之版本号统一管理。相信小伙伴们对于版本号的管理都很熟悉了,那我们在springboot中常见的版本管理有几种方式呢?

qq_35771266的博客 8245

Agent框架系列:1-低代码智能体平台深度解析Dify、Coze、n8n

Dify、Coze 和 n8n 是三大主流低代码智能体平台,各有侧重。Dify 适合企业级 AI 应用,具备强大的 RAG 和知识库管理能力,技术栈为 Python + React。Coze 由字节推出,主打零代码和快速原型开发,集成 60+ 插件,极适合非技术用户。n8n 以工作流自动化和系统集成为核心,支持 400+ 外部应用,基于 Node.js + Vue,扩展性极强。选择建议:非技术团队选 Coze,AI 应用选 Dify,复杂自动化与集成选 n8n。可根据实际需求混合使用,最大化平台优势。

3078

案例解析 SpringBoot 中的版本管理与依赖管理

一、入门案例 二、SpringBoot 的 parent 三、SpringBoot 的 starter 四、SpringBoot 的引导类

秀岩的博客 1670

GOM引擎单机传奇架设全攻略——从DBC2000配置到登录器生成

本文详细解析了使用GOM引擎架设单机传奇的完整流程,从DBC2000的安装配置、服务端部署、引擎控制器设置,到登录器生成与客户端补丁放置。文章重点解决了单机架设中的常见问题,如数据库路径配置、IP地址设置及Key.lic文件处理,旨在帮助玩家快速搭建稳定的个人游戏环境,体验GM乐趣。

weixin_28318011的博客 627

防火墙学习5---虚拟系统和跟系统通过路由表互访

虚拟系统与跟系统互访可分为虚拟系统访问根系统和跟系统访问虚拟系统。

weixin_48030849的博客 1030

SpringBoot多模块项目配置与依赖管理实例

SpringBoot多模块项目配置与依赖管理实例

末尾卡片和博主交流学习! 1718

企业微信群机器人配置全攻略:从零到消息推送的完整流程

本文详细介绍了企业微信群机器人的配置与使用全流程,从零开始指导如何创建机器人、获取Webhook地址,到通过HTTP请求发送文本、Markdown、图片及模板卡片等多种消息类型。内容涵盖核心的接口配置、安全实践及实战应用场景,帮助开发与运维团队快速构建自动化消息推送中枢,提升协作效率。

weixin_29231725的博客 837

对于一个多模块项目,如果管理项目依赖的版本?

对于一个多模块项目,如果管理项目依赖的版本?

NewBeeMu的博客 299

Agentic AI为教育行业赋能,提示工程架构师解析应用潜力

然而,即便是最先进的 LLMs,在面对复杂、动态、需要持续规划和调整的教育场景时,也常常显得力不从心,它们更像是强大的“问答机器”,而非真正意义上的“学习伙伴”或“教学助手”。在教育场景中,传统的 AI 工具可能只能回答学生提出的特定问题,或者根据预设的规则推送一些学习材料。无论您是教育技术领域的开发者、产品经理,还是一线的教育工作者、教育管理者,抑或是对 AI 教育应用充满好奇的研究者,本文都将为您提供宝贵的 insights,助您把握 Agentic AI 时代教育创新的脉搏。

架构师的AI之路,分享AI应用开发架构的学习与实践。 466

大模型LangChain面试题及参考答案(上)

明确的输入输出类型:函数参数需包含类型注解,返回值需定义清晰的数据结构(如JSON格式),便于LLM理解参数含义和调用方式。工具描述:通过文档字符串或独立的描述对象(如Tool类)说明函数的功能、参数用途及调用场景,供LLM判断是否需要调用。示例:定义一个计算两个数之和的工具函数@tool"""计算两个整数的和。参数:- a:第一个整数- b:第二个整数调用场景:当用户需要进行数值加法计算时使用。"""除了内置的。

大模型大数据攻城狮的专栏 1137

SpringBoot基于Maven构建多模块项目,统一管理依赖

通过IDEA,基于Maven构建SpringBoot多模块项目,通过父工程统一管理依赖,按功能划分模块,优化代码结构,方便分工合作。

王说一 1706

C#客户端对接工厂MES的方法

本文介绍了使用C#实现WebApi客户端与工厂MES系统交互的方法。主要包括四个步骤:1)配置工控机IP地址;2)获取服务器URL;3)创建HttpHelper帮助类实现单例模式HttpClient,提供异步POST请求方法;4)通过实例化帮助类实现设备状态数据的JSON格式发送与接收。该方案采用异步通信方式,支持超时处理,能够满足大多数MES系统交互需求,帮助工程师快速完成设备与MES系统的数据对接。文中给出了核心代码片段和完整的数据交互流程示例。

weixin_39832501的博客 264

告别混乱配置:用Nacos配置中心统一管理你的Spring Boot 3多模块项目

本文详细介绍了如何使用Nacos配置中心统一管理Spring Boot 3多模块项目的配置,解决微服务架构中配置分散的痛点。通过版本兼容性检查、项目骨架搭建、配置分层策略设计及实战案例,展示了如何实现公共配置集中管理、模块专属配置隔离和动态更新,提升开发效率和维护便捷性。

weixin_33716154的博客 450

“华为杯”研究生数学建模竞赛2016年-【华为杯】A题:多无人机协同任务规划

题分别求解,保证了攻击方无人机滞留在防御方雷达有效探测范围内的时间总和最小,接着,通过提出巡检待命无人机的设想,型无人机携带炸弹的具体清单和攻击的目标清单),保证攻击方的无人机滞留防御方雷。在使用基于贪心算法的覆盖法时,覆盖的目标点中必须首先不含配备雷达站的目标点。步优化保证攻击方的无人机滞留防御方雷达有效探测范围内的时间总和最小,需首先。的“灵巧”炸弹,采用抛投方式对地攻击,即投放后炸弹以飞机投弹时的速度作抛物。运动,当炸弹接近目标后,可主动寻的攻击待打击的目标,因此炸弹落点位于目标中。

getusushu的博客 1034

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

创建springboot多模块项目

使用maven多模块创建springboot项目

Lae77的博客 1572

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

从零到一:基于 IDEA 的 Spring Boot 多模块项目实战指南(Maven 架构)

从零到一:基于 IDEA 的 Spring Boot 多模块项目实战指南(Maven 架构)

EXIxiaozhou的博客 256

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

spring boot多模块项目的自动化部署

最近一直在看一些多模块项目的构建,其实多模块基本面可以这么理解下,就是将将其它的项目作为依赖导入到一个项目下。但是为了一次性构建所有模块,可以通过一个父模块实现,那么父模块中的核心配置如下。 &lt;parent&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot...

寻寻觅觅的专栏 3716

Maven多模块项目管理:基于SpringBoot单体项目的继承与聚合实战指南

本文系统讲解了Maven在SpringBoot单体项目中的多模块管理,主要内容包括: Maven继承与聚合机制:详解父POM配置、继承关系及packaging必须设为pom的原因; SpringBoot依赖管理:对比Parent与BOM方式的版本控制策略,解析核心starter的功能; 实战项目构建:演示典型的多模块项目结构设计,包含公共模块、数据层、业务层和Web层的完整配置方案。 通过合理的模块划分和依赖管理,可实现代码复用、统一版本控制和便捷的项目维护。文章提供了完整的POM配置示例,帮助开发者快速搭

LI_124301012的博客 994

idea创建父工程统一管理子工程

idea创建父工程统一管理子工程

cai_4的博客 1187

POM构造Spring boot多模块项目

多模块SpringBoot项目的核心是「父模块pom(管理依赖)+ 子模块jar(按分层拆分)<modules>;子模块关键:继承父模块 + 按需引入依赖 + 仅web模块作为启动模块;启动类必须扫描所有子模块的包,否则组件/Mapper无法被Spring容器识别。

weixin_39766667的博客 790

理解 maven 多模块项目依赖关系

语言功底差,直接上代码。然后再解释1。父pom&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sc...

生如夏花的博客 7408

springboot项目:maven 的pom文件详解;跳过测试打包,每个标签解释:热部署依赖、dependencyManagement标签、

前言 有时候做微服务或者单个应用时,pom文件不对,或者少一个依赖,导致编码出错,运行出错,会浪费很长时间,所以,特来写一篇博客,也算是对自己的加深印象吧。come on,baby pom.xml <!--热部署 2个pom 缺一不可--> <!--更改后端代码时,按 Ctrl+F9 即可--> <dependency> <groupId&gt...

冯安晨 2346

还在手动管理依赖版本?3步教你玩转Spring Boot BOM机制

告别繁琐版本冲突,高效掌握Spring Boot的依赖管理。通过引入Spring Boot BOM机制,统一管理依赖版本,适用于多模块项目和第三方库集成。只需3步配置,实现依赖自动对齐与升级。提升构建效率,值得收藏。

BreakVein的博客 1315

IDEA创建多模块Spring Boot项目

本文介绍了在IDEA 23.3版本中创建多模块Spring Boot项目的步骤

Hzzz_的博客 306

Spring Boot启动卡在Liquibase锁?多模块锁表问题终极解决方案

Spring Boot+Flowable服务启动时因Liquibase锁阻塞,日志显示持续等待changelog锁。问题根源在于Flowable多模块(Form、DMN等)各建独立锁表,异常终止导致锁未释放。解决方案: 1. 查询所有锁表:SHOW TABLES LIKE '%databasechangelogloc 2. 逐表清除锁状态:UPDATE ... SET LOCKED=0预防措施:配置模块独立Liquibase上下文、启用优雅停机,或统一管理数据库变更。有效解决多模块Liquibase锁冲突

weixin_45379332的博客 1402
上一篇: Spring Boot 中为什么 需要限流、降级和熔断?
下一篇: Java 注解 (Annotations)的定义和使用规则
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值