添加多语言翻译适配和繁体中文语言文件

This commit is contained in:
yangjian 2021-03-13 16:45:51 +08:00
parent 3b1e907fe5
commit 4a7e67a837
16 changed files with 2833 additions and 439 deletions

View File

@ -4,11 +4,12 @@
# #日期2019/11/23
# 博客地址zmister.com
import smtplib
from django.utils.translation import gettext_lazy as _
from django.conf import settings
from email.mime.text import MIMEText
from app_admin.models import SysSetting
import random
import smtplib
# 生成数字验证码
def generate_vcode(n=6):
@ -27,7 +28,7 @@ def send_email(to_email,vcode_str):
username = SysSetting.objects.get(types='email', name='username').value
pwd = SysSetting.objects.get(types='email', name='pwd').value
ssl = SysSetting.objects.get(types='email',name='smtp_ssl').value
print(smtp_host,smtp_port,send_emailer,username,pwd)
# print(smtp_host,smtp_port,send_emailer,username,pwd)
msg_from = send_emailer # 发件人邮箱
passwd = dectry(pwd) # 发件人邮箱密码
@ -36,8 +37,8 @@ def send_email(to_email,vcode_str):
s = smtplib.SMTP_SSL(smtp_host, int(smtp_port)) # 发件箱邮件服务器及端口号
else:
s = smtplib.SMTP(smtp_host, int(smtp_port))
subject = "MrDoc - 重置密码验证码"
content = "你的验证码为:{}验证码30分钟内有效".format(vcode_str)
subject = _("MrDoc - 重置密码验证码")
content = _("你的验证码为:{}验证码30分钟内有效".format(vcode_str))
msg = MIMEText(content, _subtype='html', _charset='utf-8')
msg['Subject'] = subject
@ -48,7 +49,7 @@ def send_email(to_email,vcode_str):
s.sendmail(msg_from, msg_to, msg.as_string())
return True
except smtplib.SMTPException as e:
print(repr(e))
# print(repr(e))
return False
finally:
s.quit()

View File

