董国庆
2026-04-07 d7e6a0c9b0eb6e7bce08d9b827dddce5b7f446e9
Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/xp-robotaxi-web
1个文件已添加
5个文件已修改
173 ■■■■■ 已修改文件
src/assets/point/mark.png 补丁 | 查看 | 原始文档 | blame | 历史
src/router/routes.static.ts 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/service/api/login.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/assetManagement/vehicleManagement/inventoryVehicle/add.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/geofenceManagement/detail.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/pointManagement/index.vue 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/point/mark.png
src/router/routes.static.ts
@@ -196,7 +196,7 @@
    keepAlive: false,
    pid: 201,
    hide: true, // 不在菜单中显示
     fullScreen: true,
    fullScreen: true,
    activeMenu: '/system/accountPermission/roleManagement',
  },
  {
@@ -475,7 +475,7 @@
    menuType: 'page',
    componentPath: '/businessOperations/geofenceManagement/detail.vue',
    id: 405,
    keepAlive: true,
    keepAlive: false,
    pid: 4,
    hide: true, // 不在菜单中显示
    activeMenu: '/businessOperations/geofenceManagement',
src/service/api/login.ts
@@ -9,7 +9,7 @@
}
export function fetchCaptcha() {
  return request.Get<Service.ResponseResult<any>>('/code')
  return request.Get<Service.ResponseResult<any>>('/account/base/v1/captcha')
}
export function fetchLoginEncrypted(data: login) {
src/views/assetManagement/vehicleManagement/inventoryVehicle/add.vue
@@ -86,7 +86,7 @@
  ],
  vehicleColor: [
    { required: true, message: '请输入车辆颜色', trigger: ['blur', 'input'] },
    { len: 2, message: '车辆颜色长度为2位', trigger: ['blur', 'input'] },
    { len: 3, message: '车辆颜色长度为3位', trigger: ['blur', 'input'] },
    { pattern: /^[\u4E00-\u9FA5a-z]+$/i, message: '车辆颜色仅支持中文和英文', trigger: ['blur', 'input'] },
  ],
  vehiclePhotos: [
@@ -396,7 +396,9 @@
      <!-- 车辆信息 -->
      <n-card :bordered="false" class="section-card">
        <div class="section-header">
          <div class="section-title">车辆信息</div>
          <div class="section-title">
            车辆信息
          </div>
        </div>
        <n-form
          ref="vehicleFormRef"
@@ -412,8 +414,7 @@
              <n-form-item path="vehiclePhotos" :show-label="false">
                <div class="photo-section">
                  <div class="photo-label">
                    <span style="color: #ff4d4f; margin-right: 4px">*</span
                    >车辆照片
                    <span style="color: #ff4d4f; margin-right: 4px">*</span>车辆照片
                  </div>
                  <div class="photo-upload-area">
                    <n-upload
@@ -436,7 +437,7 @@
                      <img
                        src="/src/assets/element-img/upload.png"
                        style="width: 56px; height: 56px"
                      />
                      >
                    </n-upload>
                  </div>
                </div>
@@ -450,7 +451,7 @@
                    margin-right: 6px;
                    margin-top: 3px;
                  "
                />
                >
                <div class="photo-tip">
                  <span>支持jpg/png,</span>
                  <span>大小≤5MB,最多</span>
@@ -515,7 +516,7 @@
                      v-model:value="formModel.vehicleColor"
                      placeholder="请输入"
                      clearable
                      maxlength="2"
                      maxlength="3"
                    />
                  </n-form-item>
                </n-gi>
@@ -562,7 +563,7 @@
                          }"
                          style="width: 16px; height: 16px"
                          alt="arrow"
                        />
                        >
                      </template>
                      <template #empty>
                        <div class="flex-center">
@@ -570,7 +571,7 @@
                            src="/src/assets/element-img/no-data.png"
                            style="width: 50%"
                            alt="no-data"
                          />
                          >
                        </div>
                      </template>
                    </n-select>
@@ -585,7 +586,9 @@
      <!-- 完善信息 -->
      <n-card :bordered="false" class="section-card">
        <div class="section-header">
          <div class="section-title">完善信息</div>
          <div class="section-title">
            完善信息
          </div>
        </div>
        <n-form
          ref="completeInfoFormRef"
@@ -670,7 +673,7 @@
                    :src="getFileIcon(file.name)"
                    alt="file-icon"
                    style="width: 24px; height: 24px"
                  />
                  >
                  <span class="file-name">{{ file.name }}</span>
                  <span class="file-close" @click="removeFile(index, 'inspectionFiles')">×</span>
                </div>
@@ -760,7 +763,7 @@
                          <line x1="12" y1="3" x2="12" y2="15" />
                        </svg>
                      </template>
                       <span style="font-size: 13px;color: #171F26;">点击上传</span>
                      <span style="font-size: 13px;color: #171F26;">点击上传</span>
                    </n-button>
                    <span class="file-upload-hint">仅支持PDF,大小≤5MB,最多上传5个</span>
                  </div>
