添加空间动态审核页面

This commit is contained in:
yezian 2024-04-19 11:04:07 +08:00
parent 251a7350dd
commit 24c52fc750
3 changed files with 309 additions and 0 deletions

View File

@ -53,6 +53,7 @@ export default function Op() {
getItem("图片机审回查", "imageMachineReview"),
getItem("文本机审回查", "textMachineReview"),
getItem("动态机审回查", "postMachineReview"),
getItem("空间动态审核", "zonePostMachineReview"),
getItem("已删除动态回捞", "deletedPostReview"),
]),
getItem("网红管理", "streamerManagement", <ShopOutlined />, [

View File

@ -0,0 +1,303 @@
import React, { useState, useRef, useEffect } from "react";
import { Form, Input, Button, Space, Table, Menu, Image } from "antd";
import {
Routes,
Route,
Navigate,
useNavigate,
useLocation,
} from "react-router-dom";
import baseRequest from "../../utils/baseRequest";
const ZonePostMachineReviewContent = (props) => {
const { TextArea } = Input;
const current = props.current;
//
const columns = [
{
title: "动态内容",
dataIndex: "content",
key: "content",
render: (data) => (
<div className="flex flex-col">
<div>
<p className="text-red-400">
文案<span className="text-black">{data.text}</span>
</p>
</div>
<p className="text-red-400">媒体</p>
<div className="flex flex-wrap gap-1">
{data.media.images.map((item, index) => (
<Image key={index} src={item.urls[0]} width={100} />
))}
{data.media.videos.map((item, index) => (
<video key={index} src={item.urls[0]} width={150} controls />
))}
</div>
</div>
),
},
{
title: "审核结果",
dataIndex: "info",
key: "info",
render: (data) => (
<div className="flex flex-col">
<p>文案审核结果</p>
<p className="text-green-400">{data.text_audit_opinion}</p>
<hr className="w-full" />
<p>媒体审核结果</p>
<p className="text-green-400">{data.image_audit_opinion}</p>
</div>
),
},
{
title: "提交时间",
dataIndex: "submitTime",
key: "submitTime",
},
{
title: "备注",
dataIndex: "remarks",
key: "remarks",
render: (_, record) => (
<div className="flex flex-col">
<Form.Item
name={record.momentId}
initialValue={record.remarks.manually_review_opinion}
>
<TextArea rows={4} />
</Form.Item>
</div>
),
},
{
title: "操作",
dataIndex: "opeartion",
key: "opeartion",
render: (_, record) => (
<div>
<Space>
{current === "operatorReviewing" && (
<Space.Compact direction="vertical">
<Button type="primary" onClick={() => onClickPass(record)}>
通过
</Button>
<Button onClick={() => onClickReject(record)}>拒绝</Button>
</Space.Compact>
)}
</Space>
</div>
),
},
];
//ref
const formRef = useRef(null);
//
const onClickPass = (record) => {
formRef.current.record = record;
formRef.current.type = 0;
formRef.current.submit();
};
//
const onClickReject = (record) => {
formRef.current.record = record;
formRef.current.type = 1;
formRef.current.submit();
};
//
const handleSubmit = async (value) => {
try {
const base = baseRequest();
const response = await fetch("/op/zone_moment/review", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
zone_moment_ids: [parseInt(formRef.current.record.momentId, 10)],
op_type: formRef.current.type,
manually_review_opinion: value[formRef.current.record.momentId]
? value[formRef.current.record.momentId]
: "",
...base,
}),
});
const _data = await response.json();
console.log(_data);
if (_data.ret === -1) {
alert(_data.msg);
return;
}
//
setShowData(
showData.filter(
(item) => item.momentId !== formRef.current.record.momentId
)
);
} catch (error) {
console.error(error);
}
};
//
const [data, setData] = useState([]);
const [offset, setOffset] = useState(0);
const [more, setMore] = useState(1);
const getData = async () => {
if (!more) return;
let querryStatus;
switch (current) {
case "operatorReviewing":
querryStatus = 1;
break;
case "machineReviewing":
querryStatus = 0;
break;
case "onlySelfCanSee":
querryStatus = 3;
break;
default:
break;
}
try {
const base = baseRequest();
const response = await fetch("/op/zone_moment/list", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
status: querryStatus,
offset: offset,
limit: 200,
...base,
}),
});
const temData = await response.json();
console.log(temData);
if (temData.ret === -1) {
alert(temData.msg);
return;
}
//
const structedData = temData.data.list.map((item, index) => {
return {
key: index,
momentId: item.id,
content: {
media: item.media_component,
text: item.text,
},
info: {
image_audit_status: item.image_audit_status,
image_audit_opinion: item.image_audit_opinion,
text_audit_status: item.text_audit_status,
text_audit_opinion: item.text_audit_opinion,
},
submitTime: new Date(item.ct * 1000).toLocaleString(),
remarks: {
manually_review_status: item.manually_review_status,
manually_review_opinion: item.manually_review_opinion,
manually_review_operator: item.manually_review_operator,
},
};
});
setData([...data, ...structedData]);
setOffset(temData.data.offset);
setMore(temData.data.more);
} catch (error) {
console.error(error);
}
};
useEffect(() => {
getData();
}, [current]);
//
const [showData, setShowData] = useState([]);
useEffect(() => {
setShowData(data);
}, [data]);
//
const onFinishFailed = (errorInfo) => {
console.log("Failed:", errorInfo);
};
return (
<div style={{ marginLeft: 20, marginRight: 20 }}>
<p>
{current === "operatorReviewing" && `运营待审核${showData.length}`}
{current === "onlySelfCanSee" && `审核未通过${showData.length}`}
</p>
<Form
ref={formRef}
name="remarks"
onFinish={handleSubmit}
onFinishFailed={onFinishFailed}
>
<Table
columns={columns}
dataSource={showData}
pagination={{ pageSize: 20 }}
scroll={{ y: window.innerHeight - 300 }}
/>
</Form>
</div>
);
};
export default function ZonePostMachineReview() {
const navigate = useNavigate();
//tab
const location = useLocation();
const pathname = location.pathname.split("/")[2] || "operatorReviewing";
const [current, setCurrent] = useState(pathname);
//tab
const items = [
{
label: "运营待审核",
key: "operatorReviewing",
},
{
label: "机审中",
key: "machineReviewing",
},
{
label: "审核未通过",
key: "onlySelfCanSee",
},
];
const onClick = (e) => {
setCurrent(e.key);
navigate(e.key);
window.location.reload();
};
return (
<div>
<Menu
onClick={onClick}
selectedKeys={[current]}
mode="horizontal"
items={items}
/>
<Routes>
<Route
path="/"
element={<Navigate to="/zonePostMachineReview/operatorReviewing" />}
/>
<Route
path="/operatorReviewing"
element={<ZonePostMachineReviewContent current="operatorReviewing" />}
/>
<Route
path="/machineReviewing"
element={<ZonePostMachineReviewContent current="machineReviewing" />}
/>
<Route
path="/onlySelfCanSee"
element={<ZonePostMachineReviewContent current="onlySelfCanSee" />}
/>
</Routes>
</div>
);
}

View File

@ -22,6 +22,7 @@ import GetPhoneNumber from "../pages/GetPhoneNumber";
import Refund from "../pages/Refund";
import BlockUser from "../pages/BlockUser";
import DeletedPostReview from "../pages/DeletedPostReview";
import ZonePostMachineReview from "../pages/ZonePostMachineReview";
const routes = [
{
@ -120,6 +121,10 @@ const routes = [
path: "deletedPostReview/*",
element: <DeletedPostReview />,
},
{
path: "zonePostMachineReview/*",
element: <ZonePostMachineReview />,
},
],
},
];