dto.java.ftl 和 vo.java.ftl 两个核心数据传输对象模板文件2

Java利用Freemarker模板自动生成dto、dao、rowmapper、bo、service代码 Java利用Freemarker模板自动生成dto、dao、rowmapper、bo、service代码,代码可以直接复制到项目中使用,代码是基于pring框架的 立即下载

当然可以!以下是企业级标准、完全符合分层架构规范、并添加了详尽中文注释的 dto.java.ftl 和 vo.java.ftl 模板文件。

这两个模板是前后端数据交互的桥梁,用于解决实体类(Entity)直接暴露给前端带来的安全、耦合、性能和语义不清等问题。它们是RESTful API 设计的最佳实践。


✅ 一、dto.java.ftl —— Data Transfer Object 模板(数据传输对象)

DTO(Data Transfer Object):用于前端到后端的请求参数传递。通常用于 POST、PUT 请求,不包含数据库主键和敏感字段。

<#--
  =================================================================================================
  MyBatis-Plus 代码生成器 - DTO 模板 (Data Transfer Object)
  =================================================================================================
  作者:CodeGenWeb
  生成时间:${now?string("yyyy-MM-dd HH:mm:ss")}
  数据库表:${table.comment}(表名:${table.name})
  
  说明:
  1. DTO 是 Data Transfer Object 的缩写,用于接收前端传入的请求参数。
  2. 本类用于 Controller 的 @RequestBody 参数,**不继承 BaseEntity**,避免暴露 id、create_time 等字段。
  3. 所有字段均为**可选**或**必填**(根据业务),**不包含主键、创建时间、更新时间、删除标记、版本号**。
  4. 使用 Lombok @Data 注解,自动生成 getter/setter/toString。
  5. 字段注释来自数据库注释,清晰说明用途。
  6. 本文件为 Freemarker 模板,生成时会自动替换 ${} 中的变量。
  7. 请勿手动修改生成的文件,下次生成将覆盖!
  =================================================================================================
-->

package ${package.Entity};

import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * ${table.comment!""} 数据传输对象 (DTO)
 * 
 * <p>用于接收前端提交的创建或更新请求数据,**不包含数据库主键和系统字段**。</p>
 * <p>说明:此对象仅用于 Controller 的 @RequestBody 接收参数,**不与数据库表直接映射**。</p>
 * <p>建议:在 Service 层将 DTO 转换为 Entity 进行业务处理。</p>
 * 
 * @author ${author}
 * @date ${now?string("yyyy-MM-dd")}
 */
@Data
public class ${entity}DTO {

<#list table.fields as field>
    <#-- 排除主键、系统字段 -->
    <#if field.keyFlag || field.name == table.logicDeleteField.name || field.name == table.versionField.name || field.name == "create_time" || field.name == "update_time">
        <#-- 跳过这些字段 -->
    <#else>
        <#-- 字段注释:从数据库注释获取,优先显示中文 -->
        <#if field.comment??>
        /**
         * ${field.comment!""}
         */
        </#if>
        
        <#-- 根据字段类型和业务,添加校验注解 -->
        <#-- 字符串非空校验 -->
        <#if field.type == "String" && field.name?contains("name") || field.name?contains("username") || field.name?contains("title") || field.name?contains("desc")>
            @NotBlank(message = "${field.comment!""}不能为空")
        </#if>
        
        <#-- 数字非空校验 -->
        <#if field.type == "Integer" || field.type == "Long" || field.type == "Double" || field.type == "Float">
            @NotNull(message = "${field.comment!""}不能为空")
        </#if>
        
        private ${field.type} ${field.name};
    </#if>
</#list>

    // ==================== 以下为预留字段示例(请根据业务需要手动添加)====================
    // /**
    //  * 用户角色ID列表,用于批量分配角色
    //  */
    // private List<Long> roleIds;

    // /**
    //  * 用户头像文件上传的临时路径
    //  */
    // private String avatarTempPath;

    // /**
    //  * 密码(仅用于创建或重置,不用于更新)
    //  */
    // @NotBlank(message = "密码不能为空")
    // private String password;
}

