diff --git a/src/api/system/dept.ts b/src/api/system/dept.ts new file mode 100644 index 0000000..e50c284 --- /dev/null +++ b/src/api/system/dept.ts @@ -0,0 +1,59 @@ +import request from "../../utils/request"; +interface queryParamsType { + deptName?: string; + state?: number; +} +interface addParamsType { + deptName: string; + leader:string; + leaderId:number; + parentId?:number; + ancestors?:string + delFlag?:string + deptId?:number + email?:string + phone?:string + state?:string + } +export const getDatasAPI = (params: queryParamsType) => { + console.log(params); + + return request({ + url: "/admin/dept", + method: "get", + params: params, + }); +}; +export const editDataAPI = (params: addParamsType) => { + console.log(params); + params.leaderId=0 + return request({ + url: "/admin/dept", + method: "put", + data:params + }); +}; +export const delDataAPI=(deptId:number)=>{ + console.log(deptId); + + return request({ + url:`admin/dept/${deptId}`, + method:'delete' + }) +} +export const addDataAPI=(dept:addParamsType)=>{ + console.log(dept); + dept.leaderId=0 + return request({ + + url:`admin/dept`, + method:'post', + data:dept + }) +} +export const getDataAPI=(deptId:number)=>{ + return request({ + url:`/admin/dept/${deptId}`, + method:'get' + }) +} diff --git a/src/view/system/dept/index.scss b/src/view/system/dept/index.scss new file mode 100644 index 0000000..296a5ac --- /dev/null +++ b/src/view/system/dept/index.scss @@ -0,0 +1,48 @@ +.deptBox{ + background: white; + padding: 20px; + + .tablebox{ + table{ + thead{ + th::before{ + + } + tr{ + .ant-table-cell{ + background: white; + color:#909399 + } + + } + } + tbody{ + tr{ + .ant-table-cell{ + background: white; + color:#606266 + } + + } + } + } + .ant-table-cell{ + button:focus + { + outline: none; + } + button:hover + { + border: 0px rgb(250, 250, 250); + } + } + } + .newAdd{ + + display: flex; + margin-top: 15px; + button{ + margin-left: 15px; + } + } +} \ No newline at end of file diff --git a/src/view/system/dept/index.tsx b/src/view/system/dept/index.tsx index 3012326..8d819ca 100644 --- a/src/view/system/dept/index.tsx +++ b/src/view/system/dept/index.tsx @@ -1,7 +1,586 @@ -import React from "react"; +import React, { useState, createContext, useEffect } from "react"; +import { + Button, + Input, + Select, + message, + Table, + Tag, + Modal, + Form, + InputNumber, + Radio, + ConfigProvider, + TreeSelect, + Row, + Col, + // Icon +} from "antd"; +import type { ColumnsType } from "antd/es/table"; +import { + SyncOutlined, + SearchOutlined, + ExclamationCircleFilled, + SwapOutlined, +} from "@ant-design/icons"; +import zh_CN from "antd/es/locale/zh_CN"; +import "dayjs/locale/zh-cn"; +// import 'moment/locale/zh-cn'; +import { + getDatasAPI, + delDataAPI, + addDataAPI, + editDataAPI, + getDataAPI, +} from "../../../api/system/dept"; +import "./index.scss"; +import { useForm } from "antd/es/form/Form"; +interface searchValueType { + deptName: string | undefined; + state: string | undefined; +} +//表格单项数据类型 +interface TableDataType { + children: number[]; + createTime: string; + deptId: number; + deptName: string; + orderNum: string; + state: string; +} +let thisDept = {}; +let treeData: any = []; +let isTreeAnyId = false; +// const Dayjs=dayjs.Dayjs +export default function Role() { + const { confirm } = Modal; + //提示组件 + const [messageApi, contextHolder] = message.useMessage(); + const [isAllExpend, setIsAllExpend] = useState(true); + //搜索框内所有内容 + let [searchValue, setSearchValue] = useState({ + deptName: undefined, + state: undefined, + }); + // const is + //树列表数据 -export default function Dept() { - return( -
dept
- ) -} \ No newline at end of file + // const [isTreeAnyId,setIsTreeAnyId]=useState(false) + const [treeAnyId, setTreeAnyId] = useState([]); + const [expandedRowKeys, setExpandedRowKeys] = useState([]); + //Modal + const [isModalOpen, setIsModalOpen] = useState(false); + const [modalTitle, setModalTitle] = useState(""); + //表单区域 + const [isDisbaled, setIsDisbaled] = useState(false); + //serach + const [formSearch] = Form.useForm(); + const [formModal] = Form.useForm(); + //当前页面页数 + //表格内数据 + let [tableData, setTableData] = useState([]); + //表格格式 + const columns: ColumnsType = [ + { + title: "部门名称", + dataIndex: "deptName", + key: "deptName", + }, + { + title: "排序", + dataIndex: "orderNum", + key: "orderNum", + }, + { + title: "状态", + key: "state", + dataIndex: "state", + render: (text) => ( + <> + {text === "0" ? ( + 正常 + ) : ( + 停用 + )} + + ), + }, + { + title: "创建时间", + key: "createTime", + dataIndex: "createTime", + }, + { + title: "操作", + key: "", + dataIndex: "", + render: (text) => ( + <> + + {/* */} + + {text.parentId !== 0 ? ( + + ) : null} + + ), + }, + ]; + //请求表格内容参数 + let [queryTableDataParams, setQueryTableDataParams] = useState({ + deptName: undefined, + state: undefined, + }); + const handleDelete = (dept: any) => { + confirm({ + title: "系统提示", + icon: , + content: `确定删除角色名称为${dept.deptName}的数据吗`, + okText: "确定", + okType: "danger", + cancelText: "取消", + onOk() { + (async () => { + try { + let { code } = await delDataAPI(dept.deptId); + if (code === 1000) { + console.log("del", dept.deptId); + messageApi.open({ + type: "success", + content: "操作成功", + }); + getDatas({}); + } + } catch (error) { + console.log(error); + } + })(); + }, + onCancel() { + console.log("Cancel"); + }, + }); + }; + const handleSerach = () => { + // console.log("搜索框", searchValue); + // setSearchValue({ ...searchValue }); + searchValue = formSearch.getFieldsValue(); + console.log(searchValue); + // queryTableDataParams={...searchValue} + setQueryTableDataParams({ ...searchValue }); + }; + const handleReset = () => { + formSearch.resetFields(); + searchValue = formSearch.getFieldsValue(); + + setQueryTableDataParams({ ...searchValue }); + // setSearchValue({ ...searchValue }); + // setCount(1) + }; + const handleEdit = async (dept: any) => { + if (dept.parentId === 0) { + setIsDisbaled(true); + formModal.setFieldsValue({ ...thisDept, parentId: dept.deptName }); + } else { + setIsDisbaled(false); + // formModal.setFieldsValue({...thisDept}); + } + await getData(dept.deptId); + if (dept.parentId === 0) { + setIsDisbaled(true); + formModal.setFieldsValue({ ...thisDept, parentId: dept.deptName }); + } else { + setIsDisbaled(false); + formModal.setFieldsValue({ ...thisDept }); + } + console.log(thisDept); + setModalTitle("修改角色"); + setIsModalOpen(true); + // formModal.setFieldsValue({...thisDept}); + // formModal.setFieldsValue({...thisDept,parentId:dept.deptName}); + }; + const handleNewAdd = (deptId?: string) => { + setModalTitle("新增角色"); + setIsModalOpen(true); + if (deptId) { + formModal.setFieldsValue({ + parentId: deptId, + deptName: undefined, + orderNum: 0, + leader: undefined, + phone: undefined, + email: undefined, + state: "0", + }); + } else + formModal.setFieldsValue({ + parentId: undefined, + deptName: undefined, + orderNum: 0, + leader: undefined, + phone: undefined, + email: undefined, + state: "0", + }); + }; + const handleModalOk = () => { + formModal + .validateFields() + .then((values) => { + // form.resetFields(); + console.log("add", values); + // onCreate(values); + // setSelectedKeys([]) + // setIsModalOpen(false); + if (modalTitle == "新增角色") { + console.log(values); + postAdd(values); + } else if (modalTitle == "修改角色") { + editData(values); + } + }) + .catch((info) => { + console.log("Validate Failed:", info); + }); + }; + //遍历菜单树获取所有节点ID + const getTree = function (tree: any) { + tree.title = tree.deptName; + tree.value = tree.deptId; + if (!isTreeAnyId) { + treeAnyId.push(tree.deptId); + setTreeAnyId([...treeAnyId]); + } + if (tree.children) { + for (let child of tree.children) { + getTree(child); + } + } + // treeData=tree + }; + const handleModalCanle = () => { + setIsModalOpen(false); + }; + //获取详细数据 + const getData = async (deptId: number) => { + try { + const { code, data } = await getDataAPI(deptId); + if (code === 1000) { + thisDept = data; + // console.log(thisDept); + } + } catch (error) {} + }; + //修改数据 + const editData = async (dept: any) => { + try { + console.log(thisDept); + + console.log({ ...thisDept, ...dept }); + + const { code } = await editDataAPI({ ...thisDept, ...dept }); + if (code === 1000) { + messageApi.open({ + type: "success", + content: "操作成功", + }); + setIsModalOpen(false); + getDatas(queryTableDataParams); + } else { + messageApi.open({ + type: "error", + content: "操作失败", + }); + } + } catch (error) {} + }; + //获取部门数据 + const getDatas = async (queryTableDataParams: any) => { + console.log("参数:", queryTableDataParams); + try { + const { code, data } = await getDatasAPI(queryTableDataParams); + console.log(data); + + if (code === 1000) { + // console.log(isTreeAnyId); + + for (let child of data) { + getTree(child); + } + setExpandedRowKeys([...treeAnyId]); + // console.log(treeAnyId); + console.log(data); + + setTableData(data); + treeData = data; + console.log(treeData); + + // setTotal(data.total); + } + } catch (err: any) { + console.log("555", err); + } + isTreeAnyId = true; + }; + //新增 + const postAdd = async (dept: any) => { + try { + let { code } = await addDataAPI(dept); + console.log(code); + + if (code === 1000) { + console.log("success"); + messageApi.open({ + type: "success", + content: "操作成功", + }); + formModal.setFieldsValue({}); + getDatas({ ...queryTableDataParams }); + setIsModalOpen(false); + } else { + messageApi.open({ + type: "error", + content: "角色名称已存在", + }); + } + } catch (error) {} + }; + useEffect(() => { + queryTableDataParams = { + ...queryTableDataParams, + }; + + getDatas(queryTableDataParams); + // console.log(queryParams); + console.log(tableData); + }, [queryTableDataParams]); + return ( + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 正常 + + 停用 + + + + +
+ + {/* 表格 */} +
+ {contextHolder} + { + // console.log(expanded, record); + + if (expanded) { + setExpandedRowKeys([record.deptId, ...expandedRowKeys]); + } else { + const newEx = expandedRowKeys.filter((element) => { + return element != record.deptId; + }); + // console.log(expandedRowKeys); + + setExpandedRowKeys(newEx); + } + console.log(expandedRowKeys); + }} + columns={columns} + rowKey={"deptId"} + dataSource={tableData} + pagination={false} + /> + + + + ); +} diff --git a/src/view/system/role/index.scss b/src/view/system/role/index.scss index 8eea52c..398b604 100644 --- a/src/view/system/role/index.scss +++ b/src/view/system/role/index.scss @@ -3,39 +3,48 @@ height: 100%; background-color: white; padding: 15px; - .SearchBox{ - display: flex; - flex-wrap: wrap; - .ipt{ - margin-top: 10px; - margin-right: 10px; - height: 32px; - line-height: 32px; - display: flex; - span{ - font-weight: 700; - // line-height: 32px; - padding-right: 12px; - // color: #606266; - } - .item,input{ - flex: 1; - font-weight: 400; - // width: 300px; - margin-right: 40px; - .ant-space-item{ - // margin-left: 500px; - width: 500px; - } - } - } - .btn{ - button{ - margin-right: 15px; - } - margin-top: 10px; - } - } + // display: flex; + // flex-wrap: wrap; + // .SearchBox{ + // display: flex; + // flex-wrap: wrap; + // .ipt{ + // margin-top: 10px; + // margin-right: 10px; + // height: 32px; + // line-height: 32px; + // display: flex; + // span{ + // font-weight: 700; + // // line-height: 32px; + // padding-right: 12px; + // // color: #606266; + // } + // .item,input{ + // flex: 1; + // font-weight: 400; + // // width: 300px; + // margin-right: 40px; + // .ant-space-item{ + // // margin-left: 500px; + // width: 500px; + // } + // } + // } + // .btn{ + // button{ + // margin-right: 15px; + // } + // margin-top: 10px; + // } + // } + // .btn{ + + // button{ + // margin-right: 15px; + // } + // margin-top: 10px; + // } .tablebox{ table{ thead{ diff --git a/src/view/system/role/index.tsx b/src/view/system/role/index.tsx index 8f8bba3..ecd40a4 100644 --- a/src/view/system/role/index.tsx +++ b/src/view/system/role/index.tsx @@ -26,9 +26,9 @@ import { ExclamationCircleFilled, } from "@ant-design/icons"; import zh_CN from "antd/es/locale/zh_CN"; -import dataLocale from 'antd/es/date-picker/locale/zh_CN' -import 'dayjs/locale/zh-cn'; -import dayjs,{Dayjs} from "dayjs"; +import dataLocale from "antd/es/date-picker/locale/zh_CN"; +import "dayjs/locale/zh-cn"; +import dayjs, { Dayjs } from "dayjs"; // import 'moment/locale/zh-cn'; import "./index.scss"; import { @@ -40,20 +40,8 @@ import { getMenuLiseAPI, } from "../../../api/system/role"; import { useForm } from "antd/es/form/Form"; -interface getSearchValueType { - getSearchValue: (value: any) => void; -} -type FieldType = { - username?: string; - password?: string; - remember?: string; -}; -interface Values { - title: string; - description: string; - modifier: string; -} interface searchValueType { + dateTime: string[] | undefined; roleName: string | undefined; roleKey: string | undefined; state: string | undefined; @@ -82,17 +70,16 @@ const fieldNames = { children: "children", }; let thisrole: any = {}; -let treeIds:number[]=[] +let treeIds: number[] = []; // const Dayjs=dayjs.Dayjs export default function Role() { const { confirm } = Modal; const { RangePicker } = DatePicker; - //时间值 - const [selectedDate, setSelectedDate] = useState<[Date:null,Date:null]>([null,null]); //提示组件 const [messageApi, contextHolder] = message.useMessage(); //搜索框内所有内容 let [searchValue, setSearchValue] = useState({ + dateTime: undefined, roleName: undefined, roleKey: undefined, startTime: undefined, @@ -102,7 +89,7 @@ export default function Role() { //树列表数据 const [menuTreeData, setMenuTreeData] = useState([]); //父子联动 - const [checkStrictly,setCheckStrictly]=useState(false) + const [checkStrictly, setCheckStrictly] = useState(false); //树所有节点IDs //树是否自动展开 const [expandedKeys, setExpandedKeys] = useState([]); @@ -114,6 +101,8 @@ export default function Role() { const [modalTitle, setModalTitle] = useState(""); //表单区域 const [form] = Form.useForm(); + //serach + const [formSearch] = Form.useForm(); //当前页面页数 let [count, setCount] = useState(1); //表格内数据 @@ -214,28 +203,26 @@ export default function Role() { const onCheckExpand = (e: CheckboxChangeEvent) => { console.log(`checked = ${e.target.checked}`); console.log(treeIds); - if(e.target.checked) setExpandedKeys(treeIds) - else setExpandedKeys([]) + if (e.target.checked) setExpandedKeys(treeIds); + else setExpandedKeys([]); console.log(expandedKeys); - }; const onCheckAll = (e: CheckboxChangeEvent) => { console.log(`checked = ${e.target.checked}`); - if(e.target.checked) setCheckedKeys(treeIds) - else setCheckedKeys([]) + if (e.target.checked) setCheckedKeys(treeIds); + else setCheckedKeys([]); }; const onCheckFaSon = (e: CheckboxChangeEvent) => { console.log(`checked = ${e.target.checked}`); - setCheckStrictly(!e.target.checked) + setCheckStrictly(!e.target.checked); }; const onTreeCheck = (checkedKeysValue: any) => { console.log("onCheck", checkedKeysValue.checked); console.log("onCheck", checkedKeysValue); - if(checkStrictly===false){ + if (checkStrictly === false) { form.setFieldsValue({ menuIds: checkedKeysValue }); setCheckedKeys(checkedKeysValue); - } - else{ + } else { form.setFieldsValue({ menuIds: checkedKeysValue.checked }); setCheckedKeys(checkedKeysValue.checked); } @@ -272,21 +259,31 @@ export default function Role() { }); }; const handleSerach = () => { - console.log("搜索框", searchValue); - setSearchValue({ ...searchValue }); + // console.log("搜索框", searchValue); + // setSearchValue({ ...searchValue }); + searchValue = formSearch.getFieldsValue(); + if (typeof searchValue.dateTime !== "undefined") { + searchValue.startTime = (searchValue.dateTime as string[])[0]; + searchValue.endTime = (searchValue.dateTime as string[])[1]; + } + + console.log(searchValue); count = 1; + // queryTableDataParams={...searchValue} setQueryTableDataParams({ ...searchValue }); }; - const handleSerachNew = () => { - searchValue = { - roleName: undefined, - roleKey: undefined, - startTime: undefined, - state: undefined, - endTime: undefined, - }; + const handleReset = () => { + formSearch.resetFields(); + searchValue =formSearch.getFieldsValue() + // searchValue = { + // roleName: undefined, + // roleKey: undefined, + // startTime: undefined, + // state: undefined, + // endTime: undefined, + // }; setQueryTableDataParams({ ...searchValue }); - setSearchValue({ ...searchValue }); + // setSearchValue({ ...searchValue }); // setCount(1) }; //Modal区域 @@ -313,7 +310,6 @@ export default function Role() { thisrole = { ...thisrole, ...values, menuIds: checkedKeys }; editRoleData({ ...thisrole }); } - }) .catch((info) => { console.log("Validate Failed:", info); @@ -334,7 +330,7 @@ export default function Role() { dataScope: "1", roleSort: "0", }); - + setCheckedKeys([]); setIsModalOpen(true); }; @@ -346,31 +342,17 @@ export default function Role() { console.log(valueDate); searchValue.startTime = dateString[0]; searchValue.endTime = dateString[1]; + formSearch.setFieldsValue({ dateTime: [dateString[0], dateString[1]] }); console.log("time:", searchValue.endTime, searchValue.startTime); // setSearchValue({ ...searchValue }) }; - const onDataChangeOk = ( - value: DatePickerProps["value"] | RangePickerProps["value"] - ) => { - console.log("onOk: ", value); - }; const filterOption = ( input: string, option?: { label: string; value: string } ) => (option?.label ?? "").toLowerCase().includes(input.toLowerCase()); - const onStateChange = (value: string) => { - searchValue.state = value; - // setSearchValue({ ...searchValue, state: value }) - // searchValue.state = values - // console.log(value); - }; - const onSearch = (value: string) => { - console.log("search:", value); - }; //表格函数 //从服务器获取数据 - //页码改变 const pageChange = (page: number, pageSize: number) => { console.log(page, pageSize); @@ -387,14 +369,14 @@ export default function Role() { del(roleId); }; //遍历菜单树获取所有节点ID - const getTreeIds=function(tree:any){ + const getTreeIds = function (tree: any) { // console.log('Ids:',tree); - tree.forEach((item:any) => { + tree.forEach((item: any) => { // console.log(item); - treeIds.push(item.menuId) - if(item.children!=null) getTreeIds(item.children) + treeIds.push(item.menuId); + if (item.children != null) getTreeIds(item.children); }); - } + }; //获取单个角色详细信息 const getRoleData = async (role: any) => { // const {roleId,roleKey,roleName,roleSort,dataScope,state,meunIds}=role @@ -418,12 +400,11 @@ export default function Role() { try { let menul = await getMenuLiseAPI(); console.log("tree", menul.data); - if(treeIds.length==0) getTreeIds(menul.data) + if (treeIds.length == 0) getTreeIds(menul.data); console.log(treeIds); setMenuTreeData(menul.data); // treeData = menul.data // setMenulist(menul.data) - } catch (error) { console.log(error); } @@ -532,9 +513,10 @@ export default function Role() { // setQueryParams({...queryParams,...valueSch}) queryTableDataParams = { ...queryTableDataParams, - ...searchValue, + // ...searchValue, pageNum: count, }; + // setQueryTableDataPaams(queryTableDataParams) // setCount(1) getRolesData(queryTableDataParams); // console.log(queryParams); @@ -545,86 +527,91 @@ export default function Role() { return (
-
-
- 角色名称 -
- { - setSearchValue({ ...searchValue, roleName: e.target.value }); - }} + +
+ + { + // setSearchValue({ ...searchValue, roleName: e.target.value }); + // }} + /> + + + { + // setSearchValue({ ...searchValue, roleKey: e.target.value }); + // }} + /> + + + { - setSearchValue({ ...searchValue, roleKey: e.target.value }); - }} - /> -
-
-
- 状态 -
-