新增驳回原因

This commit is contained in:
宇阳
2024-10-18 15:14:58 +08:00
parent 3458e3660d
commit f3989f922c
3 changed files with 69 additions and 39 deletions

View File

@@ -70,6 +70,12 @@ const WallPage = () => {
setIsModalOpen(true) setIsModalOpen(true)
}}>{text}</span> }}>{text}</span>
}, },
{
title: '邮箱',
dataIndex: 'email',
key: 'email',
render: (text: string) => text ? text : '暂无邮箱',
},
{ {
title: '留言时间', title: '留言时间',
dataIndex: 'createTime', dataIndex: 'createTime',

View File

@@ -1,5 +1,5 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { Card, Dropdown, message } from "antd"; import { Button, Card, Dropdown, message, Modal } from "antd";
import { getLinkListAPI, delLinkDataAPI, auditWebDataAPI } from '@/api/Web'; import { getLinkListAPI, delLinkDataAPI, auditWebDataAPI } from '@/api/Web';
import { getCommentListAPI, auditCommentDataAPI, delCommentDataAPI } from "@/api/Comment"; import { getCommentListAPI, auditCommentDataAPI, delCommentDataAPI } from "@/api/Comment";
import { getWallListAPI, auditWallDataAPI, delWallDataAPI } from "@/api/Wall"; import { getWallListAPI, auditWallDataAPI, delWallDataAPI } from "@/api/Wall";
@@ -15,19 +15,55 @@ import RandomAvatar from "@/components/RandomAvatar";
import Empty from "@/components/Empty"; import Empty from "@/components/Empty";
import { useWebStore } from '@/stores'; import { useWebStore } from '@/stores';
import TextArea from "antd/es/input/TextArea";
type Menu = "comment" | "link" | "wall"; type Menu = "comment" | "link" | "wall";
interface ListItemProps { interface ListItemProps {
item: any; item: any;
type: Menu; type: Menu;
handleApproval: (id: number, type: Menu) => void; fetchData: (type: Menu) => void;
handleRejection: (id: number, type: Menu) => void;
} }
const ListItem = ({ item, type, handleApproval, handleRejection }: ListItemProps) => { const ListItem = ({ item, type, fetchData }: ListItemProps) => {
const web = useWebStore(state => state.web) const web = useWebStore(state => state.web)
// 审核数据
const handleApproval = async () => {
if (type === "link") {
await auditWebDataAPI(item.id);
message.success('🎉 友链审核成功');
} else if (type === "comment") {
await auditCommentDataAPI(item.id);
message.success('🎉 评论审核成功');
} else if (type === "wall") {
await auditWallDataAPI(item.id);
message.success('🎉 留言审核成功');
}
fetchData(type);
};
// 驳回原因
const [dismissInfo, setDismissInfo] = useState("")
const [isModalOpen, setIsModalOpen] = useState(false);
const handleDismiss = async () => {
if (type === "link") {
await delLinkDataAPI(item.id);
message.success('🎉 友链驳回成功');
} else if (type === "comment") {
await delCommentDataAPI(item.id);
message.success('🎉 评论驳回成功');
} else if (type === "wall") {
await delWallDataAPI(item.id);
message.success('🎉 留言驳回成功');
}
console.log(dismissInfo);
setIsModalOpen(false)
fetchData(type);
};
return ( return (
<div key={item.id}> <div key={item.id}>
<div className="text-center text-xs text-[#e0e0e0] mb-4"> <div className="text-center text-xs text-[#e0e0e0] mb-4">
@@ -46,15 +82,13 @@ const ListItem = ({ item, type, handleApproval, handleRejection }: ListItemProps
<div>{item.title}</div> <div>{item.title}</div>
<div>{item.description}</div> <div>{item.description}</div>
<div>{item.type.name}</div> <div>{item.type.name}</div>
<div>{item.email || '暂无'}</div> <div>{item.url || '暂无'}</div>
<div>{item.url || '暂无'}</div>
</> </>
) : type === "comment" ? ( ) : type === "comment" ? (
<> <>
<div>{item.name}</div> <div>{item.name}</div>
<div>{item.content}</div> <div>{item.content}</div>
<div>{item.email || '暂无'}</div> <div>{item.url || '暂无'}</div>
<div>{item.url || '暂无'}</div>
<div><a href={`${web.url}/article/${item.articleId}`} target='_blank' className="hover:text-primary">{item.articleTitle || '暂无'}</a></div> <div><a href={`${web.url}/article/${item.articleId}`} target='_blank' className="hover:text-primary">{item.articleTitle || '暂无'}</a></div>
</> </>
) : ( ) : (
@@ -63,14 +97,16 @@ const ListItem = ({ item, type, handleApproval, handleRejection }: ListItemProps
<div>{item.content}</div> <div>{item.content}</div>
</> </>
)} )}
<div>{item.email || '暂无'}</div>
</div> </div>
</div> </div>
<div className="flex items-end"> <div className="flex items-end">
<Dropdown menu={{ <Dropdown menu={{
items: [ items: [
{ key: 'ok', label: "通过", onClick: () => handleApproval(item.id, type) }, { key: 'ok', label: "通过", onClick: handleApproval },
{ key: 'no', label: "拒审", onClick: () => handleRejection(item.id, type) } { key: 'no', label: "驳回", onClick: () => setIsModalOpen(true) }
] ]
}}> }}>
<div className="flex justify-evenly items-center bg-[#F9F9FD] w-11 h-5 rounded-md cursor-pointer"> <div className="flex justify-evenly items-center bg-[#F9F9FD] w-11 h-5 rounded-md cursor-pointer">
@@ -80,6 +116,20 @@ const ListItem = ({ item, type, handleApproval, handleRejection }: ListItemProps
</Dropdown> </Dropdown>
</div> </div>
</div> </div>
<Modal title="驳回原因" open={isModalOpen} footer={null} onClose={() => setIsModalOpen(false)}>
<TextArea
value={dismissInfo}
onChange={(e) => setDismissInfo(e.target.value)}
placeholder="请输入驳回原因"
autoSize={{ minRows: 3, maxRows: 5 }}
/>
<div className="flex space-x-4">
<Button size="large" className="w-full mt-2" onClick={() => setIsModalOpen(false)}></Button>
<Button type="primary" size="large" className="w-full mt-2" onClick={handleDismiss}></Button>
</div>
</Modal>
</div> </div>
) )
} }
@@ -91,6 +141,7 @@ const WorkPage = () => {
const [linkList, setLinkList] = useState<any[]>([]); const [linkList, setLinkList] = useState<any[]>([]);
const [wallList, setWallList] = useState<any[]>([]); const [wallList, setWallList] = useState<any[]>([]);
// 重新获取最新数据
const fetchData = async (type: Menu) => { const fetchData = async (type: Menu) => {
if (type === "comment") { if (type === "comment") {
const { data } = await getCommentListAPI({ query: { status: 0 }, pattern: "list" }); const { data } = await getCommentListAPI({ query: { status: 0 }, pattern: "list" });
@@ -108,40 +159,12 @@ const WorkPage = () => {
fetchData(active); fetchData(active);
}, [active]); }, [active]);
const handleApproval = async (id: number, type: Menu) => {
if (type === "link") {
await auditWebDataAPI(id);
message.success('🎉 友链审核成功');
} else if (type === "comment") {
await auditCommentDataAPI(id);
message.success('🎉 评论审核成功');
} else if (type === "wall") {
await auditWallDataAPI(id);
message.success('🎉 留言审核成功');
}
fetchData(type);
};
const handleRejection = async (id: number, type: Menu) => {
if (type === "link") {
await delLinkDataAPI(id);
message.success('🎉 友链拒审成功');
} else if (type === "comment") {
await delCommentDataAPI(id);
message.success('🎉 评论拒审成功');
} else if (type === "wall") {
await delWallDataAPI(id);
message.success('🎉 留言拒审成功');
}
fetchData(type);
};
const renderList = (list: any[], type: Menu) => { const renderList = (list: any[], type: Menu) => {
if (list.length === 0) { if (list.length === 0) {
return <Empty />; return <Empty />;
} }
return list.map(item => ( return list.map(item => (
<ListItem key={item.id} item={item} type={type} handleApproval={handleApproval} handleRejection={handleRejection} /> <ListItem key={item.id} item={item} type={type} fetchData={(type) => fetchData(type)} />
)); ));
}; };

View File

@@ -12,6 +12,7 @@ export interface Wall {
cate: Category; cate: Category;
color: string; color: string;
content: string; content: string;
email: string;
auditStatus: number; auditStatus: number;
createTime: string; createTime: string;
} }