feat(admin): 系统公告 - 支持配图草稿与自动回收

Adapted from ddcat-ai/open-ai-canvas#339

Original commit: fcdbe2aa833f31f683f709b7f409a0534ed78e20

Refs #339

Co-authored-by: 宇熙 <101980758+yuxiwl@users.noreply.github.com>
This commit is contained in:
ddCat
2026-08-29 15:16:18 +08:00
parent 791621667e
commit 6eadaa00a1
13 changed files with 811 additions and 70 deletions

View File

@@ -1,4 +1,5 @@
import { apiClient, request } from "@/services/api/request";
import { apiBaseURL, apiClient, request } from "@/services/api/request";
import type { RemoteResource } from "@/services/api/resources";
export type AnnouncementLevel = "info" | "success" | "warning" | "critical";
export type AnnouncementStatus = "active" | "closed";
@@ -7,6 +8,8 @@ export type SystemAnnouncement = {
id: string;
title: string;
content: string;
imageResourceId?: string;
imageUrl?: string;
level: AnnouncementLevel;
pinned: boolean;
status: AnnouncementStatus;
@@ -35,6 +38,13 @@ export function getAnnouncementFeed() {
return request<AnnouncementFeed>(api.get("/announcements"));
}
export function announcementImageUrl(announcement: Pick<SystemAnnouncement, "imageUrl">) {
const imageUrl = announcement.imageUrl;
if (!imageUrl || !imageUrl.startsWith("/api/")) return imageUrl || "";
const base = String(apiBaseURL).replace(/\/+$/, "");
return base === "/api" ? imageUrl : `${base}${imageUrl.slice("/api".length)}`;
}
export function markAnnouncementsRead(announcementIds: string[]) {
return request<{ unreadCount: number }>(api.post("/announcements/read", { announcementIds }));
}
@@ -43,11 +53,21 @@ export function listAdminAnnouncements(params: AdminAnnouncementListParams = {})
return request<{ announcements: SystemAnnouncement[]; total: number; page: number; limit: number }>(api.get("/admin/announcements", { params }));
}
export function createAdminAnnouncement(input: { title: string; content: string; level: AnnouncementLevel; pinned: boolean }) {
export function uploadAdminAnnouncementImage(file: File) {
const formData = new FormData();
formData.append("file", file, file.name);
return request<{ resource: RemoteResource }>(api.post("/admin/announcement-images", formData));
}
export function discardAdminAnnouncementImage(id: string) {
return request<{ ok: boolean }>(api.delete(`/admin/announcement-images/${encodeURIComponent(id)}`));
}
export function createAdminAnnouncement(input: { title: string; content: string; imageResourceId?: string; level: AnnouncementLevel; pinned: boolean }) {
return request<{ announcement: SystemAnnouncement }>(api.post("/admin/announcements", input));
}
export function updateAdminAnnouncement(id: string, input: { title: string; content: string; level: AnnouncementLevel; pinned: boolean }) {
export function updateAdminAnnouncement(id: string, input: { title: string; content: string; imageResourceId?: string; level: AnnouncementLevel; pinned: boolean }) {
return request<{ announcement: SystemAnnouncement }>(api.patch(`/admin/announcements/${encodeURIComponent(id)}`, input));
}