Become a sponsor

本章汇总友链(Link)模块涉及的全部文件,便于开发时快速查阅和复制。
src/modules/link/models.py # +======================================================================
# | 模块: 友链数据模型层
# | 说明: 定义友链表结构,继承 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="排序")src/modules/link/schemas.py # +======================================================================
# | 模块: 友链请求校验模型层
# | 说明: 定义友链创建/编辑与状态更新的 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="状态")src/modules/link/repository.py # +======================================================================
# | 模块: 友链数据访问层
# | 说明: 定义友链仓储,继承 BaseRepository 获得通用 CRUD 与软删除能力
# +======================================================================
"""友链数据访问。"""
from core.base_repository import BaseRepository
from modules.link.models import Link
class LinkRepository(BaseRepository):
"""友链数据仓库"""
model = Linksrc/modules/link/service.py # +======================================================================
# | 模块: 友链业务逻辑层
# | 说明: 定义友链服务,声明差异点(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()src/modules/link/handlers.py # +======================================================================
# | 模块: 友链请求处理器层
# | 说明: 承接友情链接相关的 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)src/api/v1/link.py # +======================================================================
# | 模块: 友链路由层
# | 说明: 提供友情链接的增删改查、批量删除、状态管理等 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),
]src/api/v1/router.py # 在 _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)