diff --git a/src/api/Oss.ts b/src/api/Oss.ts new file mode 100644 index 0000000..fe70069 --- /dev/null +++ b/src/api/Oss.ts @@ -0,0 +1,26 @@ +import Request from '@/utils/request' +import { Oss } from '@/types/app/oss' + +// 新增OSS +export const addOssDataAPI = (data: Oss) => Request("POST", "/oss", { data }) + +// 删除OSS +export const delOssDataAPI = (id: number) => Request("DELETE", `/oss/${id}`) + +// 修改OSS +export const editOssDataAPI = (data: Oss) => Request("PATCH", "/oss", { data }) + +// 获取OSS +export const getOssDataAPI = (id?: number) => Request("GET", `/oss/${id}`) + +// 获取OSS列表 +export const getOssListAPI = () => Request("POST", `/oss/list`) + +// 获取启用的OSS列表 +export const getOssEnableListAPI = () => Request("POST", `/oss/getEnableOss`) + +// 启用OSS +export const enableOssDataAPI = (id: number) => Request("PATCH", `/oss/enable/${id}`) + +// 禁用OSS +export const disableOssDataAPI = (id: number) => Request("PATCH", `/oss/disable/${id}`) \ No newline at end of file diff --git a/src/components/RouteList/index.tsx b/src/components/RouteList/index.tsx index 956c662..bc37424 100644 --- a/src/components/RouteList/index.tsx +++ b/src/components/RouteList/index.tsx @@ -25,6 +25,7 @@ import Work from "@/pages/Work"; import Draft from "@/pages/Draft"; import Decycle from "@/pages/Decycle"; import Record from "@/pages/Record"; +import Oss from "@/pages/Oss"; import PageTitle from "../PageTitle"; @@ -56,6 +57,7 @@ export default () => { { path: "/swiper", title: "轮播图管理", component: }, { path: "/footprint", title: "足迹管理", component: }, { path: "/user", title: "用户管理", component: }, + { path: "/storage", title: "存储管理", component: }, { path: "/setup", title: "项目配置", component: }, { path: "/route", title: "路由配置", component: }, { path: "/role", title: "角色管理", component: }, diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx index c002b1e..201492b 100644 --- a/src/components/Sidebar/index.tsx +++ b/src/components/Sidebar/index.tsx @@ -185,6 +185,11 @@ const Sidebar = ({ sidebarOpen, setSidebarOpen }: SidebarProps) => { path: "user", name: "用户管理" }, + { + to: "/storage", + path: "storage", + name: "存储管理" + }, ] }, { diff --git a/src/pages/Oss/index.tsx b/src/pages/Oss/index.tsx new file mode 100644 index 0000000..a1f7363 --- /dev/null +++ b/src/pages/Oss/index.tsx @@ -0,0 +1,234 @@ +import { useState, useEffect } from 'react'; +import { Table, Button, Form, Input, Popconfirm, message, Card, Modal, Tag } from 'antd'; +import { addOssDataAPI, delOssDataAPI, editOssDataAPI, getOssListAPI, enableOssDataAPI, disableOssDataAPI } from '@/api/Oss'; +import type { Oss } from '@/types/app/oss'; +import Title from '@/components/Title'; +import type { ColumnsType } from 'antd/es/table'; + +const StoragePage = () => { + const [loading, setLoading] = useState(false); + const [btnLoading, setBtnLoading] = useState(false); + const [isModalOpen, setIsModalOpen] = useState(false); + const [oss, setOss] = useState({} as Oss); + const [ossList, setOssList] = useState([]); + const [form] = Form.useForm(); + + const columns: ColumnsType = [ + { title: 'ID', dataIndex: 'id', key: 'id', align: 'center', width: 80 }, + { title: '平台', dataIndex: 'platform', key: 'platform', align: 'center', width: 120 }, + { title: 'Access Key', dataIndex: 'accessKey', key: 'accessKey' }, + { title: '地域', dataIndex: 'endPoint', key: 'endPoint' }, + { title: '存储桶', dataIndex: 'bucketName', key: 'bucketName' }, + { title: '域名', dataIndex: 'domain', key: 'domain' }, + { title: '根目录', dataIndex: 'basePath', key: 'basePath', align: 'center', width: 120 }, + { + title: '状态', + dataIndex: 'isEnable', + key: 'isEnable', + align: 'center', + width: 150, + render: (isEnable: number) => ( +
+ + {isEnable ? '开启' : '禁用'} +
+ ) + }, + { + title: '操作', + key: 'action', + fixed: 'right', + align: 'center', + width: 280, + render: (_, record: Oss) => ( +
+ {record.isEnable ? ( + + ) : ( + + )} + + + + delOssData(record.id!)}> + + +
+ ) + } + ]; + + const getOssList = async () => { + setLoading(true); + const { data } = await getOssListAPI(); + setOssList(data as Oss[]); + setLoading(false); + }; + + useEffect(() => { + getOssList(); + }, []); + + const handleEnable = async (id: number) => { + await enableOssDataAPI(id); + message.success('启用成功'); + getOssList(); + }; + + const handleDisable = async (id: number) => { + await disableOssDataAPI(id); + message.success('禁用成功'); + getOssList(); + }; + + const editOssData = (record: Oss) => { + setOss(record); + form.setFieldsValue(record); + setIsModalOpen(true); + }; + + const delOssData = async (id: number) => { + setLoading(true); + await delOssDataAPI(id); + message.success('🎉 删除存储配置成功'); + getOssList(); + }; + + const handleAdd = () => { + setOss({} as Oss); + form.resetFields(); + setIsModalOpen(true); + }; + + const handleCancel = () => { + setIsModalOpen(false); + form.resetFields(); + }; + + const onSubmit = async () => { + setBtnLoading(true); + + try { + const values = await form.validateFields(); + + if (oss.id) { + await editOssDataAPI({ ...oss, ...values }); + message.success('🎉 编辑存储配置成功'); + } else { + await addOssDataAPI(values); + message.success('🎉 新增存储配置成功'); + } + + setIsModalOpen(false); + getOssList(); + form.resetFields(); + } catch (error) { + console.error('表单验证失败:', error); + } + + setBtnLoading(false); + }; + + return ( + <> + + <Button type="primary" size='large' onClick={handleAdd}>新增配置</Button> + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + ); +}; + +export default StoragePage; \ No newline at end of file diff --git a/src/types/app/oss.d.ts b/src/types/app/oss.d.ts new file mode 100644 index 0000000..4380e29 --- /dev/null +++ b/src/types/app/oss.d.ts @@ -0,0 +1,11 @@ +export interface Oss { + id?: number; + platform: string; + accessKey: string; + secretKey: string; + endPoint: string; + bucketName: string; + domain: string; + basePath: string; + isEnable: number; +} \ No newline at end of file