mybatis-plus-config.java.ftl 模板文件参考示例

MyBatis-Plus代码生成器模板(适用3.5.1以下) 直接运行CodeGenerator即可。 阅读详情

以下是添加了详细中文注释说明的 mybatis-plus-config.java.ftl 模板文件,涵盖每一行代码的设计意图、配置原理和企业级最佳实践:

package ${package.Config};

<#-- 导入 MyBatis-Plus 核心插件和拦截器 -->
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
<#-- 导入 MyBatis 原生 MetaObject,用于自动填充 -->
import org.apache.ibatis.reflection.MetaObject;
<#-- Spring 注解 -->
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.LocalDateTime;

/**
 * <p>
 * MyBatis-Plus 全局配置类
 * </p>
 *
 * <p>
 * 【核心作用】
 * 1. 注册 MyBatis-Plus 插件(如分页插件)
 * 2. 配置自动填充处理器(Auto Fill Handler)
 * 3. 统一数据库方言、逻辑删除等全局行为
 * </p>
 *
 * <p>
 * 【设计原则】
 * - 通过 Spring {@code @Configuration} 和 {@code @Bean} 声明式配置
 * - 插件链式注册,便于扩展(如添加多租户、性能分析插件)
 * - 自动填充逻辑集中管理,避免在每个 Entity 中重复
 * - 与 application.yml 配置互补,代码配置优先级更高
 * </p>
 *
 * <p>
 * 【注意事项】
 * - 此配置类会被 Spring 自动扫描并加载(需在 ComponentScan 范围内)
 * - 若同时存在 application.yml 中的 MP 配置,代码配置会覆盖 YAML 配置
 * - 分页插件必须在第一个位置(MyBatis-Plus 要求)
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 注册 MyBatis-Plus 拦截器链
     *
     * <p>
     * 【拦截器链说明】
     * MyBatis-Plus 通过 {@link MybatisPlusInterceptor} 管理多个插件,
     * 插件按添加顺序执行(注意:分页插件必须放在第一位!)。
     * </p>
     *
     * <p>
     * 【当前注册的插件】
     * - {@link PaginationInnerInterceptor}:分页插件
     *   - 自动拦截 {@code selectPage} 等方法
     *   - 改写 SQL 添加 LIMIT/OFFSET
     *   - 支持多种数据库方言(MySQL、Oracle、PostgreSQL 等)
     * </p>
     *
     * <p>
     * 【扩展建议】
     * 可在此添加更多插件,例如:
     * - {@code BlockAttackInnerInterceptor}:防止全表更新/删除
     * - {@code TenantLineInnerInterceptor}:多租户插件
     * - {@code OptimisticLockerInnerInterceptor}:乐观锁插件
     * </p>
     *
     * @return 配置好的 MyBatis-Plus 拦截器
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 创建拦截器实例
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        
        // 添加分页插件(必须放在第一位!)
        // DbType.MYSQL 表示使用 MySQL 方言(自动处理 LIMIT 语法)
        // 其他常用值:DbType.ORACLE, DbType.POSTGRE_SQL, DbType.SQL_SERVER
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        
        // 【扩展点】在此添加其他插件
        // interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
        
        return interceptor;
    }

    /**
     * 注册自动填充处理器
     *
     * <p>
     * 【自动填充原理】
     * 当执行 INSERT/UPDATE 操作时,MyBatis-Plus 会回调此处理器,
     * 根据字段上的 {@code @TableField(fill = ...)} 注解自动填充值。
     * </p>
     *
     * <p>
     * 【填充策略说明】
     * - {@code FieldFill.INSERT}:仅插入时填充
     * - {@code FieldFill.UPDATE}:仅更新时填充
     * - {@code FieldFill.INSERT_UPDATE}:插入和更新时都填充
     * </p>
     *
     * <p>
     * 【当前填充逻辑】
     * 1. 插入时:
     *    - createTime = 当前时间
     *    - updateTime = 当前时间
     *    - deleted = 0(未删除)
     * 2. 更新时:
     *    - updateTime = 当前时间
     * </p>
     *
     * <p>
     * 【关键方法说明】
     * - {@code strictInsertFill}:严格插入填充(字段必须存在)
     * - {@code strictUpdateFill}:严格更新填充(字段必须存在)
     * - 使用 Lambda 表达式提供值(如 {@code LocalDateTime::now})
     * </p>
     *
     * <p>
     * 【与 Entity 的配合】
     * Entity 字段需添加注解,例如:
     * {@code @TableField(fill = FieldFill.INSERT)}
     * private LocalDateTime createTime;
     * </p>
     *
     * @return 自动填充处理器实例
     */
    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new MetaObjectHandler() {
            /**
             * 插入操作自动填充
             *
             * <p>
             * 【执行时机】
             * 在执行 {@code insert} 或 {@code insertBatch} 前触发
             * </p>
             *
             * <p>
             * 【填充字段】
             * - createTime:创建时间(仅插入时设置)
             * - updateTime:更新时间(插入时也设置为当前时间)
             * - deleted:逻辑删除标识(默认 0 表示未删除)
             * </p>
             *
             * @param metaObject MyBatis 元对象,包含实体信息
             */
            @Override
            public void insertFill(MetaObject metaObject) {
                // 填充 createTime 字段(仅当字段存在且未手动设置时)
                // LocalDateTime::now 是 Supplier<LocalDateTime>,提供当前时间
                this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
                // this.strictInsertFill(metaObject, BaseEntity::getCreateTime, LocalDateTime::now, LocalDateTime.class);
                
                // 填充 updateTime 字段(插入时也设为当前时间)
                this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
                // this.strictInsertFill(metaObject, BaseEntity::getUpdateTime, LocalDateTime::now, LocalDateTime.class);
                
                // 填充 deleted 字段(默认 0 表示未删除)
                // 使用 Lambda 表达式提供默认值:() -> 0
                this.strictInsertFill(metaObject, "deleted", () -> 0, Integer.class);
                // this.strictInsertFill(metaObject, BaseEntity::getDeleted, () -> 0, Integer.class);
            }

            /**
             * 更新操作自动填充
             *
             * <p>
             * 【执行时机】
             * 在执行 {@code updateById} 或 {@code update} 前触发
             * </p>
             *
             * <p>
             * 【填充字段】
             * - updateTime:每次更新时刷新为当前时间
             * </p>
             *
             * @param metaObject MyBatis 元对象,包含实体信息
             */
            @Override
            public void updateFill(MetaObject metaObject) {
                // 仅填充 updateTime 字段
                this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
                // this.strictInsertFill(metaObject, BaseEntity::getUpdateTime, LocalDateTime::now, LocalDateTime.class);
            }
        };
    }
}

