功能:完成说说页面基本布局

This commit is contained in:
宇阳
2024-12-02 15:21:58 +08:00
parent a395fc1d63
commit d2fe1d8260
7 changed files with 187 additions and 15 deletions

View File

@@ -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

View File

@@ -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 /> },

View File

@@ -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",

View File

@@ -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
View 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
View File

@@ -0,0 +1,6 @@
export interface Record {
id: number,
content: string,
images: string | string[],
createTime?: string | Dayjs;
}

View File

@@ -24,7 +24,8 @@ interface FilterData {
content?: string,
status?: 0 | 1,
startDate?: string,
endDate?: string
endDate?: string,
createTime?: Date[]
}
interface QueryData<T = FilterData> {