Python之Django博客小项目

项目1 :博客项目

python manage.py startapp post #
urlpatterns =[
	url(r'^admin/',admin.site.urls),
	url(r'^', include('post.urls')),
]
#coding=utf-8
from django.conf.urls import url
import views
urlpatterns=[
	url(r'^$',views.queryAll)
]

1.首页展示

# create your views here.
#演染主页面
def queryAll(request):
	return render(request,'index.htm1')
{% extends 'base.html' %}
{% block title %}首页{% endblock %}
{% block headerjs %}
	<sty1e>
		form {
			position: relative ;
			width: 150px; 
			margin: 0 auto;
		}
		.d1{
			float: right;
			line-height: 67px;
		}
		.d1 input {
			width: 100px; 
			height: 30px;
			border: 2px solid darkred;
			border-radius: 5px;
			outline: none ;
			background: white;
			color: #1e242a;
		}
	</style>
{% endblock %}
{% block left%}
<div id="main">
	<article class="article article-type-post" >
	<div class="article-meta">
		<a class="article-date">
			<time>2018-06-26 16:58:24</time>
		</a>
		<div class=" article-category">
			<a class="article-category-link" href="#" target=" blank">后端</a>
		</div>
	</div>
	<div class="article-inner">
		<header class="article-header">
			<h1 itemprop="name">
				<a class="article-title" href="#" target=" blank">T4</a>
			</h1>
		</header>
		<div class=" article-entry" itemprop="articleBody">
			<h2>前言</h2>
			<hr>
			"..."

			<p class="article-more-link">
				<a href="/post/8" target=" blank">阅读全文</a>
			</p>
		</div>
		<footer class= "article- footer">
			<a data-url="存放文章的url" class="article-share-link">分享</a>
			<u1 class="article-tag-list">
				<li class="article-tag-list-item">
					<a class="article-tag- list-link" href= "#">Python</a>
				</li>
			</ul>
		</footer>
	</div>
	</article>

</div> 
{% endblock %}		
# Create your models here.
class category(models.Model):
	cname = models.CharField(max_length=30, unique=True)
	class Meta: 
		db_table = 't_category'
	def __unicode__(self):
		return u'Category:%s'%self.cname

class Tag( models. Model):
	tname = models.CharField(max_length= 30, unique=True)
	class Meta: 
		db_table = 't_tag'
	def __unicode__(self):
		return u'Tag:%s'%self.tname

class Post(models.Model):
	title = models.CharField(max_length=100, unique=True)
	desc = models.CharField(max_length=100)
	content = models.TextField()
	created = models.DateTimeField(auto_now_add=True)
	category = models.ForeignKey(Category,on_delete=models.CASCADE)
	tag = models.ManyToManyField(Tag)
	class Meta: 
		db_table = 't_post'
	def __unicode__(self):
		return u'Post:%s'%self.title
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
	'default': {
		'ENGINE' :‘django.db.backends.mysq1',
		'NAME':'180810db',
		'USER' : 'root',
		'PASSWORD' :'123456'
		'HOST' :'127.0.0.1',
		'PORT' :'3306',
	}
}
python manage.py makemigrations post
from .models import *
# Register your models here.
admin.site.register(Category)|
admin.site.register(Tag)
admin.site.register(Post)
python manage.py createsuperuser
LANGUAGE_CODE ='zh-Hans'
TIME_ZONE ='Asia/Shanghai'
class Meta:
	db_table = 't_category'
	verbose_name_plural=u'类别'
# __init.py__
from django.apps import AppConfig
import os
default_app_config = 'post.PrimaryBlogConfig'
VERBOSE_APP_NAME=u"博客管理"

def get_current_app_name(_file):
	return os.path.split(os.path.dirname(_file))[-1]
	
class PrimaryBlogConfig(AppConfig):
	name = get_current_app_name(__file__)
	verbose_name = VERBOSE_APP_NAME
cname= models.CharField(max_length=30, unique=True, verbose_name=u"类别名称" )
from .models import *
# Register your models here.
class PostModelAdmin(admin.ModelAdmin):
	list_display =('title','created')
	
admin.site.register(Category)|
admin.site.register(Tag)
admin.site.register(Post,, PostModelAdmin)
def queryAll (request):
	#获取所有帖子信息
	postlist = Post.objects.all().order_by('-created')
	
	return render(request, 'index.html',{'postlist':postlist})
<div id="main">
	{% for post in postList %}
	<article class="article article-type-post" >
	<div class="article-meta">
		<a class="article-date">
			<time>{{ post.createdldate:'Y-m-d H:i:s' }}</time>			
		</a>
		<div class=" article-category">
			<a class="article-category-link" href="#" target=" blank">{{post.category.cnamel} }
</a>
		</div>
	</div>
	<div class="article-inner">
		<header class="article-header">
			<h1 itemprop="name">
				<a class="article-title" href="#" target=" blank">{{post.title}}</a>
			</h1>
		</header>
		<div class=" article-entry" itemprop="articleBody">
			<h2>前言</h2>
			<hr>
			{{post.desc}}
			<p class="article-more-link">
				<a href="/post/{{post.id}}" target=" blank">阅读全文</a>
			</p>
		</div>
		<footer class= "article- footer">
			<a data-url="存放文章的url" class="article-share-link">分享</a>
			<u1 class="article-tag-list">
				{%for t in post.tag.all %}
				<li class="article-tag-list-item">
					<a class="article-tag- list-link" href= "#">{{t.tname}}</a>
				</li>
				<%endfor%>
			</ul>
		</footer>
	</div>
	</article>
	<%endfor%>		

	<nav id=" page-nav" >
		{% if postList.has_previous%}
			<a class= "extend next" rel="next" href="/page/{{postList.previous_page_number
}}">Prev >></a>
		{% endif %}		
		
		<span class="page-number current" >1</ span>
		{% for page in pagelist %}
			{% if currentNum == page %}
				<span class=" page-number current">{{ page }}</span>
			{% else %}
				<a class="page-number" href= '/page/{{page}}'>{{page}}</a>
