探索Vue小程序框架的底层原理

【实习周记】微信网络组件——腾讯Mars框架的原理、编译和使用 腾讯mars框架的编译和使用腾讯Mars框架的原理、编译和使用一.Mars的编译二.Mars的使用1.初始化Mars2.通过长连接发送消息3.使用短链接发送4.接收相应请求的返回消息5.接收服务端发送的消息三.Mars的原理1.Mars工作机制2.Mars代码中对应的方法3.避免Mars的机制 腾讯Mars框架的原理、编译和使用     Mars是腾讯的一款... 阅读详情

最近晚上有时间复盘之前研究小程序框架的相关内容,总结文章记录一下。

本篇文章主要介绍百度19年开源的Mars小程序开发框架,和Taro、mpvue、uniapp类似,都是编译型小程序框架,都是通过将 Vue 或 React 源码直接编译为小程序源码,实现小程序快速开发。我们来介绍一下其设计思路与原理。

Mars是什么?

Mars 是由 Vue 驱动的多端开发框架,其语法规范完全遵循 Vue,支持一套代码同时运行到百度小程序、微信小程序以及 H5 Web 端。Mars 诞生于搜索垂类产品对于小程序和 H5 Web 端相同的产品业务需求的场景下。从框架设计研发之初,就定位于解决小程序以及 H5 Web 端的复用和同构开发能力。

设计思路

Mars 框架的设计思路是将跨多端的应用拆分为逻辑层和视图层,逻辑层采用同一套核心运行时进行数据驱动以及生命周期管理,视图层使用同一套模板语法,经过编译转换为特定平台的视图语言。

考虑到学习成本、生态完善程度以及在多端上的扩展性、业务场景等原因,我们选择了 Vue 技术栈,采用 Vue 单文件组件和模板语法来书写组件代码,引入标准基础组件和 API 规范和标准生命周期规范。

在此开发规范之上,基于 Vue 的模板语法和基础组件来构建视图层,基于 Vue 数据驱动及标准生命周期规范来构建逻辑层,实现多端运行。框架总体原理图如下:

image.png

我们分别从模板、逻辑和数据来聊聊是如何编译的。

模板

我们先看一下Vue模板和小程序模板是如何书写的:

Vue模版如下:

<!--index.wxml-->
<template class="container">
    <view class="userinfo">
        <button v-if="!hasUserInfo&&canIUse" open-type="getUserInfo">获取头像昵称</button>
        <block v-else>  
            <image @tap="bindViewTap" class="userinfo-avatar" src=""/>
            <text class="userinfo-nickname">{{userInfo.nickName}}</text>
        </block>
    </view>
    <view class="usermotto">
        <text class="user-motto">{{motto}}</text>
    </view>
</template>

小程序的模版内容如下:

<!--index.wxml-->
<view class="container">
    <view class="userinfo">
        <button wx:if="{{!hasUserInfo&&canIUse}}" open-type="getUserInfo">获取头像昵称</button>
        <block wx:else>  
            <image bindtap="bindViewTap" class="userinfo-avatar" src=""/>
            <text class="userinfo-nickname">{{userInfo.nickName}}</text>
        </block>
    </view>
    <view class="usermotto">
        <text class="user-motto">{{motto}}</text>
    </view>
</view>

如果我们对比小程序和Vue模版,会发现他们与html语法是十分相似的。区别只在于标签上属性值的写法,相互之间通过编译是可以转化的。我们可以在编译阶段由Vue模版编译到小程序模版。

逻辑

我们先看一下小程序的逻辑和Vue的逻辑部分:

Vue逻辑如下:

<script>
    export default{
        data(){},
        methods:{
            bindViewTap(){},
            getUserInfo(){}
        },
        mounted(){}
    }
</script>

小程序的逻辑如下:

Page({
    data:{},
    bindViewTap: function(){},
    onLoad: function(){},
    getUserInfo: function(){}
})