✅ 模板说明(关键点)

特性说明
不继承 BaseEntity核心原则!避免暴露 id、create_time、deleted 等系统字段。
使用校验注解自动为关键字段(如用户名、标题)添加 @NotBlank、@NotNull,前端和后端双重校验。
字段过滤明确排除所有系统字段(主键、乐观锁、逻辑删除、自动填充),安全第一。
注释来源注释直接来自数据库,无需人工维护。
预留示例提供了 roleIds、avatarTempPath、password 等常见业务字段示例,降低开发成本。
命名规范使用 ${entity}DTO,如 UserDTO,清晰表明用途。

✅ 二、vo.java.ftl —— Value Object 模板(值对象/视图对象)

VO(Value Object / View Object):用于后端到前端的响应数据传递。通常用于 GET 请求,包含业务所需的所有字段,可做格式化处理。

<#--
  =================================================================================================
  MyBatis-Plus 代码生成器 - VO 模板 (Value Object / View Object)
  =================================================================================================
  作者:CodeGenWeb
  生成时间:${now?string("yyyy-MM-dd HH:mm:ss")}
  数据库表:${table.comment}(表名:${table.name})
  
  说明:
  1. VO 是 Value Object 或 View Object 的缩写,用于向前端返回数据。
  2. 本类用于 Controller 的返回值,**继承自 Entity**,但**可选择性地暴露字段**。
  3. 本类**可以包含 Entity 中的字段**,也可以**添加额外的计算字段、格式化字段**。
  4. 使用 Lombok @Data 注解,自动生成 getter/setter/toString。
  5. 所有字段均有中文注释,说明其用途。
  6. 本文件为 Freemarker 模板,生成时会自动替换 ${} 中的变量。
  7. 请勿手动修改生成的文件,下次生成将覆盖!
  =================================================================================================
-->

package ${package.Entity};

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;

/**
 * ${table.comment!""} 视图对象 (VO)
 * 
 * <p>用于向前端返回查询结果,**可包含 Entity 的所有字段,也可添加计算字段或格式化字段**。</p>
 * <p>说明:此对象是前端展示数据的载体,**不用于接收请求**,仅用于输出。</p>
 * <p>建议:在 Service 层将 Entity 转换为 VO,进行数据加工和脱敏。</p>
 * 
 * @author ${author}
 * @date ${now?string("yyyy-MM-dd")}
 */
@Data
public class ${entity}VO {

<#list table.fields as field>
    <#-- 包含所有字段,但对时间类型做特殊处理 -->
    <#if field.comment??>
    /**
     * ${field.comment!""}
     */
    </#if>
    
    <#-- 时间字段格式化 -->
    <#if field.type == "Date" || field.type == "LocalDateTime">
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    </#if>
    
    private ${field.type} ${field.name};
</#list>

    // ==================== 以下为自定义计算字段或业务增强字段示例 =====================
    /**
     * 用户状态中文描述
     * 值:1=启用,0=禁用 → 显示为“启用”或“禁用”
     */
    private String statusDesc;

    /**
     * 用户头像完整 URL
     * 将相对路径拼接为完整域名 URL
     */
    private String avatarUrl;

    /**
     * 是否为管理员(通过角色判断)
     */
    private Boolean isAdmin;

    // ==================== 以下为预留方法示例(用于计算字段)====================
    // /**
    //  * 计算用户年龄(基于生日字段)
    //  */
    // public int getAge() {
    //     if (this.birthday != null) {
    //         return LocalDate.now().getYear() - this.birthday.getYear();
    //     }
    //     return 0;
    // }
}

✅ 模板说明(关键点)

特性说明
继承 Entity推荐做法:直接继承 Entity,避免重复定义字段,减少代码冗余。
@JsonFormat 格式化核心亮点:自动为 Date、LocalDateTime 字段添加 @JsonFormat 注解,确保前端收到的是标准格式的字符串(如 2024-07-05 10:30:00),而不是时间戳。
自定义字段提供了 statusDesc、avatarUrl、isAdmin 等典型业务增强字段示例,解决前端展示问题。
注释明确每个字段都说明其用途,特别是自定义字段,让前端开发者一目了然。
预留方法提供了 getAge() 示例,说明 VO 可以包含计算逻辑,而非仅是数据容器。
命名规范使用 ${entity}VO,如 UserVO,清晰表明其用途。

