Browse Source

Merge branch 'develop' of http://39.106.31.193:9211/xiepufeng/jihe-hs into develop

wangqin
刘朋 11 months ago
parent
commit
e1f0bad686
  1. 0
      ruoyi-ui/src/_layout/components/AppMain.vue
  2. 0
      ruoyi-ui/src/_layout/components/InnerLink/index.vue
  3. 0
      ruoyi-ui/src/_layout/components/Navbar.vue
  4. 0
      ruoyi-ui/src/_layout/components/Settings/index.vue
  5. 0
      ruoyi-ui/src/_layout/components/Sidebar/FixiOSBug.js
  6. 0
      ruoyi-ui/src/_layout/components/Sidebar/Item.vue
  7. 0
      ruoyi-ui/src/_layout/components/Sidebar/Link.vue
  8. 0
      ruoyi-ui/src/_layout/components/Sidebar/Logo.vue
  9. 0
      ruoyi-ui/src/_layout/components/Sidebar/SidebarItem.vue
  10. 0
      ruoyi-ui/src/_layout/components/Sidebar/index.vue
  11. 0
      ruoyi-ui/src/_layout/components/Sidebarblue/FixiOSBug.js
  12. 0
      ruoyi-ui/src/_layout/components/Sidebarblue/ItemBlue.vue
  13. 0
      ruoyi-ui/src/_layout/components/Sidebarblue/LinkBlue.vue
  14. 0
      ruoyi-ui/src/_layout/components/Sidebarblue/LogoBlue.vue
  15. 0
      ruoyi-ui/src/_layout/components/Sidebarblue/SidebarItemBlue.vue
  16. 0
      ruoyi-ui/src/_layout/components/Sidebarblue/index.vue
  17. 0
      ruoyi-ui/src/_layout/components/TagsView/ScrollPane.vue
  18. 0
      ruoyi-ui/src/_layout/components/TagsView/index.vue
  19. 0
      ruoyi-ui/src/_layout/components/index.js
  20. 0
      ruoyi-ui/src/_layout/index.vue
  21. 0
      ruoyi-ui/src/_layout/mixin/ResizeHandler.js
  22. 10
      ruoyi-ui/src/assets/styles/JiHeExpressway.scss
  23. 97
      ruoyi-ui/src/common/infoBoardTestData.js
  24. 6
      ruoyi-ui/src/common/menuData.js
  25. 76
      ruoyi-ui/src/views/JiHeExpressway/components/HeaderMenu/CustomMenu.vue
  26. 21
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/index.vue
  27. 63
      ruoyi-ui/src/views/JiHeExpressway/components/SimpleIcon.vue
  28. 22
      ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/TimeLine2/index.vue
  29. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/active.png
  30. 10
      ruoyi-ui/src/views/JiHeExpressway/images/divide.svg
  31. 17
      ruoyi-ui/src/views/JiHeExpressway/images/export.svg
  32. 29
      ruoyi-ui/src/views/JiHeExpressway/images/form/calendar.svg
  33. 9
      ruoyi-ui/src/views/JiHeExpressway/images/form/delete.svg
  34. 7
      ruoyi-ui/src/views/JiHeExpressway/images/form/edit.svg
  35. 12
      ruoyi-ui/src/views/JiHeExpressway/images/form/people.svg
  36. 12
      ruoyi-ui/src/views/JiHeExpressway/images/form/phone.svg
  37. 6
      ruoyi-ui/src/views/JiHeExpressway/images/form/record.svg
  38. 6
      ruoyi-ui/src/views/JiHeExpressway/images/form/search.svg
  39. 7
      ruoyi-ui/src/views/JiHeExpressway/images/import.svg
  40. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/InfoBoard/addinfo.vue
  41. 295
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/InfoBoard/index.vue
  42. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue
  43. 29
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js
  44. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/map.js
  45. 14
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/index.vue
  46. 3
      ruoyi-ui/src/views/JiHeExpressway/pages/README.md
  47. 139
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/components/SelectList.vue
  48. 138
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/components/SpecialTable.vue
  49. 67
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/index.vue
  50. 118
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/ModifyDutyInformationTable.vue
  51. 76
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/OperateRecord.vue
  52. 202
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/index.vue
  53. 15
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/Form.vue
  54. 0
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/images/export.svg
  55. 0
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/images/insert.svg
  56. 0
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/images/refresh.svg
  57. 36
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/index.vue
  58. 142
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/perception/index.vue
  59. 2
      ruoyi-ui/vue.config.js

0
ruoyi-ui/src/layout/components/AppMain.vue → ruoyi-ui/src/_layout/components/AppMain.vue

0
ruoyi-ui/src/layout/components/InnerLink/index.vue → ruoyi-ui/src/_layout/components/InnerLink/index.vue

0
ruoyi-ui/src/layout/components/Navbar.vue → ruoyi-ui/src/_layout/components/Navbar.vue

0
ruoyi-ui/src/layout/components/Settings/index.vue → ruoyi-ui/src/_layout/components/Settings/index.vue

0
ruoyi-ui/src/layout/components/Sidebar/FixiOSBug.js → ruoyi-ui/src/_layout/components/Sidebar/FixiOSBug.js

0
ruoyi-ui/src/layout/components/Sidebar/Item.vue → ruoyi-ui/src/_layout/components/Sidebar/Item.vue

0
ruoyi-ui/src/layout/components/Sidebar/Link.vue → ruoyi-ui/src/_layout/components/Sidebar/Link.vue

0
ruoyi-ui/src/layout/components/Sidebar/Logo.vue → ruoyi-ui/src/_layout/components/Sidebar/Logo.vue

0
ruoyi-ui/src/layout/components/Sidebar/SidebarItem.vue → ruoyi-ui/src/_layout/components/Sidebar/SidebarItem.vue

0
ruoyi-ui/src/layout/components/Sidebar/index.vue → ruoyi-ui/src/_layout/components/Sidebar/index.vue

0
ruoyi-ui/src/layout/components/Sidebarblue/FixiOSBug.js → ruoyi-ui/src/_layout/components/Sidebarblue/FixiOSBug.js

0
ruoyi-ui/src/layout/components/Sidebarblue/ItemBlue.vue → ruoyi-ui/src/_layout/components/Sidebarblue/ItemBlue.vue

0
ruoyi-ui/src/layout/components/Sidebarblue/LinkBlue.vue → ruoyi-ui/src/_layout/components/Sidebarblue/LinkBlue.vue

0
ruoyi-ui/src/layout/components/Sidebarblue/LogoBlue.vue → ruoyi-ui/src/_layout/components/Sidebarblue/LogoBlue.vue

0
ruoyi-ui/src/layout/components/Sidebarblue/SidebarItemBlue.vue → ruoyi-ui/src/_layout/components/Sidebarblue/SidebarItemBlue.vue

0
ruoyi-ui/src/layout/components/Sidebarblue/index.vue → ruoyi-ui/src/_layout/components/Sidebarblue/index.vue

0
ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue → ruoyi-ui/src/_layout/components/TagsView/ScrollPane.vue

0
ruoyi-ui/src/layout/components/TagsView/index.vue → ruoyi-ui/src/_layout/components/TagsView/index.vue

0
ruoyi-ui/src/layout/components/index.js → ruoyi-ui/src/_layout/components/index.js

0
ruoyi-ui/src/layout/index.vue → ruoyi-ui/src/_layout/index.vue

0
ruoyi-ui/src/layout/mixin/ResizeHandler.js → ruoyi-ui/src/_layout/mixin/ResizeHandler.js

10
ruoyi-ui/src/assets/styles/JiHeExpressway.scss

@ -22,7 +22,7 @@
.el-form-item__content {
color: $textColor;
height: $inputHeight;
// height: $inputHeight;
}
.el-input {
@ -125,9 +125,8 @@
}
}
}
.el-menu--popup-bottom-start{
margin-top: 16px;
}
// 导航菜单
.el-menu--popup {
border-radius: 0;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.5) 0%, #064258 93%);
@ -164,4 +163,7 @@
color: #FFF;
}
}
.el-menu--popup-bottom-start {
margin-top: 16px;
}
}

97
ruoyi-ui/src/common/infoBoardTestData.js

@ -0,0 +1,97 @@
// residenceTime 停留时间
// screenEntryMethod 入屏方式
// screenOutputMethod 出屏方式
// screenEntrySpeed 入屏速度
// flickerSpeed 闪烁速度
// flashingFrequency 闪烁次数
// playbackCount 播放次数
// xCoordinate x
// yCoordinate y
// displayAreaWidth 宽度
// displayAreaHeight 高度
// font 字体
// fontSize 字号
// fontStyle 字体风格
// horizontalAlignment 水平对齐
// verticalAlignment 垂直对齐
// lineSpacing 行距
// fontSpacing 字距
// foregroundColor 前景颜色
// backgroundColor 背景颜色
// playSpecialEffects 播放特效
// specialEffectsSpeed 特效速度
// playbackDuration 播放时长
// playbackCount 播放次数
// textContent 文本内容
// whetherToPlayText 是否播放文字
// whetherToSynchronizePlayback 是否同步播放
// setUpTheSpeaker 设置发声音人
// volume 音量
// speechSpeed 语速
// intonation 语调
export default [
{
"backgroundColor": "00000000",
"displayAreaHeight": "120",
"displayAreaWidth": "768",
"flashingFrequency": "5", //闪烁次数
"flickerSpeed": "0", //闪烁速度
"font": "微软雅黑",
"fontSize": "14",
"fontSpacing": "4",
"fontStyle": "0",
"foregroundColor": "ffff00",
"horizontalAlignment": "2",
"intonation": "0",
"lineSpacing": "0",
"playSpecialEffects": "0",
"playbackCount": "1",
"playbackDuration": "50",
"residenceTime": "18", //停留时间
"screenEntryMethod": "1", //入屏方式
"screenEntrySpeed": "1", //入屏速度
"screenOutputMethod": "1", //出屏方式
"setUpTheSpeaker": "0",
"specialEffectsSpeed": "1",
"speechSpeed": "0",
"textContent": "因改扩建施工最高限速100km/h",
"verticalAlignment": "2",
"volume": "0",
"whetherToPlayText": "0",
"whetherToSynchronizePlayback": "0",
"xCoordinate": "0",
"yCoordinate": "0"
},
{
"backgroundColor": "00000000",
"displayAreaHeight": "180",
"displayAreaWidth": "700",
"flashingFrequency": "5",
"flickerSpeed": "0",
"font": "微软雅黑",
"fontSize": "30",
"fontSpacing": "20",
"fontStyle": "0",
"foregroundColor": "ff0000",
"horizontalAlignment": "1",
"intonation": "0",
"lineSpacing": "10",
"playSpecialEffects": "0",
"playbackCount": "1",
"playbackDuration": "50",
"residenceTime": "50",
"screenEntryMethod": "1",
"screenEntrySpeed": "1",
"screenOutputMethod": "1",
"setUpTheSpeaker": "0",
"specialEffectsSpeed": "1",
"speechSpeed": "0",
"textContent": "因改扩建施工最高限速100km/h",
"verticalAlignment": "2",
"volume": "0",
"whetherToPlayText": "0",
"whetherToSynchronizePlayback": "0",
"xCoordinate": "0",
"yCoordinate": "0"
}
]

