diff --git a/Cunkebao/src/pages/workspace/moments-sync/new.tsx b/Cunkebao/src/pages/workspace/moments-sync/new.tsx
index 188d321c..b28bff06 100644
--- a/Cunkebao/src/pages/workspace/moments-sync/new.tsx
+++ b/Cunkebao/src/pages/workspace/moments-sync/new.tsx
@@ -357,7 +357,9 @@ export default function NewMomentsSyncTask() {
>
-
新建朋友圈同步
+
+ {isEditMode ? "编辑朋友圈同步" : "新建朋友圈同步"}
+
@@ -436,7 +438,7 @@ export default function NewMomentsSyncTask() {
loading={loading}
className="flex-1 h-12 bg-blue-500 hover:bg-blue-600 rounded-lg text-white"
>
- {loading ? "创建中..." : "完成"}
+ {loading ? (isEditMode ? "保存中..." : "创建中...") : "完成"}
diff --git a/nkebao/.env.development b/nkebao/.env.development
index da6a111b..6d0e088c 100644
--- a/nkebao/.env.development
+++ b/nkebao/.env.development
@@ -1,4 +1,6 @@
# 基础环境变量示例
-VITE_API_BASE_URL=http://www.yishi.com
+# VITE_API_BASE_URL=http://www.yishi.com
+VITE_API_BASE_URL=https://ckbapi.quwanzhi.com
+
VITE_APP_TITLE=Nkebao Base
diff --git a/nkebao/src/pages/content/form/index.tsx b/nkebao/src/pages/content/form/index.tsx
index 49ea7a06..ff099ed5 100644
--- a/nkebao/src/pages/content/form/index.tsx
+++ b/nkebao/src/pages/content/form/index.tsx
@@ -1,257 +1,308 @@
-import React, { useState } from "react";
-import { useNavigate } from "react-router-dom";
-import { Input as AntdInput, Switch } from "antd";
-import { Button, Collapse, Toast, DatePicker, Tabs } from "antd-mobile";
-import NavCommon from "@/components/NavCommon";
-import FriendSelection from "@/components/FriendSelection";
-import GroupSelection from "@/components/GroupSelection";
-import Layout from "@/components/Layout/Layout";
-import style from "./index.module.scss";
-import request from "@/api/request";
-
-const { TextArea } = AntdInput;
-
-function formatDate(date: Date | null) {
- if (!date) return "";
- // 格式化为 YYYY-MM-DD
- const y = date.getFullYear();
- const m = (date.getMonth() + 1).toString().padStart(2, "0");
- const d = date.getDate().toString().padStart(2, "0");
- return `${y}-${m}-${d}`;
-}
-
-export default function ContentForm() {
- const navigate = useNavigate();
- const [sourceType, setSourceType] = useState<"friends" | "groups">("friends");
- const [name, setName] = useState("");
- const [selectedFriends, setSelectedFriends] = useState([]);
- const [selectedGroups, setSelectedGroups] = useState([]);
- const [useAI, setUseAI] = useState(false);
- const [aiPrompt, setAIPrompt] = useState("");
- const [enabled, setEnabled] = useState(true);
- const [dateRange, setDateRange] = useState<[Date | null, Date | null]>([
- null,
- null,
- ]);
- const [showStartPicker, setShowStartPicker] = useState(false);
- const [showEndPicker, setShowEndPicker] = useState(false);
- const [keywordsInclude, setKeywordsInclude] = useState("");
- const [keywordsExclude, setKeywordsExclude] = useState("");
- const [submitting, setSubmitting] = useState(false);
-
- const handleSubmit = async (e?: React.FormEvent) => {
- if (e) e.preventDefault();
- if (!name.trim()) {
- Toast.show({ content: "请输入内容库名称", position: "top" });
- return;
- }
- setSubmitting(true);
- try {
- const payload = {
- name,
- sourceType: sourceType === "friends" ? 1 : 2,
- friends: selectedFriends,
- groups: selectedGroups,
- groupMembers: {},
- keywordInclude: keywordsInclude
- .split(/,|,|\n|\s+/)
- .map((s) => s.trim())
- .filter(Boolean),
- keywordExclude: keywordsExclude
- .split(/,|,|\n|\s+/)
- .map((s) => s.trim())
- .filter(Boolean),
- aiPrompt,
- timeEnabled: dateRange[0] || dateRange[1] ? 1 : 0,
- startTime: dateRange[0] ? formatDate(dateRange[0]) : "",
- endTime: dateRange[1] ? formatDate(dateRange[1]) : "",
- status: enabled ? 1 : 0,
- };
- await request("/v1/content/library/create", payload, "POST");
- Toast.show({ content: "创建成功", position: "top" });
- navigate("/content");
- } catch (e: any) {
- Toast.show({ content: e?.message || "创建失败", position: "top" });
- } finally {
- setSubmitting(false);
- }
- };
-
- return (
- }
- footer={
-
-
-
- }
- >
-
-
- );
-}
+import React, { useState, useEffect } from "react";
+import { useNavigate, useParams } from "react-router-dom";
+import { Input as AntdInput, Switch } from "antd";
+import { Button, Collapse, Toast, DatePicker, Tabs } from "antd-mobile";
+import NavCommon from "@/components/NavCommon";
+import FriendSelection from "@/components/FriendSelection";
+import GroupSelection from "@/components/GroupSelection";
+import Layout from "@/components/Layout/Layout";
+import style from "./index.module.scss";
+import request from "@/api/request";
+import { getContentLibraryDetail, updateContentLibrary } from "./api";
+
+const { TextArea } = AntdInput;
+
+function formatDate(date: Date | null) {
+ if (!date) return "";
+ // 格式化为 YYYY-MM-DD
+ const y = date.getFullYear();
+ const m = (date.getMonth() + 1).toString().padStart(2, "0");
+ const d = date.getDate().toString().padStart(2, "0");
+ return `${y}-${m}-${d}`;
+}
+
+export default function ContentForm() {
+ const navigate = useNavigate();
+ const { id } = useParams<{ id?: string }>();
+ const isEdit = !!id;
+ const [sourceType, setSourceType] = useState<"friends" | "groups">("friends");
+ const [name, setName] = useState("");
+ const [selectedFriends, setSelectedFriends] = useState([]);
+ const [selectedGroups, setSelectedGroups] = useState([]);
+ const [useAI, setUseAI] = useState(false);
+ const [aiPrompt, setAIPrompt] = useState("");
+ const [enabled, setEnabled] = useState(true);
+ const [dateRange, setDateRange] = useState<[Date | null, Date | null]>([
+ null,
+ null,
+ ]);
+ const [showStartPicker, setShowStartPicker] = useState(false);
+ const [showEndPicker, setShowEndPicker] = useState(false);
+ const [keywordsInclude, setKeywordsInclude] = useState("");
+ const [keywordsExclude, setKeywordsExclude] = useState("");
+ const [submitting, setSubmitting] = useState(false);
+ const [loading, setLoading] = useState(false);
+
+ // 编辑模式下拉详情并回填
+ useEffect(() => {
+ if (isEdit && id) {
+ setLoading(true);
+ getContentLibraryDetail(id)
+ .then((data) => {
+ setName(data.name || "");
+ setSourceType(data.sourceType === 1 ? "friends" : "groups");
+ setSelectedFriends(data.sourceFriends || []);
+ setSelectedGroups(data.sourceGroups || []);
+ setKeywordsInclude((data.keywordInclude || []).join(","));
+ setKeywordsExclude((data.keywordExclude || []).join(","));
+ setAIPrompt(data.aiPrompt || "");
+ setUseAI(!!data.aiPrompt);
+ setEnabled(data.status === 1);
+ // 时间范围
+ let start = data.timeStart || data.startTime;
+ let end = data.timeEnd || data.endTime;
+ setDateRange([
+ start ? new Date(start) : null,
+ end ? new Date(end) : null,
+ ]);
+ })
+ .catch((e) => {
+ Toast.show({
+ content: e?.message || "获取详情失败",
+ position: "top",
+ });
+ })
+ .finally(() => setLoading(false));
+ }
+ }, [isEdit, id]);
+
+ const handleSubmit = async (e?: React.FormEvent) => {
+ if (e) e.preventDefault();
+ if (!name.trim()) {
+ Toast.show({ content: "请输入内容库名称", position: "top" });
+ return;
+ }
+ setSubmitting(true);
+ try {
+ const payload = {
+ name,
+ sourceType: sourceType === "friends" ? 1 : 2,
+ friends: selectedFriends,
+ groups: selectedGroups,
+ groupMembers: {},
+ keywordInclude: keywordsInclude
+ .split(/,|,|\n|\s+/)
+ .map((s) => s.trim())
+ .filter(Boolean),
+ keywordExclude: keywordsExclude
+ .split(/,|,|\n|\s+/)
+ .map((s) => s.trim())
+ .filter(Boolean),
+ aiPrompt,
+ timeEnabled: dateRange[0] || dateRange[1] ? 1 : 0,
+ startTime: dateRange[0] ? formatDate(dateRange[0]) : "",
+ endTime: dateRange[1] ? formatDate(dateRange[1]) : "",
+ status: enabled ? 1 : 0,
+ };
+ if (isEdit && id) {
+ await updateContentLibrary({ id, ...payload });
+ Toast.show({ content: "保存成功", position: "top" });
+ } else {
+ await request("/v1/content/library/create", payload, "POST");
+ Toast.show({ content: "创建成功", position: "top" });
+ }
+ navigate("/content");
+ } catch (e: any) {
+ Toast.show({
+ content: e?.message || (isEdit ? "保存失败" : "创建失败"),
+ position: "top",
+ });
+ } finally {
+ setSubmitting(false);
+ }
+ };
+
+ return (
+ }
+ footer={
+
+
+
+ }
+ >
+
+
+
+
+ );
+}
diff --git a/nkebao/src/pages/workspace/auto-like/record/index.tsx b/nkebao/src/pages/workspace/auto-like/record/index.tsx
index 9bd51eda..f286d768 100644
--- a/nkebao/src/pages/workspace/auto-like/record/index.tsx
+++ b/nkebao/src/pages/workspace/auto-like/record/index.tsx
@@ -1,309 +1,309 @@
-import React, { useState, useEffect } from "react";
-import { useParams } from "react-router-dom";
-import {
- Button,
- Input,
- Card,
- Badge,
- Avatar,
- Skeleton,
- message,
- Spin,
- Divider,
- Pagination,
-} from "antd";
-import {
- LikeOutlined,
- ReloadOutlined,
- SearchOutlined,
- UserOutlined,
-} from "@ant-design/icons";
-import styles from "./record.module.scss";
-import NavCommon from "@/components/NavCommon";
-import { fetchLikeRecords } from "./api";
-import Layout from "@/components/Layout/Layout";
-
-// 格式化日期
-const formatDate = (dateString: string) => {
- try {
- const date = new Date(dateString);
- return date.toLocaleString("zh-CN", {
- year: "numeric",
- month: "2-digit",
- day: "2-digit",
- hour: "2-digit",
- minute: "2-digit",
- });
- } catch (error) {
- return dateString;
- }
-};
-
-export default function AutoLikeRecord() {
- const { id } = useParams<{ id: string }>();
- const [records, setRecords] = useState([]);
- const [recordsLoading, setRecordsLoading] = useState(false);
- const [searchTerm, setSearchTerm] = useState("");
- const [currentPage, setCurrentPage] = useState(1);
- const [total, setTotal] = useState(0);
- const pageSize = 10;
-
- useEffect(() => {
- if (!id) return;
- setRecordsLoading(true);
- fetchLikeRecords(id, 1, pageSize)
- .then((response: any) => {
- setRecords(response.list || []);
- setTotal(response.total || 0);
- setCurrentPage(1);
- })
- .catch(() => {
- message.error("获取点赞记录失败,请稍后重试");
- })
- .finally(() => setRecordsLoading(false));
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [id]);
-
- const handleSearch = () => {
- setCurrentPage(1);
- fetchLikeRecords(id!, 1, pageSize, searchTerm)
- .then((response: any) => {
- setRecords(response.list || []);
- setTotal(response.total || 0);
- setCurrentPage(1);
- })
- .catch(() => {
- message.error("获取点赞记录失败,请稍后重试");
- });
- };
-
- const handleRefresh = () => {
- fetchLikeRecords(id!, currentPage, pageSize, searchTerm)
- .then((response: any) => {
- setRecords(response.list || []);
- setTotal(response.total || 0);
- })
- .catch(() => {
- message.error("获取点赞记录失败,请稍后重试");
- });
- };
-
- const handlePageChange = (newPage: number) => {
- fetchLikeRecords(id!, newPage, pageSize, searchTerm)
- .then((response: any) => {
- setRecords(response.list || []);
- setTotal(response.total || 0);
- setCurrentPage(newPage);
- })
- .catch(() => {
- message.error("获取点赞记录失败,请稍后重试");
- });
- };
-
- return (
-
-
-
-
- }
- placeholder="搜索好友昵称或内容"
- className={styles.headerSearchInput}
- value={searchTerm}
- onChange={(e) => setSearchTerm(e.target.value)}
- onPressEnter={handleSearch}
- allowClear
- />
-
-
}
- onClick={handleRefresh}
- loading={recordsLoading}
- type="default"
- shape="circle"
- />
-
- >
- }
- footer={
- <>
-
-
- `第 ${range[0]}-${range[1]} 条,共 ${total} 条`
- }
- size="default"
- className={styles.pagination}
- />
-
- >
- }
- >
-
-
- {recordsLoading ? (
-
- {Array.from({ length: 3 }).map((_, index) => (
-
- ))}
-
- ) : records.length === 0 ? (
-
- ) : (
- <>
- {records.map((record) => (
-
-
-
-
}
- size={40}
- className={styles.avatarImg}
- />
-
-
- {record.friendName}
-
-
内容发布者
-
-
-
-
-
-
- {record.content && (
-
{record.content}
- )}
- {Array.isArray(record.resUrls) &&
- record.resUrls.length > 0 && (
-
- {record.resUrls
- .slice(0, 9)
- .map((image: string, idx: number) => (
-
-

-
- ))}
-
- )}
-
-
-
}
- size={32}
- className={styles.operatorAvatar}
- />
-
-
- {record.operatorName}
-
-
-
- 已赞
-
-
-
-
- ))}
- >
- )}
-
-
-
- );
-}
+import React, { useState, useEffect } from "react";
+import { useParams } from "react-router-dom";
+import {
+ Button,
+ Input,
+ Card,
+ Badge,
+ Avatar,
+ Skeleton,
+ message,
+ Spin,
+ Divider,
+ Pagination,
+} from "antd";
+import {
+ LikeOutlined,
+ ReloadOutlined,
+ SearchOutlined,
+ UserOutlined,
+} from "@ant-design/icons";
+import styles from "./record.module.scss";
+import NavCommon from "@/components/NavCommon";
+import { fetchLikeRecords } from "./api";
+import Layout from "@/components/Layout/Layout";
+
+// 格式化日期
+const formatDate = (dateString: string) => {
+ try {
+ const date = new Date(dateString);
+ return date.toLocaleString("zh-CN", {
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ });
+ } catch (error) {
+ return dateString;
+ }
+};
+
+export default function AutoLikeRecord() {
+ const { id } = useParams<{ id: string }>();
+ const [records, setRecords] = useState([]);
+ const [recordsLoading, setRecordsLoading] = useState(false);
+ const [searchTerm, setSearchTerm] = useState("");
+ const [currentPage, setCurrentPage] = useState(1);
+ const [total, setTotal] = useState(0);
+ const pageSize = 10;
+
+ useEffect(() => {
+ if (!id) return;
+ setRecordsLoading(true);
+ fetchLikeRecords(id, 1, pageSize)
+ .then((response: any) => {
+ setRecords(response.list || []);
+ setTotal(response.total || 0);
+ setCurrentPage(1);
+ })
+ .catch(() => {
+ message.error("获取点赞记录失败,请稍后重试");
+ })
+ .finally(() => setRecordsLoading(false));
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [id]);
+
+ const handleSearch = () => {
+ setCurrentPage(1);
+ fetchLikeRecords(id!, 1, pageSize, searchTerm)
+ .then((response: any) => {
+ setRecords(response.list || []);
+ setTotal(response.total || 0);
+ setCurrentPage(1);
+ })
+ .catch(() => {
+ message.error("获取点赞记录失败,请稍后重试");
+ });
+ };
+
+ const handleRefresh = () => {
+ fetchLikeRecords(id!, currentPage, pageSize, searchTerm)
+ .then((response: any) => {
+ setRecords(response.list || []);
+ setTotal(response.total || 0);
+ })
+ .catch(() => {
+ message.error("获取点赞记录失败,请稍后重试");
+ });
+ };
+
+ const handlePageChange = (newPage: number) => {
+ fetchLikeRecords(id!, newPage, pageSize, searchTerm)
+ .then((response: any) => {
+ setRecords(response.list || []);
+ setTotal(response.total || 0);
+ setCurrentPage(newPage);
+ })
+ .catch(() => {
+ message.error("获取点赞记录失败,请稍后重试");
+ });
+ };
+
+ return (
+
+
+
+
+ }
+ placeholder="搜索好友昵称或内容"
+ className={styles.headerSearchInput}
+ value={searchTerm}
+ onChange={(e) => setSearchTerm(e.target.value)}
+ onPressEnter={handleSearch}
+ allowClear
+ />
+
+
}
+ onClick={handleRefresh}
+ loading={recordsLoading}
+ type="default"
+ shape="circle"
+ />
+
+ >
+ }
+ footer={
+ <>
+
+
+ `第 ${range[0]}-${range[1]} 条,共 ${total} 条`
+ }
+ size="default"
+ className={styles.pagination}
+ />
+
+ >
+ }
+ >
+
+
+ {recordsLoading ? (
+
+ {Array.from({ length: 3 }).map((_, index) => (
+
+ ))}
+
+ ) : records.length === 0 ? (
+
+ ) : (
+ <>
+ {records.map((record) => (
+
+
+
+
}
+ size={40}
+ className={styles.avatarImg}
+ />
+
+
+ {record.friendName}
+
+
内容发布者
+
+
+
+
+
+
+ {record.content && (
+
{record.content}
+ )}
+ {Array.isArray(record.resUrls) &&
+ record.resUrls.length > 0 && (
+
+ {record.resUrls
+ .slice(0, 9)
+ .map((image: string, idx: number) => (
+
+

+
+ ))}
+
+ )}
+
+
+
}
+ size={32}
+ className={styles.operatorAvatar}
+ />
+
+
+ {record.operatorName}
+
+
+
+ 已赞
+
+
+
+
+ ))}
+ >
+ )}
+
+
+
+ );
+}