优化和修复了一些东西

This commit is contained in:
yangjian 2019-11-03 20:36:34 +08:00
parent d827652a92
commit 71883d5d96
15 changed files with 264 additions and 44 deletions

2
.gitignore vendored
View File

@ -56,7 +56,7 @@ coverage.xml
# Django stuff:
*.log
local_settings.py
# db.sqlite3
db.sqlite3
# Flask stuff:
instance/

View File

@ -3,7 +3,7 @@ from django.http.response import JsonResponse,HttpResponse
from django.contrib.auth import authenticate,login,logout # 认证相关方法
from django.contrib.auth.models import User # Django默认用户模型
from django.contrib.auth.decorators import login_required # 登录需求装饰器
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,InvalidPage
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,InvalidPage # 后端分页
from app_admin.decorators import superuser_only
import json
import datetime
@ -209,8 +209,8 @@ def admin_del_user(request):
@superuser_only
def admin_project(request):
if request.method == 'GET':
username = request.GET.get('kw','')
if username == '':
search_kw = request.GET.get('kw','')
if search_kw == '':
project_list = Project.objects.all()
paginator = Paginator(project_list,20)
page = request.GET.get('page',1)
@ -221,15 +221,17 @@ def admin_project(request):
except EmptyPage:
projects = paginator.page(paginator.num_pages)
else:
project_list = Project.objects.filter(intro__icontains=username)
project_list = Project.objects.filter(intro__icontains=search_kw)
paginator = Paginator(project_list, 20)
page = request.GET.get('page', 1)
try:
projects = paginator.page(page)
except PageNotAnInteger:
projects = paginator.page(1)
except EmptyPage:
projects = paginator.page(paginator.num_pages)
projects.kw = search_kw
return render(request,'app_admin/admin_project.html',locals())
else:
return HttpResponse('方法错误')
@ -260,6 +262,7 @@ def admin_doc(request):
docs = paginator.page(1)
except EmptyPage:
docs = paginator.page(paginator.num_pages)
docs.kw = kw
return render(request,'app_admin/admin_doc.html',locals())
@ -288,6 +291,7 @@ def admin_doctemp(request):
doctemps = paginator.page(1)
except EmptyPage:
doctemps = paginator.page(paginator.num_pages)
doctemps.kw = kw
return render(request,'app_admin/admin_doctemp.html',locals())

View File

