note2.Webx 2.x初始化之webxLoader

VLOOKUP_fixed.py 立即下载
Webx初始化之webxLoader:

上一个note主要记录了webx整体调用过程和步骤:从webxController → RunData构建 → Pipeline调用  → valve逐个调用 → module调用

本note将以webx框架中几个主要的对象初始化来讲解整个webx框架初始化过程

webxLoader是WebxController接口的实现:

对web应用讲:保存了一个web应用中所有的配置(ServletConfig)和上下文(ServletContext)信息。
对webx框架讲:是整个框架的控制器,也是所有Services的构建容器,是框架对象的信息载体和服务提供者。
webxLoader类图关系如下: 

可以看到webxLoader是WebxControllerListener和WebxControllerServlet的全局变量。

WebxLoader的初始化过程:
webxControllerListener:

当web容器启动时,先调用listener的contextInitialized()
1.先试着去应用上下文获取webxLoader的对象引用,启动时肯定获取不到
2.发现无法获取到对应的webxLoader,新建webxLoader对象,初始化webxLoader中的log、servletContext对象,并设置ServletConfig为null。
Note1:虽然目前已经完成了log初始化,但是由于log配置还没有加载,log实际是不可用的
3.配置webxLoader对象。配置主要分为以下几个步骤:
a) 创建资源加载器
    在配置是先创建WebappBootstrapResourceLoaderService对象resourceLoader,用来获取各个配置文件的路径
Note2:这里因为还没配置logger,所以设置loggerReady为false,表示日志系统还没准备好
b) 配置日志系统
    取日志输出根目录路径;试着从web.xml容器获取loggingRoot的值,exodus2应用中配置了相关项,获取日志根目录的位置,loggingRoot值在具体应用中采用autoconfig注入;
    设置日志的几个参数值:loggingRoot(日志记录根目录)、server.host(主机名)、server.addr(主机地址);
    取log4j的配置文件路径:试着去web.xml中获取log4j.configuration值,exodus2中没有配置,所以采用默认路径/WEB-INF/log4j.xml,如果去解开war包,就能在WEB-INF中看到对应的文件;
    根据路径装载log4j的配置路径载入文件:如果配置路径是以.xml结尾,表示采用log4j的xml方式载入,其他的方式采用properties载入;
    设置loggerReady为true表示可以进行日志记录了,和Note2对应,如果把日志级别调整到info,就会发现webx.log日志最开始是"Configured log4j from",接着就是"====================",代码log4j配置就是从这里开始;
c) 获取scheme
    设置schemeName:试着从web.xml容器获取webx.scheme相关配置,exodus2没有配置所以无法获取,设置为默认值"turbine";
    加载schemeClass:采用当classLoader去加载classpath中"META-INF/Services/webx.scheme.turbine"文件,在"jar:file:/home/madding/workspace/olps/exodus2/webx_experiment/deploy/jboss_server/tmp/deploy/tmp1696684320301442655web-exp.war/WEB-INF/lib/toolkit.webx.turbine-2.0.jar!/META-INF/services/webx.scheme.turbine"找到了对应的配置项并加载。目前该配置文件配置了scheme类名为"com.alibaba.turbine.scheme.TurbineScheme"(在初始化services时调用这个类);
Note3:这里的加载方式和log4j找文件的加载方式不同,所以能加载到classpath中的资源
    生成对应的scheme类:用classLoader新建一个实例,scheme对象生成。
Note4.目前webxLoader已经完成了以下几个成员变量的初始化:log、servletContext、scheme
d) 获取servletPaths
    获取servletPahts列表:试着从web.xml容器获取webx.servlet.paths对象,exodus2中没有配置,所以获取不到,返回一个空数组;
    servletPaths对象目前为非null,但是是空数组
e) 获取webx配置文件
    获配webx配置文件路径:试着去web.xml容器中获取"webx.configuration"值,exodus2中没有配置,采用scheme的默认配置值"/WEB-INF/webx.xml";
    获取配置项的URL:exodus2中没有配置"webx.xml",抛出异常并捕获
    新建webx配置类:试着去web.xml文件中查找"webx.configuration.loader.class",exodus2中没配置,采用scheme的默认配置加载类"com.alibaba.webx.configuration.WebxConfigurationLoader",最终配置类采用的是基本配置类新建出来
    获取组件名列表:试着去web.xml容器中获取"webx.components"值,exodus2配置了这个配置项,值为:"home,member,company,offer,misc,ims,product,bizexpress,message,aso,domain,smarket,album",就是exodus2包含的13个web组件,去除空格保存在临时数组中。
    获取每个组件配置信息,举例home组件:
        获取home组建的配置路径:jndi:/localhost/WEB-INF/home/webx.xml
        判断一下当前组件是否在resourceLoader中,如果不在其中,设置组件信息并把这个组件实例放到实例池中,后面会用到这个resourceLoader去获取组件
        加载组件对应的webx.xml文件,保存到componentConfiguration临时对象中
        去除重复对象
    把webx.xml中值以key/value方式不断的组合转存到要返回的配置文件对象中。
