From d25b099658aa90400260ca7132dc6fc302eedb20 Mon Sep 17 00:00:00 2001 From: ngfchl Date: Tue, 7 Apr 2026 21:45:58 +0800 Subject: [PATCH] =?UTF-8?q?add.=20=E6=B7=BB=E5=8A=A0=E5=8F=8B=E6=83=85?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/schema.py | 34 ++++++++++++++++++++++ base/views.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/base/schema.py b/base/schema.py index 4c752d9..241f892 100644 --- a/base/schema.py +++ b/base/schema.py @@ -35,3 +35,37 @@ class FriendLinkCreateSchema(Schema): url: str order: int = 0 is_active: bool = True + + +# ================= 响应模式 (Output) ================= +class PictureLinkSchema(Schema): + id: int + name: str + picture: str # 这里返回的是图片路径字符串 + url: str + order: int + is_active: bool + created_at: datetime + updated_at: datetime + + class Config: + # 如果你的 Model 字段和 Schema 字段名一致,通常不需要 orm_mode + # 但为了保险,或者如果你直接返回 Model 实例,建议开启 + from_attributes = True + + +# ================= 请求模式 (Input) ================= +class PictureLinkCreateSchema(Schema): + name: str + picture: str + url: str + order: int = 0 + is_active: bool = True + + +class PictureLinkUpdateSchema(Schema): + name: Optional[str] = None + picture: Optional[str] = None + url: Optional[str] = None + order: Optional[int] = None + is_active: Optional[bool] = None diff --git a/base/views.py b/base/views.py index 9cbf1de..ce7813b 100644 --- a/base/views.py +++ b/base/views.py @@ -5,12 +5,14 @@ from typing import Optional, List from django.conf import settings from django.http import JsonResponse +from django.shortcuts import get_object_or_404 from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_http_methods from ninja import Router -from base.models import FriendLink, LinkCategory -from base.schema import FriendLinkCreateSchema, FriendLinkSchema, LinkCategoryCreateSchema, LinkCategorySchema +from base.models import FriendLink, LinkCategory, PictureLink +from base.schema import FriendLinkCreateSchema, FriendLinkSchema, LinkCategoryCreateSchema, LinkCategorySchema, \ + PictureLinkSchema, PictureLinkCreateSchema, PictureLinkUpdateSchema # Create your views here. router = Router(tags=['base']) @@ -106,3 +108,73 @@ def update_link(request, id: int, data: FriendLinkCreateSchema): def delete_link(request, id: int): FriendLink.objects.get(id=id).delete() return {"success": True} + + +# ================= 列表与创建 ================= +@router.get("/picture-link/", response=List[PictureLinkSchema]) +def get_picture_links(request): + """ + 获取所有图片链接 + GET /api/picture-link/ + """ + # 这里的排序与 models.py 中的 Meta.ordering 保持一致 + return PictureLink.objects.all().order_by('order', '-created_at') + + +@router.post("/picture-link/", response=PictureLinkSchema) +def create_picture_link(request, payload: PictureLinkCreateSchema): + """ + 新增图片链接 + POST /api/picture-link/ + """ + # 直接利用 payload 创建对象 + # 注意:这里调用 save() 会触发你 models.py 中定义的 "最多4个启用" 的逻辑 + link = PictureLink.objects.create( + name=payload.name, + picture=payload.picture, + url=payload.url, + order=payload.order, + is_active=payload.is_active + ) + return link + + +# ================= 单个对象操作 ================= +@router.get("/picture-link/{link_id}", response=PictureLinkSchema) +def get_picture_link(request, link_id: int): + """ + 获取单个图片链接详情 + GET /api/picture-link/{id}/ + """ + return get_object_or_404(PictureLink, id=link_id) + + +@router.put("/picture-link/{link_id}", response=PictureLinkSchema) +def update_picture_link(request, link_id: int, payload: PictureLinkUpdateSchema): + """ + 更新图片链接 + PUT /api/picture-link/{id}/ + """ + link = get_object_or_404(PictureLink, id=link_id) + + # 更新字段 + if payload.name is not None: link.name = payload.name + if payload.picture is not None: link.picture = payload.picture + if payload.url is not None: link.url = payload.url + if payload.order is not None: link.order = payload.order + if payload.is_active is not None: link.is_active = payload.is_active + + # 保存,同样会触发 models.py 中的限制逻辑 + link.save() + return link + + +@router.delete("/picture-link/{link_id}") +def delete_picture_link(request, link_id: int): + """ + 删除图片链接 + DELETE /api/picture-link/{id}/ + """ + link = get_object_or_404(PictureLink, id=link_id) + link.delete() + return {"success": True}