Skip to content

完整代码清单

本章汇总友链(Link)模块涉及的全部文件,便于开发时快速查阅和复制。

后端文件清单

python
# +======================================================================
# | 模块: 友链数据模型层
# | 说明: 定义友链表结构,继承 BaseModel 获得通用字段与序列化能力
# +======================================================================
"""友链数据模型。"""

from sqlalchemy import Column, Integer, String, text

from config.database import DB_PREFIX
from core.base_model import BaseModel


class Link(BaseModel):
    """友情链接模型"""
    __tablename__ = DB_PREFIX + "link"
    __table_args__ = {"comment": "友情链接表"}

    # 链接名称
    name = Column(String(255), nullable=False, index=True, comment="链接名称")
    # 链接类型
    type = Column(String(50), default="", comment="链接类型")
    # 链接来源
    form = Column(String(50), default="", comment="链接来源")
    # 链接图片
    image = Column(String(500), default="", comment="链接图片")
    # 链接地址
    url = Column(String(500), default="", comment="链接地址")
    # 状态:0-正常 1-停用
    status = Column(Integer, default=0, server_default=text("0"), comment="状态")
    # 排序
    sort = Column(Integer, default=0, server_default=text("0"), comment="排序")
python
# +======================================================================
# | 模块: 友链请求校验模型层
# | 说明: 定义友链创建/编辑与状态更新的 Pydantic 校验模型
# +======================================================================
"""友链请求校验模型。"""

from typing import Optional

from pydantic import BaseModel, Field

from core.base_schema import BaseSchema


class LinkSchema(BaseSchema):
    """友链创建/编辑表单"""
    # 链接名称
    name: str = Field(..., min_length=1, max_length=150, description="链接名称")
    # 链接类型
    type: Optional[str] = Field(default="", max_length=50, description="链接类型")
    # 链接来源
    form: Optional[str] = Field(default="", max_length=50, description="链接来源")
    # 链接图片
    image: Optional[str] = Field(default="", max_length=500, description="链接图片")
    # 链接地址
    url: Optional[str] = Field(default="", max_length=500, description="链接地址")
    # 状态
    status: Optional[int] = Field(default=0, ge=0, le=1, description="状态")
    # 排序
    sort: Optional[int] = Field(default=0, ge=0, le=99999, description="排序")


class LinkStatusSchema(BaseModel):
    """友链状态更新表单"""
    # 记录ID
    id: int = Field(..., gt=0, description="记录ID")
    # 状态
    status: int = Field(..., ge=0, le=1, description="状态")
python
# +======================================================================
# | 模块: 友链数据访问层
# | 说明: 定义友链仓储,继承 BaseRepository 获得通用 CRUD 与软删除能力
# +======================================================================
"""友链数据访问。"""

from core.base_repository import BaseRepository
from modules.link.models import Link


class LinkRepository(BaseRepository):
    """友链数据仓库"""
    model = Link
python
# +======================================================================
# | 模块: 友链业务逻辑层
# | 说明: 定义友链服务,声明差异点(file_fields 自动处理图片),
# |       最后导出服务单例
# +======================================================================
"""友链业务逻辑。"""

from core.base_service import BaseService
from modules.link.models import Link
from modules.link.repository import LinkRepository
from modules.link.schemas import LinkSchema, LinkStatusSchema


class LinkService(BaseService):
    """友链服务"""

    # ============================================================
    # 基础声明
    # ============================================================
    model = Link
    repo_cls = LinkRepository

    # ============================================================
    # 差异点声明
    # ============================================================
    create_schema = LinkSchema
    update_schema = LinkSchema
    status_schema = LinkStatusSchema
    # 分页查询字段与排序
    page_like_fields = ("name",)
    page_eq_fields = ("type", "form", "status")
    page_order_by = (("sort", "asc"),)
    # 枚举显示名映射
    serialize_maps = {
        "type": "link_type",
        "form": "link_form",
    }
    # 文件字段:add/update 时自动 save_file,serialize 时自动补全 URL
    file_fields = ("image",)


# ======================================================================
# 服务单例
# ======================================================================
link_service = LinkService()
python
# +======================================================================
# | 模块: 友链请求处理器层
# | 说明: 承接友情链接相关的 HTTP 请求,校验权限/演示模式并记录操作日志后,
# |       转交友链服务层处理(分页、详情、增删改、状态、批量删除等)
# +======================================================================
"""友链请求处理器。"""

from common.middleware.access_decorators import check_demo, permission_required
from common.middleware.operation_log import operation_log
from core import response as R
from core.base_handler import BaseHandler
from modules.link.service import link_service


