read-AppFuse-18-AppFuse建立应用程序过程

【一文读懂】NTN(非地面网络)技术介绍 NTN,即非地面网络,是指利用卫星、高空平台(如无人机、平流层气球等)等非地面通信基础设施来实现全球通信覆盖的网络。在5G时代,NTN主要基于5G标准,特别是5G NR(New Radio)技术,通过卫星通信扩展地面网络的覆盖范围和服务能力。NTN技术的出现和发展,为全球通信带来了新的可能性和挑战。通过不断的技术创新和标准化推进,NTN有望在未来发挥更加重要的作用,为全球用户提供无处不在的通信服务。随着6G时代的到来,我们有理由相信NTN技术将迎来更加广阔的发展前景。 阅读详情

 

●    AppFuse建立应用程序过程复习

 

Ø 利用AppFuse生成应用程序5步曲

 

(1)    采用hibernate建立持久层的POJO对象。

i)建立POJO

src/dao/**/model目录下建立一个简单的Person对象,这个对象包括id、firstName

    和lastName属性。

     package org.appfuse.model;

     //该类继承BaseObject,提供必须的equals(), hashCode()和toString()方法

public class Person extends BaseObject {
        private Long id;
        private String firstName;
        private String lastName;
        //getter and Setter method

}

         ii)增加XDolcet标记,用来产生hibernate的映射文件

/**
* @hibernate.class table="person"
*/
public class Person extends BaseObject 

/**
* @hibernate.id column="id"
*  generator-class="increment" unsaved-value="null"
*/

 public Long getId() {

//注意所有的@hibernate.*标签必须在getters'的Javadocs里面。
    return this.id;
 }

(2)    运行ant setup-db产生映射文件和数据库表

<target name="setup-db" depends="db-create,db-prepare,db-load"/>

i)              ant db-create,执行metadata/sql/mysql-create.sql脚本,建立数据库和用户。

create database if not exists dudu;

grant all privileges on dudu.* to test@"%" identified by "test";

grant all privileges on dudu.* to test@localhost identified by "test";

 

ii)           ant db-prepare任务

<target name="db-prepare" depends="clean,package-dao"/>

Ø ant clean:

[delete] Deleting directory E:/app/appfuse/build

[delete] Deleting directory E:/app/appfuse/dist

[delete] Deleting: E:/app/appfuse/database.properties

        Ø <target name="package-dao" depends="prepare,compile-dao"/>

        Ø <target name="compile-dao" depends="hibernatedoclet"/>

        Ø compile-dao中调用ant hibernatedoclet任务

该任务使用xdoclet.modules.hibernate.HibernateDocletTask工具,根据POLO

生成对应的hibernate映射文件

Ødb-prepare任务

使用net.sf.hibernate.tool.hbm2ddl.SchemaExportTas工具根据hibernate

映射文件建立数据库表和表关系。

iii)        ant db-load任务根据使用dbunit工具metadata/sql/sample-data.xml往数据库表中插入测试数据。

(3)    创建Struts所需的PersonForm对象

Ø 为POJO添加Form对象需要的XDoclet标记

@struts.form include-all="true" extends="BaseForm"

 

        Ø 执行ant gen-forms生成struts所需的Form Bean

            <target name="gen-forms" depends="prepare" unless="webdoclet.uptodate"

                description="Generates ActionForms from POJOs">

                <taskdef name="xdoclet" classname="xdoclet.DocletTask"

                   classpathref="xdoclet.classpath"/>

        <!-- generate struts forms -->

                   <xdoclet destdir="${build.dir}/web/gen"

                       excludedtags="@version,@author"

            addedtags="@xdoclet-generated at ${TODAY}"

                       force="${xdoclet.force}"

            mergedir="metadata/web">

            <fileset dir="src/dao"/>

            <!-- generate struts forms -->

                       <actionform templateFile="metadata/templates/struts_form.xdt">

                       <packageSubstitution packages="model"

                               substituteWith="webapp.form"/>

            </actionform>

                   </xdoclet>

    </target>

(4)    利用AppGen工具,使用XDoclet自动创建文件