@@ -781,7 +784,7 @@
                    :src="getFileIcon(file.name)"
                    alt="file-icon"
                    style="width: 24px; height: 24px"
                  />
                  >
                  <span class="file-name">{{ file.name }}</span>
                  <span class="file-close" @click="removeFile(index, 'insuranceFiles')">×</span>
                </div>
@@ -843,7 +846,7 @@
                          <line x1="12" y1="3" x2="12" y2="15" />
                        </svg>
                      </template>
                    <span style="font-size: 13px;color: #171F26;">点击上传</span>
                      <span style="font-size: 13px;color: #171F26;">点击上传</span>
                    </n-button>
                    <span class="file-upload-hint">仅支持PDF,大小≤5MB,最多上传5个</span>
                  </div>
@@ -864,7 +867,7 @@
                    :src="getFileIcon(file.name)"
                    alt="file-icon"
                    style="width: 24px; height: 24px"
                  />
                  >
                  <span class="file-name">{{ file.name }}</span>
                  <span class="file-close" @click="removeFile(index, 'onlineCarLicenseFiles')">×</span>
                </div>
@@ -877,7 +880,9 @@
    <!-- 底部固定按钮 -->
    <div class="form-actions">
      <n-button class="action-btn" @click="handleBack"> 取消 </n-button>
      <n-button class="action-btn" @click="handleBack">
        取消
      </n-button>
      <n-button
        type="primary"
        class="action-btn"
@@ -1181,7 +1186,6 @@
:deep(.n-upload-file-list .n-upload-file:first-child) {
  margin-top: 0;
}
/* 底部固定按钮 */
.form-actions {
src/views/businessOperations/geofenceManagement/detail.vue
@@ -21,12 +21,13 @@
const { VITE_MAP_KEY } = import.meta.env
// 定义地图图标在线链接
const MARK_ICON_RED = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/36c926b7-1e6d-4310-86c2-a71b69dc49b7.png'
const MARK_ICON_GREEN = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/8f048a0f-3c36-4b6e-ae14-77d85bc919bf.png'
const MARK_ICON_RED = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/d8c0a834-069f-4e11-8130-1257d73ef449.png'
const MARK_ICON_GREEN = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/ab2e2d89-ea82-4081-9729-ab212460c375.png'
const LABEL_ICON = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/b6ca5f3e-913b-49a5-a46e-7482b0d05d1a.png'
const MAX_VERTICES = 16 // 最大顶点数限制
const MAX_AREA = 81 // 最大区域面积限制(单位:平方公里)
const INITIAL_ZOOM = 14
// let centerPoint = [104.066301, 30.572961]
let centerPoint = [113.264499, 23.130061]
@@ -1888,6 +1889,29 @@
  })
}
function clampNumber(value: number, min: number, max: number) {
  return Math.max(min, Math.min(max, value))
}
function getMarkerScale() {
  if (!map.value) {
    return 1
  }
  const zoom = typeof map.value.getZoom === 'function' ? map.value.getZoom() : INITIAL_ZOOM
  const scale = 1 + (zoom - INITIAL_ZOOM) * 0.12
  return clampNumber(scale, 0.8, 1.8)
}
function getScaledSize(width: number, height: number) {
  const scale = getMarkerScale()
  return new AMap.Size(Math.round(width * scale), Math.round(height * scale))
}
function getScaledOffset(x: number, y: number) {
  const scale = getMarkerScale()
  return new AMap.Pixel(Math.round(x * scale), Math.round(y * scale))
}
function getPointIconUrl(status: string) {
  const redStatus = ['待测试', '测试中', '测试不通过', '待生效', '已停用', '已失效']
  const greenStatus = ['可运营', '启用中']
@@ -1916,9 +1940,9 @@
      return
    }
    const icon = new AMap.Icon({
      size: new AMap.Size(46, 46),
      size: getScaledSize(24, 24),
      image: getPointIconUrl(point.status),
      imageSize: new AMap.Size(46, 46),
      imageSize: getScaledSize(24, 24),
    })
    const marker = new AMap.Marker({
      position: [point.lon, point.lat],
@@ -1926,7 +1950,7 @@
      // title: point.name,
      map: showPoints ? map : null,
      extData: point,
      offset: new AMap.Pixel(-23, -23),
      offset: getScaledOffset(-20, -20),
    })
    // 添加鼠标移入事件
@@ -2420,14 +2444,14 @@
                      >
                    </template>
                    <template #empty>
                        <div class="flex-center">
                          <img
                            src="/src/assets/element-img/no-data.png"
                            style="width: 50%"
                            alt="no-data"
                          />
                        </div>
                      </template>
                      <div class="flex-center">
                        <img
                          src="/src/assets/element-img/no-data.png"
                          style="width: 50%"
                          alt="no-data"
                        >
                      </div>
                    </template>
                  </n-select>
                </n-form-item>
                <n-form-item label="描述" path="areaDescription">