🔍 关键设计说明补充

1. 为什么分页插件必须放在第一位?
  • MyBatis-Plus 内部对插件执行顺序有严格要求
  • 分页插件需要最先解析 SQL,才能正确提取原始查询并改写
  • 若放在后面,可能被其他插件(如多租户)干扰,导致分页失效
2. strictInsertFill vs fillStrategy
  • strictInsertFill:严格模式,仅当字段未设置值时才填充
  • 避免覆盖用户手动设置的值(如创建时指定特殊时间)
  • 推荐始终使用 strict* 方法,而非已废弃的 fillStrategy
3. 数据库方言(DbType)选择
数据库DbType 常量说明
MySQLDbType.MYSQL默认使用
PostgreSQLDbType.POSTGRE_SQL注意拼写
OracleDbType.ORACLE需额外配置
SQL ServerDbType.SQL_SERVER-
达梦DbType.DM国产数据库
4. 自动填充的替代方案
  • 方案A(推荐):代码配置(本模板方式)— 灵活、类型安全

  • 方案B:YAML 配置 — 简单但不够灵活

    mybatis-plus:
      global-config:
        db-config:
          insert-strategy: not_null
          update-strategy: not_null
    
5. 生产环境增强建议
// 防止全表更新/删除(安全防护)
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());

// 乐观锁插件(需 Entity 添加 @Version 注解)
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

✅ 此模板文件是 MyBatis-Plus 应用的核心配置,正确配置后可:

  • 实现无侵入式分页
  • 自动管理创建/更新时间
  • 统一逻辑删除行为
  • 为后续扩展(多租户、审计等)奠定基础

可直接用于企业级项目,确保数据访问层的健壮性和可维护性。

