From ba59eadd3462a4e47570f069a1ac9a668768135e Mon Sep 17 00:00:00 2001 From: wang_yp <357754663@qq.com> Date: Thu, 26 Sep 2024 00:21:57 +0800 Subject: [PATCH] fix(api):update store --- README.md | 1 - src/App.tsx | 16 +++ src/components/layout/layout.tsx | 76 ++++++++---- src/pages/archives/archive.tsx | 139 ---------------------- src/pages/archives/archivesCat_clumn.tsx | 4 +- src/pages/home/home.less | 15 +-- src/pages/home/homeLeft/home_left.tsx | 109 +++++++++++++++-- src/pages/home/homeLeft/left.less | 26 +++- src/pages/home/homeLeft/orgin.tsx | 18 +++ src/pages/leaveApproval/index.tsx | 18 ++- src/pages/leaveApproval/levcat_column.tsx | 64 ++++++++++ src/pages/leaveApproval/level.tsx | 106 +++++++++++++++++ src/pages/leaveApproval/levelCat.tsx | 127 ++++++++++++++++++++ src/static/orgin.png | Bin 0 -> 11996 bytes src/static/orgin2.png | Bin 0 -> 13090 bytes src/store/index.ts | 6 +- src/store/leave.ts | 28 +++++ src/store/leave_cat.ts | 20 ++++ src/util/socket.ts | 38 ++++++ 19 files changed, 622 insertions(+), 189 deletions(-) create mode 100644 src/pages/home/homeLeft/orgin.tsx create mode 100644 src/pages/leaveApproval/levcat_column.tsx create mode 100644 src/pages/leaveApproval/level.tsx create mode 100644 src/pages/leaveApproval/levelCat.tsx create mode 100644 src/static/orgin.png create mode 100644 src/static/orgin2.png create mode 100644 src/store/leave.ts create mode 100644 src/store/leave_cat.ts create mode 100644 src/util/socket.ts diff --git a/README.md b/README.md index 88ab3e2..3708155 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,6 @@ To learn React, check out the [React documentation](https://reactjs.org/). 2、武装力量 根据队伍统计 3、年度训练 按照年度统计类别,次数 (任务发布时,可选择多个类别) - 4、物资管理 5、档案管理 diff --git a/src/App.tsx b/src/App.tsx index cd0815b..d41109d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,21 @@ import { Outlet } from "react-router"; import MyComponent from "./components/errorComp"; +import MapUtl from "./components/map/mapUtil"; +const { socket } = require("./util/socket"); +socket.init(); +socket.onmessage((e) => { + const data = JSON.parse(e.data); + // if (data.type === "heartbeat") { + // MapUtl.makerList[0].setPosition([103.55, 30.342]); + // var m = MapUtl.amap; + // var newIcon = new m.Icon({ + // image: "//a.amap.com/jsapi_demos/static/demo-center/icons/dir-marker.png", //Icon 的图像 + // size: new m.Size(25, 34), // 图标大小 + // anchor: new m.Pixel(12, 32), // 图标锚点 + // }); + // MapUtl.makerList[0].setIcon(newIcon); + // } +}); const App = () => { return ( <> diff --git a/src/components/layout/layout.tsx b/src/components/layout/layout.tsx index a5fe1a7..6b90ae6 100644 --- a/src/components/layout/layout.tsx +++ b/src/components/layout/layout.tsx @@ -11,54 +11,80 @@ const LayOut = (props: Store) => { const { usrStore } = props; const nav = useNavigate(); const location = useLocation(); - + useEffect(() => { if (usrStore.isNeedLogin) { nav("/login"); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line react-hooks/exhaustive-deps }, [usrStore.isNeedLogin]); const items = [ { key: "/admin/user", label: `用户管理`, - }, - { - key: "/admin/dep", - label: `部门管理`, + children: [ + { + key: "/admin/dep", + label: `部门管理`, + }, + { + key: "/admin/user", + label: `用户管理`, + }, + { + key: "/admin/teamMgmt", + label: `队伍属性管理`, + }, + { + key: "/admin/persMgmt", + label: `个人身份管理`, + }, + ], }, { key: "/admin/archives", label: `档案管理`, }, { - key: "/admin/whse/whseMgmt", - label: `仓库管理`, - }, - { - key: "/admin/materialMgmt", + key: "/admin/material", label: `物资管理`, + children: [ + { + key: "/admin/whse/whseMgmt", + label: `仓库管理`, + }, + { + key: "/admin/materialMgmt", + label: `物资管理`, + }, + ], }, { key: "/admin/leaveApproval", label: `请假审批`, }, { - key: "/admin/politicalStudy", - label: `政治学习`, + key: "/admin/political", + label: `政治法规`, + children: [ + { + key: "/admin/politicalStudy", + label: `政治学习`, + }, + { + key: `/admin/polRegulations`, + label: `政治法规管理`, + }, + ], }, { - key: `/admin/polRegulations`, - label: `政治法规管理`, - }, - - { - key: "/admin/teamMgmt", - label: `队伍属性管理`, - }, - { - key: "/admin/persMgmt", - label: `个人身份管理`, + key: "/admin/task", + label: `任务管理`, + children: [ + { label: "处突任务", key: "/admin/emergency" }, + { label: "巡逻任务", key: "/admin/patrol" }, + { label: "训练任务", key: "/admin/training" }, + ], }, ]; return ( @@ -72,7 +98,7 @@ const LayOut = (props: Store) => { display: "flex", alignItems: "center", padding: "0 10px", - boxSizing: "border-box" + boxSizing: "border-box", }} > { -// const { folderStore,archivesStore } = props; -// const [isModalOpen, setIsModalOpen] = useState(false); -// const [isModalOpenArchives, setIsModalOpenArchives] = -// useState(false); - -// const [projectConfig, setProjectConfig] = useState([]); -// const formRef = React.useRef(null); -// const [tagId, setId] = useState(null); -// const [folderList, setfolderList] = useState(null); // 仓库列表 -// const onFinish = (values: any) => { -// let data = values; -// if (!tagId) { -// folderStore.add(data); -// } else { -// folderStore.putItem(tagId, data); -// } -// setIsModalOpen(false); -// }; -// useEffect(() => { -// folderStore.getlist().then(()=>{ -// setfolderList(folderStore.list); -// }); - -// }, [folderStore]); - -// // 添加事件 -// const addHandler = () => { -// setProjectConfig(folderConfig); -// setIsModalOpen(true); -// }; - -// // 取消 -// const cancelHandler = () => { -// setId(null); -// setIsModalOpen(false); -// }; - -// const cancelHandlerArch = () => { -// setIsModalOpenArchives(false); -// }; - -// // 文件夹点击 -// const folderHandle = () => { -// setIsModalOpenArchives(true); -// }; -// const onFinishFailed = () => {}; -// return ( -//
-// -// -// -// -// column_widget(any, record), -// }, -// ]} -// dataSource={archivesStore.list} -// /> -// cancelHandlerArch} -// onCancel={cancelHandlerArch} -// > -// -// formRef.current?.resetFields()} -// onOk={() => formRef.current?.submit()} -// onCancel={cancelHandler} -// > -// {}} -// formName="card_basic" -// colProps={12} -// span={6} -// subBtnName="提交" -// formDatas={projectConfig} -// onFinish={onFinish} -// initialValues={true} -// onFinishFailed={onFinishFailed} -// > -// -// -// -// -// -// -//
-// ); -// }; - -// export default inject(...["archivesStore", "folderStore"])( -// observer(Archive) -// ); - - import { Button, Space, Modal, FormInstance, Select } from "antd"; import { inject, observer } from "mobx-react"; import BTable from "@/components/b_table"; diff --git a/src/pages/archives/archivesCat_clumn.tsx b/src/pages/archives/archivesCat_clumn.tsx index f52a4b6..f9e86d4 100644 --- a/src/pages/archives/archivesCat_clumn.tsx +++ b/src/pages/archives/archivesCat_clumn.tsx @@ -24,14 +24,14 @@ export const defaultConfig = [ { type: FormType.input, label: "档案名称", - name: "archives_name", + name: "category_name", value: "", rules: [{ required: true, message: "请输入分类名称!" }], }, { type: FormType.input, label: "档案描述", - name: "archives_desc", + name: "category_desc", value: "", }, { diff --git a/src/pages/home/home.less b/src/pages/home/home.less index 684b6ed..e90e9a7 100644 --- a/src/pages/home/home.less +++ b/src/pages/home/home.less @@ -41,10 +41,9 @@ position: absolute; left: 0px; top: 80px; - bottom: 10px; - width: 15%; - bottom: 80px; - z-index: 1; + width: 20%; + bottom: 0px; + z-index: 2; opacity: 1; background: rgba(37, 52, 70, 0.4); backdrop-filter: blur(10px); @@ -53,21 +52,19 @@ position: absolute; right: 0px; top: 80px; - bottom: 80px; - width: 15%; - z-index: 1; + bottom: 0px; + width: 20%; + z-index: 2; opacity: 1; background: rgba(37, 52, 70, 0.4); backdrop-filter: blur(10px); } .map_container_b{ position: absolute; - right: 0px; bottom: 0px; background: rgba(37, 52, 70, 0.4); height: 80px; width: 100%; - left: 0; z-index: 1; text-align: center; .bottom_content{ diff --git a/src/pages/home/homeLeft/home_left.tsx b/src/pages/home/homeLeft/home_left.tsx index 7db6377..d7f895f 100644 --- a/src/pages/home/homeLeft/home_left.tsx +++ b/src/pages/home/homeLeft/home_left.tsx @@ -1,21 +1,109 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { Modal } from "antd"; import "./left.less"; import { useNavigate } from "react-router"; import MapUtl from "@/components/map/mapUtil"; +import * as echarts from "echarts"; +import Orgin from "./orgin"; const HomeLeft = () => { const [isModalOpen, setIsModalOpen] = useState(false); const navigate = useNavigate(); + const initChart = () => { + var myChart = echarts.init(document.getElementById("xunlian")); + var option = { + xAxis: { + type: "category", + data: ["应急抢险", "消防灭火", "水上救援", "民兵训练", "维稳处突"], + axisLabel: { + show: true, + interval: 0, + rotate: 30, + }, + }, + grid: { + top: "10%", + bottom: "45%", + right: "5%", + }, + yAxis: { + type: "value", + splitLine: { + show: false, // 去除网格线 + }, + }, + series: [ + { + data: [10, 15, 27, 10, 18], + type: "line", + smooth: true, + areaStyle: { + opacity: 0.1, + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: "rgb(128, 255, 165)", + }, + { + offset: 1, + color: "rgb(1, 191, 236)", + }, + ]), + }, + }, + ], + }; + option && myChart.setOption(option); + }; + + const initChart2 = () => { + var myChart = echarts.init(document.getElementById("orgin1")); + var option = { + xAxis: { + type: 'category', + data: ['基干民兵', '普通民兵', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + axisLabel: { + show: true, + interval: 0, + rotate: 30, + }, + }, + grid: { + top: "10%", + bottom: "45%", + right: "5%", + }, + yAxis: { + type: 'value', + splitLine: { + show: false, // 去除网格线 + }, + }, + series: [ + { + data: [120, 200, 150, 80, 70, 110, 130], + type: 'bar' + } + ] + }; + option && myChart.setOption(option); + }; + useEffect(() => { + initChart(); + }, []); + + useEffect(() => { + initChart2(); + }, []); const openDispatch = () => { // 位置移动 - MapUtl.makerList[0].setPosition([103.55, 30.342]); - var m = MapUtl.amap; - var newIcon = new m.Icon({ - image: "//a.amap.com/jsapi_demos/static/demo-center/icons/dir-marker.png", //Icon 的图像 - size: new m.Size(25, 34), // 图标大小 - anchor: new m.Pixel(12, 32), // 图标锚点 - }); - MapUtl.makerList[0].setIcon(newIcon); + // MapUtl.makerList[0].setPosition([103.55, 30.342]); + // var m = MapUtl.amap; + // var newIcon = new m.Icon({ + // image: "//a.amap.com/jsapi_demos/static/demo-center/icons/dir-marker.png", //Icon 的图像 + // size: new m.Size(25, 34), // 图标大小 + // anchor: new m.Pixel(12, 32), // 图标锚点 + // }); + // MapUtl.makerList[0].setIcon(newIcon); }; const jumpToUser = () => { navigate("admin/user"); @@ -27,16 +115,19 @@ const HomeLeft = () => {

组织架构

+

武装力量

+

年度训练

+
span{ + position: absolute; + left: 0; + right: 0; + } + >img{ + width: 100%; + } + } + } } } \ No newline at end of file diff --git a/src/pages/home/homeLeft/orgin.tsx b/src/pages/home/homeLeft/orgin.tsx new file mode 100644 index 0000000..5707e8f --- /dev/null +++ b/src/pages/home/homeLeft/orgin.tsx @@ -0,0 +1,18 @@ +import origin from "@/static/orgin.png"; +import origin2 from "@/static/orgin2.png"; +const Orgin = () => { + return ( +
+
+ 234 + +
+
+ 238 + +
+
+ ); +}; + +export default Orgin; diff --git a/src/pages/leaveApproval/index.tsx b/src/pages/leaveApproval/index.tsx index a63572e..63c2d41 100644 --- a/src/pages/leaveApproval/index.tsx +++ b/src/pages/leaveApproval/index.tsx @@ -1,7 +1,23 @@ +import { Tabs, TabsProps } from "antd"; +import Leave from "./level"; +import LeaveCat from "./levelCat"; + const LeaveApproval = () => { + const items: TabsProps["items"] = [ + { + key: "1", + label: "请假分类管理", + children: , + }, + { + key: "2", + label: "请假管理", + children: , + }, + ]; return ( <> -

leaveApproval

+ ); }; diff --git a/src/pages/leaveApproval/levcat_column.tsx b/src/pages/leaveApproval/levcat_column.tsx new file mode 100644 index 0000000..ebab0f7 --- /dev/null +++ b/src/pages/leaveApproval/levcat_column.tsx @@ -0,0 +1,64 @@ +import { FormType } from "@/components/form/interface"; +import { UserDataType } from "@/model/userModel"; +import { ColumnsType } from "antd/lib/table"; +export const columns: ColumnsType = [ + { + title: "分类名称", + dataIndex: "name", + }, +]; + +export const leaveColumns: ColumnsType = [ + { + title: "请假人", + dataIndex: "user_name", + }, + { + title: "请假开始时间", + dataIndex: "leave_start_time", + }, + { + title: "请假结束时间", + dataIndex: "leave_end_time", + }, + { + title: "请假备注", + dataIndex: "leave_remark", + }, + { + title: "驳回原因", + dataIndex: "reject", + }, + { + title: "审批人", + dataIndex: "audit_name", + }, + { + title: "假期类别", + dataIndex: "name", + }, + { + title: "审核状态", + dataIndex: "status", + render(value, record, index) { + return record.status === 1 + ? "已通过" + : record.status === 2 + ? "已驳回" + : "待审批"; + }, + }, +]; + +export const defaultConfig = [ + + { + type: FormType.input, + label: "驳回原因", + name: "reject", + value: "", + rules: [{ required: true, message: "请输入驳回原因!" }], + }, + +]; + diff --git a/src/pages/leaveApproval/level.tsx b/src/pages/leaveApproval/level.tsx new file mode 100644 index 0000000..3914f02 --- /dev/null +++ b/src/pages/leaveApproval/level.tsx @@ -0,0 +1,106 @@ +import BTable from "@/components/b_table"; +import { inject, observer } from "mobx-react"; +import { Store } from "antd/lib/form/interface"; +import { Button, FormInstance, Modal, Space } from "antd"; +import { defaultConfig, leaveColumns } from "./levcat_column"; +import { useEffect, useState } from "react"; +import SimpleForm from "@/components/form/simple_form"; +import React from "react"; +const Leave = (props: Store) => { + const { leaveStore } = props; + const formRef = React.useRef(null); + const [record, setRecord] = useState(null); + const [isModalOpen, setIsModalOpen] = useState(false); + const [projectConfig, setProjectConfig] = useState([]); + useEffect(() => { + leaveStore.getlist(); + setProjectConfig(defaultConfig); + }, [leaveStore]); + const onFinish = (values: any) => { + let data = { + ...values, + status: 2, + }; + leaveStore.access(record.id, data); + setIsModalOpen(false); + }; + const onFinishFailed = () => {}; + const edit = (record) => { + setIsModalOpen(true); + setRecord(record); + }; + const access = (record) => { + leaveStore.access(record.id, { status: 1 }); + }; + const column_widget = (any, record) => { + if (record.status===0){ + return ( + + + + + ); + } + return
; + + }; + return ( + <> + column_widget(any, record) + }, + ]} + dataSource={leaveStore.list} + /> + formRef.current?.resetFields()} + onOk={() => formRef.current?.submit()} + onCancel={() => { + setIsModalOpen(false); + }} + > + + + + ); +}; + +// export default Leave; +export default inject("leaveStore")(observer(Leave)); diff --git a/src/pages/leaveApproval/levelCat.tsx b/src/pages/leaveApproval/levelCat.tsx new file mode 100644 index 0000000..adba966 --- /dev/null +++ b/src/pages/leaveApproval/levelCat.tsx @@ -0,0 +1,127 @@ +import { Button, Space, Modal, FormInstance } from "antd"; +import { inject, observer } from "mobx-react"; +import BTable from "@/components/b_table"; +import { useEffect, useState } from "react"; +import { Store } from "antd/lib/form/interface"; +import SimpleForm from "@/components/form/simple_form"; +import React from "react"; +import { columns, defaultConfig } from "./levcat_column"; + +const LeaveCat = (props: Store) => { + const { leaveCategoryStore } = props; + const [isModalOpen, setIsModalOpen] = useState(false); + const [projectConfig, setProjectConfig] = useState([]); + const formRef = React.useRef(null); + const [record, setRecord] = useState(null); + useEffect(() => { + leaveCategoryStore.getlist(); + setProjectConfig(defaultConfig); + }, [leaveCategoryStore]); + const column_widget = (any, record) => { + return ( + + + + + + ); + }; + const edit = (record) => { + setIsModalOpen(true); + setRecord(record); + }; + const onFinish = (values: any) => { + let data = { + ...values, + pid:values.pid??0 + }; + if (!record?.id) { + leaveCategoryStore.add(data); + } else { + leaveCategoryStore.putItem(record.id, data); + } + setIsModalOpen(false); + }; + + const onFinishFailed = () => {}; + return ( +
+ + + + + column_widget(any, record), + }, + ]} + dataSource={leaveCategoryStore.list} + /> + formRef.current?.resetFields()} + onOk={() => formRef.current?.submit()} + onCancel={() => { + setIsModalOpen(false); + }} + > + { + if (record?.id) { + formRef.current?.setFieldsValue(record); + } else { + formRef.current?.setFieldsValue(null); + } + }} + formName="card_basic" + colProps={25} + subBtnName="提交" + formDatas={projectConfig} + onFinish={onFinish} + initialValues={true} + onFinishFailed={onFinishFailed} + /> + + +
+ ); +}; + +export default inject("leaveCategoryStore")(observer(LeaveCat)); diff --git a/src/static/orgin.png b/src/static/orgin.png new file mode 100644 index 0000000000000000000000000000000000000000..20653f8cf9503cc6dae6d482b8a13781d4d02f3c GIT binary patch literal 11996 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