@ -6,18 +6,18 @@ from django.contrib.auth.models import User # Django默认用户模型
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 app_admin.decorators import superuser_only,open_register
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q
from django.urls import reverse
import datetime
import requests
from django.utils.translation import gettext_lazy as _
from app_admin.decorators import superuser_only,open_register
from app_doc.models import *
from app_admin.models import *
from app_admin.utils import *
import traceback
from loguru import logger
import re
import datetime
import requests
# 返回验证码图片
@ -33,8 +33,8 @@ def check_code(request):
request.session["CheckCode"] = code
return HttpResponse(stream.getvalue(), content_type="image/png")
except Exception as e:
logger.exception("生成验证码图片异常")
return HttpResponse("请求异常:{}".format(repr(e)))
logger.exception(_("生成验证码图片异常"))
return HttpResponse(_("请求异常:{}".format(repr(e))))
# 登录视图
@ -54,7 +54,7 @@ def log_in(request):
if (len(require_login_check_code) > 0) and (require_login_check_code[0].value == 'on'):
checkcode = request.POST.get("check_code", None)
if checkcode != request.session['CheckCode'].lower():
errormsg = '验证码错误!'
errormsg = _('验证码错误!')
return render(request, 'login.html', locals())
if username != '' and pwd != '':
user = authenticate(username=username,password=pwd)
@ -63,17 +63,17 @@ def log_in(request):
login(request,user)
return redirect('/')
else:
errormsg = '用户被禁用!'
errormsg = _('用户被禁用!')
return render(request, 'login.html', locals())
else:
errormsg = '用户名或密码错误!'
errormsg = _('用户名或密码错误!')
return render(request, 'login.html', locals())
else:
errormsg = '用户名或密码错误!'
errormsg = _('用户名或密码错误!')
return render(request, 'login.html', locals())
except Exception as e:
logger.exception("登录异常")
return HttpResponse('请求出错')
return HttpResponse(_('请求出错'))
# 注册视图
@ -97,7 +97,7 @@ def register(request):
try:
register_code_value = RegisterCode.objects.get(code=register_code,status=1)
except ObjectDoesNotExist:
errormsg = '注册码无效!'
errormsg = _('注册码无效!')
return render(request, 'register.html', locals())
# 判断是否输入了用户名、邮箱和密码
if username and email and password:
@ -105,22 +105,22 @@ def register(request):
email_exit = User.objects.filter(email=email)
username_exit = User.objects.filter(username=username)
if email_exit.count() > 0: # 验证电子邮箱
errormsg = '此电子邮箱已被注册!'
errormsg = _('此电子邮箱已被注册!')
return render(request, 'register.html', locals())
elif username_exit.count() > 0: # 验证用户名
errormsg = '用户名已被使用!'
errormsg = _('用户名已被使用!')
return render(request, 'register.html', locals())
elif re.match('^[0-9a-z]+$',username) is False:
errormsg = '用户名只能为英文数字组合'
errormsg = _('用户名只能为英文数字组合')
return render(request, 'register.html', locals())
elif len(username) < 5:
errormsg = '用户名必须大于等于5位'
errormsg = _('用户名必须大于等于5位')
return render(request, 'register.html', locals())
elif len(password) < 6: # 验证密码长度
errormsg = '密码必须大于等于6位'
errormsg = _('密码必须大于等于6位')
return render(request, 'register.html', locals())
elif checkcode != request.session['CheckCode'].lower(): # 验证验证码
errormsg = "验证码错误"
errormsg = _("验证码错误")
return render(request, 'register.html', locals())
else:
# 创建用户
@ -148,13 +148,13 @@ def register(request):
login(request, user)
return redirect('/')
else:
errormsg = '用户被禁用,请联系管理员!'
errormsg = _('用户被禁用,请联系管理员!')
return render(request, 'register.html', locals())
else:
errormsg = '请输入正确的电子邮箱格式!'
errormsg = _('请输入正确的电子邮箱格式!')
return render(request, 'register.html', locals())
else:
errormsg = "请检查输入值"
errormsg = _("请检查输入值")
return render(request, 'register.html', locals())
@ -171,7 +171,7 @@ def log_out(request):
resp.delete_cookie(c)
return resp
except Exception as e:
logger.exception("注销异常")
logger.exception(_("注销异常"))
return redirect(request.META['HTTP_REFERER'])
@ -192,18 +192,18 @@ def forget_pwd(request):
user = User.objects.get(email=email)
user.set_password(new_pwd)
user.save()
errormsg = "修改密码成功,请返回登录!"
errormsg = _("修改密码成功,请返回登录!")
return render(request, 'forget_pwd.html', locals())
else:
errormsg = "验证码已过期"
errormsg = _("验证码已过期")
return render(request, 'forget_pwd.html', locals())
except ObjectDoesNotExist:
logger.error("邮箱不存在:{}".format(email))
errormsg = "验证码或邮箱错误"
logger.error(_("邮箱不存在:{}".format(email)))
errormsg = _("验证码或邮箱错误")
return render(request, 'forget_pwd.html', locals())
except Exception as e:
logger.exception("修改密码异常")
errormsg = "验证码或邮箱错误"
errormsg = _("验证码或邮箱错误")
return render(request,'forget_pwd.html',locals())
@ -228,14 +228,14 @@ def send_email_vcode(request):
verification_code = vcode_str,
expire_time = expire_time
)
return JsonResponse({'status':True,'data':'发送成功'})
return JsonResponse({'status':True,'data':_('发送成功')})
else:
return JsonResponse({'status':False,'data':'发送验证码出错,请重试!'})
return JsonResponse({'status':False,'data':_('发送验证码出错,请重试!')})
else:
return JsonResponse({'status':False,'data':'电子邮箱不存在!'})
return JsonResponse({'status':False,'data':_('电子邮箱不存在!')})
else:
return JsonResponse({'status':False,'data':'方法错误'})
return JsonResponse({'status':False,'data':_('方法错误')})
# 后台管理 - 仪表盘
@ -303,7 +303,7 @@ def admin_user(request):
table_data.append(item)
return JsonResponse({'code':0,'data':table_data,"count": user_data.count()})
else:
return JsonResponse({'code':1,'msg':'方法错误'})
return JsonResponse({'code':1,'msg':_('方法错误')})
# 后台管理 - 创建用户
@ -319,10 +319,10 @@ def admin_create_user(request):
'@' in email and re.match(r'^[0-9a-z]',username) and len(username) >= 5 :
# 不允许电子邮箱重复
if User.objects.filter(email = email).count() > 0:
return JsonResponse({'status':False,'data':'电子邮箱不可重复'})
return JsonResponse({'status':False,'data':_('电子邮箱不可重复')})
# 不允许重复的用户名
if User.objects.filter(username = username).count() > 0:
return JsonResponse({'status': False,'data':'用户名不可重复'})
return JsonResponse({'status': False,'data':_('用户名不可重复')})
try:
if user_type == 0:
user = User.objects.create_user(
@ -340,11 +340,11 @@ def admin_create_user(request):
user.save()
return JsonResponse({'status':True})
except Exception as e:
return JsonResponse({'status':False,'data':'系统异常'})
return JsonResponse({'status':False,'data':_('系统异常')})
else:
return JsonResponse({'status':False,'data':'请检查参数'})
return JsonResponse({'status':False,'data':_('请检查参数')})
else:
return HttpResponse('方法不允许')
return HttpResponse(_('方法不允许'))
# 后台管理 - 修改密码
@ -361,16 +361,16 @@ def admin_change_pwd(request):
user = User.objects.get(id=int(user_id))
user.set_password(password)
user.save()
return JsonResponse({'status':True,'data':'修改成功'})
return JsonResponse({'status':True,'data':_('修改成功')})
else:
return JsonResponse({'status':False,'data':'两个密码不一致'})
return JsonResponse({'status':False,'data':_('两个密码不一致')})
else:
return JsonResponse({'status':False,'data':'参数错误'})
return JsonResponse({'status':False,'data':_('参数错误')})
except Exception as e:
print(repr(e))
return JsonResponse({'status':False,'data':'请求错误'})
return JsonResponse({'status':False,'data':_('请求错误')})
else:
return JsonResponse({'status':False,'data':'方法错误'})
return JsonResponse({'status':False,'data':_('方法错误')})
# 后台管理 - 删除用户
@ -389,11 +389,11 @@ def admin_del_user(request):
top_doc=colloa.project.id,create_user=user
).update(create_user=colloa.project.create_user)
user.delete()
return JsonResponse({'status':True,'data':'删除成功'})
return JsonResponse({'status':True,'data':_('删除成功')})
except Exception as e:
return JsonResponse({'status':False,'data':'删除出错'})
return JsonResponse({'status':False,'data':_('删除出错')})
else:
return JsonResponse({'status':False,'data':'方法错误'})
return JsonResponse({'status':False,'data':_('方法错误')})
# 后台管理 - 文集管理
@ -492,8 +492,8 @@ def admin_project_istop(request):
Project.objects.filter(id=project_id).update(is_top=is_top)
return JsonResponse({'status':True})
except:
logger.exception("置顶文集出错")
return JsonResponse({'status':False,'data':'执行出错'})
logger.exception(_("置顶文集出错"))
return JsonResponse({'status':False,'data':_('执行出错')})
# 后台管理 - 文档管理
@ -645,7 +645,7 @@ def admin_register_code(request):
try:
all_cnt = int(request.POST.get('all_cnt',1)) # 注册码的最大使用次数
if all_cnt <= 0:
return JsonResponse({'status': False, 'data': '最大使用次数不可为负数'})
return JsonResponse({'status': False, 'data': _('最大使用次数不可为负数')})
is_code = False
while is_code is False:
code_str = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
@ -661,24 +661,24 @@ def admin_register_code(request):
all_cnt = all_cnt,
create_user = request.user
)
return JsonResponse({'status':True,'data':'新增成功'})
return JsonResponse({'status':True,'data':_('新增成功')})
except Exception as e:
logger.exception("生成注册码异常")
return JsonResponse({'status': False,'data':'系统异常'})
logger.exception(_("生成注册码异常"))
return JsonResponse({'status': False,'data':_('系统异常')})
elif int(types) == 2:
code_id = request.POST.get('code_id',None)
try:
register_code = RegisterCode.objects.get(id=int(code_id))
register_code.delete()
return JsonResponse({'status':True,'data':'删除成功'})
return JsonResponse({'status':True,'data':_('删除成功')})
except ObjectDoesNotExist:
return JsonResponse({'status':False,'data':'注册码不存在'})
return JsonResponse({'status':False,'data':_('注册码不存在')})
except:
return JsonResponse({'status':False,'data':'系统异常'})
return JsonResponse({'status':False,'data':_('系统异常')})
else:
return JsonResponse({'status':False,'data':'类型错误'})
return JsonResponse({'status':False,'data':_('类型错误')})
else:
return JsonResponse({'status': False,'data':'方法错误'})
return JsonResponse({'status': False,'data':_('方法错误')})
# 普通用户修改密码
@ -695,15 +695,15 @@ def change_pwd(request):
user = User.objects.get(id=request.user.id)
user.set_password(password)
user.save()
return JsonResponse({'status':True,'data':'修改成功'})
return JsonResponse({'status':True,'data':_('修改成功')})
else:
return JsonResponse({'status':False,'data':'密码不得少于6位数'})
return JsonResponse({'status':False,'data':_('密码不得少于6位数')})
else:
return JsonResponse({'status':False,'data':'两个密码不一致'})
return JsonResponse({'status':False,'data':_('两个密码不一致')})
except Exception as e:
return JsonResponse({'status':False,'data':'修改出错'})
return JsonResponse({'status':False,'data':_('修改出错')})
else:
return HttpResponse('方法错误')
return HttpResponse(_('方法错误'))
# 后台管理 - 应用设置
@ -827,7 +827,6 @@ def admin_setting(request):
defaults={'value':enable_login_check_code,'types':'basic'}
)
return render(request,'app_admin/admin_setting.html',locals())
# 邮箱设置
elif types == 'email':
@ -948,69 +947,69 @@ def admin_center_menu(request):
menu_data = [
{
"id": 1,
"title": "仪表盘",
"title": _("仪表盘"),
"type": 1,
"icon": "layui-icon layui-icon-console",
"href": reverse('admin_overview'),
},
{
"id": 2,
"title": "文集管理",
"title": _("文集管理"),
"type": 1,
"icon": "layui-icon layui-icon-list",
"href": reverse('project_manage'),
},
{
"id": 3,
"title": "文档管理",
"title": _("文档管理"),
"type": 1,
"icon": "layui-icon layui-icon-form",
"href": reverse('doc_manage'),
},
{
"id": 4,
"title": "文档模板管理",
"title": _("文档模板管理"),
"type": 1,
"icon": "layui-icon layui-icon-templeate-1",
"href": reverse('doctemp_manage'),
},
{
"id": 5,
"title": "注册码管理",
"title": _("注册码管理"),
"type": 1,
"icon": "layui-icon layui-icon-component",
"href": reverse('register_code_manage'),
},
{
"id": 6,
"title": "用户管理",
"title": _("用户管理"),
"type": 1,
"icon": "layui-icon layui-icon-user",
"href": reverse('user_manage'),
},
{
"id": 7,
"title": "站点设置",
"title": _("站点设置"),
"type": 1,
"icon": "layui-icon layui-icon-set",
"href": reverse('sys_setting'),
},
{
"id": "common",
"title": "使用帮助",
"title": _("使用帮助"),
"icon": "layui-icon layui-icon-template-1",
"type": 0,
"href": "",
"children": [{
"id": 701,
"title": "安装说明",
"title": _("安装说明"),
"icon": "layui-icon layui-icon-face-smile",
"type": 1,
"openType": "_blank",
"href": "http://mrdoc.zmister.com/project-7/"
}, {
"id": 702,
"title": "使用说明",
"title": _("使用说明"),
"icon": "layui-icon layui-icon-face-smile",
"type": 1,
"openType": "_blank",

View File

@ -5,6 +5,7 @@
# 博客地址zmister.com
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from app_api.models import *
@ -45,8 +46,8 @@ class AppMustAuth(BaseAuthentication):
# token 是有效的,返回一个元组
return user_obj.user, token # request.user, request.auth
else:
raise AuthenticationFailed('无效的token')
raise AuthenticationFailed(_('无效的token'))
# return None
else:
raise AuthenticationFailed('请求的URL中必须携带token参数')
raise AuthenticationFailed(_('请求的URL中必须携带token参数'))
# return None

View File

@ -8,7 +8,7 @@ from rest_framework.permissions import BasePermission,SAFE_METHODS
class AppPermission(BasePermission):
message = '只有VIP才能访问'
message = _('只有VIP才能访问')
def has_permission(self, request, view):
# vip才有访问权限

View File

@ -4,16 +4,17 @@ from django.views.decorators.csrf import csrf_exempt # CSRF装饰器
from django.views.decorators.http import require_http_methods,require_safe,require_GET
from django.contrib.auth.decorators import login_required # 登录需求装饰器
from django.core.exceptions import PermissionDenied,ObjectDoesNotExist
from app_api.models import UserToken
from app_doc.models import Project,Doc,Image
import time,hashlib
import traceback,json
from django.conf import settings
from app_doc.util_upload_img import upload_generation_dir,base_img_upload
from loguru import logger
from django.contrib.auth import authenticate,login,logout # 认证相关方法
from django.contrib.auth.models import User # Django默认用户模型
from django.shortcuts import render,redirect
from django.utils.translation import gettext_lazy as _
from app_doc.util_upload_img import upload_generation_dir,base_img_upload
from app_api.models import UserToken
from app_doc.models import Project,Doc,Image
from loguru import logger
import time,hashlib
import traceback,json
# MrDoc 基于用户的Token访问API模块
# 用户通过该url获取服务器时间戳便于接口访问
@ -40,18 +41,18 @@ def oauth0(request):
nowtime = int (time.time())
# 时间戳失效时间默认为3600可以改短如30严格点5秒如果使用5秒请求前需要通过get_timestamp获取服务器时间戳否则因为和服务器时间差导致无法验证通过
if (nowtime - int(timestamp)) > 3600 :
raise ValueError('链接已失效,请从合法路径访问,或联系管理员!')
raise ValueError(_('链接已失效,请从合法路径访问,或联系管理员!'))
# 2、获取userid的Token
user = User.objects.get(username=username)
if user is None:
raise ValueError('请求用户出错!')
raise ValueError(_('请求用户出错!'))
ID = user.id
State = user.is_active
if State == 1 and ID is not None:
usertoken = UserToken.objects.get(user_id=ID)
token = usertoken.token
else:
raise ValueError('非法用户!')
raise ValueError(_('非法用户!'))
# 3、 验证hash的正确性
final_str = str(randstr) + str(timestamp) + str(username) + token
@ -63,14 +64,14 @@ def oauth0(request):
newurl = unquote(redirecturl)
return redirect(newurl)
else:
raise ValueError('验证失败,可能是用户名或Token不正确!详情请联系管理员!')
raise ValueError(_('验证失败,可能是用户名或Token不正确!详情请联系管理员!'))
else:
raise ValueError('关键字验证失败,请联系管理员!部分关键字为空')
raise ValueError(_('关键字验证失败,请联系管理员!部分关键字为空'))
except ValueError as e:
errormsg = e
return render(request, 'app_api/api404.html', locals())
except :
errormsg = "API接口运行出错"
errormsg = _("API接口运行出错")
return render(request, 'app_api/api404.html', locals())
else:
return JsonResponse({'status':False,'data':'Nothing Here'})
@ -84,11 +85,10 @@ def manage_token(request):
try:
token = UserToken.objects.get(user=request.user).token # 查询用户Token
except ObjectDoesNotExist:
token = '你还没有生成过Token'
token = _('你还没有生成过Token')
except:
if settings.DEBUG:
print(traceback.print_exc())
logger.exception("Token管理页面异常")
logger.exception(_("Token管理页面异常"))
return render(request,'app_api/manage_token.html',locals())
elif request.method == 'POST':
try:
@ -105,8 +105,8 @@ def manage_token(request):
)
return JsonResponse({'status':True,'data':token_str})
except:
logger.exception("用户Token生成异常")
return JsonResponse({'status':False,'data':'生成出错,请重试!'})
logger.exception(_("用户Token生成异常"))
return JsonResponse({'status':False,'data':_('生成出错,请重试!')})
# 获取文集
@ -126,10 +126,10 @@ def get_projects(request):
project_list.append(item)
return JsonResponse({'status':True,'data':project_list})
except ObjectDoesNotExist:
return JsonResponse({'status':False,'data':'token无效'})
return JsonResponse({'status':False,'data':_('token无效')})
except:
logger.exception("token获取文集异常")
return JsonResponse({'status':False,'data':'系统异常'})
logger.exception(_("token获取文集异常"))
return JsonResponse({'status':False,'data':_('系统异常')})
# 获取文集下的文档列表
@ -154,10 +154,10 @@ def get_docs(request):
doc_list.append(item)
return JsonResponse({'status': True, 'data': doc_list})
except ObjectDoesNotExist:
return JsonResponse({'status': False, 'data': 'token无效'})
return JsonResponse({'status': False, 'data': _('token无效')})
except:
logger.exception("token获取文集异常")
return JsonResponse({'status': False, 'data': '系统异常'})
logger.exception(_("token获取文集异常"))
return JsonResponse({'status': False, 'data': _('系统异常')})
# 获取单篇文档
@ -181,10 +181,10 @@ def get_doc(request):
}
return JsonResponse({'status': True, 'data': item})
except ObjectDoesNotExist:
return JsonResponse({'status': False, 'data': 'token无效'})
return JsonResponse({'status': False, 'data': _('token无效')})
except:
logger.exception("token获取文集异常")
return JsonResponse({'status': False, 'data': '系统异常'})
return JsonResponse({'status': False, 'data': _('系统异常')})
# 新建文集
@ -206,10 +206,10 @@ def create_project(request):
)
return JsonResponse({'status': True, 'data': 'ok'})
except ObjectDoesNotExist:
return JsonResponse({'status': False, 'data': 'token无效'})
return JsonResponse({'status': False, 'data': _('token无效')})
except:
logger.exception("token创建文集异常")
return JsonResponse({'status':False,'data':'系统异常'})
logger.exception(_("token创建文集异常"))
return JsonResponse({'status':False,'data':_('系统异常')})
# 新建文档
@ -237,12 +237,12 @@ def create_doc(request):
)
return JsonResponse({'status': True, 'data': 'ok'})
else:
return JsonResponse({'status':False,'data':'非法请求'})
return JsonResponse({'status':False,'data':_('非法请求')})
except ObjectDoesNotExist:
return JsonResponse({'status': False, 'data': 'token无效'})
return JsonResponse({'status': False, 'data': _('token无效')})
except:
logger.exception("token创建文档异常")
return JsonResponse({'status':False,'data':'系统异常'})
logger.exception(_("token创建文档异常"))
return JsonResponse({'status':False,'data':_('系统异常')})
# 上传图片
@ -263,7 +263,7 @@ def upload_img(request):
return JsonResponse(result)
# return HttpResponse(json.dumps(result), content_type="application/json")
except ObjectDoesNotExist:
return JsonResponse({'success': 0, 'data': 'token无效'})
return JsonResponse({'success': 0, 'data': _('token无效')})
except:
logger.exception("token上传图片异常")
return JsonResponse({'success':0,'data':'上传出错'})
logger.exception(_("token上传图片异常"))
return JsonResponse({'success':0,'data':_('上传出错')})