JeecgBoot框架SQL注入漏洞深度剖析与分层修复方案 SQL注入作为OWASP Top 10中的核心安全威胁,其原理在于攻击者通过构造恶意输入,欺骗应用程序执行非预期的数据库命令。这一漏洞的根源通常在于未对用户输入进行充分的验证与处理,直接将其拼接至SQL语句中执行。从技术价值看,防范SQL注入是保障数据完整性、保密性与系统可用性的基石,尤其在采用MyBatis-Plus等ORM框架进行数据库操作的现代Java应用中,安全编码实践至关重要。在应用场景上,低代码开发平台和快速迭代的业务系统,如广泛使用的JeecgBoot框架,因其高度依赖代码生成器,可能在自动生 阅读详情

相关推荐

IntelliJ插件多版本兼容原理与MyBatis开发合规实践

IntelliJ插件并非简单工具,而是深度集成于IDE平台的扩展模块,其核心能力依赖PSI解析、编译器服务(CompilerManager/BuildProcessHandler)和项目模型抽象。‘支持编译器多版本’本质是适配不同IntelliJ Platform API演进(如2022.3→2024.1),涉及PSI结构变更、Gradle DSL桥接与JDK目标版本感知等底层机制。该能力直接决定Mapper接口跳转、XML生成、Kotlin映射等MyBatis开发体验的稳定性与可持续性。在企业级Java开

weixin_33847182的博客 362

MyBatis Plus 基本使用,各配置模板记录

MyBaits Plus项目实际使用及配置。Mapper、Service示例;分页配置及IPage对象类型转换;lambda链式查询、更新、删除;常用条件项eq、ne、gt、lt、ge、le、in、isNull、between、like;and、or嵌套查询;model层配置插入/更新时设置自动填充字段。动态SQL:customSqlSegment、sqlSegment

lranqi的博客 2172

JeecgBoot企业级低代码平台实战:从核心原理到生产部署全解析

低代码开发平台通过可视化建模和代码生成技术,将通用业务功能模块化封装,其核心原理在于通过预置模板和约束性架构,将开发者的精力从重复的底层编码中解放出来,聚焦于业务逻辑创新。这一技术价值在于能大幅提升企业级应用,尤其是后台管理系统的开发效率,降低技术门槛和项目成本。在应用场景上,它特别适合企业内部管理系统、需要快速验证的MVP项目以及外包类项目,能高效处理表单、权限、报表等标准化需求。本文以JeecgBoot这一基于Spring Boot和Ant Design Vue的流行低代码平台为例,深入探讨其在实际项目

weixin_30642869的博客 416

myabtis-plus 代码生成器自定义模板

mybatis-plus代码生成器默认生成的controller是下面这样的,一个空的controller。为了方便编码,可以给controller模板添加自定义内容,重复编码,其他类文件一样,看个人需求。1、找到原生模板,我们选择ftl类型的模板。2、复制原生模板到我们的自定义目录。4、在代码生成器中配置自定义模板路径。3、给模板添加自定义内容。

lizsy的博客 2998

ffmpeg(一) ffmpeg+QT开发环境搭建

(exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中)

小道士写程序 8202

React项目实战:用AntV G6打造可折叠组织架构图(附完整代码)

本文详细介绍了如何在React项目中使用AntV G6库构建一个功能完整的可折叠组织架构图。通过实战代码演示了从环境搭建、自定义节点、折叠状态管理到性能优化的全流程,重点解决了企业级应用中处理复杂树形数据、实现流畅交互等核心问题,并提供了可直接复用的组件代码。

weixin_29016315的博客 312

Mybatis-Plus代码生成器模板

Mybatis-Plus代码生成器是基于 MyBatis 核心框架进行封装的一款快速生成Java代码的工具。它结合了 Mybatis-Plus 自身的代码增强功能和 Mybatis 的 XML 配置文件生成器,可以帮助开发者快速地生成 Java 实体类、XML 配置文件、Mapper 接口以及 Service 和 Controller 等代码,可以大大提高开发效率。支持多种生成方式:Mybatis-Plus 支持使用命令行、Maven 插件和IDEA插件等多种方式进行生成。

m0_72568513的博客 1243

双目立体匹配算法:SGBM

SGBM(Semi-Global Block Matching)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SGBM)。它是基于全局匹配算法和局部匹配算法的优缺点,提出了一种折中的方法,既能保证视差图的质量,又能降低计算复杂度。

weixin_45303602的博客 9402

