You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
myblog/App/views.py

229 lines
10 KiB

from django.contrib.auth import authenticate
from django.http import JsonResponse
from django.shortcuts import HttpResponse, render, redirect, reverse
from django.contrib.auth.decorators import login_required
from django.views.decorators.cache import cache_page
from django.core.cache import cache
from django.conf import settings
from .forms import *
from .models import *
from .qingcloud import putImage
import datetime, requests, json
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.clickjacking import xframe_options_sameorigin
from .csdn import get_image
#@cache_page(60 * 15)
def index(request):
name = None
if request.user.is_authenticated:
name = User.last_name
data = cache.get('csdn')
if data is None:
with open('App/csdn.json', 'r') as f:
data = json.load(f)
return render(request, 'index.html', {'name': name, 'data': data})
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('loginName')
password = form.cleaned_data.get('loginPass')
user = authenticate(username=username, password=password)
auth.login(request, user)
info = getAddr(request.META['REMOTE_ADDR'])
if info['status'] == 'success':
Login.objects.create(username=username, client_addr=info['query'], city=info['city'],
country=info['country'], region=info['regionName'], latitude=info['lat'],
longitude=info['lon']).save()
else:
Login.objects.create(username=username, client_addr=request.META['REMOTE_ADDR']).save()
url = request.GET.get('next', '/')
return redirect(url)
else:
return render(request, 'login.html', {'errors': form.errors})
else:
return render(request, 'login.html')
@login_required
def userinfo(request):
login_data = Login.objects.filter(username=request.user.username).order_by('-login_time')[:5]
image_data = Upload.objects.filter(username=request.user.username).order_by('-upload_time')[:5]
blog_data = paper.objects.filter(username=request.user.username).order_by('-paper_time')[:5]
task_data = Task.objects.filter(username=request.user.username).order_by('-task_time')[:5]
return render(request, 'function/user.html', {'name': auth.get_user(request).username, 'login_data': login_data, 'image_data': image_data, 'blog_data': blog_data, 'task_data': task_data, 'regtime': auth.get_user(request).date_joined})
def logout(request):
auth.logout(request)
return redirect(reverse('App:index'))
@login_required
def repassword(request):
return HttpResponse('功能尚未支持,修改密码请联系管理员')
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
first_name = form.cleaned_data.get('fname')
last_name = form.cleaned_data.get('lname')
username = form.cleaned_data.get('username')
email = request.POST.get('email')
password = form.cleaned_data.get('password')
likes = request.POST.getlist('like')
role = request.POST.get('role')
try:
User.objects.create_user(username=username, email=email, password=password, first_name=first_name,
last_name=last_name, is_staff=role, likes=likes)
except Exception as e:
return render(request, 'register.html', {'errors': e})
return redirect(reverse('App:login'))
else:
return render(request, 'register.html', {'errors': form.errors})
else:
return render(request, 'register.html')
# @cache_page(60 * 15)
@login_required
def dashboard(request, type):
username = auth.get_user(request).username
if request.GET.get('time') == 'week':
t = 6
elif request.GET.get('time') == 'month':
t = 29
elif request.GET.get('time') == 'year':
t = 364
elif request.GET.get('time') == 'quarter':
t = 90
else:
t = 6
if type == 'login':
data = getData(username, t)
table = Login.objects.filter(username=username).order_by('-login_time').all()[:30]
elif type == 'docs':
data = getData(username, t, 'docs')
table = Upload.objects.filter(username=username).order_by('-upload_time').all()[:100]
elif type == 'blog':
data = getData(username, t, 'blog')
table = paper.objects.order_by('-paper_time').all()[:100]
else:
data = table = ""
return render(request, 'nav/dashboard.html', {'data': data, 'table': table, 'type': type})
@xframe_options_sameorigin
@csrf_exempt
@login_required
def upload(request):
if request.method == 'POST':
if request.GET.get('type') == 'editmd':
file = request.FILES.get('editormd-image-file')
url_path = putImage(file)
if Upload.objects.filter(username=auth.get_user(request).username, file_name=file.name,file_size=file.size).exists():
Upload.objects.filter(file_name=file.name, file_size=file.size).update(upload_time=datetime.datetime.now())
else:
Upload.objects.create(username=auth.get_user(request).username, file_name=file.name, file_path=file.name,file_size=file.size, url_path=url_path['url']).save()
data = {'success': 1, 'message': "上传成功", 'url': url_path['url']}
return JsonResponse(data)
else:
file = request.FILES.getlist('file', None)
data = {'status': 'success', 'msg': []}
for i in file:
if Upload.objects.filter(username=auth.get_user(request).username,file_name=i.name,file_size=i.size).exists():
Upload.objects.filter(file_name=i.name,file_size=i.size).update(upload_time=datetime.datetime.now())
else:
url_path = putImage(i)
data['msg'].append(url_path)
Upload.objects.create(username=auth.get_user(request).username, file_name=i.name, file_path=i.name,
file_size=i.size, url_path=url_path['url']).save()
if data:
return HttpResponse(json.dumps(data))
return render(request, 'nav/upload.html')
# 功能函数
def getData(username, time, type='login'):
data = {}
for i in range(time, -1, -1):
date = datetime.date.today() - datetime.timedelta(days=i)
if type == 'login':
data.update({str(date): Login.objects.filter(username=username, login_time__startswith=date).count()})
elif type == 'docs':
data.update({str(date): Upload.objects.filter(username=username, upload_time__startswith=date).count()})
elif type == 'blog':
data.update({str(date): paper.objects.filter(paper_time__startswith=date).count()})
return data
def getAddr(ip):
ip = requests.get('https://httpbin.org/ip').json()['origin']
info = requests.get('http://ip-api.com/json/' + ip + '?lang=zh-CN')
info = info.json()
return info
@login_required
def listImage(request):
image = Upload.objects.filter(username=auth.get_user(request).username).all()
return render(request, 'nav/image.html', {'image': image})
@login_required
def listTask(request):
task = Task.objects.all()
return render(request, 'task/tasklist.html', {'task': task})
def addTask(request):
if request.method == 'POST':
task_title = request.POST.get('title')
image = request.POST.get('bimage')
if not image :
image = 'https://py-put.gd2.qingstor.com/0bb68da4b7edd5ad21bee1f9ece0bdca5871f5a9.jpg'
data = {}
now = datetime.datetime.now()
data.update({'backend_image': image, 'userlist': {}.fromkeys(request.POST.get('userlist').split(','),{'status':'未完成','update_time': str(now)}), 'desc': request.POST.get('desc')})
Task.objects.create(username=auth.get_user(request).username,task_title=task_title, task_content=json.dumps(data, ensure_ascii=False),).save()
return redirect(reverse('App:listTask'), {'messages': task_title + '添加成功'})
return render(request, 'task/taskcreate.html')
@login_required
def checkTask(request, id):
if request.method == 'POST':
task = Task.objects.get(id=id)
jsondata = json.loads(task.task_content)
jsondata['userlist'][request.GET.get('name')] = {'status': '已完成', 'update_time': str(datetime.datetime.now())}
Task.objects.filter(id=id).update(task_content=json.dumps(jsondata, ensure_ascii=False))
return redirect(reverse('App:checkTask', kwargs={'id': id}))
data = Task.objects.filter(id=id).get()
userdata = json.loads(data.task_content)
return render(request, 'task/detailed.html', {'data': userdata['userlist'],'id':id})
@csrf_exempt
@login_required
def editMD(request, id=None):
if request.method == 'POST':
title = request.POST.get('title')
desc = request.POST.get('desc')
text = request.POST.get('test-editormd-markdown-doc')
image = get_image('200x300')
if paper.objects.filter(username=auth.get_user(request).username, paper_title=title).exists():
paper.objects.filter(username=auth.get_user(request).username,paper_title=title).update(paper_desc=desc, paper_content=text, paper_time=datetime.datetime.now())
else:
paper.objects.create(username=auth.get_user(request).username, paper_title=title, paper_desc=desc,
paper_content=text, paper_image=image).save()
return redirect(reverse('App:paperList'))
else:
data = {}
if f'{id}'.isdigit():
data = paper.objects.filter(id=id).get()
return render(request, 'function/edit.html', {'data': data})
def paperList(request):
data = paper.objects.all()
return render(request, 'nav/paperlist.html', {'data': data, 'username': auth.get_user(request).username})
def paperDetail(request, id):
data = paper.objects.filter(id=id).get()
return render(request, 'function/viewmd.html', {'data': data})