From b15a3c0dc35c6a9c6bea1f0826a69ebaaac5ba0c Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Fri, 10 Oct 2025 14:15:51 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/pages/map/index.vue        |  378 +++++++++++++++++++++++++++++++++++++++--------
 src/pages/login/index.vue      |    2 
 src/static/styles/common.scss  |    5 
 src/static/images/yx.png       |    0 
 src/store/modules/map/index.js |   24 +++
 src/store/index.js             |    3 
 package.json                   |    2 
 src/plugins/ui.js              |   26 ++
 src/static/images/sl.png       |    0 
 9 files changed, 368 insertions(+), 72 deletions(-)

diff --git a/package.json b/package.json
index d17745f..9020a56 100644
--- a/package.json
+++ b/package.json
@@ -141,4 +141,4 @@
       "stylelint --fix"
     ]
   }
-}
+}
\ No newline at end of file
diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue
index caad501..43b650e 100644
--- a/src/pages/login/index.vue
+++ b/src/pages/login/index.vue
@@ -58,7 +58,7 @@
   ).then(res => {
     userStore.setUserInfo(res.data)
     uni.switchTab({
-      url: '/pages/user/index'
+      url: '/'
     })
   })
 }
diff --git a/src/pages/map/index.vue b/src/pages/map/index.vue
index 1fa6657..ba2a595 100644
--- a/src/pages/map/index.vue
+++ b/src/pages/map/index.vue
@@ -1,81 +1,331 @@
 <!-- 地图 -->
 <template>
   <!-- 地图容器 -->
-  <view id="map" class="map" style="width: 100%; height: 80vh"></view>
+  <view class="page-container theme-dark">
+    <view id="map" class="map" :prop="setSelectMapLayerKey" :location="location" :change:prop="leaflet.initLayer"
+      :change:location="leaflet.setView"></view>
+
+    <view class="layer-btn" @click="show = true">
+      <up-icon customPrefix="xyicon" name="tuceng" size="24" color="#000"></up-icon>
+    </view>
+
+    <view class="location-btn" @click="setMapLocation">
+      <up-icon customPrefix="xyicon" name="dingwei" size="24" color="#000"></up-icon>
+    </view>
+
+    <u-input placeholder="搜索" border="surround" v-model="value" @change="change" color="#fff">
+      <template #prefix>
+        <view class="search-left-box">
+          <u-icon color="#fff" name="arrow-left"></u-icon> 地址
+        </view>
+      </template>
+
+      <template #suffix>
+        <view class="search-right-box">
+          <u-icon color="#fff" name="scan"></u-icon>
+        </view>
+      </template>
+    </u-input>
+
+    <up-popup v-model:show="show">
+      <view class="popup-container">
+        <view class="header">
+          <view class="title">图层</view>
+          <view class="close" @click="show = false">
+            <u-icon color="#000" name="close"></u-icon>
+          </view>
+        </view>
+        <view class="content">
+          <view class="layer-box" :class="{on: setSelectMapLayerKey === item.key}" v-for="(item, ind) in layers"
+            :key="ind" @click="setMapLayer(item)">
+            <view class="image">
+              <up-image :src="item.src" width="100%" height="100%"></up-image>
+            </view>
+            <view class="label">{{item.name}}</view>
+          </view>
+        </view>
+      </view>
+    </up-popup>
+  </view>
 </template>
 
 <script setup>
-onShow(() => {
-  // #ifdef APP-PLUS
+  import {
+    useMapStore
+  } from "@/store/index.js"
 
-  // plus.screen.lockOrientation("landscape-primary");
-  // #endif
-});
+  const mapStore = useMapStore()
 
