feat(站内通知): 铃铛面板支持时间/内容搜索、按天分组与分页

- 列表接口加 keyword(标题/内容模糊)与 startDate/endDate(年月日闭区间)参数,
  两端控制器透传,服务端补筛选日志
- 两端铃铛面板:搜索框(防抖 300ms)+ 日期区间 + 按年月日分组 + 翻页,
  面板改 Teleport 到 body(挂在顶栏时会被页面 el-select 压住,提 z-index 无效)
- 固化可见范围回归测试:超管全量/管理员只看本组/普通用户只看自己,
  含读写两侧的 user_id+audience 裁剪断言与两端控制器身份来源断言
This commit is contained in:
2026-09-13 23:59:06 +08:00
parent 9ffd68bae5
commit ff1ffbbfa3
18 changed files with 1426 additions and 136 deletions
@@ -38,14 +38,45 @@ export function fetchNotificationSummary() {
)
}
export function fetchNotificationList(params: { page?: number; pageSize?: number; onlyUnread?: boolean } = {}) {
/** 列表查询参数:关键字匹配标题/内容;startDate/endDate 为年月日闭区间(yyyy-MM-dd)。 */
export interface NotificationListParams {
page?: number
pageSize?: number
onlyUnread?: boolean
keyword?: string
startDate?: string
endDate?: string
}
/**
* 列表查询参数:关键字匹配标题/内容;startDate/endDate 为年月日闭区间(yyyy-MM-dd)。
* 空关键字/日期一律不下发(空串会让后端日期绑定失败返回 400)。
*/
export function buildNotificationListQuery(
params: NotificationListParams = {},
): Record<string, string | number> {
const query: Record<string, string | number> = {
page: params.page ?? 1,
pageSize: params.pageSize ?? 20,
onlyUnread: params.onlyUnread ? 'true' : 'false',
}
const keyword = (params.keyword ?? '').trim()
if (keyword) {
query.keyword = keyword
}
if (params.startDate) {
query.startDate = params.startDate
}
if (params.endDate) {
query.endDate = params.endDate
}
return query
}
export function fetchNotificationList(params: NotificationListParams = {}) {
return unwrapJavaResponse(
get<JavaApiResponse<NotificationPage>>(
buildJavaUrl(API_ENDPOINTS.notification.list, {
page: params.page ?? 1,
pageSize: params.pageSize ?? 20,
onlyUnread: params.onlyUnread ? 'true' : 'false',
}),
buildJavaUrl(API_ENDPOINTS.notification.list, buildNotificationListQuery(params)),
),
)
}