Spring Boot 3 步完成日志脱敏,简单实用~

logback自定义日志脱敏规则及脱敏开关(动态控制日志加密方式以及加密开关) 正则表达式实现日志脱敏。并实现日志脱敏开关,日志脱敏方式。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:blog.youkuaiyun.com/qq_40885085/

article/details/113385261

27c24908da06a6b984d24907fca71f76.jpeg


前言

在我们书写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的。

对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书写一个脱敏工具类,在打印日志的时候对特定特字段进行脱敏返回。

两种方式各有优缺点:

  • 第一种方式需要修改代码,不符合开闭原则。

  • 第二种方式,需要在日志方法的参数进行脱敏,对原生日志有入侵行为。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

自定义脱敏组件(slf4j+logback)

一个项目在书写了很多打印日志的代码,但是后面有了脱敏需求,如果我们去手动改动代码,会花费大量时间。如果引入本组件,完成配置即可轻松完成脱敏。(仅需三步可轻松配置)

一、自定义脱敏组件 - 脱敏效果演示

aa1ea9c187cec62fea242b11fca052bc.png 3fdcdbfb81bb136905bc4623f52004a7.png

二、自定义脱敏组件 - 使用方式

1、引入Jar包依赖

前提是你将Jar包打入本地仓库,Jar包地址见后文。

<dependency>
    <groupId>pers.liuchengyin</groupId>
    <artifactId>logback-desensitization</artifactId>
    <version>1.0.0</version>
</dependency>
2、替换日志文件配置类(logback.xml)

日志打印方式都只需要替换成脱敏的类即可,如果你的业务不需要,则无需替换。

①ConsoleAppender - 控制台脱敏
// 原类
ch.qos.logback.core.ConsoleAppender
// 替换类
pers.liuchengyin.logbackadvice.LcyConsoleAppender
②RollingFileAppender - 滚动文件
// 原类
ch.qos.logback.core.rolling.RollingFileAppender
// 替换类
pers.liuchengyin.logbackadvice.LcyRollingFileAppender
③FileAppender - 文件
// 原类
ch.qos.logback.core.FileAppender
// 替换类
pers.liuchengyin.logbackadvice.LcyFileAppender
替换示例:
<property name="CONSOLE_LOG_PATTERN"
          value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>

<!-- ConsoleAppender 控制台输出日志 -->
<appender name="CONSOLE" class="pers.liuchengyin.logbackadvice.LcyConsoleAppender">
    <encoder>
        <pattern>
            ${CONSOLE_LOG_PATTERN}
        </pattern>
    </encoder>
</appender>
3、添加脱敏配置文件(logback-desensitize.yml)

该配置文件应该放在resources文件下

3c618d40332cf7990c135917ccb32d04.png

三、自定义脱敏组件 - 脱敏规范

1、支持数据类型

八大基本类型及其包装类型、Map、List、业务里的Pojo对象、List<业务里的Pojo对象>、JSON字符串。

注:在配置文件中配置的时候,只需要配置对象里的属性值就行。

2、不支持的数据类型

List<八大基本类型及包装类型>,因为不知道脱敏的数据源具体是哪一个。

3、匹配规则

key + 分割符 + value,目前仅支持冒号(:)和等号(=),示例如下:

log.info("your email:{}, your phone:{}", "123456789@qq.com","15310763497");
log.info("your email={}, your cellphone={}", "123456789@qq.com","15310763497");
  • key:定义了对应需要脱敏的关键字,如上诉的email、phone等以及业务对象中的字段、Map中的Key、JSON中的Key

  • value:需要脱敏的值,如上诉的123456789@qq.com、15310763497。

4、日志规范

建议书写日志的时候尽量规范,对于key为中文的是没有办法脱敏的,规范程度可以见脱敏效果演示里的代码。

四、logback-desensitize.yml配置说明

> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:<https://github.com/YunaiV/yudao-cloud>
> * 视频教程:<https://doc.iocoder.cn/video/>