# ======================================================================
# 查询友链分页数据
# ======================================================================
class LinkPageHandler(BaseHandler):
    """查询友链分页数据。"""

    @permission_required("sys:link:list")
    async def get(self):
        """GET 请求:返回友链分页列表。"""
        return await link_service.get_page(self)


# ======================================================================
# 查询友链详情
# ======================================================================
class LinkDetailHandler(BaseHandler):
    """查询友链详情。"""

    @permission_required("sys:link:detail")
    async def get(self, id):
        """GET 请求:按 ID 返回友链详情。"""
        return R.ok(self, data=link_service.get_detail(id))


# ======================================================================
# 添加友链
# ======================================================================
class LinkAddHandler(BaseHandler):
    """添加友链。"""

    @permission_required("sys:link:add")
    @check_demo
    @operation_log("友链管理", "添加")
    async def post(self):
        """POST 请求:新增友链。"""
        return await link_service.add(self)


# ======================================================================
# 更新友链
# ======================================================================
class LinkUpdateHandler(BaseHandler):
    """更新友链。"""

    @permission_required("sys:link:update")
    @check_demo
    @operation_log("友链管理", "更新")
    async def put(self):
        """PUT 请求:更新友链信息。"""
        return await link_service.update(self)


# ======================================================================
# 删除友链
# ======================================================================
class LinkDeleteHandler(BaseHandler):
    """删除友链。"""

    @permission_required("sys:link:delete")
    @check_demo
    @operation_log("友链管理", "删除")
    async def delete(self, id):
        """DELETE 请求:按 ID 删除友链(软删除)。"""
        return await link_service.delete(self, id)


# ======================================================================
# 设置友链状态
# ======================================================================
class LinkStatusHandler(BaseHandler):
    """设置友链状态。"""

    @permission_required("sys:link:status")
    @check_demo
    @operation_log("友链管理", "设置状态")
    async def put(self):
        """PUT 请求:修改友链状态。"""
        return await link_service.update_status(self)


# ======================================================================
# 批量删除友链
# ======================================================================
class LinkBatchDeleteHandler(BaseHandler):
    """批量删除友链。"""

    @permission_required("sys:link:delete")
    @check_demo
    @operation_log("友链管理", "批量删除")
    async def post(self):
        """POST 请求:批量删除友链(软删除)。"""
        return await link_service.batch_delete(self)
python
# +======================================================================
# | 模块: 友链路由层
# | 说明: 提供友情链接的增删改查、批量删除、状态管理等 API 接口
# +======================================================================
"""友链相关路由。"""

from modules.link.handlers import (
    LinkAddHandler, LinkBatchDeleteHandler, LinkDeleteHandler,
    LinkDetailHandler, LinkPageHandler, LinkStatusHandler,
    LinkUpdateHandler,
)

routes = [
    # 查询友链分页数据
    (r"/link/page", LinkPageHandler),
    # 查询友链详情
    (r"/link/detail/(\d+)", LinkDetailHandler),
    # 添加友链
    (r"/link/add", LinkAddHandler),
    # 更新友链
    (r"/link/update", LinkUpdateHandler),
    # 删除友链
    (r"/link/delete/(\d+)", LinkDeleteHandler),
    # 设置友链状态
    (r"/link/status", LinkStatusHandler),
    # 批量删除友链
    (r"/link/batchDelete", LinkBatchDeleteHandler),
]

7. 路由注册 src/api/v1/router.py

python
# 在 _RESOURCE_MODULES 列表中追加 link 模块
from api.v1 import link

_RESOURCE_MODULES = [
    # ... 已有模块 ...
    link,
]

前端文件清单

文件说明
ui/src/api/system/link.js接口请求封装
ui/src/views/system/link/index.vue列表页面
ui/src/views/system/link/edit.vue编辑弹窗
ui/src/views/system/link/columns.js表格列定义
ui/src/views/system/link/querySchemas.js查询条件定义

文件关系图

src/modules/link/
├── models.py         ← 数据模型(继承 BaseModel)
├── schemas.py        ← 请求校验(继承 BaseSchema)
├── repository.py     ← 数据访问(继承 BaseRepository)
├── service.py        ← 业务逻辑(继承 BaseService)
└── handlers.py       ← 请求处理器(继承 BaseHandler)

src/api/v1/
├── link.py           ← 路由定义(routes 列表)
└── router.py         ← 路由注册(_RESOURCE_MODULES)

小蚂蚁云团队 · 提供技术支持