Easy-Code mybatis-plus模板

【代码】Easy-Code mybatis-plus模板。

waper97的博客 629

PCB Layout总结

PCB Layout作为硬件设计中的一个环节,也是很重要的一个环节;在硬件电路设计合理的情况下,他其实是影响性能的一个绝对重要的指标。现在很多的PCB Layout工程师都是按照硬件工程师或者PI SI工程师给出的约束规则来完成布局布线的,这些也就是俗称的 “拉线工”。他们重复而机械的完成一块块PCB设计,一段时间设计后,他们中的一些或许已经有了这样的一些经验:哪些要做等长,哪些要走粗、哪些要平...

xydlxd118的博客 2580

CSRT跟踪算法的使用

Fu Xianjun. All Rights Reserved. 文章目录 前言 一、CSRT跟踪算法是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、CSRT跟踪算法是什么? 在具有通道和空间可靠性的判别相关滤波器(DCF-CSR)中,我们使用空间可靠性图将滤波器支持调整为从帧中选择区.

sinat_53821602的博客 7903

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

Calvin Chan的博客 1550

【YOLOv12多模态融合改进】| TFAM:时序融合注意力模块 | 引入通道 - 空间双分支注意力机制,解决双模态特征融合中时序关联不足的问题

TFAM模块通过时序信息驱动的注意力机制,解决了双时相特征融合中时序关联不足的问题,实现了更精准的变化区域定位和特征表示。其结构轻量、泛化性强,为变化检测任务提供了一种高效的特征融合解决方案。

Limiiiing的博客 865

3种模板引擎对比:Velocity、Freemarker、Beetl在MyBatis-Plus代码生成器中如何选择

MyBatis-Plus代码生成器(mybatis-plus-code-generator)是一款把数据库表一键逆向成 entity、mapper、service 等 Java 代码的可视化工具。而它底层渲染代码的能力,完全交给**模板引擎**——项目同时内置了 **Velocity、Freemarker、Beetl** 三款引擎。选错引擎,轻则报错,重则生成的代码风格不合团队习惯。本文用一张对比

gitblog_00666的博客 858

使用 MediaPipe 身体跟踪构建不良身体姿势检测和警报系统

详细介绍如何使用 MediaPipe 身体跟踪构建不良身体姿势检测和警报系统,并附实现的源码下载链接

DT程序员的博客 1813

Vue - 简约大气 404 页面