-onHide(() => {
-  // #ifdef APP-PLUS
-  // plus.screen.lockOrientation("portrait-primary");
-  // #endif
-});
+  const layers = [{
+      src: "/static/images/sl.png",
+      name: '标准地图',
+      key: 1,
+    },
+    {
+      src: "/static/images/yx.png",
+      name: '卫星地图',
+      key: 2,
+    }
+  ]
+
+  const show = ref(false)
+
+  const value = ref('')
+
+  const change = () => {
+
+  }
+
+  const setSelectMapLayerKey = computed(() => mapStore.getSelectMapLayerKey)
+  const setMapLayer = (item) => {
+    mapStore.setSelectMapLayerKey(item.key)
+  }
+
+  const location = ref('')
+  const setMapLocation = () => {
+    // 获取定位信息
+    uni.getLocation({
+      type: 'wgs84', // 返回的经纬度是 WGS84 坐标系(适合地图定位)
+      isHighAccuracy: true,
+      success: function(res) {
+        location.value = res
+      },
+      fail: function(err) {
+        console.log('定位失败:', err);
+      }
+    });
+
+  }
+
+
+  onShow(() => {
+    // #ifdef APP-PLUS
+
+    // plus.screen.lockOrientation("landscape-primary");
+    // #endif
+  });
+
+  onHide(() => {
+    // #ifdef APP-PLUS
+    // plus.screen.lockOrientation("portrait-primary");
+    // #endif
+  });
 </script>
 
 <script module="leaflet" lang="renderjs">
-import L from 'leaflet'
-import {
-  onBeforeUnmount,
-  onMounted
-} from 'vue';
+  import L from 'leaflet'
 
