diff --git a/CHANGES.md b/CHANGES.md index 6c84bea..f499d17 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,17 @@ ## 版本更新记录 +### v0.2.11 2020-02-24 + +- 修复:删除文档导致其子文档找不到父级文档从而产生异常的Bug; +- 优化管理员界面文档管理的筛选功能,支持按文档状态进行筛选; +- 优化修改文档后的跳转判断; +- 优化文档阅读页面、新建文档页面和修改页面的无序列表样式; +- 优化文档阅读页面指定语言的代码块样式,去除prism代码高亮插件,避免其与editormd的样式冲突; +- 更改文档保存的HTML内容为预览时的HTMl而非editormd渲染的HTML; +- 添加Markdown编辑器对流程图和序列图的支持; +- 添加Markdown编辑器对部分HTML标签的识别和解析; + + ### v0.2.10 2020-02-22 - 优化修改文档页面的文档状态提示; diff --git a/MrDoc/settings.py b/MrDoc/settings.py index d233b37..6771ffc 100644 --- a/MrDoc/settings.py +++ b/MrDoc/settings.py @@ -25,7 +25,7 @@ SECRET_KEY = '5&71mt9@^58zdg*_!t(x6g14q*@84d%ptr%%s6e0l50zs0we3d' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False -VERSIONS = '0.2.10' +VERSIONS = '0.2.11' ALLOWED_HOSTS = ['*'] diff --git a/README.md b/README.md index bfee7ee..6a6433c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 州的先生(zmister.com)自用并完全开源、基于Python编写的文档写作系统。 -当前版本为:**v0.2.10**,版本发布时间为**2020-02-22**,更新记录详见:[CHANGES.md](./CHANGES.md) +当前版本为:**v0.2.11**,版本发布时间为**2020-02-24**,更新记录详见:[CHANGES.md](./CHANGES.md) MrDoc拥有以下特点: diff --git a/app_doc/views.py b/app_doc/views.py index cbf0b17..dc5e73d 100644 --- a/app_doc/views.py +++ b/app_doc/views.py @@ -4,7 +4,7 @@ from django.http import HttpResponseForbidden from django.contrib.auth.decorators import login_required # 登录需求装饰器 from django.views.decorators.http import require_http_methods,require_GET,require_POST # 视图请求方法装饰器 from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,InvalidPage # 后端分页 -from django.core.exceptions import PermissionDenied +from django.core.exceptions import PermissionDenied,ObjectDoesNotExist from app_doc.models import Project,Doc,DocTemp from django.contrib.auth.models import User from django.db.models import Q @@ -267,7 +267,10 @@ def doc(request,pro_id,doc_id): return redirect('/check_viewcode/?to={}'.format(request.path)) # 获取文档内容 - doc = Doc.objects.get(id=int(doc_id),status=1) + try: + doc = Doc.objects.get(id=int(doc_id),status=1) + except ObjectDoesNotExist: + return render(request, '404.html') # 获取文集下一级文档 project_docs = Doc.objects.filter(top_doc=doc.top_doc, parent_doc=0, status=1).order_by('sort') return render(request,'app_doc/doc.html',locals()) @@ -366,11 +369,19 @@ def modify_doc(request,doc_id): @login_required() def del_doc(request): try: + # 获取文档ID doc_id = request.POST.get('doc_id',None) if doc_id: - doc = Doc.objects.get(id=doc_id) + # 查询文档 + try: + doc = Doc.objects.get(id=doc_id) + except ObjectDoesNotExist: + return JsonResponse({'status': False, 'data': '文档不存在'}) if request.user == doc.create_user: + # 删除 doc.delete() + # 修改其子文档为顶级文档 + Doc.objects.filter(parent_doc=doc_id).update(parent_doc=0) return JsonResponse({'status': True, 'data': '删除完成'}) else: return JsonResponse({'status': False, 'data': '非法请求'}) @@ -384,9 +395,41 @@ def del_doc(request): @login_required() def manage_doc(request): if request.method == 'GET': + # 文档内容搜索参数 search_kw = request.GET.get('kw',None) if search_kw: - doc_list = Doc.objects.filter(create_user=request.user,content__icontains=search_kw).order_by('-modify_time') + # 已发布文档数量 + published_doc_cnt = Doc.objects.filter( + create_user=request.user, status=1 + ).count() + # 草稿文档数量 + draft_doc_cnt = Doc.objects.filter( + create_user=request.user, status=0 + ).count() + # 所有文档数量 + all_cnt = published_doc_cnt + draft_doc_cnt + # 获取文档状态筛选参数 + doc_status = request.GET.get('status', 'all') + + # 查询文档 + if doc_status == 'all': + doc_list = Doc.objects.filter( + create_user=request.user, + content__icontains=search_kw + ).order_by('-modify_time') + elif doc_status == 'published': + doc_list = Doc.objects.filter( + create_user=request.user, + content__icontains=search_kw, + status = 1 + ).order_by('-modify_time') + elif doc_status == 'draft': + doc_list = Doc.objects.filter( + create_user=request.user, + content__icontains=search_kw, + status = 0 + ).order_by('-modify_time') + # 分页处理 paginator = Paginator(doc_list, 10) page = request.GET.get('page', 1) try: @@ -396,13 +439,39 @@ def manage_doc(request): except EmptyPage: docs = paginator.page(paginator.num_pages) docs.kw = search_kw + docs.status = doc_status else: - doc_list = Doc.objects.filter(create_user=request.user).order_by('-modify_time') - all_cnt = doc_list.count() # 所有文档数量 - published_doc_cnt = Doc.objects.filter(create_user=request.user,status=1).count() # 已发布文档数量 - draft_doc_cnt = Doc.objects.filter(create_user=request.user,status=0).count() # 草稿文档数据 - pro_list = Project.objects.filter(create_user=request.user) - + # 已发布文档数量 + published_doc_cnt = Doc.objects.filter( + create_user=request.user,status=1 + ).count() + # 草稿文档数量 + draft_doc_cnt = Doc.objects.filter( + create_user=request.user,status=0 + ).count() + # 所有文档数量 + all_cnt = published_doc_cnt + draft_doc_cnt + # 获取文档状态筛选参数 + doc_status = request.GET.get('status','all') + if len(doc_status) == 0: + doc_status = 'all' + print('status:', doc_status,type(doc_status)) + # 返回所有文档 + if doc_status == 'all': + doc_list = Doc.objects.filter(create_user=request.user).order_by('-modify_time') + # 返回已发布文档 + elif doc_status == 'published': + doc_list = Doc.objects.filter( + create_user=request.user,status=1 + ).order_by('-modify_time') + # 返回草稿文档 + elif doc_status == 'draft': + doc_list = Doc.objects.filter( + create_user=request.user, status=0 + ).order_by('-modify_time') + else: + doc_list = Doc.objects.filter(create_user=request.user).order_by('-modify_time') + # 分页处理 paginator = Paginator(doc_list, 10) page = request.GET.get('page', 1) try: @@ -411,6 +480,7 @@ def manage_doc(request): docs = paginator.page(1) except EmptyPage: docs = paginator.page(paginator.num_pages) + docs.status = doc_status return render(request,'app_doc/manage_doc.html',locals()) else: return HttpResponse('方法不允许') @@ -549,16 +619,26 @@ def get_pro_doc(request): if request.method == 'POST': pro_id = request.POST.get('pro_id','') if pro_id != '': + # 获取文集所有文档的id、name和parent_doc3个字段 doc_list = Doc.objects.filter(top_doc=int(pro_id)).values_list('id','name','parent_doc').order_by('parent_doc') item_list = [] + # 遍历文档 for doc in doc_list: + # 如果文档为顶级文档 if doc[2] == 0: + # 将其数据添加到列表中 item = [ doc[0],doc[1],doc[2],'' ] item_list.append(item) + # 如果文档不是顶级文档 else: - parent = Doc.objects.get(id=doc[2]) + # 查询文档的上级文档 + try: + parent = Doc.objects.get(id=doc[2]) + except ObjectDoesNotExist: + return JsonResponse({'status':False,'data':'文档id不存在'}) + # 如果文档上级文档的上级是顶级文档,那么将其添加到列表 if parent.parent_doc == 0: # 只要二级目录 item = [ doc[0],doc[1],doc[2],parent.name+' --> ' diff --git a/template/app_admin/admin_base.html b/template/app_admin/admin_base.html index 586bfd9..bb54703 100644 --- a/template/app_admin/admin_base.html +++ b/template/app_admin/admin_base.html @@ -72,7 +72,8 @@ diff --git a/template/app_doc/create_base.html b/template/app_doc/create_base.html index dfa81c3..8244ec1 100644 --- a/template/app_doc/create_base.html +++ b/template/app_doc/create_base.html @@ -23,6 +23,9 @@ .markdown-body ol li{ list-style-type: decimal; } + .markdown-body ol ol ul,.markdown-body ol ul ul,.markdown-body ul ol ul,.markdown-body ul ul ul li{ + list-style-type: square; + } - + @@ -213,12 +227,13 @@ //解析Markdown为HTML editormd.markdownToHTML("content", { htmlDecode : "style,script,iframe", - emoji : true, - taskList : true, + emoji : true, //emoji表情 + taskList : true, // 任务列表 tex : true, // 科学公式 flowChart : true, // 流程图 - sequenceDiagram : true, // 默认不解析 + sequenceDiagram : true, // 时序图 tocm : true, //目录 + atLink : false,//禁用@链接 //tocContainer : "#toc-container" }); //为当前页面的目录链接添加蓝色样式 diff --git a/template/app_doc/manage_base.html b/template/app_doc/manage_base.html index 199a140..11164db 100644 --- a/template/app_doc/manage_base.html +++ b/template/app_doc/manage_base.html @@ -14,6 +14,10 @@ .layui-btn a{ color:white; } + /* 管理文档 文档状态条件筛选 */ + .doc_status_condition > a.current{ + color: #000!important; + } @@ -66,7 +70,8 @@ diff --git a/template/app_doc/manage_doc.html b/template/app_doc/manage_doc.html index 3446194..7ba5ba7 100644 --- a/template/app_doc/manage_doc.html +++ b/template/app_doc/manage_doc.html @@ -4,14 +4,20 @@ {% block content %}
- 文档管理 - + 文档管理 + {% if search_kw %} - 搜索“{{search_kw}}”的结果{% endif %}
-
-
- -
- - - -
+ + + + +
@@ -50,11 +54,11 @@ {% if doc.status == 1 %} - {{ doc.name }} 已发布 + {{ doc.name }} —— 已发布 {% else %} - {{ doc.name }} 草稿 + {{ doc.name }} —— 草稿 {% endif %} {{ doc.parent_doc|get_doc_parent }} @@ -74,13 +78,13 @@ diff --git a/template/app_doc/modify_doc.html b/template/app_doc/modify_doc.html index e165d52..d1b8f45 100644 --- a/template/app_doc/modify_doc.html +++ b/template/app_doc/modify_doc.html @@ -108,7 +108,8 @@ 'project':$("#project").val(), 'parent_doc':$("#parent-doc").val(), 'doc_name':$("#doc-name").val(), - 'content':editor.getHTML(), + //'content':editor.getHTML(), + 'content':editor.getPreviewedHTML(), 'pre_content':editor.getMarkdown(), 'sort':$("#sort").val(), } @@ -116,6 +117,7 @@ if(r.status){ //修改成功 layer.msg('发布成功,即将跳转',function(){ + md_changed = false; window.location.href = "{% url 'doc' pro_id=doc.top_doc doc_id=doc.id %}"; }); }else{