<template> <div class="container"> <!-- 顶部操作栏 --> <div class="containertop"> <div class="topleft"> <img src="../../../assets/images/detailsicon/1.png" alt=""> <span>项目图例</span> </div> <div class="topright"> <el-button type="primary" size="medium" plain style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="handleEdit"> <img src="../../../assets/images/detailsicon/icon-xz@2x.png" alt="编辑" style="width: 0.6rem; height: 0.6rem; margin-right: 4px;"> 编辑 </el-button> </div> </div> <!-- 内容区域 --> <div class="main-content"> <!-- 左侧两个轮播图 --> <div class="carousel-container"> <!-- 上侧轮播图 --> <div class="carousel"> <div class="carousel-control left" @click="prevImage(1)"> <img src="../../../assets/images/icon-left@2x.png" alt=""> </div> <div v-for="(item, index) in carousel1Items" :key="index" class="carousel-item" :class="{ active: index === currentIndex1 }"> <img :src="item" :alt="'Image ' + (index + 1)" /> </div> <div class="carousel-control right" @click="nextImage(1)"> <img src="../../../assets/images/icon-right@2x.png" alt=""> </div> <div class="classify"> 外部 </div> </div> <!-- 下侧轮播图 --> <div class="carousel"> <div class="carousel-control left" @click="prevImage(2)"> <img src="../../../assets/images/icon-left@2x.png" alt=""> </div> <div v-for="(item, index) in carousel2Items" :key="index" class="carousel-item" :class="{ active: index === currentIndex2 }"> <img :src="item" :alt="'Image ' + (index + 1)" /> </div> <div class="carousel-control right" @click="nextImage(2)"> <img src="../../../assets/images/icon-right@2x.png" alt=""> </div> <div class="classify"> 内部 </div> </div> </div> <!-- 右侧地图缩略图 --> <div class="map-thumbnail"> <div id="mars2dContainer" class="mars2d-container"></div> <div class="classify"> 位置 </div> </div> </div> <!-- 编辑/新增对话框 --> <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="500px"> <el-form :model="form" label-width="120px"> <el-form-item label="类型"> <el-select v-model="form.type" placeholder="请选择类型"> <el-option v-for="dict in dict.type.tplx" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> </el-select> </el-form-item> <el-form-item label="图片上传"> <el-upload action="https://jsonplaceholder.typicode.com/posts/" :on-success="handleUploadSuccess" :on-remove="handleUploadRemove" :file-list="fileList" list-type="picture-card"> <i class="el-icon-plus"></i> </el-upload> </el-form-item> </el-form> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取消</el-button> <el-button type="primary" @click="handleSubmit">确定</el-button> </span> </el-dialog> </div> </template> <script> import 'mars2d/mars2d.css'; import * as mars2d from 'mars2d'; export default { components: {}, dicts: ['tplx'], data() { const basePathUrl = window.basePathUrl || ""; return { configUrl: basePathUrl + "config/config.json", mapOptions: { // 配置文档:http://mars2d.cn/apidoc.html#Map copyright: false, // 不显示厂商logo // basemap: 2021, basemaps: [ { "id": 2021, "pid": 10, "name": "高德电子", "icon": "img/basemaps/gaode_vec.png", "type": "gaode", "layer": "vec", "show": true }, ], center: { lat: 31.2704, lng: 120.7600 }, // 中心点 zoom: 16, // 设置地图缩放级别 minZoom: 15, // 最小缩放级别 maxZoom: 20, // 最大缩放级别 zoomControl: true, }, // 轮播图假数据(使用网络图片) carousel1Items: [ 'https://picsum.photos/300/200?random=1', 'https://picsum.photos/300/200?random=2', 'https://picsum.photos/300/200?random=3', ], carousel2Items: [ 'https://picsum.photos/300/200?random=4', 'https://picsum.photos/300/200?random=5', 'https://picsum.photos/300/200?random=6', ], currentIndex1: 0, // 上侧轮播图当前索引 currentIndex2: 0, // 下侧轮播图当前索引 // 对话框相关 dialogVisible: false, dialogTitle: '编辑项目', form: { type: '外部', // 默认类型 images: [], // 上传的图片列表 }, fileList: [], // 上传的文件列表 map: null, // 地图实例 }; }, methods: { onload(map) { // 地图组件构造完成 }, // 切换到上一张图片 prevImage(carouselIndex) { if (carouselIndex === 1) { this.currentIndex1 = (this.currentIndex1 - 1 + this.carousel1Items.length) % this.carousel1Items.length; } else if (carouselIndex === 2) { this.currentIndex2 = (this.currentIndex2 - 1 + this.carousel2Items.length) % this.carousel2Items.length; } }, // 切换到下一张图片 nextImage(carouselIndex) { if (carouselIndex === 1) { this.currentIndex1 = (this.currentIndex1 + 1) % this.carousel1Items.length; } else if (carouselIndex === 2) { this.currentIndex2 = (this.currentIndex2 + 1) % this.carousel2Items.length; } }, // 编辑操作 handleEdit() { this.dialogTitle = '编辑项目'; this.dialogVisible = true; // 填充表单数据 this.form = { type: '外部', // 默认类型 images: [], // 上传的图片列表 }; }, // 提交表单 handleSubmit() { this.dialogVisible = false; // 调用 API 提交数据 }, // 上传成功 handleUploadSuccess(response, file) { this.fileList.push(file); this.form.images.push(file.url); }, // 移除文件 handleUploadRemove(file) { const index = this.fileList.indexOf(file); if (index !== -1) { this.fileList.splice(index, 1); this.form.images.splice(index, 1); } }, // 初始化地图 initMap() { this.map = new mars2d.Map('mars2dContainer', this.mapOptions); }, }, mounted() { this.initMap(); }, }; </script> <style scoped> .container { display: flex; flex-direction: column; width: 100%; background-color: #FFFFFF; box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1); border-radius: 0.5rem 0.5rem 0.5rem 0.5rem; gap: 1rem; overflow: auto; } .containertop { height: auto; display: flex; justify-content: space-between; padding: .5rem; border-bottom: 1px solid #E5E5E5; } .action-bar { margin-bottom: 20px; } .main-content { display: flex; gap: 2rem; padding: 1rem; } .carousel-container { display: flex; flex-direction: column; gap: 1rem; } .carousel { width: 21rem; height: 12rem; position: relative; overflow: hidden; } .carousel-item { width: 100%; height: 100%; position: absolute; top: 0; left: 0; opacity: 0; transition: opacity 0.5s ease-in-out; } .carousel-item img { width: 100%; height: 100%; object-fit: cover; } .carousel-item.active { opacity: 1; } .carousel-control { position: absolute; top: 50%; transform: translateY(-50%); cursor: pointer; font-size: 1.5rem; color: white; padding: 0.5rem; z-index: 10; } .carousel-control.left { left: 0; } .carousel-control.right { right: 0; } .topleft { width: 8rem; display: flex; gap: 0.4rem; align-items: center; } .topleft img { width: 0.81rem; height: 0.81rem; } .topleft span { width: auto; height: 0.88rem; font-family: AlibabaPuHuiTi, AlibabaPuHuiTi; font-weight: 500; font-size: 0.88rem; color: #3D424C; line-height: 0.88rem; text-align: right; font-style: normal; text-transform: none; } .classify { width: 2.81rem; height: 1.38rem; background-color: rgba(43, 98, 241, 0.8); border-radius: 0.69rem 0.69rem 0.69rem 0.69rem; color: white; position: absolute; bottom: .5rem; left: .5rem; display: flex; justify-content: center; align-items: center; font-size: .7rem; z-index: 999; } .map-thumbnail { width: 76rem; height: 25rem; position: relative; } .mars2d-container { width: 76rem; height: 25rem; } </style>