# 日志脱敏
log-desensitize:
  # 是否忽略大小写匹配,默认为true
  ignore: true
  # 是否开启脱敏,默认为false
  open: true
  # pattern下的key/value为固定脱敏规则
  pattern:
    # 邮箱 - @前第4-7位脱敏
    email: "@>(4,7)"
    # qq邮箱 - @后1-3位脱敏
    qqemail: "@<(1,3)"
    # 姓名 - 姓脱敏,如*杰伦
    name: 1,1
    # 密码 - 所有需要完全脱敏的都可以使用内置的password
    password: password
  patterns:
    # 身份证号,key后面的字段都可以匹配以下规则(用逗号分隔)
    - key: identity,idcard
      # 定义规则的标识
      custom:
        # defaultRegex表示使用组件内置的规则:identity表示身份证号 - 内置的18/15位
        - defaultRegex: identity
          position: 9,13
        # 内置的other表示如果其他规则都无法匹配到,则按该规则处理
        - defaultRegex: other
          position: 9,10
    # 电话号码,key后面的字段都可以匹配以下规则(用逗号分隔)
    - key: phone,cellphone,mobile
      custom:
        # 手机号 - 内置的11位手机匹配规则
        - defaultRegex: phone
          position: 4,7
        # 自定义正则匹配表达式:座机号(带区号,号码七位|八位)
        - customRegex: "^0[0-9]{2,3}-[0-9]{7,8}"
        # -后面的1-4位脱敏
          position: "-<(1,4)"
        # 自定义正则匹配表达式:座机号(不带区号)
        - customRegex: "^[0-9]{7,8}"
          position: 3,5
        # 内置的other表示如果其他规则都无法匹配到,则按该规则处理
        - defaultRegex: other
          position: 1,3
    # 这种方式不太推荐 - 一旦匹配不上,就不会脱敏
    - key: localMobile
      custom:
          customRegex: "^0[0-9]{2,3}-[0-9]{7,8}"
          position: 1,3

上面这个配置是相对完整的,一定要严格遵守层级配置格式。

自定义脱敏支持的方式
1、key:value的方式
  • phone:4,7,表示phone属性的4-7位进行脱敏

  • 原始数据:13610357861

  • 脱敏后:136**** 7861

2、以符号作为起始、结束节点作为脱敏标志

emai:"@>(4,7)",@为脱敏标志,>表示其为结束节点,<表示其为开始节点。即@>表示对@之前的进行脱敏,@<表示对@之后的进行脱敏。这个示例就是@前的数据的第4-7位进行脱敏。

注意:这种规则里的双引号、括号不能省略,其次:和=不能作为标志符号,因为和匹配规则有冲突

  • 原始数据:123456789@qq.com

  • "@>(4,7)"脱敏后:123**** 89@qq.com

  • "@<(1,3)"脱敏后:123456789@***com

3、自定义正则脱敏
patterns:
  # 手机号
  - key: phone,mobile
    custom:
      # 手机号的正则
      - customRegex: "^1[0-9]{10}"
        # 脱敏范围
        position: 4,7

customRegex:正则表达式,如果符合该表达式,则使用其对应的脱敏规则(position)

4、一个字段,根据多种值含义进行自定义脱敏

比如说,username字段的值可以是手机号、也可以是邮箱,这个值动态改变的,前面几种方式都没办法解决,可以使用该方式。

patterns:
  - key: username
    custom:
      # 手机号 - 11位
      - defaultRegex: phone
        position : 4,7
      # 邮箱 - @
   - defaultRegex: email
     position : "@>(3,12)"
   # 身份证 - 15/18位
   - defaultRegex: identity
     position : 1,3
   # 自定义正则
   - customRegex: "^1[0-9]{10}"
     position : 1,3
   # 都匹配不到时,按照这种规则来
   - defaultRegex: other
     position : 1,3

注意:上面示例中匹配规则里的 双引号和括号 都不能省略

该组件内置四种匹配规则:手机号、身份证号、邮箱、other(其他匹配不到时用的),内置一种脱敏方式:password,表示完全脱敏,可用于pattren下的。

注:当pattern和patterns下的key有重复的时候,只会使用pattern下指定的方式进行脱敏。

Jar包地址和源码地址

https://github.com/liuchengyin01/LogbackDesensitization/tree/master/repo/pers/liuchengyin/logback-desensitization/1.0.0

1f836dd17dedeab99b53b6793a56b7d5.png

