功能:完成说说页面基本布局
This commit is contained in:
@@ -1,25 +1,25 @@
|
||||
import Request from '@/utils/request'
|
||||
import { Cate } from '@/types/app/cate'
|
||||
import { Record } from '@/types/app/record'
|
||||
|
||||
// 新增分类
|
||||
export const addCateDataAPI = (data: Cate) => Request<Cate>("POST", "/cate", { data })
|
||||
// 新增说说
|
||||
export const addRecordDataAPI = (data: Record) => Request<Record>("POST", "/record", { data })
|
||||
|
||||
// 删除分类
|
||||
export const delCateDataAPI = (id: number) => Request<Cate>("DELETE", `/cate/${id}`)
|
||||
// 删除说说
|
||||
export const delRecordDataAPI = (id: number) => Request<Record>("DELETE", `/record/${id}`)
|
||||
|
||||
// 修改分类
|
||||
export const editCateDataAPI = (data: Cate) => Request<Cate>("PATCH", "/cate", { data })
|
||||
// 修改说说
|
||||
export const editRecordDataAPI = (data: Record) => Request<Record>("PATCH", "/record", { data })
|
||||
|
||||
// 获取分类
|
||||
export const getCateDataAPI = (id?: number) => Request<Cate>("GET", `/cate/${id}`)
|
||||
// 获取说说
|
||||
export const getRecordDataAPI = (id?: number) => Request<Record>("GET", `/record/${id}`)
|
||||
|
||||
// 获取分类列表
|
||||
export const getCateListAPI = (data?: QueryData) => Request<Cate[]>("POST", `/cate/list`, {
|
||||
// 获取说说列表
|
||||
export const getRecordListAPI = (data?: QueryData) => Request<Record[]>("POST", `/record/list`, {
|
||||
data: { ...data?.query },
|
||||
})
|
||||
|
||||
// 分页获取分类列表
|
||||
export const getCatePagingAPI = (data?: QueryData) => Request<Paginate<Cate[]>>("POST", `/cate/paging`, {
|
||||
// 分页获取说说列表
|
||||
export const getRecordPagingAPI = (data?: QueryData) => Request<Paginate<Record[]>>("POST", `/record/paging`, {
|
||||
data: { ...data?.query },
|
||||
params: {
|
||||
...data?.pagination
|
||||
|
||||
@@ -23,6 +23,7 @@ import Login from "@/pages/Login";
|
||||
import Work from "@/pages/Work";
|
||||
import Draft from "@/pages/Draft";
|
||||
import Decycle from "@/pages/Decycle";
|
||||
import Record from "@/pages/Record";
|
||||
|
||||
import PageTitle from "../PageTitle";
|
||||
|
||||
@@ -45,6 +46,7 @@ export default () => {
|
||||
{ path: "/recycle", title: "回收站", component: <Decycle /> },
|
||||
{ path: "/cate", title: "分类管理", component: <Cate /> },
|
||||
{ path: "/article", title: "文章管理", component: <Article /> },
|
||||
{ path: "/record", title: "说说管理", component: <Record /> },
|
||||
{ path: "/tag", title: "标签管理", component: <Tag /> },
|
||||
{ path: "/comment", title: "评论管理", component: <Comment /> },
|
||||
{ path: "/wall", title: "评论管理", component: <Wall /> },
|
||||
|
||||
@@ -110,6 +110,11 @@ const Sidebar = ({ sidebarOpen, setSidebarOpen }: SidebarProps) => {
|
||||
path: "create",
|
||||
name: "谱写"
|
||||
},
|
||||
{
|
||||
to: "/create_record",
|
||||
path: "create_record",
|
||||
name: "闪念"
|
||||
},
|
||||
{
|
||||
to: "/draft",
|
||||
path: "draft",
|
||||
@@ -133,6 +138,11 @@ const Sidebar = ({ sidebarOpen, setSidebarOpen }: SidebarProps) => {
|
||||
path: "article",
|
||||
name: "文章管理"
|
||||
},
|
||||
{
|
||||
to: "/record",
|
||||
path: "record",
|
||||
name: "说说管理"
|
||||
},
|
||||
{
|
||||
to: "/tag",
|
||||
path: "tag",
|
||||
|
||||
@@ -3,7 +3,7 @@ import { Table, Button, Tag, notification, Card, Popconfirm, Form, Input, DatePi
|
||||
import { titleSty } from '@/styles/sty';
|
||||
import Title from '@/components/Title';
|
||||
import { delFootprintDataAPI, getFootprintListAPI, addFootprintDataAPI, editFootprintDataAPI, getFootprintDataAPI } from '@/api/Footprint';
|
||||
import type { Footprint, FilterForm } from '@/types/app/footprint';
|
||||
import type { FilterForm, Footprint } from '@/types/app/footprint';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
const FootprintPage = () => {
|
||||
|
||||
153
src/pages/Record/index.tsx
Normal file
153
src/pages/Record/index.tsx
Normal file
@@ -0,0 +1,153 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import { Table, Button, Tag, notification, Card, Popconfirm, Form, Input, DatePicker } from 'antd';
|
||||
import { titleSty } from '@/styles/sty'
|
||||
import Title from '@/components/Title';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
import { delRecordDataAPI, getRecordListAPI } from '@/api/Record';
|
||||
import type { Record } from '@/types/app/record';
|
||||
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
export interface FilterForm {
|
||||
content: string,
|
||||
createTime: Date[]
|
||||
}
|
||||
|
||||
const RecordPage = () => {
|
||||
const [current, setCurrent] = useState<number>(1);
|
||||
const [loading, setLoading] = useState<boolean>(false);
|
||||
const [recordList, setRecordList] = useState<Record[]>([]);
|
||||
|
||||
const [form] = Form.useForm();
|
||||
const { RangePicker } = DatePicker;
|
||||
|
||||
const getRecordList = async () => {
|
||||
setLoading(true);
|
||||
const { data } = await getRecordListAPI();
|
||||
setRecordList(data as Record[]);
|
||||
setLoading(false);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
getRecordList()
|
||||
}, []);
|
||||
|
||||
const delRecordData = async (id: number) => {
|
||||
setLoading(true);
|
||||
|
||||
await delRecordDataAPI(id);
|
||||
await getRecordList();
|
||||
form.resetFields()
|
||||
setCurrent(1)
|
||||
notification.success({ message: '🎉 删除说说成功' })
|
||||
|
||||
setLoading(false);
|
||||
};
|
||||
|
||||
const columns = [
|
||||
{
|
||||
title: 'ID',
|
||||
dataIndex: 'id',
|
||||
key: 'id',
|
||||
align: 'center',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '内容',
|
||||
dataIndex: 'content',
|
||||
key: 'content',
|
||||
align: 'center',
|
||||
width: 300,
|
||||
render: (text: string) => <div className='line-clamp-2'>{text}</div>,
|
||||
},
|
||||
{
|
||||
title: '图片',
|
||||
dataIndex: 'images',
|
||||
key: 'images',
|
||||
align: 'center',
|
||||
width: 250,
|
||||
render: (text: string) => <Tag>{text}</Tag>,
|
||||
},
|
||||
{
|
||||
title: '发布时间',
|
||||
dataIndex: 'createTime',
|
||||
key: 'createTime',
|
||||
align: 'center',
|
||||
width: 200,
|
||||
render: (text: string) => dayjs(+text).format('YYYY-MM-DD HH:mm:ss'),
|
||||
sorter: (a: Record, b: Record) => +a.createTime! - +b.createTime!,
|
||||
showSorterTooltip: false
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
fixed: 'right',
|
||||
align: 'center',
|
||||
render: (text: string, record: Record) => (
|
||||
<div className='flex justify-center space-x-2'>
|
||||
<Link to={`/create_record?id=${record.id}`}>
|
||||
<Button>编辑</Button>
|
||||
</Link>
|
||||
|
||||
<Popconfirm title="警告" description="你确定要删除吗" okText="确定" cancelText="取消" onConfirm={() => delRecordData(record.id!)}>
|
||||
<Button type="primary" danger>删除</Button>
|
||||
</Popconfirm>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
const onSubmit = async (values: FilterForm) => {
|
||||
const query = {
|
||||
key: values.content,
|
||||
startDate: values.createTime && values.createTime[0].valueOf() + '',
|
||||
endDate: values.createTime && values.createTime[1].valueOf() + ''
|
||||
}
|
||||
|
||||
const { data } = await getRecordListAPI({ query });
|
||||
setRecordList(data as Record[]);
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Title value="说说管理" />
|
||||
|
||||
<Card className='my-2 overflow-scroll'>
|
||||
<Form form={form} layout="inline" onFinish={onSubmit} autoComplete="off" className='flex-nowrap'>
|
||||
<Form.Item label="内容" name="content" className='min-w-[200px]'>
|
||||
<Input placeholder='请输入关键词' />
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item label="时间范围" name="createTime" className='min-w-[250px]'>
|
||||
<RangePicker placeholder={["选择起始时间", "选择结束时间"]} />
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item className='pr-6'>
|
||||
<Button type="primary" htmlType="submit">查询</Button>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</Card>
|
||||
|
||||
<Card className={`${titleSty} min-h-[calc(100vh-250px)]`}>
|
||||
<Table
|
||||
rowKey="id"
|
||||
dataSource={recordList}
|
||||
columns={columns as any}
|
||||
loading={loading}
|
||||
scroll={{ x: 'max-content' }}
|
||||
pagination={{
|
||||
position: ['bottomCenter'],
|
||||
current,
|
||||
defaultPageSize: 8,
|
||||
onChange(current) {
|
||||
setCurrent(current)
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</Card>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default RecordPage;
|
||||
6
src/types/app/record.d.ts
vendored
Normal file
6
src/types/app/record.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
export interface Record {
|
||||
id: number,
|
||||
content: string,
|
||||
images: string | string[],
|
||||
createTime?: string | Dayjs;
|
||||
}
|
||||
3
src/types/response.d.ts
vendored
3
src/types/response.d.ts
vendored
@@ -24,7 +24,8 @@ interface FilterData {
|
||||
content?: string,
|
||||
status?: 0 | 1,
|
||||
startDate?: string,
|
||||
endDate?: string
|
||||
endDate?: string,
|
||||
createTime?: Date[]
|
||||
}
|
||||
|
||||
interface QueryData<T = FilterData> {
|
||||
|
||||
Reference in New Issue
Block a user