Compare commits

...

13 Commits

Author SHA1 Message Date
5d3de61273 更新退出 2025-07-28 10:39:23 +08:00
be77d67c47 删除退出登录 2025-07-25 11:50:38 +08:00
4573b25182 1231 2025-07-23 19:15:31 +08:00
7f61aba9d6 12 2025-07-23 19:07:07 +08:00
e5f326ba58 1223 2025-07-23 17:45:51 +08:00
cddb30aad7 12321 2025-07-23 17:37:16 +08:00
ec9e1ed07e 2025-07-21 21:23:42 +08:00
6e9690ba6c 2025-07-21 21:23:12 +08:00
lcw
c16d0e6bed lcw 2025-07-21 18:05:28 +08:00
lcw
d3036d5a79 lcw 2025-07-21 16:25:08 +08:00
lcw
5855c5d2d6 lcw 2025-07-21 16:21:47 +08:00
13bdb68a72 修改问题 2025-07-08 19:54:31 +08:00
c833099f0c 修改bug 2025-07-07 20:32:06 +08:00
74 changed files with 2167 additions and 405 deletions

View File

@ -599,7 +599,7 @@ export const selectUserDeptPage = (data = {}) => {
///unifiedLogin
export const unifiedLogin = (data) => {
return request({
url: api + `/unifiedLogin`,
url: api + `/ssoLogin`,
method: "POST",
data
});

View File

@ -0,0 +1,492 @@
.bigScrenn {
height: 100vh;
width: 100vw;
overflow: hidden;
background: #001022;
position: relative;
color: #fff;
.headBox {
position: absolute;
height: 90px;
width: 100%;
background: #001022;
top: 0;
z-index: 9;
.top {
display: flex;
justify-content: space-between;
width: 100%;
height: 100%;
padding: 0 4px;
.top-left {
display: flex;
margin-top: 30px;
.time {
margin-left: 38px;
font-style: italic;
font-weight: bolder;
.timer {
font-size: 24px;
letter-spacing: 3px;
color: #fff;
}
.week {
color: #00ADFF;
font-size: 14px;
}
}
}
.top-center {
width: 340px;
height: 90px;
}
.top-right {
display: flex;
margin-top: 30px;
align-items: center;
.info {
display: flex;
align-items: center;
.text {
color: #e6ffff;
font-size: 15px;
margin-left: 14px;
line-height: 23px;
.dept {
max-width: 200px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
}
.meun {
margin-left: 30px;
margin-right: 4px;
}
.el-dropdown-tools {
display: inline-block;
width: 40px;
height: 40px;
border: 1px solid rgb(20, 135, 180);
border-radius: 50%;
text-align: center;
.el-dropdown-tools-n {
display: inline-block;
width: 34px;
height: 34px;
border: 1px solid #fff;
border-radius: 50%;
background: #9ec6fc;
text-align: center;
line-height: 32px;
margin-top: 2px;
padding-top: 2px;
box-sizing: border-box;
}
}
}
}
}
.asideBox {
position: absolute;
top: 70px;
height: calc(100vh - 72px);
width: 442px;
background: #263445;
z-index: 2;
.boder-small {
height: 32.5%;
background-size: 100% 100%;
margin-bottom: 10px;
}
.boder-middle {
height: 66%;
background-size: 100% 100%;
margin-bottom: 10px;
}
.boder-big {
height: 100%;
background-size: 100% 100%;
}
.boder-top {
height: 280px;
background-size: 100% 100%;
}
.boder-center {
height: calc(100% - 510px);
background-size: 100% 100%;
}
.boder-bottom {
height: 230px;
background-size: 100% 100%;
}
.boxContent {
height: 100%;
padding: 6px 20px 10px;
box-sizing: border-box;
.box-title {
padding: 0 10px 0 30px;
box-sizing: border-box;
font-size: 22px;
font-family: "YSBTH";
background: linear-gradient(0deg, #59a6f4 0%, #ffffff 100%);
-webkit-background-clip: text;
}
.boxInfo {
height: calc(100% - 70px);
margin-top: 8px;
}
.cntBoxInfo {
height: calc(100% - 46px);
overflow: hidden;
overflow-y: auto;
}
}
}
.addBox {
position: absolute;
bottom: 70px;
pointer-events: auto;
cursor: pointer;
.imgBox {
width: 111px;
height: 112px;
text-align: center;
span {
display: inline-block;
width: 30px;
margin-top: 36px;
font-size: 14px;
}
}
}
@mixin sircle {
position: absolute;
width: 73px;
height: calc(100vh - 72px);
top: 90px;
}
.leftSiecle {
@include sircle;
background-size: 100% 100%;
z-index: 1;
}
.rightSiecle {
@include sircle;
right: 370px;
background-size: 100% 100%;
z-index: 1;
}
// 尾部
.footBox {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 800px;
z-index: 10;
.btnsBox {
display: flex;
justify-content: space-between;
align-items: center;
width: 85%;
.btnsItem {
position: relative;
cursor: pointer;
.resourceBox {
display: none;
position: absolute;
bottom: 37px;
left: 50%;
transform: translateX(-50%);
padding: 10px 10px 24px 10px;
box-sizing: border-box;
.contant {
position: relative;
padding: 20px 10px;
box-sizing: border-box;
background-size: 100% 100%;
.name {
color: #00BFFF;
}
.footerCheck {
display: flex;
justify-content: center;
.el-checkbox-group {
text-align: center;
}
}
}
}
.resourceBoxOther {
display: block;
}
}
.btnsItem:hover .resourceBox {
display: block;
}
}
}
.popover {
position: absolute;
background: #08226a;
left: 264px;
top: 32px;
width: 220px;
padding: 6px;
box-sizing: border-box;
border-radius: 4px;
.el-tag {
margin: 4px 2px;
}
&::before {
content: '';
position: absolute;
top: 46px;
left: -15px;
display: inline-block;
width: 0;
height: 0;
border: 8px solid transparent;
border-right-color: #08226a;
z-index: 989;
}
}
.popoverKfd {
position: absolute;
background: #08226a;
left: -199px;
top: 100px;
width: 270px;
padding: 6px;
box-sizing: border-box;
border-radius: 4px;
.el-tag {
margin: 4px 2px;
}
&::before {
content: '';
position: absolute;
top: 13px;
left: 270px;
display: inline-block;
width: 0;
height: 0;
border: 8px solid transparent;
border-left-color: #08226a;
z-index: 989;
}
}
}
.dialogBox {
padding: 0 0 10px 0;
box-sizing: border-box;
background: url('~@/assets/images/dialog-bg.png') no-repeat center center;
background-size: 100% 100%;
z-index: 999;
border-radius: 4px;
>.title {
height: 38px;
line-height: 38px;
margin: 0 4px;
display: flex;
border-bottom: 1px solid #275288;
margin-bottom: 6px;
justify-content: space-between;
align-items: center;
background-image: linear-gradient(to right, rgba(1, 127, 216, 1), rgba(4, 56, 131, .5), rgba(1, 130, 218, .0));
.close {
font-size: 20px;
font-weight: 200;
cursor: pointer;
margin-right: 10px;
}
.mc {
margin-left: 10px;
}
}
.infoBox {
border: none;
position: relative;
// border: 1px solid #275288;
padding: 10px 0 4px;
box-sizing: border-box;
}
.addressBox {
border-top: 1px solid #162f55;
margin: 0 10px;
// height: 30px;
line-height: 24px;
display: flex;
justify-content: space-between;
img,
span {
vertical-align: middle;
}
img {
margin-right: 4px;
}
}
>.btnBox {
text-align: center;
padding-top: 8px;
padding-bottom: 12px;
margin-bottom: 10px;
button {
margin: 0 2px;
}
}
}
button.dp-default {
border: 1px solid #3180ea;
box-shadow: inset 0 0 18px #2b8ce6;
background: #001022;
color: #fff;
height: 30px;
padding: 0 15px;
border-radius: 3px;
cursor: pointer;
&.small {
height: 22px;
line-height: 20px;
vertical-align: middle;
padding: 0 6px;
box-shadow: inset 0 0 10px #2b8ce6;
font-size: 12px;
span,
svg {
vertical-align: middle;
}
}
}
.tag {
display: inline-block;
background-color: #999;
font-size: 11px;
border-radius: 2px;
margin-left: 3px;
color: #fff;
width: 40px;
text-align: center;
height: 20px;
line-height: 20px;
vertical-align: middle;
&.blue {
background-color: #0b9ff4;
}
&.orange {
background-color: #e15923;
}
&.red {
background-color: #e21c1c;
}
&.yellow {
background-color: #d6d301;
}
&.green {
background-color: #56db2d;
}
&.mj {
background-color: #4995fd;
}
&.fj {
background-color: #3ad2d4;
}
}
.xlStatus {
position: absolute;
right: 0;
top: 0;
width: 56px;
text-align: center;
height: 24px;
line-height: 24px;
border-bottom-left-radius: 10px;
cursor: pointer;
color: #000;
}
.line {
background: #00bc65;
}
.lineing {
background: #AB0F0B;
}
.unline {
background: #808080;
}

View File

@ -5,6 +5,7 @@ header {
display: flex;
justify-content: space-between;
align-items: center;
.logo {
white-space: nowrap;
padding-left: 8px;
@ -16,6 +17,7 @@ header {
-webkit-text-fill-color: transparent;
text-shadow: 4px 4px 4px rgba(255, 255, 255, 0.15);
}
.right {
display: flex;
height: 100%;
@ -23,9 +25,11 @@ header {
z-index: 199;
position: relative;
padding-right: 10px;
.detail {
display: flex;
cursor: pointer;
.hd {
white-space: nowrap;
color: #ffffff;
@ -100,6 +104,7 @@ header {
color: #fff;
padding: 20px;
box-sizing: border-box;
.head_box {
height: 48px;
border-bottom: 1px solid #f1f4f8;
@ -107,9 +112,11 @@ header {
display: flex;
justify-content: space-between;
align-items: center;
.title {
position: relative;
padding-left: 10px;
&::before {
position: absolute;
content: "";
@ -200,6 +207,7 @@ header {
background: #fff;
border-radius: 4px;
height: calc(100vh - 124px);
.el-table--fit {
width: calc(100% - 20px) !important;
position: absolute;
@ -209,6 +217,7 @@ header {
height: calc(100% - 100px);
overflow: auto;
}
.fenye {
background: #fff;
border-width: 0 1px 1px 1px;
@ -216,6 +225,7 @@ header {
right: 0px;
left: 0px;
padding-right: 10px;
.el-pagination {
display: flex;
align-items: center;
@ -233,7 +243,7 @@ header {
}
::v-deep .el-dialog {
--el-dialog-bg-color: #061639;
// --el-dialog-bg-color: #061639;
}
.main-box {
@ -266,19 +276,24 @@ header {
.content-box-sun {
display: flex;
.org-box {
flex: 1;
.org-content-box {
width: 95%;
.org-search-box {
display: flex;
}
.tree-box {
height: 750px;
overflow: auto;
}
}
}
.right-box-sun {
flex: 4;
}
@ -290,6 +305,7 @@ header {
justify-content: space-between;
position: relative;
z-index: 2;
.title {
height: 60px;
line-height: 60px;
@ -300,4 +316,4 @@ header {
.btnBox {
margin-top: 14px;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

View File

@ -1,8 +1,7 @@
<template>
<div :id="mapid" class="map"></div>
<div class="changeMap_box" v-if="props.isShow">
<el-switch v-model="conditionRoute" @change="handleSwitch" active-text="打开路况" inactive-text="关闭路况"
style="--el-switch-color: #13ce66; --el-switch-off-color: #ff4949" />
<el-switch v-model="conditionRoute" @change="handleSwitch" active-text="打开路况" inactive-text="关闭路况" style="--el-switch-color:#13ce66;--el-switch-off-color:#ff4949;" />
<!-- <el-carousel type="card" height="75px" :autoplay="false" indicator-position="none" :initial-index="3" @change="onMapImageChange">
<el-carousel-item>
<div class="mapImageItem">
@ -75,7 +74,7 @@ const props = defineProps({
});
try {
const userInfo = getItem("deptId")[0].deptCode;
} catch (error) { }
} catch (error) {}
let map;
let mapLayer;
let mapLayer1;
@ -89,33 +88,27 @@ onMounted(() => {
map = new EliMap({
id: props.mapid,
crs: "EPSG:4490",
crs: "EPSG:3857",
style: {
glyphs: "./fonts/{fontstack}/{range}.pbf",
center: [94.36057012, 29.64276831],
zoom: 15
center: [94.36,29.65],
zoom: 10
},
minZoom: 7,
maxZoom: 18,
transformRequest: (url) => {
if (url.indexOf("TileMatrix=") != -1) {
const arr = url.split("TileMatrix=");
const arr1 = arr[1].split("&");
const nurl = `${arr[0]}&TileMatrix=${Number(arr1[0])}&${arr1[1]}&${arr1[2]}`;
}
}
});
window.map = map;
map.mapboxGLMap.on("load", () => {
map.addWMTSLayer(
"http://89.0.23.24/PGIS_S_TileMapServer/Maps/XZDJ_SL/EzMap"
,
{
Service: "getImage",
Type: "RGB",
ZoomOffset: "0",
V: "0.3",
Zoom: "{z}",
Row: "{y}",
Col: "{x}"
},
{
tileSize: 300
}
);
map.addGaudLayer({
url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
})
zoomTarget.value = map.mapboxGLMap.getZoom();
});
mapUtil.value = new MapUtil(map);
@ -173,7 +166,7 @@ onMounted(() => {
});
// 回显线
emitter.on("echoLine", (res) => {
mapUtil.value.createLine(res, res.flag);
mapUtil.value.createLine(res);
});
//创建边界面geojson
emitter.on("setBoundarys", (res) => {
@ -204,6 +197,11 @@ onMounted(() => {
mapUtil.value.diffusionCircle(res);
});
// 清除全部覆盖物
emitter.on("removeElementAll", () => {
mapUtil.value.removeElementAll();
});
// 展示盘曲
emitter.on("showGapText", (obj) => {
mapUtil.value.gapText(obj);
@ -302,6 +300,7 @@ onUnmounted(() => {
emitter.off("diffusionCircle");
emitter.off("SsCircle");
emitter.off("ClearssCircle");
emitter.off("removeElementAll");
});
</script>
@ -324,35 +323,29 @@ onUnmounted(() => {
right: 398px;
bottom: 4px;
z-index: 9;
.mapImageItem {
border: 1px solid #08aae8;
background: rgb(9, 26, 70);
&>img {
& > img {
width: 100%;
height: 50px;
}
&>div {
& > div {
text-align: center;
position: relative;
top: -3px;
}
}
.zoomTargetBox {
margin-top: 10px;
margin-left: 23px;
}
::v-deep .el-input-number__decrease,
::v-deep .el-input-number__increase {
background: #133362;
color: #fff;
border: none;
}
::v-deep .el-input__inner {
background: #0c1641;
}

View File

@ -0,0 +1,359 @@
<template>
<div :id="mapid" class="map"></div>
<div class="changeMap_box" v-if="props.isShow">
<el-switch v-model="conditionRoute" @change="handleSwitch" active-text="打开路况" inactive-text="关闭路况"
style="--el-switch-color: #13ce66; --el-switch-off-color: #ff4949" />
<!-- <el-carousel type="card" height="75px" :autoplay="false" indicator-position="none" :initial-index="3" @change="onMapImageChange">
<el-carousel-item>
<div class="mapImageItem">
<img :src="require('@/assets/images/slt.jpg')" alt="" />
<div>栅格浅色</div>
</div>
</el-carousel-item>
<el-carousel-item>
<div class="mapImageItem">
<img :src="require('@/assets/images/yxt.jpg')" alt="" />
<div>影像图</div>
</div>
</el-carousel-item>
<el-carousel-item>
<div class="mapImageItem">
<img :src="require('@/assets/images/yst.jpg')" alt="" />
<div>栅格深色</div>
</div>
</el-carousel-item>
<el-carousel-item>
<div class="mapImageItem">
<img :src="require('@/assets/images/shy.png')" alt="" />
<div>三合一</div>
</div>
</el-carousel-item>
</el-carousel> -->
<!-- 地图缩放 -->
<div class="zoomTargetBox">
<el-input-number :min="7" :max="18" v-model="zoomTarget" :step="1" step-strictly @change="handleZoom">
</el-input-number>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, defineProps, nextTick } from "vue";
import { MapUtil } from "./mapUtil";
import emitter from "@/utils/eventBus.js";
import { getItem } from "@/utils/storage";
const conditionRoute = ref(true); //路况
const mMap = ref(null); //地图对象
const mapUtil = ref(null); //地图工具对象
const zoomTarget = ref(6);
const props = defineProps({
mapid: {
type: String,
default: "mapDiv"
},
//是否显示可以切换地图底图
isShow: {
type: Boolean,
default: false
},
//是否显示实时路况
isShowMvt: {
type: Boolean,
default: false
},
//是否显示地图层级
isShowZoom: {
type: Boolean,
default: false
},
//是否显示绘制控件
isShowDraw: {
type: Boolean,
default: false
}
});
try {
const userInfo = getItem("deptId")[0].deptCode;
} catch (error) { }
let map;
let mapLayer;
let mapLayer1;
onMounted(() => {
emitter.on("followUp", (res) => {
let box = document.getElementsByClassName("changeMap_box");
if (!box) return;
box[0].style.right = !res ? "4px" : "398px";
box[0].style.transition = "0.5s";
});
map = new EliMap({
id: props.mapid,
crs: "EPSG:4490",
style: {
glyphs: "./fonts/{fontstack}/{range}.pbf",
center: [94.36057012, 29.64276831],
zoom: 15
},
minZoom: 7,
maxZoom: 18,
});
window.map = map;
map.mapboxGLMap.on("load", () => {
map.addWMTSLayer(
"/PGIS_S_TileMapServer/Maps/XZDJ_SL/EzMap",
{
Service: "getImage",
Type: "RGB",
ZoomOffset: "0",
V: "0.3",
Zoom: "{z}",
Row: "{y}",
Col: "{x}"
},
{
tileSize: 300
}
);
zoomTarget.value = map.mapboxGLMap.getZoom();
});
mapUtil.value = new MapUtil(map);
mapUtil.value.Drawplot(); //初始化加载绘制工具
// 设置地图中心点及图层
emitter.on("setMapCenter", (res) => {
mapUtil.value.setMapCenter(res.location, res.zoomLevel);
});
emitter.on("removePlot", (flag) => {
mapUtil.value.removePlot(flag);
});
emitter.on("removeAll", (flag) => {
mapUtil.value.removeAll(flag);
});
// 撒点
emitter.on("addPointArea", (obj) => {
mapUtil.value.makerSki(obj);
});
// 鼠标滑过提示文字的点位
emitter.on("showPoint", (obj) => {
mapUtil.value.showPoint(obj);
});
// 清除覆盖物
emitter.on("deletePointArea", (res) => {
mapUtil.value.removeElement(res);
});
// 清除某个覆盖物的单个
emitter.on("deletePointAreaOne", (obj) => {
mapUtil.value.removeElementOne(obj.flag, obj.id);
});
// 清除某个覆盖物的单个
emitter.on("showSquire", (obj) => {
mapUtil.value.zdySquire(obj);
});
// 绘制图形 - 回显区域
emitter.on("drawShape", (res) => {
mapUtil.value.plot(res, resFun);
});
emitter.on("removeEara", (flag) => {
mapUtil.value.removeEara(flag);
});
// 回显图形
emitter.on("echoPlane", (res) => {
mapUtil.value.echoPlane(res);
});
//移除绘制区域
emitter.on("removeEara", (flag) => {
mapUtil.value.removeEara(flag);
});
// 回显线
emitter.on("echoLine", (res) => {
mapUtil.value.createLine(res, res.flag);
});
//创建边界面geojson
emitter.on("setBoundarys", (res) => {
mapUtil.value.createBoundarys(res);
});
// 移除边界
emitter.on("removeBj", (res) => {
mapUtil.value.removeBj(res);
});
// 轨迹回放
emitter.on("drawLineAnimation", (res) => {
mapUtil.value.displayLineAnimation(res);
});
// 聚合撒点
emitter.on("addPoint", (obj) => {
mapUtil.value.aggregateScatteringPoint(obj);
});
// 热力图显示
emitter.on("thermodynamicChart", (res) => {
mapUtil.value.showHeatDrawing(res);
});
// 扩散圆
emitter.on("diffusionCircle", (res) => {
mapUtil.value.diffusionCircle(res);
});
// 展示盘曲
emitter.on("showGapText", (obj) => {
mapUtil.value.gapText(obj);
});
// 获取当前地图中心点
emitter.on("getCurrentCenter", (res) => {
let centerPoint = map.mapboxGLMap.getCenter();
let coords = [centerPoint.lng, centerPoint.lat];
emitter.emit("getcentercoord", coords);
});
});
//切换地图底图
const onMapImageChange = (val) => {
//清除已经存在胡地图图层
if (map.mapboxGLMap.getLayer("SGQS_ID"))
map.mapboxGLMap.removeLayer("SGQS_ID");
if (map.mapboxGLMap.getLayer("YX_ID")) map.mapboxGLMap.removeLayer("YX_ID");
if (map.mapboxGLMap.getLayer("SGSG_ID"))
map.mapboxGLMap.removeLayer("SGSG_ID");
if (map.mapboxGLMap.getLayer("TDT_TITLE_ID"))
map.mapboxGLMap.removeLayer("TDT_TITLE_ID");
if (map.mapboxGLMap.getLayer("TDT_ROAD_ID"))
map.mapboxGLMap.removeLayer("TDT_ROAD_ID");
if (map.mapboxGLMap.getLayer("TDT_POI_ID"))
map.mapboxGLMap.removeLayer("TDT_POI_ID");
//设置图层
switch (val) {
case 0:
mapSetLayer("SGQS_ID", "SGQS");
break;
case 1:
mapSetLayer("YX_ID", "YX");
break;
case 2:
mapSetLayer("SGSG_ID", "SGSG");
break;
case 3:
mapSetLayer("TDT_TITLE_ID", "TDT_TITLE_SOURCES");
mapSetLayer("TDT_ROAD_ID", "TDT_ROAD_SOURCES");
mapSetLayer("TDT_POI_ID", "TDT_POI_SOURCES");
break;
}
if (map.mapboxGLMap.getLayer("realTimeTrafficlevelOne"))
map.mapboxGLMap.moveLayer("realTimeTrafficlevelOne");
if (map.mapboxGLMap.getLayer("map_id")) map.mapboxGLMap.moveLayer("map_id");
if (map.mapboxGLMap.getLayer("map_ids")) map.mapboxGLMap.moveLayer("map_ids");
};
//设置图层函数
const mapSetLayer = (id, source) => {
map.mapboxGLMap.addLayer({ id, type: "raster", source });
};
//获取地图绘制的数据
const resFun = (coord, type, flag, data) => {
emitter.emit("coordString", {
coord: coord,
type: type,
flag: flag,
data: data
});
};
// 地图层级
const handleZoom = (val) => {
map.mapboxGLMap.setZoom(val);
};
// 是否打开或者关闭路况
const handleSwitch = (val) => {
if (val) {
// 打开
} else {
// 关闭
}
};
onUnmounted(() => {
emitter.off("removePlot");
emitter.off("setMapCenter");
emitter.off("addPointArea");
emitter.off("showPoint");
emitter.off("deletePointArea");
emitter.off("deletePointAreaOne");
emitter.off("drawShape");
emitter.off("echoPlane");
emitter.off("removeEara");
emitter.off("echoLine");
emitter.off("addPoint");
emitter.off("thermodynamicChart");
emitter.off("drawLineAnimation");
emitter.off("aggregateScatteringPoint");
emitter.off("hotmap");
emitter.off("setBoundarys");
emitter.off("diffusionCircle");
emitter.off("SsCircle");
emitter.off("ClearssCircle");
});
</script>
<style lang="scss" scoped>
.map {
width: 100%;
height: 100%;
background-color: aliceblue;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
z-index: 1;
}
.changeMap_box {
position: absolute;
right: 398px;
bottom: 4px;
z-index: 9;
.mapImageItem {
border: 1px solid #08aae8;
background: rgb(9, 26, 70);
&>img {
width: 100%;
height: 50px;
}
&>div {
text-align: center;
position: relative;
top: -3px;
}
}
.zoomTargetBox {
margin-top: 10px;
margin-left: 23px;
}
::v-deep .el-input-number__decrease,
::v-deep .el-input-number__increase {
background: #133362;
color: #fff;
border: none;
}
::v-deep .el-input__inner {
background: #0c1641;
}
}
</style>

View File

@ -86,4 +86,4 @@ function exportExcel() {
</script>
<style>
</style>
</style>

View File

@ -1,132 +1,65 @@
<template>
<div
v-loading="loadingPage"
class="pageSearch searchBox"
:style="`margin-bottom: ${marginBottom}px;background-color: ${backgroundColor}`"
>
<div v-loading="loadingPage" class="pageSearch searchBox"
:style="`margin-bottom: ${marginBottom}px;background-color: ${backgroundColor}`">
<div class="box">
<div v-for="(item, index) in getArr" :key="index" class="item">
<div class="label" v-if="item.label">{{ item.label }}</div>
<!-- select -->
<el-select
v-if="item.showType === 'select'"
v-model="searchObj[item.prop]"
:multiple="item.multiple"
:clearable="item.clearable"
:filterable="item.filterable"
:placeholder="item.placeholder"
collapse-tags
collapse-tags-tooltip
>
<el-option
v-for="obj in getOptions[item.prop]"
:key="obj.value"
:label="obj.label || obj.lable"
:value="obj.value"
/>
<el-select v-if="item.showType === 'select'" v-model="searchObj[item.prop]" :multiple="item.multiple"
:clearable="item.clearable" :filterable="item.filterable" :placeholder="item.placeholder" collapse-tags
collapse-tags-tooltip>
<el-option v-for="obj in getOptions[item.prop]" :key="obj.value" :label="obj.label || obj.lable"
:value="obj.value" />
</el-select>
<!-- input -->
<el-input
v-else-if="item.showType === 'input'"
class="input"
v-model="searchObj[item.prop]"
:clearable="item.clearable"
:placeholder="item.placeholder"
/>
<el-input v-else-if="item.showType === 'input'" class="input" v-model="searchObj[item.prop]"
:clearable="item.clearable" :placeholder="item.placeholder" />
<!-- 日期段选择器 -->
<el-date-picker
v-else-if="item.showType === 'daterange'"
v-model="searchObj[item.prop]"
type="daterange"
unlink-panels
:range-separator="item.rangeSeparator"
:start-placeholder="item.startPlaceholder"
:end-placeholder="item.endPlaceholder"
:shortcuts="item.shortcuts"
:disabledDate="item.bool ? disabledDate : ''"
value-format="YYYY-MM-DD"
/>
<el-date-picker v-else-if="item.showType === 'daterange'" v-model="searchObj[item.prop]" type="daterange"
unlink-panels :range-separator="item.rangeSeparator" :start-placeholder="item.startPlaceholder"
:end-placeholder="item.endPlaceholder" :shortcuts="item.shortcuts"
:disabledDate="item.bool ? disabledDate : ''" value-format="YYYY-MM-DD" />
<el-date-picker
v-else-if="item.showType === 'date'"
v-model="searchObj[item.prop]"
type="date"
:placeholder="item.placeholder"
:disabled-date="disabledDate"
:shortcuts="item.shortcuts"
value-format="YYYY-MM-DD"
>
<el-date-picker v-else-if="item.showType === 'date'" v-model="searchObj[item.prop]" type="date"
:placeholder="item.placeholder" :disabled-date="disabledDate" :shortcuts="item.shortcuts"
value-format="YYYY-MM-DD">
</el-date-picker>
<el-time-picker v-else-if="item.showType === 'time'" v-model="searchObj[item.prop]" format="HH:mm:ss"
value-format="HH:mm:ss" :placeholder="item.placeholder" />
<!-- 时间日期 -->
<el-date-picker
v-else-if="item.showType === 'datetime'"
v-model="searchObj[item.prop]"
type="datetime"
:placeholder="item.placeholder"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
<el-date-picker v-else-if="item.showType === 'datetime'" v-model="searchObj[item.prop]" type="datetime"
:placeholder="item.placeholder" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" />
<!-- checkbox -->
<template v-else-if="item.showType === 'department'">
<MOSTY.Department clearable v-model="item.ssbmdm" />
</template>
<!-- checkbox -->
<template v-else-if="item.showType === 'checkbox'">
<el-checkbox
v-if="item.showSelectAll"
v-model="item.checkAll"
:indeterminate="item.isIndeterminate"
@change="
(val) => {
handleCheckAllChange(val, item);
}
"
>全选</el-checkbox
>
<el-checkbox-group
v-model="searchObj[item.prop]"
@change="
(val) => {
handleCheckedCitiesChange(val, item);
}
"
>
<el-checkbox
v-for="obj in item.options"
:key="obj.value"
:label="obj.value"
>{{ obj.label }}</el-checkbox
>
<el-checkbox v-if="item.showSelectAll" v-model="item.checkAll" :indeterminate="item.isIndeterminate" @change="
(val) => {
handleCheckAllChange(val, item);
}
">全选</el-checkbox>
<el-checkbox-group v-model="searchObj[item.prop]" @change="
(val) => {
handleCheckedCitiesChange(val, item);
}
">
<el-checkbox v-for="obj in item.options" :key="obj.value" :label="obj.value">{{ obj.label }}</el-checkbox>
</el-checkbox-group>
</template>
<!-- radio -->
<el-radio-group
v-else-if="item.showType === 'radio'"
v-model="searchObj[item.prop]"
@change="
(val) => {
handleRadioChange(val, item);
}
"
>
<el-radio
v-for="obj in item.options"
:key="obj.value"
:label="obj.value"
>{{ obj.label }}</el-radio
>
<el-radio-group v-else-if="item.showType === 'radio'" v-model="searchObj[item.prop]" @change="
(val) => {
handleRadioChange(val, item);
}
">
<el-radio v-for="obj in item.options" :key="obj.value" :label="obj.value">{{ obj.label }}</el-radio>
</el-radio-group>
<!-- 级联选择 -->
<el-cascader
v-else-if="item.showType === 'cascader'"
@change="changeca"
v-model="searchObj[item.prop]"
:props="item.props"
:show-all-levels="item.showAllLevels"
:clearable="item.clearable"
:options="getOptions[item.prop]"
:placeholder="item.placeholder"
/>
<el-cascader v-else-if="item.showType === 'cascader'" @change="changeca" v-model="searchObj[item.prop]"
:props="item.props" :show-all-levels="item.showAllLevels" :clearable="item.clearable"
:options="getOptions[item.prop]" :placeholder="item.placeholder" />
<div v-else-if="item.showType === 'defaultSlot'">
<slot name="defaultSlot"></slot>
</div>
@ -583,11 +516,13 @@ watchEffect(() => {
.box {
display: flex;
flex-wrap: wrap;
.item {
display: flex;
margin-right: 20px;
margin-bottom: 15px;
}
.label {
margin: auto;
margin-right: 5px;

View File

@ -63,7 +63,9 @@ onMounted(() => {
active.value = "LZ";
});
const logout = () => {
store.dispatch("user/logout");
window.opener = null;
window.open('', '_self');
window.close();
store.commit("app/clearTag", null, { immediate: true });
store.commit("permission/deleteRouter", { immediate: true });
store.commit("user/deleteKeepLiiveRoute", "home");

View File

@ -28,13 +28,12 @@ const updatePwd = () => {
const store = useStore();
const logout = () => {
store.dispatch("user/logout");
store.commit("app/clearTag", null, {
immediate: true
});
store.commit("permission/deleteRouter", {
immediate: true
});
window.opener = null;
window.open('', '_self');
window.close();
store.commit("app/clearTag", null, { immediate: true });
store.commit("permission/deleteRouter", { immediate: true });
store.commit("user/deleteKeepLiiveRoute", "home");
};
</script>

View File

@ -21,6 +21,11 @@ export const privateRoutes = [];
* 公开路由表
*/
export const publicRoutes = [
{
path: "/oatuh_login",
name: "oatuh_login",
component: () => import("@/views/login/oatuh_login")
},
{
path: "/login",
name: "login",

View File

@ -33,7 +33,7 @@
<el-form-item label="公交线路编码">
<el-input
disabled
v-model="listQuery.zdbm"
v-model="listQuery.gjxlbm"
placeholder="公交线路编码"
/>
</el-form-item>

View File

@ -60,7 +60,7 @@ const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "行政区划",
prop: "xzqy",
prop: "xzqhbm",
placeholder: "行政区划",
showType: "select",
options: D_BZ_XZQHDM
@ -69,13 +69,13 @@ const searchConfiger = ref([
label: "开始时间",
prop: "startTime",
placeholder: "公交线路起点站",
showType: "datetime"
showType: "time"
},
{
label: "结束时间",
prop: "endTime",
placeholder: "公交线路终点站",
showType: "datetime"
showType: "time"
}
]);
@ -107,8 +107,10 @@ const pageData = reactive({
tableColumn: [
{ label: "公交线路编码", prop: "gjxlbm" },
{ label: "公交站点名称", prop: "zdmc" },
{ label: "公交站点编码", prop: "xzqhbm" },
{ label: "行政区划", prop: "xzqhbm", showSolt: true }
{ label: "公交站点编码", prop: "zdbm" },
{ label: "行政区划", prop: "xzqhbm", showSolt: true },
{ label: "开始时间", prop: "kssj" },
{ label: "结束时间", prop: "jssj" }
]
});
@ -140,7 +142,7 @@ const getList = () => {
tbGjZdxxselectPage(data)
.then((res) => {
pageData.tableData = res.records;
pageData.total = 0;
pageData.total = res.total;
})
.finally(() => {
pageData.tableConfiger.loading = false;

View File

@ -71,26 +71,9 @@ const urlImg = "/mosty-api/mosty-base/minio/image/download/";
const detailDiloag = ref();
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "车牌号",
prop: "cph",
placeholder: "车牌号",
showType: "input"
},
// {
// label: "起点",
// prop: "xlqdz",
// placeholder: "起点",
// showType: "input"
// },
// {
// label: "终点",
// prop: "xlzdz",
// placeholder: "终点",
// showType: "input"
// },
{
label: "日期",
label: "预警日期",
prop: "startTime",
placeholder: "日期",
showType: "daterange",
@ -158,7 +141,7 @@ const getList = () => {
tbGjYjgetPageList(data)
.then((res) => {
pageData.tableData = res.records;
pageData.total = 0;
pageData.total = res.total;
})
.finally(() => {
pageData.tableConfiger.loading = false;

View File

@ -0,0 +1,88 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="flex justify-end">
<el-button size="small" @click="close">关闭</el-button>
</div>
<el-form :label-width="230" label-position="left" v-model="personalInfo">
<div class="flex align-center bottom" :key="index">
<div style="width: calc(100% - 400px)">
<div class="form-row">
<el-form-item label="车辆驾驶员">
<el-input v-model="personalInfo.cljsy" placeholder="车辆驾驶员" disabled />
</el-form-item>
<el-form-item label="车辆类型">
<el-select v-model="personalInfo.cllx" placeholder="请选择车辆类型" disabled>
<el-option
v-for="item in dict.D_BZ_GGJTGJLX"
:key="item.value"
:label="item.zdmc"
:value="item.dm"
/>
</el-select>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="车牌号">
<el-input v-model="personalInfo.cph" placeholder="请输入" disabled/>
</el-form-item>
<el-form-item label="单位名称">
<el-input v-model="personalInfo.dwmc" placeholder="请输入" disabled/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="企业部门">
<el-input v-model="personalInfo.qybm" placeholder="请输入" disabled/>
</el-form-item>
<el-form-item label="行政区域">
<el-input v-model="personalInfo.xzqy" placeholder="请输入" disabled/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="线路名称">
<el-input v-model="personalInfo.xlmc" placeholder="请输入" disabled/>
</el-form-item>
</div>
</div>
</div>
</el-form>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const props = defineProps({
dict: {
type: Object,
default: () => {}
}
})
const personalInfo = ref({})
const dialogForm = ref(false)
const init = (type, res) => {
dialogForm.value = true;
personalInfo.value = res
}
const close = () => {
dialogForm.value = false;
}
onMounted(() => {
});
defineExpose({
init
});
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.justify-end {
justify-content: right;
}
</style>

View File

@ -0,0 +1,152 @@
<template>
<div>
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
</Search>
</div>
<!-- 表格 -->
<!-- class="tabBox" -->
<div>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="chooseData">
<template #cllx="{ row }">
<dict-tag :options="dict.D_BZ_GGJTGJLX" :value="row.cllx" :tag="false" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" @click="addEdit('basic', row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<!-- 详情 -->
<Cldeict ref="cldeict" :dict="dict" />
</div>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { tbGjclselectPage } from "@/api/mosty-zhgj.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Cldeict from "./cldeict.vue";
const cldeict = ref()
const searchBox = ref(); //搜索框
const props = defineProps({
dwid: { type: String, default: "" },
dict: {
type: Object,
default: () => { }
}
})
const searchConfiger = ref([
{
label: "车牌号",
prop: "cph",
placeholder: "车牌号",
showType: "input"
},
{
label: "车辆驾驶员",
prop: "cljsy",
placeholder: "车辆驾驶员",
showType: "input"
}, {
label: "车辆类型",
prop: "cllx",
placeholder: "车辆类型",
showType: "select",
options: props.dict.D_BZ_GGJTGJLX
}
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [
],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 5,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 200,
tableColumn: [
{ label: "车辆类型", prop: "cllx", showSolt: true },
{ label: "车牌号", prop: "cph" },
{ label: "单位名称", prop: "dwmc" },
{ label: "部门", prop: "qybm" },
{ label: "线路名称", prop: "xlmc" },
{ label: "驾驶员", prop: "cljsy" },
]
});
onMounted(() => {
getList();
tabHeightFn();
});
//选择类型
const onSearch = (val) => {
queryFrom.value = { ...val };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageNum = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value, dwid: props.dwid };
tbGjclselectPage(data)
.then((res) => {
pageData.tableData = res.records;
pageData.total = res.total;
})
.finally(() => {
pageData.tableConfiger.loading = false;
});
};
// 详情
const addEdit = (type, row) => {
cldeict.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 350;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,163 @@
<template>
<div>
<div ref="searchBox">
<Search
:searchArr="searchConfiger"
@submit="onSearch"
:key="pageData.keyCount"
>
</Search>
</div>
<!-- 表格 -->
<!-- class="tabBox" -->
<div >
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" @click="addEdit('basic', row)">详情</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
</div>
<!-- 详情 -->
<Cyrydeict ref="cyrydeict" :dict="dict"/>
</div>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import {tbJcxxAbryselectPage } from "@/api/mosty-zhgj.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Cyrydeict from "./cyrydeict.vue";
const cyrydeict = ref()
const searchBox = ref(); //搜索框
const props = defineProps({
dwid: { type: String, default: "" },
dict: {
type: Object,
default: () => {}
},
})
const searchConfiger = ref([
{
label: "姓名",
prop: "xm",
placeholder: "姓名",
showType: "input"
},
{
label: "证件号码",
prop: "zjhm",
placeholder: "证件号码",
showType: "input"
} , {
label: "联系方式",
prop: "lxdh",
placeholder: "联系方式",
showType: "input"
}
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [
],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 5,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 200,
tableColumn: [
{ label: "姓名", prop: "xm" },
{ label: "证件号码", prop: "zjhm" },
{ label: "联系方式", prop: "lxdh" },
{ label: "入职时间", prop: "rzsj" },
{ label: "岗位", prop: "gw" }
]
});
onMounted(() => {
getList();
tabHeightFn();
});
//选择类型
const onSearch = (val) => {
queryFrom.value = { ...val };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageNum = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value,dwid:props.dwid };
tbJcxxAbryselectPage(data)
.then((res) => {
pageData.tableData = res.records;
pageData.total = res.total;
})
.finally(() => {
pageData.tableConfiger.loading = false;
});
};
// 详情
const addEdit = (type, row) => {
cyrydeict.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 350;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,98 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="flex justify-end">
<el-button size="small" @click="close">关闭</el-button>
</div>
<el-form :label-width="230" label-position="left" v-model="personalInfo">
<div style="width: calc(100% - 400px);overflow: auto;">
<div class="form-row">
<el-form-item label="姓名">
<el-input v-model="personalInfo.xm" placeholder="姓名" disabled />
</el-form-item>
<el-form-item label="民族">
<el-select v-model="personalInfo.mzdm" placeholder="请选择民族" disabled>
<el-option
v-for="item in dict.D_BZ_MZ"
:key="item.value"
:label="item.zdmc"
:value="item.dm"
/>
</el-select>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="证件号码">
<el-input v-model="personalInfo.zjhm" placeholder="请输入证件号码" disabled/>
</el-form-item>
<el-form-item label="联系电话">
<el-input v-model="personalInfo.lxdh" placeholder="请输入证件号码" disabled/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="居住地址">
<el-input v-model="personalInfo.jzdz" placeholder="请输入证件号码" disabled/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="单位名称">
<el-input v-model="personalInfo.dwmc" placeholder="请输入证件号码" disabled/>
</el-form-item>
<el-form-item label="企业部门">
<el-input v-model="personalInfo.qybm" placeholder="请输入证件号码" disabled />
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="入职时间">
<el-input v-model="personalInfo.rzsj" placeholder="请输入入职时间" disabled/>
</el-form-item>
<el-form-item label="岗位">
<el-input v-model="personalInfo.gw" placeholder="请输入岗位" disabled/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="违法犯罪经历描述">
<el-input v-model="personalInfo.wffzms" placeholder="请输入违法犯罪经历描述" disabled/>
</el-form-item>
</div>
</div>
</el-form>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const props = defineProps({
dict: {
type: Object,
default: () => {}
}
})
const personalInfo = ref({})
const dialogForm=ref(false)
const init = (type,res) => {
dialogForm.value = true;
personalInfo.value = res
}
const close = () => {
dialogForm.value = false;
}
onMounted(() => {
});
defineExpose({
init
});
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.justify-end{
justify-content: right;
}
</style>

View File

@ -18,13 +18,13 @@
<div style="width: calc(100% - 176px)">
<div class="form-row">
<el-form-item label="单位类型">
<el-input
<el-input disabled
v-model="dataList.corpoInfo.dwlx"
placeholder="ktv"
/>
</el-form-item>
<el-form-item label="统一社会信用代码">
<el-input
<el-input disabled
v-model="dataList.corpoInfo.shxydm"
placeholder="请输入"
/>
@ -32,13 +32,13 @@
</div>
<div class="form-row">
<el-form-item label="单位名称(营业执照登记名称)">
<el-input
<el-input disabled
v-model="dataList.corpoInfo.dwmc"
placeholder="请输入"
/>
</el-form-item>
<el-form-item label="单位注册地址">
<el-input
<el-input disabled
v-model="dataList.corpoInfo.dwzcdz"
placeholder="请输入"
/>
@ -46,13 +46,13 @@
</div>
<div class="form-row">
<el-form-item label="单位司机数量">
<el-input
<el-input disabled
v-model="dataList.corpoInfo.dwsjsl"
placeholder="请输入"
/>
</el-form-item>
<el-form-item label="单位车辆数量">
<el-input
<el-input disabled
v-model="dataList.corpoInfo.dwclsl"
placeholder="请输入"
/>
@ -60,7 +60,7 @@
</div>
<div class="form-row">
<el-form-item label="所属辖区">
<el-input
<el-input disabled
v-model="dataList.corpoInfo.ssxq"
placeholder="请输入"
/>
@ -78,102 +78,16 @@
</el-tab-pane>
<el-tab-pane label="从业人员" name="staff">
<!-- 从业人员表格 -->
<el-form :label-width="230" label-position="left">
<div
class="flex align-center bottom"
v-for="(item, index) in dataList.personalInfo"
:key="index"
>
<div style="width: calc(100% - 176px)">
<div class="form-row">
<el-form-item label="姓名">
<el-input v-model="item.xm" placeholder="ktv" />
</el-form-item>
<el-form-item label="民族">
<el-input v-model="item.shxydm" placeholder="请输入" />
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="证件号码">
<el-input v-model="item.zjhm" placeholder="请输入" />
</el-form-item>
<el-form-item label="联系电话">
<el-input v-model="item.lxdh" placeholder="请输入" />
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="居住地址">
<el-input v-model="item.jzdz" placeholder="请输入" />
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="单位名称">
<el-input v-model="item.dwmc" placeholder="请输入" />
</el-form-item>
<el-form-item label="企业部门">
<el-input v-model="item.qybm" placeholder="请输入" />
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="入职时间">
<el-input v-model="item.rzsj" placeholder="请输入" />
</el-form-item>
<el-form-item label="岗位">
<el-input v-model="item.gw" placeholder="请输入" />
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="违法犯罪经历描述">
<el-input v-model="item.wffzms" placeholder="请输入" />
</el-form-item>
</div>
</div>
</div>
<Empty :show="dataList.personalInfo.length == 0" />
</el-form>
<Cyry v-if="activeName=='staff'" :dwid="dataList.corpoInfo.id" :dict="dict"/>
</el-tab-pane>
<el-tab-pane label="车辆" name="vehicle">
<!-- 车辆 -->
<el-form :label-width="230" label-position="left">
<div
class="flex align-center bottom"
v-for="(item, index) in dataList.vehicleInfo"
:key="index"
>
<div style="width: calc(100% - 176px)">
<div class="form-row">
<el-form-item label="车辆驾驶员">
<el-input v-model="item.cljsy" placeholder="ktv" />
</el-form-item>
<el-form-item label="车辆类型">
<el-input v-model="item.cllx" placeholder="请输入" />
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="车牌号">
<el-input v-model="item.cph" placeholder="请输入" />
</el-form-item>
<el-form-item label="单位名称">
<el-input v-model="item.dwmc" placeholder="请输入" />
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="企业部门">
<el-input v-model="item.qybm" placeholder="请输入" />
</el-form-item>
<el-form-item label="行政区域">
<el-input v-model="item.xzqy" placeholder="请输入" />
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="线路名称">
<el-input v-model="item.xlmc" placeholder="请输入" />
</el-form-item>
</div>
</div>
</div>
<Clsl v-if="activeName=='vehicle'" :dwid="dataList.corpoInfo.id" :dict="dict"/>
<!-- <el-form :label-width="230" label-position="left">
<Empty :show="dataList.vehicleInfo.length == 0" />
</el-form>
</el-form> -->
</el-tab-pane>
</el-tabs>
</div>
@ -184,6 +98,11 @@
import { ref, reactive } from "vue";
import { tbGjclselectList, tbJcxxAbrySelectList } from "@/api/mosty-zhgj.js";
import Empty from "@/components/Empty/index.vue";
import Cyry from './cyry.vue'
import Clsl from './clsl.vue'
const props = defineProps({
dict: { type: Object, default:{} }
});
const dialogForm = ref(false);
const activeName = ref("basic");
const title = ref("单位信息");
@ -192,20 +111,21 @@ const dataList = reactive({
vehicleInfo: [],
personalInfo: []
});
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
// 根据type和row初始化表单数据
activeName.value = type;
dataList.corpoInfo = { ...row };
switchover(type);
// switchover(type);
};
const switchover = (type) => {
if (type == "staff") {
gettbJcxxAbrySelectList();
} else if (type == "vehicle") {
gettbGjclselectList();
}
// if (type == "staff") {
// // gettbJcxxAbrySelectList();
// } else if (type == "vehicle") {
// gettbGjclselectList();
// }
};
const gettbJcxxAbrySelectList = () => {
tbJcxxAbrySelectList({ dwid: dataList.corpoInfo.id }).then((res) => {

View File

@ -1,7 +1,7 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="客运单位信息管理" />
<PageTitle title="客运单位信息管理"/>
</div>
<!-- 搜索 -->
<div ref="searchBox">
@ -33,7 +33,7 @@
}"></Pages>
</div>
<!-- 详情 -->
<DetailForm ref="detailDiloag" />
<DetailForm ref="detailDiloag" :dict="{D_BZ_MZ,D_BZ_GGJTGJLX}"/>
</div>
</template>
@ -46,7 +46,7 @@ import DetailForm from "./components/detailForm.vue";
import { gjDwjbxxSelectPage } from "@/api/mosty-zhgj.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_MZ,D_BZ_GGJTGJLX} =proxy.$dict("D_BZ_MZ","D_BZ_GGJTGJLX")
const detailDiloag = ref();
const searchBox = ref(); //搜索框
@ -116,7 +116,7 @@ const getList = () => {
gjDwjbxxSelectPage(data)
.then((res) => {
pageData.tableData = res.records;
pageData.total = 0;
pageData.total = res.total;
})
.finally(() => {
pageData.tableConfiger.loading = false;

View File

@ -142,7 +142,7 @@ const getList = () => {
tbJcxxAbryselectPage(data)
.then((res) => {
pageData.tableData = res.records;
pageData.total = 0;
pageData.total = res.total;
})
.finally(() => {
pageData.tableConfiger.loading = false;

View File

@ -12,65 +12,72 @@
<div style="width: calc(100% - 176px)">
<div class="form-row">
<el-form-item label="行政区域">
<el-input v-model="listQuery.dwlx" placeholder="行政区域" />
<el-select v-model="listQuery.xzqy" placeholder="请选择车辆类型" disabled>
<el-option
v-for="item in dict.D_BZ_XZQHDM"
:key="item.value"
:label="item.zdmc"
:value="item.dm"
/>
</el-select>
</el-form-item>
<el-form-item label="公交线路编码">
<el-input
v-model="listQuery.shxydm"
<el-input disabled
v-model="listQuery.xlbm"
placeholder="公交线路编码"
/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="公交线路名称">
<el-input v-model="listQuery.dwmc" placeholder="公交线路名称" />
<el-input v-model="listQuery.xlmc" placeholder="公交线路名称" disabled/>
</el-form-item>
<el-form-item label="公交线路起点站">
<el-input
v-model="listQuery.dwzcdz"
v-model="listQuery.xlqdz" disabled
placeholder="公交线路起点站"
/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="公交线路终点站" class="el-form-items">
<el-input
v-model="listQuery.dwsjsl"
<el-input disabled
v-model="listQuery.xlzdz"
placeholder="公交线路终点站"
/>
</el-form-item>
</div>
<div class="form-row">
<!-- <div class="form-row">
<el-form-item label="起点站首末车">
<el-input v-model="listQuery.ssxq" placeholder="起点站首末车" />
</el-form-item>
</div>
</div> -->
<div class="form-row">
<el-form-item label="开始时间">
<el-input
v-model="listQuery.ssxq"
<el-form-item label="起点站开始时间">
<el-input disabled
v-model="listQuery.qdzjssj"
placeholder="开始时间"
/> </el-form-item
><el-form-item label="结束时间">
<el-input v-model="listQuery.ssxq" placeholder="结束时间" />
><el-form-item label="起点站结束时间">
<el-input v-model="listQuery.qdzkssj" placeholder="结束时间" disabled/>
</el-form-item>
</div>
<div class="form-row">
<!-- <div class="form-row">
<el-form-item label="终点站点站首末车">
<el-input
v-model="listQuery.ssxq"
placeholder="终点站点站首末车"
/>
</el-form-item>
</div>
</div> -->
<div class="form-row">
<el-form-item label="开始时间">
<el-input
v-model="listQuery.ssxq"
<el-form-item label="终点站开始时间">
<el-input disabled
v-model="listQuery.zdzkssj"
placeholder="开始时间"
/> </el-form-item
><el-form-item label="结束时间">
<el-input v-model="listQuery.ssxq" placeholder="结束时间" />
><el-form-item label="终点站结束时间">
<el-input v-model="listQuery.zdzjssj" placeholder="结束时间" disabled/>
</el-form-item>
</div>
</div>
@ -82,7 +89,12 @@
<script setup>
import { ref, reactive } from "vue";
const props = defineProps({
dict: {
type: Array,
default: {},
},
});
const dialogForm = ref(false);
const title = ref("公交线路详情");
const listQuery = ref({});

View File

@ -5,21 +5,30 @@
</div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
<!-- <template #defaultSlot>
<div>
<el-input-number v-model="queryFrom.xqy"></el-input-number>
<span class="ml10 mr10" style="color: #000"></span>
<el-input-number v-model="queryFrom.dqy"></el-input-number>
</div>
</template> -->
</Search>
<Search
:searchArr="searchConfiger"
@submit="onSearch"
:key="pageData.keyCount"
/>
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="chooseData">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
<template #xzqy="{ row }">
<dict-tag
:options="D_BZ_XZQHDM"
:value="row.xzqy"
:tag="false"
/>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" @click="addEdit('detail', row)">详情</el-link>
@ -31,7 +40,7 @@
}"></Pages>
</div>
<!-- 详情 -->
<DetailForm ref="detailDiloag" title="公交线路详情" />
<DetailForm ref="detailDiloag" title="公交线路详情" :dict="{D_BZ_XZQHDM}"/>
</div>
</template>
@ -44,7 +53,7 @@ import DetailForm from "./components/detailForm.vue";
import { tbGjclXlxxselectPage } from "@/api/mosty-zhgj.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const {D_BZ_XZQHDM}=proxy.$dict('D_BZ_XZQHDM')
const detailDiloag = ref();
const searchBox = ref(); //搜索框
const searchConfiger = ref([
@ -52,7 +61,8 @@ const searchConfiger = ref([
label: "行政区划",
prop: "xzqy",
placeholder: "行政区划",
showType: "input"
showType: "select",
options: D_BZ_XZQHDM,
},
{
label: "公交线路起点站",
@ -87,7 +97,7 @@ const pageData = reactive({
{ label: "公交线路名称", prop: "xlmc" },
{ label: "公交线路起点站", prop: "xlqdz" },
{ label: "公交线路终点站", prop: "xlzdz" },
{ label: "行政区划", prop: "xzqy" }
{ label: "行政区划", prop: "xzqy",showSolt:true }
]
});

View File

@ -13,31 +13,31 @@
<div class="form-row">
<div class="form-item">
<div class="lable">车牌号</div>
<div class="menu">{{ listQuery.cph }}</div>
<div class="menu">{{ listQuery.msgs.cph }}</div>
</div>
<div class="form-item">
<div class="lable">日期</div>
<div class="menu">{{ listQuery.gprq }}</div>
<div class="menu">{{listQuery.msgs.gprq }}</div>
</div>
</div>
<div class="form-row">
<div class="form-item">
<div class="lable">车辆驾驶员</div>
<div class="menu">{{ listQuery.cljsy }}</div>
<div class="menu">{{ listQuery.msgs.cljsy }}</div>
</div>
<div class="form-item">
<div class="lable">车辆起始线路</div>
<div class="menu">{{ listQuery.clqsxl }}</div>
<div class="menu">{{listQuery.msgs.clqsxl }}</div>
</div>
</div>
<div class="form-row">
<div class="form-item">
<div class="lable">乘客数量</div>
<div class="menu">{{ listQuery.cksl }}</div>
<div class="menu">{{ listQuery.msgs.cksl }}</div>
</div>
<div class="form-item">
<div class="lable">重点人数量</div>
<div class="menu">{{ listQuery.zdrsl }}</div>
<div class="menu">{{ listQuery.msgs.zdrsl }}</div>
</div>
</div>
<!-- 乘客信息 -->
@ -127,31 +127,31 @@
<div class="form-row">
<div class="form-item">
<div class="lable">车牌号</div>
<div class="menu">{{ listQuery.cph }}</div>
<div class="menu">{{listQuery.msgs.cph }}</div>
</div>
<div class="form-item">
<div class="lable">日期</div>
<div class="menu">{{ listQuery.gprq }}</div>
<div class="menu">{{ listQuery.msgs.gprq }}</div>
</div>
</div>
<div class="form-row">
<div class="form-item">
<div class="lable">车辆驾驶员</div>
<div class="menu">{{ listQuery.cljsy }}</div>
<div class="menu">{{ listQuery.msgs.cljsy }}</div>
</div>
<div class="form-item">
<div class="lable">车辆起始线路</div>
<div class="menu">{{ listQuery.clqsxl }}</div>
<div class="menu">{{ listQuery.msgs.clqsxl }}</div>
</div>
</div>
<div class="form-row">
<div class="form-item">
<div class="lable">乘客数量</div>
<div class="menu">{{ listQuery.cksl }}</div>
<div class="menu">{{ listQuery.msgs.cksl }}</div>
</div>
<div class="form-item">
<div class="lable">重点人数量</div>
<div class="menu">{{ listQuery.zdrsl }}</div>
<div class="menu">{{ listQuery.msgs.zdrsl }}</div>
</div>
</div>
</div>
@ -168,6 +168,7 @@
import { ref, reactive } from "vue";
import GdMap from "@/components/GdMap/index.vue";
import { tbGpJbxxgetInfo, tbGjclgetInfo } from "@/api/mosty-zhgj.js";
import emitter from "@/utils/eventBus.js";
const props = defineProps({
dict: {
type: Object,
@ -176,7 +177,7 @@ const props = defineProps({
});
const dialogForm = ref(false);
const title = ref("购票详情");
const listQuery = reactive({ zdrList: [], ztscryList: [], ckxxList: [] });
const listQuery = reactive({ zdrList: [], ztscryList: [], ckxxList: [],msgs:{}});
const show = ref(true);
// 初始化数据
const init = (type, row) => {
@ -195,7 +196,10 @@ const init = (type, row) => {
};
const gettbGpJbxxgetInfo = (val) => {
tbGpJbxxgetInfo(val).then((res) => {
listQuery = res;
listQuery.msgs = { ...res };
listQuery.ckxxList = res.ckxxList;
listQuery.zdrList = res.zdrList;
listQuery.ztscryList = res.ztscryList;
});
};
const gettbGjclgetInfo = (val) => {

View File

@ -47,32 +47,17 @@ const searchConfiger = ref([
placeholder: "车牌号",
showType: "input"
},
{
label: "起点",
prop: "xlqdz",
placeholder: "起点",
showType: "input"
},
{
label: "终点",
prop: "xlzdz",
placeholder: "终点",
showType: "input"
},
{
label: "购票日期",
prop: "gprq",
placeholder: "购票日期",
placeholder: "日期",
showType: "date"
}
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [
{
cph:'川A8888'
}
],
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
@ -95,7 +80,7 @@ const pageData = reactive({
]
});
onMounted(() => {
// getList();
getList();
tabHeightFn();
});
//选择类型
@ -122,7 +107,7 @@ const getList = () => {
tbGpJbxxselectPage(data)
.then((res) => {
pageData.tableData = res.records;
pageData.total = 0;
pageData.total = res.total;
})
.finally(() => {
pageData.tableConfiger.loading = false;

View File

@ -134,7 +134,7 @@ const getList = () => {
tbGjYjgetPageList(data)
.then((res) => {
pageData.tableData = res.records;
pageData.total = 0;
pageData.total = res.total;
})
.finally(() => {
pageData.tableConfiger.loading = false;

View File

@ -1,45 +1,78 @@
<template>
<div class="data-statistics flex align-center just-center">
<div class="img_but" @click="gettbGjZdxxselectList">
<div class="imgBox"><img src="@/assets/images/qt11/lx.png" alt="" /></div>
<div class="textB">路线</div>
<div class="img_but" v-for="(item,index) in imgBut" :key="index" @click="funClick(index,item.key)" >
<div class="imgBox" v-if="item.show" ><img :src="item.icon1" alt="" /></div>
<div class="imgBox" v-else><img :src="item.icon2" alt="" /></div>
<div class="textB">{{ item.name }}</div>
</div>
<div class="img_but boxCenter" @click="gettbGjclXlxxselectList">
<!-- <div class="img_but boxCenter" @click="gettbGjZdxxselectList" >
<div class="imgBox"><img src="@/assets/images/qt11/zt.png" alt="" /></div>
<div class="imgBox"><img src="@/assets/images/qt11/ztxz.png" alt="" /></div>
<div class="textB">站台</div>
</div>
<div class="img_but" @click="clearContents">
<div class="imgBox">
<img src="@/assets/images/qt11/qc.png" alt="" />
</div>
<div class="imgBox">
<img src="@/assets/images/qt11/qcxz.png" alt="" />
</div>
<div class="textB">清除</div>
</div>
</div> -->
</div>
</template>
<script setup>
import { ref } from "vue";
// 可以在这里添加需要的响应式数据和方法
import { tbGjZdxxselectList, tbGjclXlxxselectList } from "@/api/mosty-zhgj.js";
import emitter from "@/utils/eventBus.js";
const imgBut =ref( [
{
name: '路线',
icon1: require("@/assets/images/qt11/lx.png"),
icon2: require("@/assets/images/qt11/lxxz.png"),
show: true,
key:'xl'
},
{
name: '站台',
icon1: require("@/assets/images/qt11/zt.png"),
icon2: require("@/assets/images/qt11/ztxz.png"),
show: true,
key:'zt'
},
{
name: '清除',
icon1: require("@/assets/images/qt11/qc.png"),
icon2: require("@/assets/images/qt11/qcxz.png"),
show: true,
key:'qc'
},
])
const funClick = (index,val) => {
imgBut.value[index].show = !imgBut.value[index].show
switch (val) {
case 'xl':
gettbGjclXlxxselectList()
break;
case 'zt':
gettbGjZdxxselectList()
break;
case 'qc':
clearContents()
setTimeout(() => {
imgBut.value[index].show = true
imgBut.value[0].show = true
imgBut.value[1].show =true
}, 500);
break;
}
}
const gettbGjZdxxselectList = () => {
tbGjZdxxselectList({}).then((res) => {});
tbGjZdxxselectList({}).then((res) => {
const data = res.map((item) => {
return { coords: [item.zb], text: item.xlmc };
});
emitter.emit("echoLine", {
type: "solid",
coords: data,
isclear: true,
flag: "lx",
color: "#46ff71"
});
});
};
const gettbGjclXlxxselectList = () => {
tbGjclXlxxselectList({}).then((res) => {
if (res) {
const coords = res
const coords = res
.filter((item) => item.jd && item.wd)
.map((items) => {
return {
@ -49,16 +82,26 @@ const gettbGjclXlxxselectList = () => {
});
const icon = require("@/assets/images/qt11/car.png");
emitter.emit("addPoint", { coords, flag: "gjz", icon });
});
};
const gettbGjclXlxxselectList = () => {
tbGjclXlxxselectList({}).then((res) => {
if (res) {
const data =res.filter(item=>item.zb&&item.zb.length>0 ).map((item) => {
return { coords: [item.zb], text: item.xlmc };
});
emitter.emit("echoLine", {
type: "solid",
coords: data,
isclear: true,
flag: "lx",
color: "#46ff71"
});
}
});
};
// const coords = [
// { jd: 102.651727, wd: 30.117088 },
// { jd: 102.527442, wd: 30.108846 },
// { jd: 102.801965, wd: 30.100063 },
// { jd: 102.711411, wd: 30.158424 },
// { jd: 102.579582, wd: 30.174818 }
// ];
// 清除
const clearContents = () => {
emitter.emit("deletePointArea", "gjz");

View File

@ -12,8 +12,6 @@
<div class="item_card">
<div style="line-height: 18px">
{{ item.yjNr }}
<!-- 2025年3月20日,早上10点时重点人员张三购买林芝客运站前
往朗县客运站的车票 -->
</div>
<el-divider border-style="dashed" class="dashed" />
<div class="flex">
@ -25,7 +23,7 @@
<div class="inform_name">
姓名<span>{{ item.yjRyxm }}</span>
</div>
<div class="inform_tag">{{ item.yjlyBqmc }}</div>
<div class="inform_tag" v-if="item.yjlyBqmc">{{ item.yjlyBqmc }}</div>
</div>
<div>身份证{{ item.yjRysfzh }}</div>

View File

@ -2,7 +2,7 @@
<div class="warning-container">
<div class="warning-list noScollLine" v-infinite-scroll="scroll">
<div
@click="roadmap(item.zb)"
@click="handelClick(item)"
class="warning-card"
v-for="(item, index) in warningList.listData"
:key="index"
@ -22,11 +22,11 @@
<div class="course">行驶路线{{ item.xlmc }}</div>
<div class="fare">
<div class="flex riding" style="">
<div>乘车人数20</div>
<div>途中乘车人数30</div>
<div>乘车人数{{ item.ccrs?item.ccrs:0 }}</div>
<div>途中乘车人数{{ item.ztscrs?item.ztscrs:0 }}</div>
</div>
<div>重点人30</div>
<div>重点人{{ item.zdrs?item.zdrs:0 }}</div>
</div>
</div>
<el-divider border-style="dashed" class="dashed" />
@ -73,6 +73,12 @@ const scroll = () => {
}
};
gettbGjclselectPage();
//查看警组信息
function handelClick(item) {
emitter.emit("showJzInfo", item);
}
//画线
const roadmap = (row) => {
if (row && row.length > 0) {

View File

@ -30,6 +30,9 @@
</div>
</div>
</div>
<!-- 警组弹框弹框 -->
<PoliceGroupInfo v-if="show.jzgroup" :data="jzxqList" />
</div>
</template>
@ -40,7 +43,32 @@ import Collection from "./components/collection.vue";
import Warning from "./components/warning.vue";
import BeOnDuty from "./components/beonDuty.vue";
import Introduction from "./components/Introduction.vue";
import { ref } from "vue";
import PoliceGroupInfo from "./layout/streetInfo.vue";
import emitter from "@/utils/eventBus.js";
import {
ref,
reactive,
onMounted
} from "vue";
const jzxqList = ref({}); //警组列表详情
const show = reactive({
jzgroup: false //展示警组弹窗
});
onMounted(() => {
// 展示警组
emitter.on("showJzInfo", (res) => {
show.jzgroup = res ? true : false;
if (res) {
jzxqList.value = res;
}
});
})
</script>
<style lang="scss" scoped>

View File

@ -5,15 +5,15 @@
<div class="f18 pl104">{{ hour + ":" + minute + ":" + second }}</div>
</div>
<div class="title absolute" @click="goPath">{{ props.title }}</div>
<div>
<!-- <div>
<div class="min_title absolute">
<span class="title_text">林芝市</span>
</div>
</div>
</div> -->
<div class="wd absolute">
<el-icon size="25px" style="top: 6px" color="#86C8EB"><Sunny /></el-icon>
<span> 温度 1~7°C </span>
<!-- <el-icon size="25px" style="top: 6px" color="#86C8EB"><Sunny /></el-icon>
<span> 温度 1~7°C </span> -->
</div>
</div>
</template>
@ -25,7 +25,7 @@ import { ref, onMounted, defineProps, onUnmounted } from "vue";
const props = defineProps({
title: {
type: String,
default: "公交系统"
default: "智慧公交"
}
});
const datatime = ref(getRecentDay(0));

View File

@ -0,0 +1,354 @@
<template>
<div class="dialogBox" :style="`left:${elLeft}px;top:${elTop}px`" draggable="true" ref="dialogBoxYpfx"
@dragstart="dragstart($event)" @dragend="dragend($event)">
<div class="title">
<span class="mc">{{ props.data.cph }}</span>
<span @click="close" class="close">
<el-icon>
<Close />
</el-icon>
</span>
</div>
<div class="info-Big-Box noScollLine">
<div class="card">
<div class="card-cnt">
<div class="leftImg">
<el-image style="width: 100%" :src="props.data.image" :hide-on-click-modal="true" close-on-press-escape
fit="cover" lazy>
</el-image>
</div>
<div class="rightInfo">
<div>
<span class="zjhm">驾驶员</span>{{ props.data.cljsy }}
</div>
<div>
<span class="zjhm">车牌号</span>{{ props.data.cph }}
</div>
<div>
<span class="zjhm">行驶路线</span>{{ props.data.xlmc }}
</div>
<div>
<span class="zjhm">乘车人数</span>{{ props.data.ccrs ? props.data.ccrs : 0 }}
</div>
<div>
<span class="zjhm">重点人员</span>{{ props.data.zdrs ? props.data.zdrs : 0 }}
</div>
<div>
<span class="zjhm">途中乘车人数</span>{{ props.data.ztscrs ? props.data.ztscrs : 0 }}
</div>
</div>
</div>
<div class="address">
<img class="addImg" src="@/assets/images/dingwei.png" />
<span>{{ props.data.xlmc }}</span>
</div>
</div>
</div>
<!-- 视频播放区域 -->
<div v-if="showVideo" class="video-container">
<video ref="videoPlayer" class="video-player" controls autoplay muted :src="videoSrc">
您的浏览器不支持视频播放
</video>
</div>
<el-popover placement="bottom" :visible="visible" :width="476" :append-to-body="false">
<template #reference>
<div class="btnBox">
<button class="dp-default small" @click="onClickclgj">车辆轨迹</button>
<button class="dp-default small" @click="onClickSpsd">{{showVideo.value?"关闭视频":"视频播放"}}</button>
</div>
</template>
</el-popover>
</div>
</template>
<script setup>
import Axios from "axios";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import { ref, onMounted, onUnmounted, defineProps, getCurrentInstance, watch } from "vue";
import { timeValidate } from "@/utils/time.js";
import emitter from "@/utils/eventBus.js";
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
import { all } from "ol/events/condition";
const { proxy } = getCurrentInstance();
const props = defineProps({
data: {
type: Object,
default: {}
}
});
const visible = ref(false);
const dialogBoxYpfx = ref();
const videoPlayer = ref();
const showVideo = ref(false);
const videoSrc = ref('');
const initWidth = ref(0); //父元素宽度
const initHeight = ref(0); //父元素高度
const startClientX = ref(0); //元素拖拽前距离浏览器X轴位置
const startClientY = ref(0); //元素拖拽前距离浏览器Y轴位置
const elLeft = ref(400); //元素左偏移量
const elTop = ref(120); //元素右偏移量
watch(
() => props.data,
(val) => {
console.log(val, 'val');
visible.value = false;
}, {
immediate: true,
deep: true
}
);
onMounted(() => {
initBodySize();
});
const onClickSpsd = () => {
if (showVideo.value) {
videoPlayer.value.pause();
videoPlayer.value.currentTime = 0;
} else {
videoSrc.value = props.data.videoUrl || '/static/sample.mp4';
}
showVideo.value = !showVideo.value
};
const onClickclgj = () => {
let row = props.data.zb
if (row && row.length > 0) {
emitter.emit("setMapCenter", {
location: [row[0][0], row[0][1]],
zoomLevel: 12
});
emitter.emit("drawLineAnimation", {
type: "solid",
coords: row,
isclear: true,
flag: "lx"
});
}
}
//初始化
const initBodySize = () => {
initWidth.value = dialogBoxYpfx.value.clientWidth;
initHeight.value = dialogBoxYpfx.value.clientHeight;
};
//拖拽开始
const dragstart = (e) => {
startClientX.value = e.clientX;
startClientY.value = e.clientY;
};
//拖拽结束
const dragend = (e) => {
let x = e.clientX - startClientX.value;
let y = e.clientY - startClientY.value;
elLeft.value += x;
elTop.value += y;
};
//关闭弹窗
function close() {
visible.value = false;
emitter.emit("showJzInfo", false);
emitter.emit("deletePointArea", "lx");
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.dialogBox {
position: absolute;
padding: 0;
width: 484px !important;
.video-container {
margin: 10px auto;
border-radius: 4px;
overflow: hidden;
text-align: center; // 容器居中对齐
.video-player {
width: 100%;
max-width: 400px; // 设置最大宽度
height: 200px;
display: block;
margin: 0 auto; // 水平居中
}
}
.title {
border-bottom: 1px solid #275288;
margin-bottom: 6px;
.mc {
margin-left: 10px;
}
}
.info-Big-Box {
max-height: 70vh;
overflow: hidden;
overflow: auto;
padding: 4px 10px;
box-sizing: border-box;
}
.card {
padding: 10px 10px 4px 10px;
box-sizing: border-box;
border-top: 2px solid #00bfff;
line-height: 20px;
font-size: 14px;
background: #052955;
.card-cnt {
display: flex;
background: rgba(255, 255, 255, 0.05);
margin-bottom: 4px;
.leftImg {
width: 180px;
margin-right: 10px;
}
.rightInfo {
flex: 1;
.title {
width: 100%;
color: #0095FF;
line-height: 28px;
margin-right: 20px;
}
.status {
padding: 1px 6px;
border-radius: 4px;
background: #FF3A3A;
color: #fff;
}
.zjhm {
line-height: 27px;
color: #7CBFFF;
margin-right: 10px;
font-size: 16px;
}
.textflex {
display: flex;
justify-content: space-between;
}
.text {
font-size: 12px;
color: #6585af;
.info {
color: #fff;
}
}
.newinfo {
color: yellow;
}
}
}
.address {
justify-content: space-between;
margin-top: 4px;
padding-top: 6px;
box-sizing: border-box;
border-top: 1px solid #3b3737;
color: #fff;
.addImg {
margin-right: 4px;
vertical-align: text-top;
}
}
.phtos {
height: 110px;
padding-top: 10px;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
width: 100%;
border-top: 1px dashed #3d3d3d;
margin-top: 6px;
box-sizing: border-box;
::v-deep .el-carousel {
width: 100%;
height: 100%;
.el-carousel__container {
height: 72%;
}
.el-carousel__item {
height: 100%;
display: flex;
justify-content: space-between;
}
}
img {
width: 60px;
height: 70px;
}
}
}
}
.all-dialog .dialogBox>.btnBox {
padding-top: 0;
padding-bottom: 0;
}
.timeBox {
width: 100%;
display: flex;
align-items: center;
.time1 {
margin: 0 10px;
text-align: center;
color: #fff;
}
}
::v-deep .el-collapse {
width: 100%;
--el-collapse-header-height: auto;
--el-collapse-header-bg-color: transparent;
--el-collapse-border-color: transparent;
}
::v-deep .el-collapse-item__header {
color: #00bfff;
}
::v-deep .el-collapse-item__wrap {
background-color: transparent;
}
::v-deep .el-collapse-item__content {
color: #fff;
padding-bottom: 0;
}
.null {
text-align: center;
}
</style>

View File

@ -0,0 +1,43 @@
<template></template>
<script setup>
import { ref, onMounted } from "vue";
import { useStore } from "vuex";
import { useRouter } from "vue-router";
import {
setItem
} from "@/utils/storage";
const loginDialog = ref(false);
const deptList = ref([]);
const store = useStore();
function redirectAuth() {
let token = location.hash.slice(20) || null;
if (token != null) {
debugger
token = token.replace(/\ +/g, "");
setItem("SSOTOKEN", token)
handleLogin({ token: token});
} else {
window.location.href = `http://155.240.22.188:9020`;
}
}
const handleLogin = (e) => {
store.dispatch("user/oatuhLogin", e).then((res) => {
// 登录后操作
if (res.deptList.length === 1) {
window.location.hash = "/";
} else {
deptList.value = [...res.deptList];
loginDialog.value = true;
authorization.value = res.jwtToken;
}
});
};
onMounted(() => {
redirectAuth();
});
</script>
<style></style>

View File

@ -7,7 +7,7 @@ const serverHost = "http://192.168.1.32:8066";
// const serverHost = "http://127.0.0.1:8006"
module.exports = {
publicPath: "./",
outputDir: "ylth",
outputDir: "gj",
assetsDir: "static",
lintOnSave: false, //process.env.NODE_ENV === 'development',
productionSourceMap: false,

9
ylth/index.html Normal file
View File

@ -0,0 +1,9 @@
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0" name="viewport"><link rel="icon" href="favicon.ico"><title>公安</title><script src="./pgis/eliMapboxgl.min.js"></script><script src="./static/js/vconsole.min.js"></script><script src="./static/js/jquery-1.12.4.min.js"></script><script src="./static/js/moment.js"></script><script src="./static/js/vue.js"></script><script src="./static/js/antd.min.js"></script><script src="./static/js/antd-with-locales.min.js"></script><link href="static/css/chunk-0d5574ef.32b18482.css" rel="prefetch"><link href="static/css/chunk-0fdaaf92.0c8b1149.css" rel="prefetch"><link href="static/css/chunk-15d0e086.f2ed914b.css" rel="prefetch"><link href="static/css/chunk-19815cd9.fe934a3e.css" rel="prefetch"><link href="static/css/chunk-1b25b3a0.dbb2cfef.css" rel="prefetch"><link href="static/css/chunk-28bd6e9c.0577588b.css" rel="prefetch"><link href="static/css/chunk-2cc5efda.ce890925.css" rel="prefetch"><link href="static/css/chunk-3596bc08.4d6490f8.css" rel="prefetch"><link href="static/css/chunk-418af005.a9f08a65.css" rel="prefetch"><link href="static/css/chunk-455e0e48.6da1c4d0.css" rel="prefetch"><link href="static/css/chunk-48f37632.96c16873.css" rel="prefetch"><link href="static/css/chunk-548a1330.cad1653e.css" rel="prefetch"><link href="static/css/chunk-608198a8.630e98f6.css" rel="prefetch"><link href="static/css/chunk-61c2abd0.3c058eb8.css" rel="prefetch"><link href="static/css/chunk-8b575eb6.61a130d5.css" rel="prefetch"><link href="static/css/chunk-a37f0b78.9266fafe.css" rel="prefetch"><link href="static/css/chunk-e8303676.55ea4f8a.css" rel="prefetch"><link href="static/css/chunk-e94c1e5c.c3628cd2.css" rel="prefetch"><link href="static/css/chunk-fc70b89e.d9cdf86b.css" rel="prefetch"><link href="static/css/chunk-fe6900ae.50f8e44f.css" rel="prefetch"><link href="static/js/chunk-0d5574ef.a336004f.js" rel="prefetch"><link href="static/js/chunk-0fdaaf92.96513d67.js" rel="prefetch"><link href="static/js/chunk-15d0e086.e35a849a.js" rel="prefetch"><link href="static/js/chunk-19815cd9.831d7c4e.js" rel="prefetch"><link href="static/js/chunk-1b25b3a0.083a0498.js" rel="prefetch"><link href="static/js/chunk-28bd6e9c.f97fa2ad.js" rel="prefetch"><link href="static/js/chunk-2cc5efda.83536ac7.js" rel="prefetch"><link href="static/js/chunk-3596bc08.64d195aa.js" rel="prefetch"><link href="static/js/chunk-418af005.6aa3b814.js" rel="prefetch"><link href="static/js/chunk-455e0e48.cbe4ca2e.js" rel="prefetch"><link href="static/js/chunk-48f37632.3879b85f.js" rel="prefetch"><link href="static/js/chunk-548a1330.f50e10a5.js" rel="prefetch"><link href="static/js/chunk-608198a8.5db1d4c5.js" rel="prefetch"><link href="static/js/chunk-61c2abd0.2a77232d.js" rel="prefetch"><link href="static/js/chunk-8b575eb6.a4230b28.js" rel="prefetch"><link href="static/js/chunk-a37f0b78.7cc40bee.js" rel="prefetch"><link href="static/js/chunk-e8303676.1430377e.js" rel="prefetch"><link href="static/js/chunk-e94c1e5c.6ad1f39e.js" rel="prefetch"><link href="static/js/chunk-fc70b89e.46304eea.js" rel="prefetch"><link href="static/js/chunk-fe6900ae.95533d2a.js" rel="prefetch"><link href="static/css/app.edda9e63.css" rel="preload" as="style"><link href="static/css/chunk-vendors.ccb705f1.css" rel="preload" as="style"><link href="static/js/app.0f168338.js" rel="preload" as="script"><link href="static/js/chunk-vendors.62ab2f07.js" rel="preload" as="script"><link href="static/css/chunk-vendors.ccb705f1.css" rel="stylesheet"><link href="static/css/app.edda9e63.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but 公安 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script>document.documentElement.addEventListener(
"touchmove",
function (event) {
if (event.touches.length > 1) {
event.preventDefault();
}
},
false
);</script><script src="static/js/chunk-vendors.62ab2f07.js"></script><script src="static/js/app.0f168338.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long