feat: 本次提交更新内容如下

存一下
This commit is contained in:
笔记本里的永平
2025-07-23 19:19:31 +08:00
parent 0baf08b95b
commit 76b509b362
3 changed files with 204 additions and 204 deletions

View File

@@ -1,198 +1,198 @@
import React, { useState, useEffect, useCallback } from "react";
import { useParams, useNavigate } from "react-router-dom";
import { Button, Switch, message, Spin } from "antd";
import NavCommon from "@/components/NavCommon";
import { EditOutlined } from "@ant-design/icons";
import Layout from "@/components/Layout/Layout";
import style from "./index.module.scss";
import request from "@/api/request";
interface MomentsSyncTask {
id: string;
name: string;
status: 1 | 2;
deviceCount: number;
syncCount: number;
lastSyncTime: string;
createTime: string;
creatorName: string;
updateTime?: string;
maxSyncPerDay?: number;
syncInterval?: number;
timeRange?: { start: string; end: string };
contentTypes?: string[];
targetTags?: string[];
todaySyncCount?: number;
totalSyncCount?: number;
syncMode?: string;
config?: {
devices?: string[];
contentLibraryNames?: string[];
syncCount?: number;
};
}
const getStatusText = (status: number) => {
switch (status) {
case 1:
return "进行中";
case 2:
return "已暂停";
default:
return "未知";
}
};
const MomentsSyncDetail: React.FC = () => {
const { id } = useParams();
const navigate = useNavigate();
const [task, setTask] = useState<MomentsSyncTask | null>(null);
const [loading, setLoading] = useState(false);
const fetchTaskDetail = useCallback(async () => {
if (!id) return;
setLoading(true);
try {
const res = await request("/v1/workbench/detail", { id }, "GET");
if (res) setTask(res);
} catch {
message.error("获取任务详情失败");
} finally {
setLoading(false);
}
}, [id]);
useEffect(() => {
if (id) fetchTaskDetail();
}, [id, fetchTaskDetail]);
const handleToggleStatus = async () => {
if (!task || !id) return;
try {
const newStatus = task.status === 1 ? 2 : 1;
await request(
"/v1/workbench/update-status",
{ id, status: newStatus },
"POST"
);
setTask({ ...task, status: newStatus });
message.success(newStatus === 1 ? "任务已开启" : "任务已暂停");
} catch {
message.error("操作失败");
}
};
const handleEdit = () => {
if (id) navigate(`/workspace/moments-sync/edit/${id}`);
};
if (loading) {
return (
<Layout>
<div className={style.detailLoading}>
<Spin size="large" />
</div>
</Layout>
);
}
if (!task) {
return (
<Layout>
<div className={style.detailLoading}>
<div></div>
<Button onClick={() => navigate("/workspace/moments-sync")}>
</Button>
</div>
</Layout>
);
}
return (
<Layout
header={
<NavCommon
title="查看朋友圈同步任务"
right={
<Button
icon={<EditOutlined />}
onClick={handleEdit}
className={style.editBtn}
type="primary"
>
</Button>
}
/>
}
>
<div className={style.detailBg}>
<div className={style.detailCard}>
<div className={style.detailTop}>
<div className={style.detailTitle}>{task.name}</div>
<span
className={
task.status === 1
? style.statusPill + " " + style.statusActive
: style.statusPill + " " + style.statusPaused
}
>
{getStatusText(task.status)}
</span>
<Switch
checked={task.status === 1}
onChange={handleToggleStatus}
className={style.switchBtn}
size="small"
/>
</div>
<div
style={{
display: "flex",
justifyContent: "space-between",
marginTop: 16,
}}
>
<div>
<div style={{ fontWeight: 500, marginBottom: 8 }}></div>
<div style={{ fontSize: 14, color: "#222", marginBottom: 4 }}>
{task.config?.devices?.length || 0}
</div>
<div style={{ fontSize: 14, color: "#222", marginBottom: 4 }}>
{task.config?.contentLibraryNames?.join("") || "-"}
</div>
<div style={{ fontSize: 14, color: "#222", marginBottom: 4 }}>
{task.syncCount || 0}
</div>
<div style={{ fontSize: 14, color: "#222" }}>
{task.creatorName}
</div>
</div>
<div>
<div style={{ fontWeight: 500, marginBottom: 8 }}></div>
<div style={{ fontSize: 14, color: "#222", marginBottom: 4 }}>
{task.createTime}
</div>
<div style={{ fontSize: 14, color: "#222" }}>
{task.lastSyncTime || "无"}
</div>
</div>
</div>
<div
style={{
borderTop: "1px solid #f0f0f0",
margin: "16px 0 0 0",
paddingTop: 12,
}}
>
<div style={{ fontWeight: 500, marginBottom: 8 }}></div>
<div style={{ color: "#888", fontSize: 14 }}></div>
</div>
</div>
</div>
</Layout>
);
};
export default MomentsSyncDetail;
import React, { useState, useEffect, useCallback } from "react";
import { useParams, useNavigate } from "react-router-dom";
import { Button, Switch, message, Spin } from "antd";
import NavCommon from "@/components/NavCommon";
import { EditOutlined } from "@ant-design/icons";
import Layout from "@/components/Layout/Layout";
import style from "./index.module.scss";
import request from "@/api/request";
interface MomentsSyncTask {
id: string;
name: string;
status: 1 | 2;
deviceCount: number;
syncCount: number;
lastSyncTime: string;
createTime: string;
creatorName: string;
updateTime?: string;
maxSyncPerDay?: number;
syncInterval?: number;
timeRange?: { start: string; end: string };
contentTypes?: string[];
targetTags?: string[];
todaySyncCount?: number;
totalSyncCount?: number;
syncMode?: string;
config?: {
devices?: string[];
contentLibraryNames?: string[];
syncCount?: number;
};
}
const getStatusText = (status: number) => {
switch (status) {
case 1:
return "进行中";
case 2:
return "已暂停";
default:
return "未知";
}
};
const MomentsSyncDetail: React.FC = () => {
const { id } = useParams();
const navigate = useNavigate();
const [task, setTask] = useState<MomentsSyncTask | null>(null);
const [loading, setLoading] = useState(false);
const fetchTaskDetail = useCallback(async () => {
if (!id) return;
setLoading(true);
try {
const res = await request("/v1/workbench/detail", { id }, "GET");
if (res) setTask(res);
} catch {
message.error("获取任务详情失败");
} finally {
setLoading(false);
}
}, [id]);
useEffect(() => {
if (id) fetchTaskDetail();
}, [id, fetchTaskDetail]);
const handleToggleStatus = async () => {
if (!task || !id) return;
try {
const newStatus = task.status === 1 ? 2 : 1;
await request(
"/v1/workbench/update-status",
{ id, status: newStatus },
"POST"
);
setTask({ ...task, status: newStatus });
message.success(newStatus === 1 ? "任务已开启" : "任务已暂停");
} catch {
message.error("操作失败");
}
};
const handleEdit = () => {
if (id) navigate(`/workspace/moments-sync/edit/${id}`);
};
if (loading) {
return (
<Layout>
<div className={style.detailLoading}>
<Spin size="large" />
</div>
</Layout>
);
}
if (!task) {
return (
<Layout>
<div className={style.detailLoading}>
<div></div>
<Button onClick={() => navigate("/workspace/moments-sync")}>
</Button>
</div>
</Layout>
);
}
return (
<Layout
header={
<NavCommon
title="查看朋友圈同步任务"
right={
<Button
icon={<EditOutlined />}
onClick={handleEdit}
className={style.editBtn}
type="primary"
>
</Button>
}
/>
}
>
<div className={style.detailBg}>
<div className={style.detailCard}>
<div className={style.detailTop}>
<div className={style.detailTitle}>{task.name}</div>
<span
className={
task.status === 1
? style.statusPill + " " + style.statusActive
: style.statusPill + " " + style.statusPaused
}
>
{getStatusText(task.status)}
</span>
<Switch
checked={task.status === 1}
onChange={handleToggleStatus}
className={style.switchBtn}
size="small"
/>
</div>
<div
style={{
display: "flex",
justifyContent: "space-between",
marginTop: 16,
}}
>
<div>
<div style={{ fontWeight: 500, marginBottom: 8 }}></div>
<div style={{ fontSize: 14, color: "#222", marginBottom: 4 }}>
{task.config?.devices?.length || 0}
</div>
<div style={{ fontSize: 14, color: "#222", marginBottom: 4 }}>
{task.config?.contentLibraryNames?.join("") || "-"}
</div>
<div style={{ fontSize: 14, color: "#222", marginBottom: 4 }}>
{task.syncCount || 0}
</div>
<div style={{ fontSize: 14, color: "#222" }}>
{task.creatorName}
</div>
</div>
<div>
<div style={{ fontWeight: 500, marginBottom: 8 }}></div>
<div style={{ fontSize: 14, color: "#222", marginBottom: 4 }}>
{task.createTime}
</div>
<div style={{ fontSize: 14, color: "#222" }}>
{task.lastSyncTime || "无"}
</div>
</div>
</div>
<div
style={{
borderTop: "1px solid #f0f0f0",
margin: "16px 0 0 0",
paddingTop: 12,
}}
>
<div style={{ fontWeight: 500, marginBottom: 8 }}></div>
<div style={{ color: "#888", fontSize: 14 }}></div>
</div>
</div>
</div>
</Layout>
);
};
export default MomentsSyncDetail;