ant install -Dmodel.name=Person -Dmodel.name.lowercase=person

该命令会生成所需的文件,并将这些文件拷贝到主项目中。

Ø 利用该工具生成的文件:

i)              自动生成的DAO接口

public interface PersonDAO extends DAO {

    public List getPersons(Person person);

            public Person getPerson(final Long id);

            public void savePerson(Person person);

    public void removePerson(final Long id);

}

ii)           自动生成的DAO的Hibernate实现类

public class PersonDAOHibernate extends BaseDAOHibernate implements PersonDAO {

    public List getPersons(Person person) {

                    return getHibernateTemplate().find("from Person");

                  }

public Person getPerson(final Long id) {

            Person person =

(Person) getHibernateTemplate().get(Person.class, id);

     return person;

      }

      public void savePerson(final Person person) {

                   getHibernateTemplate().saveOrUpdate(person);

              }

      public void removePerson(final Long id) {

                   getHibernateTemplate().delete(getPerson(id));

               }

}

iii)        自动生成DAO的Spring配置文件

<bean id="personDAO" class="org.dudu.dao.hibernate.PersonDAOHibernate"

            autowire="byName"/>

</beans>

iv)           自动生成Manager接口

public interface PersonManager extends Manager {

    public void setPersonDAO(PersonDAO personDAO);

    public List getPersons(Person person);

    public Person getPerson(final String id);

    public void savePerson(Person person);

    public void removePerson(final String id);

}

v)              自动生成的Manager实现类

public class PersonManagerImpl extends BaseManager implements

    PersonManager {

    private PersonDAO dao;

    public void setPersonDAO(PersonDAO dao) {

                   this.dao = dao;

                }

    public List getPersons(final Person person) {

                   return dao.getPersons(person);

    }

    public Person getPerson(final String id) {

                   return dao.getPerson(new Long(id));

                }

    public void savePerson(final Person person) {

                   dao.savePerson(person);

                }

    public void removePerson(final String id) {

                   dao.removePerson(new Long(id));

                }

}

vi)           自动生成Manager实现类的Spring配置信息

                   <bean id="personManager" parent="txProxyTemplate">

                       <property name="target">

<bean class="org.dudu.service.impl.PersonManagerImpl"

             autowire="byName"/>

        </property>

        </bean>

</beans>

vii)        自动生成的全局常量

    public static final String PERSON_KEY = "personForm";

          public static final String PERSON_LIST = "personList";

}

viii)     自动生成的详细信息Action

/**

 * Action class to handle CRUD on a Person object

* @struts.action name="personForm" path="/persons" scope="request"

 *  validate="false" parameter="method" input="mainMenu"

 * @struts.action name="personForm" path="/editPerson" scope="request"

 *  validate="false" parameter="method" input="list"

 * @struts.action name="personForm" path="/savePerson" scope="request"

 *  validate="true" parameter="method" input="edit"

* @struts.action-forward name="edit"path="/WEB-INF/pages/personForm.jsp"

 * @struts.action-forward name="list"path="/WEB-INF/pages/personList.jsp"

        */

public final class PersonAction extends BaseAction {

            public ActionForward cancel(ActionMapping mapping, ActionForm form,

                                HttpServletRequest request,

                                HttpServletResponse response)

                   throws Exception {

                   return search(mapping, form, request, response);

                }

            public ActionForward edit(ActionMapping mapping, ActionForm form,

                              HttpServletRequest request,

                              HttpServletResponse response)

                   throws Exception {

        PersonForm personForm = (PersonForm) form;

        if (personForm.getId() != null) {

PersonManager mgr = (PersonManager) getBean("personManager");

            Person person = mgr.getPerson(personForm.getId());

                       personForm = (PersonForm) convert(person);

            updateFormBean(mapping, request, personForm);

                }

            … …

}

ix)           自动生成测试用数据库记录

            <table name='person'>

            <column>id</column>

            <column>first_name</column>

            <column>last_name</column>

            <row>

                   <value>1</value>

    <value>firstName</value>

    <value>lastName</value>

    </row>

    <row>

      <value>2</value>

      <value>firstName</value>

      <value>lastName</value>

    </row>

    <row>

      <value>3</value>

        <value>firstName</value>

        <value>lastName</value>

    </row>

  </table>