@ -1,6 +1,7 @@
from django.shortcuts import render
from django.http.response import JsonResponse,Http404,HttpResponseNotAllowed,HttpResponse
from django.contrib.auth.decorators import login_required # 登录需求装饰器
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,InvalidPage # 后端分页
from app_doc.models import Project,Doc,DocTemp
from django.contrib.auth.models import User
from django.db.models import Q
@ -22,7 +23,7 @@ def create_project(request):
if name != '':
project = Project.objects.create(
name=name,
intro=desc,
intro=desc[:100],
create_user=request.user
)
project.save()
@ -69,7 +70,7 @@ def modify_project(request):
try:
pro_id = request.POST.get('pro_id',None)
project = Project.objects.get(id=pro_id)
if request.user == project.create_user:
if (request.user == project.create_user) or request.user.is_superuser:
name = request.POST.get('name',None)
content = request.POST.get('desc',None)
project.name = name
@ -91,7 +92,7 @@ def del_project(request):
pro_id = request.POST.get('pro_id','')
if pro_id != '':
pro = Project.objects.get(id=pro_id)
if request.user == pro.create_user:
if (request.user == pro.create_user) or request.user.is_superuser:
# 删除文集下的文档
pro_doc_list = Doc.objects.filter(top_doc=int(pro_id))
pro_doc_list.delete()
@ -114,8 +115,25 @@ def manage_project(request):
search_kw = request.GET.get('kw', None)
if search_kw:
pro_list = Project.objects.filter(create_user=request.user,intro__icontains=search_kw)
paginator = Paginator(pro_list, 10)
page = request.GET.get('page', 1)
try:
pros = paginator.page(page)
except PageNotAnInteger:
pros = paginator.page(1)
except EmptyPage:
pros = paginator.page(paginator.num_pages)
pros.kw = search_kw
else:
pro_list = Project.objects.filter(create_user=request.user)
paginator = Paginator(pro_list, 10)
page = request.GET.get('page', 1)
try:
pros = paginator.page(page)
except PageNotAnInteger:
pros = paginator.page(1)
except EmptyPage:
pros = paginator.page(paginator.num_pages)
return render(request,'app_doc/manage_project.html',locals())
except Exception as e:
return HttpResponse('请求出错')
@ -248,8 +266,25 @@ def manage_doc(request):
search_kw = request.GET.get('kw',None)
if search_kw:
doc_list = Doc.objects.filter(create_user=request.user,content__icontains=search_kw)
paginator = Paginator(doc_list, 10)
page = request.GET.get('page', 1)
try:
docs = paginator.page(page)
except PageNotAnInteger:
docs = paginator.page(1)
except EmptyPage:
docs = paginator.page(paginator.num_pages)
docs.kw = search_kw
else:
doc_list = Doc.objects.filter(create_user=request.user)
paginator = Paginator(doc_list, 10)
page = request.GET.get('page', 1)
try:
docs = paginator.page(page)
except PageNotAnInteger:
docs = paginator.page(1)
except EmptyPage:
docs = paginator.page(paginator.num_pages)
return render(request,'app_doc/manage_doc.html',locals())
else:
return HttpResponse('方法不允许')
@ -340,8 +375,25 @@ def manage_doctemp(request):
search_kw = request.GET.get('kw', None)
if search_kw:
doctemp_list = DocTemp.objects.filter(create_user=request.user,content__icontains=search_kw)
paginator = Paginator(doctemp_list, 10)
page = request.GET.get('page', 1)
try:
doctemps = paginator.page(page)
except PageNotAnInteger:
doctemps = paginator.page(1)
except EmptyPage:
doctemps = paginator.page(paginator.num_pages)
doctemps.kw = search_kw
else:
doctemp_list = DocTemp.objects.filter(create_user=request.user)
paginator = Paginator(doctemp_list, 10)
page = request.GET.get('page', 1)
try:
doctemps = paginator.page(page)
except PageNotAnInteger:
doctemps = paginator.page(1)
except EmptyPage:
doctemps = paginator.page(paginator.num_pages)
return render(request, 'app_doc/manage_doctemp.html', locals())
except Exception as e:
return HttpResponse('请求出错')

View File