Congiguration内容如下:{
services.instances=home,
home.services.ModuleLoaderService.earlyInit=false,
home.services.ModuleLoaderService.module.packages=[com.alibaba.exodus2.web.home.module, com.alibaba.exodus2.web.common.module],
home.services.SecurityMappingService.class=com.alibaba.china.common.webx.service.mapping.SecurityMappingService,
home.services.SecurityMappingService.earlyInit=false,
home.services.VelocityService.class=com.alibaba.service.velocity.DefaultVelocityService,
home.services.VelocityService.earlyInit=true,
home.services.VelocityService.file.resource.loader.path=/templates/home,
home.services.VelocityService.file.resource.loader.cache=true,
home.services.VelocityService.input.encoding=GBK,
home.services.VelocityService.parser.pool.size=20,
home.services.VelocityService.velocimacro.library=[macros.vm,/security/securitymacro.vm],
home.services.VelocityService.eventCartridge.classes=com.alibaba.china.fasttext.security.velocity.SecurityReferenceInsertionEventHandler
}
对比一下对应的webx.xml:
<?xml version="1.0" encoding="GB2312"?>
<configuration>
    <services>
        <!- 装载turbine module的service,例如:screen、action、control等。 ->
        <service name="ModuleLoaderService">
            <property name="module.packages">
                <value>com.alibaba.exodus2.web.home.module</value>
                <value>com.alibaba.exodus2.web.common.module</value>
            </property>
        </service>
        <service name="SecurityMappingService" class="com.alibaba.china.common.webx.service.mapping.SecurityMappingService">
            <property name="unProtectedURLs"/>            
        </service>
        <!- Velocity模板引擎,用来渲染velocity写成的页面模板。需要TemplateService的支持。 ->
        <service name="VelocityService"
            class="com.alibaba.service.velocity.DefaultVelocityService" earlyInit="true">
            <property name="file.resource.loader.path" value="/templates/home"/>
            <property name="file.resource.loader.cache" value="true"/>
            <property name="input.encoding" value="GBK"/>
            <property name="parser.pool.size" value="20"/>
            <property name="velocimacro.library" value="macros.vm"/>
            <property name="velocimacro.library" value="/security/securitymacro.vm" />
            <property name="eventCartridge.classes" value="com.alibaba.china.fasttext.security.velocity.SecurityReferenceInsertionEventHandler" />
        </service>
    </services>
</configuration>
    可以看见其实所谓的configuration其实就是每个组件对应的xml配置:
    每个组件services配置以componentName.services开头
    services.instances指定组件名字
    *.class指定引用到的相关services
    把webx-default.xml读取到内存:读取"/WEB-INF/webx-default.xml"文件,获取URL为:"jndi:/localhost/WEB-INF/webx-default.xml"(从这里看出,代码是先加载各个组件的webx.xml再去加载webx-default.xml)。
    配置main-instance的内容:获取所有的main-instance服务,这里的服务器是指webx-default.xml中的services配置,如果这些services还没添加到公共的configuration的配置文件(说明:刚才把所有的组件配置都存储到这里了),通过循环把main-instances services组件及配置添加到这里(注意:这里的Services配置必须是非"."号分割的,要不然代码将无法获取到这些services配置)
    配置sub-instance的内容:在e)中,代码已经将所有组件配置都放到了configuration中,在配置sub-instance时,为每个组件配置对应的sub-instance内容,以home为例:home.services.JspService.class=com.alibaba.service.jsp.DefaultJspService。这样我们就发现,其实所谓的sub-instance只是所有组件的公共配置而已,如果组件本身包含了对应的内容,则不再包含sub-instance中的内容。(注:这里说的重复配置项包括service以及其属性配置)
    配置main-instance的非services配置项:exodus2中没有作这块配置
    配置sub-instance的非services配置项:exodus2中没有作这块配置
    向配置添加一个新的配置项key/value如下:services.ThreadContextService.factory.default=com.alibaba.webx.service.rundata.RunDataObjectFactory
    到这一步,configuration添加webx-default.xml中services内容,同时把各个组件中的services给初始化好