</dataset>

x)              自动生成JSP文件

<%@ include file="/common/taglibs.jsp"%>

<title><fmt:message key="personDetail.title"/></title>

<content tag="heading"><fmt:message key="personDetail.heading"/></content>

<html:form action="editPerson" method="post" styleId="personForm"

    focus="" οnsubmit="return validatePersonForm(this)">

<table class="detail">

<html:hidden property="id"/>

    <tr>

        <th>

            <dudu:label key="personForm.firstName"/>

        </th>

        <td>

            <html:text property="firstName" styleId="firstName"/>

            <html:errors property="firstName"/>

        </td>

    </tr>

    <tr>

        <th>

            <dudu:label key="personForm.lastName"/>

        </th>

        <td>

            <html:text property="lastName" styleId="lastName"/>

            <html:errors property="lastName"/>

        </td>

    </tr>

    <tr>

        <td></td>

        <td class="buttonBar">           

            <html:submit styleClass="button" property="method"

                   οnclick="bCancel=false">

                <fmt:message key="button.save"/>

            </html:submit>

            <html:submit styleClass="button" property="method"

                οnclick="bCancel=true; return

                       confirmDelete('Person')">

                <fmt:message key="button.delete"/>

            </html:submit>

            <html:cancel styleClass="button" property="method"

                   οnclick="bCancel=true">

                <fmt:message key="button.cancel"/>

            </html:cancel>

        </td>

    </tr>

</table>

</html:form>

<!—这段代码测试时需要删除-->

<!—否则会报javax.servlet.jsp.JspException: No form found under 'personForm' in locale 'zh_CN'错误-->

<html:javascript formName="personForm" cdata="false"

    dynamicJavascript="true" staticJavascript="false"/>

<script type="text/javascript"

    src="<html:rewrite page="/scripts/validator.jsp"/>"></script>

xi)           DAO Test

xii)        Manager Test

xiii)     Action Test

xiv)        Canoo测试代码

xv)           自动生成资源配置文件信息

xvi)        自动生成Strtus Menu配置信息

xvii)     自动生成Struts Menu Jsp

 

(5)    执行ant deploy生成web应用,修改web应用,以符合你的应用需要,测试.

  注:

ant install -Dmodel.name=Person -Dmodel.name.lowercase=person

该命令合并Constants.java文件、sample-data.xml文件、web-tests.xml文件ApplicationResources_en.properties文件,合并struts menu文件,将生成所有文件拷贝到注项目中。

AppGen生成的Jsp文件首字母是大写的,(关键)执行完以上命令后,应该将AppGen生成的struts所需的Jsp文首字母改为小写字母。这是AppFuse帮助文件中没有提及的,如果不执行这样步骤,web容器测试时,struts Action会因为forward所指jsp文件首字母是大写的而无法执行。

 

 

基于DRU-HVDC的构网型海上风电场环流机理仿真复现 本文介绍了基于DRU-HVDC的构网型海上风电场环流机理仿真模型的构建方法。主要内容包括: 完整的Simulink模型结构,包含主模型文件GFM_DRU_Main.slx和配置脚本GFM_DRU_Setup.m 系统参数设置,包括基础频率(20Hz)、电压基准值(690V)、功率基准值(2MVA)等 四种仿真场景配置:电压不平衡、相位不平衡、阻抗不平衡和频率不平衡 风力发电机(WT)子系统的详细构建步骤,包含电压源、输出阻抗和测量模块 变压器和DRU整流器的参数设置 该模型可用于研究构网型风电场的环流机理。 阅读详情

相关推荐

博科的SAN交换机基本操作

2、添加用户testuser赋予user权限可以访问1-128VF默认VF为128账号描述"Test user"密码为password123。1、创建zone别名(100是指当前设备Domain ID,1和2是指对应的index号)2,删除新接入设备的ZONE或保持ZONE配置一致。3、将zone添加到当前生效的CFG中。2、将zone添加到当前生效的CFG中。3、将zone添加到当前生效的CFG中。3,将添加的级联端口持续关闭。4、将当前zone生效。4、将当前zone生效。1、查看当前所有用户。

