P0 修复:
- 侧边栏路由不稳定: Content 区域添加 key={currentPath} 强制重渲染
- 轮播图缩略图不显示: BannerManage 导入 resolveMediaUrl + 反斜杠转正斜杠
- 超长名称导致 500: patient_handler 添加 name.len() > 255 校验
- 迁移 m20260515_000146: version 乐观锁 version+1 修复
P1 修复:
- 排班路由被冻结: routeConfig.ts 移除 /health/schedules 的 frozen 标记
- 轮播图 Switch 切换无效: 切换前先 GET 最新 version 避免乐观锁冲突
- thumbnail_url 反斜杠: media_service 存储时统一 replace('\', '/')
P2 修复:
- 预约类型 follow_up 未映射: APPOINTMENT_TYPE_MAP 补充 '随访'
- 日期选择器未汉化: DatePicker.RangePicker 添加中文 placeholder
- 轮播图 title 必填校验: banner_handler 添加空标题拒绝
- 文章分类重名: article_category_service 添加同名检查
117 lines
2.8 KiB
TypeScript
117 lines
2.8 KiB
TypeScript
import client from '../client';
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// 轮播图类型
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export interface BannerItem {
|
|
id: string;
|
|
tenant_id: string;
|
|
media_item_id: string;
|
|
title?: string;
|
|
subtitle?: string;
|
|
link_type?: string;
|
|
link_target?: string;
|
|
sort_order: number;
|
|
status: string;
|
|
start_time?: string;
|
|
end_time?: string;
|
|
image_url?: string;
|
|
thumbnail_url?: string;
|
|
media_deleted: boolean;
|
|
created_at: string;
|
|
updated_at: string;
|
|
created_by?: string;
|
|
updated_by?: string;
|
|
version: number;
|
|
}
|
|
|
|
export interface CreateBannerReq {
|
|
media_item_id: string;
|
|
title?: string;
|
|
subtitle?: string;
|
|
link_type?: string;
|
|
link_target?: string;
|
|
sort_order?: number;
|
|
status?: string;
|
|
start_time?: string;
|
|
end_time?: string;
|
|
}
|
|
|
|
export interface UpdateBannerReq {
|
|
media_item_id?: string;
|
|
title?: string;
|
|
subtitle?: string;
|
|
link_type?: string;
|
|
link_target?: string;
|
|
sort_order?: number;
|
|
status?: string;
|
|
start_time?: string;
|
|
end_time?: string;
|
|
version: number;
|
|
}
|
|
|
|
export interface SortBannerReq {
|
|
items: Array<{ id: string; sort_order: number }>;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// 轮播图 API
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export const bannerApi = {
|
|
/** 获取轮播图列表(可按状态筛选) */
|
|
list: async (status?: string) => {
|
|
const { data } = await client.get<{
|
|
success: boolean;
|
|
data: BannerItem[];
|
|
}>('/health/banners', { params: status ? { status } : undefined });
|
|
return data.data;
|
|
},
|
|
|
|
/** 获取单个轮播图 */
|
|
get: async (id: string) => {
|
|
const { data } = await client.get<{
|
|
success: boolean;
|
|
data: BannerItem;
|
|
}>(`/health/banners/${id}`);
|
|
return data.data;
|
|
},
|
|
|
|
/** 创建轮播图 */
|
|
create: async (req: CreateBannerReq) => {
|
|
const { data } = await client.post<{
|
|
success: boolean;
|
|
data: BannerItem;
|
|
}>('/health/banners', req);
|
|
return data.data;
|
|
},
|
|
|
|
/** 更新轮播图 */
|
|
update: async (id: string, req: UpdateBannerReq) => {
|
|
const { data } = await client.put<{
|
|
success: boolean;
|
|
data: BannerItem;
|
|
}>(`/health/banners/${id}`, req);
|
|
return data.data;
|
|
},
|
|
|
|
/** 删除轮播图 */
|
|
delete: async (id: string, version: number) => {
|
|
const { data } = await client.delete<{
|
|
success: boolean;
|
|
data: null;
|
|
}>(`/health/banners/${id}`, { data: { version } });
|
|
return data.data;
|
|
},
|
|
|
|
/** 轮播图排序 */
|
|
sort: async (req: SortBannerReq) => {
|
|
const { data } = await client.put<{
|
|
success: boolean;
|
|
data: null;
|
|
}>('/health/banners/sort', req);
|
|
return data.data;
|
|
},
|
|
};
|