feat(公开内容): 添加临时文件上传功能,支持1小时/1天/7天过期

This commit is contained in:
xiaji
2026-05-25 21:08:56 +08:00
parent 3aa311b9da
commit ce7d39f36c
7 changed files with 328 additions and 87 deletions

View File

@@ -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)
# 添加公开内容