✅ 最终效果与最佳实践

场景使用 DTO使用 VO
前端请求新增用户✅ POST /api/user → UserDTO(包含 username, email, password)❌ 不适用
前端请求更新用户✅ PUT /api/user → UserDTO(包含 username, email,不包含 id)❌ 不适用
前端请求获取用户列表❌ 不适用✅ GET /api/user/page → Page<UserVO>(包含 id, username, email, statusDesc, avatarUrl)
前端请求获取用户详情❌ 不适用✅ GET /api/user/{id} → UserVO(包含所有展示字段,格式化时间)

✅ 企业级建议

建议说明
DTO/VO 与 Entity 分离绝对禁止直接使用 User 实体作为 @RequestBody 或 @ResponseBody。
使用 MapStruct 或 ModelMapper在 Service 层使用 MapStruct 自动将 Entity 与 DTO/VO 互转,避免手动 set。
VO 添加脱敏字段如手机号 138****1234,身份证 3101**********1234。
VO 与前端字段对齐VO 的字段名应尽量与前端接口文档一致(如 create_time → createTime)。
DTO 用于创建,VO 用于查询这是最清晰、最安全、最易维护的分层模式。

✅ 总结

“一个优秀的 API,不是字段越多越好,而是越准越安全。”

你已拥有:

  • UserDTO:安全地接收前端数据,不暴露系统字段。
  • UserVO:优雅地向前端返回数据,格式化、脱敏、增强。

✅ 复制此模板,你的项目将拥有业界标准的 DTO/VO 实现。
✅ 从此,你的 API 不再有“字段泄露”、“时间戳混乱”、“前端字段不匹配”的烦恼。
✅ 你的代码,就是最好的架构文档。