效果图 实现代码 复制即可。 <template> <div> <div class="error"> <!-- 图片可保存到本地 --> <img src="https://img-blog.csdnimg.cn/20210715111039922.png"> <p>抱歉!你访问的页面不存在或已删除 :( </p> <span class="back" @click="go(

🏆 前端领域优质创作者 3369

【SpringBoot框架篇】14.mybatis-plus实战

文章目录简介版本使用模板生成器生成模板代码添加依赖创建表创建模板实体类的超类添加模板生成器代码运行main函数使用mybatis-plus实现基本的CRUD功能通用代码层service代码详解mapper控制器层调用接口自定义分页条件注入器页面查询条件注入代码配套代码已上传到github上 简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参

皓亮君的博客 2720

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

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

MyBatis-Plus代码生成器:原理、配置与实战,告别CRUD重复劳动

在Java企业级开发中,ORM框架是连接应用程序与数据库的核心组件,它通过对象关系映射技术,将数据库表结构映射为程序中的实体类,从而简化数据持久化操作。其工作原理主要基于元数据驱动和模板渲染,通过解析数据库表结构信息,自动生成对应的数据访问层代码。这项技术的核心价值在于大幅提升开发效率、统一代码规范,并减少因手动编写导致的低级错误。在应用场景上,它特别适用于需要快速构建基础数据操作模块的Spring Boot + MyBatis技术栈项目,无论是快速原型验证还是大型企业应用开发都能显著加速进程。本文聚焦于M

weixin_30628801的博客 405

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MyBatis-Plus代码生成器实战:从数据库表到CRUD代码一键生成

数据库逆向工程是提升Java后端开发效率的重要技术,它通过读取数据库表结构自动生成对应代码。MyBatis-Plus代码生成器作为主流工具,基于数据库元数据自动生成实体类、Mapper、Service和Controller,将开发者从重复的CRUD劳动中解放出来。掌握其配置、模板定制与生成后集成,能显著加速Spring Boot项目开发。本文以实际工程为例,讲解FastAutoGenerator核心配置、版本兼容、模板改造及逻辑删除分页插件集成等要点,帮助开发者在真实项目中高效落地代码生成。

weixin_34186128的博客 175

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

MyBatis-Plus代码生成器实战:从原理到配置,一键生成CRUD代码

在Java企业级开发中,ORM框架是连接数据库与业务逻辑的关键组件,它通过对象关系映射原理,将数据库表结构映射为Java对象,简化了数据持久化操作。MyBatis作为一款流行的半自动化ORM框架,提供了灵活的SQL编写能力,而MyBatis-Plus在其基础上增强了通用CRUD操作,进一步提升了开发效率。其核心价值在于通过代码生成器自动化生成基础数据访问层代码,将开发者从重复的实体类、Mapper接口和XML文件编写中解放出来,实现标准化与工程化。这一技术特别适用于快速构建后台管理系统、微服务数据层等需要大

weixin_34238633的博客 454

MyBatis-Plus 使用总结

MyBatis-Plus 使用总结

凡的博客 1322

MyBatis-Plus核心功能与实战优化指南

ORM框架作为Java持久层开发的核心组件,通过对象关系映射简化数据库操作。MyBatis-Plus作为MyBatis的增强工具,基于动态代理和注解处理实现智能CRUD,其QueryWrapper条件构造器支持链式编程,显著提升开发效率。在性能优化方面,连接复用(REUSE模式)可提升高并发场景40%吞吐量,而分页插件与多租户方案则解决了企业级应用的共性需求。对于需要快速迭代的中小型项目,配合代码生成器可实现80%的DAO层代码自动化生成。合理使用这些特性,能在保证MyBatis灵活性的同时,兼顾开发效率与

weixin_34354945的博客 413

Mybatis-plus 代码生成器

pom.xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.2</version> </dependency> <.

今晚打老虎的博客 254

若依集成MyBatis-Plus实战:架构冲突、避坑指南与性能提效

MyBatis-Plus作为Spring Boot生态主流ORM增强框架,其‘约定优于配置’理念与若依(RuoYi)强调显式SQL、XML可审计的设计哲学存在深层架构张力。理解二者在SqlSessionFactory初始化顺序、Mapper扫描机制、QueryWrapper兼容性及数据权限拦截器等层面的原理差异,是实现稳定集成的技术前提。MyBatis-Plus通过LambdaQueryWrapper、IService接口和自动SQL生成显著提升CRUD开发效率,适用于报表导出、动态查询等场景;而若依原生X

weixin_34268169的博客 335

SpringBoot+Vue企业级旅游管理系统架构解析

企业级应用开发中,前后端分离架构已成为主流技术方案。通过SpringBoot构建RESTful API后端服务,结合Vue实现动态前端界面,这种架构模式能显著提升开发效率和系统可维护性。在数据持久层,MyBatis-Plus作为ORM框架简化了数据库操作,而MySQL则提供了可靠的关系型数据存储支持。该技术栈特别适合需要快速迭代的旅游行业管理系统,能够有效处理旅行社管理、订单处理等高并发业务场景。本文以实际项目为例,详细解析了如何通过Nginx反向代理和HTTPS加密确保系统安全,并展示了Swagger接口

weixin_30325487的博客 418

OpenCode Tool:从代码生成到开发工作流自动化的核心实践

代码生成是提升软件工程效率的关键技术,其核心原理在于通过模板引擎将数据模型转换为可执行代码,实现开发流程的标准化与自动化。这项技术的核心价值在于显著减少重复劳动、统一代码规范,并确保架构一致性,尤其适用于微服务、云原生等需要快速迭代和规范统一的现代应用场景。OpenCode Tool作为一个典型的工具链生态系统,深度集成了模板渲染、插件扩展与配置即代码等机制,能够高效处理领域实体生成、API联动、基础设施即代码等高频需求。通过将标准化和自动化理念融入开发工作流,它帮助团队从繁琐的CRUD和YAML编写中解放

weixin_34221332的博客 394
上一篇: dto.java.ftl 和 vo.java.ftl 两个核心数据传输对象模板文件2
下一篇: global-exception-handler.java.ftl 模板文件参考示例
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

龙茶清欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值