feat(公开内容): 添加临时文件上传功能,支持1小时/1天/7天过期
This commit is contained in:
@@ -59,7 +59,8 @@ from .forms import (
|
||||
FamilyTaskForm,
|
||||
TodayPlanForm,
|
||||
SystemConfigForm,
|
||||
PublicContentForm
|
||||
PublicContentForm,
|
||||
TempUploadForm
|
||||
)
|
||||
|
||||
# 首页视图
|
||||
@@ -927,6 +928,70 @@ def api_submit_summary(request):
|
||||
logger.error(f"API: 提交汇总记录失败: {str(e)}")
|
||||
return JsonResponse({'success': False, 'message': f"提交失败: {str(e)}"}, status=500)
|
||||
|
||||
@csrf_exempt
|
||||
def api_temp_upload(request):
|
||||
"""API临时文件上传"""
|
||||
logger.info("API: 收到临时文件上传请求")
|
||||
|
||||
if request.method != 'POST':
|
||||
return JsonResponse({'success': False, 'message': '只支持POST请求'}, status=405)
|
||||
|
||||
try:
|
||||
title = request.POST.get('title', '').strip()
|
||||
expire_type = request.POST.get('expire_type', '').strip()
|
||||
file = request.FILES.get('file')
|
||||
|
||||
if not title:
|
||||
return JsonResponse({'success': False, 'message': '标题不能为空'}, status=400)
|
||||
|
||||
if not file:
|
||||
return JsonResponse({'success': False, 'message': '文件不能为空'}, status=400)
|
||||
|
||||
if expire_type not in ['expire_1h', 'expire_1d', 'expire_7d']:
|
||||
return JsonResponse({'success': False, 'message': '无效的过期类型'}, status=400)
|
||||
|
||||
try:
|
||||
public_content_type = PublicContentType.objects.get(name='临时文件')
|
||||
except PublicContentType.DoesNotExist:
|
||||
public_content_type = PublicContentType.objects.create(name='临时文件')
|
||||
|
||||
expire_delta_map = {
|
||||
'expire_1h': timedelta(hours=1),
|
||||
'expire_1d': timedelta(days=1),
|
||||
'expire_7d': timedelta(days=7),
|
||||
}
|
||||
expire_at = timezone.now() + expire_delta_map[expire_type]
|
||||
|
||||
temp_content = PublicContent.objects.create(
|
||||
type=public_content_type,
|
||||
title=title,
|
||||
file=file,
|
||||
is_published=True,
|
||||
is_temp_file=True,
|
||||
expire_type=expire_type,
|
||||
expire_at=expire_at,
|
||||
)
|
||||
|
||||
file_url = request.build_absolute_uri(temp_content.file.url) if temp_content.file else None
|
||||
file_size = temp_content.file.size if temp_content.file else 0
|
||||
|
||||
logger.info(f"API: 临时文件创建成功,ID={temp_content.id}, 过期时间={expire_at}")
|
||||
return JsonResponse({
|
||||
'success': True,
|
||||
'message': '上传成功',
|
||||
'id': temp_content.id,
|
||||
'file_url': file_url,
|
||||
'file_name': temp_content.file.name.split('/')[-1] if temp_content.file else None,
|
||||
'file_size': file_size,
|
||||
'expire_at': expire_at.isoformat(),
|
||||
'expire_type': expire_type,
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"API: 临时文件上传失败: {str(e)}")
|
||||
return JsonResponse({'success': False, 'message': f"上传失败: {str(e)}"}, status=500)
|
||||
|
||||
|
||||
# 获取syslog日志记录器(用于fail2ban检测)
|
||||
syslog_logger = logging.getLogger('django.security.login')
|
||||
|
||||
@@ -979,21 +1044,22 @@ def user_logout(request):
|
||||
def public_content(request):
|
||||
"""公开内容页面 - 无需登录"""
|
||||
logger.info("用户访问公开内容页面")
|
||||
# 获取所有已发布的公开内容
|
||||
public_contents = PublicContent.objects.filter(is_published=True)
|
||||
|
||||
# 按类型分组
|
||||
|
||||
content_by_type = {}
|
||||
for content in public_contents:
|
||||
type_name = content.type.name
|
||||
if type_name not in content_by_type:
|
||||
content_by_type[type_name] = []
|
||||
content_by_type[type_name].append(content)
|
||||
|
||||
|
||||
temp_upload_form = TempUploadForm()
|
||||
|
||||
context = {
|
||||
'content_by_type': content_by_type,
|
||||
'temp_upload_form': temp_upload_form,
|
||||
}
|
||||
|
||||
|
||||
return render(request, 'core/public_content.html', context)
|
||||
|
||||
# 添加公开内容
|
||||
|
||||
Reference in New Issue
Block a user