6
ruoyi-ui/src/common/menuData.js

@ -58,12 +58,6 @@ export default [
name: "controlEventEvent",
component: "control/event/event/index.vue",
},
{
title: "感知事件2",
path: "/control/event/perception",
name: "perception",
component: "control/event/perception/index.vue",
},
{
title: "协调调度记录",
path: "/control/event/coordinateSchedulingRecords",

76
ruoyi-ui/src/views/JiHeExpressway/components/HeaderMenu/CustomMenu.vue

@ -1,11 +1,8 @@
<template>
<el-menu :default-active="activeIndex" mode="horizontal" @select="handleSelect" class="menuBox">
<template v-for="(item, index) in menuData">
<component :index="prefix + '_' + index" v-if="item.children" is="el-submenu" class="subMenu">
<template slot="title">
<p class="menuItem" :class="{ 'menuActive': activeIndex.includes(prefix + '_' + index) }" index="1">{{
item.title }}</p>
</template>
<component :index="prefix + '_' + index" v-if="item.children" is="el-submenu" class="menuItem" :class="{ 'menuActive': activeIndex.includes(prefix + '_' + index) }">
<template slot="title">{{ item.title }}</template>
<!-- 第二层菜单 -->
<template v-for="(item1, index1) in item.children">
@ -86,7 +83,21 @@ export default {
}
};
</script>
<style lang="less" scoped>
<style lang="scss" scoped>
@mixin btnClass{
transition: none;
width: 110px;
height: 34px;
line-height: 32px;
font-size: 18px;
text-align: center;
color: #fff;
padding: 0 !important;
}
@mixin activeBtnBg{
background: url("../../images/active.png") no-repeat 0 0 !important;
background-size: 100% 100% !important;
}
.menuBox {
border: none;
border-radius: 0;
@ -94,54 +105,51 @@ export default {
width: 25%;
display: flex;
justify-content: space-around;
text-align: center;
}
.menuItem {
color: #fff;
@include btnClass;
text-align: center;
width: 96px;
height: 34px;
line-height: 32px;
font-size: 18px;
background-size: 100% 100%;
/deep/ &.is-active {
::v-deep &.is-active {
border: none !important;
color: #fff !important;
}
/deep/ &:focus {
::v-deep &:focus {
border: none !important;
color: #fff !important;
}
&:hover {
background: url("../../images/active.png") no-repeat center center !important;
color: #fff !important;
}
}
.subMenu {
height: 34px;
width: 96px;
text-align: center;
/deep/ .el-icon-arrow-down {
::v-deep .el-icon-arrow-down {
display: none !important;
}
/deep/ .el-submenu__title:hover {
::v-deep .el-submenu__title{
@include btnClass;
}
::v-deep .el-submenu__title:hover {
background: none !important;
}
}
.menuActive {
background: url("../../images/active.png") no-repeat center center !important;
&:hover {
@include activeBtnBg;
color: #fff !important;
::v-deep .el-submenu__title{
color: #fff;
}
}
/deep/ &:focus {
border: none !important;
&.menuActive {
@include activeBtnBg;
::v-deep .el-submenu__title{
color: #fff !important;
}
}
::v-deep &:focus .el-submenu__title{
color: #fff !important;
background: url("../../images/active.png") no-repeat center center !important;
}
}
</style>

21
ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/index.vue

@ -107,7 +107,8 @@ export default {
.left {
img {
width: 180px;
width: 212px;
height: 159;
}
}
@ -115,23 +116,23 @@ export default {
display: flex;
flex-direction: column;
flex: 1;
gap: 12px;
height: 159px;
.info {
flex: 1;
display: flex;
flex-direction: column;
// align-items: center;
justify-content: space-between;
>p {
height: 21px;
font-size: 14px;
// font-family: PingFang SC, PingFang SC;
font-weight: 400;
color: #FFFFFF;
line-height: 16px;
color: #f4f4f4;
line-height: 24px;
&:first-child{
color: #37E7FF;
font-size: 18px;
font-weight: bold;
margin-bottom: 16px;
}
}
}

63
ruoyi-ui/src/views/JiHeExpressway/components/SimpleIcon.vue

@ -0,0 +1,63 @@
<template>
<div class='SimpleIcon' ref="SimpleIconRef" />
</template>
<script>
const cacheIcon = {
}
export default {
name: 'SimpleIcon',
props: {
/**
* [pattern, replacement]
*/
replaces: {
type: Array,
default: () => []
},
url: {
type: String,
default: null
}
},
async created() {
if (!cacheIcon[this.url]) {
await fetch(this.url).then(async data => {
cacheIcon[this.url] = await new Response(data.body).text();
})
};
this._icon_replace_data = cacheIcon[this.url].replaceAll(...this.replaces);
this.insertHTML();
},
mounted() {
this.insertHTML();
},
methods: {
insertHTML() {
const el = this.$refs.SimpleIconRef;
if (!el) return;
el.innerHTML = this._icon_replace_data;
if (el.firstElementChild) {
const svg = el.firstElementChild;
el.replaceWith(el.firstElementChild)
this.$nextTick(() => {
for (let key in el.dataset) {
svg.dataset[key] = "";
}
el.classList.forEach(className => svg.classList.add(className))
});
}
}
}
}
</script>
<style lang='scss' scoped></style>

22
ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/TimeLine2/index.vue

@ -1,9 +1,9 @@
<template>
<div class='TimeLine2'>
<div class="node" v-for="(item, index) in data">
<div class="content">
<template v-if="!!((index + 1) & 1)">
<span class="title">{{ item.title }}</span>
<div class="content" v-if="direction != 'right'">
<template v-if="direction === 'auto' ? !!((index + 1) & 1) : true">
<span class="title" v-if="item.title">{{ item.title }}</span>
<DescCard :data="item" />
</template>
</div>
@ -11,10 +11,9 @@
<div class="circle"></div>
<div class="line"></div>
</div>
<!-- <div class="content"> -->
<div class="content">
<template v-if="!((index + 1) & 1)">
<span class="title">{{ item.title }}</span>
<div class="content" v-if="direction != 'left'">
<template v-if="direction === 'auto' ? !((index + 1) & 1) : true">
<span class="title" v-if="item.title">{{ item.title }}</span>
<DescCard :data="item" />
</template>
</div>
@ -43,6 +42,15 @@ export default {
data: {
type: Array,
default: () => []
},
/**
* auto 左右 显示
* left 左侧显示
* right 右侧显示
*/
direction: {
type: String,
default: "auto"
}
}
}

BIN
ruoyi-ui/src/views/JiHeExpressway/images/active.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 14 KiB

10
ruoyi-ui/src/views/JiHeExpressway/images/divide.svg

@ -0,0 +1,10 @@
<svg width="1" height="150" viewBox="0 0 1 150" fill="none" xmlns="http://www.w3.org/2000/svg">
<line id="Line" x1="0.5" y1="-2.50936e-08" x2="0.500006" y2="150" stroke="url(#paint0_linear_140_6250)"/>
<defs>
<linearGradient id="paint0_linear_140_6250" x1="-1.00014" y1="-7.07547" x2="-1.00014" y2="159.906" gradientUnits="userSpaceOnUse">
<stop stop-color="#033C51" stop-opacity="0"/>
<stop offset="0.481139" stop-color="#0185B5"/>
<stop offset="1" stop-color="#033C51" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 523 B

17
ruoyi-ui/src/views/JiHeExpressway/images/export.svg

@ -1,14 +1,7 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 10065" clip-path="url(#clip0_308_1276)">
<g id="Group 1142814551">
<path id="Rectangle 1282" d="M1 7V11C1 12.1046 1.89543 13 3 13H11C12.1046 13 13 12.1046 13 11V7" stroke="white" stroke-linecap="round"/>
<path id="Rectangle 1304" d="M4.27282 4.05153L7.04691 1.00002L9.81656 4.05155" stroke="white" stroke-linecap="round"/>
<path id="Line 513" d="M7 9L7 2" stroke="white" stroke-linecap="round"/>
<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="&#229;&#175;&#188;&#229;&#135;&#186;">
<path id="Rectangle 1282" d="M1 6V9C1 10.1046 1.89543 11 3 11H10C11.1046 11 12 10.1046 12 9V6" stroke="white" stroke-linecap="round"/>
<path id="Rectangle 1304" d="M4.00018 3.54291L6.54306 1.00003L9.08187 3.54293" stroke="white" stroke-linecap="round"/>
<path id="Line 513" d="M6.54102 8L6.54102 2" stroke="white" stroke-linecap="round"/>
</g>
</g>
<defs>
<clipPath id="clip0_308_1276">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 624 B

After

Width:  |  Height:  |  Size: 493 B

29
ruoyi-ui/src/views/JiHeExpressway/images/form/calendar.svg

@ -0,0 +1,29 @@
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="&#230;&#151;&#165;&#229;&#142;&#134;">
<circle id="Ellipse 41" cx="11" cy="11" r="11" fill="url(#paint0_linear_140_6234)"/>
<g id="&#229;&#155;&#190;&#229;&#177;&#130;_1" clip-path="url(#clip0_140_6234)">
<path id="Vector" d="M7.33355 15.8889H6.72244C6.35577 15.8889 6.11133 15.6444 6.11133 15.2778V6.7222C6.11133 6.35553 6.35577 6.11108 6.72244 6.11108H7.33355V15.8889Z" fill="white"/>
<path id="Vector_2" d="M15.2781 15.8889H14.667V6.11108H15.2781C15.6448 6.11108 15.8892 6.35553 15.8892 6.7222V15.2778C15.8892 15.6444 15.6448 15.8889 15.2781 15.8889Z" fill="white"/>
<path id="Vector_3" d="M7.33398 14.6666H14.6673V15.8888H7.33398V14.6666Z" fill="white"/>
<path id="Vector_4" d="M7.33398 7.94446H14.6673V9.16668H7.33398V7.94446Z" fill="white"/>
<path id="Vector_5" d="M9.77832 6.11108H12.2228V7.94442H9.77832V6.11108Z" fill="white"/>
<path id="Vector_6" d="M8.55566 10.3889H9.77789V11.6111H8.55566V10.3889Z" fill="white"/>
<path id="Vector_7" d="M7.94434 6.11108H9.16656V7.33331H7.94434V6.11108Z" fill="white"/>
<path id="Vector_8" d="M12.834 6.11108H14.0562V7.33331H12.834V6.11108Z" fill="white"/>
<path id="Vector_9" d="M10.3887 10.3889H11.6109V11.6111H10.3887V10.3889Z" fill="white"/>
<path id="Vector_10" d="M12.2227 10.3889H13.4449V11.6111H12.2227V10.3889Z" fill="white"/>
<path id="Vector_11" d="M8.55566 12.2222H9.77789V13.4444H8.55566V12.2222Z" fill="white"/>
<path id="Vector_12" d="M10.3887 12.2222H11.6109V13.4444H10.3887V12.2222Z" fill="white"/>
<path id="Vector_13" d="M12.2227 12.2222H13.4449V13.4444H12.2227V12.2222Z" fill="white"/>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_140_6234" x1="10.6049" y1="4.19847" x2="10.6049" y2="21.4962" gradientUnits="userSpaceOnUse">
<stop stop-color="#D5A939"/>
<stop offset="1" stop-color="#D6771F"/>
</linearGradient>
<clipPath id="clip0_140_6234">
<rect width="9.77778" height="9.77778" fill="white" transform="translate(6.11133 6.11108)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

9
ruoyi-ui/src/views/JiHeExpressway/images/form/delete.svg

@ -0,0 +1,9 @@
<svg width="17" height="19" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="&#229;&#136;&#160;&#233;&#153;&#164;">
<path id="Rectangle 1282" d="M2.66602 4.33313V15.6665C2.66602 16.771 3.56145 17.6665 4.66602 17.6665H12.3327C13.4373 17.6665 14.3327 16.771 14.3327 15.6665V4.33313" stroke="white"/>
<path id="Line 511" d="M4.33496 1H12.6683" stroke="white" stroke-linecap="round"/>
<path id="Line 512" d="M6.83398 14.3333L6.83398 7.66659" stroke="white" stroke-linecap="round"/>
<path id="Line 514" d="M1 4.33313H16" stroke="white" stroke-linecap="round"/>
<path id="Line 513" d="M10.166 14.3333L10.166 7.66659" stroke="white" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 689 B

7
ruoyi-ui/src/views/JiHeExpressway/images/form/edit.svg

@ -0,0 +1,7 @@
<svg width="17" height="18" viewBox="0 0 17 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="&#228;&#191;&#174;&#230;&#148;&#185;">
<path id="Rectangle 81" d="M15.6672 8.5235V15.1222C15.6672 16.2267 14.7718 17.1222 13.6672 17.1222H3C1.89543 17.1222 1 16.2267 1 15.1222V4.38159C1 3.27702 1.89543 2.38159 3 2.38159H9.55587" stroke="white"/>
<path id="Rectangle 82" d="M11.7444 2.66358L14.8486 4.98538L9.41261 12.3259L6.63976 13.5432C6.28599 13.6985 5.89777 13.4081 5.94424 13.023L6.30846 10.0041L11.7444 2.66358Z" stroke="white"/>
<path id="Rectangle 83" d="M12.9 1.10311C13.0643 0.881196 13.3768 0.835378 13.5979 1.00078L15.9013 2.72362C16.1224 2.88902 16.1685 3.203 16.0041 3.42492L14.7172 5.16281L11.613 2.84101L12.9 1.10311Z" stroke="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 767 B

12
ruoyi-ui/src/views/JiHeExpressway/images/form/people.svg

@ -0,0 +1,12 @@
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="&#228;&#186;&#186;&#229;&#145;&#152;">
<circle id="Ellipse 41" cx="11" cy="11" r="11" fill="url(#paint0_linear_140_5759)"/>
<path id="Vector" d="M14.1331 7.2677C14.1743 7.28983 14.2143 7.31408 14.2528 7.34035L14.3733 7.42027V7.55904C14.3786 7.96373 14.3292 8.30521 14.2236 8.56822C14.1415 8.78965 13.9828 8.97658 13.7746 9.09715C13.6384 9.56723 13.479 10.0024 13.2507 10.3686C12.991 10.79 12.652 11.114 12.1632 11.2884C11.9469 11.3611 11.3931 11.4018 10.861 11.393C10.3468 11.3865 9.83039 11.3364 9.62607 11.2477C9.18599 11.0508 8.87764 10.7203 8.64039 10.3032C8.43758 9.92372 8.28086 9.52265 8.17337 9.10805C7.95896 8.99158 7.79422 8.80487 7.7086 8.5813C7.59484 8.31611 7.54245 7.96737 7.54919 7.55687V7.41664L7.66894 7.33817C7.69962 7.31856 7.73106 7.30039 7.76174 7.28296C7.62702 5.6642 7.67792 5.0648 8.29612 4.38112C9.50408 3.42062 12.2725 3.45477 13.4962 4.3259C14.3307 5.0895 14.3905 5.94465 14.1331 7.2677ZM11.5974 11.9489L11.6146 12.3194L11.3901 12.6827L11.7059 14.6945L12.9985 11.9968L14.9676 11.9321C15.9847 12.8658 16.6366 15.065 16.4757 16.5H5.5C5.52769 15.2394 5.76644 13.0852 7.05822 11.9954L8.83723 12.0106L10.504 14.6785L10.8168 12.6834L10.5923 12.3201L10.6095 11.9496C10.9391 11.9271 11.27 11.9271 11.5997 11.9496L11.5974 11.9489ZM13.0688 6.693C12.2867 6.83831 11.1229 6.97127 10.2009 6.46849C9.8476 6.27523 9.32819 6.6712 8.90459 6.63052C8.76934 6.89034 8.67283 7.1675 8.61794 7.4537L8.57154 7.69636L8.32007 7.67166C8.26935 7.66739 8.21829 7.67384 8.17038 7.69055C8.14694 7.69763 8.12415 7.70662 8.10227 7.71743C8.10004 7.94236 8.13959 8.16583 8.21903 8.37714C8.2819 8.52245 8.36871 8.61981 8.48472 8.65541L8.6344 8.699L8.67482 8.84431C8.79756 9.28823 8.93677 9.70672 9.13136 10.0475C9.31098 10.3635 9.5415 10.6149 9.86182 10.758C9.99654 10.8176 10.4231 10.8518 10.8707 10.859C11.3459 10.8663 11.819 10.8409 11.9754 10.7864C12.3279 10.66 12.5809 10.4158 12.7784 10.0962C12.9902 9.75322 13.1407 9.31729 13.2724 8.83922L13.3106 8.70263L13.4505 8.65613C13.562 8.61763 13.6481 8.51954 13.708 8.37205C13.7843 8.16359 13.8223 7.94374 13.8202 7.72252C13.8008 7.71224 13.7802 7.70419 13.7589 7.69854C13.7136 7.6825 13.6656 7.6751 13.6174 7.67675L13.3719 7.69273L13.3278 7.45878C13.2755 7.19476 13.1885 6.93837 13.0688 6.6959V6.693Z" fill="white"/>
</g>
<defs>
<linearGradient id="paint0_linear_140_5759" x1="10.6049" y1="4.19847" x2="10.6049" y2="21.4962" gradientUnits="userSpaceOnUse">
<stop stop-color="#48C1F5"/>
<stop offset="1" stop-color="#0073B4"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

12
ruoyi-ui/src/views/JiHeExpressway/images/form/phone.svg

@ -0,0 +1,12 @@
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="&#231;&#148;&#181;&#232;&#175;&#157;">
<circle id="Ellipse 41" cx="11" cy="11" r="11" fill="url(#paint0_linear_140_5786)"/>
<path id="Vector" d="M16.1488 14.7326C16.2922 14.8764 16.3727 15.0711 16.3727 15.2741C16.3727 15.4772 16.2922 15.6719 16.1488 15.8156L15.607 16.3575C15.207 16.7575 14.6805 17.0009 14.0424 17.0817C13.8843 17.1014 13.7252 17.1113 13.5659 17.1111C13.0588 17.1045 12.5552 17.0256 12.0704 16.8766C10.6308 16.4568 9.11696 15.501 7.80896 14.1908C6.50096 12.8806 5.54294 11.3689 5.12311 9.92934C4.9121 9.21248 4.84299 8.54856 4.91798 7.95743C4.99886 7.31924 5.24222 6.79355 5.6422 6.39284L6.18407 5.85171C6.32782 5.70835 6.52256 5.62785 6.72558 5.62785C6.9286 5.62785 7.12333 5.70835 7.26709 5.85171L9.65001 8.23461C9.79337 8.37837 9.87387 8.5731 9.87387 8.77612C9.87387 8.97913 9.79337 9.17387 9.65001 9.31762L9.10814 9.85875C8.80227 10.1646 9.10814 11.1572 9.97499 12.0248C10.8418 12.8923 11.8344 13.2011 12.141 12.8916L12.6829 12.3497C12.8266 12.2064 13.0214 12.1259 13.2244 12.1259C13.4274 12.1259 13.6222 12.2064 13.7659 12.3497L16.1488 14.7326ZM12.2094 9.17792C12.3718 9.17812 12.5274 9.24271 12.6423 9.35752C12.7571 9.47234 12.8217 9.628 12.8219 9.79038C12.8198 9.83185 12.8262 9.87331 12.8407 9.91223C12.8552 9.95116 12.8774 9.98673 12.906 10.0168C12.9347 10.0469 12.9691 10.0708 13.0073 10.0872C13.0455 10.1035 13.0866 10.112 13.1281 10.112C13.1696 10.112 13.2107 10.1035 13.2489 10.0872C13.287 10.0708 13.3215 10.0469 13.3501 10.0168C13.3788 9.98673 13.401 9.95116 13.4155 9.91223C13.4299 9.87331 13.4363 9.83185 13.4343 9.79038C13.4341 9.46557 13.305 9.15413 13.0753 8.92445C12.8457 8.69478 12.5342 8.56567 12.2094 8.56547C12.1679 8.56344 12.1265 8.56985 12.0875 8.58432C12.0486 8.5988 12.013 8.62102 11.983 8.64966C11.9529 8.6783 11.9289 8.71274 11.9126 8.75091C11.8962 8.78908 11.8878 8.83017 11.8878 8.8717C11.8878 8.91322 11.8962 8.95432 11.9126 8.99249C11.9289 9.03065 11.9529 9.0651 11.983 9.09374C12.013 9.12237 12.0486 9.1446 12.0875 9.15907C12.1265 9.17354 12.1679 9.17996 12.2094 9.17792ZM16.7253 7.88244C16.3505 6.99456 15.7222 6.23698 14.9189 5.70456C14.1156 5.17213 13.1731 4.88854 12.2094 4.88928C12.1679 4.88725 12.1265 4.89366 12.0875 4.90814C12.0486 4.92261 12.013 4.94484 11.983 4.97347C11.9529 5.00211 11.9289 5.03655 11.9126 5.07472C11.8962 5.11289 11.8878 5.15398 11.8878 5.19551C11.8878 5.23704 11.8962 5.27813 11.9126 5.3163C11.9289 5.35447 11.9529 5.38891 11.983 5.41755C12.013 5.44618 12.0486 5.46841 12.0875 5.48288C12.1265 5.49736 12.1679 5.50377 12.2094 5.50174C13.3464 5.5031 14.4365 5.95537 15.2404 6.75935C16.0444 7.56334 16.4967 8.65338 16.4981 9.79038C16.496 9.83185 16.5024 9.87331 16.5169 9.91223C16.5314 9.95116 16.5536 9.98673 16.5823 10.0168C16.6109 10.0469 16.6453 10.0708 16.6835 10.0872C16.7217 10.1035 16.7628 10.112 16.8043 10.112C16.8458 10.112 16.8869 10.1035 16.9251 10.0872C16.9633 10.0708 16.9977 10.0469 17.0263 10.0168C17.055 9.98673 17.0772 9.95116 17.0917 9.91223C17.1061 9.87331 17.1126 9.83185 17.1105 9.79038C17.112 9.13493 16.981 8.48594 16.7253 7.88244ZM12.2094 7.33983C12.8591 7.34061 13.4819 7.59904 13.9413 8.05844C14.4007 8.51784 14.6592 9.14069 14.66 9.79038C14.6579 9.83185 14.6643 9.87331 14.6788 9.91223C14.6933 9.95116 14.7155 9.98673 14.7441 10.0168C14.7728 10.0469 14.8072 10.0708 14.8454 10.0872C14.8836 10.1035 14.9247 10.112 14.9662 10.112C15.0077 10.112 15.0488 10.1035 15.087 10.0872C15.1251 10.0708 15.1596 10.0469 15.1882 10.0168C15.2169 9.98673 15.2391 9.95116 15.2536 9.91223C15.268 9.87331 15.2745 9.83185 15.2724 9.79038C15.2724 8.97802 14.9497 8.19893 14.3753 7.62451C13.8008 7.05009 13.0218 6.72738 12.2094 6.72738C12.1679 6.72534 12.1265 6.73176 12.0875 6.74623C12.0486 6.7607 12.013 6.78293 11.983 6.81157C11.9529 6.8402 11.9289 6.87465 11.9126 6.91282C11.8962 6.95098 11.8878 6.99208 11.8878 7.0336C11.8878 7.07513 11.8962 7.11622 11.9126 7.15439C11.9289 7.19256 11.9529 7.22701 11.983 7.25564C12.013 7.28428 12.0486 7.30651 12.0875 7.32098C12.1265 7.33545 12.1679 7.34186 12.2094 7.33983Z" fill="white"/>
</g>
<defs>
<linearGradient id="paint0_linear_140_5786" x1="10.6049" y1="4.19847" x2="10.6049" y2="21.4962" gradientUnits="userSpaceOnUse">
<stop stop-color="#39D5BF"/>
<stop offset="1" stop-color="#1FAED6"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

6
ruoyi-ui/src/views/JiHeExpressway/images/form/record.svg

@ -0,0 +1,6 @@
<svg width="19" height="14" viewBox="0 0 19 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="&#232;&#174;&#176;&#229;&#189;&#149;">
<path id="Ellipse 17" d="M11.7128 6.81954C11.7128 8.05231 10.719 9.0474 9.49847 9.0474C8.2779 9.0474 7.28418 8.05231 7.28418 6.81954C7.28418 5.58677 8.2779 4.59167 9.49847 4.59167C10.719 4.59167 11.7128 5.58677 11.7128 6.81954Z" stroke="white"/>
<path id="Ellipse 18" d="M18.245 6.59259C18.3433 6.73274 18.3433 6.90658 18.245 7.04673C17.6997 7.824 16.5296 9.36298 14.9702 10.7027C13.4016 12.0503 11.5054 13.1393 9.5 13.1393C7.49457 13.1393 5.59845 12.0503 4.02983 10.7027C2.47043 9.36298 1.30027 7.824 0.755021 7.04673C0.656707 6.90658 0.656707 6.73274 0.755022 6.59259C1.30027 5.81533 2.47043 4.27635 4.02983 2.93664C5.59845 1.58902 7.49457 0.5 9.5 0.5C11.5054 0.5 13.4016 1.58902 14.9702 2.93664C16.5296 4.27635 17.6997 5.81533 18.245 6.59259Z" stroke="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 918 B

6
ruoyi-ui/src/views/JiHeExpressway/images/form/search.svg

@ -0,0 +1,6 @@
<svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="&#230;&#144;&#156;&#231;&#180;&#162;">
<path id="Ellipse 598" d="M11.1686 6.92125C10.7805 9.65526 8.24946 11.557 5.51545 11.1688C2.78144 10.7807 0.879734 8.24969 1.26787 5.51568C1.65601 2.78167 4.18701 0.879962 6.92102 1.2681C9.65503 1.65624 11.5567 4.18724 11.1686 6.92125Z" stroke="white"/>
<path id="Line 508" d="M10.5147 9.94337L10.1418 9.6103L9.47566 10.3561L9.84857 10.6892L10.5147 9.94337ZM12.5377 13.091C12.7436 13.275 13.0597 13.2571 13.2437 13.0512C13.4276 12.8452 13.4098 12.5291 13.2038 12.3452L12.5377 13.091ZM9.84857 10.6892L12.5377 13.091L13.2038 12.3452L10.5147 9.94337L9.84857 10.6892Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 734 B

7
ruoyi-ui/src/views/JiHeExpressway/images/import.svg

@ -0,0 +1,7 @@
<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="&#229;&#175;&#188;&#229;&#135;&#186;">
<path id="Rectangle 1282" d="M1 6V3C1 1.89543 1.89543 1 3 1H10C11.1046 1 12 1.89543 12 3V6" stroke="white" stroke-linecap="round"/>
<path id="Rectangle 1304" d="M4.00018 8.45709L6.54306 11L9.08187 8.45707" stroke="white" stroke-linecap="round"/>
<path id="Line 513" d="M6.54102 4L6.54102 10" stroke="white" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 486 B

4
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/InfoBoard/addinfo.vue

@ -1,7 +1,7 @@
<template>
<div class="container infoBoardDialog">
<!-- 添加信息弹窗 -->
<el-dialog title="新增" :visible.sync="dialogVisible" width="50%" :before-close="handleClose" :close-on-click-modal="false">
<el-dialog title="新增" :visible.sync="dialogVisible" width="50%" :before-close="handleClose" :close-on-click-modal="false" append-to-body>
<div class="dialogStyleBox">
<div class="dialogLine"></div>
<div class="dialogCloseButton"></div>
@ -37,7 +37,7 @@
</div>
</el-card>
<el-card>
<el-form :model="dataForm" :rules="dataRule" label-width="90px" ref="dataForm" size="mini">
<el-form :model="dataForm" :rules="dataRule" label-width="120px" ref="dataForm" size="mini">
<el-row :gutter="24" style="height: 45px;">
<el-col :span="8">
<el-form-item prop="category" label="所属类别" :rules="[

295
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/InfoBoard/index.vue

@ -1,22 +1,22 @@
<template>
<div>
<transition>
<div v-if="dialogInfoLeft" class="dialog_info">
<div v-if="visible" class="dialog_info">
<div class="dialog_info_left">
<div class="dialog_head">
<div class="tit">{{ dialogTit }}</div>
<img class="btnCls" src="@/assets/jihe/images/dialog/ibCls.png" alt="" @click="closeDialogBtnFn">
<img class="btnCls" src="@/assets/jihe/images/dialog/ibCls.png" alt="" @click="onClose">
<img class="deco" src="@/assets/jihe/images/dialog/ibHeadDeco.png" alt="">
</div>
<div class="dialogContent">
<div v-if="dialogInfoList.length > 0" class="dialogContent_box" style="height: 100%;">
<div class="dialogContent_box_item" v-for="(item, i) in dialogInfoList" :key="i.id">
<div class="dialogContent_box_item" v-for="(item, i) in dialogInfoList" :key="i">
<div class="dialogContent_l">
<div class="dialogContent_l_xsq"
:style="{ 'width': processString(i.screenSize, 'w') / getScrollSz(processString(i.screenSize, 'w')) + 'px', 'height': processString(i.screenSize, 'h') / getScrollSz(processString(i.screenSize, 'w')) + 'px', 'justify-content': getTextAlign(i.tcontents[0].formatStyle) }">
<div class="dialogContent_l_xsq_txt"
:style="{ 'font-size': i.tcontents[0].fontSize / getScrollSz(processString(i.screenSize, 'w')) + 'px', 'color': '#' + i.tcontents[0].fontColor, 'font-family': i.tcontents[0].fontType, }"
v-html="i.tcontents[0].content.replace(/\n|\r\n/g, '<br>').replace(
:style="boardBoxStyle(item)">
<div
:style="boardConStyle(item)"
v-html="item.tcontents[0].content.replace(/\n|\r\n/g, '<br>').replace(
/ /g,
'&nbsp')"></div>
</div>
@ -31,7 +31,7 @@
<div class="dialogContent_box_empty">暂无数据</div>
</div>
<div class="dialogContent_bottom">
<el-tabs v-model="activeName" @tab-click="tabClickFn">
<el-tabs v-model="activeTab" @tab-click="tabClickFn">
<el-tab-pane label="详情信息" name="first">
<div class="show_bottom_tab_box">
<div class="show_bottom_tab_item" v-for="item in tabDataInfoList" :key="item.id">
@ -47,40 +47,39 @@
<div class="show_bottom_btn_add" @click="addMoDataInfoFn(2, 2)">添加信息</div>
<div class="show_bottom_btn_del" @click="InformationReleaseFn">信息发布</div>
</div>
<div class="dialogContent_ce" @click="showCeInfoFn">
<img class="show_ce_img" src="@/assets/screen/xtb/leftd.png" alt=""
:style="{ 'transform': dialogInfoRight ? 'rotate(0deg)' : 'rotate(180deg)' }">
<div class="show_ce_txt">信息模板</div>
<div class="sideSwitch" @click="showSidePanel">
<img class="img" src="@/assets/screen/xtb/leftd.png" alt=""
:style="{ 'transform': isShowTemplate ? 'rotate(0deg)' : 'rotate(180deg)' }">
<div class="txt">信息模板</div>
</div>
<!-- 原型图上没有附近相机代码里暂时关闭
<div class="dialogContent_ce" style="top:36%;" @click="showCameraInfoFn">
<img class="show_ce_img" src="@/assets/screen/xtb/leftd.png" alt=""
<div class="sideSwitch" style="top:36%;" @click="showCameraInfoFn">
<img class="img" src="@/assets/screen/xtb/leftd.png" alt=""
:style="{ 'transform': dialogInfoCamera ? 'rotate(0deg)' : 'rotate(180deg)' }">
<div class="show_ce_txt">附近像机</div>
<div class="txt">附近像机</div>
</div> -->
</div>
</div>
<!-- 信息模板 -->
<div v-if="dialogInfoRight" class="dialog_info_right">
<div v-if="isShowTemplate" class="dialog_info_right">
<el-collapse v-model="activeNames" @change="panelChangeFn">
<el-collapse-item v-for="item in moBanList" :key="item.dictCode" :title="item.dictLabel"
<el-collapse-item v-for="item in templateList" :key="item.dictCode" :title="item.dictLabel"
:name="item.dictCode">
<div class="dialog_info_right_show">
<div class="dialogContent_box" style="overflow-y: visible;">
<div class="dialogContent_box_item" v-for="i in item.mbList" :key="i.id">
<div class="dialogContent_box_item" v-for="item1 in item.mbList" :key="item1.id">
<div class="dialogContent_l" style="width:16vw;">
<div class="dialogContent_l_xsq"
:style="{ 'width': processString(i.screenSize, 'w') / getScrollSz(processString(i.screenSize, 'w')) + 'px', 'height': processString(i.screenSize, 'h') / getScrollSz(processString(i.screenSize, 'w')) + 'px', 'justify-content': getTextAlign(i.tcontents[0].formatStyle) }">
<div class="dialogContent_l_xsq_txt"
:style="{ 'font-size': i.tcontents[0].fontSize / getScrollSz(processString(i.screenSize, 'w')) + 'px', 'color': '#' + i.tcontents[0].fontColor, 'font-family': i.tcontents[0].fontType }"
v-html="i.tcontents[0].content.replace(/\n|\r\n/g, '<br>').replace(
/ /g,
'&nbsp')"></div>
:style="boardBoxStyle(item1)">
<div
:style="boardConStyle(item1)"
v-html="item1.tcontents[0].content.replace(/\n|\r\n/g, '<br>').replace(/ /g, '&nbsp')"></div>
</div>
</div>
<div class="dialogContent_r" style="width: 3.5vw;">
<div @click="putLeftFn(i)" class="show_r_btn dialogContent_r_btn3"></div>
<div @click="putLeftFn(item1)" class="show_r_btn dialogContent_r_btn3"></div>
</div>
</div>
</div>
@ -88,6 +87,8 @@
</el-collapse-item>
</el-collapse>
</div>
<!-- 附近相机 -->
<div v-if="dialogInfoCamera" class="dialog_info_right" style="padding:0;">
<div class="dialog_head" style="height:4vh;">
@ -149,27 +150,182 @@
import addBoard from './addinfo.vue'
import editBoard from './editInfo.vue'
import { listDevice, invokedFunction, getDeviceRealtimeProperty } from '@/api/device/device.js'
import infoBoardTestData from "@/common/infoBoardTestData.js"
export default {
name: 'InfoBoard',
data(){
return {
dialogTit: '门架式可变信息标志YK16+270',
dialogInfoLeft: true,
dialogInfoRight: false,
isShowTemplate: false,
dialogInfoCamera: false,
dialogInfoList:[]
dialogInfoList: [],
moBanList: [],
moBanDataHandList: [],
_moBanDataList: [
{
id: 1001,
bt: '日常通用',
mbList: [
{ id: 305, txt: '谨慎驾驶', w: 768, h: 64, col: '#FFFF00', fz: 48, pdl: 288, pdt: 8, fm: '黑体' },
{ id: 306, txt: '谨慎驾驶 注意安全', w: 768, h: 160, col: '#03FF00', fz: 60, pdl: 0, pdt: 0, fm: '黑体' },
{ id: 307, txt: '谨慎驾驶 注意安全', w: 768, h: 160, col: '#FF0000', fz: 60, pdl: 0, pdt: 0, fm: '黑体' },
{ id: 308, txt: '谨慎驾驶, <br/> 注意安全', w: 768, h: 160, col: '#03FF00', fz: 60, pdl: 0, pdt: 0, fm: '黑体' }
]
},
{ id: 1002, bt: '施工管控', mbList: [{ id: 309, txt: '道路施工, <br/> 谨慎驾驶', w: 768, h: 160, col: '#FFFF00', fz: 60, pdl: 0, pdt: 0, fm: '黑体' }] },
{ id: 1003, bt: '恶劣天气', mbList: [{ id: 309, txt: '救援 拨打96659', w: 768, h: 160, col: '#FFFF00', fz: 60, pdl: 0, pdt: 0, fm: '黑体' }] },
{ id: 1004, bt: '交通拥堵', mbList: [{ id: 309, txt: '救援 拨打96659', w: 768, h: 160, col: '#FFFF00', fz: 60, pdl: 0, pdt: 0, fm: '黑体' }] },
{ id: 1005, bt: '突发事件', mbList: [{ id: 309, txt: '救援 拨打96659', w: 768, h: 160, col: '#FFFF00', fz: 60, pdl: 0, pdt: 0, fm: '黑体' }] },
{ id: 1006, bt: '警情播报', mbList: [{ id: 309, txt: '救援 拨打96659', w: 768, h: 160, col: '#FFFF00', fz: 60, pdl: 0, pdt: 0, fm: '黑体' }] }
],
activeNames:[1001 , 1002],
activeTab:"first",
moBanDataList: [{
dictCode: 1001,
dictLabel: "日常通用",
mbList: [
{
id: 3001,
screenSize: "200*80",
tcontents: [
{
content: "谨慎驾驶 注意安全",
formatStyle: 0,
fontSize:"24",
fontType:"微软雅黑",
fontColor:"0000FF"
}
]
}
]
}, {
dictCode: 1002,
dictLabel: "施工管理",
mbList: [
{
id: 3002,
screenSize: "800*90",
tcontents: [
{
content: "道路施工<br>缓慢驾驶",
formatStyle: 0,
fontSize: "18",
fontType: "微软雅黑",
fontColor: "FFFF00"
}
]
}
]
}],
tabDataInfoList: [],
tabInfoList: [
{ id: 401, tit: '设备名称', txt: '门架式可变信息标志', col: '#fff' },
{ id: 402, tit: '道路名称', txt: 'G35济菏高速', col: '#fff' },
{ id: 403, tit: '所属机构', txt: '山东高速济南发展公司', col: '#fff' },
{ id: 404, tit: '设备桩号', txt: 'K094+079', col: '#fff' },
{ id: 405, tit: '设备厂商', txt: '光电比特', col: '#fff' },
{ id: 406, tit: '设备状态', txt: '离线', col: '#888' }
],
cameraDataVideoList: [],
cameraDataList: [
{ id: 3001, txt: '设备名称', val: '疲劳唤醒设备1' },
{ id: 3002, txt: '设备编号', val: 'G00030497B0180001' },
{ id: 3003, txt: '设备桩号', val: 'K097+900' },
{ id: 3004, txt: '经/纬度', val: '117.071152/35.910659' },
{ id: 3005, txt: '道路名称', val: 'G35济菏高速' },
{ id: 3006, txt: '道路状况', val: '正常' },
{ id: 3007, txt: '方向', val: '菏泽' }
],
cameraBtnList: [
{ id: 4001, cmd: 23, dir: 'left', le: '26%', to: '33%', ro: 0 },
{ id: 4002, cmd: 21, dir: 'up', le: '46%', to: '4%', ro: 90 },
{ id: 4003, cmd: 24, dir: 'right', le: '65%', to: '33%', ro: 180 },
{ id: 4004, cmd: 22, dir: 'downward', le: '46%', to: '62%', ro: 267 }
],
cameraControlList: [
{ id: 5001, txt: '变倍', numL: 11, numR: 12 },
{ id: 5002, txt: '光圈', numL: 16, numR: 15 },
{ id: 5003, txt: '聚焦', numL: 14, numR: 13 }
]
}
},
props:{
visible:{
type:Boolean,
default:false
}
},
components: { addBoard, editBoard },
created() {
// this.getTemplateSeries();
},
computed:{
},
mounted() {
//
this.dialogInfoList = this.boardDataConvert(infoBoardTestData);
this.templateList = this.moBanDataList;
let deviceState = "online";
this.tabDataInfoList = [
{ id: 401, tit: '设备名称', txt: "门架式可变信息标志", col: '#fff' },
{ id: 402, tit: '道路名称', txt: "G35济菏高速", col: '#fff' },
{ id: 403, tit: '所属机构', txt: "山东高速济南发展公司", col: '#fff' },
{ id: 404, tit: '设备桩号', txt: "K094+079", col: '#fff' },
{ id: 405, tit: '设备厂商', txt: "光电比特", col: '#fff' },
{ id: 406, tit: '设备状态', txt: deviceState == 'online' ? '在线' : '离线', col: deviceState == 'online' ? '#10d269' : '#888' }
]
},
methods: {
boardBoxStyle(node) {
let arr = node.screenSize.split("*");
let scale = this.getScrollSz(+arr[0]);
let obj = {
'width':`${+arr[0] / scale}px`,
'height':`${+arr[1] / scale}px`,
'justify-content': this.getTextAlign(node.tcontents[0].formatStyle)
}
return obj;
},
boardConStyle(node) {
let fSize = +node.tcontents[0].fontSize;
let scale = this.getScrollSz(fSize);
let obj = {
'font-size': `${fSize/scale}px`,
'color': '#' + node.tcontents[0].fontColor,
'font-family': node.tcontents[0].fontType
}
return obj;
},
//
boardDataConvert(origin){
let rst = origin.map(item => {
return {
...item,
STAY: item.playbackDuration,
inScreenMode: item.screenEntryMethod,
screenSize: item.displayAreaWidth + '*' + item.displayAreaHeight,
tcontents: [
{
...item,
fontSpacing: item.fontSpacing,
fontSize: parseInt(item.fontSize.replace(/\D/g, '')),
fontType: item.font,
fontColor: item.foregroundColor.toUpperCase(),
formatStyle: item.horizontalAlignment,
STAY: item.playbackDuration / 10,
content: item.textContent.replaceAll('\\,', ',').replaceAll('\\=', '=').replaceAll('\\\\n', '\n')
}
]
}
});
return rst;
},
//
mapClickEvent(e) {
this.dialogInfoList = []
console.log('父组件地图点位', e)
this.videoUrl = ''
this.cameraOptList = []
this.dialogInfoLeft = true
this.mapIds = e.target._opts.extData.deviceId
this.screenDataSize = e.target._opts.extData.sceenSize
this.dialogTit = e.target._opts.extData.deviceName
@ -182,8 +338,8 @@ export default {
{ id: 405, tit: '设备厂商', txt: e.target._opts.extData.brind, col: '#fff' },
{ id: 406, tit: '设备状态', txt: e.target._opts.extData.deviceState == 'online' ? '在线' : '离线', col: e.target._opts.extData.deviceState == 'online' ? '#10d269' : '#888' }
]
this.getTemplateHeaderFn()
this.onSubmit(this.mapIds)
this.getTemplateSeries()
this.updateList(this.mapIds)
this.getEnergyCameraBoardFn(e.target._opts.extData.pileNumber)
// this.mapDialogTop = e.pixel.y + 'px'
// this.mapDialogLeft = e.pixel.x + 'px'
@ -328,36 +484,16 @@ export default {
})
loading.close()
})
this.onSubmit()
this.updateList()
},
//
onSubmit(deviceId) {
updateList(deviceId) {
getDeviceRealtimeProperty(deviceId, '3A', { async: false })
.then(res => {
var contentsA = res.data['3A'].content
console.log('回读消息--1111111111---', contentsA)
this.dialogInfoList = contentsA.map(item => {
return {
...item,
STAY: item.playbackDuration,
inScreenMode: item.screenEntryMethod,
screenSize: item.displayAreaWidth + '*' + item.displayAreaHeight,
tcontents: [
{
...item,
fontSpacing: item.fontSpacing,
fontSize: parseInt(item.fontSize.replace(/\D/g, '')),
fontType: item.font,
fontColor: item.foregroundColor.toUpperCase(),
formatStyle: item.horizontalAlignment,
STAY: item.playbackDuration / 10,
content: item.textContent.replaceAll('\\,', ',').replaceAll('\\=', '=').replaceAll('\\\\n', '\n')
}
]
}
})
this.dialogInfoList = this.boardDataConvert(contentsA);
console.log('hui1111111111111', this.dialogInfoList)
})
@ -377,21 +513,21 @@ export default {
}
})*/
},
//
getTemplateHeaderFn() {
this.moBanList = []
//
getTemplateSeries() {
this.templateList = []
getDicts('iot_template_category').then(res => {
this.moBanDataHandList = res.data
this.activeNames = res.data.map(item => {
return item.dictCode
})
this.getTemplateFn()
this.getBoardTemplate()
})
},
//
getTemplateFn() {
getBoardTemplate() {
getAllVmsTemplate({ devicePixel: this.screenDataSize }).then(res => {
this.moBanList = this.moBanDataHandList.map((item, index) => {
this.templateList = this.moBanDataHandList.map((item, index) => {
if (item.dictSort === index) {
return {
...item,
@ -463,7 +599,7 @@ export default {
return item
})
console.log('修改后的数据', this.dialogInfoList)
// this.getTemplateHeaderFn()
// this.getTemplateSeries()
this.$forceUpdate()
},
@ -481,19 +617,19 @@ export default {
tabClickFn(tab, event) {
console.log(tab, event)
},
closeDialogBtnFn() {
this.dialogInfoLeft = false
this.dialogInfoRight = false
onClose() {
this.$emit("update:visible", false);
this.isShowTemplate = false
},
showCeInfoFn() {
showSidePanel() {
if (this.dialogInfoCamera) {
this.dialogInfoCamera = false
}
this.dialogInfoRight = !this.dialogInfoRight
this.isShowTemplate = !this.isShowTemplate
},
showCameraInfoFn() {
if (this.dialogInfoRight) {
this.dialogInfoRight = false
if (this.isShowTemplate) {
this.isShowTemplate = false
}
this.dialogInfoCamera = !this.dialogInfoCamera
},
@ -750,27 +886,28 @@ export default {
font-size: 14px;
margin-left: 0.5vw;
}
.dialogContent_ce {
.sideSwitch {
position: absolute;
right: 0%;
top: 0%;
width: 24px;
height: 95px;
line-height: 1.2;
padding: 0.5vh 0;
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
border-radius: 0px 0px 0px 0px;
opacity: 1;
text-align: center;
cursor: pointer;
}
.show_ce_img {
width: 15px;
height: 10px;
transition: transform 0.3s ease; /* 过渡效果 */
}
.show_ce_txt {
color: #fff;
font-size: 13px;
.img {
width: 15px;
height: 10px;
border: none;
transition: transform 0.3s ease; /* 过渡效果 */
}
.txt {
color: #fff;
font-size: 13px;
}
}
.dialogContent_box_empty {
font-size: 14px;

5
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue

@ -12,7 +12,7 @@
<div class="device-item" v-for="(item, index) in tabContentData" :key="item.id" @click="handleDevice(item)"
:style="getStart(index)">
<div class="device-icon"
:style="{ backgroundImage: `url(${require(`@screen/images/layer/${active}/${item.title}${item.status}.svg`)})` }" />
:style="{ backgroundImage: `url(${require(`@screen/images/layer/${active}/${item.title}${item.status}.svg`)})`, '--bgColor': `rgba(0, 209, 255, ${item.status ? 0.3 : 0})` }" />
<span>{{ item.title }}</span>
</div>
</TransitionGroup>
@ -81,6 +81,7 @@ export default {
this.tabContentData = item.children;
},
handleDevice: debounce(function (item) {
this.$emit("onClickItem", item);
const key = `${this.active}/${item.title}`;
eventMap[`${key}${item.status ? "_close" : ""}`]?.call(this, item);
@ -207,7 +208,9 @@ export default {
width: 33px;
height: 33px;
border: 1px solid rgba(0, 209, 255, .5);
background-color: var(--bgColor);
border-radius: 50%;
z-index: -1;
}
}

29
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js

@ -49,13 +49,16 @@ export const eventMap = {
cacheRemoveFunc.DriveTestEquipment_Camera_Remove?.();
const normal = require(`@screen/images/layer${item.id.replace(".", "")}`);
const normal = require(`@screen/images/layer${item.id.replace(
/^\.|[^/]+(?=.svg$)/g,
(data) => (data === "." ? "" : `${data}_active`)
)}`);
const fault = require(`@screen/images/layer${item.id.replace(
/^\.|[^/]+(?=.svg$)/g,
(data) => (data === "." ? "" : `${data}_fault`)
)}`);
// const fault = require(`@screen/images/mapBg/fault.svg`);
// const normal = require(`@screen/images/mapBg/active.svg`);
const faultBg = require(`@screen/images/mapBg/fault.svg`);
const normalBg = require(`@screen/images/mapBg/active.svg`);
const markerClick = (e) => {
const extData = e.target.getExtData();
@ -79,9 +82,23 @@ export const eventMap = {
lnglat: [lng, lat],
name: "",
extData: item,
content: `<img style="width: 36px; height: 36px" src='${
item.status !== "0" ? fault : normal
}'>`,
content: `<div style="
background-image: url(${item.status !== "0" ? faultBg : normalBg});
background-size: 100% 100%;
background-repeat: no-repeat;
width: 42px;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
">
<img style="
width: 18px;
height: 18px;
margin-left: 3px;
margin-bottom: 6px;
" src='${item.status !== "0" ? fault : normal}'>
</div>`,
};
}),
markerClick

8
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/map.js

@ -57,8 +57,14 @@ export async function setMarkerCluster(map, points, markerFun) {
renderMarker(context) {
const { content, extData } = context.data[0];
const offset = new AMap.Pixel(-9, -9);
const offset = new AMap.Pixel(0, 0);
context.marker.setContent(content);
context.marker.setAnchor("bottom-center");
console.log(
"%c [ context.marker ]-62-「map.js」",
"font-size:15px; background:#7d477f; color:#c18bc3;",
context.marker
);
context.marker.setOffset(offset);
context.marker.setExtData(extData);

14
ruoyi-ui/src/views/JiHeExpressway/pages/Home/index.vue

@ -8,14 +8,14 @@
<FocusedMonitoring class="card-menu" />
<!-- -->
<RoadAndEvents class="content-l-b card-menu" />
<RoadAndEvents class="content-l-b card-menu" @onClickItem="onClickItem"/>
</div>
<!-- 右侧 -->
<ConditionStatistics class="content-r card-menu" />
</section>
<InfoBoard></InfoBoard>
<InfoBoard :visible.sync="isShowInfoBoard"></InfoBoard>
<footer class="footer card-menu">
<div class="footer-title">
@ -49,6 +49,11 @@ export default {
AMapContainer,
InfoBoard
},
data(){
return{
isShowInfoBoard:false
}
},
provide() {
return {
getMap: () => this.$refs.AMapContainerRef.getMapInstance()
@ -64,6 +69,11 @@ export default {
// translateXElement.style.transform = translateXElement.style.transform ? "" : `translateY(calc(100% - 36px))`
translateXElement.style.height = translateXElement.style.height != "36px" ? "36px" : `100%`
},
onClickItem(item){
if(item.title.includes("情报板")){
this.isShowInfoBoard = true;
}
}
}
}

3
ruoyi-ui/src/views/JiHeExpressway/pages/README.md

@ -1,3 +0,0 @@
> 规范:
> 按照 XXX/index.vue
> 再去 HeaderMenu 的 menuData.js 修改

139
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/components/SelectList.vue

@ -0,0 +1,139 @@
<template>
<div class='SelectList'>
<div class="title">
{{ data.title }}
</div>
<div class="body">
<div class="card" v-for="item in (data.list || [])">
<SimpleIcon class="icon" :url="require('@screen/images/form/delete.svg')"
:replaces='[`stroke="white"`, `stroke="#52D6FF"`]' />
<slot :data="item">
<div class="info">
<span>{{ item.name }}</span>
<span>{{ item.phone }}</span>
</div>
</slot>
</div>
</div>
<div class="footer card">
<img src="@screen/images/form/delete.svg" />
<span>添加</span>
</div>
</div>
</template>
<script>
import SimpleIcon from "@screen/components/SimpleIcon.vue"
export default {
name: 'SelectList',
components: {
SimpleIcon
},
props: {
data: {
/**
* {
* title: '标题',
* list: {
* name: "",
* phone: "",
* }[]
* }
*/
type: Object,
default: () => ({})
}
}
}
</script>
<style lang='scss' scoped>
.SelectList {
height: 100%;
display: flex;
flex-direction: column;
.title {
height: 22px;
font-size: 16px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
line-height: 19px;
letter-spacing: 1px;
background: linear-gradient(180deg, #3DE8FF 0%, #00BCD6 100%);
background-clip: text;
color: transparent;
margin-bottom: 15px;
text-align: center;
}
.card {
width: 142px;
min-height: 65px;
background: #0D5F79;
border-radius: 2px 2px 2px 2px;
opacity: 1;
position: relative;
font-size: 16px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
color: #FFFFFF;
line-height: 19px;
letter-spacing: 1px;
display: flex;
align-items: center;
justify-content: center;
.info {
display: flex;
flex-direction: column;
align-items: center;
gap: 3px;
}
&.active {
background: linear-gradient(180deg, #00AEE5 0%, #0086B1 100%);
}
}
.body {
display: flex;
flex-direction: column;
gap: 9px;
overflow: auto;
height: 100%;
flex: 1;
.card {
cursor: pointer;
.icon {
position: absolute;
width: 12px;
right: 3px;
top: 3px;
cursor: pointer;
}
}
}
.footer {
margin-top: 9px;
display: flex;
flex-direction: column;
gap: 6px;
font-size: 15px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
color: #4DD4FF;
line-height: 19px;
letter-spacing: 1px;
cursor: pointer;
}
}
</style>

138
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/components/SpecialTable.vue

@ -0,0 +1,138 @@
<template>
<div class='SpecialTable'>
<div v-for="(dataItem, index) in data" class="row">
<div class="bg normal">
<div class="column" v-for="item in columns" :key="item.key" :style="{ width: item.width }">
<div class="title" v-if="onlyFirstTitle ? !index : true">
<slot :name="`title-${item.key}`" :title="item" :data="dataItem">
{{ item.title }}
</slot>
</div>
<div class="content">
<slot :name="`content-${item.key}`" :title="item" :data="dataItem" />
</div>
</div>
</div>
<div class="bg operation column">
<div class="title">
<slot name="operation-title">
操作
</slot>
</div>
<div class="content">
<slot name="operation-content" :data="dataItem" />
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'SpecialTable',
props: {
/**
* {
* key: string;
* title: string;
* width: string
* }[]
*/
columns: {
type: Array,
default: () => []
},
/**
* {
* id: string;
* [x: string]: any;
* }[]
*/
data: {
type: Array,
default: () => [{}]
},
onlyFirstTitle: {
type: Boolean,
default: true
}
}
}
</script>
<style lang='scss' scoped>
.SpecialTable {
display: flex;
flex-direction: column;
gap: 9px;
.row {
width: 100%;
display: flex;
gap: 27px;
}
.bg {
background: linear-gradient(180deg, rgba(6, 66, 88, 0) 0%, rgba(24, 57, 77, .7) 93%);
border-radius: 0px 0px 0px 0px;
border: 1px solid;
border-image: linear-gradient(180deg, rgba(1, 135, 178, 0), rgba(1, 135, 178, .51)) 1 1;
}
.normal {
display: flex;
}
.column {
position: relative;
padding: 15px 18px;
// padding-top: 12px;
font-size: 20px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
line-height: 23px;
letter-spacing: 1px;
gap: 24px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.title {
background: linear-gradient(180deg, #3DE8FF 0%, #00BCD6 100%);
background-clip: text;
color: transparent;
// position: absolute;
}
.content {
display: flex;
align-items: center;
flex: 1;
}
&:not(:last-child) {
&::after {
content: "";
position: absolute;
background-image: url("~@screen/images/divide.svg");
background-repeat: no-repeat;
background-size: 100% 100%;
height: 100%;
width: 3px;
right: 0;
top: 0;
}
}
}
.operation {
padding: 24px 18px;
.content {
gap: 9px;
}
}
}
</style>

67
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/index.vue

@ -5,25 +5,52 @@
<!-- 搜索栏 -->
<div class="filter">
<div>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/insert.svg" />
</template>
新增
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/export.svg" />
</template>
导出
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/refresh.svg" />
</template>
刷新
</ButtonGradient>
<template v-if="activeName === 'DutyOfficer'">
<ButtonGradient>
<template #prefix>
<img src="@screen/images/import.svg" />
</template>
机构值班表
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/import.svg" />
</template>
应急机构
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/export.svg" />
</template>
上传
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/insert.svg" />
</template>
新增
</ButtonGradient>
</template>
<template v-else>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/insert.svg" />
</template>
新增
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/export.svg" />
</template>
导出
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/refresh.svg" />
</template>
刷新
</ButtonGradient>
</template>
</div>
<InputSearch style="width: 402px;" />
@ -71,7 +98,7 @@ export default {
},
data() {
return {
activeName: "FirstResponders",
activeName: "DutyOfficer",
panels: [
{
label: "应急人员",

118
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/ModifyDutyInformationTable.vue

@ -0,0 +1,118 @@
<template>
<Dialog v-model="visibleModel" title="修改值班信息表">
<div class="ModifyDutyInformationTable">
<div class="search">
<div>
<Form :formList="formList" />
</div>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/form/search.svg" />
</template>
刷新
</ButtonGradient>
</div>
<div class="body">
<SelectList v-for="item in list" :data="item" />
</div>
<div class="bottom">
<Button>确认</Button>
<Button :style="{ backgroundColor: '#C9C9C9' }"> 取消</Button>
</div>
</div>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import Button from "@screen/components/Buttons/Button.vue"
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import Form from '@screen/pages/control/event/event/EventDetailDialog/Form.vue';
import SelectList from "./../../../components/SelectList.vue"
export default {
name: 'ModifyDutyInformationTable',
components: {
Dialog,
Button,
ButtonGradient,
SelectList,
Form
},
props: {
visible: {
type: Boolean,
default: false
}
},
emit: ['close'],
data() {
return {
formList: [{
label: "值班时间:",
key: "事件源",
type: "input",
},
{
label: "操作人员:",
key: "桩号:",
type: "input",
}],
list: Array.from({ length: 15 }).map(item => ({
title: "123456",
list: Array.from({ length: 15 }).map((_, index) => ({
name: index,
phone: "12345678901"
}))
}))
}
},
computed: {
visibleModel: {
get() {
return this.visible
},
set(bool) {
this.$emit('close', bool);
}
}
}
}
</script>
<style lang='scss' scoped>
.ModifyDutyInformationTable {
width: 947px;
height: 658px;
color: #fff;
display: flex;
flex-direction: column;
gap: 15px;
.search {
display: flex;
align-items: center;
justify-content: space-between;
}
.body {
display: flex;
gap: 9px;
height: 100%;
overflow-x: auto;
overflow-y: hidden;
}
.bottom {
display: flex;
gap: 15px;
justify-content: end;
>div {
width: 96px;
}
}
}
</style>

76
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/OperateRecord.vue

@ -0,0 +1,76 @@
<template>
<Dialog v-model="visibleModel" title="操作记录">
<div class="OperateRecord">
<TimeLine :data="timeLine2List" direction="right" />
<div class="bottom">
<Button>确认</Button>
<Button :style="{ backgroundColor: '#C9C9C9' }"> 取消</Button>
</div>
</div>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import TimeLine from "@screen/components/TimeLine/TimeLine2/index.vue";
import Button from "@screen/components/Buttons/Button.vue"
export default {
name: 'OperateRecord',
components: {
Dialog,
Button,
TimeLine
},
props: {
visible: {
type: Boolean,
default: false
}
},
emit: ['close'],
data() {
return {
timeLine2List: Array.from({ length: 6 }).map(() => ({
// title: "",
time: "2023-12-21 16:35:44",
name: "甘易玫",
desc: "描述性文字文字文字文字文字文字文字文字描述性文字文字文字文字文字文字文字文字",
posts: '淄博发展公司管理员'
})),
}
},
computed: {
visibleModel: {
get() {
return this.visible
},
set(bool) {
this.$emit('close', bool);
}
}
}
}
</script>
<style lang='scss' scoped>
.OperateRecord {
width: 540px;
height: 518px;
color: #fff;
display: flex;
flex-direction: column;
.bottom {
margin-top: 9px;
display: flex;
gap: 15px;
justify-content: end;
>div {
width: 96px;
}
}
}
</style>

202
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/index.vue

@ -1,15 +1,213 @@
<template>
<div class='DutyOfficer'>
DutyOfficer
<SpecialTable :columns="columns" :data="data">
<template #title-DateDuty>
<div>
值班中心
</div>
</template>
<template #content-DateDuty="{ data }">
<div class="item">
<img src="@screen/images/form/calendar.svg" />
{{ data['值班日期'] }}
</div>
</template>
<template #content-DutyLeaderCenter="{ data }">
<div class="parent">
<div class="item">
<img src="@screen/images/form/people.svg" />
{{ data['值班日期'] }}
</div>
<div class="item">
<img src="@screen/images/form/phone.svg" />
{{ data['值班日期'] }}
</div>
</div>
</template>
<template #content-DispatchLeadership="{ data }">
<div class="item-parent">
<div class="item">
<img src="@screen/images/form/people.svg" />
{{ data['值班日期'] }}
</div>
<div class="item">
<img src="@screen/images/form/phone.svg" />
{{ data['值班日期'] }}
</div>
</div>
</template>
<template #content-DispatchDuty="{ data }">
<div class="item-parent">
<div class="item">
<img src="@screen/images/form/people.svg" />
{{ data['值班日期'] }}
</div>
<div class="item">
<img src="@screen/images/form/people.svg" />
{{ data['值班日期'] }}
</div>
</div>
</template>
<template #content-TravelDuty="{ data }">
<div class="item-parent">
<div class="item">
<img src="@screen/images/form/people.svg" />
{{ data['值班日期'] }}
</div>
<div class="item">
<img src="@screen/images/form/people.svg" />
{{ data['值班日期'] }}
</div>
</div>
</template>
<template #content-EmergencyLeadership="{ data }">
<div class="item-parent">
<div class="item">
<img src="@screen/images/form/people.svg" />
{{ data['值班日期'] }}
</div>
<div class="item">
<img src="@screen/images/form/phone.svg" />
{{ data['值班日期'] }}
</div>
</div>
</template>
<template #content-EmergencyDuty="{ data }">
<div class="item-parent">
<div class="item">
<img src="@screen/images/form/people.svg" />
{{ data['值班日期'] }}
</div>
<div class="item">
<img src="@screen/images/form/people.svg" />
{{ data['值班日期'] }}
</div>
</div>
</template>
<template #operation-content>
<ButtonGradient class="operate-button" @click.native="handleOperateRecord(true)">
<template #prefix>
<img src="@screen/images/form/edit.svg" />
</template>
修改
</ButtonGradient>
<ButtonGradient class="operate-button" @click.native="handleModifyDutyInformationTable(true)">
<template #prefix>
<img src="@screen/images/form/record.svg" />
</template>
记录
</ButtonGradient>
<ButtonGradient class="operate-button">
<template #prefix>
<img src="@screen/images/form/delete.svg" />
</template>
删除
</ButtonGradient>
</template>
</SpecialTable>
<OperateRecord :visible="operateRecordVisible" @close="handleOperateRecord(false)" />
<ModifyDutyInformationTable :visible="modifyDutyInformationTableVisible"
@close="handleModifyDutyInformationTable(false)" />
</div>
</template>
<script>
import SpecialTable from "./../../components/SpecialTable.vue"
import OperateRecord from "./components/OperateRecord.vue"
import ModifyDutyInformationTable from "./components/ModifyDutyInformationTable.vue"
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
export default {
name: 'DutyOfficer',
components: {
SpecialTable,
OperateRecord,
ModifyDutyInformationTable,
ButtonGradient
},
data() {
return {
columns: [
{
key: "DateDuty",
title: "值班日期",
width: "180px"
},
{
key: "DutyLeaderCenter",
title: "中心值班领导",
width: "240px"
},
{
key: "DispatchLeadership",
title: "调度领导",
width: "240px"
},
{
key: "DispatchDuty",
title: "调度值班",
width: "180px"
},
{
key: "TravelDuty",
title: "出行值班",
width: "180px"
},
{
key: "EmergencyLeadership",
title: "应急领导",
width: "240px"
},
{
key: "EmergencyDuty",
title: "应急值班",
width: "180px"
},
],
data: Array.from({ length: 15 }).map((_, index) => ({
"id": index,
"值班日期": "2023-12-21",
"中心值班领导": "甘易玫",
"调度领导": "甘易玫",
"调度值班": "甘易玫",
"出行值班": "甘易玫",
"应急领导": "甘易玫",
"应急值班": "甘易玫",
})),
operateRecordVisible: false,
modifyDutyInformationTableVisible: false
}
},
methods: {
handleOperateRecord(bool) {
this.operateRecordVisible = bool;
},
handleModifyDutyInformationTable(bool) {
this.modifyDutyInformationTableVisible = bool;
}
}
}
</script>
<style lang='scss' scoped>
.DutyOfficer {}
.DutyOfficer {
.item {
display: flex;
align-items: center;
gap: 6px;
&:not(:last-child) {
margin-bottom: 6px;
}
}
.operate-button {
width: 105px;
height: 41px;
border-radius: 5px;
}
}
</style>

15
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/Form.vue

@ -1,13 +1,15 @@
<template>
<ElForm :style="getStyle()" :label-width="labelWidth" class="FormConfig" size="mini">
<ElFormItem v-for="(item, index) in formList" :key="item.key" :label="item.label" :style="gridStyle(item, index)">
<ElFormItem class="formItem" v-for="(item, index) in formList" :key="item.key" :label="item.label"
:style="gridStyle(item, index)">
<FormInput v-bind="item.options" />
</ElFormItem>
</ElForm>
</template>
<script>
import FormInput from "./FormInput.vue"
import FormInput from "./FormInput.vue";
export default {
name: 'FormConfig',
components: {
@ -59,6 +61,11 @@ export default {
align-content: start;
width: 100%;
.formItem {
display: flex;
align-items: center;
}
::v-deep {
.el-form-item {
@ -72,6 +79,10 @@ export default {
// -webkit-background-clip: text;
// -webkit-text-fill-color: transparent;
}
.el-form-item__content {
margin: 0 !important;
}
}
}
}

0
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/perception/images/export.svg → ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/images/export.svg

Before

Width:  |  Height:  |  Size: 624 B

After

Width:  |  Height:  |  Size: 624 B

0
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/perception/images/insert.svg → ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/images/insert.svg

Before

Width:  |  Height:  |  Size: 385 B

After

Width:  |  Height:  |  Size: 385 B

0
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/perception/images/refresh.svg → ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/images/refresh.svg

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

36
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/index.vue

@ -1,25 +1,25 @@
<template>
<div class='RoadNetworkMonitoring2'>
<Tabs :panels="panels" :value="activeName" type="card" />
<Tabs :panels="panels" :default-active="activeName" />
<!-- 搜索栏 -->
<div class="filter">
<div>
<ButtonGradient @click="onAddNew">
<template #prefix>
<img src="@screen/images/insert.svg" />
<img src="./images/insert.svg" />
</template>
新增
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/export.svg" />
<img src="./images/export.svg" />
</template>
导出
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/refresh.svg" />
<img src="./images/refresh.svg" />
</template>
刷新
</ButtonGradient>
@ -31,7 +31,7 @@
<!-- 内容 -->
<div class="body">
<RoadStateCard v-for="(item, index) in data" :cardData="item" :key="index"
:lastBtnText="item.state === 3 ? '总结' : '处置'" firstBtnText="详情" @firstBtnClick="firstBtnClick" />
:lastBtnColor="item.state === 5 ? '#007FF4' : void 0" :lastBtnText="item.state === 5 ? '去确认' : void 0" @firstBtnClick="firstBtnClick"/>
</div>
<!-- 分页 -->
@ -39,8 +39,11 @@
<Pagination :total="90" />
</div>
<!-- "详情"弹出框 -->
<EventDetailDialog :visible="eventDetailDialogVisible" @update:value="handleClose" />
<!-- "新增"弹出框 -->
<FormEvent :visible="isShowAddNew" @close="onCloseAddNew" />
</div>
</template>
@ -52,7 +55,6 @@ import Pagination from '@screen/components/Pagination.vue';
import InputSearch from '@screen/components/InputSearch/index.vue';
import EventDetailDialog from "./EventDetailDialog/index";
import FormEvent from "./FormEvent/index";
export default {
name: 'RoadNetworkMonitoring2',
components: {
@ -78,18 +80,26 @@ export default {
})()
})),
activeName: "感知事件",
activeName: "告警事件(20)",
panels: [
{
label: "感知事件",
key: "感知事件"
label: "告警事件(20)",
key: "告警事件(20)"
},
{
label: "待确认事件(125)",
key: "待确认事件(125)"
},
{
label: "交通事件",
key: "交通事件"
}
label: "处置中事件(230)",
key: "处置中事件(230)"
},
{
label: "已处置事件(76)",
key: "已处置事件(76)"
},
],
eventDetailDialogVisible: false,
eventDetailDialogVisible:false,
isShowAddNew: false
}
},

142
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/perception/index.vue

@ -1,142 +0,0 @@
<template>
<div class='RoadNetworkMonitoring2'>
<Tabs :panels="panels" :default-active="activeName" />
<!-- 搜索栏 -->
<div class="filter">
<div>
<ButtonGradient>
<template #prefix>
<img src="./images/insert.svg" />
</template>
新增
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="./images/export.svg" />
</template>
导出
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="./images/refresh.svg" />
</template>
刷新
</ButtonGradient>
</div>
<InputSearch style="width: 402px;" />
</div>
<!-- 内容 -->
<div class="body">
<RoadStateCard v-for="(item, index) in data" :cardData="item" :key="index"
:lastBtnColor="item.state === 5 ? '#007FF4' : void 0" :lastBtnText="item.state === 5 ? '去确认' : void 0" />
</div>
<!-- 分页 -->
<div class="footer">
<Pagination :total="90" />
</div>
</div>
</template>
<script>
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import Tabs from '@screen/components/Tabs/index.vue';
import RoadStateCard from '@screen/components/RoadStateCard/index.vue';
import Pagination from '@screen/components/Pagination.vue';
import InputSearch from '@screen/components/InputSearch/index.vue';
export default {
name: 'RoadNetworkMonitoring2',
components: {
ButtonGradient,
Tabs,
Pagination,
RoadStateCard,
InputSearch
},
data() {
return {
data: Array.from({ length: 15 }).map(() => ({
time: "2023.12.22 13:00:00",
source: "视频智能识别",
location: "k100+000",
direction: "济南方向",
state: (() => {
const min = 1;
const max = 5;
return Math.floor(Math.random() * (max - min + 1)) + min;
})()
})),
activeName: "告警事件(20)",
panels: [
{
label: "告警事件(20)",
key: "告警事件(20)"
},
{
label: "待确认事件(125)",
key: "待确认事件(125)"
},
{
label: "处置中事件(230)",
key: "处置中事件(230)"
},
{
label: "已处置事件(76)",
key: "已处置事件(76)"
},
]
}
},
methods: {
}
}
</script>
<style lang='scss' scoped>
.RoadNetworkMonitoring2 {
padding: 21px;
height: 100%;
display: flex;
flex-direction: column;
z-index: 6;
width: 100%;
height: 100%;
.filter {
height: 60px;
display: flex;
justify-content: space-between;
align-items: center;
>div {
display: flex;
gap: 6px;
}
}
.body {
flex: 1;
overflow: hidden;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 24px;
// grid-row-gap: 9px;
// grid-column-gap: 9px;
grid-auto-rows: min-content;
}
.footer {
margin-top: 15px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
}
}
</style>

2
ruoyi-ui/vue.config.js

@ -7,7 +7,7 @@ function resolve(dir) {
const name = process.env.VUE_APP_TITLE || "雅典娜"; // 网页标题
const port = process.env.port || process.env.npm_config_port || 1024; // 端口
const port = process.env.port || process.env.npm_config_port || 7081; // 端口
// vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions

Loading…
Cancel
Save