From 873062b931d8902821271325d61f42733f18b79e Mon Sep 17 00:00:00 2001 From: molanp <104612722+molanp@users.noreply.github.com> Date: Tue, 9 Sep 2025 13:43:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E4=BF=AE=E5=A4=8D=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E4=B8=AD=E5=AF=B9=E6=9C=AC=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=9A=84=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 ImageCell 中添加对 Path 类型的支持,并在验证器中处理路径解析 - 优化 ShopManage 和 SignManage 类中的代码,使用新的 ImageCell 构造方式 - 更新 TableData 类中的注释,提高代码可读性 --- zhenxun/builtin_plugins/shop/_data_source.py | 14 +++--- .../builtin_plugins/sign_in/_data_source.py | 2 +- zhenxun/ui/models/core/table.py | 45 ++++++++++++------- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/zhenxun/builtin_plugins/shop/_data_source.py b/zhenxun/builtin_plugins/shop/_data_source.py index f3583a7d..ab957332 100644 --- a/zhenxun/builtin_plugins/shop/_data_source.py +++ b/zhenxun/builtin_plugins/shop/_data_source.py @@ -132,7 +132,7 @@ async def gold_rank(session: Uninfo, group_id: str | None, num: int) -> bytes | else TextCell(content=""), TextCell(content=uid2name.get(user[0]) or user[0]), TextCell(content=str(user[1]), bold=True), - ImageCell(src=platform_path.resolve().as_uri()) + ImageCell(src=platform_path) if (platform_path := PLATFORM_PATH.get(platform)) else TextCell(content=""), ] @@ -532,15 +532,15 @@ class ShopManage: icon = "" if prop.icon: icon_path = ICON_PATH / prop.icon - icon = (icon_path, 33, 33) if icon_path.exists() else "" + icon = icon_path if icon_path.exists() else "" table_rows.append( [ - icon, - i, - prop.goods_name, - user.props[prop_uuid], - prop.goods_description, + ImageCell(src=icon, height=33, width=33), + TextCell(content=i), + TextCell(content=prop.goods_name), + TextCell(content=user.props[prop_uuid]), + TextCell(content=prop.goods_description), ] ) diff --git a/zhenxun/builtin_plugins/sign_in/_data_source.py b/zhenxun/builtin_plugins/sign_in/_data_source.py index ec64083b..d979c3d7 100644 --- a/zhenxun/builtin_plugins/sign_in/_data_source.py +++ b/zhenxun/builtin_plugins/sign_in/_data_source.py @@ -91,7 +91,7 @@ class SignManage: TextCell(content=uid2name.get(user[0]) or user[0]), TextCell(content=str(user[1]), bold=True), TextCell(content=str(user[2])), - ImageCell(src=platform_path.resolve().as_uri()) + ImageCell(src=platform_path) if (platform_path := PLATFORM_PATH.get(platform)) else TextCell(content=""), ] diff --git a/zhenxun/ui/models/core/table.py b/zhenxun/ui/models/core/table.py index 15724bef..daef088b 100644 --- a/zhenxun/ui/models/core/table.py +++ b/zhenxun/ui/models/core/table.py @@ -1,6 +1,8 @@ +from pathlib import Path from typing import Literal -from pydantic import BaseModel, Field +from nonebot.compat import field_validator +from pydantic import BaseModel from ...models.components.progress_bar import ProgressBar from .base import RenderableComponent @@ -28,7 +30,7 @@ class TextCell(BaseCell): """文本单元格""" type: Literal["text"] = "text" # type: ignore - content: str + content: str | float bold: bool = False color: str | None = None @@ -37,12 +39,18 @@ class ImageCell(BaseCell): """图片单元格""" type: Literal["image"] = "image" # type: ignore - src: str + src: str | Path width: int = 40 height: int = 40 shape: Literal["square", "circle"] = "square" alt: str = "image" + @field_validator("src", mode="before") + def validate_src(cls, v: str) -> str: + if isinstance(v, Path): + v = v.resolve().as_uri() + return v + class StatusBadgeCell(BaseCell): """状态徽章单元格""" @@ -62,9 +70,12 @@ class RichTextCell(BaseCell): """富文本单元格,支持多个带样式的文本片段""" type: Literal["rich_text"] = "rich_text" # type: ignore - spans: list[TextSpan] = Field(default_factory=list, description="文本片段列表") - direction: Literal["column", "row"] = Field("column", description="片段排列方向") - gap: str = Field("4px", description="片段之间的间距") + spans: list[TextSpan] = [] + """文本片段列表""" + direction: Literal["column", "row"] = "column" + """片段排列方向""" + gap: str = "4px" + """片段之间的间距""" TableCell = ( @@ -84,16 +95,18 @@ class TableData(RenderableComponent): """通用表格的数据模型""" style_name: str | None = None - title: str = Field(..., description="表格主标题") - tip: str | None = Field(None, description="表格下方的提示信息") - headers: list[str] = Field(default_factory=list, description="表头列表") - rows: list[list[TableCell]] = Field(default_factory=list, description="数据行列表") - column_alignments: list[Literal["left", "center", "right"]] | None = Field( - default=None, description="每列的对齐方式" - ) - column_widths: list[str | int] | None = Field( - default=None, description="每列的宽度 (e.g., ['50px', 'auto', 100])" - ) + title: str + """表格主标题""" + tip: str | None = None + """表格下方的提示信息""" + headers: list[str] = [] # noqa: RUF012 + """表头列表""" + rows: list[list[TableCell]] = [] # noqa: RUF012 + """数据行列表""" + column_alignments: list[Literal["left", "center", "right"]] | None = None + """每列的对齐方式""" + column_widths: list[str | int] | None = None + """每列的宽度 (e.g., ['50px', 'auto', 100])""" @property def template_name(self) -> str: