diff --git a/src/App.tsx b/src/App.tsx index 276f9e0..b8a899a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,6 +9,7 @@ import Cate from './pages/Cate'; import Article from './pages/Article'; import Comment from './pages/Comment'; import Web from './pages/Web'; +import Swiper from './pages/Swiper'; import Login from './pages/Login'; import DefaultLayout from './layout/DefaultLayout'; @@ -110,7 +111,7 @@ function App() { /> @@ -118,6 +119,16 @@ function App() { } /> + + + + + + } + /> )} diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx index 10bfbef..b682780 100644 --- a/src/components/Sidebar/index.tsx +++ b/src/components/Sidebar/index.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useRef, useState } from 'react'; import { NavLink, useLocation } from 'react-router-dom'; import SidebarLinkGroup from './SidebarLinkGroup'; import Logo from '../../images/logo/logo.svg'; -import { BiEditAlt, BiFolderOpen, BiHomeSmile, BiSitemap, BiSpa } from "react-icons/bi"; +import { BiEditAlt, BiFolderOpen, BiHomeSmile } from "react-icons/bi"; import { BiCategoryAlt } from "react-icons/bi"; interface SidebarProps { @@ -212,6 +212,18 @@ const Sidebar = ({ sidebarOpen, setSidebarOpen }: SidebarProps) => { 网站管理 + +
  • + + 'group relative flex items-center gap-2.5 rounded-md px-4 font-medium text-bodydark2 duration-300 ease-in-out hover:text-white ' + + (isActive && '!text-white') + } + > + 轮播图管理 + +
  • {/* */} diff --git a/src/pages/Cate/index.tsx b/src/pages/Cate/index.tsx index 8119673..2a9c3b5 100644 --- a/src/pages/Cate/index.tsx +++ b/src/pages/Cate/index.tsx @@ -35,6 +35,12 @@ const CatePage: React.FC = () => { setLoading(false); }; + const delCateData = async (id: number) => { + await delCateDataAPI(id); + message.success('🎉 删除分类成功'); + getCateList(); + }; + const submit = async () => { formRef.current .validateFields() @@ -59,12 +65,6 @@ const CatePage: React.FC = () => { }); }; - const delCateData = async (id: number) => { - await delCateDataAPI(id); - message.success('🎉 删除分类成功'); - getCateList(); - }; - const closeModel = () => { setModel(false); formRef.current.resetFields(); diff --git a/src/pages/Swiper/index.tsx b/src/pages/Swiper/index.tsx new file mode 100644 index 0000000..d169c40 --- /dev/null +++ b/src/pages/Swiper/index.tsx @@ -0,0 +1,166 @@ +import React, { useState, useEffect } from 'react'; +import { Table, Button, Modal, Form, Input, Tabs, Card, Popconfirm, message } from 'antd'; +import { getSwiperListAPI, addSwiperDataAPI, editSwiperDataAPI, delSwiperDataAPI } from '@/api/Swiper'; +import { Swiper } from '@/types/swiper'; +import Title from '@/components/Title'; +import { ColumnsType } from 'antd/es/table'; + +const SwiperPage: React.FC = () => { + const [loading, setLoading] = useState(false); + const [swiper, setSwiper] = useState({} as Swiper); + const [list, setList] = useState([]); + const [isModelOpen, setIsModelOpen] = useState(false); + const [viewImage, setViewImage] = useState(''); + const [tab, setTab] = useState('list'); + + const columns: ColumnsType = [ + { title: 'ID', dataIndex: 'id', key: 'id' }, + { + title: '图片', dataIndex: 'image', key: 'image', width: 200, + render: (text: string) => swiper { setViewImage(text); setIsModelOpen(true) }} /> + }, + { title: '标题', dataIndex: 'title', key: 'title' }, + { title: '描述', dataIndex: 'description', key: 'description' }, + { + title: '操作', key: 'action', align: 'center', + render: (text: string, record: Swiper) => ( + <> + + + delSwiperData(record.id!)}> + + + + ) + } + ]; + + const getSwiperList = async () => { + const { data } = await getSwiperListAPI(); + setList(data as Swiper[]); + setLoading(false); + }; + + useEffect(() => { + setLoading(true); + getSwiperList(); + }, []); + + const [form] = Form.useForm(); + const editSwiperData = (record: Swiper) => { + setSwiper(record); + form.setFieldsValue(record); + setTab('operate'); + }; + + const delSwiperData = async (id: number) => { + setLoading(true); + await delSwiperDataAPI(id); + message.success('🎉 删除轮播图成功'); + getSwiperList(); + }; + + const submit = async () => { + setLoading(true); + form.validateFields().then(async (values: Swiper) => { + if (swiper.id) { + await editSwiperDataAPI(values); + message.success('🎉 编辑轮播图成功'); + } else { + await addSwiperDataAPI(values); + message.success('🎉 新增轮播图成功'); + } + + getSwiperList(); + setTab('list'); + form.resetFields(); + setSwiper({} as Swiper); + }) + }; + + const handleTabChange = (key: string) => { + setTab(key); + form.resetFields(); + setSwiper({} as Swiper); + }; + + const tabItems = [ + { + label: '轮播图列表', + key: 'list', + children: ( + + ) + }, + { + label: swiper.id ? '编辑轮播图' : '新增轮播图', + key: 'operate', + children: ( + <> +

    {swiper.id ? '编辑轮播图' : '新增轮播图'}

    + + + + + + + + + + + + + + + + + + + + + + + + ) + } + ]; + + return ( + <> + + + <Card className="[&>.ant-card-body]:!pt-0 mt-2"> + <Tabs activeKey={tab} onChange={handleTabChange} items={tabItems} /> + </Card> + + <Modal + open={isModelOpen} + title="查看图片" + footer={null} + onCancel={() => setIsModelOpen(false)} + > + <img src={viewImage} alt="swiper" className="w-full rounded mt-4" /> + </Modal> + </> + ); +}; + +export default SwiperPage; \ No newline at end of file