Github地址:

https://github.com/liuchengyin01/LogbackDesensitization

Jar包打入Maven本地仓库的方式

1、下载Jar包,放在一个文件夹里

2、在这个文件夹里打开cmd(打开cmd,进入到这个文件夹)

3、执行命令(前提保证maven配置正常,使用mvn -v命令查看是否正常,如果显示版本号表示正常)

mvn install:install-file -DgroupId=pers.liuchengyin -DartifactId=logback-desensitization -Dversion=1.0.0 -Dpackaging=jar -Dfile=logback-desensitization-1.0.0.jar

命令说明:

-DgroupId
 表示jar对应的groupId  
 <groupId>pers.liuchengyin</groupId>
-DartifactId:
 表示jar对应的artifactId
 <artifactId>logback-desensitization</artifactId>
-Dversion
 表示jar对应的 version
 <version>1.0.0</version>


欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

f67dd45f350a85dcc00452200739e70b.png

已在知识星球更新源码解析如下:

7b0cd515580123271246e0acd15e9005.jpeg

f40b0660e77c2619af9e2f86bcb97d49.jpeg

57b3d8539785db35004ac751a0a1d742.jpeg

4285e85c675f24a955892ca667a76449.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Log4j日志脱敏记录一下 前言 在项目上线环境中,需要记录程序运行时产生的各种错误信息、状态信息、调试信息、执行时间记录等日志信息。可以用于查找问题、定位数据等等操作。 日志的具体实现可以有log4j和logback等,这里我们使用SLF4J作为日志系统的实现。 使用SLF4J 使用idea工具可以安装lombok插件,并引入maven包: <dependency> <groupId>org.projectlombok</groupId> <artifactId&gt 阅读详情

相关推荐

解决conversionRule不生效问题

今天遇到一个奇葩问题 &lt;configuration scan="true" scanPeriod="60 seconds" debug="false"&gt; &lt;conversionRule conversionWord="msg" converterClass="com.guohuai.basic.component.logback.SensitiveDataCon

山间明月江上清风的专栏 7708

logback实现日志脱敏

