This commit is contained in:
Jane Doe
2024-09-25 12:18:07 +08:00
parent 3f369584fb
commit 9992293b9f
124 changed files with 2770 additions and 975 deletions

113
WebAdmin/文章.py Normal file
View File

@@ -0,0 +1,113 @@
from django.core.paginator import Paginator
from django.http import JsonResponse
from django.core.exceptions import ValidationError
from django.utils.html import escape
from .models import Article
from django.shortcuts import get_object_or_404
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
# 文章列表页视图,带分页和请求频率限制
def article_list(request):
# 获取分页参数
page = request.GET.get('page', 1) # 当前页数,默认为第一页
limit = request.GET.get('limit', 10) # 每页文章数默认为10
# 获取所有文章,并按发布时间倒序排序
articles = Article.objects.all().order_by('-published_at')
# 使用 Paginator 进行分页
paginator = Paginator(articles, limit)
try:
current_page = paginator.page(page) # 获取当前页的数据
except PageNotAnInteger:
current_page = paginator.page(1) # 如果请求的页数不存在,默认返回第一页
except EmptyPage:
# 如果页码超出范围,返回空列表
return JsonResponse({'code': 200, 'message': '没有更多数据', 'data': {}})
# 将文章列表转换为字典列表
articles_list = list(current_page.object_list.values('id', 'chinese_title', 'english_title', 'published_at', 'status'))
# 格式化文章的发布时间
for article in articles_list:
article['published_at'] = article['published_at'].strftime('%Y-%m-%d %H:%M:%S') if article['published_at'] else '未发布'
# 返回 JSON 数据,适配前端使用
data = {
"code": 200,
"msg": "成功",
"count": paginator.count, # 文章总数
"data": articles_list
}
return JsonResponse(data)
def article_detail(request, pk, lang):
try:
# 检查是否传入了危险参数 (如防止SQL注入等)
pk = escape(pk) # 对传入的主键进行转义,避免潜在的注入风险
lang = escape(lang) # 对语言参数进行转义
# 检查参数是否有效
if not pk or not lang:
raise ValidationError('参数不能为空')
# 检查语言是否有效
if lang not in ['zh', 'en']:
return JsonResponse({
"code": 400,
"msg": "无效的语言参数",
"data": {}
})
# 获取指定的文章
article = get_object_or_404(Article, pk=pk)
# 根据语言参数返回不同语言的文章内容
if lang == 'en':
title = article.english_title
keywords = article.english_keywords
content = article.english_content
else:
title = article.chinese_title
keywords = article.chinese_keywords
content = article.chinese_content
# 构造响应数据
data = {
"code": 200,
"msg": "成功",
"data": {
'id': article.id,
'title': title,
'keywords': keywords,
'content': content,
'published_at': article.published_at.strftime('%Y-%m-%d %H:%M:%S') if article.published_at else '未发布',
'status': article.status
}
}
return JsonResponse(data)
except ValidationError as ve:
return JsonResponse({
"code": 400,
"msg": str(ve),
"data": {}
})
except Article.DoesNotExist:
return JsonResponse({
"code": 404,
"msg": "未找到对应的文章",
"data": {}
})
except Exception as e:
return JsonResponse({
"code": 500,
"msg": "服务器内部错误",
"data": {"error": str(e)}
})