chenjunokok的博客 1838

read AppFuse 15-XDoclet学习

read-AppFuse-15-实践-建立Action续    ●     使用XDoclet创建JSPs骨架Ø 利用AppFuse中提供的AppGen工具,可以根据POJO和管理类这两个类,通过Xdoclet生成Strutsh和Spring需要的所有文件和配置信息,大大简化了开发流程,非常方便。    Ø AppGen生成文件列表          1. 对应的DAO Test 类       

dudutu的专栏 1455

从零开始开发AI Agent:基于大模型的智能体实战指南

### 摘要 本文介绍了AI Agent的开发全流程,从基础概念到实际部署,涵盖大模型集成、工具调用和记忆系统构建等核心技术。通过电商客服案例展示实战应用,并提供调试优化与部署方案,最后展望了AI Agent的未来发展方向,帮助开发者快速掌握智能体开发技能。

ghs_gss的博客 4868

read-AppFuse-19-自动生成代码描述

●    AppFuse的AppGen工具为我们自动生成了大量的代码,现在对关键业务代码做以回顾和总结Ø 描述:i)              表单提交后,struts将转动相应的action类。AppFuse中的Action执行方法选择是通过Struts的LookupDispatchAction实现的,虽然这样可以实现一个Action根据url参数处理多种方法,但可扩展型比较差,调试麻烦,实现复

dudutu的专栏 2302

OnePlus救砖指南:线刷包与OTA全量包实战解析

本文详细解析了OnePlus手机救砖的两种核心方法:线刷包与OTA全量包。针对手机变砖的不同状况(如黑屏、能进Recovery等),文章提供了清晰的判断标准和对应的实战操作指南。重点阐述了线刷包作为终极救砖手段的底层原理与详细步骤,并对比了OTA全量包作为温和修复方案的使用场景与卡刷流程,旨在帮助用户安全、有效地恢复手机系统。

weixin_28312391的博客 1326

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 381

read AppFuse 12-实践-建立DAO

●     按照AppFuse帮助,实践实践次步时,一切都还正常,唯有最后测试时,始终不通,试了n多办法,无果。如果那位网友看到,知道结果的,烦请告知,在此先谢过了。具体的错误分析见文尾。Person是基本的POJO,PersonDAO是Person的管理类,PersonManager是 Business Facades. 这些façade用于连接前端和DAO层之间的通讯。Ø 在web环境下,Sp

dudutu的专栏 1950

Mac开发环境一键配置指南|从零到生产力

类别工具包管理Homebrew终端版本管理容器编辑器效率用一键脚本的话,2小时内可以搞定全部环境。有问题评论区交流~

在代码的世界里,每天进步1% 624

read AppFuse 16-XDoclet学习续

read-AppFuse-16-XDoclet学习续● xdoclet学习续Xdoclet是一个代码自动生成的工具XDoclet任务就是Ant的自定义任务,除此以外,没有其他运行XDoclet任务的方法。XDoclet它有两个重要的组件:进行特殊标记的 Java 源文件。 预先定义的模板。[引用]  Merge File用来处理无法在Source Code中加xdoclet tag的情况。 Ø X

dudutu的专栏 1802

Unity2020 发布Android包,下载安装配置JDK、SDK、NDK详细教程

配置成功页面 JDK、SDK、NDK

qq_41263535的博客 1万+

(汇总篇)语义SLAM相关开源方案| 全球优秀作者与实验室 | SLAM学习资料整理

SLAM 与深度学习相结合的工作当前主要体现在两个方面,一方面是将语义信息参与到建图、位姿估计等环节中,另一方面是端到端地完成 SLAM。针对建图的工作一方面是利用几何信息进行稠密重建,另一方面很多工作利用语义信息达到了很好的语义重建效果,三维重建、SFM。动态 SLAM 也是一个很值得研究的话题,这里不太好分类,很多工作用到了语义信息或者用来三维重建,收集的方案相对较少。优化可能是 SLAM 中最难的一部分了吧 +_+ ,一般都是直接用现成的因子图、图优化方案,要创新可不容易。