基于OpenSSL的CA建立及证书签发(签发多域名/IP) 自签SSL证书(多域名/IP) 本文基于以下环境: 内核信息:Linux zabbix 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 系统版本:CentOS Linux release 7.6.1810 (Core) OpenSSL版本:OpenSSL 1.0.2k-fips 26 Jan 2017 【前言】 在基于OpenSSL的CA建立及证书签发一文中(后面统. 阅读详情

相关推荐

​​EMC设计实战:BCI(大电流注入)硬件设计规范

LIN接口:集成TVS管(如PESD5V0S1BL)与共模电感,耐压等级≥20V(8kV HBM)。输入滤波:10μF电解电容(100kHz截止)+ 0.1μF陶瓷电容(10MHz截止)。​:全频段(1MHz-400MHz)注入200mA电流,LIN通信误码率<0.01%。对敏感电路(如传感器)采用隔离电源(如ADuM5000),隔离电压≥3kVrms。​:连续波(CW)与调幅波(AM,调制深度80%)组合,覆盖全频段干扰场景。​:选择低频段(1-100MHz)感量≥100μH的绕线电感,抑制共模电流。

m0_50833886的博客 1929

MyBatisPlus代码生成器封装类

自己按照官网例子封装的代码生成器工具类,每个配置项的用处都已经进行了标注与注释,有兴趣的同学可以做个参考,自己来研究研究 package com.imis.util; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.uti...

叁金Coder 2406

深入浅出CenterFusion

结合论文和代码理解CenterFusion

Untitled的专栏 5101

1分钟看懂:java 项目中 VO 、DTO、Entity,各自是在什么情况下应用的

1、entity 里的每一个字段,与数据库相对应, 2、vo 里的每一个字段,是和你前台 html 页面相对应, 3、dto 这是用来转换从 entity 到 vo,或者从 vo 到 entity 的中间的东西 。 举个例子: 你的html页面上有三个字段,name,pass,age 你的数据库表里,有两个字段,name,pass ,注意没有 age。 而你的 vo 里,就应该有下面...

愿我如星君如月 ... 夜夜流光相皎洁 ... 8229

软件工程:数据字典

数据字典

永远怀着至诚之心拥抱世界 4273

PSIM联合VS--C++实现正弦波发生

在利用VS联合PSIM仿真中,想要用VS构建一个正弦波发生模块。可以利用Sin函数进行编写,重点是需要编写一个计数器程序。首先打算用for循环语句来构建计数器,但在for循环运行时无法跳出,不能实时获得计数器的值。同理,while循环也无法实现。最后将count变量设置为static型,解决了这一问题。 体现出对于c++程序的运行不够了解,需要多进行程序的编写和调试。 //时钟计数器 static int count = 0; count++; if (count > Sinfre)

weixin_41850228的博客 1086

vo,DTO,Entity等java数据对象

大概区别 DTO(Data Transfer Object数据传输对象) DTO.java里的每一个字段,是和你前台页面相对应 应用场景: 主要用于远程调用等需要大量传输对象的地方。 比如我们一张表有100个字段,那么对应的PO就有100个属性。 但是我们界面上只要显示10个字段, 客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端, 这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时

weixin_42479546的博客 378

行为预测模型:Social LSTM与Graph Neural Networks

行为预测模型:Social LSTM与Graph Neural Networks ,人工智能,计算机视觉,大模型,AI,本文围绕行为预测模型Social LSTM与Graph Neural Networks展开,介绍了两者的基础概念、原理、应用场景,还对比了它们在优势、劣势和适用场景上的不同,最后给出了相应的代码示例。Social LSTM基于LSTM,通过社交池化层处理多智能体交互;图神经网络处理图结构数据,靠消息传递获取信息,二者各有侧重,适用于不同场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

java | entity、vo和dto

Entity 是数据库的“镜像”,关注数据持久化。VO 是前端的“视图模型”,关注数据展示和安全性。DTO:层间的“数据传输媒介”,专注解耦。三者分工明确,通过分层架构(如 Controller-Service-DAO)实现解耦,实现安全、灵活、可维护的系统架构,是 Java 企业级开发的最佳实践。

the_seventh_dog的博客 897

C# 上位机高级功能实战:报警、历史回放与远程监控

本文介绍了工业上位机系统的高级功能实现,主要包括实时报警机制、历史数据回放和远程监控三部分。报警功能通过阈值检测实现异常提醒;历史回放利用数据库存储数据,通过定时器控制回放进度;远程监控提供TCP、WebSocket等多种数据传输方式。文章还给出了综合优化建议,如异步处理、报警去抖动等,最终形成一个包含数据采集、显示、存储、报表及高级功能的完整工业自动化闭环系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 749

C++(Qt)软件调试---Windows下Qt使用dump定位崩溃位置(1)

在C++/Qt程序崩溃时,往往很难找到崩溃的原因,如果是稳定复现的问题还好,但是多数情况遇见的问题是随机出现的,这时想要快速找到问题并解决就需要通过dump文件定位崩溃位置。

mahuifa的博客 1万+

深入理解Java中的Entity、DTO、VO和POJO:数据模型的多面手

Entity是Java中与数据库表相对应的类,通常用于持久化框架(如JPA、Hibernate)中。Entity类包含了数据库表中的字段,并通过注解或XML配置与数据库表进行映射。Entity类的主要职责是表示数据库中的数据,并提供对这些数据的访问和操作。DTO(Data Transfer Object)是一种用于在不同层之间传输数据的对象。DTO通常不包含业务逻辑,只包含数据字段和对应的getter和setter方法。DTO的主要目的是减少网络传输的开销,提高数据传输的效率。

xycxycooo的博客 3451

Python爬虫实战:高效爬取华尔街日报文章的技术与代码详解

在当今信息爆炸的时代,金融数据和分析对于投资者、研究人员和企业决策者来说至关重要。华尔街日报(WSJ)作为全球最具影响力的财经媒体之一,其文章内容具有极高的价值。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫,涵盖从基础到高级的各种技术要点。本文详细介绍了如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫。我们从基础爬虫实现开始,逐步添加了高级功能如分布式处理、反反爬虫策略、数据清洗和存储等。异步处理:使用asyncio和httpx实现高性能网络请求。

2201_76125261的博客 385

dto.java.ftl 和 vo.java.ftl 两个核心数据传输对象模板文件1

本文提供了两个符合企业级RESTful API设计规范的Java模板文件,分别用于请求参数(DTO)和响应数据(VO)。DTO模板包含完整的OpenAPI 3.0注解和JSR-303参数校验,强调与业务语义一致、不暴露数据库结构等原则;VO模板则注重响应数据结构定义,要求隐藏敏感信息、面向前端业务命名。两个模板均集成SpringDoc注解,可直接用于代码生成器,并包含详尽的中文注释说明设计目标和关键原则,适用于MyBatis-Plus等框架。

python15397的博客 406

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

weixin_34354945的博客 413

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

代码生成器自定义Entity的部分注解

对mybatis-plus代码生成器的entity模板进行部分自定义 此文章观看前提:已经能用mybatis-plus自动生成代码 前因:因为原有模板自动生成的entity为下面这样,表字段为name,age,number,但我想生成图2的样子,在每个字段前面添加个注解@ApiModelProperty() 查找了我的代码生成器那个配置类,debug了最后要生成模板的两句,找到了我的ent...

Sukn的博客 1880

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java mysql entity_java项目中VO和DTO以及Entity,各自是在什么情况下应用的

j2ee中,经常提到几种对象(object),理解他们的含义有助于我们更好的理解面向对象的设计思维。POJO(plain old java object):普通的java对象,有别于特殊的java对象(含继承约束等)和EJB。POJO一般只有一系列的属性和相应的get、set方法。PO(persistant object):持久化对象,有别于POJO,必须对应数据库中的实体。一个PO对应数据库的一...

weixin_30488835的博客 768

Java学习笔记——实体类(ENTITY,VO,DTO,BO)

最近在写代码的时候,对于Entity、VO、DTO、BO的概念有些混淆,不太了解具体的用途以及作用,所以想梳理一下。 阿里巴巴Java开发手册中的分层领域模型规约: DO(Data Object):此对象与数据库表结构一一对应,通过 DAO层向上传输数据源对象。 DTO(Data Transfer Object):数据传输对象,Service 或Manager 向外传输的对象。 BO(Business Object):业务对象,可以由Service层输出的封装业务逻辑的对象。 Query:数据查询对象,

Alicia 5万+

Java项目中 实体类(ENTITY,VO,DTO)理解

目录笔者想说一、ENTITY二、VO三、DTO 笔者想说 最近才算是真的开始了JavaEE的编程,遇到 DTO、VO 这两个概念的时候有点晕,不知道真正的作用,困扰几天后,决定好好查查 具体的意思 一、ENTITY Entity(PO) 每个属性基本上都对应数据库表里面的某个字段。完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。持久对象是由insert数据库创建,...

manba 2万+

mybatis-plus 3.5.2 自动生成代码

mybatis-plus3.5.2自动生成代码。

亮大大的博客 1151

Entity与DTO区别及其使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34187862的博客 3729

java dto entity_DTO与Entity的区别

一.在调用业务方法时,DTO对象数据是由Action生成(可能是用户输入的Form数据,也可能是其他情况)为了说的清楚简洁,请允许我举个例子:用户更新自己的注册信息,例如修改密码之类的操作。用户提交页面-->ActionForm提取Form数据-->构造并对UserDTO赋值-->调用业务方法changePassword(UserDTOdto)把DTO对象传入业务方法-->...

weixin_35261775的博客 1342

java entity转dto_java 使用反射在dto和entity 实体类之间进行转换

packagecom.example.demo.utils;importjava.lang.reflect.Method;importjava.util.List;importcom.example.demo.domain.Users;importcom.example.demo.model.UsersModel;public classDto2Entity {/**** 将dto和entity之...

weixin_31477659的博客 425

java架构之项目结构(entity / DTO / VO)

定义类的讲究 定义类的讲究

王小禾 1万+

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 215

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 325
上一篇: dto.java.ftl 和 vo.java.ftl 两个核心数据传输对象模板文件1
下一篇: mybatis-plus-config.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、付费专栏及课程。

余额充值