逻辑部分,小程序与Vue在书写方式上有很大差异,他们的逻辑代码在各自的运行时中执行。并且逻辑部分用户书写的灵活度是很大的,没有办法通过编译将Vue的逻辑编译成小程序的逻辑去执行。

那该怎么办呢,我们不如换一种思路。Vue运行时和Vue组件的逻辑在生产中都是以JS代码执行的,在小程序提供的环境中是可以执行的。我们可以让Vue运行时也可以在小程序中执行,这样开发者编写的Vue逻辑代码也可以在小程序中执行了。

数据

数据部分是最简单的,因为数据是以JS对象的形式存在的,在小程序和Vue中是相同的。

原理

通过对视图、逻辑和数据这三个部分的分析,我们可以使用以下思路来使用Vue开发小程序。

首先将Vue template部分编译成小程序的模版,之后在小程序逻辑部分运行整个Vue的运行时,以及开发者编写的逻辑代码。最后Vue数据发生变化时同步给小程序,触发视图刷新。

image.png
我们需要在编译阶段产出 .wxml、.css、.js以及.json文件,在template部分需要将v-bind等语法转换成小程序使用的格式。样式内容则可以直接提取出来作为css文件。我们会在Vue中规定一个字段作为配置,这部分配置会提取出来作为.json文件。

而对于js部分,由于我们的逻辑执行在Vue中,因此只需要用到小程序的生命周期,在生命周期中执行Vue运行时以及业务逻辑代码就可以了。

例如,Vue单文件组件内容如下:

<template>
    <view class="home-wrap">
        <navigator :url="item.bookApi" v-for="(item,index) in bookList">
            <book :poster="item.poster"></book>
        </navigator>
    </view>
</template>
<script>
import Book from 'components/Book/index';
export default{
    config:{
        navigationBarTitleText: "标题"
    },
    data(){},
    components:{
        book:Book
    }
}
</script>
<style>
    .home-wrap{
        width:100vw;
        height:100vh;
    }
</style>

编译成小程序的组件内容如下:

<!--wxml模板内容-->
 <view class="home-wrap">
        <navigator url="{{item.bookApi}}" v-for="(item,index) in bookList">
            <book poster="{{item.poster}}" compId="{{ (compId ? compId : '$root') + ',0' }}"></book>
        </navigator>
</view>
 /*wxss样式内容*/
 .home-wrap{
        width:100vw;
        height:100vh;
    }
/*json配置内容*/
{
        "navigationBarTitleText": "标题",
        "usingComponents":{"book":"../../components/Book/index"}
},
//js逻辑内容
import {createPage} from "../../mars-core/index"
import Book from "../../components/Book/index.vue"
Page(createPage({
    data(){},
    components:{
        book:Book
    }
}))

为了执行Vue运行时以及业务逻辑代码,我们需要在小程序中创建Vue实例,Vue在生产环境中是以JS代码来运行的。因此我们可以直接将Vue引入,然后在小程序onLoad阶段new一个Vue实例出来。

import Vue from 'vue'

Page({
    onLoad(){
        const vm = new Vue(options)
        this.$vue = vm
    }
})

但是要注意,Vue正常是要执行在浏览器中的,在执行时会进行DOM操作完成页面渲染,在小程序中我们需要将Vue进行DOM操作的部分删掉。做到这里模版已经有了,样式也有了,创建了Vue实例后逻辑也可以执行了,但到目前为止,小程序与Vue也没有真正联系上。

通过之前的分析我们了解到,小程序与Vue之间是通过数据来联系的,Vue中执行逻辑,修改数据,将数据变化同步给小程序,触发试图更新。因此,我们现在要做的就是在每次Vue中更新视图时,把数据修改同步给小程序,那么如何知道Vue中的逻辑执行造成了视图刷新了呢?

我们可以使用Vue的updated钩子函数。

const vueMixin = {
    updated(){
        setData(vm,this)
    }
}

