Django框架里的MVC思想

五分钟带你了解Django框架设计思想! Python编程语言的持续火爆,在最新Tiobe编程语言排行榜中位列第五,热度持续增加,尤其是在 AI 和 大数据时代,Python是 AI 和大数据时代的第一开发语言。这已经是一个不争的事实了,唯一的悬念就是谁能坐上第二把交椅了。 Python是胶水语言,应用及其广泛。在web应用领域,国内知名互联公司:有号称文艺青年的圣地–豆瓣评分,曾经主打高端问答知识社区的–知乎,唯有爱和美食不可辜负的–下厨房…… 谈到在web应用领域,除了Python的语法,Django是Python后台一个最重要的框架。今天小千 阅读详情

Django框架里的MVC思想

MVC 设计模式
服务器君一共花费  14.559 ms 进行了  2 次数据库查询,努力地为您提供了这个页面。
广告很萌的

让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过Web框架来实现的功能与之前的方式有何不同。 下面就是通过使用Django来完成以上功能的例子: 首先,我们分成4个Python的文件,(models.py , views.py , urls.py ) 和html模板文件 (latest_books.html )。

models.py:

1 # models.py (the database tables)
2  
3 from django.db import models
4  
5 class Book(models.Model):
6     name = models.CharField(max_length=50)
7     pub_date = models.DateField()

views.py:

1 # views.py (the business logic)
2  
3 from django.shortcuts import render_to_response
4 from models import Book
5  
6 def latest_books(request):
7     book_list = Book.objects.order_by('-pub_date')[:10]
8     return render_to_response('latest_books.html', {'book_list': book_list})

urls.py:

1 # urls.py (the URL configuration)
2  
3 from django.conf.urls.defaults import *
4 import views
5  
6 urlpatterns = patterns('',
7     (r'^latest/$', views.latest_books),
8 )

latest_books.html:

01 # latest_books.html (the template)
02  
03 <html><head><title>Books</title></head>
04 <body>
05 <h1>Books</h1>
06 <ul>
07 {% for book in book_list %}
08 <li>{{ book.name }}</li>
09 {% endfor %}
10 </ul>
11 </body></html>

不用关心语法细节,只要用心感觉整体的设计。 这里只关注分割后的几个文件:

  • models.py 文件主要用一个 Python 类来描述数据表。 称为 模型(model) 。 运用这个类,你可以通过简单的 Python 的代码来创建、检索、更新、删除 数据库中的记录而无需写一条又一条的SQL语句。
  • views.py文件包含了页面的业务逻辑。 latest_books()函数叫做视图。
  • urls.py 指出了什么样的 URL 调用什么的视图。 在这个例子中 /latest/ URL 将会调用 latest_books() 这个函数。 换句话说,如果你的域名是example.com,任何人浏览网址http://example.com/latest/将会调用latest_books()这个函数。
  • latest_books.html 是 html 模板,它描述了这个页面的设计是如何的。 使用带基本逻辑声明的模板语言,如{% for book in book_list %}
  • 结合起来,这些部分松散遵循的模式称为模型-视图-控制器(MVC)。 简单的说,  MVC 是一种软件开发的方法,它把代码的定义和数据访问的方法(模型)与请求逻辑 (控制器)还有用户接口(视图)分开来。

这种设计模式关键的优势在于各种组件都是 松散结合 的。这样,每个由 Django驱动 的Web应用都有着明确的目的,并且可独立更改而不影响到其它的部分。 比如,开发者 更改一个应用程序中的 URL 而不用影响到这个程序底层的实现。 设计师可以改变 HTML 页面 的样式而不用接触 Python 代码。 数据库管理员可以重新命名数据表并且只需更改一个地方,无需从一大堆文件中进行查找和替换。

Django:MTV和MVC 理解MVC: 在聊mvc之前,去公司找自己的朋友办事,你首先要知道你朋友的公司,然后遇到的是一个前台的妹子,前台的妹子告诉你,你的朋友在开发部,然后你才找到了你的朋友,然后开始处理事情,具体的事情会由你的朋友和你进行处理,处理过程当中你的朋友调用了他们公司的资源。 同样你在请求网站的时候也一样,当我们请求服务器的时候,服务器将请求传递给具体处理请求的功能,在web开发中我们称之为controlle... 阅读详情

相关推荐

【Python 设计模式——MVC】

Python 设计模式——MVC

u012632105的博客 874

为Python的web框架编写MVC配置来使其运行的教程

在Web开发中,MVC(Model-View-Controller)是一种常见的设计模式,用于将应用程序的不同方面分离开来,以便于管理和维护。Python的web框架也不例外,它们也可以通过MVC配置来实现更好的开发体验。本文将从多个角度分析如何为Python的web框架编写MVC配置来使其运行。

Python栈 1578

kettle信息发送钉钉

