From f231bc7241060cacbfd30755ec7ef3c9fed96494 Mon Sep 17 00:00:00 2001 From: yangjian Date: Sun, 15 Dec 2019 20:54:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=87=E6=A1=A3=E8=8D=89?= =?UTF-8?q?=E7=A8=BF=E5=8A=9F=E8=83=BD=E4=BB=A5=E5=8F=8A=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 6 +++ README.md | 15 ++++--- app_admin/views.py | 4 +- app_doc/migrations/0006_auto_20191215_1910.py | 22 ++++++++++ app_doc/models.py | 2 + app_doc/templatetags/doc_filter.py | 2 +- app_doc/views.py | 18 ++++---- docs/mrdoc-2019-12-15_204807.jpg | Bin 0 -> 34344 bytes template/app_admin/admin_doc.html | 19 ++++++--- template/app_admin/admin_doctemp.html | 3 +- template/app_admin/admin_project.html | 2 +- template/app_doc/create_base.html | 12 ++++-- template/app_doc/create_doc.html | 39 +++++++++++++++++- template/app_doc/docs_base.html | 10 ++--- template/app_doc/manage_doc.html | 35 ++++++++-------- template/app_doc/manage_doctemp.html | 2 +- template/app_doc/manage_project.html | 2 +- template/app_doc/modify_doc.html | 31 +++++++++++++- 18 files changed, 169 insertions(+), 55 deletions(-) create mode 100644 app_doc/migrations/0006_auto_20191215_1910.py create mode 100644 docs/mrdoc-2019-12-15_204807.jpg diff --git a/CHANGES.md b/CHANGES.md index 2a10ce9..7185679 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ ## 版本更新记录 +### v0.2.5 + +- 添加文档的草稿功能; +- 优化编辑页面退出时的提示; +- 优化个人中心和管理后台页面样式; + ### v0.2.4 - 优化文档编写页面结构 diff --git a/README.md b/README.md index 722bb6c..18e0bf6 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,15 @@ # MrDoc - 一个简单的文档写作应用 +**PC端文档阅读界面:** + ![Mrdoc首页](./docs/mrdoc_2019080101.gif) +**手机端文档阅读界面:** + +![移动端](./docs/mrdoc-2019-12-15_204807.jpg) + ## 介绍 -一个简单的MarkDown文档写作系统。 +基于Python的一个简单文档写作系统。 MrDoc拥有以下特点: @@ -12,11 +18,13 @@ MrDoc拥有以下特点: - 提供文档模板功能,支持文档模板的创建、修改; - 仿GitBook文档阅读页面,支持文档阅读页面的字体缩放,字体类型修改; - 支持三级目录层级显示; +- 支持文集导出为markdown文本格式.md文件; - 使用方便、二次开发修改也方便; - 在开发过程中,参考和借鉴了GitBook、ShowDoc、Wordbook等应用的功能和样式。 +当前版本为:**v0.2.5**,更多更新记录详见:[CHANGES.md](./CHANGES.md) + ## 软件架构 后端基于Python Web框架Django @@ -109,9 +117,6 @@ python manage.py runserver 加入MrDoc交流QQ群,群号为735507293,入群密码:mrdoc -## 版本更新日志 - -版本更新日志详见:[CHANGES.md](./CHANGES.md) ## 版本更新 diff --git a/app_admin/views.py b/app_admin/views.py index 4f2227d..8b2af08 100644 --- a/app_admin/views.py +++ b/app_admin/views.py @@ -302,7 +302,7 @@ def admin_doc(request): if request.method == 'GET': kw = request.GET.get('kw','') if kw == '': - doc_list = Doc.objects.all() + doc_list = Doc.objects.all().order_by('-modify_time') paginator = Paginator(doc_list, 10) page = request.GET.get('page', 1) try: @@ -312,7 +312,7 @@ def admin_doc(request): except EmptyPage: docs = paginator.page(paginator.num_pages) else: - doc_list = Doc.objects.filter(pre_content__icontains=kw) + doc_list = Doc.objects.filter(pre_content__icontains=kw).order_by('-modify_time') paginator = Paginator(doc_list, 10) page = request.GET.get('page', 1) try: diff --git a/app_doc/migrations/0006_auto_20191215_1910.py b/app_doc/migrations/0006_auto_20191215_1910.py new file mode 100644 index 0000000..9efc1d5 --- /dev/null +++ b/app_doc/migrations/0006_auto_20191215_1910.py @@ -0,0 +1,22 @@ +# Generated by Django 2.1 on 2019-12-15 19:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app_doc', '0005_auto_20190727_1232'), + ] + + operations = [ + migrations.AlterModelOptions( + name='doc', + options={'verbose_name': '文档', 'verbose_name_plural': '文档'}, + ), + migrations.AddField( + model_name='doc', + name='status', + field=models.IntegerField(choices=[(0, 0), (1, 1)], default=1, verbose_name='文档状态'), + ), + ] diff --git a/app_doc/models.py b/app_doc/models.py index b85e962..2a1a3b9 100644 --- a/app_doc/models.py +++ b/app_doc/models.py @@ -27,6 +27,8 @@ class Doc(models.Model): create_user = models.ForeignKey(User,on_delete=models.CASCADE) create_time = models.DateTimeField(auto_now_add=True) modify_time = models.DateTimeField(auto_now=True) + # 文档状态说明:0表示草稿状态,1表示发布状态 + status = models.IntegerField(choices=((0,0),(1,1)),default=1,verbose_name='文档状态') def __str__(self): return self.name diff --git a/app_doc/templatetags/doc_filter.py b/app_doc/templatetags/doc_filter.py index 809998a..553eee6 100644 --- a/app_doc/templatetags/doc_filter.py +++ b/app_doc/templatetags/doc_filter.py @@ -8,7 +8,7 @@ register = template.Library() # 获取文档的子文档 @register.filter(name='get_next_doc') def get_next_doc(value): - return Doc.objects.filter(parent_doc=value).order_by('sort') + return Doc.objects.filter(parent_doc=value,status=1).order_by('sort') # 获取文档的所属文集 @register.filter(name='get_doc_top') diff --git a/app_doc/views.py b/app_doc/views.py index 7cd1835..febccfc 100644 --- a/app_doc/views.py +++ b/app_doc/views.py @@ -49,7 +49,7 @@ def project_index(request,pro_id): # 获取搜索词 kw = request.GET.get('kw','') # 获取文集下所有一级文档 - project_docs = Doc.objects.filter(top_doc=int(pro_id), parent_doc=0).order_by('sort') + project_docs = Doc.objects.filter(top_doc=int(pro_id), parent_doc=0, status=1).order_by('sort') if kw != '': search_result = Doc.objects.filter(top_doc=int(pro_id),pre_content__icontains=kw) # if search_result.count() == 0: @@ -149,9 +149,9 @@ def doc(request,pro_id,doc_id): # 获取文集信息 project = Project.objects.get(id=int(pro_id)) # 获取文档内容 - doc = Doc.objects.get(id=int(doc_id)) + doc = Doc.objects.get(id=int(doc_id),status=1) # 获取文集下一级文档 - project_docs = Doc.objects.filter(top_doc=doc.top_doc, parent_doc=0).order_by('sort') + 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()) else: return HttpResponse('参数错误') @@ -181,6 +181,7 @@ def create_doc(request): doc_content = request.POST.get('content','') pre_content = request.POST.get('pre_content','') sort = request.POST.get('sort','') + status = request.POST.get('status',1) if project != '' and doc_name != '' and project != '-1': doc = Doc.objects.create( name=doc_name, @@ -189,7 +190,8 @@ def create_doc(request): parent_doc= int(parent_doc) if parent_doc != '' else 0, top_doc= int(project), sort = sort if sort != '' else 99, - create_user=request.user + create_user=request.user, + status = status ) return JsonResponse({'status':True,'data':doc.id}) else: @@ -225,6 +227,7 @@ def modify_doc(request,doc_id): doc_content = request.POST.get('content', '') # 文档内容 pre_content = request.POST.get('pre_content', '') # 文档Markdown格式内容 sort = request.POST.get('sort', '') # 文档排序 + status = request.POST.get('status',1) # 文档状态 if doc_id != '' and project != '' and doc_name != '' and project != '-1': # 更新文档内容 Doc.objects.filter(id=int(doc_id)).update( @@ -233,7 +236,8 @@ def modify_doc(request,doc_id): pre_content=pre_content, parent_doc=int(parent_doc) if parent_doc != '' else 0, sort=sort if sort != '' else 99, - modify_time = datetime.datetime.now() + modify_time = datetime.datetime.now(), + status = status ) return JsonResponse({'status': True,'data':'修改成功'}) else: @@ -266,7 +270,7 @@ 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) + doc_list = Doc.objects.filter(create_user=request.user,content__icontains=search_kw).order_by('-modify_time') paginator = Paginator(doc_list, 10) page = request.GET.get('page', 1) try: @@ -277,7 +281,7 @@ def manage_doc(request): docs = paginator.page(paginator.num_pages) docs.kw = search_kw else: - doc_list = Doc.objects.filter(create_user=request.user) + 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: diff --git a/docs/mrdoc-2019-12-15_204807.jpg b/docs/mrdoc-2019-12-15_204807.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d6ce4bf7df9d77980f05b387b895fd2d4676cd0c GIT binary patch literal 34344 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
- +
- + - - + + {% load doc_filter %} {% for doc in docs %} - + {% if doc.status == 1 %} + + {% else %} + + {% endif %} diff --git a/template/app_admin/admin_doctemp.html b/template/app_admin/admin_doctemp.html index b92a3b5..9c45884 100644 --- a/template/app_admin/admin_doctemp.html +++ b/template/app_admin/admin_doctemp.html @@ -20,7 +20,7 @@
-
文档名称文档名称 上级文档 所属文集 创建人创建时间操作创建时间操作
{{ doc.name }} + {{ doc.name }} 已发布 + + {{ doc.name }} 草稿 + {{ doc.parent_doc|get_doc_parent }} {{ doc.top_doc|get_doc_top }} {{ doc.create_user }} {{ doc.create_time }} -{# 查看#} 修改 删除
+
@@ -41,7 +41,6 @@ diff --git a/template/app_admin/admin_project.html b/template/app_admin/admin_project.html index c2c0006..18121b6 100644 --- a/template/app_admin/admin_project.html +++ b/template/app_admin/admin_project.html @@ -20,7 +20,7 @@
-
{{ temp.create_user }} {{ temp.create_time }} -{# 查看#} 修改 删除
+
diff --git a/template/app_doc/create_base.html b/template/app_doc/create_base.html index ddeff88..549c3cf 100644 --- a/template/app_doc/create_base.html +++ b/template/app_doc/create_base.html @@ -36,6 +36,7 @@ }); var layer = layui.layer; var form = layui.form; + var md_changed = false; //初始化一个变量,用于判断编辑器是否修改 //初始化editormd var editor = editormd("editor-md", { width : "100%", @@ -65,6 +66,9 @@ imageUpload : true, //开启图片上传 imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"], imageUploadURL : "{% url 'upload_doc_img' %}", + onchange:function(){ + md_changed = true + }, }); //粘贴上传图片 $("#editor-md").on('paste', function (ev) { @@ -92,9 +96,11 @@ }); //未保存离开提示 window.onbeforeunload =function() { -    // code... - //return null; - return 1 +    if(md_changed){ + return 1; + }else{ + return null; + } } diff --git a/template/app_doc/create_doc.html b/template/app_doc/create_doc.html index 99c0e78..58009c3 100644 --- a/template/app_doc/create_doc.html +++ b/template/app_doc/create_doc.html @@ -49,7 +49,10 @@ + @@ -134,7 +137,7 @@ $.post("{% url 'create_doc' %}",data,function(r){ if(r.status){ //创建成功 - layer.msg('保存成功',function(){ + layer.msg('发布成功',function(){ window.location.href = "{% url 'pro_list' %}"; }); }else{ @@ -144,6 +147,38 @@ }); } }; + //保存文档草稿 + saveDoc = function(){ + var data = { + 'project':$("#project").val(), + 'parent_doc':$("#parent-doc").val(), + 'doc_name':$("#doc-name").val(), + 'content':editor.getHTML(), + 'pre_content':editor.getMarkdown(), + 'sort':$("#sort").val(), + 'status':0 + } + console.log(data) + 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 = "/modify_doc/"+r.data+"/"; + }); + }else{ + //创建失败 + layer.msg('保存失败:'+r.data); + } + }); + } + }; //选择文档模板 $("#sel-doctemp").click(function(){ layer.open({ diff --git a/template/app_doc/docs_base.html b/template/app_doc/docs_base.html index ae6a6e0..b5dd451 100644 --- a/template/app_doc/docs_base.html +++ b/template/app_doc/docs_base.html @@ -57,7 +57,7 @@
  • {% if docs.id|get_next_doc %} {% else %} - {{ docs.name }} + {{ docs.name }} {% endif %}
  • {% endfor %} diff --git a/template/app_doc/manage_doc.html b/template/app_doc/manage_doc.html index d904ab1..1d5fe43 100644 --- a/template/app_doc/manage_doc.html +++ b/template/app_doc/manage_doc.html @@ -20,35 +20,36 @@
    -
    -{# #} -{# #} -{# #} -{# #} -{# #} +
    - -{# #} + - - + + {% load doc_filter %} {% for doc in docs %} - + {% if doc.status == 1 %} + + {% else %} + + {% endif %} - - + + {% endfor %} diff --git a/template/app_doc/manage_doctemp.html b/template/app_doc/manage_doctemp.html index d196330..1b9efe6 100644 --- a/template/app_doc/manage_doctemp.html +++ b/template/app_doc/manage_doctemp.html @@ -20,7 +20,7 @@
    -
    文档名称文档内容文档名称 上级文档 所属文集创建时间操作创建时间操作
    {{ doc.name }} + {{ doc.name }} 已发布 + + {{ doc.name }} 草稿 + {{ doc.parent_doc|get_doc_parent }} {{ doc.top_doc|get_doc_top }}{{ doc.create_time }} -{# 查看#} - 修改 - 删除 - {{ doc.create_time }} + 修改 + 删除 +
    +
    diff --git a/template/app_doc/manage_project.html b/template/app_doc/manage_project.html index 4701b83..0f85461 100644 --- a/template/app_doc/manage_project.html +++ b/template/app_doc/manage_project.html @@ -20,7 +20,7 @@
    -
    +
    diff --git a/template/app_doc/modify_doc.html b/template/app_doc/modify_doc.html index 55cf05d..b53279d 100644 --- a/template/app_doc/modify_doc.html +++ b/template/app_doc/modify_doc.html @@ -44,7 +44,10 @@ + @@ -76,7 +79,7 @@ } }); }); - //保存文档 + //发布文档 createDoc = function(){ var data = { 'doc_id':{{ doc.id }}, @@ -99,6 +102,30 @@ } }); }; + //保存文档草稿 + saveDoc = function(){ + var data = { + 'doc_id':{{ doc.id }}, + 'project':$("#project").val(), + 'parent_doc':$("#parent-doc").val(), + 'doc_name':$("#doc-name").val(), + 'content':editor.getHTML(), + 'pre_content':editor.getMarkdown(), + 'sort':$("#sort").val(), + 'status':0 + } + $.post("{% url 'modify_doc' doc_id=doc.id %}",data,function(r){ + if(r.status){ + //修改成功 + layer.msg('保存成功',function(){ + window.location.href = "{% url 'modify_doc' doc.id %}"; + }); + }else{ + //修改失败 + layer.msg('保存失败'); + } + }); + }; //选择文档模板 $("#sel-doctemp").click(function(){ layer.open({