f) 初始化serviceManager
    获取manager配置类名:去web.xml容器查找"service.manager.class"的值,exodus2目前没配置,采用scheme中默认的serviceManager容器名"com.alibaba.webx.service.DefaultWebxServiceManager"
    获取manger实例:通过classLoader获取manager对象
    配置servicesManager:设置bootstrapResourceLoaderService为resourceLoader,设置configuration为一直配置的配置项保存地址。
    初始化servicesManager:
        创建service名称和service配置的映射:
            初始化以下几个属性:instanceNames、instanceContexts、instanceConfigurations、services、serviceNames
        初始化resource Loader services.class
            创建main-instance中的ResourceLoaderService对象
            为每个组件创建ResourceLoaderService对象
            创建过程:首先从services获取ServiceInstance,再调用ServiceInstance的获取实例对象获取具体的service。
        初始化earlyInit的services
    把webxLoader对象以key/value形式存储在servicesManager的attribute对象中,key为webx.controller
    注意:这里有必要仔细看一下DefautlServiceManager.services属性的创建过程,该属性包含了所有service对象,services以键值对存储serviceInstances对象。serviceInstances的serviceInstanceContext包含了具体services对象。代码中通过传要初始化的servicesName调用 DefaultServiceManager.this.createServiceInstanceContext获取serviceInstances实例。查看代码最终是调用new DefaultWebxComponent(this, instanceName)产生ServiceInstanceContext。
    
g) 配置其他webxController
    rundataServices的实例化
    threadContextService实例化
    componetNames实例化
    components实例化,value是ServiceInstanceContext
    把webxLoader的引用以key为webx.controller放到servletContext中去
h) 是否选择实例化所有的services
    调用DefaultServiceManager去初始化所有的services,exodus2默认配置初始化所有services

webxControllerServlet:
这样,webxLoader实例就建立起来了。在webxControllerServlet中通过获取servletContext获取到具体的对象。
并把webx.controller.servlet.config=getServletConfig()以建值对放到getServletConfig()中

这样webxLoader就初始化好了。
下一个note将重点介绍ServicesManager创建和ServicesManager创建services的过程。

D打卡签到,蓝牙中继,广播信号模拟器 模拟WIFI或蓝牙,有如下4种运行模式 1、WIFI模式:指定SSID、BSSID名称等,模拟WIFI,供设备连接。 2、蓝牙静态模式:指定MAC地址,广播固定的RAW数据。 3、蓝牙动态主机模式:扫描周围蓝牙设备,获取指定MAC地址的蓝牙及其RAW数据,实时发送至Cloud云端,可以设定时间段,只在设定的时间段内发送。 4、蓝牙动态从机模式:指定MAC地址,从Cloud云端获取动态主机模式实时上传的该MAC地址的RAW数据,并广播RAW数据。 准备工作: 1、板子:选择ESP32C3或ESP32C3 Supermini 2、nRF Connect手机app:用于扫描获取待模拟蓝牙设备的MAC和RAW数据。 Wifi分析仪或WiFi魔盒手机APP:用于扫描获取待模拟WIFI设备的SSID和BSSID。 3、可使用官方flash_download_tool_3.9.11工具来固件烧录。 使用说明: 上述完成后,设备首次上电,RESET一侧的指示灯会常亮,可以把它理解成电源指示灯; BOOT一侧的灯会亮,该灯常亮,表示设备开启了AP模式,此时设备会发射一个WIFI信号源,名称为ESPWIFI_AP,密码为12345678,手机或电脑连接该WIFI,浏览器输入192.168.4.1,进入设备的配置页面,进行相应的配置,其中动态主机模式和动态从机模式的SSID、Pwd 及要模拟的蓝牙MAC地址。配置完成并保存后,会重启,重启后设备会按照保存的配置运行。若下次要修改设备配置,可以长按BOOT按键,等待BOOT一侧的灯常亮,即进入AP模式,再按照上述流程配置即可。 仅用于蓝牙设备的开发与调试,请勿用于签到等违法违纪用途。 立即下载

相关推荐

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

STM32硬件启动与调试避坑指南:BOOT0/NRST/ST-Link实战要点