View File

@ -10,6 +10,7 @@ from django.contrib.auth import authenticate
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from rest_framework.views import APIView
from app_api.models import AppUserToken
from rest_framework.response import Response
@ -86,12 +87,12 @@ class LoginView(APIView):
res['username'] = username
else:
res['code'] = 2
res["error"] = '账号被禁用'
res["error"] = _('账号被禁用')
else:
# 登陆失败
res["code"] = 1
res["error"] = "用户名或密码错误"
res["error"] = _("用户名或密码错误")
return Response(res)
@ -337,16 +338,16 @@ class ProjectView(APIView):
return Response(resp)
else:
resp['code'] = 5
resp['data'] = '参数不正确'
resp['data'] = _('参数不正确')
return Response(resp)
except Exception as e:
logger.exception("创建文集出错")
logger.exception(_("创建文集出错"))
resp['code'] = 4
resp['data'] = '系统异常请稍后再试'
resp['data'] = _('系统异常请稍后再试')
return Response(resp)
else:
resp['code'] = 6
resp['data'] = '请登录后操作'
resp['data'] = _('请登录后操作')
return Response(resp)
# 修改文集
@ -372,14 +373,14 @@ class ProjectView(APIView):
# return Response(resp)
else:
resp['code'] = 2
resp['data'] = '非法请求'
resp['data'] = _('非法请求')
# return Response(resp)
except ObjectDoesNotExist:
resp['code'] = 1
resp['data'] = '资源未找到'
resp['data'] = _('资源未找到')
# return Response(resp)
except Exception as e:
logger.exception("修改文集出错")
logger.exception(_("修改文集出错"))
resp['code'] = 4
# return Response(resp)
else:
@ -409,14 +410,14 @@ class ProjectView(APIView):
# return Response(resp)
else:
resp['code'] = 5
resp['data'] = '参数错误'
resp['data'] = _('参数错误')
# return Response(resp)
except ObjectDoesNotExist:
resp['code'] = 1
resp['data'] = '资源未找到'
resp['data'] = _('资源未找到')
# return Response(resp)
except Exception as e:
logger.exception("API文集删除异常")
logger.exception(_("API文集删除异常"))
resp['code'] = 4
# return Response(resp)
else:
@ -481,7 +482,7 @@ class DocView(APIView):
resp = {'code':0,'data':serializer.data}
return Response(resp)
elif doc_format == 'html':
logger.info("返回HTML")
logger.info(_("返回HTML"))
# return Response({'status':'html'})
return render(request,'app_api/single_doc_detail.html',locals())
else:
@ -532,12 +533,12 @@ class DocView(APIView):
)
return Response({'code':0,'data':{'pro':project,'doc':doc.id}})
else:
return Response({'code':2,'data':'无权操作此文集'})
return Response({'code':2,'data':_('无权操作此文集')})
else:
return Response({'code':5,'data':'请确认文档标题、文集正确'})
return Response({'code':5,'data':_('请确认文档标题、文集正确')})
except Exception as e:
logger.exception("api新建文档异常")
return Response({'status':4,'data':'请求出错'})
logger.exception(_("api新建文档异常"))
return Response({'status':4,'data':_('请求出错')})
# 修改文档
def put(self, request):
@ -572,14 +573,14 @@ class DocView(APIView):
modify_time = datetime.datetime.now(),
status = status
)
return Response({'code': 0,'data':'修改成功'})
return Response({'code': 0,'data':_('修改成功')})
else:
return Response({'code':2,'data':'未授权请求'})
return Response({'code':2,'data':_('未授权请求')})
else:
return Response({'code': 5,'data':'参数错误'})
return Response({'code': 5,'data':_('参数错误')})
except Exception as e:
logger.exception("api修改文档出错")
return Response({'code':4,'data':'请求出错'})
logger.exception(_("api修改文档出错"))
return Response({'code':4,'data':_('请求出错')})
# 删除文档
def delete(self, request):
@ -611,14 +612,14 @@ class DocView(APIView):
Doc.objects.filter(parent_doc__in=chr_doc_ids).update(status=3,
modify_time=datetime.datetime.now()) # 修改下级文档的下级文档状态
return Response({'code': 0, 'data': '删除完成'})
return Response({'code': 0, 'data': _('删除完成')})
else:
return Response({'code': 2, 'data': '非法请求'})
return Response({'code': 2, 'data': _('非法请求')})
else:
return Response({'code': 5, 'data': '参数错误'})
return Response({'code': 5, 'data': _('参数错误')})
except Exception as e:
logger.exception("api删除文档出错")
return Response({'code': 4, 'data': '请求出错'})
logger.exception(_("api删除文档出错"))
return Response({'code': 4, 'data': _('请求出错')})
# 文档模板视图
@ -635,7 +636,7 @@ class DocTempView(APIView):
serializer = DocTempSerializer(doctemp)
resp = {'code': 0, 'data': serializer.data}
else:
resp = {'code':2,'data':'无权操作'}
resp = {'code':2,'data':_('无权操作')}
else:
doctemps = DocTemp.objects.filter(create_user=request.user)
page = PageNumberPagination()
@ -644,7 +645,7 @@ class DocTempView(APIView):
resp = {'code':0,'data':serializer.data,'count':doctemps.count()}
return Response(resp)
else:
return Response({'code': 6, 'data': '请登录'})
return Response({'code': 6, 'data': _('请登录')})
def post(self, request):
try:
@ -658,14 +659,14 @@ class DocTempView(APIView):
create_user=request.user
)
doctemp.save()
return Response({'code':0,'data':'创建成功'})
return Response({'code':0,'data':_('创建成功')})
else:
return Response({'code':5,'data':'模板标题不能为空'})
return Response({'code':5,'data':_('模板标题不能为空')})
else:
return Response({'code':6,'data':'请登录'})
return Response({'code':6,'data':_('请登录')})
except Exception as e:
logger.exception("api创建文档模板出错")
return Response({'code':4,'data':'请求出错'})
logger.exception(_("api创建文档模板出错"))
return Response({'code':4,'data':_('请求出错')})
def put(self, request):
try:
@ -679,14 +680,14 @@ class DocTempView(APIView):
doctemp.name = name
doctemp.content = content
doctemp.save()
return Response({'code':0,'data':'修改成功'})
return Response({'code':0,'data':_('修改成功')})
else:
return Response({'code':2,'data':'非法操作'})
return Response({'code':2,'data':_('非法操作')})
else:
return Response({'code':5,'data':'参数错误'})
return Response({'code':5,'data':_('参数错误')})
except Exception as e:
logger.exception("api修改文档模板出错")
return Response({'code':4,'data':'请求出错'})
logger.exception(_("api修改文档模板出错"))
return Response({'code':4,'data':_('请求出错')})
def delete(self, request):
try:
@ -695,14 +696,14 @@ class DocTempView(APIView):
doctemp = DocTemp.objects.get(id=doctemp_id)
if request.user == doctemp.create_user:
doctemp.delete()
return Response({'code': 0, 'data': '删除完成'})
return Response({'code': 0, 'data': _('删除完成')})
else:
return Response({'code': 2, 'data': '非法请求'})
return Response({'code': 2, 'data': _('非法请求')})
else:
return Response({'code': 5, 'data': '参数错误'})
return Response({'code': 5, 'data': _('参数错误')})
except Exception as e:
logger.exception("api删除文档模板出错")
return Response({'code': 4, 'data': '请求出错'})
logger.exception(_("api删除文档模板出错"))
return Response({'code': 4, 'data': _('请求出错')})
# 图片视图
@ -742,7 +743,7 @@ class ImageView(APIView):
result = base_img_upload(base_img, dir_name, request.user)
resp = {'code': 0, 'data': result['url']}
else:
resp = {"code": 5, "message": "出错信息"}
resp = {"code": 5, "message": _("出错信息")}
return Response(resp)
# 删除
@ -750,7 +751,7 @@ class ImageView(APIView):
img_id = request.data.get('id', '')
img = Image.objects.get(id=img_id)
if img.user != request.user:
return Response({'code': 2, 'data': '未授权请求'})
return Response({'code': 2, 'data': _('未授权请求')})
file_path = settings.BASE_DIR + img.file_path
is_exist = os.path.exists(file_path)
if is_exist:
@ -768,8 +769,8 @@ class ImageGroupView(APIView):
group_list = []
all_cnt = Image.objects.filter(user=request.user).count()
non_group_cnt = Image.objects.filter(group_id=None,user=request.user).count()
group_list.append({'group_name': '全部图片', 'group_cnt': all_cnt, 'group_id': 0})
group_list.append({'group_name': '未分组', 'group_cnt': non_group_cnt, 'group_id': -1})
group_list.append({'group_name': _('全部图片'), 'group_cnt': all_cnt, 'group_id': 0})
group_list.append({'group_name': _('未分组'), 'group_cnt': non_group_cnt, 'group_id': -1})
groups = ImageGroup.objects.filter(user=request.user) # 查询所有分组
for group in groups:
group_cnt = Image.objects.filter(group_id=group).count()
@ -781,27 +782,27 @@ class ImageGroupView(APIView):
group_list.append(item)
return Response({'code': 0, 'data': group_list})
except:
return Response({'code': 4, 'data': '出现错误'})
return Response({'code': 4, 'data': _('出现错误')})
def post(self, request):
group_name = request.data.get('group_name', '')
if group_name not in ['', '默认分组', '未分组']:
if group_name not in ['', _('默认分组'), _('未分组')]:
ImageGroup.objects.create(
user=request.user,
group_name=group_name
)
return Response({'code': 0, 'data': 'ok'})
else:
return Response({'code': 5, 'data': '名称无效'})
return Response({'code': 5, 'data': _('名称无效')})
def put(self, request):
group_name = request.data.get("group_name", '')
if group_name not in ['', '默认分组', '未分组']:
if group_name not in ['', _('默认分组'), _('未分组')]:
group_id = request.POST.get('group_id', '')
ImageGroup.objects.filter(id=group_id,user=request.user).update(group_name=group_name)
return Response({'code': 0, 'data': 'ok'})
else:
return Response({'code': 5, 'data': '名称无效'})
return Response({'code': 5, 'data': _('名称无效')})
def delete(self, request):
try:
@ -811,7 +812,7 @@ class ImageGroupView(APIView):
group.delete() # 删除分组
return Response({'code': 0, 'data': 'ok'})
except:
return Response({'code': 4, 'data': '删除错误'})
return Response({'code': 4, 'data': _('删除错误')})
# 附件视图
@ -864,7 +865,7 @@ class AttachmentView(APIView):
attachment_size = self.sizeFormat(attachment.size)
# 限制附件大小在50mb以内
if attachment.size > 52428800:
return Response({'code': False, 'data': '文件大小超出限制'})
return Response({'code': False, 'data': _('文件大小超出限制')})
# 限制附件为ZIP格式文件
if attachment_name.endswith('.zip'):
a = Attachment.objects.create(
@ -875,9 +876,9 @@ class AttachmentView(APIView):
)
return Response({'code': 0, 'data': {'name': attachment_name, 'url': a.file_path.name}})
else:
return Response({'code': 5, 'data': '不支持的格式'})
return Response({'code': 5, 'data': _('不支持的格式')})
else:
return Response({'code': 5, 'data': '无效文件'})
return Response({'code': 5, 'data': _('无效文件')})
def delete(self, request):
attach_id = request.data.get('attach_id', '')

