add animation

This commit is contained in:
wang_yp 2025-03-11 17:26:05 +08:00
parent 07b4f7e193
commit 66dba51bf9
32 changed files with 516 additions and 240 deletions

View File

@ -20,6 +20,9 @@ const onMessage = (e: any) => {
lat: body.address.lat ?? 30.523876, lat: body.address.lat ?? 30.523876,
title: body?.user.user_name, title: body?.user.user_name,
users: body.user, users: body.user,
clicks:(v)=>{
console.log(v)
}
}); });
} }
} else if (data.type === "move") { } else if (data.type === "move") {

View File

@ -0,0 +1,46 @@
import { useEffect, useState } from "react";
import AMapLoader from "@amap/amap-jsapi-loader";
import { mapArrs } from "@/store/map";
export default function MapContainerTow() {
let [amap, setmaps] = useState<any>(null);
useEffect(() => {
loadMaps();
return () => {
amap?.destroy();
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const loadMaps = async () => {
const Amap = await AMapLoader.load({
key: "d58999d072ed7e5897d3900a769cfda0", // 申请好的Web端开发者Key首次调用 load 时必填
version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: ["AMap.Scale", "AMap.MoveAnimation", "AMap.Weather"],
});
amap = new Amap.Map("containerTow", {
viewMode: "2D", // 是否为3D地图模式
zoom: 15, // 初始化地图级别
center: [103.872802, 30.523876], // 初始化地图中心点位置
mapStyle: "amap://styles/darkblue",
resizeEnable: true,
});
const polygon = new Amap.Polygon({
map: amap,
path: mapArrs,
strokeColor: "red", //线颜色
strokeOpacity: 0.8, //线透明度
strokeWeight: 2, //线宽
fillColor: "#85b0ec", //填充色
fillOpacity: 0, //填充透明度
});
amap.add(polygon);
amap.setFitView();
setmaps(amap);
};
return (
<div id="containerTow" style={{ height: "100vh", width: "100%" }}></div>
);
}

View File

@ -37,7 +37,6 @@ export default function MapFrom(props:any) {
// 开启坐标选择功能 // 开启坐标选择功能
mouseTool.on("draw", function (event) { mouseTool.on("draw", function (event) {
var lnglat = event.obj.getBounds().getCenter(); // 获取图形的中心点坐标 var lnglat = event.obj.getBounds().getCenter(); // 获取图形的中心点坐标
console.log(lnglat)
markers = mouseTool.overlays.marker markers = mouseTool.overlays.marker
props.onChange({lng:lnglat.lng,lat:lnglat.lat}) props.onChange({lng:lnglat.lng,lat:lnglat.lat})
var mk = [] var mk = []

View File

@ -2,7 +2,7 @@ import makers from "../../static/map-maker.png";
import makers1 from "../../static/map-maker1.png"; import makers1 from "../../static/map-maker1.png";
interface makersInf { interface makersInf {
userIdentity: string, userIdentity: string,
marker: any marker: any,
} }
class MapUtl { class MapUtl {
static makerList: makersInf[] = []; static makerList: makersInf[] = [];
@ -11,7 +11,7 @@ class MapUtl {
static wecherInfo: any = null; static wecherInfo: any = null;
static addMaker(data: any) { static addMaker(data: any) {
const { lng, lat, title, users } = data; const { lng, lat, title, users,clicks } = data;
let mk, dep = ""; let mk, dep = "";
if (users?.militia_type === 1) { if (users?.militia_type === 1) {
mk = makers mk = makers
@ -51,6 +51,7 @@ class MapUtl {
}); });
marker.on("click", (e) => { marker.on("click", (e) => {
infoWindow.open(MapUtl.amap, e.target.getPosition()); infoWindow.open(MapUtl.amap, e.target.getPosition());
clicks(users.id)
}); });
MapUtl.amap?.add(marker); MapUtl.amap?.add(marker);
// 将maker添加到数组 // 将maker添加到数组
@ -98,7 +99,7 @@ class MapUtl {
} }
static polyline = (lineArr) => { static polyline = (lineArr) => {
var marker = new MapUtl.loadMap.Marker({ let markerp = new MapUtl.loadMap.Marker({
map: MapUtl.amap, map: MapUtl.amap,
position: [116.478935, 39.997761], position: [116.478935, 39.997761],
icon: "https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png", icon: "https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png",
@ -111,17 +112,17 @@ class MapUtl {
strokeColor: "#28F", //线颜色 strokeColor: "#28F", //线颜色
strokeWeight: 6, //线宽 strokeWeight: 6, //线宽
}); });
var passedPolyline = new MapUtl.loadMap.Polyline({ let passedPolyline = new MapUtl.loadMap.Polyline({
map: MapUtl.amap, map: MapUtl.amap,
strokeColor: "#AF5", //线颜色 strokeColor: "#AF5", //线颜色
strokeWeight: 6, //线宽 strokeWeight: 6, //线宽
}); });
marker.on('moving', function (e) { markerp.on('moving', function (e) {
passedPolyline.setPath(e.passedPath); passedPolyline.setPath(e.passedPath);
MapUtl.amap.setCenter(e.target.getPosition(), true) MapUtl.amap.setCenter(e.target.getPosition(), true)
}); });
MapUtl.amap.setFitView(); MapUtl.amap.setFitView();
marker.moveAlong(lineArr, { markerp.moveAlong(lineArr, {
duration: 500,//可根据实际采集时间间隔设置 duration: 500,//可根据实际采集时间间隔设置
autoRotation: true, autoRotation: true,
}); });

View File

@ -73,6 +73,9 @@ code {
color: #00ef97 !important; color: #00ef97 !important;
border-color: #00ef97 !important; border-color: #00ef97 !important;
} }
p{
margin: 0;
}
.owner_model { .owner_model {
padding-bottom: 0px !important; padding-bottom: 0px !important;
.ant-modal-content { .ant-modal-content {

View File

@ -34,46 +34,25 @@
} }
.map_container_t { .map_container_t {
position: absolute; position: absolute;
height: 60px;
top: 0; top: 0;
width: 100%; width: 100%;
background-image: url("../../static/head.png"); background-image: url("../../static/head1.png");
background-repeat: no-repeat;
backdrop-filter: blur(10px);
left: 0; left: 0;
right: 0; background-size: 100% 100%;
height: 120px;
z-index: 1; z-index: 1;
display: flex; display: flex;
align-items: center;
justify-content: space-between; justify-content: space-between;
.map_container_t_c { .map_container_t_c {
display: flex; text-align: center;
align-items: center; flex: 1;
justify-content: center; padding: 10px;
flex: 4; font-size: 15px;
.title_img {
width: 20px;
height: 20px;
}
img{
width: 100px;
}
.on_to {
transform: rotate(-180deg) rotateY(0deg);
}
.twp {
height: 30px;
}
> span { > span {
margin-left: 15px; font-size: 20px;
margin-right: 15px;
color: #fff;
font-size:25px;
font-weight: normal; font-weight: normal;
line-height: normal; line-height: normal;
letter-spacing: 0.1em; letter-spacing: 0.1em;
font-variation-settings: "opsz" auto;
color: #ffffff; color: #ffffff;
text-shadow: 0px 0px 10px #29ecb4; text-shadow: 0px 0px 10px #29ecb4;
} }
@ -97,16 +76,16 @@
.map_container_t_r { .map_container_t_r {
flex: 1; flex: 1;
display: flex; display: flex;
align-items: center;
justify-content: space-between;
text-align: right; text-align: right;
padding-right: 10px; padding-right: 10px;
display: flex;
justify-content: end;
} }
} }
.map_container_l { .map_container_l {
position: absolute; position: absolute;
left: 0px; left: 0px;
top: 60px; top: 40px;
width: 20%; width: 20%;
bottom: 0px; bottom: 0px;
z-index: 2; z-index: 2;
@ -117,7 +96,7 @@
.map_container_r { .map_container_r {
position: absolute; position: absolute;
right: 0px; right: 0px;
top: 60px; top: 40px;
bottom: 0px; bottom: 0px;
width: 20%; width: 20%;
z-index: 2; z-index: 2;
@ -126,7 +105,7 @@
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
height: 100%; height: 100%;
} }
.map_container_b_check{ .map_container_b_check {
position: absolute; position: absolute;
bottom: 40px; bottom: 40px;
height: 60px; height: 60px;
@ -138,7 +117,6 @@
position: absolute; position: absolute;
bottom: 0px; bottom: 0px;
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
background: rgba(37, 52, 70, 0.4);
height: 60px; height: 60px;
width: 100%; width: 100%;
z-index: 1; z-index: 1;
@ -146,11 +124,7 @@
.bottom_content { .bottom_content {
display: inline-block; display: inline-block;
> span { > span {
background: linear-gradient(
180deg,
rgba(0, 193, 153, 0.1) 0%,
rgba(0, 239, 151, 0.8) 100%
);
padding: 5px 10px; padding: 5px 10px;
color: #fff; color: #fff;
margin: 0 10px; margin: 0 10px;

View File

@ -4,9 +4,6 @@ import MapContainer from "@/components/map/MapComponent";
import HomeLeft from "@/pages/home/homeLeft/home_left"; import HomeLeft from "@/pages/home/homeLeft/home_left";
import HomeRight from "@/pages/home/homeRigrt/home_right"; import HomeRight from "@/pages/home/homeRigrt/home_right";
import HomeBottom from "@/pages/home/homeBottom/home_bottom"; import HomeBottom from "@/pages/home/homeBottom/home_bottom";
import image2 from "@/static/title_line@1x.png";
import { SettingOutlined } from "@ant-design/icons";
import { useNavigate } from "react-router";
import Weather from "./homeLeft/weather"; import Weather from "./homeLeft/weather";
import Timer from "./homeLeft/timer"; import Timer from "./homeLeft/timer";
import HomeVideo from "./home_video"; import HomeVideo from "./home_video";
@ -14,7 +11,7 @@ import HomeCheck from "./home_check";
import Scr from "./scr"; import Scr from "./scr";
const Home = observer(() => { const Home = observer(() => {
const navigate = useNavigate();
return ( return (
<div className="contents_center"> <div className="contents_center">
<div className="map_container_t"> <div className="map_container_t">
@ -22,18 +19,10 @@ const Home = observer(() => {
<Timer /> <Timer />
</div> </div>
<div className="map_container_t_c"> <div className="map_container_t_c">
<img className="twp on_to" src={image2} alt="" />
<span></span> <span></span>
<img className="twp" src={image2} alt="" />
</div> </div>
<div className="map_container_t_r"> <div className="map_container_t_r">
<Weather /> <Weather />
<SettingOutlined
onClick={() => {
navigate("admin/user");
}}
style={{ fontSize: "1rem", color: "#f9f9f9", cursor: "pointer" }}
/>
</div> </div>
</div> </div>
<div className="scr"> <div className="scr">
@ -50,7 +39,7 @@ const Home = observer(() => {
<HomeRight /> <HomeRight />
</div> </div>
<div className="map_container_b_check"> <div className="map_container_b_check">
<HomeCheck /> {/* <HomeCheck /> */}
</div> </div>
<div className="map_container_b"> <div className="map_container_b">
<HomeBottom /> <HomeBottom />

View File

@ -5,6 +5,9 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
height: 100%; height: 100%;
background-image: url("../../../static/bottom.png");
background-size: 100% 100%;
background-repeat: no-repeat;
} }
.owner_model { .owner_model {

View File

@ -11,13 +11,13 @@
overflow-y: hidden; overflow-y: hidden;
text-align: center; text-align: center;
.org_head{ .org_head{
background-image: url("../../../static/titie_secend@1x.png"); background-image: url("../../../static/sub_title.png");
background-size: 100% 50px; background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
line-height: 60px; line-height: 36px;
height: 50px; height: 36px;
text-align: left; text-align: left;
padding-left: 20px; padding-left: 30px;
} }
.orgin-content{ .orgin-content{
display: flex; display: flex;

View File

@ -22,7 +22,7 @@ const Pover = (props: Store) => {
}, },
grid: { grid: {
top: "10%", top: "10%",
bottom: "45%", bottom: "35%",
right: "5%", right: "5%",
left: "12%", left: "12%",
}, },
@ -37,6 +37,7 @@ const Pover = (props: Store) => {
data: data.map((item) => item.count), data: data.map((item) => item.count),
type: "bar", type: "bar",
barWidth: 10, // 设置柱子粗细 barWidth: 10, // 设置柱子粗细
color:"#0094FF",
itemStyle: { itemStyle: {
borderRadius: [5, 5, 0, 0], borderRadius: [5, 5, 0, 0],
}, },
@ -66,6 +67,7 @@ const Pover = (props: Store) => {
title="力量汇总" title="力量汇总"
className="owner_model" className="owner_model"
width={"80%"} width={"80%"}
height={"700px"}
open={isModalOpen} open={isModalOpen}
afterClose={() => {}} afterClose={() => {}}
onOk={() => {}} onOk={() => {}}

View File

@ -20,7 +20,7 @@ const Timer = () => {
clearInterval(tim); clearInterval(tim);
}; };
}, []); }, []);
return <span style={{fontSize:"1rem"}}>{times} </span>; return <span style={{fontSize:"1rem",marginTop:"5px",display:"block"}}>{times} </span>;
}; };
export default Timer; export default Timer;

View File

@ -11,7 +11,7 @@ export const trunEchatConfig = (data) => {
rotate: 30, rotate: 30,
}, },
}, },
grid: { top: "10%", bottom: "45%", right: "5%" }, grid: { top: "10%", bottom: "35%", right: "5%" },
yAxis: { yAxis: {
type: "value", type: "value",
splitLine: { splitLine: {

View File

@ -1,8 +1,10 @@
import MapUtl from "@/components/map/mapUtil"; import MapUtl from "@/components/map/mapUtil";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { SettingOutlined } from "@ant-design/icons";
import { useNavigate } from "react-router";
const Weather = () => { const Weather = () => {
const [wechaer, setWechaer] = useState<any>(); const [wechaer, setWechaer] = useState<any>();
const navigate = useNavigate();
useEffect(() => { useEffect(() => {
setTimeout(() => { setTimeout(() => {
MapUtl.wecherInfo?.getLive("双流区", (err, data) => { MapUtl.wecherInfo?.getLive("双流区", (err, data) => {
@ -16,31 +18,31 @@ const Weather = () => {
flex: "1", flex: "1",
color: "#fff", color: "#fff",
fontSize: "13px", fontSize: "13px",
padding:"10px"
}} }}
> >
<div <div
style={{ style={{
fontSize: ".8rem", fontSize: "1rem",
display: "flex", display: "flex",
justifyContent: "space-between", justifyContent: "end",
alignItems: "center", alignItems: "center",
marginTop:"5px"
}} }}
> >
<span>:{wechaer?.weather}</span> <span>:{wechaer?.weather}</span>
<span>:{wechaer?.windDirection}</span> <span>:{wechaer?.windDirection}</span>
</div> <div style={{width:"10px"}}></div>
<div
style={{
fontSize: ".8rem",
display: "flex",
justifyContent: "space-between",
alignItems: "center",
}}
>
<span>:{wechaer?.windPower}</span> <span>:{wechaer?.windPower}</span>
<span>湿:{wechaer?.humidity}</span> <span>湿:{wechaer?.humidity}</span>
<div style={{width:"10px"}}></div>
<SettingOutlined
onClick={() => {
navigate("admin/user");
}}
style={{ fontSize: "1rem", color: "#f9f9f9", cursor: "pointer" }}
/>
</div> </div>
</div> </div>
); );
}; };

View File

@ -6,11 +6,11 @@ const Ac = (props: Store) => {
const { homeStore } = props; const { homeStore } = props;
const initChart = (data) => { const initChart = (data) => {
var myChart = echarts.init(document.getElementById("rm")); var myChart = echarts.init(document.getElementById("ac"));
var option = { var option = {
legend: { legend: {
top: "5%", top: "5%",
left:"left", left: "right",
textStyle: { textStyle: {
color: "#fff", color: "#fff",
}, },
@ -33,17 +33,17 @@ const Ac = (props: Store) => {
}, },
series: [ series: [
{ {
center: ["70%", "40%"], center: ["35%", "40%"],
name: "Access From", name: "Access From",
type: "pie", type: "pie",
radius: ["40%", "60%"], radius: ["30%", "50%"],
normal : { normal: {
label : { label: {
show : false show: false,
},
labelLine: {
show: false,
}, },
labelLine : {
show : false
}
}, },
label: { label: {
backgroundColor: "#F6F8FC", backgroundColor: "#F6F8FC",
@ -64,6 +64,6 @@ const Ac = (props: Store) => {
}); });
}, [homeStore]); }, [homeStore]);
return <div style={{ width: "100%", height: "100%" }} id="rm"></div>; return <div style={{ width: "100%", height: "100%" }} id="ac"></div>;
}; };
export default inject("homeStore")(observer(Ac)); export default inject("homeStore")(observer(Ac));

View File

@ -2,11 +2,17 @@ import { inject, observer } from "mobx-react";
import "./right.less"; import "./right.less";
import { Store } from "antd/es/form/interface"; import { Store } from "antd/es/form/interface";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { Modal } from "antd";
const Pyzx = (props: Store) => { const Pyzx = (props: Store) => {
const { homeStore } = props; const { homeStore } = props;
const [user, setUser] = useState<any>(); const [user, setUser] = useState<any>();
const [isModalOpen, setIsModalOpen] = useState<boolean>(false);
useEffect(() => { useEffect(() => {
homeStore.getAe().then((res) => { homeStore.getAe().then((res) => {
res.data?.record.sort((item, item2) => {
return item2.scores - item.scores;
});
setUser(res.data?.record); setUser(res.data?.record);
}); });
}, [homeStore]); }, [homeStore]);
@ -15,12 +21,15 @@ const Pyzx = (props: Store) => {
<div className="pyzx"> <div className="pyzx">
{user?.map((item) => { {user?.map((item) => {
return ( return (
<div key={item.id} className="pyzx_title"> <div
<img key={item.id}
height={80} className="pyzx_title"
src={item.head_img} onClick={() => {
alt="" homeStore.getScores(item.identity);
/> setIsModalOpen(true);
}}
>
<img height={80} src={item.head_img} alt="" />
<div className="content"> <div className="content">
<div>:{item.user_name}</div> <div>:{item.user_name}</div>
<div>:{item.scores}</div> <div>:{item.scores}</div>
@ -30,6 +39,56 @@ const Pyzx = (props: Store) => {
</div> </div>
); );
})} })}
<Modal
title="积分详情"
className="owner_model"
width={"60%"}
open={isModalOpen}
afterClose={() => {}}
onOk={() => {}}
footer={null}
onCancel={() => {
setIsModalOpen(false);
}}
>
<div>
<p style={{ color: "#fff", fontSize: "16px" }}>{homeStore.scoreData?.totalScore}</p>
<div style={{ color: "#fff", fontSize: "15px" ,display:"flex",justifyContent:"space-between",marginBottom:"10px"}}>
<div style={{border:"1px solid #333",padding:"10px",flex:1}}>
<span> :</span>
<span>{homeStore.scoreData?.taskScore}</span>
<div style={{height:"10px"}}></div>
<div style={{height:"500px"}}>
{
homeStore.scoreData?.training?.map((item,index)=>{
return <div key={index} style={{marginBottom:"10px",border:"1px solid #333",padding:"10px"}}>
<div>{item.title}</div>
<div>{item.desc}</div>
<div>{item.score}</div>
</div>
})
}
</div>
</div>
<div style={{width:"10px"}}></div>
<div style={{border:"1px solid #333",padding:"10px",flex:1}}>
<span> :</span>
<span>{homeStore.scoreData?.learnScore}</span>
<div style={{height:"10px"}}></div>
<div style={{height:"500px",overflow:"auto"}}>
{
homeStore.scoreData?.learn?.map((item,index)=>{
return <div key={index} style={{marginBottom:"10px",border:"1px solid #333",padding:"10px"}}>
<div>{item.title}</div>
<div>{item.score}</div>
</div>
})
}
</div>
</div>
</div>
</div>
</Modal>
</div> </div>
); );
}; };

View File

@ -10,13 +10,13 @@
overflow-y: hidden; overflow-y: hidden;
text-align: center; text-align: center;
.org_head { .org_head {
background-image: url("../../../static/titie_secend@1x.png"); background-image: url("../../../static/sub_title.png");
background-size: 100% 50px; background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
line-height: 60px; line-height: 36px;
height: 50px; height: 36px;
text-align: left; text-align: left;
padding-left: 20px; padding-left: 30px;
} }
} }
} }

View File

@ -13,7 +13,7 @@ const Wz = (props: Store) => {
var option = { var option = {
legend: { legend: {
top: "5%", top: "5%",
right: "right", right: "left",
textStyle: { textStyle: {
color: "#fff", color: "#fff",
}, },
@ -26,13 +26,20 @@ const Wz = (props: Store) => {
}); });
return name + "-" + v; return name + "-" + v;
}, },
orient: "vertical", // 垂直排列
type: "scroll", //分页类型
pageIconColor: "#ff781f", //翻页箭头颜色
pageTextStyle: {
color: "#999", //翻页数字颜色
}, //翻页数字设置
pageIconSize: 5,
}, },
series: [ series: [
{ {
center: ["35%", "40%"], center: ["35%", "40%"],
name: "Access From", name: "Access From",
type: "pie", type: "pie",
radius: ["40%", "60%"], radius: ["30%", "50%"],
normal: { normal: {
label: { label: {
show: false, show: false,
@ -45,7 +52,7 @@ const Wz = (props: Store) => {
backgroundColor: "#F6F8FC", backgroundColor: "#F6F8FC",
borderColor: "#8C8D8E", borderColor: "#8C8D8E",
borderWidth: 0, borderWidth: 0,
show: true, show: false,
borderRadius: 4, borderRadius: 4,
}, },
data, data,

View File

@ -1,12 +1,18 @@
import { Radio } from "antd"; import { Button, DatePicker, message, Modal, Radio, Space } from "antd";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
import { Store } from "antd/es/form/interface"; import { Store } from "antd/es/form/interface";
import MapUtl from "@/components/map/mapUtil"; import MapUtl from "@/components/map/mapUtil";
import MapContainerTow from "@/components/map/MapComponentTow";
const HomeCheck = (props: Store) => { const HomeCheck = (props: Store) => {
const { homeStore } = props; const { homeStore ,usrStore} = props;
const [size, changeSize] = useState("1"); const [size, changeSize] = useState("1");
const [id, setId] = useState("");
const { RangePicker } = DatePicker;
const [isOpen, setOpen] = useState<boolean>(false);
const [times, setTimes] = useState<string[]>([]);
const handleSizeChange = (e: any) => { const handleSizeChange = (e: any) => {
changeSize(e.target.value); changeSize(e.target.value);
getUlist(e.target.value); getUlist(e.target.value);
@ -17,6 +23,33 @@ const HomeCheck = (props: Store) => {
}, 2000); }, 2000);
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, []); }, []);
const serchSD = () => {
if (times.length === 0) {
message.error("请选择时间区间");
return;
}
usrStore
.getSite({
id: id,
start_time: times[0],
end_time: times[1],
})
.then((res) => {
let data: any = [];
if (res.data && res.data.record) {
res.data.record.forEach((element) => {
data.push([element.long, element.lat]);
});
if (data.length === 0) {
message.info("暂无轨迹数据");
return;
}
if (data.length > 0) {
MapUtl.polyline(data);
}
}
});
};
const getUlist = (type) => { const getUlist = (type) => {
let query = {}; let query = {};
@ -46,18 +79,58 @@ const HomeCheck = (props: Store) => {
lat: element.lat, lat: element.lat,
title: element.user_name, title: element.user_name,
users: element, users: element,
clicks: (v) => {
setId("01JDGZGAKDRK1K5R5AF9JFHCTN")
setOpen(true)
},
}); });
}); });
}); });
}; };
return ( return (
<>
<Radio.Group value={size} onChange={handleSizeChange}> <Radio.Group value={size} onChange={handleSizeChange}>
<Radio.Button value="1"></Radio.Button> <Radio.Button value="1"></Radio.Button>
<Radio.Button value="2"></Radio.Button> <Radio.Button value="2"></Radio.Button>
<Radio.Button value="3"></Radio.Button> <Radio.Button value="3"></Radio.Button>
</Radio.Group> </Radio.Group>
<Modal
title={"轨迹回放"}
width={"70%"}
open={isOpen}
centered
okText="确定"
cancelText="取消"
footer={null}
destroyOnClose={true}
onCancel={() => {
setOpen(false);
}}
>
<div>
<Space>
<RangePicker
onChange={(v, s) => {
setTimes(s);
}}
/>
<Button
type="dashed"
size="small"
onClick={() => {
serchSD();
}}
>
</Button>
</Space>
<div style={{ height: "10px" }}></div>
<MapContainerTow />
</div>
</Modal>
</>
); );
}; };
// export default HomeBottom; // export default HomeBottom;
export default inject("homeStore")(observer(HomeCheck)); export default inject("homeStore","usrStore")(observer(HomeCheck));

View File

@ -30,11 +30,11 @@ const PoverDetail = (props:Store) => {
</tr> </tr>
<tr> <tr>
<td ></td> <td ></td>
<td colSpan={3}>{usrStore.userDetail?.mail_addr}</td> <td colSpan={3}>{usrStore.userDetail?.home_addr}</td>
</tr> </tr>
<tr> <tr>
<td ></td> <td ></td>
<td >13208266337</td> <td >{usrStore.userDetail?.tel}</td>
<td ></td> <td ></td>
<td colSpan={2}>{usrStore.userDetail?.email}</td> <td colSpan={2}>{usrStore.userDetail?.email}</td>
</tr> </tr>

View File

@ -9,11 +9,16 @@ import PoverDetail from "../poverDetail";
const PoverPage = (props: Store) => { const PoverPage = (props: Store) => {
const { usrStore } = props; const { usrStore } = props;
const [poverData, setPover] = useState<any>(); const [poverData, setPover] = useState<any>();
const [config, setConfig] = useState<any>({
militia_type: 1,
vet: 1,
o_type: "",
});
const initChart = (id: string, count: number, total: number) => { const initChart = (id: string, count: number, total: number) => {
var myChart = echarts.init(document.getElementById(id)); var myChart = echarts.init(document.getElementById(id));
var option = { var option = {
title: { title: {
text: "10%", text: count,
left: "center", left: "center",
top: "center", top: "center",
textStyle: { textStyle: {
@ -52,40 +57,52 @@ const PoverPage = (props: Store) => {
}; };
useEffect(() => { useEffect(() => {
usrStore.getPover().then((e) => { usrStore.getPover().then((e) => {
initChart("pover_jg", e.data.o_type_nums, e.data.total); initChart("pover_jg", e.data.o_type, e.data.total);
initChart("pover_jgs", e.data.o_type_num, e.data.total); initChart("pover_jgs", e.data.o_types, e.data.total);
initChart("pover1", e.data.a_member, e.data.total);
setPover(e.data); setPover(e.data);
}); });
}, [usrStore]); }, [usrStore]);
const serch = () => {
usrStore.getPoverList(config);
};
return ( return (
<div style={{ width: "100%", height: "100%" }}> <div
style={{
width: "100%",
height: "100%",
display: "flex",
alignContent: "space-between",
}}
>
<div className="nav-header"> <div className="nav-header">
<div style={{ textAlign: "center" }}> <div style={{ textAlign: "center", marginBottom: "20px" ,cursor:"pointer" }}>
<div style={{ width: "150px", height: "100px" }} id="pover_jgs"></div> <div
style={{ width: "150px", height: "100px" }}
id="pover_jgs"
onClick={() => {
setConfig({
o_type: "01JAZAZDTHJE8FZ24GY9AJ758N",
size: 30,
offset: 1,
});
serch();
}}
></div>
<span style={{ color: "#fff" }}></span> <span style={{ color: "#fff" }}></span>
</div> </div>
<div className="pv-head-item"> <div
<SnippetsTwoTone style={{ fontSize: 30 }} /> style={{ textAlign: "center", marginBottom: "20px" }}
<div> onClick={() => {
<div>{poverData?.militia_meber}</div> setConfig({
<span></span> o_type: "01JAZB1GVJED5R34V6Z8MBWER4",
</div> size: 30,
</div> offset: 1,
<div className="pv-head-item"> });
<SnippetsTwoTone style={{ fontSize: 30 }} /> serch();
<div> }}
<div>{poverData?.easy_meber}</div> >
<span></span> <div style={{ width: "150px", height: "100%" }} id="pover_jg"></div>
</div> <span style={{ color: "#fff" }}></span>
</div>
<div className="pv-head-item">
<SnippetsTwoTone style={{ fontSize: 30 }} />
<div>
<div>{poverData?.vet_meber}</div>
<span>退</span>
</div>
</div> </div>
</div> </div>
<div className="nav-content"> <div className="nav-content">
@ -95,16 +112,57 @@ const PoverPage = (props: Store) => {
usrStore.setPoverDe(false); usrStore.setPoverDe(false);
}} }}
> >
<div style={{ textAlign: "center" }}> <div
<div style={{ width: "100%", height: "100%" }} id="pover_jg"></div> className="pv-head-item"
<span style={{ color: "#fff" }}></span> onClick={(e) => {
</div> setConfig({
<p></p> militia_type: 1,
<div style={{ textAlign: "center"}}> size: 30,
<div style={{ width: "100%", height: "100%" }} id="pover1"></div> offset: 1,
<span style={{ color: "#fff" }}></span> });
serch();
}}
>
<SnippetsTwoTone style={{ fontSize: 30 }} />
<div>
<div>{poverData?.militia_meber}</div>
<span></span>
</div> </div>
</div> </div>
<div className="pv-head-item">
<SnippetsTwoTone style={{ fontSize: 30 }} />
<div
onClick={() => {
setConfig({
militia_type: 2,
size: 30,
offset: 1,
});
serch();
}}
>
<div>{poverData?.easy_meber}</div>
<span></span>
</div>
</div>
<div className="pv-head-item">
<SnippetsTwoTone style={{ fontSize: 30 }} />
<div
onClick={() => {
setConfig({
vet: 1,
size: 30,
offset: 1,
});
serch();
}}
>
<div>{poverData?.vet_meber}</div>
<span>退</span>
</div>
</div>
</div>
<div className="content-right"> <div className="content-right">
<p style={{ margin: 0, fontSize: "20px", marginBottom: "10px" }}> <p style={{ margin: 0, fontSize: "20px", marginBottom: "10px" }}>

View File

@ -1,18 +1,17 @@
.nav-header { .nav-header {
min-height: 50px; min-height: 50px;
padding: 10px; padding: 10px;
display: flex;
} }
.nav-content { .nav-content {
width: 100%; width: 100%;
height: 100%; height: 100%;
min-height: 500px; min-height: 500px;
.content-left {
height: 100%;
display: flex; display: flex;
align-items: start; align-items: start;
justify-content: space-around; justify-content: start;
.content-left {
width: 15%;
height: 100%;
} }
.content-right { .content-right {
width: 85%; width: 85%;
@ -43,7 +42,7 @@
} }
} }
.pv_table { .pv_table {
height: 430px; height: 500px;
.table { .table {
width: 100%; width: 100%;
overflow-x: auto; overflow-x: auto;
@ -61,5 +60,6 @@
} }
} }
} }
} }
} }

View File

@ -5,28 +5,26 @@ import { useEffect } from "react";
const PvTable = (props: Store) => { const PvTable = (props: Store) => {
const { teamStore, persMgmtStore, usrStore } = props; const { teamStore, persMgmtStore, usrStore } = props;
useEffect(() => { useEffect(() => {
teamStore.getlist();
persMgmtStore.getlist(); persMgmtStore.getlist();
usrStore.getlist(); usrStore.getPoverList();
}, [teamStore, persMgmtStore, usrStore]);
}, [teamStore,persMgmtStore,usrStore]); const folders = (id, list) => {
const folders = (id,list) => { let has = false;
let has = false list.forEach((element) => {
list.forEach(element => {
if (element.team_identity === id) { if (element.team_identity === id) {
has = true has = true;
} }
}); });
return <div>{has?'√':'x'}</div> return <div>{has ? "√" : "x"}</div>;
}; };
const foldersp = (id,list) => { const foldersp = (id, list) => {
let has = false let has = false;
list.forEach(element => { list.forEach((element) => {
if (element.pers_identity === id) { if (element.pers_identity === id) {
has = true has = true;
} }
}); });
return <div>{has?'√':'x'}</div> return <div>{has ? "√" : "x"}</div>;
}; };
return ( return (
<div className="pv_table"> <div className="pv_table">
@ -36,7 +34,6 @@ const PvTable = (props: Store) => {
<td rowSpan={2}></td> <td rowSpan={2}></td>
<td rowSpan={2}></td> <td rowSpan={2}></td>
<td rowSpan={2}></td> <td rowSpan={2}></td>
<td rowSpan={2}></td>
<td colSpan={teamStore.list?.length ?? 4}></td> <td colSpan={teamStore.list?.length ?? 4}></td>
<td colSpan={persMgmtStore.list?.length ?? 4}></td> <td colSpan={persMgmtStore.list?.length ?? 4}></td>
</tr> </tr>
@ -50,23 +47,27 @@ const PvTable = (props: Store) => {
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{usrStore.list?.map((us,i) => { {usrStore.poverList?.map((us, i) => {
return ( return (
<tr <tr
key={us.id} key={us.id}
onClick={(e) => { onClick={(e) => {
usrStore.setUserDetaul(us) usrStore.setUserDetaul(us);
usrStore.setPoverDe(true) usrStore.setPoverDe(true);
}}> }}
<td>{i+1}</td> >
<td>{us.user_name}</td> <td>{i + 1}</td>
<td>{us.political_affil}</td> <td>{us.username}</td>
<td>{us.dep_identity}</td> <td>{us.politicalaffils.name}</td>
{teamStore.list?.map((e) => { {teamStore.list?.map((e) => {
return <td key={e.identity}>{folders(e.identity,us.team)}</td>; return (
<td key={e.identity}>{folders(e.identity, us.team)}</td>
);
})} })}
{persMgmtStore.list?.map((e) => { {persMgmtStore.list?.map((e) => {
return <td key={e.identity}>{foldersp(e.identity,us.pers)}</td>; return (
<td key={e.identity}>{foldersp(e.identity, us.pers)}</td>
);
})} })}
</tr> </tr>
); );

View File

@ -65,4 +65,5 @@ export const serchConfig = [
value: "", value: "",
rules: [], rules: [],
}, },
]; ];

View File

@ -1,17 +1,46 @@
import { Button, FormInstance, Space } from "antd"; import { Button, Form, FormInstance, Select, Space } from "antd";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
import BTable from "@/components/b_table"; import BTable from "@/components/b_table";
import { useEffect } from "react"; import { useEffect, useState } from "react";
import { Store } from "antd/lib/form/interface"; import { Store } from "antd/lib/form/interface";
import React from "react"; import React from "react";
import { serchConfig, studyColumns } from "./column"; import { serchConfig, studyColumns } from "./column";
import SimpleForm from "@/components/form/simple_form"; import SimpleForm from "@/components/form/simple_form";
const { Option } = Select;
const Signin = (props: Store) => { const Signin = (props: Store) => {
const { signinStore } = props; const { signinStore } = props;
const serchFormRef = React.useRef<FormInstance>(null); const serchFormRef = React.useRef<FormInstance>(null);
const [tagList, setTagList] = useState<any>([]);
useEffect(() => { useEffect(() => {
signinStore.getlist(); signinStore.getlist();
setTagList([
{
id: 0,
name: "全部",
},
{
id: 1,
name: "网格员",
},
{
id: 2,
name: "微网格员",
},
{
id: 3,
name: "基干民兵",
},
{
id: 4,
name: "普通民兵",
},
{
id: 5,
name: "巡防大队",
},
]);
}, [signinStore]); }, [signinStore]);
const onSerchFinish = (values: any) => { const onSerchFinish = (values: any) => {
@ -20,7 +49,7 @@ const Signin = (props: Store) => {
start_time: values.start_time?.format("YYYY-MM-DD HH:mm"), start_time: values.start_time?.format("YYYY-MM-DD HH:mm"),
end_time: values.end_time?.format("YYYY-MM-DD HH:mm"), end_time: values.end_time?.format("YYYY-MM-DD HH:mm"),
page: 1, page: 1,
page_size: 10, page_size: 20,
}; };
signinStore.getlist(query); signinStore.getlist(query);
}; };
@ -46,6 +75,17 @@ const Signin = (props: Store) => {
onFinishFailed={onFinishFailed} onFinishFailed={onFinishFailed}
> >
<Space> <Space>
<Form.Item key="tags" label="身份" name="tags" initialValue={0}>
<Select placeholder="">
{tagList?.map((v: any) => {
return (
<Option key={v.id} value={v.id}>
{v.name}
</Option>
);
})}
</Select>
</Form.Item>
<Button <Button
type="primary" type="primary"
onClick={() => { onClick={() => {
@ -62,18 +102,17 @@ const Signin = (props: Store) => {
> >
</Button> </Button>
<Button onClick={() => { <Button
onClick={() => {
signinStore.exports(); signinStore.exports();
}}></Button> }}
>
</Button>
</Space> </Space>
</SimpleForm> </SimpleForm>
</Space> </Space>
<BTable store={signinStore} columns={studyColumns} dataSource={signinStore.list}/>
<BTable
store={signinStore}
columns={studyColumns}
dataSource={signinStore.list}
/>
</Space> </Space>
</div> </div>
); );

View File

@ -38,25 +38,10 @@ const Move = (props) => {
return ( return (
<> <>
<Button <Button type="dashed" size="small" onClick={() => {setOpen(true);}}>
type="dashed"
size="small"
onClick={() => {
setOpen(true);
}}
>
</Button> </Button>
<Modal title={"轨迹回放"} width={"70%"} open={isOpen} centered okText="确定" cancelText="取消" footer={null} destroyOnClose={true}
<Modal
title={"轨迹回放"}
width={"70%"}
open={isOpen}
centered
okText="确定"
cancelText="取消"
footer={null}
destroyOnClose={true}
onCancel={() => { onCancel={() => {
setOpen(false); setOpen(false);
}} }}

View File

@ -29,6 +29,23 @@ export const defaultConfig =(team,per)=>
value: 0, value: 0,
rules: [{ required: true, message: "请选择性别" }], rules: [{ required: true, message: "请选择性别" }],
}, },
{
type: FormType.radio,
label: "视频查看权限",
name: "video_permission",
radioData: [
{
key: "有",
val: 1,
},
{
key: "无",
val: 2,
},
],
value: 0,
rules: [{ required: true, message: "视频查看权限" }],
},
{ {
type: FormType.radio, type: FormType.radio,
label: "是否网格员", label: "是否网格员",
@ -61,7 +78,7 @@ export const defaultConfig =(team,per)=>
}, },
], ],
value: 0, value: 0,
rules: [], rules: [{ required: true, message: "是否微网格员" }],
}, },
{ {
type: FormType.radio, type: FormType.radio,

BIN
src/static/bottom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
src/static/head1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

BIN
src/static/sub_title.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -3,7 +3,6 @@ import { action, makeObservable, observable } from "mobx";
import baseHttp from "@/service/base"; import baseHttp from "@/service/base";
import BaseStore from "./baseStore"; import BaseStore from "./baseStore";
import { TagDataType } from "@/model/userModel"; import { TagDataType } from "@/model/userModel";
import MapUtl from "@/components/map/mapUtil";
import Config from "@/util/config"; import Config from "@/util/config";
class HomeConfig { class HomeConfig {
@ -21,22 +20,30 @@ class HomeConfig {
static deviceList: string = "/api/v1/devicesconfig" //设备列表 static deviceList: string = "/api/v1/devicesconfig" //设备列表
static channerList: string = "/api/v1/channelsconfig" //设备列表 static channerList: string = "/api/v1/channelsconfig" //设备列表
static channelstream: string = "/api/v1/devices/channelstream" //设备包活 static channelstream: string = "/api/v1/devices/channelstream" //设备包活
static scores: string = "/v1/user/scores"
} }
class HomeStore extends BaseStore<TagDataType> { class HomeStore extends BaseStore<TagDataType> {
scoreData = {}
constructor() { constructor() {
super(HomeConfig) super(HomeConfig)
makeObservable(this, { makeObservable(this, {
getOgCount: action, getOgCount: action,
scoreData:observable,
ogMap: observable, ogMap: observable,
alist: observable, alist: observable,
showVideo: observable, showVideo: observable,
ulist: observable, ulist: observable,
showVideoHandler: action, showVideoHandler: action,
getTaskUserList: action, getTaskUserList: action,
getScores: action,
}) })
} }
async getScores(id) {
let data = await baseHttp.get(HomeConfig.scores + "/" + id, null)
this.scoreData = data.data.record
}
async getOgCount() { async getOgCount() {
let res = await baseHttp.get(HomeConfig.os, {}); let res = await baseHttp.get(HomeConfig.os, {});
this.ogMap = res.data.record this.ogMap = res.data.record
@ -113,7 +120,7 @@ class HomeStore extends BaseStore<TagDataType> {
let res = await this.getChannerStrem(element.device, element.channel) let res = await this.getChannerStrem(element.device, element.channel)
urls.push(Config.videoApis + res.EasyDarwin?.Body.URL) urls.push(Config.videoApis + res.EasyDarwin?.Body.URL)
} }
this.getTaskUserList() // this.getTaskUserList()
this.showVideoHandler(true) this.showVideoHandler(true)
} }
@ -126,12 +133,12 @@ class HomeStore extends BaseStore<TagDataType> {
let res = await baseHttp.get(HomeConfig.taskulist, {}); let res = await baseHttp.get(HomeConfig.taskulist, {});
if (res.data?.record?.ulist && res.data?.record.ulist.length > 0) { if (res.data?.record?.ulist && res.data?.record.ulist.length > 0) {
res.data?.record?.ulist.forEach(element => { res.data?.record?.ulist.forEach(element => {
MapUtl.addMaker({ // MapUtl.addMaker({
lng: element.long ?? 116.478935, // lng: element.long ?? 116.478935,
lat: element.lat ?? 39.997761, // lat: element.lat ?? 39.997761,
title: element.user_name, // title: element.user_name,
users: element // users: element
}) // })
}); });
} }
} }

View File

@ -11,6 +11,7 @@ class UserConfig {
static DELETE: string = "/v1/user" static DELETE: string = "/v1/user"
static EDIT: string = "/v1/user" static EDIT: string = "/v1/user"
static pover: string = "/v1/user/userPower" static pover: string = "/v1/user/userPower"
static poverList: string = "/v1/user/poverList"
static team: string = "/v1/team/list" static team: string = "/v1/team/list"
static per: string = "/v1/persMgmt/list" static per: string = "/v1/persMgmt/list"
static serch: string = "/v1/user/serch" static serch: string = "/v1/user/serch"
@ -18,12 +19,15 @@ class UserConfig {
static videoLogin: string = "/api/v1/login" static videoLogin: string = "/api/v1/login"
static siteList: string = "/v1/user/site" static siteList: string = "/v1/user/site"
static reSetPwd: string = "/v1/user/reSetPwd" static reSetPwd: string = "/v1/user/reSetPwd"
} }
class UserStore extends BaseStore<UserDataType> { class UserStore extends BaseStore<UserDataType> {
_userinfo: UserInfos = {}; // 用户信息 _userinfo: UserInfos = {}; // 用户信息
userDetail = {} userDetail = {}
isNeedLogin: boolean = false; // 是否需要登录 isNeedLogin: boolean = false; // 是否需要登录
poverDetail: boolean = false; // 是否展示民兵详情 poverDetail: boolean = false; // 是否展示民兵详情
poverList: any = []
constructor() { constructor() {
super(UserConfig) super(UserConfig)
@ -35,6 +39,7 @@ class UserStore extends BaseStore<UserDataType> {
serchUser: action, serchUser: action,
setPoverDe: action, setPoverDe: action,
setUserDetaul: action, setUserDetaul: action,
getPoverList: action,
getPatrol: action, getPatrol: action,
getSite: action, getSite: action,
_userinfo: observable, _userinfo: observable,
@ -42,12 +47,14 @@ class UserStore extends BaseStore<UserDataType> {
poverDetail: observable, poverDetail: observable,
userDetail: observable, userDetail: observable,
openLoginDilog: action, openLoginDilog: action,
poverList: observable,
userInfo: computed, userInfo: computed,
}) })
} }
async getTeam() { async getTeam() {
return await baseHttp.get(UserConfig.team, null) return await baseHttp.get(UserConfig.team, null)
} }
async getPer() { async getPer() {
return await baseHttp.get(UserConfig.per, null) return await baseHttp.get(UserConfig.per, null)
} }
@ -60,17 +67,20 @@ class UserStore extends BaseStore<UserDataType> {
async getPatrol() { async getPatrol() {
return await baseHttp.get(UserConfig.getPatrol, {}) return await baseHttp.get(UserConfig.getPatrol, {})
} }
// 获取坐标点
async getSite(id) { async getSite(id) {
return await baseHttp.put(UserConfig.siteList + "/" + id.id, id) return await baseHttp.put(UserConfig.siteList + "/" + id.id, id)
} }
// 重置密码
async reSetPwd(id) { async reSetPwd(id) {
await baseHttp.put(UserConfig.reSetPwd+"/"+id,{}) await baseHttp.put(UserConfig.reSetPwd + "/" + id, {})
message.success("密码重置成功") message.success("密码重置成功")
} }
// 获取 力量列表
async getPoverList(param) {
let res = await baseHttp.get(UserConfig.poverList, param)
this.poverList = res.data.record
}
get userInfo(): UserInfos { get userInfo(): UserInfos {
if (!this._userinfo.token) { if (!this._userinfo.token) {

View File

@ -1,6 +1,6 @@
class Config { class Config {
static baseUrl = "https://www.hswzct.cn:12016/"; // static baseUrl = "https://www.hswzct.cn:12016/";
// static baseUrl = "http://127.0.0.1:12214/"; static baseUrl = "http://127.0.0.1:12214/";
static ws = "wss://www.hswzct.cn:12016/wsadmin?id=admin"; static ws = "wss://www.hswzct.cn:12016/wsadmin?id=admin";
// static ws = "wss://rw.quwanya.cn/wsadmin?id=admin"; // static ws = "wss://rw.quwanya.cn/wsadmin?id=admin";
static userStatic = "https://www.hswzct.cn:12016/api/uploads/user/"; static userStatic = "https://www.hswzct.cn:12016/api/uploads/user/";
@ -8,6 +8,3 @@ class Config {
static videoApis = "https://sprh.hswzct.cn:4443"; // static videoApis = "https://sprh.hswzct.cn:4443"; //
} }
export default Config; export default Config;
// 1、发布任务的时候选择视频列表
// 2、人的数据区分