Sfoglia il codice sorgente

视频自定义控件按钮

zouling 1 settimana fa
parent
commit
8ed1649c78

BIN
ruoyi-ui/src/assets/images/search/bficoa.png


BIN
ruoyi-ui/src/assets/images/search/bficob.png


BIN
ruoyi-ui/src/assets/images/search/bficoc.png


BIN
ruoyi-ui/src/assets/images/search/cir.png


BIN
ruoyi-ui/src/assets/images/search/pic_jsjg_slt_sxt.png


+ 411 - 0
ruoyi-ui/src/components/jiansuo/VideoPlayer.vue

@@ -0,0 +1,411 @@
+<template>
+  <div class="video-player-container">
+    <div class="video-container" ref="videoContainer">
+      <video
+        ref="videoPlayer"
+        class="video-js vjs-big-play-centered"
+        preload="auto"
+        crossOrigin="anonymous"
+      ></video>
+      <!-- :poster="poster" -->
+
+      <!-- 自定义控件 -->
+      <div class="lcfbox">
+        <div class="lcbox">
+          <div class="tit">下一次可能出现的设备:</div>
+          <div class="txt">1#旁 2号摄像头</div>
+        </div>
+        <div class="flexcj">
+          <div class="bigbox flexc">
+            <img src="@/assets/images/search/biga.png" @click="zoomOut" style="margin-left: 0;"/>
+            <div class="custom-dot-steps">
+                <div
+                  v-for="i in 5"
+                  :key="i"
+                  class="step-dot"
+                  :class="{ 'active': i == stepsactive}"
+                ></div>
+              </div>
+            <img src="@/assets/images/search/bigb.png" @click="zoomIn"/>
+          </div>
+          <div class="bigbox flexc" style="padding-left: 7px;">
+            <el-select v-model="playbackRate" @change="changeSpeed"  placeholder="1.0x" popper-class="slectbox">
+                <el-option
+                  v-for="item in speeds"
+                  :key="item.value"
+                  :label="item.text"
+                  :value="item.value">
+                </el-option>
+            </el-select>
+            <img src="@/assets/images/search/bficoa.png" @click="takeScreenshot" />
+            <img src="@/assets/images/search/bficob.png" @click="replay"/>
+            <img src="@/assets/images/search/bficoc.png" @click="toggleFullscreen"/>
+
+          </div>
+        </div>
+        <!-- 进度条 -->
+        <div class="vjs-progress-container" @click="seek">
+          <div class="vjs-progress-bar">
+            <div class="vjs-progress-filled" :style="{ width: progressPercentage + '%' }">
+               <img src="@/assets/images/search/cir.png" v-if="progressPercentage"/>
+            </div>
+          </div>
+        </div>
+        <div class="playbox">
+          <div class="pltit">
+            <div class="tit">10:32:18</div>
+            <div class="txt">2025.06.13</div>
+          </div>
+          <div class="playbtn flexcc flex1">
+            <img src="@/assets/images/search/pre.png"/>
+            <div @click="paly=!paly" class="playb">
+              <img  src="@/assets/images/search/videob.png" @click="handlePlay"  v-if="paly"/>
+              <img  src="@/assets/images/search/videoa.png" @click="handlePause" v-else/>
+            </div>
+            <img src="@/assets/images/search/next.png"/>
+          </div>
+          <div class="pltit txr">
+            <div class="tit">10:47:56</div>
+            <div class="txt">2025.06.13</div>
+          </div>
+        </div>
+      </div>
+      <!-- <div v-if="!playerLoading" class="vjs-custom-controls">
+        <button class="vjs-custom-button" @click="replay" title="重播">↻</button>
+
+        <button class="vjs-custom-button" @click="zoomOut" title="缩小">-</button>
+        <span class="vjs-zoom-level">{{ zoomPercentage }}%</span>
+        <button class="vjs-custom-button" @click="zoomIn" title="放大">+</button>
+
+        <div class="vjs-progress-container" @click="seek">
+          <div class="vjs-progress-bar">
+            <div class="vjs-progress-filled" :style="{ width: progressPercentage + '%' }"></div>
+          </div>
+        </div>
+
+        <select class="vjs-speed-selector" v-model="playbackRate" @change="changeSpeed" title="播放速度">
+          <option v-for="speed in speeds" :key="speed.value" :value="speed.value">{{ speed.text }}</option>
+        </select>
+
+        <button class="vjs-custom-button" @click="takeScreenshot" title="截图">📷</button>
+        <button class="vjs-custom-button" @click="toggleFullscreen" title="全屏">⛶</button>
+      </div> -->
+    </div>
+  </div>
+</template>
+
+<script>
+import videojs from 'video.js'
+import 'video.js/dist/video-js.css'
+import html2canvas from 'html2canvas'
+
+export default {
+  name: 'VideoPlayer',
+  props: {
+    src: {
+      type: String,
+      required: true
+    },
+    poster: {
+      type: String,
+      default: ''
+    },
+    options: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data() {
+    return {
+      player: null,
+      paly:false,
+      playerLoading: true,
+      zoomLevel: 1,
+      minZoom: 0.5,
+      maxZoom: 1.5,
+      zoomStep: 0.25,
+      playbackRate: 1,
+      stepsactive:3,
+      speeds: [
+        { value: 0.5, text: '0.5x' },
+        { value: 0.75, text: '0.75x' },
+        { value: 1, text: '1x' },
+        { value: 1.25, text: '1.25x' },
+        { value: 1.5, text: '1.5x' },
+        { value: 2, text: '2x' }
+      ],
+      progressPercentage: 0
+    }
+  },
+  computed: {
+    zoomPercentage() {
+      return Math.round(this.zoomLevel * 100)
+    }
+  },
+  mounted() {
+    this.initPlayer()
+  },
+  beforeDestroy() {
+    if (this.player) {
+      this.player.dispose()
+    }
+  },
+  methods: {
+    togglePlay() {
+      if (this.player.paused()) {
+        this.player.play()
+      } else {
+        this.player.pause()
+      }
+    },
+    handlePlay(){
+      this.player.pause();   // 会触发videoPlay()函数
+    },
+    handlePause(){
+      this.player.play();   // 会触发videoPlay()函数
+    },
+    initPlayer() {
+      const videoElement = this.$refs.videoPlayer
+
+      // 合并默认选项和传入的选项
+      const defaultOptions = {
+        controls: false,
+        autoplay: false,
+        fluid: true,
+        sources: [{
+          src: this.src,
+          type: 'video/mp4'
+        }]
+      }
+
+      const finalOptions = Object.assign({}, defaultOptions, this.options)
+
+      // 初始化播放器
+      this.player = videojs(videoElement, finalOptions, () => {
+        this.playerLoading = false
+
+        // 监听时间更新事件来更新进度条
+        this.player.on('timeupdate', this.updateProgress)
+
+        // 监听全屏变化
+        this.player.on('fullscreenchange', () => {
+          if (!this.player.isFullscreen()) {
+            this.resetZoom()
+          }
+        })
+      })
+    },
+
+    updateProgress() {
+      if (this.player.duration()) {
+        this.progressPercentage = (this.player.currentTime() / this.player.duration()) * 100
+      }
+    },
+
+    seek(event) {
+      if (!this.player) return
+
+      const progressBar = event.currentTarget
+      const percent = event.offsetX / progressBar.offsetWidth
+      this.player.currentTime(this.player.duration() * percent)
+    },
+
+    replay() {
+      this.player.currentTime(0)
+      this.player.play()
+    },
+
+    zoomIn() {
+      if (this.zoomLevel < this.maxZoom) {
+        this.zoomLevel += this.zoomStep
+        this.stepsactive++
+        this.applyZoom()
+      }
+    },
+
+    zoomOut() {
+      if (this.zoomLevel > this.minZoom) {
+        this.zoomLevel -= this.zoomStep
+        this.stepsactive--
+        this.applyZoom()
+      }
+    },
+
+    applyZoom() {
+      const videoElement = this.$refs.videoPlayer
+      if (videoElement) {
+        videoElement.style.transform = `scale(${this.zoomLevel})`
+        videoElement.style.transformOrigin = 'center center'
+      }
+    },
+
+    resetZoom() {
+      this.zoomLevel = 1
+      const videoElement = this.$refs.videoPlayer
+      if (videoElement) {
+        videoElement.style.transform = 'none'
+      }
+    },
+
+    changeSpeed() {
+      this.player.playbackRate(this.playbackRate)
+    },
+    takeScreenshot() {
+      const videoElement = this.$refs.videoPlayer
+      // videoElement.setAttribute("crossOrigin", "anonymous"); // 处理跨域
+      // 		video.setAttribute("src", url);
+      // 		// 静音操作,防止播放失败
+      // 		video.setAttribute("muted", "muted");
+      // 创建一个canvas来绘制视频帧
+      const canvas = document.createElement('canvas')
+      canvas.width = videoElement.videoWidth
+      canvas.height = videoElement.videoHeight
+      const ctx = canvas.getContext('2d')
+      ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height)
+      // 创建下载链接
+      const link = document.createElement('a')
+      link.download = `screenshot-${new Date().getTime()}.png`
+      link.href = canvas.toDataURL('image/png')
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link)
+
+      // 或者使用html2canvas捕获整个播放器
+      // html2canvas(this.$refs.videoContainer).then(canvas => {
+      //   const link = document.createElement('a')
+      //   link.download = `screenshot-${new Date().getTime()}.png`
+      //   link.href = canvas.toDataURL('image/png')
+      //   link.click()
+      // })
+    },
+
+    toggleFullscreen() {
+      if (this.player.isFullscreen()) {
+        this.player.exitFullscreen()
+      } else {
+        this.player.requestFullscreen()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.flex{display: flex;}
+.flex0{flex: 0 0 auto;}
+.flex1{flex: 1;}
+.flexc{display: flex;align-items: center;}
+.flexcc{display: flex;align-items: center;justify-content: center;}
+.flexcj{display: flex;justify-content: space-between;}
+.lcfbox{position: absolute;left: 17px;right: 17px;bottom: 15px;
+      .lcbox{background: rgba(0, 0, 0, 0.5);border-radius: 10px;padding: 10px 12px;display: inline-block;margin-bottom: 13px;
+        .tit{font-size: 14px;color: #FFFFFF;margin-bottom: 6px;}
+        .txt{font-weight: bold;font-size: 14px;color: #FFFFFF;}
+      }
+      .bigbox{background: rgba(0, 0, 0, 0.5);border-radius: 10px;padding: 6px 19px;min-height: 30px;margin-bottom: 12px;
+        img{width: 17px;height: 17px;margin-left: 11px;}
+      }
+      .playbox{min-height: 60px;padding: 9px 18px 9px 28px;
+        background: rgba(255, 255, 255, 0.8);display: flex;align-items: center;
+        .pltit{
+          .tit{font-size: 18px;color: #3D455B;margin-bottom: 3px;}
+          .txt{font-size: 12px;color: #666666;}
+        }
+        .playbtn{
+          .pre{width: 18px;height: 20px;}
+          .playb{width: 36px;height: 36px;margin: 0 29px;
+            img{width: 100%;height: 100%;}
+          }
+        }
+      }
+    }
+.custom-dot-steps {margin-left: 13px;width: 82px;position: relative;display: flex;align-items: center;justify-content: space-between;}
+
+.custom-dot-steps::before {content: '';position: absolute;top: 50%;left: 0;right: 0;height: 2px;background: #FFFFFF;transform: translateY(-50%);z-index: 1;}
+
+.step-dot {width: 4px;height: 4px;border-radius: 50%;background: #FFFFFF;position: relative;
+  &.active{width: 8px;height: 8px;}
+}
+.video-player-container {
+  position: relative;
+  width: 100%;height: 100%;
+  /* max-width: 800px;
+  margin: 0 auto; */
+}
+
+.video-container {
+  width: 100%;height: 100%;
+  position: relative;
+  overflow: hidden;
+}
+
+.video-js {
+  width: 100%;
+  height: 100% !important;
+  padding-top: 50% !important;
+  box-sizing: border-box;
+  background-color: #000;
+  transition: transform 0.3s ease;
+}
+
+.vjs-custom-controls {
+  display: flex;
+  align-items: center;
+  padding: 0 10px;
+  background: rgba(0, 0, 0, 0.7);
+  position: absolute;
+  bottom: 150px;
+  left: 0;
+  right: 0;
+  z-index: 1;
+}
+
+.vjs-custom-button {
+  background: none;
+  border: none;
+  color: white;
+  cursor: pointer;
+  font-size: 16px;
+  margin: 0 5px;
+  padding: 5px 10px;
+}
+
+.vjs-custom-button:hover {
+  color: #00a8ff;
+}
+
+.vjs-progress-container {
+  flex-grow: 1;
+  margin-bottom:14px;
+  cursor: pointer;
+}
+
+.vjs-progress-bar {
+  height: 8px;
+  border-radius:4px;
+  background: rgba(0, 0, 0, 0.5);
+  position: relative;
+}
+
+.vjs-progress-filled {
+  height: 100%;border-radius: 4px;
+  background: red;position: relative;
+  img{width: 24px;height: 24px;position: absolute;right: -6px;top: -8px;}
+}
+
+.vjs-speed-selector {
+  background: rgba(0, 0, 0, 0.8);
+  color: white;
+  border: none;
+  padding: 5px;
+  margin: 0 5px;
+  cursor: pointer;
+}
+
+.vjs-zoom-level {
+  color: white;
+  margin: 0 5px;
+  min-width: 40px;
+  text-align: center;
+}
+</style>

+ 4 - 2
ruoyi-ui/src/components/jiansuo/index.vue

@@ -8,7 +8,7 @@
               <div slot="dot" class="sidx" :class="index==list.length-1?'act':''">
                      {{Number(index)+1}}
               </div>
-              <div class="trlist flexc">
+              <div class="trlist flexc" @click="getDetail(activity)">
                 <img src="@/assets/images/profile.jpg" class="limg flex0"/>
                 <div class="flex1 trlbox">
                   <div class="flexc">
@@ -57,7 +57,9 @@ export default {
     // this.initConnect()
   },
   methods: {
-
+      getDetail(ite){
+        this.$emit('getDetail',ite)
+      }
   },
 };
 </script>

+ 32 - 61
ruoyi-ui/src/views/shipinggaoj/jiansuo/detail.vue

@@ -106,43 +106,27 @@
       </el-col>
       <el-col :span="18" class="jsright">
         <div class="jsbox flex1">
-          <!-- <div class="videos"></div> -->
-          <video ref="videoPlayer"
-    id="videoElement" :src="videourl" class="videos"></video>
-          <!--  -->
+          <div style="height: 100%;width: 100%;">
+            <!-- poster="your-poster.jpg" -->
+           <VideoPlayer
+                  :src="videourl"
+                  :options="{
+                    autoplay: false,
+                    controls: false,
+                    fluid: true
+                  }"
+            />
+          </div>
           <div class="lttit left">4# 中间道路西南侧</div>
           <div class="lttit right">2025-06-13  10:33:24</div>
-          <div class="lcfbox">
-            <div class="lcbox">
-              <div class="tit">下一次可能出现的设备:</div>
-              <div class="txt">1#旁 2号摄像头</div>
-            </div>
-            <div class="playbox">
-              <div class="pltit">
-                <div class="tit">10:32:18</div>
-                <div class="txt">2025.06.13</div>
-              </div>
-              <div class="playbtn flexcc flex1">
-                <img src="../../../assets/images/search/pre.png"/>
-                <div @click="paly=!paly" class="playb">
-                  <img  src="../../../assets/images/search/videob.png" @click="handlePlay"  v-if="paly"/>
-                  <img  src="../../../assets/images/search/videoa.png" @click="handlePause" v-else/>
-                </div>
-                <img src="../../../assets/images/search/next.png"/>
-              </div>
-              <div class="pltit txr">
-                <div class="tit">10:47:56</div>
-                <div class="txt">2025.06.13</div>
-              </div>
-            </div>
-          </div>
+
 
         </div>
         <div class="jsswbox flex0">
-          <el-carousel indicator-position="outside" height="140px" :autoplay="false" arrow="always">
+          <el-carousel indicator-position="outside" height="120px" :autoplay="false" arrow="always">
             <el-carousel-item v-for="item in 2" :key="item">
               <div class="flexc swiper">
-                <div class="imgs act" v-for="ite in 5" :key="ite">
+                <div class="imgs" @click="getChange(ite)" :class="playidx==ite?'act':''" v-for="ite in 5" :key="ite">
                   <img src="../../../assets/images/pic_gjgl_lt.png" />
                   <div class="tit over">相似度 94%</div>
                 </div>
@@ -158,31 +142,29 @@
 </template>
 
 <script>
-  import trackBox from "@/components/jiansuo"
+  import trackBox from "@/components/jiansuo/index"
+  import VideoPlayer from "@/components/jiansuo/VideoPlayer"
   export default {
     components: {
-      trackBox
+      trackBox,VideoPlayer
     },
     data() {
       return {
         loading: false,
         videourl:'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/2minute-demo.mp4',
         paly:false,
+        playidx:1,
         list: [{
           tit: '123'
         }, {
           tit: '123'
-        }, ]
+        }, ],
       }
     },
     methods: {
-
-      handlePlay(){
-        this.$refs.videoPlayer.pause();   // 会触发videoPlay()函数
-      },
-      handlePause(){
-        this.$refs.videoPlayer.play();   // 会触发videoPlay()函数
-      },
+      getChange(idx){
+        this.playidx=idx
+      }
     }
   }
 </script>
@@ -197,6 +179,12 @@
   .el-carousel__arrow--left{left:5px}
   .el-icon-arrow-right:before{font-weight: bold;}
   .el-icon-arrow-left:before{font-weight: bold;}
+  .bigbox {
+    .el-select{
+      .el-input__suffix{display: none;}
+      input{font-weight: 500;background: transparent;font-size: 14px;color: #FFFFFF;width: 40px;padding-right: 0;text-align: right;height: 18px;line-height: 18px;}
+      }
+  }
 }
 p{margin: 0;padding: 0;}
 .mb12{margin-bottom: 12px;}
@@ -206,6 +194,7 @@ p{margin: 0;padding: 0;}
 .flexcc{display: flex;align-items: center;justify-content: center;}
 .flexcdc{display: flex;align-items: center;flex-direction: column;}
 .flexcw{display: flex;align-items: center;flex-wrap: wrap;}
+.flexcj{display: flex;justify-content: space-between;}
 .flex0{flex: 0 0 auto;}
 .flex1{flex: 1;}
 .f16{font-size: 16px;}
@@ -243,35 +232,17 @@ p{margin: 0;padding: 0;}
   }
 }
 .jsright{height: 100%;display: flex;flex-direction: column;overflow: hidden;
-  .jsbox{background: #FFFFFF;border-radius: 10px;position: relative;
+  .jsbox{background: #FFFFFF;border-radius: 10px;position: relative;overflow: hidden;
     .lttit{font-weight: 500;font-size: 18px;color: #FFFFFF;position: absolute;top: 10px;line-height: 24px;
       &.left{left: 24px;}
       &.right{right: 24px;}
     }
 
-    .lcfbox{position: absolute;left: 17px;right: 17px;bottom: 15px;
-      .lcbox{background: rgba(0, 0, 0, 0.5);border-radius: 10px;padding: 10px 12px;display: inline-block;margin-bottom: 13px;
-        .tit{font-size: 14px;color: #FFFFFF;margin-bottom: 6px;}
-        .txt{font-weight: bold;font-size: 14px;color: #FFFFFF;}
-      }
-      .playbox{min-height: 60px;padding: 9px 18px 9px 28px;
-        background: rgba(255, 255, 255, 0.8);display: flex;align-items: center;
-        .pltit{
-          .tit{font-size: 18px;color: #3D455B;margin-bottom: 3px;}
-          .txt{font-size: 12px;color: #666666;}
-        }
-        .playbtn{
-          .pre{width: 18px;height: 20px;}
-          .playb{width: 36px;height: 36px;margin: 0 29px;
-            img{width: 100%;height: 100%;}
-          }
-        }
-      }
-    }
+
 
   }
     .jsswbox{background: #FFFFFF;margin-top: 10px;
-border-radius: 10px;height: 140px;padding: 14px 0px;box-sizing: border-box;}
+border-radius: 10px;height: 146px;padding: 12px 0px;box-sizing: border-box;}
     .swiper{padding: 0 44px;}
     .imgs{position: relative;width: 20%;height: 120px;border-radius: 8px;overflow: hidden;margin-right: 12px;
     &:nth-of-type(5n){margin-right: 0;}

+ 40 - 24
ruoyi-ui/src/views/shipinggaoj/jiansuo/index.vue

@@ -62,7 +62,7 @@
            </div>
          </div>
          <!-- 有数据 轨迹-->
-         <trackBox :list="list" :reverse="reverse"></trackBox>
+         <trackBox :list="list" :reverse="reverse" @getDetail="getDetail"></trackBox>
        </div>
       </el-col>
         <el-col :span="18" class="jsright">
@@ -76,7 +76,8 @@
                   <div class="flexc swiper">
                     <div class="imgs act">
                       <img src="../../../assets/images/pic_gjgl_lt.png"/>
-                      <div class="tit over">园区鸟瞰</div>
+                      <!-- <div class="tit over">园区鸟瞰</div> -->
+                      <div class="tit over">1号轨迹</div>
                     </div>
                     <div class="zhantit">到底啦</div>
                   </div>
@@ -109,15 +110,20 @@
         //标记点的位置信息
               mapData: [
                 {
-                  longitude: '117.211860',
-                  latitude: '31.839696',
-                  type:1
+                  longitude: '117.211954',
+                  latitude: '31.839676',
+                  type:1,
                 },
                 {
-                  longitude: '117.210150',
-                  latitude: '31.839850',
+                  longitude: '117.211021',
+                  latitude: '31.839374',
                   type:2
-                }
+                },
+                {
+                  longitude: '117.211649',
+                  latitude: '31.842398',
+                  type:3
+                },
               ],
       }
     },
@@ -125,6 +131,14 @@
       this.initMap()
     },
     methods:{
+      getDetail(item){
+        this.$router.push({
+          path: '/jiansuodetail',
+          query: {
+          	'id':2,
+          }
+        })
+      },
       initMap() {
       		AMapLoader.reset()
             AMapLoader.load({
@@ -141,8 +155,8 @@
                 // center: [116.310791, 40.003419], //初始化地图中心点位置
                 pitch: 40, // 地图俯仰角度,有效范围 0 度- 83 度
                 terrain: true, // 开启地形图
-
-                buildingAnimation: true,//楼块出现是否带动画
+                resizeEnable: true,
+                // buildingAnimation: true,//楼块出现是否带动画
               });
       		// this.getCenter()
               this.markPoints()
@@ -155,14 +169,14 @@
       // 途径点
       getpoints(){
         var that=this;
-        var driving = new AMap.Driving({
-          map:that.map,
-          // policy: 0, //驾车路线规划策略,0是速度优先的策略
-        });
-        // var driving = new AMap.Walking({
+        // var driving = new AMap.Driving({
         //   map:that.map,
         //   // policy: 0, //驾车路线规划策略,0是速度优先的策略
         // });
+        var driving = new AMap.Walking({
+          map:that.map,
+          // policy: 0, //驾车路线规划策略,0是速度优先的策略
+        });
         // 地址
         // var points = [
         //   { keyword: "合肥市蜀山区时代数码港", city: "合肥" }, //起始点
@@ -180,7 +194,7 @@
           var opts = {
             waypoints: [[117.208859,31.840713]], //途经点参数,最多支持传入16个途经点
           };
-          driving.search(startLngLat, endLngLat, opts, function (status, result) {
+          driving.search(startLngLat, endLngLat, function (status, result) {
             //status:complete 表示查询成功,no_data 为查询无结果,error 代表查询错误
             //查询成功时,result 即为对应的驾车导航信息
           });
@@ -188,22 +202,24 @@
       //遍历显示标记点
       markPoints() {
       	const icona = new AMap.Icon({
-      	        image: require('@/assets/images/search/gjicoa.png'), // 确保路径正确,根据实际情况调整
-      	        // size: new AMap.Size(58, 105), // 图标大小
-      	        // imageSize: new AMap.Size(58, 105) // 图标实际大小,如果图片本身大小与此不符,可以调整此属性以适应图片大小
+      	       image: require('@/assets/images/search/gjicoa.png'), // 确保路径正确,根据实际情况调整
       	});
       	const iconb = new AMap.Icon({
-      	        image: require('@/assets/images/search/gjicob.png'), // 确保路径正确,根据实际情况调整
+      	      image: require('@/assets/images/search/gjicob.png'), // 确保路径正确,根据实际情况调整
       	});
         const iconc = new AMap.Icon({
-                image: require('@/assets/images/search/gjicoc.png'), // 确保路径正确,根据实际情况调整
-      });
+              image: require('@/assets/images/search/gjicoc.png'), // 确保路径正确,根据实际情况调整
+        });
+      var xya=new AMap.Pixel(-51, -28)//103,215
+      var xyb=new AMap.Pixel(-51, -190)//105,217
+      var xyc=new AMap.Pixel(-188, -54)//216,104
         this.mapData.forEach(item => {
           // 创建一个 Marker 实例:
           const marker = new AMap.Marker({
             position: new AMap.LngLat(item.longitude, item.latitude),   // 经纬度对象,也可以是经纬度构成的一维数组[lng, lat]
             icon: item.type == 1 ? icona : item.type == 2 ? iconb : item.type == 3 ? iconc : icona,
-            offset: new AMap.Pixel(-25, -10),
+            offset: item.type == 1 ? xya : item.type == 2 ? xyb : item.type == 3 ? xyc : xya,
+
           });
           // 将创建的点标记添加到已有的地图实例:
           this.map.add(marker);
@@ -280,7 +296,7 @@ p{margin: 0;padding: 0;}
 .jsright{height: 100%;display: flex;flex-direction: column;overflow: hidden;
   .jsbox{background: #FFFFFF;border-radius: 10px;}
     .jsswbox{background: #FFFFFF;margin-top: 10px;
-border-radius: 10px;height: 140px;padding: 14px 0px;box-sizing: border-box;}
+border-radius: 10px;height: 146px;padding: 12px 0px;box-sizing: border-box;}
     .swiper{padding: 0 44px;}
     .imgs{position: relative;width: 20%;height: 120px;border-radius: 8px;overflow: hidden;
       &.act{border: 2px solid #00B278;}