STM32硬件启动和调试是嵌入式开发中故障率最高的环节,其本质是电源时序、引脚电平、时钟配置与协议握手的协同过程。BOOT0决定启动模式采样窗口,NRST影响复位同步与PLL锁定,ST-Link则受限于电压匹配、布线阻抗与时钟适配。这些底层硬件行为直接导致常见问题:程序不启动、下载失败、串口乱码、中断失能等。掌握BOOT0电平稳定性要求、NRST与POR协同设计、SWD信号完整性控制及串口波特率误差校验,是保障工业级STM32系统稳定运行的基础能力。本文聚焦量产级硬件调试经验,覆盖STM32F1/F4/H7

weixin_33912638的博客 458

企业级AI助手平台 开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力 支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化

企业级AI应用开发框架,支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化能力,提供可视化流程编排、自主决策智能体与多智能体协同调度,兼容主流 Agent Skill 协议,帮助企业与开发者零门槛快速构建安全、高效、可落地的AI智能体应用与行业解决方案。

Webx框架指南

Webx框架指南 Michael Zhou zyh@alibaba-inc.com> 2010-11-13 引言 1. 阅读向导2. Webx是什么?3. Webx的历史4. 为什么要用Webx而不是其它的开源框架?5. Webx的优势 5.1. 成熟可靠性5.2. 开放和扩展性 6. Webx还缺少什么? 部分 I. Webx框架概览

panyuwu的专栏 5010

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型等

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 Spring Boot, MyBatis, Flowable, TypeScript, Vue, Antdv, 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型、代码生成器等

文创媒体电商行业智算中心(AIDC)建设规划方案.pptx

文创媒体电商行业智算中心(AIDC)建设规划方案.pptx

webx3.x之多语言支持扩展

概述 本文讨论多言语在webx上的实现,其中提到的是多语言并非国际化,国际化需要包含的内容更多,多语言只是国际化中的一部分而已。 背景 1.新的海外业务起来,但是未完全成熟,需要不长期的多语言版本支持 2.同一个应用统一页面需要提供不同语言翻译 3.目前只是提供文案上的翻译,不提供或少量结构上的变化 思考 1.webx不在维护范围内,想东webx代码难,而且可能影响面比较大,所以排除

madding 1763

集团企业数字化转型AI智能体平台规划及场景应用方案.pptx

集团企业数字化转型AI智能体平台规划及场景应用方案.pptx

note1.Webx 2.x概貌

对于JSP/Servlet应用,只要查看Web.xml文件就知道入口点了。 可以看到web.xml中主要有几个东西: 1.context(声明应用范围内的初始化参数) 代码中主要应该用到三个参数: loggingRoot:应用日志输出路径 initAllServices:是否初始化所有服务,指定框架是否启动时初始化所有组件 webx.components:目前这个web

madding 1092

基于动态窗口法DWA的机器人路径规划研究(Matlab代码实现)

内容概要:本文系统研究了基于动态窗口法(DWA)的机器人局部路径规划算法,深入剖析其在动态环境中实现自主避障与实时轨迹优化的核心机制。文章详细阐述了DWA算法的速度空间采样策略、轨迹预测模型、动力学约束处理及多目标代价函数的设计原理,并通过构建完整的Matlab仿真框架验证算法有效性。结合典型场景的仿真实验,展示了机器人在复杂障碍物环境下如何实时生成安全、平滑且符合运动学约束的最优路径,充分体现了DWA在移动机器人导航中的实用性与鲁棒性。; 适合人群:具备机器人运动规划基础知识和Matlab编程能力,从事智能移动机器人、自动驾驶或服务机器人研发的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解DWA算法的理论基础与实现细节;②掌握机器人局部路径规划的仿真实现方法;③为实际机器人系统的导航模块开发提供可复用的算法原型与代码参考;④作为进一步研究高级导航算法(如TEB、MPC)的技术基础。; 阅读建议:建议结合提供的Matlab代码逐模块分析与调试,重点关注速度采样、轨迹积分、障碍物距离计算及代价评估等关键环节,通过调整参数在不同地图环境中进行对比实验,以深刻把握算法性能与参数之间的关系,进而提升对实时路径规划系统设计的理解与应用能力。

【轴承故障诊断】用于轴承故障诊断的集中时频分析研究(Matlab代码实现)