(mm0RAlg-yplxGj*{A-jW3d?Rtb7W%?5!(^ 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 literal 0 HcmV?d00001 diff --git a/src/store/index.ts b/src/store/index.ts index a005b8f..0a1c2e0 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -13,6 +13,8 @@ import { materialCatStore } from './materialCat'; import { materialStore } from './materialStore'; import { regulationsCatStore } from './regulationsCat'; import { regulationsStore } from './regulations'; +import { leaveCategoryStore } from './leave_cat'; +import { leaveStore } from './leave'; const store = { usrStore, @@ -29,7 +31,9 @@ const store = { materialCatStore, materialStore, regulationsCatStore, - regulationsStore + regulationsStore, + leaveCategoryStore, + leaveStore }; export default store; \ No newline at end of file diff --git a/src/store/leave.ts b/src/store/leave.ts new file mode 100644 index 0000000..5e92804 --- /dev/null +++ b/src/store/leave.ts @@ -0,0 +1,28 @@ +import { action, makeObservable } from "mobx"; +// 档案分类 +import BaseStore from "./baseStore"; +import { TagDataType } from "@/model/userModel"; +import baseHttp from "@/service/base"; + + +class LeaveConfig { + static LIST: string = "leave/list" + static ADD: string = "leave" + static DELETE: string = "leave" + static EDIT: string = "leave" + static ACCESS: string = "leave/access" +} +class LeaveStore extends BaseStore { + constructor() { + super(LeaveConfig) + makeObservable(this, { + access: action + }) + } + async access(id: number, param: any) { + await baseHttp.put(LeaveConfig.ACCESS + "/" + id, param) + this.getlist() + } +} +export const leaveStore = new LeaveStore() + diff --git a/src/store/leave_cat.ts b/src/store/leave_cat.ts new file mode 100644 index 0000000..b42fbcb --- /dev/null +++ b/src/store/leave_cat.ts @@ -0,0 +1,20 @@ +import { makeObservable } from "mobx"; +// 档案分类 +import BaseStore from "./baseStore"; +import { TagDataType } from "@/model/userModel"; + + +class LeaveCategoryConfig { + static LIST: string = "leave/category/list" + static ADD: string = "leave/category" + static DELETE: string = "leave/category" + static EDIT: string = "leave/category" +} +class LeaveCategoryStore extends BaseStore { + constructor() { + super(LeaveCategoryConfig) + makeObservable(this, {}) + } +} +export const leaveCategoryStore = new LeaveCategoryStore() + diff --git a/src/util/socket.ts b/src/util/socket.ts new file mode 100644 index 0000000..2d4ac45 --- /dev/null +++ b/src/util/socket.ts @@ -0,0 +1,38 @@ +class Socket { + static socketUrl = "ws://localhost:12214/ws"; + static ws: WebSocket; + init() { + try { + Socket.ws = new WebSocket(Socket.socketUrl); + this.heartbeat(); + } catch (error) { + console.log(error); + } + } + send(data: any) { + Socket.ws.send(data); + } + onmessage(callback: any) { + Socket.ws.onmessage = callback; + } + onclose(callback: any) { + Socket.ws.onclose = callback; + } + onopen(callback: any) { + Socket.ws.onopen = callback; + } + onerror(callback: any) { + Socket.ws.onerror = callback; + } + close() { + Socket.ws.close(); + } + // 心跳 + heartbeat() { + setInterval(() => { + Socket.ws.send(`{"type":"heartbeat"}`); + }, 1000*60); + } +} + +export const socket = new Socket(); \ No newline at end of file