diff --git a/src/components/TeamDeleteButton.jsx b/src/components/TeamDeleteButton.jsx new file mode 100644 index 0000000..b884209 --- /dev/null +++ b/src/components/TeamDeleteButton.jsx @@ -0,0 +1,34 @@ +import { useState } from "react"; +import { Popconfirm, Button, message } from "antd"; + +export default function TeamDeleteButton({ record, onConfirm }) { + const [visiable, setVisiable] = useState(false); + + const handleClick = (record) => { + if (record.size > 0) { + message.warning("该团队下还有成员,无法删除"); + } else { + setVisiable(true); + } + }; + + const handleConfirm = () => { + onConfirm(); + setVisiable(false); + }; + return ( + { + setVisiable(false); + }} + > + + + ); +} diff --git a/src/config/menuConfig.js b/src/config/menuConfig.js index a9aa6a4..004c546 100644 --- a/src/config/menuConfig.js +++ b/src/config/menuConfig.js @@ -1,4 +1,5 @@ import { + ApartmentOutlined, DesktopOutlined, ExperimentOutlined, FileDoneOutlined, @@ -61,6 +62,12 @@ const menuConfig = [ ], roles: ["ADMIN"], }, + { + path: "/admin/team-manage", + icon: ApartmentOutlined, + label: "团队管理", + roles: ["ADMIN"], + }, { path: "/userdetail", label: "个人信息", diff --git a/src/pages/admin/TeamManage.jsx b/src/pages/admin/TeamManage.jsx new file mode 100644 index 0000000..0639fde --- /dev/null +++ b/src/pages/admin/TeamManage.jsx @@ -0,0 +1,138 @@ +import { Button, Flex, Input, Space, Table, message } from "antd"; +import Column from "antd/es/table/Column"; +import { useEffect, useState } from "react"; +import axiosInstance from "../../api/axios"; +import TeamDeleteButton from "../../components/TeamDeleteButton"; + +export default function TeamManage() { + const [teams, setTeams] = useState([]); + const [data, setData] = useState([]); + const [searchName, setSearchName] = useState(); + const [editingId, setEditingId] = useState(); + const [editingName, setEditingName] = useState(""); + const [newTeamName, setNewTeamName] = useState(); + + const fetchData = async () => { + const data = await axiosInstance.get("/teams"); + setData(data); + setTeams(data); + setSearchName(null); + }; + + useEffect(() => { + fetchData(); + }, []); + + const handleSearch = (value) => { + setSearchName(value); + const filtered = data.filter((item) => + item.name.toLowerCase().includes(value.toLowerCase()) + ); + setTeams(filtered); + }; + + const handleDelete = async (record) => { + await axiosInstance.delete(`/team/${record.id}`); + message.success("删除成功"); + fetchData(); + }; + + const handleEdit = (record) => { + setEditingId(record.id); + setEditingName(record.name); + }; + + const handleSave = async (teamId) => { + if (!editingName.trim()) return message.warning("请输入新名称"); + await axiosInstance.put(`/team/${teamId}`, { name: editingName }); + setEditingId(null); + message.success("修改成功"); + await fetchData(); + }; + + const handleAdd = async () => { + if (!newTeamName.trim()) { + message.warning("请输入团队名称"); + return; + } + await axiosInstance.post("/team", { + name: newTeamName, + }); + message.success("添加成功"); + setNewTeamName(null); + fetchData(); + }; + + return ( + <> + + setSearchName(e.target.value)} + value={searchName} + style={{ width: "200px" }} + className="m-4" + /> + setNewTeamName(e.target.value)} + className="m-4" + style={{ width: "300px" }} + /> + + + { + if (record.id === editingId) { + return ( + setEditingName(e.target.value)} + /> + ); + } + return record.name; + }} + /> + + { + return ( + + {record.id === editingId ? ( + + + + + ) : ( + + )} + handleDelete(record)} + /> + + ); + }} + /> +
+ + ); +} diff --git a/src/pages/admin/UserDetailModal.jsx b/src/pages/admin/UserDetailModal.jsx index fdd797f..d34a7e9 100644 --- a/src/pages/admin/UserDetailModal.jsx +++ b/src/pages/admin/UserDetailModal.jsx @@ -16,7 +16,7 @@ export default function UserDetailModal({ const [teams, setTeams] = useState([]); const fetchTeams = async () => { - const data = await axiosInstance.get("/teams"); + const data = await axiosInstance.get("/team-label"); setTeams(data); }; diff --git a/src/pages/user/DeviceDetailModal.jsx b/src/pages/user/DeviceDetailModal.jsx index ae7a205..e03a20a 100644 --- a/src/pages/user/DeviceDetailModal.jsx +++ b/src/pages/user/DeviceDetailModal.jsx @@ -24,7 +24,7 @@ export default function DeviceDetailModal({ visiable, device, onclose }) { const [initialValues, setInitialValues] = useState(); const fetchTeams = async () => { - const data = await axiosInstance.get("/teams"); + const data = await axiosInstance.get("/team-label"); const teams = data.map((item) => ({ label: item.label, value: item.label, diff --git a/src/router/index.jsx b/src/router/index.jsx index d27ee4e..3db1f54 100644 --- a/src/router/index.jsx +++ b/src/router/index.jsx @@ -11,6 +11,7 @@ import DeviceManage from "../pages/deviceAdmin/DeviceManage"; import UserManage from "../pages/admin/UserManage"; import DeviceStats from "../pages/admin/DeviceStats"; import ReservationStats from "../pages/admin/ReservationStats"; +import TeamManage from "../pages/admin/TeamManage"; const router = createBrowserRouter([ { @@ -78,6 +79,10 @@ const router = createBrowserRouter([ path: "stats-reservation", element: , }, + { + path: "team-manage", + element: , + }, ], }, {