WEB/src/pages/Site/Shop/Reviews/index.tsx

159 lines
4.6 KiB
TypeScript

import {
siteapicontrollerDeletereview,
siteapicontrollerGetreviews,
} from '@/servers/api/siteApi';
import {
ActionType,
ProCard,
ProColumns,
ProTable,
} from '@ant-design/pro-components';
import { useParams } from '@umijs/max';
import { Button, message, Popconfirm, Space } from 'antd';
import React, { useRef, useState } from 'react';
import ReviewForm from './ReviewForm';
const ReviewsPage: React.FC = () => {
const params = useParams();
const siteId = Number(params.siteId);
const actionRef = useRef<ActionType>();
const [open, setOpen] = useState(false);
const [editing, setEditing] = useState<any>(null);
const columns: ProColumns<API.UnifiedReviewDTO>[] = [
{ title: 'ID', dataIndex: 'id', key: 'id', width: 50 },
{ title: '产品ID', dataIndex: 'product_id', key: 'product_id', width: 80 },
{ title: '作者', dataIndex: 'author', key: 'author' },
{ title: '评分', dataIndex: 'rating', key: 'rating', width: 80 },
{ title: '状态', dataIndex: 'status', key: 'status', width: 100 },
{
title: '创建时间',
dataIndex: 'date_created',
key: 'date_created',
valueType: 'dateTime',
width: 150,
},
{
title: '操作',
key: 'action',
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
style={{ padding: 0 }}
onClick={() => {
setEditing(record);
setOpen(true);
}}
>
</Button>
<Popconfirm
title="确定删除吗?"
onConfirm={async () => {
if (record.id) {
try {
const response = await siteapicontrollerDeletereview({
siteId,
id: String(record.id),
});
if (response.success) {
message.success('删除成功');
actionRef.current?.reload();
} else {
message.error('删除失败');
}
} catch (error) {
message.error('删除失败');
}
}
}}
>
<Button type="link" danger>
</Button>
</Popconfirm>
</Space>
),
},
];
return (
<ProCard>
<ProTable<API.UnifiedReviewDTO>
columns={columns}
actionRef={actionRef}
request={async (params) => {
try {
const response = await siteapicontrollerGetreviews({
...params,
siteId,
page: params.current,
per_page: params.pageSize,
});
// 确保 response.data 存在
if (!response || !response.data) {
return {
data: [],
success: true,
total: 0,
};
}
// 确保 response.data.items 是数组
const items = Array.isArray(response.data.items) ? response.data.items : [];
// 确保每个 item 有有效的 id
const processedItems = items.map((item, index) => ({
...item,
// 如果 id 是对象,转换为字符串,否则使用索引作为后备
id: typeof item.id === 'object' ? JSON.stringify(item.id) : (item.id || index),
// 如果 product_id 是对象,转换为字符串
product_id: typeof item.product_id === 'object' ? JSON.stringify(item.product_id) : item.product_id,
}));
return {
data: processedItems,
success: true,
total: Number(response.data.total) || 0,
};
} catch (error) {
console.error('获取评论失败:', error);
return {
data: [],
success: true,
total: 0,
};
}
}}
rowKey="id"
search={{
labelWidth: 'auto',
}}
headerTitle="评论列表"
toolBarRender={() => [
<Button
type="primary"
onClick={() => {
setEditing(null);
setOpen(true);
}}
>
</Button>,
]}
/>
<ReviewForm
open={open}
editing={editing}
siteId={siteId}
onClose={() => setOpen(false)}
onSuccess={() => {
setOpen(false);
actionRef.current?.reload();
}}
/>
</ProCard>
);
};
export default ReviewsPage;