@ -44,13 +44,94 @@
.project-item{
float: left;
width: 200px;
height: 120px;
/*height: 120px;*/
margin-top: 20px;
margin-left: 20px;
border: 1px solid #ddd;
border-radius: 4px;
box-shadow: 0 1px 3px rgba(0,0,0,.055);
}
.project-desc{
overflow:hidden;
text-overflow:ellipsis; /* 加省略号 */
white-space:nowrap; /* 强制不换行 */
}
.tooltip {
display: inline;
/*position: relative;*/
z-index: 999;
}
/* Gap filler */
.tooltip-item::after {
content: '';
position: absolute;
width: 360px;
height: 20px;
bottom: 100%;
left: 50%;
pointer-events: none;
-webkit-transform: translateX(-50%);
transform: translateX(-50%);
}
.tooltip:hover .tooltip-item::after {
pointer-events: auto;
}
/* 文集简介提示工具 */
.tooltip-content {
position: absolute;
z-index: 9999;
width: 170px;
left: 78%;
margin: 0 -60px 20px -150px;
padding:10px;
top: 100%;
text-align: left;
box-shadow: -5px -5px 15px rgba(48,54,61,0.2);
background: #2a3035;
opacity: 0;
cursor: default;
pointer-events: none;
font-size: 0.68em;
line-height: 1.35;
display: block;
color: #fff;
-webkit-transform: translate3d(0,-10px,0);
transform: translate3d(0,-10px,0);
-webkit-transition: opacity 0.3s, -webkit-transform 0.3s;
transition: opacity 0.3s, transform 0.3s;
}
.tooltip:hover .tooltip-content {
pointer-events: auto;
opacity: 1;
-webkit-transform: translate3d(0,0,0) rotate3d(0,0,0,0);
transform: translate3d(0,0,0) rotate3d(0,0,0,0);
}
/* 箭头 */
.tooltip-content::after {
content: '';
bottom: 100%; /* 箭头在头部 */
left: 50%;
border: solid transparent;
height: 0;
width: 0;
position: absolute;
pointer-events: none;
border-color: transparent;
border-bottom-color: #2a3035;
border-width: 10px;
/*margin-left: 10px;8*/
}
.layui-card{
box-shadow:0 0 0 0;
}
@ -242,7 +323,7 @@ li.active > a{
font-size: 28px;
font-weight: 700;
}
/* 返回顶部 */
.toTop {
width: 70px;
height: 70px;
@ -264,7 +345,7 @@ li.active > a{
cursor: pointer;
color: red;
}
/*切换字号*/
.switch-font{
font-family: Serif;
}

View File

@ -19,7 +19,7 @@
{# <img src="/media/logo-white.png" />#}
<h1 style="color: white;">
<strong>MrDoc</strong>
<span style="font-size: 16px;">后台管理</span>
<span style="font-size: 14px;" class="layui-badge-rim">后台管理</span>
</h1>
</a>
</div>

View File

@ -56,13 +56,13 @@
<div class="pagination">
<span class="step-links">
{% if docs.has_previous %}
<a href="?page={{ docs.previous_page_number }}" class="layui-btn layui-btn-normal layui-btn-xs">上一页</a>
<a href="?page={{ docs.previous_page_number }}&kw={{docs.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">上一页</a>
{% endif %}
<span class="current">
当前页: {{ docs.number }} 共 {{ docs.paginator.num_pages }} 页
</span>
{% if docs.has_next %}
<a href="?page={{ docs.next_page_number }}" class="layui-btn layui-btn-normal layui-btn-xs">下一页</a>
<a href="?page={{ docs.next_page_number }}&kw={{docs.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">下一页</a>
{% endif %}
</span>
</div>

View File

@ -55,13 +55,13 @@
<div class="pagination">
<span class="step-links">
{% if doctemps.has_previous %}
<a href="?page={{ doctemps.previous_page_number }}" class="layui-btn layui-btn-normal layui-btn-xs">上一页</a>
<a href="?page={{ doctemps.previous_page_number }}&kw={{doctemps.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">上一页</a>
{% endif %}
<span class="current">
当前页: {{ doctemps.number }} 共 {{ doctemps.paginator.num_pages }} 页
</span>
{% if doctemps.has_next %}
<a href="?page={{ doctemps.next_page_number }}" class="layui-btn layui-btn-normal layui-btn-xs">下一页</a>
<a href="?page={{ doctemps.next_page_number }}&kw={{doctemps.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">下一页</a>
{% endif %}
</span>
</div>

View File

@ -21,6 +21,14 @@
</div>
<div class="layui-row" lay-skin="line">
<table class="layui-table" id="doctemp-list" lay-skin="line">
<colgroup>
<col width="100">
<col width="300">
<col width="40">
<col width="50">
<col width="50">
<col width="50">
</colgroup>
<thead>
<tr>
<th>文集名称</th>
@ -55,13 +63,13 @@
<div class="pagination">
<span class="step-links">
{% if projects.has_previous %}
<a href="?page={{ projects.previous_page_number }}" class="layui-btn layui-btn-normal layui-btn-xs">上一页</a>
<a href="?page={{ projects.previous_page_number }}&kw={{projects.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">上一页</a>
{% endif %}
<span class="current">
当前页: {{ projects.number }} 共 {{ projects.paginator.num_pages }} 页
</span>
{% if projects.has_next %}
<a href="?page={{ projects.next_page_number }}" class="layui-btn layui-btn-normal layui-btn-xs">下一页</a>
<a href="?page={{ projects.next_page_number }}&kw={{projects.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">下一页</a>
{% endif %}
</span>
</div>

View File

@ -64,7 +64,19 @@
var editor = editormd("editor-md", {
width : "100%",
height : "1000px;",
placeholder : "开始使用Markdown书写……",
placeholder : "开始使用Markdown书写MrDoc文档……\n编辑器支持粘贴上传图片",
toolbarIcons : function() {
return [
"undo", "redo", "|",
"bold", "del", "italic", "quote", "ucwords", "uppercase", "lowercase", "|",
"h1", "h2", "h3", "h4", "h5", "h6", "|",
"list-ul", "list-ol", "hr", "|",
"link", "reference-link", "image", "code", "preformatted-text", "code-block", "table", "datetime", "emoji", "html-entities", "pagebreak", "|",
"watch", "preview", "clear", "search", "|",
"help"
]
},
pageBreak : true, //分页符
path : "/static/editor.md/lib/",
saveHTMLToTextarea : true,
tex : true,//开启科学公式

View File

@ -56,7 +56,7 @@
title:'新建文集',
area:'300px;',
id:'createPro',//配置ID
content:'<div style="padding: 20px;"><input class="layui-input" type="text" id="pname" style="margin-bottom:10px;" placeholder="输入文集名" required lay-verify="required"><textarea name="desc" id="desc" placeholder="输入文集简介" class="layui-textarea"></textarea></div>',
content:'<div style="padding: 20px;"><input class="layui-input" type="text" id="pname" style="margin-bottom:10px;" placeholder="输入文集名" required lay-verify="required"><textarea name="desc" id="desc" placeholder="输入文集简介不超过100个字超出将被截断" maxlength="100" class="layui-textarea"></textarea></div>',
btn:['确定','取消'], //添加按钮
btnAlign:'c', //按钮居中
yes:function (index,layero) {
@ -107,17 +107,25 @@
'sort':$("#sort").val(),
}
console.log(data)
$.post("{% url 'create_doc' %}",data,function(r){
if(r.status){
//创建成功
layer.msg('保存成功',function(){
window.location.href = "{% url 'pro_list' %}";
});
}else{
//创建失败
layer.msg('保存失败');
}
});
if(data.doc_name == ""){
layer.msg('请输入文档标题!');
}
else if(data.project == ""){
layer.msg('请选择文集!');
}
else{
$.post("{% url 'create_doc' %}",data,function(r){
if(r.status){
//创建成功
layer.msg('保存成功',function(){
window.location.href = "{% url 'pro_list' %}";
});
}else{
//创建失败
layer.msg('保存失败:'+r.data);
}
});
}
};
//选择文档模板
$("#sel-doctemp").click(function(){

View File

@ -21,7 +21,10 @@
<div class="layui-logo">
<a class="logo" href="{% url 'pro_list' %}">
{# <img src="/media/logo-white.png" />#}
<h1 style="color: white;"><strong>MrDoc</strong></h1>
<h1 style="color: white;">
<strong>MrDoc</strong>
<span style="font-size: 14px;" class="layui-badge-rim">个人中心</span>
</h1>
</a>
</div>
<ul class="layui-nav layui-layout-right">

View File

@ -12,7 +12,7 @@
<form action="{% url 'manage_doc' %}" method="get">
<div class="layui-form-item">
<div class="layui-input-inline">
<input type="text" name="kw" id="kw" required lay-verify="required" placeholder="输入文档内容" autocomplete="off" class="layui-input">
<input type="text" name="kw" id="kw" placeholder="输入文档内容" autocomplete="off" class="layui-input">
</div>
<button class="layui-btn layui-btn-normal" type="submit">搜索</button>
<button class="layui-btn layui-btn-normal"><a href="{% url 'create_doc' %}" target="_blank">新建文档</a></button>
@ -38,7 +38,7 @@
</thead>
<tbody>
{% load doc_filter %}
{% for doc in doc_list %}
{% for doc in docs %}
<tr>
<td>{{ doc.name }}</td>
<td>{{ doc.parent_doc|get_doc_parent }}</td>
@ -54,6 +54,22 @@
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="layui-row">
<div class="pagination">
<span class="step-links">
{% if docs.has_previous %}
<a href="?page={{ docs.previous_page_number }}&kw={{docs.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">上一页</a>
{% endif %}
<span class="current">
当前页: {{ docs.number }} 共 {{ docs.paginator.num_pages }} 页
</span>
{% if docs.has_next %}
<a href="?page={{ docs.next_page_number }}&kw={{docs.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">下一页</a>
{% endif %}
</span>
</div>
</div>
{% endblock %}
{% block custom_script %}
<script>

View File

@ -12,7 +12,7 @@
<form action="{% url 'manage_doctemp' %}" method="get">
<div class="layui-form-item">
<div class="layui-input-inline">
<input type="text" name="kw" id="kw" required lay-verify="required" placeholder="输入文档模板内容" autocomplete="off" class="layui-input">
<input type="text" name="kw" id="kw" placeholder="输入文档模板内容" autocomplete="off" class="layui-input">
</div>
<button class="layui-btn layui-btn-normal" type="submit">搜索</button>
<button class="layui-btn layui-btn-normal" type="button"><a href="{% url 'create_doctemp' %}" target="_blank">新建文档模板</a></button>
@ -34,7 +34,7 @@
</tr>
</thead>
<tbody>
{% for temp in doctemp_list %}
{% for temp in doctemps %}
<tr>
<td>{{ temp.name }}</td>
<td>{{ temp.create_time }}</td>
@ -48,6 +48,22 @@
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="layui-row">
<div class="pagination">
<span class="step-links">
{% if doctemps.has_previous %}
<a href="?page={{ doctemps.previous_page_number }}&kw={{doctemps.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">上一页</a>
{% endif %}
<span class="current">
当前页: {{ doctemps.number }} 共 {{ doctemps.paginator.num_pages }} 页
</span>
{% if doctemps.has_next %}
<a href="?page={{ doctemps.next_page_number }}&kw={{doctemps.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">下一页</a>
{% endif %}
</span>
</div>
</div>
{% endblock %}
{% block custom_script %}
<script>

View File

@ -12,7 +12,7 @@
<form action="{% url 'manage_project' %}" method="get">
<div class="layui-form-item">
<div class="layui-input-inline">
<input type="text" name="kw" id="kw" required lay-verify="required" placeholder="输入文集内容" autocomplete="off" class="layui-input">
<input type="text" name="kw" id="kw" placeholder="输入文集内容" autocomplete="off" class="layui-input">
</div>
<button class="layui-btn layui-btn-normal" type="submit">搜索</button>
<button class="layui-btn layui-btn-normal" onclick="createProject()" type="button">新建文集</button>
@ -21,11 +21,12 @@
</div>
<div class="layui-row" lay-skin="line">
<table class="layui-table" id="doctemp-list" lay-skin="line">
{# <colgroup>#}
{# <col width="200">#}
{# <col width="200">#}
{# <col>#}
{# </colgroup>#}
<colgroup>
<col width="100">
<col width="400">
<col width="100">
<col width="100">
</colgroup>
<thead>
<tr>
<th>文集名称</th>
@ -35,7 +36,7 @@
</tr>
</thead>
<tbody>
{% for pro in pro_list %}
{% for pro in pros %}
<tr>
<td>{{ pro.name }}</td>
<td>{{ pro.intro }}</td>
@ -50,6 +51,22 @@
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="layui-row">
<div class="pagination">
<span class="step-links">
{% if pros.has_previous %}
<a href="?page={{ pros.previous_page_number }}&kw={{pros.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">上一页</a>
{% endif %}
<span class="current">
当前页: {{ pros.number }} 共 {{ pros.paginator.num_pages }} 页
</span>
{% if pros.has_next %}
<a href="?page={{ pros.next_page_number }}&kw={{pros.kw}}" class="layui-btn layui-btn-normal layui-btn-xs">下一页</a>
{% endif %}
</span>
</div>
</div>
{% endblock %}
{% block custom_script %}
<script>

View File

@ -59,7 +59,10 @@
</div>
<div class="layui-card-body">
<p>作者:{{p.create_user}}</p>
<p>简介:{{ p.intro }}</p>
<p class="tooltip">简介:
<span class="">{{ p.intro | slice:'16' }}…</span>
<span class="tooltip-content clearfix">{{ p.intro }}</span>
</p>
<p></p>
</div>
</div>