熊猫小妖的AI世界 7870

read-AppFuse-20-AppGen分析

       只需要一个POJO产生所需的所有配置和文件。●    build.xml文件分析 Ø 功能说明该工具主要完成i)                 利用XDoclet自动产生文件ii)                配置Springiii)              配置资源文件iv)              配置数据库测试数据v)               将生成的文件拷贝到主项

dudutu的专栏 1622

delphi 调用deepseek r1 api 并流式返回结果

摘要:本文展示了一个使用Delphi调用DeepSeek API的代码示例,包含两种调用方式:一次性获取结果和流式返回结果。代码实现了完整的API请求处理,包括HTTP客户端设置、JSON数据处理和UI界面交互。其中流式调用通过TStreamReader处理服务器发送事件(SSE),实时更新到TRichEdit控件并保持滚动条位置。文章还提到界面美化优化,为Delphi开发者提供了调用AI服务的实用参考方案。(150字)

全粘工程师 501

read AppFuse 13-实践-建立Manager

read AppFuse 13-实践-建立Manager●     按照AppFuse帮助,实践Ø 业务类图    Ø 对于这一部分的实现,没有什么好说的,基本上是对DAO层的一层包装,Manager类,它的主要职责是持久户层(DAO)和web层之间的一个桥梁,它也很好的把展示层和数据库层(例如Swing应用)解耦,Managers必定是应用程序所有的业务逻辑所在的地方。 Ø PersonMana

dudutu的专栏 1600

VB摄像头监控

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

lwip-2.0.3

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

read AppFuse 11-实践-业务信息person的建立

read AppFuse 11-实践-业务信息person的建立●     按照AppFuse帮助,进行AppFuse开发实践(1)     创建POJOpackage org.dudu.model;/** * @hibernate.class table="person" */public class Person extends BaseObject{   private Long id;  

dudutu的专栏 1518

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

read AppFuse 14-实践-建立Action

read-AppFuse-14-实践-建立Action●     根据AppFuse的帮助,实做Action●     为Person POJO添加XDoclet tags@struts.form include-all="true" extends="BaseForm"AppFuse的Struts使用到了validator框架实现用户输入验证。Ø Validator框架学习 将校验规则代码集中到

dudutu的专栏 1500

read AppFuse 17-复习

read-AppFuse-17-复习●     AppFuse建立应用程序过程复习(1)     采用hibernate建立持久层的POJO对象。i)建立POJOsrc/dao/**/model目录下建立一个简单的Person对象,这个对象包括id、firstName    和lastName属性。     package org.appfuse.model;     //该类继承BaseObje

dudutu的专栏 1436

read-AppFuse-21-ant再探

 ●    AppFuse的ant构建使用非常复杂,功能也非常强大,怎样能够充分的利用它,为我所用,在今后的开发中大幅度的减轻开发量,顾做此详细研究(其中不包括测试任务)。 Ø build.xml的正常运行依赖以下文件i)                 properties.xml该文件定义build.xml所需的属性值,主要完成通过build.properties 产生database.pro

dudutu的专栏 1357

Failed to load module script:服务器回的是 text/html

当模块脚本(<script type="module">)请求的资源返回 200 状态但 Content-Type 为 text/html 时,浏览器因严格 MIME 检查而拒绝加载,报错“Expected a JavaScript-or-Wasm module script but received text/html”。该问题常见于缺失的 chunk 被服务器错误返回 index.html。与经典脚本不同,模块脚本始终强制检查 MIME 类型,即使状态码成功也无效。import() 的拒绝仅提示 Fai

qq_40822000的博客 197

GPT Image 2 出的 UI 图如何转成 HTML 和可编辑 Figma

AI 生成的 UI 图,本身只是起点。用 Codex 或 Claude Code 把它变成 HTML,就有了能演示的页面;用 html.to.design 把 HTML 导回 Figma,就有了能沉淀的设计源文件;用 Codia 直接把图转成 Figma,则适合只要设计稿、追求速度的场景。三条链路互相补充,组合起来就形成了"图、代码、设计稿"之间的闭环。同时也要清楚它的边界:单张位图缺少精确数值,像素级还原目前还做不到稳定;图里的文字和图标需要人工把关。