-export default {
-  mounted() {
-    var basemapLayer0 = L.tileLayer(
-      'http://t1.tianditu.com/vec_c/wmts?layer=vec&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=e110584a27d506da2740edca951683f4', {
-        maxZoom: 18,
-        minZoom: 1,
-        tileSize: 256,
-        zoomOffset: 1
-      });
-    var basemapLayer1 = L.tileLayer(
-      'http://t1.tianditu.com/cva_c/wmts?layer=cva&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=e110584a27d506da2740edca951683f4', {
-        maxZoom: 18,
-        minZoom: 1,
-        tileSize: 256,
-        zoomOffset: 1
-      });
-    var basemapLayer2 = L.tileLayer(
-      'http://t1.tianditu.com/img_c/wmts?layer=img&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=e110584a27d506da2740edca951683f4', {
-        maxZoom: 18,
-        minZoom: 1,
-        tileSize: 256,
-        zoomOffset: 1
-      });
-    var basemapLayer3 = L.tileLayer(
-      'http://t1.tianditu.com/cia_c/wmts?layer=cia&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=e110584a27d506da2740edca951683f4', {
-        maxZoom: 18,
-        minZoom: 1,
-        tileSize: 256,
-        zoomOffset: 1
-      });
-    var basemap0 = L.layerGroup([basemapLayer0, basemapLayer1]);
-    var basemap1 = L.layerGroup([basemapLayer2, basemapLayer3]);
+  var basemapLayer0 = L.tileLayer(
+    'http://t1.tianditu.com/vec_c/wmts?layer=vec&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=e110584a27d506da2740edca951683f4', {
+      maxZoom: 18,
+      minZoom: 1,
+      tileSize: 256,
+      zoomOffset: 1
+    });
+  var basemapLayer1 = L.tileLayer(
+    'http://t1.tianditu.com/cva_c/wmts?layer=cva&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=e110584a27d506da2740edca951683f4', {
+      maxZoom: 18,
+      minZoom: 1,
+      tileSize: 256,
+      zoomOffset: 1
+    });
+  var basemapLayer2 = L.tileLayer(
+    'http://t1.tianditu.com/img_c/wmts?layer=img&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=e110584a27d506da2740edca951683f4', {
+      maxZoom: 18,
+      minZoom: 1,
+      tileSize: 256,
+      zoomOffset: 1
+    });
+  var basemapLayer3 = L.tileLayer(
+    'http://t1.tianditu.com/cia_c/wmts?layer=cia&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=e110584a27d506da2740edca951683f4', {
+      maxZoom: 18,
+      minZoom: 1,
+      tileSize: 256,
+      zoomOffset: 1
+    });
+  var basemap0 = L.layerGroup([basemapLayer0, basemapLayer1]);
+  var basemap1 = L.layerGroup([basemapLayer2, basemapLayer3]);
 
-    let map = L.map('map', {
-      preferCanvas: true,
-      crs: L.CRS.EPSG4326,
-      layers: [basemap1],
-      zoomControl: false,
-      attributionControl: false,
-      doubleClickZoom: false,
-      editable: true //绘制控件
-    }).setView([25.992338, 114.823254], 13);
+  let map = null
+
+  const layers = [{
+      src: "/static/images/sl.png",
+      name: '标准地图',
+      key: 1,
+      map: basemap0
+    },
+    {
+      src: "/static/images/yx.png",
+      name: '卫星地图',
+      key: 2,
+      map: basemap1
+    }
+  ]
+
+  export default {
+    data() {
+      return {
+        setSelectMapLayerKey: 1
+      }
+    },
+
+    computed: {
+
+    },
+
+    mounted() {
+      this.initMap()
+    },
+
+    methods: {
+      initMap() {
+        if (map) return
+
+        map = L.map('map', {
+          preferCanvas: true,
+          crs: L.CRS.EPSG4326,
+          zoomControl: false,
+          attributionControl: false,
+          doubleClickZoom: false,
+          editable: true //绘制控件
+        }).setView([25.992338, 114.823254], 13);
+      },
+
+      initLayer(value) {
+
+        this.initMap()
+
+        this.$nextTick(() => {
+          map.removeLayer(layers.find(i => i.key === this.setSelectMapLayerKey).map);
+
+          map.addLayer(layers.find(i => i.key === value).map);
+
+          this.setSelectMapLayerKey = value
+        })
+      },
+
+      setView(res) {
+        if (!res) return
+
+        this.initMap()
+
+        this.$nextTick(() => {
+          map.setView([res.latitude, res.longitude], 16, {
+            animate: false // 使用动画过渡
+          });
+        })
+      }
+    }
   }
-}
 </script>
 
-<style scoped>
-/* Leaflet 默认容器要有高度 */
-.map {
-  width: 100%;
-  height: 100%;
-}
+<style lang="scss" scoped>
+  .page-container {
+    position: relative;
+    width: 100%;
+    height: 100%;
+
+    .u-input {
+      position: absolute;
+      left: 16rpx;
+      bottom: 16rpx;
+      width: calc(100% - 32rpx);
+      height: 64rpx;
+      z-index: 999;
+      box-sizing: border-box;
+      background: rgba(0, 0, 0, .4);
+
+      .search-left-box {
+        display: flex;
+        align-items: center;
+        color: $u-main-color;
+      }
+
+      .search-right-box {
+        color: $u-main-color;
+      }
+    }
+
+    .location-btn,
+    .layer-btn {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      position: absolute;
+      right: 16rpx;
+      width: 64rpx;
+      height: 64rpx;
+      background: #fff;
+      z-index: 999;
+      border-radius: 8rpx;
+    }
+
+    .layer-btn {
+      bottom: 176rpx;
+    }
+
+    .location-btn {
+      bottom: 96rpx;
+    }
+  }
+
+  /* Leaflet 默认容器要有高度 */
+  .map {
+    width: 100%;
+    height: 100%;
+  }
+
+  .popup-container {
+    padding: 20rpx;
+    background: #D3D3D3;
+    border-radius: 32rpx 32rpx 0 0;
+
+    .header {
+      padding: 0 20rpx;
+      display: flex;
+      justify-content: space-between;
+      height: 56rpx;
+    }
+
+    .content {
+      padding: 20rpx;
+      display: flex;
+      background: #fff;
+      border-radius: 32rpx;
+
+      .layer-box {
+        margin-left: 16rpx;
+        width: calc(100% / 3);
+
+        &:first-child {
+          margin-left: 0;
+        }
+
+        &.on {
+          .image {
+            border: 1px solid #0055ff;
+          }
+
+          .label {
+            color: #0055ff;
+          }
+        }
+
+        .image {
+          width: 100%;
+          height: 96rpx;
+          border-radius: 16rpx;
+          overflow: hidden;
+          box-sizing: border-box;
+          border: 1px solid transparent;
+        }
+
+        .label {
+          line-height: 48rpx;
+          text-align: center;
+          font-size: 16rpx;
+        }
+      }
+    }
+  }
 </style>
diff --git a/src/plugins/ui.js b/src/plugins/ui.js
index 931ce99..08e097d 100644
--- a/src/plugins/ui.js
+++ b/src/plugins/ui.js
@@ -1,6 +1,8 @@
-import uviewPlus, { setConfig } from "uview-plus"
+import uviewPlus, {
+  setConfig
+} from "uview-plus"
 
-function setupUI (app) {
+function setupUI(app) {
   // 下面的在特殊场景下才需要配置,通常不用配置即可直接使用uview-plus框架。
   // 调用setConfig方法,方法内部会进行对象属性深度合并,可以放心嵌套配置
   // 需要在app.use(uview-plus)之后执行
@@ -8,7 +10,7 @@
     // 修改$u.config对象的属性
     config: {
       // 修改默认单位为rpx,相当于执行 uni.$u.config.unit = 'rpx'
-      unit: "px"
+      unit: "rpx"
     },
     // 修改$u.props对象的属性
     props: {
@@ -21,7 +23,23 @@
     }
   })
 
-  app.use(uviewPlus)
+  app.use(uviewPlus, () => {
+    return {
+      options: {
+        // 修改config对象的属性
+        config: {
+          customIcon: {
+            family: 'xyicon',
+            url: 'https://at.alicdn.com/t/c/font_5036193_7g86rzw8srl.ttf?t=1760003919145'
+          },
+          customIcons: {
+            'tuceng': '\uea2d',
+            'dingwei': '\ue610',
+          },
+        }
+      }
+    }
+  })
 }
 
 export default setupUI