View File

@@ -235,8 +235,7 @@
.detailBg {
background: #f8f6f3;
min-height: 100vh;
padding: 24px 0 32px 0;
padding:12px;
display: flex;
flex-direction: column;
align-items: center;

View File

@@ -32,7 +32,7 @@ const defaultForm = {
accountType: "business" as "business" | "personal", // 仅UI用
enabled: true,
selectedDevices: [] as string[],
selectedLibraries: [] as (string | number)[],
selectedLibraries: [] as any[], // 存完整内容库对象数组
contentTypes: ["text", "image", "video"],
targetTags: [] as string[],
filterKeywords: [] as string[],
@@ -63,7 +63,8 @@ const NewMomentsSync: React.FC = () => {
accountType: res.accountType === 1 ? "business" : "personal",
enabled: res.status === 1,
selectedDevices: res.config?.devices || [],
selectedLibraries: res.config?.contentLibraryNames || [],
// 关键用id字符串数组回填
selectedLibraries: res.config?.contentLibraries || [], // 直接用对象数组
contentTypes: res.config?.contentTypes || ["text", "image", "video"],
targetTags: res.config?.targetTags || [],
filterKeywords: res.config?.filterKeywords || [],
@@ -117,7 +118,7 @@ const NewMomentsSync: React.FC = () => {
const params = {
name: formData.taskName,
devices: formData.selectedDevices,
contentLibraries: formData.selectedLibraries.map(Number),
contentLibraries: formData.selectedLibraries.map((lib: any) => lib.id),
syncInterval: formData.syncInterval,
syncCount: formData.syncCount,
syncType: formData.syncType, // 账号类型真实传参
@@ -133,7 +134,7 @@ const NewMomentsSync: React.FC = () => {
if (isEditMode && id) {
await updateMomentsSync({ id, ...params });
message.success("更新成功");
navigate(`/workspace/moments-sync/${id}`);
navigate(`/workspace/moments-sync`);
} else {
await createMomentsSync(params);
message.success("创建成功");