由于其他的作业比较多,想要在job中加入一个转化发送消息到钉钉,其他的配置说明直接获取系统的信息。这样也避免直接修改其他的转换和大量的工作量。 步骤: 1、新建一个转换 拉取获取系统信息、获取变量、JavaScript代码、获取access_token组件。 2、获取系统信息设置 拿到需要的信息,比如作业的读写更新删除行数,job的日志内容 这个日志内容同在作业执行页面下输出的日志,所以可以在执行作业时选择是详细日志、基本日志还是错误日志。 3、获取变量 获取变量主要是想要去拿到job的名称,文件名。按

Deng_7788的博客 1448

Python系统学习1-9-类二之MVC框架

"""疫情信息管理系统学习MVC的软件架构视图:处理界面逻辑,输入输出控制器:处理核心逻辑,存储计算模型:将多个变量组合为一种类型餐厅的架构服务员 传菜员 厨师""""""

weixin_38383877的博客 1342

别再问“这游戏啥引擎做的”了,手把手教你用SteamDB一键查询(附实战案例)

本文详细介绍了如何使用SteamDB一键查询游戏引擎信息,包括Unity 3D、Unreal Engine等热门引擎的识别方法。通过实战案例和高级查询技巧,帮助玩家快速获取游戏技术底细,优化游戏体验和兼容性分析。

weixin_31412781的博客 821

【运筹学】什么是基变量?对于线性规划问题中“基”概念的理解(3月3日学习笔记)

在学习《线性规划与目标规划》的过程中,课程的主讲老师郭韧给出了对于基概念的定义如下图 图片来源:运筹学(中国大学mooc网) 由此我产生了几个疑惑:1.如何理解B是线性规划问题的一个基?2.为什么说最多有CnmC_n^mCnm​个基呢?     1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基? 在回答第一个...

纸羊同学的博客 3万+

【Python】MVC架构

mvc架构浅入

Cerulea_n的博客 1241

汇川EASY521 PLC实战指南:从硬件选型到程序架构与故障排查

可编程逻辑控制器(PLC)是工业自动化系统的核心大脑,其工作原理基于循环扫描机制,持续读取输入、执行用户程序并更新输出。这种确定性控制方式,使其在逻辑控制、顺序控制和运动控制中具有不可替代的技术价值,广泛应用于机械设备、生产线和过程控制等场景。对于汇川EASY521这类紧凑型高性能PLC,其核心优势在于集成了运动控制与丰富通讯接口,为中小型设备提供了高性价比的一站式解决方案。在实际应用中,工程师常需处理如“汇川sv660n”伺服驱动器的集成调试,或利用“hslcommunication”等开源库实现C#上位

weixin_42525264的博客 736

Django简介

文章目录Django简介谁适合阅读本教程?学习本教程前你需要了解1. MVC设计模式2. Django简介2.1 MTV设计模式2.2 Django的简单使用2.2.1 Django的安装2.2.2 创建Django项目2.2.3 项目默认目录说明2.2.4 创建应用2.2.5 安装应用2.2.6 开发服务器 Django简介 谁适合阅读本教程? 本教程适合有Python基础的开发者学习。 学习本教程前你需要了解 学习本教程前你需要了解一些基础的 Web 知识及 Python 2.x 基础教程 或 Pyth

Allen 1万+

【银行测试】手机银行APP专项项目+测试点汇总(一)

1、手机银行APP转账项目讲解面试官:请介绍一下你所负责的模块如何进行的测试?求职者:好的,我最近测试的是XX银行的手机银行App项目。这个项目里面包含了转账、转账额度调整、网银转账、交易明细、添加账户、存款、投资理财、生活缴费等功能模块。我主要负责了转账模块,这个大模块中包含了智能转账、手机转账、语音转账、预约转账、收款人管理等5个子模块,我首先介绍一下我们生活中使用最多的手机转账子模块。对于转账需要关注的是转账前、转账中、转账后这三个状态下的测试。

m0_70102063的博客 1604

主成分分析避坑指南:为什么你的PCA结果总是不理想?

本文深入剖析了主成分分析(PCA)在实际应用中效果不佳的常见原因与解决方案。针对数据标准化、协方差矩阵选择、主成分数量确定、载荷矩阵解读等关键环节,提供了详细的避坑指南和诊断方法,并探讨了PCA的局限性及非线性数据结构下的备选方案,帮助数据分析师获得更稳健、可解释的降维结果。

convnet3designer的博客 511

django框架里的mvc思想

view.py  视图层,负责数据的展示models.py  业务逻辑  对数据库的增删改查业务逻辑大时可在另外的文件中体现,写在view或models也都可以url.py  控制器(control)settings.py  项目的配置文件__init__.py  空文件,告诉settings.py这是个python的项目template 放置html模版的文件wsgi.py...

zhangyu4863的博客 3万+

【笔记篇】Davinci Configurator BswM模块

AUTOSAR BSWM模块配置介绍

weixin_47571898的博客 1534

Django框架里的MVC思想MVC 设计模式

Django框架里的MVC思想 MVC 设计模式 条目创建于 2013-07-15     9799 views 服务器君一共花费 35.039 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。 Chapter: Django 入门知识浅介 1. Python Web框架(Django)的必要性 2.

linuxheik的专栏 3445

openssl命令数据摘要详解(SM3、sha256、MD5、dss1、mdc2、ripemd160)

SM3是由中国密码学家设计的密码哈希函数,是中国国家密码管理局(National Cryptographic Authority,简称:CNCA)颁布的国家密码算法标准。SM3属于密码杂凑函数家族,它可以计算任意长度的消息并生成固定长度(256比特,即32字节)的哈希值。SM3生成的哈希值长度为256比特(32字节),不管输入消息的长度如何,输出始终是固定的。SM3将输入数据划分为512比特(64字节)的分组,并对每个分组进行处理。

N阶二进制的博客 4460

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[Django入门知识浅介]Django框架里的MVC思想

注:以下内容转载自 现代魔法学院 网站的 Django框架里的MVC思想 一文,仅供学习使用。         让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过Web框架来实现的功能与之前的方式有何不同。 下面就是通过使用Django来完成以上功能的例子:首先,我们分成4个Python的文件,(models.py , views.py , urls.py ) 和html模板文件 (l

dapeng0802的专栏 429

OV9734 DATASHEET,完整规格书

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

Python Django 强大的web mvc开发框架

Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。 目录 Django简介 Django的特点 框架介绍...

纸上得来终觉浅,绝知此事要躬行 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Django到底是MVC还是MVT?以及MVC和MVT的区别

最近一直被一些问题所困惑:Django是遵循MVC还是MVT?MVC和MVT到底有哪些区别?MVC可以继续拆分吗? 在网络上浏览了很多无关痛痒的文章,无非是M、V、C分别代表什么,M、V、T又分别代表什么,这些表层的解释对程序员来说非但不会解决问题,反而还会增加困惑。所以,在查了一些资料之后,在个人理解的基础上,进行总结,记住,这只是个人观点和立场。 MVC是怎么来的?是什么? 最开始MVC是一种...

高岩 is me 9301

Django框架详解

一、MVC框架 1、MVC框架核心思想: 分工和解耦 2、web MVC举例: 以通过浏览器注册用户信息为例: M:Model,模型, 和数据库进行交互。 V:View,视图, 产生html页面。 C:Controller,控制器, 接收请求,进行处理,与M和V进行交互,返回应答。 二、MVT框架 Django遵循MVT的思想 M:Model,模型, 和MVC中M功能相同,和数据库进行交互。 V:View,视图, 和MVC中C功能相同,接收请求,进行处理,与M和T进行交互,返回应答。 T:T

吴大喜的博客 1万+

Python Django 框架的 MVC 设计模式解析

Model(模型): 负责数据和业务逻辑。View(视图): 负责用户界面展示。Controller(控制器): 负责处理用户输入并协调 Model 和 View。这种分离使得代码更易于维护、扩展和测试,特别是在复杂的 Web 应用程序中。通过本文的分析可以看出,Django 虽然采用了不同于传统 MVC 的 MTV 模式,但其本质仍然是围绕着分层架构的思想展开的。理解 Django 的设计哲学有助于开发者更好地利用框架的优势,同时也能为其他类似框架的学习提供参考。

2501_91161847的博客 779

框架学习boostrap MVC beego django laravel

Goal1、学习Python php 2、了解boostrap MVC beego django laravelWhat I getMVCMVC是一种框架,全称Model-View-Controller 1. Model(模型)——应用程序的处理:应用程序的核心,用来处理应用程序数据逻辑。 模型对象通常用来存取数据库数据。模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理

qq_24896641的博客 3258

MVC框架理解与(Django里为MVT和VUE的MVVM模型)

MVC框架.:是一个经典的架构模式,其中MVC分别指的是: M: Model(模型,包含数据和数据处理方法) V: View(视图,提供视图,即页面) Controller: (控制层,负责逻辑处理) 举例:在Node中的MVC框架,处理流程应该是以下步骤: 服务端收到客户端的请求 路由层开始处理服务端接收到的请求,匹配相应的路由 匹配到相应的路由之后调用对应的controller(即对应的逻辑处理函数) controller接收到请求之后,向model层取用数据 model层接收到controll

weixin_45627194的博客 1322

初识django框架

MVC模型,全称为Model-View-Controller,是一种经典的软件设计模式,旨在将应用程序的输入、处理和输出分开,使得数据、视图和控制逻辑相互独立。这种模式通过将应用程序划分为模型(Model)、视图(View)和控制器(Controller)三个核心部分,来实现代码的分层和解耦,从而提高代码的可维护性、可扩展性和复用性。

m0_68842007的博客 2651
上一篇: JSON Schema(官方)
下一篇: Django 1.7 自带migrations用法及源码
whackw
博客等级 码龄16年 203粉丝 69原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值