@@ -2630,14 +2654,14 @@
                              >
                            </template>
                            <template #empty>
                        <div class="flex-center">
                          <img
                            src="/src/assets/element-img/no-data.png"
                            style="width: 50%"
                            alt="no-data"
                          />
                        </div>
                      </template>
                              <div class="flex-center">
                                <img
                                  src="/src/assets/element-img/no-data.png"
                                  style="width: 50%"
                                  alt="no-data"
                                >
                              </div>
                            </template>
                          </n-select>
                        </div>
                      </n-form-item>
@@ -2979,7 +3003,7 @@
                            src="/src/assets/element-img/no-data.png"
                            style="width: 50%"
                            alt="no-data"
                          />
                          >
                        </div>
                      </template>
                    </n-select>
@@ -3010,7 +3034,7 @@
                            src="/src/assets/element-img/no-data.png"
                            style="width: 50%"
                            alt="no-data"
                          />
                          >
                        </div>
                      </template>
                    </n-select>
src/views/businessOperations/pointManagement/index.vue
@@ -9,7 +9,8 @@
import { uploadSingleFile } from '@/utils/upload'
// 定义地图图标在线链接
const MARK_ICON_RED = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/025ade6a-635b-4ec7-9581-2f60eb319862.png'
// const MARK_ICON_RED = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/025ade6a-635b-4ec7-9581-2f60eb319862.png'
const MARK_ICON_RED = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/d8c0a834-069f-4e11-8130-1257d73ef449.png'
const MARK_ICON_GREEN = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/ab2e2d89-ea82-4081-9729-ab212460c375.png'
const MARK_ICON_BLUE = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/73a51310-2871-4c4a-a763-8e1a59a31f50.png'
@@ -675,7 +676,7 @@
        address: currentPoint.value.address,
      }]
    : []
  // 获取当前点位的城市信息,用于限制搜索范围
  if (typeof AMap !== 'undefined') {
    const geocoder = new AMap.Geocoder({ city: '全国' })
@@ -1985,7 +1986,7 @@
    AMap.plugin('AMap.AutoComplete', () => {
      const city = tempMarkerForm.value.city || '全国'
      const autoOptions = {
        city: city,
        city,
        citylimit: !!tempMarkerForm.value.city, // 如果有城市信息,则严格限制在当前城市搜索
        pageSize: 50, // 设置返回结果数量为50
      }
@@ -3066,9 +3067,10 @@
            <!-- 打点或者已打点标识 -->
            <div class="point-info-right" style="flex-shrink: 0">
              <div v-if="point.source === 'api'" class="api-point">
                <img @error="(e) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"
                <img
                  src="/src/assets/point/pointed.png"
                  class="pointed-image"
                  @error="(e) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"
                >
                <div class="api-point-text">
                  已打点
@@ -3091,8 +3093,8 @@
      <!-- 底部新增按钮 -->
      <div
        v-permission="4061"
        v-show="filterExpanded && !isAddingPoint && showLeftContent"
        v-permission="4061"
        class="footer-more"
        @click="toPointList"
      >
@@ -3162,24 +3164,24 @@
                @blur="handleAddressSelectBlur"
                @update:show="handleAddressDropdownVisibleChange"
              >
              <template #arrow>
                <img
                  src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png"
                  class="arrow-icon"
                  :class="{ 'role-select-arrow--open': isAddressDropdownVisible }"
                  style="width: 16px;height: 16px;"
                  alt="arrow"
                >
              </template>
              <template #empty>
                        <div class="flex-center">
                          <img
                            src="/src/assets/element-img/no-data.png"
                            style="width: 50%"
                            alt="no-data"
                          />
                        </div>
                      </template>
                <template #arrow>
                  <img
                    src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png"
                    class="arrow-icon"
                    :class="{ 'role-select-arrow--open': isAddressDropdownVisible }"
                    style="width: 16px;height: 16px;"
                    alt="arrow"
                  >
                </template>
                <template #empty>
                  <div class="flex-center">
                    <img
                      src="/src/assets/element-img/no-data.png"
                      style="width: 50%"
                      alt="no-data"
                    >
                  </div>
                </template>
              </n-select>
            </div>
            <div class="popup-form-row">
@@ -3288,9 +3290,10 @@
        <div class="operate-bottom">
          <div class="operate-card">
            <!-- 定位 -->
            <img @error="(e) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"
            <img
              src="../../../assets/point/location.svg"
              class="location-icon location"
              @error="(e) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"
              @click="handleResetMapCenter"
            >
            <!-- 放大 -->
@@ -3430,9 +3433,10 @@
                  :key="item.id"
                  class="img-item"
                >
                  <img @error="(e) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"
                  <img
                    :src="item.url || 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png'"
                    class="point-img-item"
                    @error="(e) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"
                    @click="handlePreviewImage(item.url)"
                  >
                  <img
@@ -3761,9 +3765,10 @@
                  :key="item.id"
                  class="img-item"
                >
                  <img @error="(e) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"
                    :src="item.url ||'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png'"
                  <img
                    :src="item.url || 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png'"
                    class="point-img-item"
                    @error="(e) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"
                    @click="handlePreviewImage(item.url)"
                  >
                </div>