Skip to content

Commit 4f29a17

Browse files
committed
feat(pages): 页面工作台一键发布全部/一键下架全部
- 后端(上轮已入库):POST /pages/bulk-publish(重算提案→ready/basic 逐一真实发布)、/pages/bulk-unpublish(逐页真实 Unpublish) - 前端工具栏:一键发布全部(Rocket)/一键下架全部(danger,均带 Modal.confirm),完成后刷新列表 + requestConsoleMenuRefresh 联动 运行控制台菜单
1 parent 5ffae34 commit 4f29a17

2 files changed

Lines changed: 90 additions & 1 deletion

File tree

web/src/pages/PageStudio/index.tsx

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ import {
4545
regeneratePageDraft,
4646
savePageDraft,
4747
unpublishPage,
48+
bulkPublishPages,
49+
bulkUnpublishPages,
4850
} from '@/services/api/pages';
4951
import {
5052
getChangeChain,
@@ -200,6 +202,43 @@ export default function PageStudio() {
200202
[loadDrafts, message],
201203
);
202204

205+
// F:一键发布全部(ready/basic 提案走真实 accept-and-publish 链路)
206+
const [bulkLoading, setBulkLoading] = useState<'publish' | 'unpublish' | null>(null);
207+
const handleBulkPublish = useCallback(async () => {
208+
setBulkLoading('publish');
209+
try {
210+
const res = await bulkPublishPages();
211+
const published = res.published?.length ?? 0;
212+
const failed = res.failed?.length ?? 0;
213+
if (failed > 0) {
214+
message.warning(`已发布 ${published} 个页面,${failed} 个失败`);
215+
} else {
216+
message.success(`已发布 ${published} 个页面`);
217+
}
218+
requestConsoleMenuRefresh();
219+
loadDrafts();
220+
} catch {
221+
message.error('一键发布失败');
222+
} finally {
223+
setBulkLoading(null);
224+
}
225+
}, [loadDrafts]);
226+
227+
const handleBulkUnpublish = useCallback(async () => {
228+
setBulkLoading('unpublish');
229+
try {
230+
const res = await bulkUnpublishPages();
231+
const unpublished = res.unpublished?.length ?? 0;
232+
message.success(`已下架 ${unpublished} 个页面`);
233+
requestConsoleMenuRefresh();
234+
loadDrafts();
235+
} catch {
236+
message.error('一键下架失败');
237+
} finally {
238+
setBulkLoading(null);
239+
}
240+
}, [loadDrafts]);
241+
203242
const handleUnpublish = useCallback(
204243
async (pageKey: string) => {
205244
try {
@@ -671,7 +710,40 @@ export default function PageStudio() {
671710
pagination={false}
672711
toolBarRender={() => [
673712
<Button key="refresh" icon={<ReloadOutlined />} onClick={loadDrafts}>
674-
刷新草稿
713+
刷新
714+
</Button>,
715+
<Button
716+
key="bulk-publish"
717+
icon={<RocketOutlined />}
718+
loading={bulkLoading === 'publish'}
719+
onClick={() => {
720+
Modal.confirm({
721+
title: '一键发布全部',
722+
content:
723+
'将重算提案并把所有 ready/basic 提案按真实链路发布(同 scope)。确认执行?',
724+
okText: '发布',
725+
onOk: handleBulkPublish,
726+
});
727+
}}
728+
>
729+
一键发布全部
730+
</Button>,
731+
<Button
732+
key="bulk-unpublish"
733+
danger
734+
loading={bulkLoading === 'unpublish'}
735+
onClick={() => {
736+
Modal.confirm({
737+
title: '一键下架全部',
738+
content:
739+
'将下线当前 scope 内全部已发布页面(运行控制台菜单随之清空)。确认执行?',
740+
okText: '下架',
741+
okButtonProps: { danger: true },
742+
onOk: handleBulkUnpublish,
743+
});
744+
}}
745+
>
746+
一键下架全部
675747
</Button>,
676748
]}
677749
/>

web/src/services/api/pages.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,20 @@ export async function rollbackPageDraft(
176176
data: { versionId: String(version), expectedDraftRevision },
177177
});
178178
}
179+
180+
// F:一键发布全部(ready/basic 提案走真实 accept-and-publish 链路)
181+
export type PageBulkResult = {
182+
total: number;
183+
published?: string[];
184+
unpublished?: string[];
185+
skipped?: string[];
186+
failed?: { pageKey: string; error: string }[];
187+
};
188+
189+
export async function bulkPublishPages(): Promise<PageBulkResult> {
190+
return request<PageBulkResult>('/api/v1/pages/bulk-publish', { method: 'POST' });
191+
}
192+
193+
export async function bulkUnpublishPages(): Promise<PageBulkResult> {
194+
return request<PageBulkResult>('/api/v1/pages/bulk-unpublish', { method: 'POST' });
195+
}

0 commit comments

Comments
 (0)