updated钩子函数会在数据发生变化导致视图刷新后触发。我们可以在其中调用小程序的setData方法,来将变化后的数据同步给小程序,现在我们在Vue和小程序之间建立了联系。但这个联系还是单向的,Vue的数据变化可以修改小程序的视图。但小程序中用户的操作还不能传递给Vue进行处理。用户的操作体现在tap等事件中,由于我们所有的逻辑都在Vue中,因此需要让Vue接管小程序的事件处理。

我们可以在小程序的模版中去设置一个代理函数handleProxy,在这个事件代理函数中,调用Vue实例中的事件处理函数,触发开发者编写的业务处理逻辑。这样用户的操作通过事件代理传递给Vue进行处理,Vue处理过程中会修改数据,触发VirtualDom的更新,VirtualDom更新后会触发updated钩子函数,我们在updated钩子函数中将数据变化同步给小程序,使得小程序视图更新,完成了整个用户操作响应流程。

现在我们已经完成了Vue与小程序结合的整体结构,视图绘制发生在小程序中,业务逻辑运行在Vue中,小程序与Vue用事件和数据来进行通信。

组件机制原理也是一样的,视图依旧由小程序组件来绘制,业务逻辑运行在Vue组件中,小程序组件与Vue组件通过事件和数据来进行通信。

但是这么做的前提是我们需要将小程序组件与Vue组件关联起来,在我们创建Vue实例时有两种选择,一种是我们只在小程序根组件也就是Page中去创建Vue实例,Vue会继续创建组件实例。

image.png

在这种情况下小程序组件和Vue组件的创建分别是同时进行的,那么我们就需要将小程序组件与Vue组件之间进行关联匹配,否则他们之间的通信也就无从谈起了。

那么如何匹配呢?我们可以给每个组件都标记一个唯一的ID,然后通过ID来进行匹配。标记的方法就是从根组件开始,将根组件标记为root,那么它的子组件就是root,那么它的子组件就是root,那么它的子组件就是root.0,$root.1等,不同层级间使用.来分割,其中列表循环特殊对待,我们使用横线来标记循环项。

例如root.1中有一个循环列表,这个循环列表中渲染了一个组件这个组件自身ID位root.1.0,然后循环产生的第一个子组件就是root.1.0-0,第二个就是root.1.0-1,这样我们通过ID给每个组件增加了标记,将相同ID的小程序组件与Vue组件匹配在一起。

另一种是我们去掉Vue创建组件实例的逻辑,自己在每个小程序组件创建时new一个Vue实例,但如果这么做,我们需要自己维护Vue各个实例间的父子关系。

image.png

探索小程序底层架构原理 小程序的设计之初就是要求快速,这里的快指的是加载以及渲染。Web技术渲染Native技术渲染Hybrid技术渲染(同时使用了webview和原生来渲染)从小程序的定位来讲,它就不可能用纯原生技术来进行开发,因为那样它的编译以及发版都得跟随微信,所以需要像Web技术那样,有一份随时可更新的资源包放在远程,通过下载到本地,动态执行后即可渲染出界面。但如果用纯web。 阅读详情

相关推荐

解读 Uniapp: 从入门到精通的底层原理

解读 Uniapp: 从入门到精通的底层原理,在移动应用开发领域,Uniapp 凭借其独特的跨平台特性和高效的开发模式,成为众多开发者的青睐之选。然而,要真正精通 Uniapp 开发,不仅要掌握其表面的使用方法,更需深入了解其底层原理。本文将带您深入剖析 Uniapp 从入门到精通背后的底层原理,通过丰富的代码示例和详细的概念解释,帮助您夯实基础,提升开发技能。

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

【亲测免费】 Vue-微信小程序开发框架指南

--- ## 项目介绍 **Vue-微信小程序**是基于Vue.js构建的小程序开发框架,由GitHub用户[bailichen](https://github.com/bailichen)发起。此框架旨在简化微信小程序的开发流程,通过Vue的响应式机制和组件化特性,提高开发效率和维护性。它允许开发者利用已有的Vue知识来开发微信小程序,降低了学习成本,同时保持了小程序的高性能和灵活性。 -...

