| screen/src/view/accidentCase/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| screen/src/view/home/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| screen/src/view/planOfAudit/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| screen/src/view/projectHome/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| screen/src/view/workList/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
screen/src/view/accidentCase/detail.vue
@@ -24,18 +24,18 @@ <div class="flex a-center" v-if="detailData.casualties"> <img src="../../assets/img/home/Shape@2x (1).png" class="mr--6 w--9 h--10" class="mr--8 w--12 h--13" /> <div class="SHSN fs--12 lh--12 c-fff"> <div class="SHSN fs--16 lh--16 c-fff"> 伤亡:{{ detailData.casualties }} </div> </div> <div class="flex a-center"> <img src="../../assets/img/home/Shape@2x (2).png" class="mr--6 w--8 h--10" class="mr--8 w--11 h--13" /> <div class="SHSN fs--12 lh--12 c-fff"> <div class="SHSN fs--16 lh--16 c-fff"> {{ detailData.province }}{{ detailData.city }}{{ detailData.area }} </div> @@ -43,14 +43,14 @@ <div class="flex a-center" v-if="detailData.time"> <img src="../../assets/img/home/Shape@2x (3).png" class="mr--6 w--10 h--9" class="mr--8 w--13 h--12" /> <div class="SHSN fs--12 lh--12 c-fff"> <div class="SHSN fs--16 lh--16 c-fff"> {{ formatDate(detailData.time) }} </div> </div> </div> <div class="mt--18 fs--14 c-fff SHSN" v-if="detailData.content"> <div class="mt--18 fs--18 c-fff SHSN content-text" v-if="detailData.content"> {{ detailData.content }} </div> <div class="mt--26 flex flex-column a-center gap--18"> @@ -66,6 +66,7 @@ detailData.img " @error="handleImageError" class="detail-image" /> </div> </template> @@ -143,20 +144,30 @@ }; </script> <style scoped lang="less"> .content-text { line-height: 28px; letter-spacing: 0.5px; } .detail-content { width: 100%; line-height: 1.8; font-size: 16px; line-height: 2; word-wrap: break-word; ::v-deep img { max-width: 100%; height: auto; width: 800px; height: 500px; object-fit: cover; display: block; margin: 10px auto; margin: 20px auto; border-radius: 4px; } ::v-deep p { margin: 10px 0; margin: 12px 0; font-size: 16px; line-height: 28px; } ::v-deep h1, @@ -165,18 +176,27 @@ ::v-deep h4, ::v-deep h5, ::v-deep h6 { margin: 15px 0 10px; margin: 20px 0 12px; } } .detail-image { width: 800px; height: 500px; object-fit: cover; border-radius: 4px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); } .typeBox { min-width: 60px; line-height: 20px; min-width: 70px; padding: 0 12px; line-height: 24px; text-align: center; background: linear-gradient(180deg, #ff4d4f 0%, #e5484d 100%); border-radius: 20px; border: 1px solid #e5484d; font-size: 12px; font-size: 14px; color: #ffffff; font-family: "Source Han Sans CN Bold"; } screen/src/view/home/index.vue
@@ -908,7 +908,7 @@ time: time, }).then((res) => { this.scrollData = res; if (this.screenData.length > 4) { if (this.scrollData.length > 4) { this.initScrollData(); } }); @@ -1270,6 +1270,15 @@ marker.on("mouseout", () => { this.hideTooltip(); }); marker.on("click", () => { this.$router.push({ path: "/projectHome", query: { projectId: item.projectId, projectName: item.projectName, }, }); }); return marker; }, updateMarkerVisibility() { @@ -1311,7 +1320,7 @@ if (!this.mapView) return; const pixel = this.mapView.lngLatToContainer(item.position); // 获取当前缩放比例 let scaleX = 1; let scaleY = 1; @@ -1363,12 +1372,32 @@ console.error("Parse error", error); } // 对设备租赁单位进行去重处理 let uniqueProperties = []; if (res.properties && res.properties.length > 0) { const seenNames = new Set(); uniqueProperties = res.properties.filter((item) => { try { const parsed = JSON.parse(item); const companyName = parsed["工程起重机械租赁单位"]; if (companyName && !seenNames.has(companyName)) { seenNames.add(companyName); return true; } return false; } catch (e) { return false; } }); } this.tooltipData = { ...res, address, constructionCompanyInfo, supervisorCompanyInfo, developmentCompanyInfo, properties: uniqueProperties, }; this.tooltipLoading = false; }) screen/src/view/planOfAudit/index.vue
@@ -330,7 +330,7 @@ :key="index" :src="item" class="w--150 h--120 cursor-pointer" @click="previewImage(item)" @click="previewImage(parseImages(checkMaterialDetail.safetySlip), index)" /> </div> <div v-else class="c-fff fs--14 SHSR">暂无图片</div> @@ -350,7 +350,7 @@ :key="index" :src="item" class="w--150 h--120 cursor-pointer" @click="previewImage(item)" @click="previewImage(parseImages(checkMaterialDetail.checkUserImg), index)" /> </div> <div v-else class="c-fff fs--14 SHSR">暂无图片</div> @@ -373,7 +373,7 @@ :key="index" :src="item" class="w--150 h--120 cursor-pointer" @click="previewImage(item)" @click="previewImage(parseImages(checkMaterialDetail.integrityNotification), index)" /> </div> <div v-else class="c-fff fs--14 SHSR">暂无图片</div> @@ -381,6 +381,14 @@ </div> </div> </CustomDialog> <!-- 图片预览 --> <el-image-viewer style="z-index: 9999;" v-if="showImageViewer" :on-close="closeImageViewer" :url-list="previewImageList" :initial-index="previewImageIndex" /> </div> </template> @@ -398,9 +406,10 @@ getScoreReportPdfUrl, } from "./service"; import { planTypeMap } from "@/utils/riskSourceMap"; import ElImageViewer from "element-ui/packages/image/src/image-viewer"; export default { components: { HeaderBox }, components: { HeaderBox, ElImageViewer }, props: {}, data() { return { @@ -447,6 +456,11 @@ // 图片基础路径 VUE_APP_IMAGE_BASE_URL: process.env.VUE_APP_IMAGE_BASE_URL, // 图片预览相关 showImageViewer: false, // 是否显示图片预览器 previewImageList: [], // 预览图片列表 previewImageIndex: 0, // 当前预览图片索引 // 枚举映射 planTypeMap: planTypeMap, // 计划类型映射 @@ -920,9 +934,17 @@ }, // 预览图片 previewImage(url) { // 可以使用 el-image-viewer 或其他图片预览组件 window.open(url, "_blank"); previewImage(imageList, index) { this.previewImageList = imageList; this.previewImageIndex = index; this.showImageViewer = true; }, // 关闭图片预览 closeImageViewer() { this.showImageViewer = false; this.previewImageList = []; this.previewImageIndex = 0; }, }, beforeDestroy() { @@ -1083,8 +1105,6 @@ opacity: 0.7; } ::v-deep .el-descriptions { .el-descriptions__body { background-color: transparent; @@ -1095,4 +1115,21 @@ } } } // 图片预览器样式优化 ::v-deep .el-image-viewer__wrapper { z-index: 9999 !important; // 设置足够高的层级,确保在弹窗之上 } ::v-deep .el-image-viewer__mask { z-index: 9999 !important; } ::v-deep .el-image-viewer__btn { z-index: 10000 !important; } ::v-deep .el-image-viewer__canvas { z-index: 9999 !important; } </style> screen/src/view/projectHome/index.vue
@@ -23,13 +23,14 @@ </div> <div class="flex1 flex"> <div class="label">工程类型</div> <div class="value">{{ ['房建工程','市政工程','固定资产'][projectInfo.type] }}</div> <div class="value">{{ ['房建工程', '市政工程', '固定资产'][projectInfo.type] }}</div> </div> </div> <div class="info-item"> <div class="flex2 flex"> <div class="label">项目地址</div> <div class="value">{{ projectInfo.address || '-' }}</div> <div class="value address-value" :title="projectInfo.address || '-'">{{ projectInfo.address || '-' }} </div> </div> <div class="flex1 flex"> <div class="label">项目阶段</div> @@ -66,14 +67,36 @@ <div class="value">{{ projectInfo.constructionCompanyInfo.leader || '-' }}</div> </div> </div> <div class="info-item" v-for="item in projectInfo.properties"> <div class="info-item" v-if="projectInfo.properties && projectInfo.properties.length > 0"> <div class="flex2 flex"> <div class="label dept">设备租赁单位</div> <div class="value">{{ JSON.parse(item)['工程起重机械租赁单位'] || '-' }}</div> <div class="label dept"> 设备租赁单位 <el-tooltip v-if="projectInfo.properties.length > 1" placement="top" effect="dark"> <div slot="content" class="tooltip-content"> <div v-for="(item, index) in projectInfo.properties" :key="index" class="tooltip-item"> <div class="tooltip-label">单位{{ index + 1 }}:</div> <div class="tooltip-value">{{ JSON.parse(item)['工程起重机械租赁单位'] || '-' }}</div> </div> </div> <span class="count-badge">{{ projectInfo.properties.length }}</span> </el-tooltip> </div> <div class="value">{{ JSON.parse(projectInfo.properties[0])['工程起重机械租赁单位'] || '-' }}</div> </div> <div class="flex1 flex"> <div class="label">联系人</div> <div class="value">{{ JSON.parse(item)['联系电话'] || '-' }}</div> <div class="label"> 联系人 <el-tooltip v-if="projectInfo.properties.length > 1" placement="top" effect="dark"> <div slot="content" class="tooltip-content"> <div v-for="(item, index) in projectInfo.properties" :key="index" class="tooltip-item"> <div class="tooltip-label">联系人{{ index + 1 }}:</div> <div class="tooltip-value">{{ JSON.parse(item)['联系电话'] || '-' }}</div> </div> </div> <span class="count-badge">{{ projectInfo.properties.length }}</span> </el-tooltip> </div> <div class="value">{{ JSON.parse(projectInfo.properties[0])['联系电话'] || '-' }}</div> </div> </div> <div class="info-item"> @@ -287,10 +310,12 @@ <TitleBox> <template #title>项目风险趋势 </template> <template #right> <div class="risk-picker"> <div @click="handleRiskPickerClick" class="risk-picker"> <el-date-picker v-model="dateRange" ref="riskDatePicker" type="monthrange" range-separator="" start-placeholder="" end-placeholder=""> </el-date-picker> <div class="risk-ab"> <img src="../../assets/img/home/Shape@2x (6).png" class="pick-img" /> <div class="pick-text"> {{ dateTxt }} </div> @@ -1739,6 +1764,10 @@ } riskChart.setOption(option) }, // 处理风险趋势时间选择器点击 handleRiskPickerClick() { this.$refs.riskDatePicker.focus(); }, toRiskTrend() { this.$router.push({ path: '/subentry', query: { projectId: this.projectId, projectName: this.projectName } }) } @@ -1835,14 +1864,40 @@ color: #dcdfe6; flex-shrink: 0; width: 64px; position: relative; display: flex; align-items: center; gap: 4px; } .dept { width: 76px; width: 100px; } .time { width: 100px; } .count-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; background: linear-gradient(135deg, #32C5FF 0%, #0E5DFB 100%); border-radius: 9px; font-weight: bold; font-size: 11px; color: #ffffff; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 2px 6px rgba(50, 197, 255, 0.4); &:hover { transform: scale(1.1); box-shadow: 0 3px 10px rgba(50, 197, 255, 0.6); } } .value { @@ -1850,6 +1905,24 @@ font-size: 12px; color: #4cefe6; max-width: 144px; // 项目地址特殊处理:最多显示两行,超出省略 &.address-value { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; text-overflow: ellipsis; word-break: break-all; line-height: 18px; max-height: 36px; // 2行的高度:18px * 2 cursor: pointer; transition: color 0.3s ease; &:hover { color: #66FFFF; } } } } @@ -2470,8 +2543,13 @@ position: relative; display: flex; align-items: center; cursor: pointer; ::v-deep .el-input__icon { display: none; } ::v-deep .el-range-separator { display: none; } @@ -2497,11 +2575,9 @@ display: flex; align-items: center; justify-content: space-between; } .pick-text { font-weight: 400; font-size: 12px; color: #FFFFFF; @@ -2514,7 +2590,6 @@ margin-right: 12px; } } } // 项目进度弹窗 - 历史进度按钮固定定位 @@ -2746,4 +2821,64 @@ } } } // Tooltip 提示框样式 ::v-deep .el-tooltip__popper { max-width: 400px; &.is-dark { background: rgba(0, 22, 53, 0.95); } } .tooltip-content { min-width: 200px; max-height: 300px; overflow-y: auto; padding: 4px 0; // 自定义滚动条 &::-webkit-scrollbar { width: 4px; } &::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.1); border-radius: 2px; } &::-webkit-scrollbar-thumb { background: rgba(50, 197, 255, 0.6); border-radius: 2px; &:hover { background: rgba(50, 197, 255, 0.8); } } .tooltip-item { padding: 8px 0; display: flex; align-items: center; min-width: 200px; &:last-child { border-bottom: none; } .tooltip-label { font-weight: 500; font-size: 12px; color: #32C5FF; margin-bottom: 4px; } .tooltip-value { font-weight: 400; font-size: 13px; color: #FFFFFF; line-height: 1.5; word-break: break-all; } } } </style> screen/src/view/workList/index.vue
@@ -129,7 +129,17 @@ </template> </el-table-column> <el-table-column label="标题" prop="title" /> <el-table-column label="简介" prop="intro" /> <el-table-column label="简介" prop="intro"> <template #default="{ row }"> <el-tooltip :content="row.intro" placement="top" :disabled="!row.intro" > <div class="intro-text">{{ row.intro }}</div> </el-tooltip> </template> </el-table-column> <el-table-column label="图片" prop="img"> <template #default="{ row }" ><div @@ -695,6 +705,18 @@ cursor: not-allowed; } .intro-text { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; text-overflow: ellipsis; word-break: break-all; line-height: 1.6em; max-height: 3em; white-space: normal; } ::v-deep .el-descriptions { .el-descriptions__body { background-color: transparent;