View File

@ -5,7 +5,7 @@
# 博客地址zmister.com
# 文集导入相关方法
from django.utils.translation import gettext_lazy as _
from app_doc.models import Doc,Project,Image
from app_doc.util_upload_img import upload_generation_dir
from django.db import transaction
@ -93,7 +93,7 @@ class ImportZipProject():
except:
logger.error("未发现yaml文件")
logger.error(_("未发现yaml文件"))
project_name = zip_file_path[:-4].split('/')[-1]
project_desc = ''
project_role = 1
@ -147,7 +147,7 @@ class ImportZipProject():
create_user=create_user
)
except:
logger.exception("解析导入文件异常")
logger.exception(_("解析导入文件异常"))
# 回滚事务
transaction.savepoint_rollback(save_id)
@ -157,7 +157,7 @@ class ImportZipProject():
os.remove(zip_file_path)
return project.id
except:
logger.exception("删除临时文件异常")
logger.exception(_("删除临时文件异常"))
return None
# 处理MD内容中的静态文件
@ -201,7 +201,7 @@ class ImportZipProject():
user=create_user,
file_path=new_media_filename,
file_name=str(time.time())+'.'+file_suffix,
remark='本地上传',
remark=_('本地上传'),
)
md_content = md_content.replace(media_filename, new_media_filename)
else:
@ -238,7 +238,7 @@ class ImportDocxDoc():
user=self.create_user,
file_path=new_media_filename,
file_name=file_time_name + '.' + file_suffix,
remark='本地上传',
remark=_('本地上传'),
)
with open(new_media_file_path, 'wb') as f:
f.write(image_bytes.read())
@ -266,7 +266,7 @@ class ImportDocxDoc():
return {'status':True,'data':result}
except:
os.remove(self.docx_file_path)
return {'status':False,'data':'读取异常'}
return {'status':False,'data':_('读取异常')}
if __name__ == '__main__':
imp = ImportZipProject()

