diff --git a/CHANGES.md b/CHANGES.md index 5618946..7fcf2ca 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,8 @@ - [优化]文档编辑器界面样式和交互; - [修复]仅有私密文集的站点游客可搜索到私密文集的问题; - [新增]文集水印配置; +- [新增]文集文档收藏功能; +- [优化]首页样式; ### v0.6.2 2020-12 diff --git a/MrDoc/settings.py b/MrDoc/settings.py index 99d854b..89c26b3 100644 --- a/MrDoc/settings.py +++ b/MrDoc/settings.py @@ -40,7 +40,7 @@ SECRET_KEY = '5&71mt9@^58zdg*_!t(x6g14q*@84d%ptr%%s6e0l50zs0we3d' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = CONFIG.getboolean('site','debug') -VERSIONS = '0.6.2' +VERSIONS = '0.6.3' ALLOWED_HOSTS = ['*'] diff --git a/app_doc/urls.py b/app_doc/urls.py index e3a7b3c..8a776e6 100644 --- a/app_doc/urls.py +++ b/app_doc/urls.py @@ -65,4 +65,5 @@ urlpatterns = [ path('manage_overview/',views.manage_overview,name="manage_overview"), # 个人中心概览 path('manage_self/',views.manage_self,name="manage_self"), # 个人设置 path('my_collect/',views.my_collect,name="my_collect"), # 我的收藏 + path('manage_collect/',views.manage_collect,name="manage_collect"), # 收藏管理 ] \ No newline at end of file diff --git a/app_doc/views.py b/app_doc/views.py index 9e1c0fe..b2a6195 100644 --- a/app_doc/views.py +++ b/app_doc/views.py @@ -1,6 +1,7 @@ # coding:utf-8 from django.shortcuts import render,redirect from django.http.response import JsonResponse,Http404,HttpResponseNotAllowed,HttpResponse +from django.http import QueryDict from django.http import HttpResponseForbidden from django.contrib.auth.decorators import login_required # 登录需求装饰器 from django.views.decorators.csrf import csrf_exempt @@ -2982,4 +2983,118 @@ def my_collect(request): return JsonResponse({'status':True,'data':'收藏成功'}) elif request.method == 'DELETE': - pass \ No newline at end of file + pass + +# 收藏管理 +@login_required() +@require_http_methods(['GET','POST','DELETE']) +@csrf_exempt +def manage_collect(request): + if request.method == 'GET': + # 收藏文集数量 + collect_project_cnt = MyCollect.objects.filter(create_user=request.user, collect_type=2).count() + # 收藏文档数量 + collect_doc_cnt = MyCollect.objects.filter(create_user=request.user, collect_type=1).count() + # 所有收藏数量 + all_cnt = collect_project_cnt + collect_doc_cnt + + return render(request,'app_doc/manage/manage_collect.html',locals()) + elif request.method == 'POST': + kw = request.POST.get('kw', '') # 搜索词 + collect_type = request.POST.get('type', '') # 收藏类型 + if collect_type in ['1', '2']: + q_type = [int(collect_type)] + else: + q_type = [1, 2] + + page = request.POST.get('page', 1) + limit = request.POST.get('limit', 10) + # 没有搜索 + if kw == '': + collect_list = MyCollect.objects.filter( + create_user=request.user, + collect_type__in=q_type, + ).order_by('-create_time') + # 有搜索 + else: + collect_list = MyCollect.objects.filter( + Q(content__icontains=kw) | Q(name__icontains=kw), + create_user=request.user, collect_type__in=q_type + ).order_by('-create_time') + + # 分页处理 + paginator = Paginator(collect_list, limit) + page = request.GET.get('page', page) + try: + collects = paginator.page(page) + except PageNotAnInteger: + collects = paginator.page(1) + except EmptyPage: + collects = paginator.page(paginator.num_pages) + + table_data = [] + for collect in collects: + if collect.collect_type == 1: + item_doc = Doc.objects.get(id=collect.collect_id) + item_id = item_doc.id + item_name = item_doc.name + item_project = Project.objects.get(id=item_doc.top_doc) + item_project_name = item_project.name + item_project_id = item_project.id + else: + item_project = Project.objects.get(id=collect.collect_id) + item_id = item_project.id + item_name = item_project.name + item_project_name = '' + item_project_id = '' + item = { + 'id': collect.id, + 'item_id':item_id, + 'item_name': item_name, + 'type': collect.collect_type, + 'item_project_id':item_project_id, + 'item_project_name':item_project_name, + 'create_time': collect.create_time, + } + table_data.append(item) + resp_data = { + "code": 0, + "msg": "ok", + "count": collect_list.count(), + "data": table_data + } + return JsonResponse(resp_data) + elif request.method == 'DELETE': + try: + # 获取收藏ID + DELETE = QueryDict(request.body) + collect_id = DELETE.get('collect_id', None) + range = DELETE.get('range', 'single') + if collect_id: + if range == 'single': + # 查询收藏 + try: + collect = MyCollect.objects.get(id=collect_id) + except ObjectDoesNotExist: + return JsonResponse({'status': False, 'data': '收藏不存在'}) + # 如果请求用户为站点管理员、收藏的创建者,可以删除 + if (request.user == collect.create_user) or (request.user.is_superuser): + MyCollect.objects.filter(id=collect_id).delete() + return JsonResponse({'status': True, 'data': '删除完成'}) + else: + return JsonResponse({'status': False, 'data': '非法请求'}) + elif range == 'multi': + collects = collect_id.split(",") + try: + MyCollect.objects.filter(id__in=collects, create_user=request.user).delete() + return JsonResponse({'status': True, 'data': '删除完成'}) + except: + return JsonResponse({'status': False, 'data': '非法请求'}) + else: + return JsonResponse({'status': False, 'data': '类型错误'}) + + else: + return JsonResponse({'status': False, 'data': '参数错误'}) + except Exception as e: + logger.exception("取消收藏出错") + return JsonResponse({'status': False, 'data': '请求出错'}) diff --git a/app_doc/views_user.py b/app_doc/views_user.py index b6676e0..0c27017 100644 --- a/app_doc/views_user.py +++ b/app_doc/views_user.py @@ -152,6 +152,14 @@ def user_center_menu(request): }, ] }, + { + "id": "my_collect", + "title": "我的收藏", + "icon": "layui-icon layui-icon-star", + "type": 1, + "openType": "_iframe", + "href": reverse("manage_collect") + }, { "id": "self_settings", "title": "个人管理", diff --git a/static/editor.md/lib/codemirror.zip b/static/editor.md/lib/codemirror.zip deleted file mode 100644 index 4b3b5b1..0000000 Binary files a/static/editor.md/lib/codemirror.zip and /dev/null differ diff --git a/static/icon_img/simi.svg b/static/icon_img/simi.svg new file mode 100644 index 0000000..101a8b4 --- /dev/null +++ b/static/icon_img/simi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/template/app_doc/editor/modify_doc.html b/template/app_doc/editor/modify_doc.html index 51e9601..0055572 100644 --- a/template/app_doc/editor/modify_doc.html +++ b/template/app_doc/editor/modify_doc.html @@ -291,15 +291,16 @@ //修改成功 window.localStorage.removeItem('mrdoc_doc_cache') // 清空文档缓存 if(status === 1){ - layer.msg('发布成功,即将跳转',function(){ + layer.msg('发布成功',function(){ md_changed = false; - window.location.href = "{% url 'doc' pro_id=doc.top_doc doc_id=doc.id %}"; + // window.location.href = "{% url 'doc' pro_id=doc.top_doc doc_id=doc.id %}"; + window.location.href = "/modify_doc/{{doc.id}}/"; }); }else{ layer.msg('保存成功',{time:1000},function(){ md_changed = false; //跳转到文档修改 - window.location.href = "/modify_doc/"+r.data.doc+"/"; + window.location.href = "/modify_doc/{{doc.id}}/"; }); } }else{ diff --git a/template/app_doc/manage/manage_collect.html b/template/app_doc/manage/manage_collect.html new file mode 100644 index 0000000..fe047b6 --- /dev/null +++ b/template/app_doc/manage/manage_collect.html @@ -0,0 +1,223 @@ +{% extends 'app_doc/user/user_base.html' %} +{% load static %} +{% load i18n %} +{% block title %}{% trans "收藏管理" %}{% endblock %} +{% block content %} +