gitblog_00969的博客 1258

在小程序中使用Vue框架编程

如果你想在小程序中使用Vue框架进行编程,下面是一些详细的步骤和示例代码。点击开发工具中的编译按钮,它将会将Vue代码编译成小程序可以识别的代码,并在预览窗口中显示你的应用程序。点击开发工具中的编译按钮,它将会将Vue代码编译成小程序可以识别的代码,并在预览窗口中显示你的应用程序。要在小程序页面中使用Vue组件,你需要在页面的wxml文件中添加自定义组件。要在小程序页面中使用Vue组件,你需要在页面的json文件中进行配置。在上面的示例中,我们导入了Vue,并创建了一个Vue实例。

2301_79325339的博客 785

【用vue开发微信小程序】(uni-app)(自用,不推荐参考)

笔记自用

sp_zhaoyun的博客 3万+

Mars:Mars - Vue 驱动的多端开发框架

Mars - Vue 驱动的多端开发框架 Mars 是由 Vue 驱动的多端开发框架,其语法规范完全遵循 Vue,支持一套代码同时运行到百度小程序、微信小程序以及 H5 Web 端。 快速开始 # 安装 mars-cli npm install -g @marsjs/cli # 创建项目 mars create [projectName] # 可选项: # 是否支持 H5,如需支持 H5 请选择:小程序和 H5 ? 选择创建项目类型: (Use arrow keys) ❯ 小程序和 H5 仅小程序 # 开发模式 # 如果 target 是小程序,需要用小程序开发工具打开对应的 dist 目录 mars serve [--target, -t swan (default) | wx | h5] # 构建模式 # 如果 target 是小程序,需要用小程序开发工具打开对应的 dist 目录

一文读懂,WMS仓库管理系统模块功能

对于仓库管理人员来说,仓储管理是一件需要十分负责、又精细化的工作。

深蓝易网的博客 5218

深入浅出主流的几款小程序跨端框架原理

目前,小程序在用户规模及商业化方面都取得了极大的成功。微信、支付宝、百度、字节跳动等平台的小程序日活都超过了3亿。 我们在开发小程序时仍然存在诸多痛点:小程序孱弱简陋的原生开发体验,注定会出现小程序增强型框架,来提升开发者开发体验;各家厂商小程序API碎片化的现状,注定会有多端框架会成为标配,由跨端框架肩负跨平台移植挑战。 正是因为开发者对于提升小程序开发效率有着强烈需求,小跨端框架发展到如今已经百花齐放、百家争鸣:除了美团的 mpvue 、网易的 megalo 、滴滴的 chameloen 已经趋于稳定,

qq_45768871的博客 3946

同济大学824复试全攻略:从笔试到面试的实战解析

本文详细解析同济大学824复试全流程,包括专业课笔试、外语听力与口语、专业外语笔试和专业综合面试的备考策略。重点分享数字信号处理、计算机网络等专业课的高效学习方法,以及专业外语速成和口语面试技巧,助力考生全面提升复试表现。

qq_27496129的博客 1054

【2万字长文】深入浅出主流的几款小程序跨端框架原理

开发者(KaiFaX)面向全栈工程师的开发者专注于前端、Java/Python/Go/PHP的技术社区作者 |雾豹来源 |https://juejin.im/post/68815978...

AI研习社 1214

第8.1节 满足构网要求的功率器件与散热设计

摘要: 构网型变流器的功率器件选型与散热设计面临严苛要求,需综合考虑过载能力、暂态应力与可靠性。IGBT模块选型需重点评估电压/电流等级、损耗特性及结温波动,而SiC MOSFET虽具有高频低损耗优势,但面临栅极可靠性等挑战。散热设计需采用液冷等先进技术控制结温波动,并通过电热应力仿真和寿命预测实现可靠性优化。系统化选型流程需结合规范要求、工况谱分析和实测验证,为构网型变流器提供坚实的物理基础。

技术工作者 912

Arduino跑通ssd1306_spi显示屏

