diff --git a/frontend/src/features/admin/api/adminAnnouncements.ts b/frontend/src/features/admin/api/adminAnnouncements.ts new file mode 100644 index 0000000..c946c72 --- /dev/null +++ b/frontend/src/features/admin/api/adminAnnouncements.ts @@ -0,0 +1,58 @@ +import { apiClient } from '@/shared/api/client' +import type { ApiResponse } from '@/shared/types/types' +import type { Announcement, PaginatedResult } from './announcements' + +export interface CreateAnnouncementRequest { + title: string + content: string + category: 'notice' | 'tutorial' | 'rule' | 'faq' + priority?: number + is_pinned?: boolean + is_important?: boolean +} + +export interface UpdateAnnouncementRequest { + title?: string + content?: string + category?: 'notice' | 'tutorial' | 'rule' | 'faq' + priority?: number + is_pinned?: boolean + is_important?: boolean +} + +export async function fetchAdminAnnouncements(params: { + status?: string + category?: string + page?: number + page_size?: number +}): Promise> { + const { data } = await apiClient.get>>('/admin/announcements', { params }) + return data.data +} + +export async function fetchAdminAnnouncementDetail(id: number): Promise { + const { data } = await apiClient.get>(`/admin/announcements/${id}`) + return data.data +} + +export async function createAnnouncement(req: CreateAnnouncementRequest): Promise { + const { data } = await apiClient.post>('/admin/announcements', req) + return data.data +} + +export async function updateAnnouncement(id: number, req: UpdateAnnouncementRequest): Promise { + const { data } = await apiClient.put>(`/admin/announcements/${id}`, req) + return data.data +} + +export async function publishAnnouncement(id: number): Promise { + await apiClient.post(`/admin/announcements/${id}/publish`) +} + +export async function archiveAnnouncement(id: number): Promise { + await apiClient.post(`/admin/announcements/${id}/archive`) +} + +export async function deleteAnnouncement(id: number): Promise { + await apiClient.delete(`/admin/announcements/${id}`) +} diff --git a/frontend/src/features/admin/components/AnnouncementDialog.vue b/frontend/src/features/admin/components/AnnouncementDialog.vue new file mode 100644 index 0000000..60dfea2 --- /dev/null +++ b/frontend/src/features/admin/components/AnnouncementDialog.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/frontend/src/features/admin/views/AdminAnnouncementsView.vue b/frontend/src/features/admin/views/AdminAnnouncementsView.vue new file mode 100644 index 0000000..4a2b2a5 --- /dev/null +++ b/frontend/src/features/admin/views/AdminAnnouncementsView.vue @@ -0,0 +1,330 @@ + + + + + diff --git a/frontend/src/layouts/AdminLayout.vue b/frontend/src/layouts/AdminLayout.vue index 3f170a8..b7c5794 100644 --- a/frontend/src/layouts/AdminLayout.vue +++ b/frontend/src/layouts/AdminLayout.vue @@ -1,5 +1,6 @@