[feat]:[FL-154][系统消息页面一致性优化]

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
chengkai3
2026-06-20 06:56:17 +08:00
parent 012b62fab9
commit a9a2d32fd5
8 changed files with 227 additions and 62 deletions
+3
View File
@@ -9,6 +9,7 @@ from ...schemas.system_message import (
SystemMessageListResponse,
SystemMessageMarkReadRequest,
SystemMessagePublic,
SystemMessageType,
)
from ...services.system_message_service import (
create_system_message,
@@ -37,6 +38,7 @@ def get_my_messages(
limit: int = Query(default=50, ge=1, le=200),
offset: int = Query(default=0, ge=0),
unread_only: bool = Query(default=False),
message_type: SystemMessageType | None = Query(default=None),
current_user: CurrentUser = Depends(get_current_user),
db: Session = Depends(get_db),
) -> SystemMessageListResponse:
@@ -47,6 +49,7 @@ def get_my_messages(
limit=limit,
offset=offset,
unread_only=unread_only,
message_type=message_type,
)
return SystemMessageListResponse(
items=[SystemMessagePublic.model_validate(m) for m in messages],
+4 -2
View File
@@ -3,6 +3,8 @@ from typing import Literal
from pydantic import BaseModel, ConfigDict, Field
SystemMessageType = Literal["info", "warning", "error", "success"]
class SystemMessagePublic(BaseModel):
model_config = ConfigDict(from_attributes=True)
@@ -10,7 +12,7 @@ class SystemMessagePublic(BaseModel):
id: str
title: str
content: str
message_type: str
message_type: SystemMessageType
target_user_id: str | None
is_read: bool
created_at: datetime
@@ -26,7 +28,7 @@ class SystemMessageListResponse(BaseModel):
class SystemMessageCreateRequest(BaseModel):
title: str = Field(min_length=1, max_length=255)
content: str = Field(min_length=1)
message_type: Literal["info", "warning", "error", "success"] = Field(default="info")
message_type: SystemMessageType = Field(default="info")
target_user_id: str | None = Field(default=None, description="发送给特定用户,为空则全员广播")
+12 -9
View File
@@ -5,7 +5,7 @@ from sqlalchemy import delete, func, select, update
from sqlalchemy.orm import Session
from ..models.system_message import SystemMessage
from ..schemas.system_message import SystemMessageCreateRequest
from ..schemas.system_message import SystemMessageCreateRequest, SystemMessageType
if TYPE_CHECKING:
from ..schemas.system_message import SystemMessagePublic
@@ -34,20 +34,23 @@ def list_user_messages(
limit: int = 50,
offset: int = 0,
unread_only: bool = False,
message_type: SystemMessageType | None = None,
) -> tuple[list[SystemMessage], int, int]:
"""获取用户的系统消息列表"""
# 构建查询条件:全员广播或者特定用户
query = select(SystemMessage).where(
(SystemMessage.target_user_id == user_id) | (SystemMessage.target_user_id.is_(None))
)
base_conditions = [
(SystemMessage.target_user_id == user_id) | (SystemMessage.target_user_id.is_(None)),
]
if unread_only:
query = query.where(SystemMessage.is_read == False)
base_conditions.append(SystemMessage.is_read == False)
if message_type:
base_conditions.append(SystemMessage.message_type == message_type)
query = select(SystemMessage).where(*base_conditions)
# 获取总数
total_query = select(func.count()).select_from(SystemMessage).where(
(SystemMessage.target_user_id == user_id) | (SystemMessage.target_user_id.is_(None))
)
total_query = select(func.count()).select_from(SystemMessage).where(*base_conditions)
total = db.scalar(total_query)
# 获取未读数
+38 -1
View File
@@ -6,7 +6,11 @@ from sqlalchemy.orm import Session
from app.core.database import Base
from app.models.system_message import SystemMessage
from app.schemas.system_message import SystemMessageCreateRequest
from app.services.system_message_service import create_system_message, delete_system_message
from app.services.system_message_service import (
create_system_message,
delete_system_message,
list_user_messages,
)
def test_delete_system_message_removes_existing_message() -> None:
@@ -37,3 +41,36 @@ def test_delete_system_message_returns_false_when_missing() -> None:
deleted = delete_system_message(db, "missing-message-id")
assert deleted is False
def test_list_user_messages_filters_items_and_total_by_type() -> None:
engine = create_engine("sqlite+pysqlite:///:memory:")
Base.metadata.create_all(bind=engine, tables=[SystemMessage.__table__])
with Session(engine) as db:
info_message = create_system_message(
db,
SystemMessageCreateRequest(
title="通知",
content="测试内容",
message_type="info",
),
)
create_system_message(
db,
SystemMessageCreateRequest(
title="警告",
content="测试内容",
message_type="warning",
),
)
messages, total, unread_count = list_user_messages(
db,
user_id="user-1",
message_type="info",
)
assert [message.id for message in messages] == [info_message.id]
assert total == 1
assert unread_count == 2