`			{% endif %}
		{%endfor %}
		
		{% if postList.has_next%}
			<a class= "extend next" rel="next" href="/page/{{postList.next_page_number
}}">Next >></a>
		{% endif %}		
	</nav>
</div>					
# 分页
#演染主页面
from post.models import Post
from django.core.paginator import Paginator
def queryAll (request,num=1):
	# num = request.GET.get('num' ,1)
	num = int(num)
	
	#获取所有帖子信息
	postlist = Post.objects.all().order_by('-created')
	
	# 创建分页器对象
	pageObj = Paginator(postList,1)
	#获取当前页的数据
	perPagelist = pageObj.page(num)

	#生成页码数列表
	#每页开始页码
	begin = (num - int(math.ceil(10.0 / 2)))
	if begin < 1:
		begin = 1
	#每页结束页码
	end=begin+9
	if end > pageObj.num_pages:
		end = pageObj.num_pages
	if end <= 10:
		begin = 1
	else:
		begin=end-9
	pagelist = range(begin, end + 1)
	
	return render(request, 'index.html',{'postList':perPagelist,'pageList':pagelist,'currentPage':num})
urlpatterns=[
	url(r'^$',views.aueryAll),
	url(r'^page/(d+)$',views.queryAll),
]

展示文章详细内容:

#阅读全文功能
def detail(request ,postid):
	postid = int(postid)
	#根据postid查询帖子的详情信息
	post = Post.objects.get(id=postid)
	return render(request, 'detail.html' ,{'post' :post})
{% extends' base.html' %}

{% load myfilter %}

{% block title %}
	详情页面
{% endblock %}
{% block left %}
<div id="main">
	<article class="article article-type-post">
	<div class="article-meta">
		<a class="article-date">
			<time>{{post.created|date: 'Y-m-d H:i:S'}}</time>
		</a>
		<div class="article-categqry">
			<a class=" article-category-link" href="#" target=" blank" >{{post.category.cname}}</a>
		</div>
	</div>
	<div class="article-inner>
		<header class= "article-header">
			<h1 itemprop="name >
				<a class="article-title">T4</a>
			</h1>
		</header>
		<div class="article-entry" itemprop="articleBody">
			<h2>前言</h2>
				{{post.desc }}
			<br>
				{{post.content|md|safe}}
		</div>
	</div>
	</article>
</div>
{% endblock %}

使用markdown格式展示(解析)- 加过滤器
新建templatetags包
新建myfilter.py文件

#coding=utf-8
from django.template import Library

register = Library()

@register.filter
def md(value):
	import markdown
	return markdown.markdown(value)

分享功能:
【参考】http://share.baidu.com/code

集成富文本编辑器:

pip install django-ckeditor

然后在setting.py文件中添加:

INSTALLED_APPS =[
	'django.contrib.admin',
	' django. contrib.auth',
	' django . contrib. contenttypes ',
	'django. contrib. sessions'
	' django. contrib. messages' ,
	'django. contrib. staticfiles ' ,
	'post', 
	'ckeditor',
	'ckeditor_uploader'
]

# 配置media存放路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
CKEDITOR_UPLOAD_PATH ='upload/'
from blog.settings import DEBUG, MEDIA_ROOT

urlpatterns=[
	url(r'^$',views.aueryAll),
	url(r'^page/(d+)$',views.queryAll),
	url(r'ckeditor/', include('ckeditor.uploader.urls'))
]

from django.views.static import serve
if DEBUG:
	urlpatterns+=url(r'^media/(?P<path>.*)/$', serve, {"document_root": MEDIA_ROOT}),

修改模型类model.py

from django.db import models
from ckeditor_uploader.fields import RichTextuploadingField

# Create your models here.
class category(models.Model):
	cname = models.CharField(max_length=30, unique=True)
	class Meta: 
		db_table = 't_category'
	def __unicode__(self):
		return u'Category:%s'%self.cname

class Tag( models. Model):
	tname = models.CharField(max_length= 30, unique=True)
	class Meta: 
		db_table = 't_tag'
	def __unicode__(self):
		return u'Tag:%s'%self.tname

class Post(models.Model):
	title = models.CharField(max_length=100, unique=True)
	desc = models.CharField(max_length=100)
	# content = models.TextField()
	content = models.RichTextuploadingField(null=True,blank=True)
	created = models.DateTimeField(auto_now_add=True)
	category = models.ForeignKey(Category,on_delete=models.CASCADE)
	tag = models.ManyToManyField(Tag)
	class Meta: 
		db_table = 't_post'
	def __unicode__(self):
		return u'Post:%s'%self.title

终端执行全局迁移文件:

python manage.py makemigrations
python manage.py migrate

2.帖子分类

放到全局上下文当中去:
新建mycontextprocessor,py文件:

#coding=utf-8
from django.db.models import Count
from post.models import Post
def getRightInfo(request):
	#1.获取分类信息
	r_catepost = Post.objects.values('category_cname', 'category').annotate(c=Count('*')).order_by('-c')
	return {'r_catepost':r_catepost}

setting.py文件中添加:

TEMPLATES =[
{
	' BACKEND': ' django. template . backends . django . DjangoTemplates ',
	'DIRS': [os . path. join(BASE_ DIR, 'templates')],
	'APP_ DIRS' : True, 
	' OPTIONS' : {
		'context_ processors':[
			'django. template .context processors .debug' ,
			' django. template. context processors.request' ,
			' django. contrib. auth. context_ processors. auth' ,
			' django . contrib . messages . context_ processors . messages',
			'post.mycontextprocessor.getRightInfo'
		],
	},
},
]

近期文章查找:

#coding=utf-8
from django.db.models import Count
from post.models import Post
def getRightInfo(request):
	#1.获取分类信息
	r_catepost = Post.objects.values('category_cname', 'category').annotate(c=Count('*')).order_by('-c')

	#2.近期文章
	r_recpost = Post.objects.all().order_by('-created')[:3]

	return {'r_catepost':r_catepost,'r_recpost':r_recpost}

3.帖子归档

select created, count('*') from t_post GROUP BY DATE_FORMAT(created, '%Y-%m');
#coding=utf-8
from django.db.models import Count
from post.models import Post
def getRightInfo(request):
	#1.获取分类信息
	r_catepost = Post.objects.values('category_cname', 'category').annotate(c=Count('*')).order_by('-c')

	#2.近期文章
	r_recpost = Post.objects.all().order_by('-created')[:3]

	#3.获取日期归档信息
	from django. db import connection
	cursor = connection.cursor()
	cursor.execute("select created, count('*' ) fromt_ post GROUP BY DATE_FORMAT(created, '%Y-%m')")
	r_filepost = cursor.fetchall()
	return {'r_catepost':r_catepost,'r_recpost':r_recpost,'r_filepost':r_filepost}

4.近期文章(见上)

#根据类别id查询所有帖子
def queryPostByCid(request,cid):
	postlist = Post.objects.filter(category_id=cid)
	# Post.objects.filter(category_id=cid)
	return render(request,'article.html',{'postList':postList})

setting.py中配置时区:
在这里插入图片描述

#根据发帖时间查询所有帖子
def queryPostByCreated(request,year,month):
	postlist = Post.objects.filter(created__year=yeac,created__month=month)
	return render(request,'article.html' ,{'postList':postlist})
urlpatterns=[
	url(r'^$',views.queryAll),
	url(r'^page/(\d+)$' ,views.queryAll),
	url(r'^post/(\d+)$' ,views.detail),
	url(r'^category/(\d+)$' ,views.queryPostByCid),
	url(r'^archive/(\d+)/(\d+)$' ,views.queryPostByCreated),
]
django缓存:

setting.py文件中配置缓存:

MIDDLEWARE = [
	'django.middleware.cache.UpdateCacheMiddleware' ,#必须放在第一个
	'django .middleware.security。SecurityMiddleware', 
	' django. contrib.sessions。middleware . SessionMiddleware',
	'django .middleware .common. CommonMiddleware',
	'django.middleware. csrf. CsrfViewMiddleware' ,
	'django. contrib. auth. middleware . AuthenticationMiddleware',
	'django. contrib。messages .middleware .MessageMiddleware',
	'django .middleware. clickjacking .XFrameOptionsMiddleware',
	'django.middleware.cache.FetchFromCacheMiddlewar'#必须放在最后一个
]
CACHES = {
	'default': {
		'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
	}
}
CACHE_MIDDL_EWARE_KEY_PREFIX = ''
CACHE_MIDDL_EWARE_SECONDS = 600
CACHE_MIDDLEWARE_ALIAS = 'default'
from django.core.cache import caches
#获取缓存对象
cacheobj = caches['default']
def cache_wrapper(func):
	def wrapper(request, *args,**kwargs):
		#从缓存对象中获取数据
		data= cacheobj.get(request.path)
		#判断获取的数据是否存在于缓存史
		if data:
			print '读取缓存中的数据'
			return HttpResponse(data)
		
		#执行views,函数去数据库中获取数据
		print '从数据库中获取数据'
		response = func(request,* args,** kwargs )

		print '进行缓存数据'
		#将数据库史查询到的数据插入缓存
		cacheobj.set(request.path,response.content)
		return response 
	return _wrapper

@cache_wrapper
def index_view(request):
	clist = Clazz.objects.all()
	return render(request,'index.html',{'clist':clist})

在这里插入图片描述

Redis:
CACHES = {
	'default': {
		'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
	},
	'redis':{
		"BACKEND":"django_redis.cache.RedisCache"
		"LOCATION": "redis://127.0.0.1:6379/1"
	}
}
CACHE_MIDDL_EWARE_KEY_PREFIX = ''
CACHE_MIDDL_EWARE_SECONDS = 600
CACHE_MIDDLEWARE_ALIAS = 'default'

5.关于博主

6.全文搜索

django提供的全文检索类库
●django-haystack(容器)
●whoosh(具体的搜索引擎)
●django-haystack支持Solr,Elasticsearch,Whoosh, Xapian四种搜索引擎

实现步骤
1.安装模块
i.先安装pip install django-haystack
i.后安装pip install whoosh
2. settings中添加应用

INSTALLED_ APPS = [
	' django . contrib. admin',
	' django. contrib. auth',
	'django . contrib. contenttypes' ,
	'django. contrib. sessions',
	'django . contrib. messages',
	' django. contrib. staticfiles',
	'post',
	'ckeditor',
	'ckeditor uploader',
	'haystack'
]	

3.settings中添加配置生成索弓|文件路径

#指定生成的索引路径
HAYSTACK_CONNECTIONS = {
	'default': {
		'ENGINE' : 'haystack.backends.whoosh_backend.WhooshEngine',
		'PATH' : os.path.join(BASE_DIR,' whoosh_index'),
	},
}
#实时生成索引文件
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalprocessor'

4.在post应用包下创建search. jindexes.py文件
5.编辑post/search. indexes.py文件(和实体对应)

#coding=UTF-8
from haystack import indexes
from post.models import *

#注意格式(模型类名+ Index)
class PostIndex(indexes.SearchIndex , indexes.Indexable):
	text = indexes.CharField(document=True, use_template=True)
	#给title, content设置素引
	title = indexes.NgramField(model_attr= 'title')
	content = indexes.NgramField(model_attr= 'content')

	def get_model(self):
		return Post
	def index_queryset(self, using=None):
		return self.get_model().objects.order_by('-created')

6.创建搜索引擎模板( project/templates/search/indexes/yourapp/post_text.txt )在项目根目录/templates/目录下创建
search/indexes/post/post_text.txt文件(模型类名小写_text.txt)
7.编辑post _text.txt文件

{{object.title}}
{{object. content}}

8.通过命令生成索引文件

python manage.py rebuild_index 
python manage.py update_index (如果查询不到内容)

编辑搜索框请求信息
项目根目录/templates/header.html
在这里插入图片描述
配置URL
1.项目包/urls.py文件
在这里插入图片描述
在项目根目录下的templates/search下创建search.html
在这里插入图片描述

中文分词:

参考API : https://github.com/fxsjy/jieba
1.安装库

pip install jieba

2.在post应用包下创建tokenizer.py文件
3.编辑tokenizer.py文件

#coding=utf-8
import jieba
from whoosh.analysis import Tokenizer, Token

class ChineseTokenizer(Tokenizer):
	def __call__(self, value, positions=False, chars=False,
				keeporiginal=False, removestops=True,
				start_pos=0, start_char=0, mode='', **kwargs):
		t =Token(positions, chars, removestops=removestops, mode=mode,
				**kwargs)
		seglist = jieba.cut(value, cut_all=False) # (精确模式)使用结巴分词库进行分词
		# seglist = jieba.cut for- search(value) #(搜索引擎模式)使用结巴分词库进行分词
		for W in seglist:
			print w
			t.original = t.text = W
			t.boost = 1.0
			if positions:
				t.pos = start_pos + value.find(w)
			if chars:
				t.startchar = start_char + value.find(w)
				t.endchar = start_char + value.find(w) + len(w)
			yield t # 通过生成器返回每个分词的结果token

def ChineseAnalyzer() :
	return ChineseTokenizer()

4.拷贝C:\Python27\Lib\site-packages\haystack\backends目录whoosh_backend.py到post目录下,改名为whoosh_cn_backend.py
5.编辑post/whoosh_cn_backend.py文件
搜索build_schema函数
最后一个else中:
在这里插入图片描述
修改为:ChineseAnalyzer

6.修改blog/settings.py文件
在这里插入图片描述
重新生成索引文件:

python manage.py rebuild_index 
python manage.py update_index (如果查询不到内容)

7.发布帖子(admin中)

8.部署

https://www.pythonanywhere.com

虚拟环境
virtualenv blogenv --python=python2.7创建虚拟环境
source activate激活虚拟环境
deactivate退出虚拟环境
workon blogenv加入虚拟环境

安装各种库文件

实现步骤

1.setting.py中配置修改:
在这里插入图片描述
2.拷贝项目到桌面并且添加zip压缩包
3.将blog.zip文件上传至pythonanywhere.com[files]目录中
4.打开bash窗口解压blog.zip文件
5.创建虚拟环境blogenv
6.激活虚拟环境
7.在虚拟环境安装各种模块
8.配置各个静态资源文件位置:在pythonanywhere.com[web]目录中配置路径
在这里插入图片描述
9. reload服务器

附加:Git

windows,版本下载地址:https://git-scm.com/download/win
其他可参考:https://blog.csdn.net/hhhmonkey/article/details/108108259

常用命令:
# 初始化仓库
$ git init

# 1.工作区中创建新文件hello.py
$ vi hello.py
#2.查看文件状态
$ git status
# 3.将源码拷贝到暂存区
$ git add hello.py
# 4.将暂存区移动到当前分支
$ git commit -m “创建新文件hello.py"
#5.查看状态
$ git status 
	On branch master
	nothing to commit, working tree clean



#查着工作区和版本库里面最新版本的区别
$ git diff HEAD -- hello.py
方式1 :可以撒销未被追踪的文件
	#丢弃工作区的修改
	$ git checkout -- hello.py
方式2 :可以撒销到任意版本
	#查看操作日志
	$ git log
	commit c4e993ddb36d77710dad2c7c8c18130f9a761946 (HEAD -> master)
	$ git log --oneline
	c4e993d (HEAD -》master) first add
	#回退到某个版本1
	$ git reset c4e993ddb36d77710dad2c7c8c18130f9a761946
	#回退到某个版本2
	$ git reset --hard c4e993ddb36d77710dad2c7c8c18130f9a761946
	#回退到上一个版本
	$ git reset HEAD



# 1.删除工作区中的文件
rm hello.py
# 2.删除暂存区中的文件
git rm hello.py
# 3.删除当前分支中的文件
git commit m '描述信息'



#修改文件
$ vi hello.py
#查看状态
$ git status
#添加营存区
$ git add hello.py
#添加版本库
$ git commit -m '描述信息' 
分支操作

分支可以理解成独立开发功能的小房间。

#创建分支
$ git branch 分支名
#查看分支
$ git branch
#切娛分支
$ git checkout 分支名
#创遇+切换分支
$ git checkout -b 分支名
#台并某分支到当前分支
$ git merge 分支名
#删除某分支
$ git branch -d 分支名



当前分支1 分支2 前提分支1和分支2都进行了代码修改。
解决方法:将分支2的内容合并到分支1

# 1.切换到当前分支1
	$ git checkout 分支1
# 2.和分支2进行台并
	$ git merge 分支2
# 3.执行第二步后出现冲突(CONFLICT )
	$ git merge dev
	Auto-merging hello. py
	CONFLICT (content): Merge conflict in hello.py
	Automatic merge failed; fix conflicts and then commit the result.
#4.解决方案:
	print 'first "
	<<<<<<< HEAD
	print 'master second'
	======= 
	print 'dev second
	>>>>>>> dey
1.编辑合并分支1和分支2的内容
2.修改好之后,$ git add 文件名
3. $ git commit -m "描述信息"
远程库和本地库

远程库
1.github版本库即为远程库。

本地库
1.本地创健的Git版本库即为本地库。

1.先在github官网中注册账户。
2.创建SSH key。
	由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的。
	Windows下打开Git Bash, 创建SSH key。
	$ ssh-keygen -t rsa -C "youremai@example.com"
3.在用户主目录里找到.ssh目录,里面有id_ rsa和id. rsa.pub两个文件(密钥对)。
	用户主目录: C:\Users\Administrator
4.登陆GitHub,打开"Account settings", "SSH Keys"页面。
5."Add SSH Key", 填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。

本地库关联远程库

1. github注 册账户
2.创建远程版本库
3.本地库和远程库进行关联

$ git remote -v
#在本地库当前分支
$ git remote add origin git@github.com:pythonde/newRepository.git

4.更新本地库
git pu1h --rebase origin master
git status
git add hello.py
git comit -m '描述信息'

5.将本地库内容上传至远程库
git push -u origin master

【参考】https://www.bilibili.com/video/BV1z44y187vi
另外,参考视频中存在项目2-商城项目可以参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值