许多系统为了安全需要对敏感信息(如手机号、邮箱、姓名、身份证号、密码、卡号、住址等)的日志打印要求脱敏后才能输出,本文将结合个人经历及总结分享一种logback日志脱敏方式,log4j实现日志脱敏请移步 准备工作 定义脱敏转换相关的类 定义RegexReplacement package my.logback; import java.util.regex.Pattern; public class RegexReplacement { /** * 脱敏匹配正则 */.

嘻上槑梢的博客 9265

Java配置系统与日志框架实战指南

配置系统和日志框架是软件开发中的基础设施,前者管理应用运行时参数,后者记录系统行为。配置系统需要处理环境差异、动态调整等需求,常见方案如Spring Boot的application.properties;日志框架则需平衡性能与查询效率,主流选择包括Logback和Log4j2。合理使用配置分级策略(如默认配置、环境配置)和日志级别规范(ERROR、WARN等)能显著提升系统可维护性。在微服务和云原生场景下,结合配置中心(如Nacos/Apollo)和异步日志技术,可进一步优化系统性能与可靠性。本文通过实际

weixin_30634661的博客 400

Spring Boot 日志记录脱敏

在 Logback 中,我们可以使用Filter过滤器来对日志进行处理。我们可以自定义一个过滤器,对日志中的敏感信息进行脱敏处理。![\\d])";if(!i ++) {} }![\\d])";if(!i ++) {} }![\\d])";if(!i ++) {} }![\\d])";if(!

wgq2020的博客 2555

Spring Boot密码加密实战:从BCrypt到安全加固全解析

密码安全是现代Web应用开发的基石,其核心在于通过单向哈希函数对用户密码进行不可逆转换,确保即使数据库泄露,攻击者也无法轻易还原原始密码。这一原理通过自适应慢哈希算法实现,如BCrypt、PBKDF2等,它们通过可调节的工作因子来抵御暴力破解。在技术价值上,密码加密不仅是合规要求,更是建立用户信任、防范数据泄露风险的关键防线。在应用场景中,Spring Boot项目通过集成Spring Security框架,可以便捷地实现从用户注册、登录到密码管理的全流程安全防护。本文聚焦于Spring Boot中的密码加

子夜轻风 507

Java数据脱敏实战:基于注解与Jackson序列化的优雅实现方案

数据脱敏是数据安全领域的一项基础技术,其核心原理是在确保数据可用性的前提下,对敏感信息进行变形或遮蔽处理,以保护个人隐私和商业机密。这项技术的核心价值在于平衡数据使用与安全合规,广泛应用于日志输出、接口返回、数据共享与测试环境构建等场景。在Java开发实践中,通过策略模式封装脱敏算法,并结合自定义注解与Jackson序列化器,可以构建出低侵入、高可维护的脱敏框架。本文聚焦于如何利用Spring AOP与自定义JsonSerializer,实现声明式的字段级脱敏,有效解决硬编码与代码重复问题,为处理用户手机号

weixin_30315435的博客 791

Spring Boot三步就能完成日志脱敏,简直太哇塞了!

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elast...

weixin_44421461的博客 539

Spring Boot安全配置实战:从环境变量到Vault的三层防护策略

在现代应用开发中,配置管理是保障系统安全性的基础环节。其核心原理在于将敏感信息与代码分离,通过外部化配置机制实现环境隔离。从技术价值看,这不仅防止了密钥、密码等敏感数据泄露,还提升了多环境部署的灵活性与团队协作规范性。实践中,常见应用场景包括数据库连接、API密钥管理和微服务配置分发。针对这些需求,业界形成了从基础环境变量隔离、本地配置加密到集中式秘密管理的渐进式方案。本文聚焦Spring Boot生态,深入解析如何通过环境变量、Jasypt加密工具以及Spring Cloud Config与HashiCo

weixin_30859423的博客 467

15.<Spring Boot 日志>

15.<Spring Boot 日志>

442

【SpringBoot 3.x 第62节】Spring Boot 3.x 的 Actuator 还能这么玩?监控运维到这份上,K8s 都不敢把我服务杀错了!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1390

置顶必读(1) |《滚雪球学 Spring Boot 4.x》专栏目录导航篇(持续更新中)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 8万+

别再手写日志了!用 Spring Boot AOP 一键实现全链路日志监控

好的架构,就像一家高效运作的咖啡店:员工只负责做好咖啡,而不是一边做咖啡一边写工作报告。而 AOP,就是那套自动记录一切的监控系统。

Daniel 438

Android Studio运行报错: failed to load include path ……\platforms\android-35\android.jar的最细解决方案

【代码】Android Studio运行报错: failed to load include path ……\platforms\android-35\android.jar的最细解决方案。

2401_86789230的博客 2万+

spring boot 项目打印sql日志和结果,使用logback或

spring boot 项目打印sql日志和结果,使用logback或

蓝萧的专栏 338

从报错到优化:一次Gauss JDBC参数限制排查实录(32767参数上限避坑指南)

本文详细记录了排查GaussDB JDBC驱动因绑定参数数量超过32767上限而抛出`PSQLException`(报错信息为`Tried to send an out-of-range integer as a 2-byte value`)的全过程。文章深入分析了该限制的底层协议原理,并提供了应用层分批查询、使用临时表以及优化业务逻辑等多种解决方案,旨在帮助开发者规避此参数上限陷阱,构建更稳健的数据访问层。

rgv23456789的博客 220

高等数学第五章---定积分(§5.3定积分的计算方法)

这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。

2302_77045867的博客 4350

eladmin-mp日志系统深度剖析:AOP切面如何实现操作日志与异常日志双记录

对于任何一套后台管理系统来说,日志功能都是最容易被忽视却又最不可或缺的模块。**eladmin-mp日志系统**基于 Spring Boot 2.7.18 与 MyBatis-Plus 构建,通过 **AOP切面** 与自定义注解,仅需一行 `@Log("描述")` 就能自动完成操作日志与异常日志的"双记录",无需侵入任何业务代码。这篇文章将带你从零看懂 eladmin-mp 日志系统的完整工作链

gitblog_00530的博客 760

通过薄膜太阳能电池中的热激电流量化陷阱状态

发光(led)和光伏(PV)器件的性能取决于光活性半导体材料的质量。由于材料杂质或在制造过程中在半导体材料中无意地引入缺陷,导致偏离最佳性能。这些缺陷被称为阱态,或简称“阱”,它是半导体带隙内的高能态。一般来说,陷阱的发生可能是由于材料杂质(在散装)或在不同材料层之间的界面。在有机半导体中,由于天然物质的无序性,阱态经常出现。在无机和杂化半导体(例如:杂化钙钛矿、硅……)中,晶界的存在是圈闭态的已知来源。由于陷阱产生的原因多种多样,它们对装置的影响也是多种多样的。由于载流子的多次捕获和释放事件,特别是浅阱的

FluximAG的博客 2851

Spring Boot 搭建 ELK,这才是正确看日志的方式!

作者 |JingQ来源 |sevenyuan.cn/在看大型网站的中间件技术,对于Elasticsearch有点兴趣,所以将配置流程记录了一下为什么要用ELKELK实际上是三个工具,E...

程序猿DD 508

PCL 读取和保存点云

PCL (Point Cloud Library) 是一个用于处理 3D 点云数据的开源库。在处理点云数据时,常见的任务包括点云的读写和可视化。PCL 提供了强大的 IO 模块来读取和写入各种格式的点云文件,并且提供了可视化模块来对点云进行渲染和显示。点云的读写与显示是很多 3D 数据处理任务的基础步骤,通过这些步骤,可以对点云进行预处理、分析和操作。

纵马踏花向自由 1740

20251121更新纷玩岛

【代码】20251121更新纷玩岛。

猫敷雪 1021

ForgeAdmin 更新:新增第三方登录认证 + 数据字段脱敏两大企业级特性

ForgeAdmin发布两项企业级功能更新:第三方登录认证与数据字段脱敏。该基于Spring Boot 3+Vue 3的微内核框架新增可视化配置的第三方登录功能,支持微信、GitHub等主流平台,采用策略模式设计易于扩展。同时引入基于Jackson的字段脱敏功能,内置10+种脱敏策略,通过简单注解即可实现敏感数据保护。更新包含新模块和数据库表变更,保持框架微内核、全插件化优势,相比传统框架具有更灵活的架构和更丰富的企业级功能支持。

weixin_43035468的博客 675

《从理念到落地:Claude Code 在真实项目中的深度实践指南》基于 Anthropic 团队内部使用经验的扩展与深度解读,一篇面向工程团队的全面实践手册

Claude Code 支持通过# 创建新的 API 端点根据以下输入创建完整的 API 端点:资源名称:$ARGUMENTS请创建以下文件:1. `src/routes/{resource}.routes.ts` - 路由定义2. `src/controllers/{resource}.controller.ts` - 控制器3. `src/services/{resource}.service.ts` - 服务层。

AI天才研究院 484

Spring Boot 2.7 + Vue 3 集成企业微信:3步配置实现组织同步与扫码登录

本文详细介绍了Spring Boot 2.7与Vue 3集成企业微信的技术方案,涵盖组织同步与扫码登录的工程化实现。通过三步配置流程,开发者可快速完成企业微信应用的基础设置、接口权限配置及前后端集成,实现高效的系统集成与用户认证。文章还提供了最佳实践、性能优化方案及常见问题排查指南,助力企业快速落地数字化办公解决方案。

weixin_30591551的博客 386

打破RK3588 GPIO中断响应延迟的枷锁,开启高效编程

本文针对RK3588芯片在智能安防和工业自动化应用中出现的GPIO中断响应延迟问题展开深入分析。通过硬件原理剖析,发现延迟主要源于中断控制器优先级设置、线路干扰等硬件因素,以及中断处理函数复杂、内核调度延迟等软件问题。提出硬件优化方案包括合理布局布线、电源稳定设计,软件层面则通过精准配置设备树、精简中断处理函数、利用工作队列等内核机制进行优化。测试结果显示,优化后中断响应延迟从50-80ms降至10-20ms,高负载下也能稳定在50ms以内。文章最后展望了AI技术在中断调度中的潜在应用价值。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 364

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: MariaDB 成功上市!MySQL 之父 YYDS!!
下一篇: SpringBoot+Prometheus+Grafana 实现自定义监控
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值