代码首先,您需要下载两个库:● Adafruit GFX库,这是核心图形库,提供了一组通用的图形基元(点、线、圆等)。它需要与特定于硬件的库对应。● Adafruit SSD-1306 OLED显示库,这是基于SSD1306驱动程序的OLED显示器的库。解压缩这两个库并将它们添加到Arduino库文件夹中,然后运行Arduino IDE并从OLED库中打开SPI示例。

Leo ICer的博客 1493

微信小程序底层框架实现原理|万字长文

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情 前言 最近在掘金上学习了一本小册——《微信小程序底层框架实现原理》,加上以前做微信小程序的经验,结合自己的工作经历,深有感触,借此机会和大家分享一下学习工作心得。 2017 年 1 月微信小程序正式发布 。 我从2018年接触学习前端时,曾仿写过一个性格评测类小程序demo,后来实习期间,完成了部门首个真正...

294

GPS数据处理必备:IGS精密星历下载与使用全攻略(附武汉大学/CDDIS/CODE/GFZ地址)

本文为GPS/GNSS数据处理者提供了IGS精密星历的完整下载与使用指南。详细解析了最终、快速、超快速三种精密星历产品的区别与选择策略,并手把手教学如何从武汉大学、CDDIS、CODE、GFZ四大主流数据中心高效获取数据,涵盖文件命名规则解析及自动化下载脚本,助力科研与工程应用。

weixin_29234239的博客 678

基于微信小程序的社区讯息服务小程序(源码+lw+部署文档+讲解等)兼容app小程序安卓

这款社区讯息服务小程序是为了满足现代社区居民对于信息交流和服务获取的需求而设计开发的。 源码部分采用先进的小程序开发技术,确保程序的稳定性、流畅性和兼容性。功能丰富多样,包括社区公告发布、活动通知、邻里交流、服务预约等。界面设计简洁美观,易于操作。 部署文档详细说明了小程序的部署步骤,无论是在服务器配置、数据库安装还是小程序的上传发布等方面,都提供了清晰的指导,让开发者能够轻松地将小程序部署到不同的环境中。 讲解部分深入剖析了小程序的各个功能模块。对于社区公告的推送机制、邻里交流的互动方式、服务预约的流程管

QQ3359892174的博客 657

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

阿飞2018 1385

【WRF-Urban运行】WRF-SLUCM耦合建模参数设置及模拟运行

WRF-SLUCM耦合建模参数设置及模拟运行

WW、forever的博客 1723

探索微信小程序逆向利器:wxappUnpacker

探索微信小程序逆向利器:wxappUnpacker 项目地址:https://gitcode.com/gh_mirrors/wxappunpack/wxappUnpacker 项目简介 wxappUnpacker 是一个开源的工具,专为开发者和研究者设计,用于解包和分析微信小程序。通过提供可视化的界面和强大的底层解析功能,它可以帮助你深入理解小程序的工作原理,进行代码审查、性能优化或者教学实践。 ...

gitblog_00031的博客 906

【精品5万字图文详解】特征平台建设方案与最佳实践

关键词:特征工程、特征平台、特征存储、特征服务、机器学习、数据工程摘要:本文全面介绍了特征平台的建设方案与最佳实践,从特征工程的基本概念出发,深入剖析了特征平台的核心组件、架构设计和实现方法。文章通过生动的类比和实例,使读者能够轻松理解特征工程的重要性及特征平台如何解决企业在机器学习过程中面临的数据管理挑战。同时,详细探讨了主流开源特征平台的对比分析、系统设计要点、实际落地案例以及未来发展趋势,为企业构建高效特征平台提供了全面的指导和参考。想象一下,小明是一位热爱烹饪的小学生。有一天,他想做一道美味的菜肴送

AI天才研究院 952

基于SpringBoot+Vue的儿童兴趣探索与任务打卡平台的设计与实现