内容概要:本文系统研究了用于轴承故障诊断的集中时频分析技术,重点解决了传统时频分析方法在处理非平稳信号时存在的能量分散与分辨率不足等问题。通过引入集中时频分析方法,能够有效聚焦信号能量,精确提取轴承故障特征频率,提升故障识别的准确性与时效性。文章详细阐述了该方法的理论基础,并结合仿真信号与实际实验数据验证其优越性能,同时提供了完整的Matlab代码实现流程,涵盖信号预处理、时频变换、参数优化及结果可视化等环节,便于读者复现与拓展应用。; 适合人群:具备一定信号处理理论基础和Matlab编程能力的研究生、科研人员,以及从事机械设备状态监测、故障诊断与预测性维护工作的工程技术人员。; 使用场景及目标:①应用于电机、风机、齿轮箱等旋转机械的早期轴承故障检测,实现故障预警;②提升工业设备运维系统的智能化水平,支撑预测性维护体系构建;③作为高校或研究机构在信号处理、机械故障诊断等课程中的教学案例与实践素材。; 阅读建议:建议读者结合文中提供的Matlab代码逐段运行与调试,深入理解集中时频分布的生成机制及其关键参数(如核函数选择、平滑窗口大小)对诊断效果的影响,并尝试将其应用于其他类型的机械故障信号分析中,开展对比研究以深化对该方法适用性的认识。

note4.webx 2.x之some service

doing... RequestContextChainService

madding 965

2024 《计算机网络》实验教学指导书.doc

2024 《计算机网络》实验教学指导书.doc

note3.webx 2.x之serviceManager

doing...

madding 863

基于MPC的风储联合调频模型研究(Simulink仿真实现)

内容概要:本文系统研究了基于模型预测控制(MPC)的风能与储能系统联合频率调节模型,并通过Simulink工具实现了完整的仿真验证。文章深入剖析了风储联合系统的整体架构设计,详细阐述了MPC控制器的建模原理及其在电网频率调节中的具体应用机制,重点探讨了系统在应对负荷突变与风电功率波动等典型扰动下的动态响应特性与控制性能表现。通过与传统控制策略的仿真实验对比,充分验证了所提出的MPC方法在提升电网频率稳定性、抑制频率偏差方面的显著优越性,并进一步分析了控制器关键参数对系统整体性能的影响规律,为高性能控制策略的设计提供了理论依据。; 适合人群:具备电力系统分析、自动控制理论基础,熟练掌握Simulink/Matlab仿真环境,从事新能源并网、电力系统稳定控制、储能系统集成与优化等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于高比例可再生能源接入背景下电网频率调节的关键技术研究;②为风储联合系统的规划、设计与运行优化提供先进的控制策略参考;③作为模型预测控制在电力系统领域应用的经典教学案例,深化对MPC预测机制、滚动优化与反馈校正等核心原理的理解与实践能力。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作与验证,重点关注MPC控制器的状态空间建模、预测时域设定、代价函数构建及参数整定过程,通过对比不同工况与参数配置下的仿真结果,深入理解风储系统协同调频的作用机理与MPC控制的优势所在。

STM32F407 步进电机S形曲线加减速

步进电机

smallerlang的博客 1591

note5.webx 2.x之pipeline

doing...

madding 825

1.3、云计算HCIP融合存储产品及部署

目标:描述Oceanstor V3系列存储产品系统组成及产品定位 描述Oceanstor V3硬件结构及软件架构 掌握存储系统与主机系统之间的连接 一、存储型号 低端型存储:Oceanstor 2200 2600 2800 V3/V5 终端型存储:Oceanstor 5300 5500 5600 5800 6800 V3/V5 高端型存储:Oceanstor 18000 二、Oceanstor V3系列存储系统定位 OceanStor V3系列存储系统是华为根据存储产品应用现状和存储

weixin_43666279的博客 1653

note6.webx 2.x之valve

doing...

madding 790

形位公差标注的常见误区与优化策略

本文深入解析机械设计中形位公差标注的常见误区与优化策略,特别针对NX2406用户提供实用技巧。从标注冗余、基准选择到公差值设定等五大误区入手,结合工程图实例展示如何提升标注精度与效率,帮助工程师避免常见错误,优化设计流程,确保零件功能实现与制造可行性。

info6的博客 244

安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案

本文主要介绍了安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+
上一篇: note1.Webx 2.x概貌
下一篇: note3.webx 2.x之serviceManager
「已注销」
博客等级 码龄20年 47粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值