一、升级基本框架
1、效果图
#1号环境
#2号环境
2、view文件
import django
django.setup()
from django.shortcuts import render
# Create your views here.
import json
from random import randrange
from django.http import HttpResponse
from rest_framework.views import APIView
# from pyecharts.charts import Line
# from pyecharts import options as opts
from django.views.decorators.csrf import csrf_exempt
import time
from upgrade.data_process import FileOperate
import threading
from django.http import Http404
from django.contrib.auth.decorators import login_required
from learning_logs.models import Topic
from multiprocessing import Process
import datetime
import re
class DataProcess:
def __init__(self):
self.progress = 0
self.status = 0
def data_update(self):
if self.status == 1:
time.sleep(1)
self.progress += 1
if self.progress >= 99:
self.progress = 99
elif self.status == 2:
self.progress = 100
return {'value': self.progress}
def status_update(self, status=0):
if status == 0:
self.progress = 0
self.status = status
dp = DataProcess()
fo = FileOperate()
# Create your views here.
def response_as_json(data):
json_str = json.dumps(data)
response = HttpResponse(
json_str,
content_type="application/json",
)
response["Access-Control-Allow-Origin"] = "*"
return response
def json_response(data, code=200):
data = {
"code": code,
"msg": "success",
"data": data,
}
return response_as_json(data)
def json_error(error_string="error", code=500, **kwargs):
data = {
"code": code,
"msg": error_string,
"data": {}
}
data.update(kwargs)
return response_as_json(data)
JsonResponse = json_response
JsonError = json_error
env_info = {}
class ChartView(APIView):
def get(self, request, *args, **kwargs):
# js = json.loads(line_base())
# js = dp.data_update()
global env_info
env_id = request.GET['env_id']
env_id = int(env_id)
if env_id in env_info.keys():
if env_info[env_id]['tid'].is_alive():
env_info[env_id]['flag'] = 0
start_time = env_info[env_id]['start_time']
now_time = datetime.datetime.now()
env_info[env_id]['cost_time'] = (now_time - start_time).seconds
if env_info.get(env_id, None) and env_info.get(env_id, None).get('cost_time', None):
js = {'value': env_info[env_id]['cost_time']}
else:
js = {'value': 0}
form = {"username": "root", "password": "root"}
info = dict(js, **form)
return JsonResponse(info)
cnt = 9
class ChartUpdateView(APIView):
def get(self, request, *args, **kwargs):
global cnt
cnt = cnt + 1
return JsonResponse({"name": cnt, "value": randrange(0, 100)})
class IndexView(APIView):
def get(self, request, *args, **kwargs):
"""显示单个主题及其所有条目"""
env_id = request.GET['env_id']
topic = Topic.objects.get(id=int(env_id[1:]))
# 确认请求的主题属于当前用户
if topic.owner != request.user:
raise Http404
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'index.html', context)
@csrf_exempt
@login_required
def reset(request, topic_id):
global env_info
data = {}
vars_li = list(fo.read_json('config.json').keys())
s = [''] * len(vars_li)
dic = dict(zip(vars_li, s))
locals().update(dic)
"""显示单个主题及其所有条目"""
topic = Topic.objects.get(id=topic_id)
# 确认请求的主题属于当前用户
if topic.owner != request.user:
raise Http404
entries = topic.entry_set.order_by('-date_added')
if request.method == 'POST':
dp.status_update(status=0)
for var in vars_li:
vars()[var] = request.POST[var]
data[var] = eval(var)
print(data)
print(entries[0].text)
# if context['username'] != '1' or context['password'] != '1':
# return render(request, 'index.html', {'data': context})
dp.status_update(status=1)
# wait = WaitFinishWork()
# wait.start()
action = request.POST['action']
if action == "reset":
if topic_id not in env_info.keys():
t = Process(target=reset_os, args=(entries[0].text,))
t.start()
elif topic_id in env_info and env_info[topic_id]['tid'].is_alive():
env_info[topic_id]['tid'].terminate()
env_info[topic_id]['tid'].join()
t = Process(target=reset_os, args=(entries[0].text,))
t.start()
elif topic_id in env_info and not env_info[topic_id]['tid'].is_alive():
t = Process(target=reset_os, args=(entries[0].text,))
t.start()
else:
t = None
start_time = datetime.datetime.now()
env_info[topic_id] = {"tid": t, 'start_time': start_time, 'cost_time': 0, 'flag': 0}
elif action == "stop":
if env_info.get(topic_id, None):
env_info[topic_id]['tid'].terminate()
env_info[topic_id]['tid'].join()
context = {'topic': topic, 'entries': entries, 'data': data}
return render(request, 'index.html', context)
@csrf_exempt
@login_required
def upgrade_home(request):
"""显示所有的主题"""
topics = Topic.objects.filter(owner=request.user).order_by('date_added')
context = {'topics': topics}
return render(request, 'upgrade_home.html', context)
class WaitFinishWork(threading.Thread):
def run(self):
time.sleep(20)
dp.status_update(status=2)
def reset_os(info):
for i in range(100):
print(i, info)
time.sleep(1)
3、模板文件
{% extends 'learning_logs/base.html' %}
{% block header %}
<h2>{{ user.username }}升级 {{ topic }} 环境</h2>
{% endblock header %}
{% block content %}
<p id="env_id" hidden="hidden">{{ topic.id }}</p>
{% for entry in entries %}
<div class="panel panel-default">
<div class="panel-body">
{{ entry.text|linebreaks }}
</div>
</div> <!-- panel -->
{% empty %}
There are no entries for this topic yet.
{% endfor %}
<form method="post" action="{% url 'upgrade:reset' topic.id %}">
<!-- {% csrf_token %}-->
env username <input type="text" name="username" value="root"><br>
env password <input type="text" name="password" value="root"><br>
<input type="submit" name="action" value="reset">
<input type="submit" name="action" value="stop"><br>
</form>
{% for key, value in data.items %}
{{ key }} : {{ value }}<br>
{% endfor %}
<div id="bar" style="width:1000px; height:600px;"></div>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-nightly@5.1.2-dev.20210512/dist/echarts.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
<script>
var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
var old_data = [];
<!-- var dom = document.getElementById("container");-->
<!-- var chart = echarts.init(dom);-->
var option;
option = {
series: [{
type: 'gauge',
progress: {
show: true,
width: 18
},
axisLine: {
lineStyle: {
width: 18
}
},
axisTick: {
show: false
},
splitLine: {
length: 15,
lineStyle: {
width: 2,
color: '#999'
}
},
axisLabel: {
distance: 25,
color: '#999',
fontSize: 20
},
anchor: {
show: true,
showAbove: true,
size: 25,
itemStyle: {
borderWidth: 10
}
},
title: {
show: false
},
detail: {
valueAnimation: true,
fontSize: 80,
offsetCenter: [0, '70%']
},
data: [{
value: 0
}]
}]
};
chart.setOption(option);
$(
function () {
fetchData(chart);
setInterval(fetchData, 2000);
}
);
function fetchData() {
$.ajax({
type: "GET",
url: "http://127.0.0.1:8000/upgrade/line",
data:{
"env_id": $("#env_id").text(),
},
dataType: 'json',
success: function (result) {
var options = chart.getOption();
options.series[0].data[0].value = result.data.value;
chart.setOption(options);
old_data = chart.getOption().series[0].data;
}
});
}
</script>
{% endblock content %}
二、支持删除环境
1、修改patch
diff --git a/learning_logs/templates/learning_logs/topic.html b/learning_logs/templates/learning_logs/topic.html
index 064b8cb..c5c8d04 100644
--- a/learning_logs/templates/learning_logs/topic.html
+++ b/learning_logs/templates/learning_logs/topic.html
@@ -17,6 +17,8 @@
<small>
<a href="{% url 'learning_logs:edit_entry' entry.id %}">
edit entry</a>
+ <a href="{% url 'learning_logs:delete_entry' entry.id %}" class="ex1"
+ onclick="return confirm('永久删除此条目,请确认!');"> 删除</a>
</small>
</h3>
</div>
diff --git a/learning_logs/templates/learning_logs/topics.html b/learning_logs/templates/learning_logs/topics.html
index ba957d5..e0042f4 100644
--- a/learning_logs/templates/learning_logs/topics.html
+++ b/learning_logs/templates/learning_logs/topics.html
@@ -11,6 +11,10 @@
<li>
<h3>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
+ {% if topic.owner == user %}
+ <small><a href="{% url 'learning_logs:delete_topic' topic.id %}" class="ex1"
+ onclick="return confirm('永久删除此主题,请确认!');"> 删除</a></small>
+ {% endif %}
</h3>
</li>
{% empty %}
diff --git a/learning_logs/urls.py b/learning_logs/urls.py
index d9def4a..a81360c 100644
--- a/learning_logs/urls.py
+++ b/learning_logs/urls.py
@@ -1,6 +1,6 @@
"""定义learning_logs的URL模式"""
-from django.urls import path
+from django.urls import path, re_path
from . import views
@@ -22,4 +22,13 @@ urlpatterns = [
# 用于编辑条目的网页
path('edit_entry/<int:entry_id>/', views.edit_entry, name='edit_entry'),
+
+ # 用于删除自有条目的页面
+ re_path('delete_entry/(?P<entry_id>\d+)/', views.delete_entry, name='delete_entry'),
+
+ # 用于删除自有主题的页面
+ re_path('delete_topic/(?P<topic_id>\d+)/', views.delete_topic, name='delete_topic'),
]
\ No newline at end of file
diff --git a/learning_logs/views.py b/learning_logs/views.py
index 1c5cea5..f81ed37 100644
--- a/learning_logs/views.py
+++ b/learning_logs/views.py
@@ -97,3 +97,45 @@ def edit_entry(request, entry_id):
context = {'entry': entry, 'topic': topic, 'form': form}
return render(request, 'learning_logs/edite_entry.html', context)
+@login_required
+def delete_entry(request, entry_id):
+ '''删除选定条目'''
+ entry = Entry.objects.get(id=entry_id)
+ topic = entry.topic
+ check_topic_owner(topic, request)
+ entry.entry_hide = True
+ entry.delete()
+
+ return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic.id]))
+
+
+@login_required
+def delete_topic(request, topic_id):
+ '''删除选定主题'''
+ topic = Topic.objects.get(id=topic_id)
+ check_topic_owner(topic, request)
+ topic.topic_hide = True
+ topic.delete()
+
+ return HttpResponseRedirect(reverse('learning_logs:topics'))
+
+
+def check_topic_owner(topic, request):
+ if topic.owner != request.user:
+ raise Http404
+
+
+def check_topic_public(topic, request):
+ if topic.public != True:
+ raise Http404
\ No newline at end of file