Java主要采用CORBA技术和安全模型,可以在互联网应用的数据保护。它还提供了对EJB(Enterprise JavaBeans)的全面支持,java servlet API,SPRINGBOOT(java server pages),和XML技术。Java是一种计算机编程语言,具有封装、继承和多态性三个主要特性,广泛应用于企业Web应用程序开发和移动应用程序开发。

分享技术热点,看天下大事 633

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深入理解小程序中的数据——小程序探索

研究背景 上一篇文章了解了小程序的生命周期,接下来研究一下数据通信,我觉得清楚了生命周期和数据通信,就能对整个程序有一定的把控能力,定位问题和解决问题的能力将大幅提高我刚开始撸小程序的时候,觉得看看文档就可以了,导致写了很多垃圾代码坑人坑己,相信大部分初学者也不会去仔细研究文档,更别说啰里啰嗦的指南了,在通读小程序官方指南后,我觉得很有...

weixin_34080951的博客 377

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

(开题报告)django+vue心理健康科普微信小程序的设计与实现论文+源码

本选题将以心理健康科普微信小程序为研究情景,重点分析和研究如何利用Django和Vue技术实现功能完善、用户体验良好的小程序,以期探寻构建高效心理健康科普微信小程序的问题原因和机制等,提出对策建议,为后续更加深入的研究提供基础。同时,对于Django和Vue技术在心理健康科普领域的应用也将进行深入的剖析,为相关技术在其他领域的应用提供参考。[8] 陈佳佳, 邱晓荣, 熊宇昊, 段莉华. "基于Python的人脸识别技术研究"[J]. 电脑知识与技术, 2023, 19 (08): 34-36+39.

sheji303的博客 2680

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【亲测免费】 探索 `openwechat`:一个开源微信小程序开发框架

`openwechat` 是一个强大的、开源的微信小程序开发框架,它旨在简化微信小程序的开发流程,并提供一套高效、灵活的工具集,让开发者可以更专注于业务逻辑而不是底层实现。如果你正在寻找一个能够提高微信小程序开发效率的解决方案,那么 `openwechat` 将是一个值得尝试的选择。 ## 技术分析 1. **模块化架构** - `openwechat` 使用 ES6 模块化设计,使得代码组织...

gitblog_00073的博客 740

基于微信小程序的任务打卡系统(源码+lw+部署文档+讲解等)

《基于小程序的任务打卡系统》 该任务打卡系统小程序是一款功能强大且便捷实用的工具。 源码运用先进的小程序开发技术架构,确保系统高效稳定运行。其功能设计涵盖任务创建、分类设置、打卡记录以及提醒功能等。用户可以根据自身需求创建不同类型的任务,如学习任务、健身任务、工作任务等,并设定打卡时间和目标。 部署文档详细介绍了系统的安装与配置步骤,包括服务器要求、数据库设置以及小程序的上传发布流程等,使得开发者能够顺利地将系统部署到实际环境中。 讲解部分深入剖析了系统的各个模块和功能实现原理。从任务管理的逻辑到打卡数据的

QQ3359892174的博客 950

下用npm跑vue_【第1763期】kbone,十分钟让Vue项目同时支持小程序

前言又是一个跨端的项目?今日早读文章由腾讯微信@binnie投稿分享。正文从这开始~~什么是kbone微信小程序开发过程中,许多开发者会遇到 小程序 与 Web 端一起的需求,由于 小程序 与 Web 端的运行环境不同,开发者往往需要维护两套类似的代码,这对开发者来说比较耗费力气,并且会出现不同步的情况。为了解决上述问题,微信小程序推出了同构解决方案 kbone 来解决此问题。那么,kb...

weixin_42571476的博客 125

Hbuildx创建vue3项目

vue3记录

yudelian的博客 3433

【前端】前端高级与前端全家桶——学的更深更广一点!

今天首次参加宣讲会,华测导航的,,太可怕了。

警警的博客 956
上一篇: 解放你的项目!depcheck:清理无用依赖,让代码更精致
下一篇: Docker助力前端开发,轻松打造高效应用
全栈大师兄
博客等级 码龄11年 448粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值