前言

魔改后端肯定缺少不了数据库的的操作,在qexo中有个数据库操作框架,叫做ORM框架,是做来抹平python与数据库操作之间的繁琐操作,提供统一的操作接口。
这篇文章就说一下怎么自定义一个计数用的数据库,后续读者们可以任意去做自己想要的扩展。因为涉及到数据库操作,所以操作数据库的api我们需要做成私有的api。然后我们再做一个模板用来展示数据库中的计数值,这需要制作一个页面来展示计数值。

预览效果

效果如下:
数据库记录操作页面

创建自定义数据库

找到 hexoweb\models.py 文件,在文件末尾添加自定义数据库如下:

1
2
3
class CountModel(models.Model):
id = models.IntegerField(primary_key=True, editable=False)
cnt=models.IntegerField(default=0)

创建自定义私有api

找到 hexoweb\api.py 文件,在文件的末尾添加私有api方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from hexoweb.models import CountModel  #这一句添加到文件开头的地方

# 设置计数
@login_required(login_url="/login/")
def set_count(request):
if request.method != "GET":
return

try:
count, b = CountModel.objects.get_or_create(id=1, defaults={'cnt':0})
count.cnt = count.cnt + 1
count.save()
except Exception as error:
return JsonResponse(safe=False, data={"msg":"出错啦!", "status":False})
return JsonResponse(safe=False, data={"msg":"设置计数增加1成功!", "status":True})

# 获取计数
@login_required(login_url="/login/")
def get_count(request):
if request.method != "GET":
return

try:
count, b = CountModel.objects.get_or_create(id=1, defaults={'cnt':0})
except Exception as error:
return JsonResponse(safe=False, data={"msg":"出错啦!", "status":False})
return JsonResponse(safe=False, data={"msg":count.cnt, "status":True})

创建模板页面

新建 templates\home\count.html 文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
{% extends 'layouts/base.html' %}

{% block stylesheets %}
<style>
.container-fluid.mt--6 {
margin-top: 50px !important;
}
</style>
{% endblock stylesheets %}

{% block content %}
<!-- Page content -->
<div class="container-fluid mt--6">
<p id="id-count-sum">0</p>
<button onclick="set_count()">设置计数增加1</button>
<button onclick="get_count()">获取计数总数显示</button>
{% include "includes/footer.html" %}
</div>

{% endblock content %}

<!-- Specific JS goes HERE -->
{% block javascripts %}
<script>
function set_count() {
let loading = new KZ_Loading('正在删除中...');
loading.show();
$.ajax({
url: '/api/set_count/',
method: 'GET',
dataType: 'JSON',
success: function (res) {
loading.destroy();
if (res.status) {
notyf.success('设置成功!');
} else {
notyf.error(res.msg);
}
},
error: function (res) {
loading.destroy();
notyf.error("网络错误!");
}
})
}
function get_count() {
let loading = new KZ_Loading('正在删除中...');
loading.show();
$.ajax({
url: '/api/get_count/',
method: 'GET',
dataType: 'JSON',
success: function (res) {
loading.destroy();
if (res.status) {
notyf.success('获取成功!');
$("#id-count-sum").html(res.msg);
} else {
notyf.error(res.msg);
}
},
error: function (res) {
loading.destroy();
notyf.error("网络错误!");
}
})
}
</script>
{% endblock javascripts %}

实现页面处理方法

找到 hexoweb\views.py 文件,在文件末尾添加如下代码:

1
2
3
4
5
6
7
8
9
10
@login_required(login_url="/login/")
def count(request):
if not request.user.is_staff:
logging.info(f"子用户{request.user.username}尝试访问{request.path}被拒绝")
return page_403(request, "您没有权限访问此页面")
context = dict()
context.update(get_custom_config())
save_setting("LAST_LOGIN", str(int(time())))
html_template = loader.get_template('home/count.html')
return HttpResponse(html_template.render(context, request))

设置私有api路由和新页面的路由

找到 core\urls.py 文件,添加如下路由设置:

1
2
3
4
5
6
7
    path('', index, name='home'),
+ path('count/', count, name='count'),

+ path('api/set_count/', set_count, name="set_count"),
+ path('api/get_count/', get_count, name="get_count"),
path('api/auth/', auth, name='auth'),
path('api/save/', save, name='save'),

Qexo四连

在cmd命令行中输入如下命令运行部署Qexo项目:

1
2
3
4
E:\Qexo> pip3 install -r requirements.txt
E:\Qexo> python3 manage.py makemigrations
E:\Qexo> python3 manage.py migrate
E:\Qexo> python3 manage.py runserver --noreload

访问 http://127.0.0.1:8000/count/ 查看页面效果。