View File

@ -12,6 +12,7 @@ from selenium.webdriver.support.expected_conditions import staleness_of
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.utils import ChromeType
from django.conf import settings
from django.utils.translation import gettext_lazy as _
import sys
import json
import base64

View File

@ -5,6 +5,7 @@
# 博客地址zmister.com
# MrDoc文集文档导出相关功能代码
from django.conf import settings
from django.utils.translation import gettext_lazy as _
import subprocess
import datetime,time
import re
@ -172,6 +173,48 @@ class ReportMD():
return md_content
# 批量导出文集Markdown压缩包
class ReportMdBetch():
def __init__(self,username,project_id_list):
self.project_list = project_id_list
self.username = username
# 判断MD导出临时文件夹是否存在
if os.path.exists(settings.MEDIA_ROOT + "/reportmd_temp") is False:
os.mkdir(settings.MEDIA_ROOT + "/reportmd_temp")
# 判断用户名+日期文件夹是否存在
self.report_file_path = settings.MEDIA_ROOT + "/reportmd_temp/{}_{}".format(
self.username,datetime.datetime.strftime(datetime.datetime.now(),"%y%m%d%H%M%S")
)
is_fold = os.path.exists(self.report_file_path)
if is_fold is False:
os.mkdir(self.report_file_path)
def work(self):
# 遍历文集列表,打包每一个文集
project_file_list = []
for project_id in self.project_list:
report_func = ReportMD(project_id=project_id)
report_project_zip = report_func.work()
project_file_list.append(report_project_zip)
# 遍历打包好的文集列表,将其移入统一文件夹
for file in project_file_list:
shutil.move(file,self.report_file_path)
# 压缩打包文集合集文件夹
md_file = shutil.make_archive(
base_name=self.report_file_path,
format='zip',
root_dir=self.report_file_path
)
# print(md_file)
# 删除文件夹
shutil.rmtree(self.report_file_path)
return "{}.zip".format(self.report_file_path)
# 导出EPUB
@logger.catch()
class ReportEPUB():
@ -224,7 +267,7 @@ class ReportEPUB():
for iframe in iframe_tag:
iframe_src = iframe.get('src')
iframe.name = 'p'
iframe.string = "本格式不支持iframe视频显示视频地址为{}".format(iframe_src)
iframe.string = _("本格式不支持iframe视频显示视频地址为{}".format(iframe_src))
# 替换HTML文本中静态文件的相对链接为绝对链接
for src in src_tag:
@ -255,7 +298,7 @@ class ReportEPUB():
'id': 0,
'link': 'Text/toc_summary.xhtml',
'pid': 0,
'title': '目录'
'title': _('目录')
}
]
nav_str = '''<navMap>'''
@ -770,7 +813,7 @@ class ReportPDF():
try:
convert('file://'+temp_file_path,report_file_path)
except:
logger.exception("生成PDF出错")
logger.exception(_("生成PDF出错"))
return False
# 处理PDF文件
if os.path.exists(report_file_path):

