| | |
| | | <script type="text/javascript" src="../static/js/element.js"></script> |
| | | <script type="text/javascript" src="testPosition.js"></script> |
| | | <style> |
| | | .system-control-panel { |
| | | position: absolute; |
| | | top: 15px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | background: rgba(240, 248, 255, 0.7); |
| | | border-radius: 16px; |
| | | padding: 8px 20px; |
| | | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); |
| | | backdrop-filter: blur(6px); |
| | | border: 1px solid rgba(255, 255, 255, 0.6); |
| | | z-index: 100; |
| | | display: flex; |
| | | align-items: center; |
| | | min-width: 260px; |
| | | justify-content: center; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .system-control-panel:hover { |
| | | background: rgba(240, 248, 255, 0.85); |
| | | box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12); |
| | | } |
| | | |
| | | .system-status { |
| | | display: flex; |
| | | align-items: center; |
| | | margin-right: 12px; |
| | | } |
| | | |
| | | .status-indicator { |
| | | width: 10px; |
| | | height: 10px; |
| | | border-radius: 50%; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | .status-running { |
| | | background-color: #13ce66; |
| | | box-shadow: 0 0 6px rgba(19, 206, 102, 0.8); |
| | | animation: pulse-green 2s infinite; |
| | | } |
| | | |
| | | .status-stopped { |
| | | background-color: #A64036; |
| | | box-shadow: 0 0 6px rgba(166, 64, 54, 0.6); |
| | | } |
| | | |
| | | .status-text { |
| | | font-weight: 600; |
| | | font-size: 13px; |
| | | color: #2c3e50; |
| | | } |
| | | |
| | | .custom-switch { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .el-switch { |
| | | transform: scale(0.9); |
| | | } |
| | | |
| | | @keyframes pulse-green { |
| | | 0% { box-shadow: 0 0 0 0 rgba(19, 206, 102, 0.5); } |
| | | 70% { box-shadow: 0 0 0 6px rgba(19, 206, 102, 0); } |
| | | 100% { box-shadow: 0 0 0 0 rgba(19, 206, 102, 0); } |
| | | } |
| | | |
| | | .license-info { |
| | | position: absolute; |
| | | top: 60px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | background: rgba(255, 255, 255, 0.85); |
| | | padding: 8px 18px; |
| | | border-radius: 6px; |
| | | font-size: 13px; |
| | | font-weight: 600; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); |
| | | backdrop-filter: blur(4px); |
| | | border: 1px solid rgba(255, 255, 255, 0.6); |
| | | z-index: 99; |
| | | display: flex; |
| | | align-items: center; |
| | | transition: all 0.3s ease; |
| | | max-width: 80%; |
| | | text-align: center; |
| | | } |
| | | |
| | | .license-info.normal { |
| | | color: #13ce66; |
| | | background: rgba(255, 255, 255, 0.85); |
| | | display: none; /* 大于30天时隐藏 */ |
| | | } |
| | | |
| | | .license-info.warning { |
| | | color: #e6a23c; |
| | | background: rgba(255, 247, 230, 0.85); |
| | | border: 1px solid rgba(230, 162, 60, 0.3); |
| | | } |
| | | |
| | | .license-info.expired { |
| | | color: #f56c6c; |
| | | background: rgba(255, 235, 235, 0.85); |
| | | border: 1px solid rgba(245, 108, 108, 0.3); |
| | | animation: pulse-red 2s infinite; |
| | | } |
| | | |
| | | .license-icon { |
| | | margin-right: 8px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | @keyframes pulse-red { |
| | | 0% { box-shadow: 0 0 0 0 rgba(245, 108, 108, 0.3); } |
| | | 70% { box-shadow: 0 0 0 6px rgba(245, 108, 108, 0); } |
| | | 100% { box-shadow: 0 0 0 0 rgba(245, 108, 108, 0); } |
| | | } |
| | | |
| | | body { |
| | | font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
| | | margin: 0; |
| | |
| | | top: 5%; |
| | | /*transform: translateY(-50%);*/ |
| | | width: 25%; /* 设置宽度 */ |
| | | background-color: rgba(255, 255, 255, 0); /* 半透明背景 */ |
| | | background-color: rgba(255, 255, 255, 0); |
| | | |
| | | border-radius: 5px; |
| | | padding: 10px; |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0); |
| | | z-index: 1000; /* 确保在其他元素之上 */ |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .task-bar-div1 { |
| | | /*width: 100%; !* 设置宽度 *!*/ |
| | | background-color: rgba(255, 255, 255, 0.8); /* 半透明背景 */ |
| | | background-color: rgba(255, 255, 255, 0.8); |
| | | box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); |
| | | } |
| | | |
| | | .left-task-bar { |
| | | left: 20px; /* 距离左边的距离 */ |
| | | left: 20px; |
| | | /*bottom: 100px;*/ |
| | | } |
| | | |
| | | .right-task-bar { |
| | | /*bottom: 100px;*/ |
| | | right: 20px; /* 距离右边的距离 */ |
| | | right: 20px; |
| | | } |
| | | |
| | | .el-table .warning-row { |
| | |
| | | text-align: center; |
| | | } |
| | | |
| | | /* 新设计的站点样式 - 基于第二张图片 */ |
| | | .station { |
| | | position: absolute; |
| | | width: 24px; |
| | |
| | | left: 3px; |
| | | right: 3px; |
| | | bottom: 3px; |
| | | border: 1px solid rgba(255, 255, 255, 0.8); |
| | | /*border: 1px solid rgba(255, 255, 255, 0.8);*/ |
| | | border-radius: 2px; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | /* 四个角的三角形指示器 */ |
| | | .station::after { |
| | | content: ''; |
| | | position: absolute; |
| | |
| | | transform: rotate(180deg); |
| | | } |
| | | |
| | | /* 站点悬停效果 */ |
| | | .station:hover { |
| | | transform: scale(1.6); |
| | | z-index: 999; |
| | |
| | | </style> |
| | | </head> |
| | | <body > |
| | | |
| | | <!-- 科技感背景元素 --> |
| | | <div class="tech-background"> |
| | | <div class="grid-overlay"></div> |
| | | <div class="glow-effect"></div> |
| | | <div class="particles-container" id="particles-container"></div> |
| | | </div> |
| | | <!--<header>--> |
| | | <!-- 环形穿梭车智能系统--> |
| | | <!--</header>--> |
| | | <div class="tech-background"> |
| | | <div class="grid-overlay"></div> |
| | | <div class="glow-effect"></div> |
| | | <div class="particles-container" id="particles-container"></div> |
| | | </div> |
| | | <div id="app"> |
| | | <div class="map"> |
| | | <div v-if="licenseDayI <=30 "> |
| | | <div style="color: red">{{licenseDay}}</div> |
| | | <div class="system-control-panel"> |
| | | <div class="system-status"> |
| | | <div class="status-indicator" :class="valueSystem ? 'status-running' : 'status-stopped'"></div> |
| | | <span class="status-text">{{ valueSystem ? '系统运行中' : '系统已停止' }}</span> |
| | | </div> |
| | | <div class="custom-switch"> |
| | | <el-switch |
| | | v-model="valueSystem" |
| | | active-color="#13ce66" |
| | | inactive-color="#A64036" |
| | | @change='upDateValueSystem'> |
| | | </el-switch> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="license-info" :class="getLicenseClass()" v-if="licenseDayI <=30"> |
| | | <span class="license-icon">📄</span> |
| | | {{ licenseDay }} |
| | | </div> |
| | | <!-- <div class="inner-ring"></div>--> |
| | | <!-- <div class="outer-ring"></div>--> |
| | |
| | | <div class="corner corner-bl"></div> |
| | | <div class="corner corner-br"></div> |
| | | {{ station.index }} |
| | | </div> |
| | | |
| | | <div> |
| | | <el-switch |
| | | style="display: block" |
| | | v-model="valueSystem" |
| | | active-color="#13ce66" |
| | | inactive-color="#A64036" |
| | | active-text="系统运行中..." |
| | | inactive-text="系统已停止!" |
| | | @change='upDateValueSystem'> |
| | | </el-switch> |
| | | </div> |
| | | |
| | | <!-- Buses --> |
| | |
| | | |
| | | }, 1000) |
| | | }, |
| | | |
| | | // 获取容器实际尺寸 |
| | | updateContainerSize() { |
| | | const mapEl = this.$el.querySelector('.map'); |
| | |
| | | }, |
| | | convertToCSSPositionWithOffset(svgX, svgY, radius) { |
| | | const basePos = this.convertToCSSPosition(svgX, svgY); |
| | | // 示例:向右偏移半径的距离(可根据需求调整偏移方向) |
| | | return { |
| | | x: basePos.x -16.5, |
| | | y: basePos.y -16.5 |
| | |
| | | } |
| | | return ''; |
| | | }, |
| | | |
| | | // 获取许可证样式类 |
| | | getLicenseClass() { |
| | | if (this.licenseDayI > 30) { |
| | | return 'normal'; |
| | | } else if (this.licenseDayI > 0) { |
| | | return 'warning'; |
| | | } else { |
| | | return 'expired'; |
| | | } |
| | | }, |
| | | getLicenseDays(){ |
| | | let that = this; |
| | | $.ajax({ |