JEECG官方博客 239

开源项目推荐:2027 高考志愿填报指北|开源单页 HTML 高报资料工具书

高考志愿填报信息量大、维度多,考生与家长往往面临资料零散、信息不对称、优质内容收费门槛高等问题。《2027 高考志愿填报指北》是雪人老师开源的高报笔记资料汇编,将 683 篇、280.5 万字的原创笔记整合为单页 HTML 电子书,覆盖专业、院校、城市、填报攻略四大板块。支持左侧折叠导航、快速跳转、浏览器原生 A4 打印,可在线阅读也可本地保存使用,采用 CC BY-NC 4.0 协议开源,非商业场景可自由传播改编,是高考志愿填报阶段实用的免费参考工具书。关键词:高考志愿填报;高报资料;开源电子书;

Admans的专栏 321

PageAdmin在10万级数据下生成静态Html的速度实测

之前测试的大部分CMS,如phpcms、dedecms等在10万级别下全量生成静态普遍要4个小时以上,dedecms甚至中途卡死,这次对pageadmin cms进行测试,测试说明见下文。11多万条的文章,pageadmin的耗费时间只用了10分钟12秒,比起之前测试dedecms、phpcms生成10万文章动不动要4-5个小时,pageadmin的效率高了20多倍。:包含1个大文本(text)字段,6个varchar字段,8个int类型字段,2个datetime字段,这是网站最常用的文章表结构。

186

WordPress 开了 CDN 首页仍慢或每次都像在回源:先核 HTML 是否命中边缘缓存,再查缓存头与回源链路

CDN 已经挂上了,测速图或海外客户却还在说「首页打开要等好久」。静态图片、CSS 看起来挺快,首屏文字却像是在远处一台机器上现算。有人建议换一家 CDN,有人怀疑主题太重,也有人直接把全站缓存时间拉到最长。这和近期已发的。「静态资源 404 / 后台样式错乱」卡的是回源 Host、HTTPS 和混合内容,资源根本没加载对;「TTFB 很高但静态资源很快」卡的是源站页面缓存、慢查询和对象缓存,讨论时往往还没先确认 HTML 有没有在边缘命中;「改了报价还看见旧版」卡的是五层缓存清不掉旧内容;

20年技术经验|专注小程序+外贸独立站|已服务500家企业,分享创业中有趣的产品和技术经验。 270

网页 HTML 基础入门:从基本结构到表单实战

HTML 是网页开发的第一步,掌握基本结构、常用标签、超链接、图片和表单后,就可以独立写出简单的静态页面。先熟悉 HTML 基本结构,养成规范书写习惯。练习常用标签,尤其是链接、图片和表单。遇到不熟悉的标签,随时查阅 W3School 手册。掌握 HTML 之后,可以继续学习 CSS 美化页面,以及 JavaScript 实现交互,逐步进入完整的前端开发领域。

TAOZE123的博客 382

一个简单的js javascript+html字幕浮动窗口

【代码】一个简单的js javascript+html字幕浮动窗口。

大话程序员 34

Word 转 HTML API:DOCX 上传、公开 URL 与内联 HTML

咕咕数据 Word 转 HTML API 接收单个未加密的 DOC 或 DOCX,可上传本地文件,也可传入公开文件 URL。两种输入都返回 HTML 内容,并按 storage 提供公开下载地址或私有文件引用。

DevOpenClub 专栏 176

HTML 转 Word API:HTML 与 URL 输入、DOCX 输出和版式核对

HTML 转 Word API 可把 HTML 正文或公开网页转为可编辑的 DOCX。请求用 type 指定输入类型,用 content 传正文或地址。可选择公开链接或归属当前应用的私有文件引用。

DevOpenClub 专栏 261
上一篇: read AppFuse 17-复习
下一篇: read-AppFuse-19-自动生成代码描述
dudutu
博客等级 码龄21年 6粉丝 83原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值