View File

@ -1,7 +1,9 @@
# coding:utf-8
# 文档自定义模板过滤器
from app_doc.models import *
from django import template
from django.utils.translation import gettext_lazy as _
from app_doc.models import *
import re
register = template.Library()
@ -27,7 +29,7 @@ def is_colla_pro(pro,user):
if p.exists():
return ''
else:
return '【协作】'
return _('【协作】')
# 获取文档的上级文档名称
@register.filter(name='get_doc_parent')
@ -35,7 +37,7 @@ def get_doc_parent(value):
if int(value) != 0:
return Doc.objects.get(id=int(value))
else:
return '无上级文档'
return _('无上级文档')
# 获取文档的下一篇文档
@register.filter(name='get_doc_next')
@ -91,8 +93,7 @@ def get_doc_next(value):
# print("下一篇:", next_doc.id, next_doc)
return next_doc.id
except Exception as e:
import traceback
print(traceback.print_exc())
pass
# 获取文档的上一篇文档
@register.filter(name='get_doc_previous')

View File

@ -2,6 +2,7 @@
# 文档自定义模板过滤器
from app_doc.models import *
from django import template
from django.utils.translation import gettext_lazy as _
register = template.Library()
@ -16,7 +17,7 @@ def get_doc_count(value):
def get_new_doc(value):
new_doc = Doc.objects.filter(top_doc=int(value),status=1).order_by('-modify_time')[:3]
if new_doc is None:
new_doc = '它还没有文档……'
new_doc = _('它还没有文档……')
return new_doc
# 获取文集的EPUB开放导出状态