diff --git a/src/static/images/sl.png b/src/static/images/sl.png
new file mode 100644
index 0000000..cf1c6d6
--- /dev/null
+++ b/src/static/images/sl.png
Binary files differ
diff --git a/src/static/images/yx.png b/src/static/images/yx.png
new file mode 100644
index 0000000..4e5d412
--- /dev/null
+++ b/src/static/images/yx.png
Binary files differ
diff --git a/src/static/styles/common.scss b/src/static/styles/common.scss
index e7d2e6c..7ae5e61 100644
--- a/src/static/styles/common.scss
+++ b/src/static/styles/common.scss
@@ -2,4 +2,7 @@
   font-size: $u-font-base;
   color: $u-main-color;
   background-color: $u-bg-color;
-}
\ No newline at end of file
+
+  height: 100%;
+
+}
diff --git a/src/store/index.js b/src/store/index.js
index 53d21a9..bc05f9b 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -5,6 +5,7 @@
 // 导入子模块
 import useAppStore from "./modules/app"
 import useUserStore from "./modules/user"
+import useMapStore from "./modules/map"
 
 // 安装pinia状态管理插件
 function setupStore (app) {
@@ -22,5 +23,5 @@
 }
 
 // 导出模块
-export { useAppStore, useUserStore }
+export { useAppStore, useUserStore, useMapStore }
 export default setupStore
diff --git a/src/store/modules/map/index.js b/src/store/modules/map/index.js
new file mode 100644
index 0000000..bdb51bb
--- /dev/null
+++ b/src/store/modules/map/index.js
@@ -0,0 +1,24 @@
+import {
+  defineStore
+} from 'pinia'
+
+const useMapStore = defineStore('map', {
+  state: () => ({
+    selectMapLayerKey: 1 // 默认展示地图
+  }),
+  actions: {
+    setSelectMapLayerKey(selectMapLayerKey) {
+      this.selectMapLayerKey = selectMapLayerKey
+    },
+  },
+
+  getters: {
+    getSelectMapLayerKey(state) {
+      return state.selectMapLayerKey
+    },
+  },
+
+  persist: true //持久化
+})
+
+export default useMapStore

--
Gitblit v1.9.3