add:后台文档分享管理

This commit is contained in:
yangjian
2025-09-29 19:23:33 +08:00
parent 429546c948
commit 41efe10115
3 changed files with 407 additions and 10 deletions

View File

@@ -20,6 +20,8 @@ urlpatterns = [
path('doc_history_manage/<int:id>/', views.admin_doc_history, name='doc_history_manage'), # 文档历史记录管理
path('api/doc_history/<int:id>/', views.AdminDocHistory.as_view(), name="api_doc_history"), # 文档历史记录接口
path('api/doc_history_detail/', views.AdminDocHistoryDetail.as_view(), name="api_doc_history_detail"), # 文档历史记录详情接口
# 文档分享管理
path('doc_share_manage/',views.admin_doc_share,name="admin_doc_share"), # 分享文档管理
path('doctemp_manage/',views.admin_doctemp,name='doctemp_manage'), # 文档模板管理
path('setting/',views.admin_setting,name="sys_setting"), # 应用设置
path('config',views.admin_site_config,name="site_config"), # 站点配置

View File

@@ -939,7 +939,86 @@ class AdminDocHistoryDetail(APIView):
return Response({'code':5,'data':_("系统异常")})
# 文档分享管理
@superuser_only
@require_http_methods(['GET','POST'])
def admin_doc_share(request):
if request.method == 'GET':
return render(request, 'app_admin/admin_doc_share.html', locals())
else:
types = request.POST.get('type')
# 请求类型 1获取列表 2删除 3修改
if types == '1':
page = request.POST.get('page', 1)
limit = request.POST.get('limit', 10)
docshare_list = DocShare.objects.all().order_by('-create_time')
paginator = Paginator(docshare_list, limit)
page = request.GET.get('page', page)
try:
docshares = paginator.page(page)
except PageNotAnInteger:
docshares = paginator.page(1)
except EmptyPage:
docshares = paginator.page(paginator.num_pages)
share_list = []
for doc in docshares:
item = {
'token':doc.token,
'doc_id':doc.doc.id,
'doc_name':doc.doc.name,
'share_type':doc.share_type,
'share_value':doc.share_value,
'share_status':doc.is_enable,
'create_user': doc.doc.create_user.username,
# 'expire_type':doc.expire_type,
# 'expire_time':doc.expire_time,
'create_time':doc.create_time
}
share_list.append(item)
resp_data = {
"code":0,
"msg":"ok",
"count":docshare_list.count(),
"data":share_list
}
return JsonResponse(resp_data)
# 删除
elif types == '2':
range = request.POST.get("range")
token = request.POST.get("token")
if range == 'single':
try:
share = DocShare.objects.get(token=token)
share.delete()
return JsonResponse({'status':True,'data':'ok'})
except:
return JsonResponse({'status':False,'data':_('无指定内容')})
elif range == "multi":
tokens = token.split(",")
try:
share = DocShare.objects.filter(token__in=tokens)
share.delete()
return JsonResponse({'status':True,'data':'ok'})
except:
return JsonResponse({'status':False,'data':_('无指定内容')})
else:
return JsonResponse({'status':False,'data':_('类型错误')})
# 修改
elif types == '3':
token = request.POST.get("token",'')
name = request.POST.get('key','')
value = request.POST.get('value','')
# 修改分享状态
if name == 'share_status':
is_enable = True if value == 'true' else False
DocShare.objects.filter(token=token).update(is_enable=is_enable)
# 修改分享类型
elif name == 'share_type':
share_type = 0 if value == '0' else 1
DocShare.objects.filter(token=token).update(share_type=share_type)
else:
return JsonResponse({'status':False,'data':_('参数错误')})
return JsonResponse({'status':True,'data':'ok'})
# 后台管理 - 文档模板管理
@superuser_only
@@ -1587,16 +1666,34 @@ def admin_center_menu(request):
{
"id": 3,
"title": _("文档管理"),
"type": 1,
"type": 0,
"icon": "layui-icon layui-icon-form",
"href": reverse('doc_manage'),
},
{
"id": 4,
"title": _("文档模板管理"),
"type": 1,
"icon": "layui-icon layui-icon-templeate-1",
"href": reverse('doctemp_manage'),
"href": "",
"children": [
{
"id": 'doc_manage',
"title": _("文档管理"),
"type": 1,
"icon": "layui-icon layui-icon-form",
"href": reverse('doc_manage'),
},
{
"id": 4,
"title": _("文档模板管理"),
"type": 1,
"icon": "layui-icon layui-icon-templeate-1",
"href": reverse('doctemp_manage'),
},
{
"id": 'doc_share_manage',
"title": _("文档分享管理"),
"type": 1,
"icon": "layui-icon layui-icon-templeate-1",
"href": reverse('admin_doc_share'),
},
],
},
{
"id": "my_fodder",

View File

@@ -0,0 +1,298 @@
{% extends 'app_admin/admin_base.html' %}
{% load static %}
{% load i18n %}
{% block title %}{% trans "文档分享管理" %}{% endblock %}
{% block content %}
<div class="layui-card">
<div class="layui-card-body">
<table id="share-doc-table" lay-filter="share-doc-table"></table>
</div>
</div>
<!-- 自定义表单工具栏 -->
<script type="text/html" id="share-doc-toolbar">
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="batchRemove">
<i class="layui-icon layui-icon-delete"></i>
{% trans "删除" %}
</button>
</script>
<!-- 表格操作栏 -->
<script type="text/html" id="share-doc-bar">
{% verbatim %}
<a href="javascript:void(0);" title="查看分享信息" class="table-col-link" lay-event="showShare">查看</a>
<a href="/doc/{{d.doc_id}}/" target="_blank" title="查看源文档" class="table-col-link">前往文档</a>
<a href="javascript:void(0);" title="删除文档分享" class="table-col-link" lay-event="remove">删除</a>
{% endverbatim %}
</script>
<!-- 分享类型 -->
<script type="text/html" id="share-type">
{% verbatim %}
{{#if (d['share_type'] == '0') { }}
<span>公开</span>
{{# }else if(d['share_type'] == '1'){ }}
<span>私密</span>
{{# } }}
{% endverbatim %}
</script>
<!-- 有效期 -->
<script type="text/html" id="expire-date">
{% verbatim %}
{{#if(d.expire_type == -1){ }}
<span>永久</span>
{{# }else{ }}
<span>{{layui.util.toDateString(d.expire_time, "yyyy-MM-dd")}}</span>
{{# } }}
{% endverbatim %}
</script>
<!-- 分享时间 -->
<script type="text/html" id="share-create-time">
{% verbatim %}
{{layui.util.toDateString(d.create_time, "yyyy-MM-dd HH:mm:ss")}}
{% endverbatim %}
</script>
<!-- 分享状态 -->
<script type="text/html" id="share-enable">
{% verbatim %}
<input type="checkbox" name="share-enable" value="{{d.token}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="share-enable" {{ d.share_status == true ? 'checked' : '' }}>
{% endverbatim %}
</script>
{% endblock %}
{% block custom_script %}
<div id="show-share-info-div" style="margin:10px;display: none;">
<div class="layui-form" lay-filter="show-share-form">
<div class="layui-form-item">
<label class="layui-form-label">文档名称</label>
<div class="layui-input-block">
<input type="text" name="doc_name" readonly lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item" style="display: none;">
<label class="layui-form-label">分享类型</label>
<div class="layui-input-block">
<input type="text" name="share_type" readonly lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分享链接</label>
<div class="layui-input-block">
<input type="text" name="share_url" readonly lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item" id="share-code-input">
<label class="layui-form-label">分享码</label>
<div class="layui-input-block">
<input type="text" name="share_pwd" readonly lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-sm layui-btn-normal" id="copyShareInfo">复制链接</button>
</div>
</div>
</div>
</div>
<script src="{% static '/clipboard/clipboard.min.js' %}"></script>
<script>
layui.use(['layer', 'echarts', 'element', 'count','topBar','form','table'], function() {
var $ = layui.jquery,
table = layui.table,
layer = layui.layer,
form = layui.form,
element = layui.element,
count = layui.count,
echarts = layui.echarts;
$.ajaxSetup({
data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});
let cols = [
[
{type: 'checkbox'},
{title: '文档名称',field: 'doc_name',align: 'left'},
{title: '分享类型',field: 'share_type',align: 'left',width: 100,templet:"#share-type"},
{title: '分享码',field: 'share_value',align: 'left',width: 100},
{title: '有效期',field: 'expire_date',align: 'left',templet:"#expire-date"},
{title: '作者',field: 'create_user',align: 'left',},
{title: '分享时间',field: 'create_time',align: 'left',width: 150,templet:"#share-create-time"},
{title: '状态',field: 'share_status',align: 'left',width: 100,templet:"#share-enable"},
{title: '操作',toolbar: '#share-doc-bar',align: 'left',minWidth:200}
]
]
// 渲染表格
table.render({
elem: '#share-doc-table',
method:'post',
where:{'type':1},
url: "{% url 'admin_doc_share' %}",
page: true,
cols: cols,
skin: 'line',
escape:true,
toolbar: '#share-doc-toolbar',
defaultToolbar: ['filter']
});
// 侦听分享状态开关
form.on('switch(share-enable)',function(obj){
var data = {
'type':3,
'token':this.value,
'key':'share_status',
}
if(obj.elem.checked){
data['value'] = 'true'
}else{
data['value'] = 'false'
}
$.post("{% url 'manage_doc_share' %}",data,function(r){
if(r.status){
layer.msg("设置成功")
}else{
layer.msg("设置失败")
}
})
})
// 侦听单个分享操作
table.on('tool(share-doc-table)', function(obj) {
// console.log(obj)
if (obj.event === 'remove') {
// console.log(obj)
window.remove(obj);
}else if(obj.event === 'showShare'){
showShareInfo(obj.data)
}
});
// 显示文集分享信息
showShareInfo = function(data){
let share_link = window.location.protocol
+ '//'
+ document.location.host
+ '/share_doc/?token='
+ data.token;
if(data.share_type == 0){
$("#share-code-input").css('display','none');
}else{
$("#share-code-input").css('display','block');
}
form.val('show-share-form',{
'doc_name':data.doc_name,
'share_type':data.share_type,
'share_url':share_link,
'share_pwd':data.share_value,
})
layer.open({
type:1,
area:["500px"],
title:"查看文档分享信息",
content:$("#show-share-info-div"),
})
};
// 复制分享URL及分享码
var copy_share_link = new ClipboardJS('#copyShareInfo', {
text: function() {
let share_val = form.val("show-share-form");
if(share_val['share_type'] == 0){
return share_val['share_url']
}else{
return '链接:' + share_val['share_url'] + " 分享码:" + share_val['share_pwd']
}
}
});
copy_share_link.on('success', function(e) {
layer.msg("复制成功!")
});
// 删除文档分享
window.remove = function(obj) {
layer.confirm('确定要删除该分享?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{% url 'admin_doc_share' %}",
dataType: 'json',
type: 'post',
data:{'token':obj.data.token,'type':2,'range':'single'},
success: function(r) {
layer.close(loading);
if (r.status) {
layer.msg("删除成功", {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(r.data, {
icon: 2,
time: 1000
});
}
}
})
});
};
// 侦听批量删除
table.on('toolbar(share-doc-table)', function(obj) {
if (obj.event === 'batchRemove') {
window.batchRemove(obj);
}
});
window.batchRemove = function(obj) {
let data = table.checkStatus(obj.config.id).data;
if (data.length === 0) {
layer.msg("未选中数据", {
icon: 3,
time: 1000
});
return false;
}
let tokens = "";
for (let i = 0; i < data.length; i++) {
tokens += data[i].token + ",";
}
tokens = tokens.substr(0, tokens.length - 1);
console.log(tokens)
layer.confirm('确定要删除这些分享?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{% url 'admin_doc_share' %}",
dataType: 'json',
type: 'post',
data:{'token':tokens,'type':2,'range':'multi'},
success: function(r) {
layer.close(loading);
if (r.status) {
layer.msg("删除成功", {
icon: 1,
time: 1000
}, function() {
table.reload('share-doc-table',{
page:{curr:1}
});
});
} else {
layer.msg(r.data, {
icon: 2,
time: 1000
});
}
}
})
});
}
})
</script>
{% endblock %}