View File

@ -3,6 +3,7 @@ from django.http import HttpResponse
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required # 登录需求装饰器
from django.utils.translation import gettext_lazy as _
import datetime,time,json,base64,os,uuid
from app_doc.models import Image,ImageGroup,Attachment
from app_admin.models import SysSetting
@ -53,7 +54,7 @@ def ice_save_file(file_obj,user):
# 判断附件格式
is_images = ["jpg", "jpeg", "gif", "png", "bmp", "webp"]
if file_suffix.lower() not in allow_suffix:
return {"error": "文件格式不允许"}
return {"error": _("文件格式不允许")}
if file_suffix.lower() == 'blob':
# 粘贴上传直接默认为png就行
file_suffix = 'png'
@ -77,7 +78,7 @@ def ice_save_file(file_obj,user):
user=user,
file_path=file_url,
file_name=file_name,
remark="iceEditor上传"
remark=_("iceEditor上传")
)
else :
@ -90,7 +91,7 @@ def ice_save_file(file_obj,user):
)
return {"error":0, "name": str(file_obj),'url':file_url}
return {"error": "文件存储异常"}
return {"error": _("文件存储异常")}
# ice_url图片上传
@ -118,7 +119,7 @@ def ice_url_img_upload(url,user):
user=user,
file_path=file_url,
file_name=file_name,
remark='iceurl粘贴上传',
remark=_('iceurl粘贴上传'),
)
resp_data = {"error":0, "name": file_name,'url':file_url}
return resp_data
@ -165,7 +166,7 @@ def upload_img(request):
else:
result = url_img_upload(url_img,dir_name,request.user)
else:
result = {"success": 0, "message": "上传出错"}
result = {"success": 0, "message": _("上传出错")}
return HttpResponse(json.dumps(result), content_type="application/json")
@ -187,7 +188,7 @@ def img_upload(files, dir_name, user, group_id=None):
file_suffix = files.name.split(".")[-1] # 提取图片格式
# 判断图片格式
if file_suffix.lower() not in allow_suffix:
return {"success": 0, "message": "图片格式不正确"}
return {"success": 0, "message": _("图片格式不正确")}
# 判断图片的大小
try:
@ -197,7 +198,7 @@ def img_upload(files, dir_name, user, group_id=None):
# print(repr(e))
allow_img_size = 10485760
if files.size > allow_img_size:
return {"success": 0, "message": "图片大小超出{}MB".format(allow_img_size / 1048576)}
return {"success": 0, "message": _("图片大小超出{}MB".format(allow_img_size / 1048576))}
relative_path = upload_generation_dir(dir_name)
file_name = files.name.replace(file_suffix,'').replace('.','') + '_' +str(int(time.time())) + '.' + file_suffix
@ -213,10 +214,10 @@ def img_upload(files, dir_name, user, group_id=None):
user=user,
file_path=file_url,
file_name=file_name,
remark='本地上传',
remark=_('本地上传'),
group = group_id,
)
return {"success": 1, "url": file_url,'message':'上传图片成功'}
return {"success": 1, "url": file_url,'message':_('上传图片成功')}
# base64编码图片上传
@ -236,9 +237,9 @@ def base_img_upload(files,dir_name, user):
user = user,
file_path = file_url,
file_name=file_name,
remark = '粘贴上传',
remark = _('粘贴上传'),
)
return {"success": 1, "url": file_url, 'message': '上传图片成功'}
return {"success": 1, "url": file_url, 'message': _('上传图片成功')}
# url图片上传
@ -263,7 +264,7 @@ def url_img_upload(url,dir_name,user):
user=user,
file_path=file_url,
file_name=file_name,
remark='粘贴上传',
remark=_('粘贴上传'),
)
resp_data = {
'msg': '',

File diff suppressed because it is too large Load Diff

View File

@ -17,6 +17,7 @@ from app_doc.models import Project,Doc,DocTemp
from django.contrib.auth.models import User
from django.db.models import Q
from django.db import transaction
from django.utils.translation import gettext_lazy as _
from loguru import logger
from app_doc.report_utils import *
from app_admin.decorators import check_headers,allow_report_file
@ -43,7 +44,7 @@ def import_project(request):
file_name = import_file.name
# 限制文件大小在50mb以内
if import_file.size > 52428800:
return JsonResponse({'status': False, 'data': '文件大小超出限制'})
return JsonResponse({'status': False, 'data': _('文件大小超出限制')})
# 限制文件格式为.zip
if file_name.endswith('.zip'):
if os.path.exists(os.path.join(settings.MEDIA_ROOT,'import_temp')) is False:
@ -121,15 +122,15 @@ def import_project(request):
}
})
else:
return JsonResponse({'status':False,'data':'上传失败'})
return JsonResponse({'status':False,'data':_('上传失败')})
else:
return JsonResponse({'status':False,'data':'上传失败'})
return JsonResponse({'status':False,'data':_('上传失败')})
else:
return JsonResponse({'status':False,'data':'仅支持.zip格式'})
return JsonResponse({'status':False,'data':_('仅支持.zip格式')})
else:
return JsonResponse({'status':False,'data':'无有效文件'})
return JsonResponse({'status':False,'data':_('无有效文件')})
else:
return JsonResponse({'status':False,'data':'参数错误'})
return JsonResponse({'status':False,'data':_('参数错误')})
# 文集文档排序
@ -146,12 +147,12 @@ def project_doc_sort(request):
try:
sort_data = json.loads(sort_data)
except Exception:
return JsonResponse({'status':False,'data':'文档参数错误'})
return JsonResponse({'status':False,'data':_('文档参数错误')})
try:
Project.objects.get(id=project_id,create_user=request.user)
except ObjectDoesNotExist:
return JsonResponse({'status':False,'data':'没有匹配的文集'})
return JsonResponse({'status':False,'data':_('没有匹配的文集')})
# 修改文集信息
Project.objects.filter(id=project_id).update(
@ -194,7 +195,7 @@ def import_doc_docx(request):
file_name = import_file.name
# 限制文件大小在50mb以内
if import_file.size > 52428800:
return JsonResponse({'status': False, 'data': '文件大小超出限制'})
return JsonResponse({'status': False, 'data': _('文件大小超出限制')})
# 限制文件格式为.zip
if file_name.endswith('.docx'):
if os.path.exists(os.path.join(settings.MEDIA_ROOT, 'import_temp')) is False:
@ -213,10 +214,10 @@ def import_doc_docx(request):
).run()
return JsonResponse(import_file)
else:
return JsonResponse({'status': False, 'data': '上传失败'})
return JsonResponse({'status': False, 'data': _('上传失败')})
else:
return JsonResponse({'status': False, 'data': '仅支持.docx格式'})
return JsonResponse({'status': False, 'data': _('仅支持.docx格式')})
else:
return JsonResponse({'status': False, 'data': '无有效文件'})
return JsonResponse({'status': False, 'data': _('无有效文件')})
else:
return JsonResponse({'status': False, 'data': '参数错误'})
return JsonResponse({'status': False, 'data': _('参数错误')})

