|
|
@@ -125,9 +125,9 @@
|
|
|
>
|
|
|
<template #header>
|
|
|
<span class="title" v-if="dialog.componentName === 'TrafficTimeSpace'">{{dialog.title}}</span>
|
|
|
- <div style="display: flex; align-items: center; gap: 8px;" v-else-if="dialog.componentName === 'BigIntersectionSignalMonitoring'">
|
|
|
- <span style="color: #fff; font-size: 16px;">{{dialog.title}}</span>
|
|
|
- <span style="color: #4da8ff; font-size: 12px;">在线</span>
|
|
|
+ <div class="dialog-title-2" v-else-if="dialog.componentName === 'BigIntersectionSignalMonitoring'">
|
|
|
+ {{dialog.title}}/自适应控制/早高峰方案/运行时段:07:00-09:00/设备:
|
|
|
+ <span style="color: green;">在线</span>
|
|
|
</div>
|
|
|
<span class="title" v-else>{{dialog.title}}</span>
|
|
|
</template>
|
|
|
@@ -148,7 +148,65 @@
|
|
|
:node-data="dialog.nodeData" />
|
|
|
</div>
|
|
|
<div class="big-mointoring-right">
|
|
|
-
|
|
|
+ <!-- 控制方式 -->
|
|
|
+ <div class="control-method">
|
|
|
+ <div class="control-label-wrap">
|
|
|
+ <span class="control-label">控制方式</span>
|
|
|
+ <span>手动控制</span>
|
|
|
+ </div>
|
|
|
+ <SegmentedRadio v-model="currentMethod" />
|
|
|
+ </div>
|
|
|
+ <!-- 控制方案 -->
|
|
|
+ <div class="control-scheme">
|
|
|
+ <div class="control-label-wrap">
|
|
|
+ <span class="control-label">控制方案</span>
|
|
|
+ <DropdownSelect
|
|
|
+ v-model="currentScheme"
|
|
|
+ :options="schemeOptions"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="current-stage">
|
|
|
+ <div class="current-stage-warp">
|
|
|
+ <div>当前阶段:</div>
|
|
|
+ <div v-for="item, index in currentStageList" :key="index">
|
|
|
+ <img :src="require(`@/assets/${item.img}`)" alt="stage" :class="{ 'stage-img': true, 'stage-active': item.value === currentStage }" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="lock-time" ref="lockTime">
|
|
|
+ <div class="lock-time-label-wrap glow-header">
|
|
|
+ <div class="lock-time-label">锁定时间</div>
|
|
|
+ <div class="lock-time-close" @click="closeLocktime()">x</div>
|
|
|
+ </div>
|
|
|
+ <div class="lock-time-options">
|
|
|
+ <div class="lock-time-option">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="lock-time" value=""/> 持续放行
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ <div class="lock-time-option">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="lock-time" value="" /> 放行
|
|
|
+ <DropdownSelect
|
|
|
+ placeholder="锁定时间"
|
|
|
+ v-model="currentLocktime"
|
|
|
+ :options="locktimeOptions"
|
|
|
+ @click.native.prevent
|
|
|
+ />
|
|
|
+ 秒解锁
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ <!-- 按钮组 -->
|
|
|
+ <div class="button-group">
|
|
|
+ <div>
|
|
|
+ <button class="btn btn-cancel" @click="onCancel()">取消</button>
|
|
|
+ <button class="btn btn-confirm" @click="onConfirm()">确认</button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
@@ -166,6 +224,9 @@ import MenuItem from '@/components/MenuItem.vue';
|
|
|
import SmartDialog from '@/components/SmartDialog.vue';
|
|
|
import TrafficTimeSpace from '@/components/TrafficTimeSpace.vue';
|
|
|
import IntersectionSignalMonitoring from '@/components/IntersectionSignalMonitoring.vue';
|
|
|
+import SegmentedRadio from '@/components/SegmentedRadio.vue';
|
|
|
+import DropdownSelect from '@/components/DropdownSelect.vue';
|
|
|
+
|
|
|
import { menuData, makeTrafficTimeSpaceData} from '@/mock/data';
|
|
|
|
|
|
export default {
|
|
|
@@ -175,6 +236,8 @@ export default {
|
|
|
SmartDialog,
|
|
|
TrafficTimeSpace,
|
|
|
IntersectionSignalMonitoring,
|
|
|
+ SegmentedRadio,
|
|
|
+ DropdownSelect,
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
@@ -215,7 +278,28 @@ export default {
|
|
|
isLoading: false,
|
|
|
menuData: [], // 当前展示的树形数据
|
|
|
// 弹窗相关数据
|
|
|
- activeDialogs: []
|
|
|
+ activeDialogs: [],
|
|
|
+ // 控制方式数据
|
|
|
+ currentMethod: 'temp',
|
|
|
+ currentScheme: 'early_peak',
|
|
|
+ schemeOptions: [
|
|
|
+ { label: '早高峰', value: 'early_peak' },
|
|
|
+ { label: '晚高峰', value: 'evening_peak' },
|
|
|
+ { label: '平峰', value: 'normal' }
|
|
|
+ ],
|
|
|
+ currentLocktime: 0,
|
|
|
+ locktimeOptions: [
|
|
|
+ { label: '50', value: '50' },
|
|
|
+ { label: '100', value: '100' },
|
|
|
+ { label: '300', value: '300' }
|
|
|
+ ],
|
|
|
+ currentStage: '1', // 当前阶段
|
|
|
+ currentStageList: [
|
|
|
+ { value: '1', img: 'test_img1.png' },
|
|
|
+ { value: '2', img: 'test_img1.png' },
|
|
|
+ { value: '3', img: 'test_img1.png' },
|
|
|
+ { value: '4', img: 'test_img1.png' }
|
|
|
+ ]
|
|
|
};
|
|
|
},
|
|
|
computed: {
|
|
|
@@ -237,6 +321,20 @@ export default {
|
|
|
beforeDestroy() {
|
|
|
},
|
|
|
methods: {
|
|
|
+ onCancel() { //取消按钮
|
|
|
+
|
|
|
+ },
|
|
|
+ onConfirm() { //确认按钮
|
|
|
+
|
|
|
+ },
|
|
|
+ closeLocktime() {
|
|
|
+ const els = this.$refs.lockTime;
|
|
|
+ if (Array.isArray(els)) {
|
|
|
+ els.forEach(el => el.style.display = 'none');
|
|
|
+ } else if (els) {
|
|
|
+ els.style.display = 'none';
|
|
|
+ }
|
|
|
+ },
|
|
|
handleMenuClick(payload) {
|
|
|
console.log('父组件接收到了参数:', payload.id, payload.label);
|
|
|
if (this.currentTab === 'crossing') {
|
|
|
@@ -1115,4 +1213,160 @@ export default {
|
|
|
min-width: 0;
|
|
|
min-height: 0;
|
|
|
}
|
|
|
+.dialog-title-2{
|
|
|
+ font-size: calc(var(--s) * 24px);
|
|
|
+ letter-spacing: calc(var(--s) * 2px);
|
|
|
+ text-shadow: 0 0 calc(var(--s) * 10px) rgba(90, 200, 255, 0.35);
|
|
|
+ font-weight: 600;
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+/** 控制方法 */
|
|
|
+.control-method {
|
|
|
+
|
|
|
+}
|
|
|
+.control-label-wrap {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 20px;
|
|
|
+ column-gap: 20px;
|
|
|
+}
|
|
|
+.control-label {
|
|
|
+ font-size: 24px;
|
|
|
+}
|
|
|
+.control-label-wrap span {
|
|
|
+ display: inline-block;
|
|
|
+}
|
|
|
+.control-method .control-label-wrap {
|
|
|
+ justify-content: space-between;
|
|
|
+}
|
|
|
+
|
|
|
+.control-scheme {
|
|
|
+ margin-top: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.lock-time {
|
|
|
+ width: 40%;
|
|
|
+ border-radius: 8px;
|
|
|
+ box-shadow:
|
|
|
+ inset 0px 0px 10px 0px rgba(88, 146, 255, 0.4),
|
|
|
+ inset 20px 0px 30px -10px rgba(88, 146, 255, 0.15);
|
|
|
+
|
|
|
+}
|
|
|
+.lock-time-label-wrap {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ padding: 10px;
|
|
|
+ border-radius: 8px 8px 0 0;
|
|
|
+}
|
|
|
+.lock-time-label {
|
|
|
+ font-size: 16px;
|
|
|
+}
|
|
|
+.lock-time-options {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ row-gap: 10px;
|
|
|
+ font-size: 14px;
|
|
|
+ padding: 10px;
|
|
|
+}
|
|
|
+.lock-time-option {
|
|
|
+
|
|
|
+}
|
|
|
+.lock-time-close {
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+
|
|
|
+.glow-header {
|
|
|
+ background: linear-gradient(
|
|
|
+ 180deg,
|
|
|
+ rgba(65, 115, 205, 0.6) 0%,
|
|
|
+ rgba(40, 70, 130, 0.1) 100%
|
|
|
+ );
|
|
|
+
|
|
|
+ backdrop-filter: blur(10px);
|
|
|
+}
|
|
|
+
|
|
|
+.current-stage {
|
|
|
+ background-color: rgba(65, 115, 205, 0.2);
|
|
|
+ border: 1px solid #3660a5;
|
|
|
+ margin-bottom: 20px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+.current-stage-warp {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 12px;
|
|
|
+ padding: 12px 20px;
|
|
|
+}
|
|
|
+.stage-img {
|
|
|
+ border-radius: 5px;
|
|
|
+}
|
|
|
+.stage-active {
|
|
|
+ background-blend-mode: multiply;
|
|
|
+ background-color: rgba(17,23,29,.5);
|
|
|
+}
|
|
|
+
|
|
|
+/** 按钮 */
|
|
|
+/* 按钮基础通用样式 */
|
|
|
+.btn {
|
|
|
+ display: inline-flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ height: 36px;
|
|
|
+ padding: 0 32px;
|
|
|
+ font-size: 14px;
|
|
|
+ border-radius: 4px;
|
|
|
+ cursor: pointer;
|
|
|
+ user-select: none;
|
|
|
+ transition: all 0.2s ease-in-out;
|
|
|
+ box-sizing: border-box;
|
|
|
+}
|
|
|
+
|
|
|
+/* --- 取消按钮 (幽灵按钮) --- */
|
|
|
+.btn-cancel {
|
|
|
+ background-color: transparent;
|
|
|
+ color: #d1d5db;
|
|
|
+ border: 1px solid rgba(130, 150, 190, 0.4);
|
|
|
+}
|
|
|
+
|
|
|
+.btn-cancel:hover {
|
|
|
+ color: #ffffff;
|
|
|
+ border-color: rgba(130, 150, 190, 0.8);
|
|
|
+ background-color: rgba(255, 255, 255, 0.05);
|
|
|
+}
|
|
|
+
|
|
|
+.btn-cancel:active {
|
|
|
+ background-color: rgba(255, 255, 255, 0.1);
|
|
|
+}
|
|
|
+
|
|
|
+/* --- 确认按钮 (实心主按钮) --- */
|
|
|
+.btn-confirm {
|
|
|
+ background-color: #3b74ff;
|
|
|
+ color: #ffffff;
|
|
|
+ border: 1px solid #3b74ff;
|
|
|
+}
|
|
|
+
|
|
|
+.btn-confirm:hover {
|
|
|
+ background-color: #5a8bff;
|
|
|
+ border-color: #5a8bff;
|
|
|
+ box-shadow: 0 2px 8px rgba(59, 116, 255, 0.3);
|
|
|
+}
|
|
|
+
|
|
|
+.btn-confirm:active {
|
|
|
+ background-color: #265bed;
|
|
|
+ border-color: #265bed;
|
|
|
+ box-shadow: none;
|
|
|
+}
|
|
|
+.button-group {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ margin-top: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.button-group>div {
|
|
|
+ display: flex;
|
|
|
+ gap: 12px;
|
|
|
+}
|
|
|
</style>
|