View File

@ -10,6 +10,7 @@ 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,ObjectDoesNotExist
from django.utils.translation import gettext_lazy as _
from app_doc.models import Project,Doc,DocTemp
from django.contrib.auth.models import User
from django.db.models import Q
@ -40,21 +41,21 @@ def user_center_menu(request):
menu_data = [
{
"id": 1,
"title": "仪表盘",
"title": _("仪表盘"),
"type": 1,
"icon": "layui-icon layui-icon-console",
"href": reverse('manage_overview'),
},
{
"id": "my_project",
"title": "我的文集",
"title": _("我的文集"),
"icon": "layui-icon layui-icon-component",
"type": 0,
"href": "",
"children": [
{
"id": "manage_project",
"title": "文集管理",
"title": _("文集管理"),
"icon": "layui-icon layui-icon-console",
"type": 1,
"openType": "_iframe",
@ -62,7 +63,7 @@ def user_center_menu(request):
},
{
"id": "manage_colla_self",
"title": "我的协作",
"title": _("我的协作"),
"icon": "layui-icon layui-icon-console",
"type": 1,
"openType": "_iframe",
@ -70,7 +71,7 @@ def user_center_menu(request):
},
{
"id": "import_project",
"title": "导入文集",
"title": _("导入文集"),
"icon": "layui-icon layui-icon-console",
"type": 1,
"openType": "_iframe",
@ -80,14 +81,14 @@ def user_center_menu(request):
},
{
"id": "my_doc",
"title": "我的文档",
"title": _("我的文档"),
"icon": "layui-icon layui-icon-file-b",
"type": 0,
"href": "",
"children": [
{
"id": "doc_manage",
"title": "文档管理",
"title": _("文档管理"),
"icon": "layui-icon layui-icon-face-smile",
"type": 1,
"openType": "_iframe",
@ -95,7 +96,7 @@ def user_center_menu(request):
},
{
"id": "doc_template",
"title": "文档模板",
"title": _("文档模板"),
"icon": "layui-icon layui-icon-face-cry",
"type": 1,
"openType": "_iframe",
@ -103,7 +104,7 @@ def user_center_menu(request):
},
{
"id": "doc_tag",
"title": "文档标签",
"title": _("文档标签"),
"icon": "layui-icon layui-icon-face-cry",
"type": 1,
"openType": "_iframe",
@ -111,7 +112,7 @@ def user_center_menu(request):
},
{
"id": "doc_share",
"title": "我的分享",
"title": _("我的分享"),
"icon": "layui-icon layui-icon-face-cry",
"type": 1,
"openType": "_iframe",
@ -119,7 +120,7 @@ def user_center_menu(request):
},
{
"id": "doc_recycle",
"title": "文档回收站",
"title": _("文档回收站"),
"icon": "layui-icon layui-icon-face-cry",
"type": 1,
"openType": "_iframe",
@ -129,14 +130,14 @@ def user_center_menu(request):
},
{
"id": "my_fodder",
"title": "我的素材",
"title": _("我的素材"),
"icon": "layui-icon layui-icon-upload-drag",
"type": 0,
"href": "",
"children": [
{
"id": "my_img",
"title": "我的图片",
"title": _("我的图片"),
"icon": "layui-icon layui-icon-face-smile",
"type": 1,
"openType": "_iframe",
@ -144,7 +145,7 @@ def user_center_menu(request):
},
{
"id": "my_attachment",
"title": "我的附件",
"title": _("我的附件"),
"icon": "layui-icon layui-icon-face-cry",
"type": 1,
"openType": "_iframe",
@ -154,7 +155,7 @@ def user_center_menu(request):
},
{
"id": "my_collect",
"title": "我的收藏",
"title": _("我的收藏"),
"icon": "layui-icon layui-icon-star",
"type": 1,
"openType": "_iframe",
@ -162,14 +163,14 @@ def user_center_menu(request):
},
{
"id": "self_settings",
"title": "个人管理",
"title": _("个人管理"),
"icon": "layui-icon layui-icon-set-fill",
"type": 0,
"href": "",
"children": [
{
"id": 601,
"title": "个人设置",
"title": _("个人设置"),
"icon": "layui-icon layui-icon-face-smile",
"type": 1,
"openType": "_iframe",
@ -177,7 +178,7 @@ def user_center_menu(request):
},
{
"id": 602,
"title": "Token管理",
"title": _("Token管理"),
"icon": "layui-icon layui-icon-face-cry",
"type": 1,
"openType": "_iframe",
@ -187,7 +188,7 @@ def user_center_menu(request):
},
{
"id": "user_manual",
"title": "使用手册",
"title": _("使用手册"),
"icon": "layui-icon layui-icon-template-1",
"type": 1,
"openType": "_blank",

File diff suppressed because it is too large Load Diff