董国庆
2026-03-26 734f9d3f4fd6bdf9262d8c39afc2bf6bc3bd96cb
修改ui
11个文件已修改
120 ■■■■■ 已修改文件
.trae/skills/通用规范/SKILL.md 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/cruise/parade-plan/add.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/cruise/parade-plan/detail.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/cruise/parade-plan/index.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/cruise/patrol-points/components/SelectPointModal.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/geofenceManagement/detail.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/geofenceManagement/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/openCity/components/TableModal.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/openCity/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/pointManagement/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/pointManagement/list.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.trae/skills/通用规范/SKILL.md
@@ -4,4 +4,4 @@
---
1,如果有页面有table,那么需要给table设置空状态的插槽,参考src\views\businessOperations\geofenceManagement\index.vue 页面的插槽
2,如果有图片,需要设置图片加载失败的默认图片@/assets/element-img/error-img.png。需要注意,图片可能有img和组件的nimage
2,如果有图片,并且图片的路径是变量而不是固定路径或固定地址,需要设置图片加载失败的默认图片@/assets/element-img/error-img.png。需要注意,图片可能有img和组件的nimage
src/views/businessOperations/cruise/parade-plan/add.vue
@@ -261,7 +261,7 @@
                style="border-bottom: 1px solid rgba(23, 31, 38, 0.1); cursor: move" draggable="true"
                @dragstart="handleDragStart(index)" @dragover="handleDragOver" @drop="handleDrop(index)">
                <div class="w-16 flex">
                    <img src="/src/assets/point/union.png" alt="拖动" style="width: 15px; height: 15px" />
                    <img src="/src/assets/point/union.png" alt="拖动" style="width: 15px; height: 15px" @error="(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }" />
                </div>
                <div class="flex-1 text-sm pr-4">
                    {{ point.name }}
src/views/businessOperations/cruise/parade-plan/detail.vue
@@ -582,7 +582,7 @@
                @drop="handleDrop(point.id)"
              >
                <div class="w-16 flex">
                  <img src="/src/assets/point/union.png" alt="拖动" style="width: 15px; height: 15px">
                  <img @error="(e) => { e.target.src = '/src/assets/element-img/error-img.png' }" src="/src/assets/point/union.png" alt="拖动" style="width: 15px; height: 15px">
                </div>
                <div class="flex-1 text-sm pr-4">
                  {{ point.name }}
@@ -766,7 +766,13 @@
              v-model:checked-row-keys="selectedRecords" class="flex-1" :columns="recordColumns" :data="records"
              :loading="recordLoading" :row-key="(row: CruiseOrderRow) => String(row.id)" :scroll-x="1290"
              flex-height
            />
            >
              <template #empty>
                <div class="flex-center">
                  <img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px" @error="(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }">
                </div>
              </template>
            </n-data-table>
            <Pagination
              :count="recordTotal" :page="recordCurrentPage" :page-size="recordPageSize"
              class="robotaxi-pagination mt-12px" @change="handleRecordPaginationChange"
src/views/businessOperations/cruise/parade-plan/index.vue
@@ -234,7 +234,13 @@
          :scroll-x="tableScrollX"
          :header-height="18"
          :row-height="18"
        />
        >
          <template #empty>
            <div class="flex-center">
              <img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px" @error="(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }">
            </div>
          </template>
        </n-data-table>
        <Pagination
          :count="count"
          :page="pageParams.pageNum"
src/views/businessOperations/cruise/patrol-points/components/SelectPointModal.vue
@@ -215,7 +215,13 @@
        :data="listData"
        :loading="loading"
        :row-key="(row: Point) => row.id" 
      />
      >
        <template #empty>
          <div class="flex-center">
            <img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px" @error="(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }">
          </div>
        </template>
      </n-data-table>
      <Pagination
        style="margin-top: 12px;"
        :count="pagination.itemCount"
src/views/businessOperations/geofenceManagement/detail.vue
@@ -1707,7 +1707,7 @@
        // 创建信息窗口显示区域名称
        infoWindow = new AMap.InfoWindow({
          isCustom: true,
          content: `<div class="map-info"><div class="map-info-name">${item.areaName}</div><img class="map-info-icon" src="${LABEL_ICON}" alt="图标"></div>`,
          content: `<div class="map-info"><div class="map-info-name">${item.areaName}</div><img onerror="this.src='/src/assets/element-img/error-img.png'" class="map-info-icon" src="${LABEL_ICON}" alt="图标"></div>`,
          autoMove: false,
        })
@@ -1901,7 +1901,7 @@
    marker.on('mouseover', () => {
      marker.setLabel({
        offset: new AMap.Pixel(0, -5), // 设置文本标注偏移量
        content: `<div class="map-info"><div class="map-info-name">${point.name}</div><img class="map-info-icon" src="${LABEL_ICON}" alt="图标"></div>`, // 设置文本标注内容
        content: `<div class="map-info"><div class="map-info-name">${point.name}</div><img onerror="this.src='/src/assets/element-img/error-img.png'" class="map-info-icon" src="${LABEL_ICON}" alt="图标"></div>`, // 设置文本标注内容
        direction: 'top', // 设置文本标注方位
      })
    })
@@ -2110,8 +2110,7 @@
                  停用
                </template>
              </n-switch>
              <img
                src="../../../assets/geofence/close2.png" class="w-24px h-24px ml-auto cursor-pointer"
              <img src="../../../assets/geofence/close2.png" class="w-24px h-24px ml-auto cursor-pointer"
                @click="onClose"
              >
            </div>
@@ -2376,12 +2375,10 @@
                        v-else v-model:value="item.name" clearable @keydown.enter="item.edit = false"
                        @blur="item.edit = false"
                      />
                      <img
                        v-if="!item.edit && !isEdit" src="../../../assets/geofence/edit.png" class="icon"
                      <img v-if="!item.edit && !isEdit" src="../../../assets/geofence/edit.png" class="icon"
                        @click="item.edit = true"
                      >
                      <img
                        v-if="!isEdit" src="../../../assets/geofence/close.png" class="icon"
                      <img v-if="!isEdit" src="../../../assets/geofence/close.png" class="icon"
                        @click="removeStrategyGroup(item)"
                      >
                    </div>
@@ -2419,8 +2416,7 @@
                            v-model:formatted-value="sub.endTime" format="HH:mm" value-format="HH:mm"
                            placeholder="请选择" clearable :disabled="isEdit" :actions="['now']" :status="sub.endTime ? 'success' : 'error'" @update:value="() => { closeTimePicker(); item.errorMsg = '' }"
                          />
                          <img
                            v-if="!isEdit" src="../../../assets/geofence/del.png"
                          <img v-if="!isEdit" src="../../../assets/geofence/del.png"
                            class="w-[16px] h-[16px] cursor-pointer" @click="removeTimePeriod(item, sub)"
                          >
                        </div>
@@ -2463,20 +2459,18 @@
                    </div>
                  </div>
                  <div class="flex items-center gap-8px">
                    <img
                      v-if="!sub.edit" src="../../../assets/geofence/edit1.png"
                    <img  v-if="!sub.edit" src="../../../assets/geofence/edit1.png"
                      class="w-[16px] h-[16px] cursor-pointer" @click.stop="handleEdit(sub)"
                    >
                    <img v-else-if="sub.edit" src="../../../assets/geofence/editActive.png" class="w-[16px] h-[16px] cursor-pointer">
                    <img
                      src="../../../assets/geofence/del.png" class="w-[16px] h-[16px] cursor-pointer"
                    <img  v-else-if="sub.edit" src="../../../assets/geofence/editActive.png" class="w-[16px] h-[16px] cursor-pointer">
                    <img  src="../../../assets/geofence/del.png" class="w-[16px] h-[16px] cursor-pointer"
                      @click.stop="removeDisallowedArea(sub)"
                    >
                    <n-switch v-model:value="sub.areaStatus" :checked-value="1" :unchecked-value="2" @click.stop />
                  </div>
                </div>
                <div class="addBtn" @click="addDisallowedArea">
                  <img src="../../../assets/geofence/add.png" class="icon">
                  <img  src="../../../assets/geofence/add.png" class="icon">
                  <span>添加禁行区</span>
                </div>
              </div>
@@ -2512,13 +2506,13 @@
    <!-- 图层 -->
    <div class="layer-btn" :class="{ shifted: drawerVisible }" @click="toggleLayer">
      <img v-if="!layerOptions.isActive" src="../../../assets/point/coverage.png" class="operate-icon">
      <img v-else src="../../../assets//point/active-coverage.png" class="operate-icon">
      <img  v-if="!layerOptions.isActive" src="../../../assets/point/coverage.png" class="operate-icon">
      <img  v-else src="../../../assets//point/active-coverage.png" class="operate-icon">
      <div class="operate-text" :style="{ color: layerOptions.isActive ? '#0068FF' : '#171F26' }">
        图层
      </div>
      <img v-if="!layerOptions.isActive" src="../../../assets/point/more.png" class="operate-icon">
      <img v-else src="../../../assets/point/foldUp.png" class="operate-icon">
      <img  v-if="!layerOptions.isActive" src="../../../assets/point/more.png" class="operate-icon">
      <img  v-else src="../../../assets/point/foldUp.png" class="operate-icon">
    </div>
    <!-- 图层弹窗 -->
@@ -2538,11 +2532,11 @@
            </template>
            <div class="flex items-center gap-8px text-12px">
              <span class="flex items-center gap-2px">
                <img src="../../../assets/geofence/successMarker.png" class="w-24px h-24px">
                <img  src="../../../assets/geofence/successMarker.png" class="w-24px h-24px">
                可用点位
              </span>
              <span class="flex items-center gap-2px text-12px">
                <img src="../../../assets/geofence/errorMarker.png" class="w-24px h-24px">
                <img  src="../../../assets/geofence/errorMarker.png" class="w-24px h-24px">
                不可用点位
              </span>
            </div>
@@ -2553,9 +2547,9 @@
    <!-- 定位和放大缩小 -->
    <div class="operate-bottom" :class="{ shifted: drawerVisible }">
      <div class="operate-card">
        <img src="../../../assets/point/location.svg" class="location-icon location" @click="centerMap">
        <img src="../../../assets/point/add.svg" class="location-icon add" @click="addPoint">
        <img src="../../../assets/point/reduce.svg" class="location-icon" @click="reducePoint">
        <img  src="../../../assets/point/location.svg" class="location-icon location" @click="centerMap">
        <img  src="../../../assets/point/add.svg" class="location-icon add" @click="addPoint">
        <img  src="../../../assets/point/reduce.svg" class="location-icon" @click="reducePoint">
      </div>
    </div>
@@ -2596,11 +2590,10 @@
                    v-else v-model:value="item.name" clearable :autofocus="item.edit"
                    style="width: 80%;" @keydown.enter="item.edit = false" @blur="item.edit = false" @click.stop
                  />
                  <img
                    v-if="!item.edit" src="../../../assets/geofence/edit.png" class="icon"
                  <img  v-if="!item.edit" src="../../../assets/geofence/edit.png" class="icon"
                    @click.stop="item.edit = true"
                  >
                  <img src="../../../assets/geofence/close.png" class="icon" @click="removeDisallowedAreaGroup(item)">
                  <img  src="../../../assets/geofence/close.png" class="icon" @click="removeDisallowedAreaGroup(item)">
                </div>
                <div class="flex flex-col gap-8px">
                  <div class="flex items-center flex-wrap gap-8px">
@@ -2649,8 +2642,7 @@
                        :is-hour-disabled="(hour: number) => isDisallowedTimeDisabled(hour, undefined, item, 'end')"
                        :is-minute-disabled="(minute: number, hour: any) => isDisallowedTimeDisabled(hour, minute, item, 'end')"
                      />
                      <img
                        src="../../../assets/geofence/del.png"
                      <img  src="../../../assets/geofence/del.png"
                        class="w-[16px] h-[16px] cursor-pointer" @click="removeDisallowedAreaGroupTimePeriod(item, sub)"
                      >
                    </div>
@@ -2658,7 +2650,7 @@
                      {{ item.errorMsg }}
                    </div>
                    <div class="addTime" @click="addDisallowedAreaGroupTimePeriod(item)">
                      <img src="../../../assets/geofence/add2.png" class="icon">
                      <img  src="../../../assets/geofence/add2.png" class="icon">
                      <span>添加时段</span>
                    </div>
                  </div>
@@ -2666,7 +2658,7 @@
              </div>
            </div>
            <div class="addBtn" @click="addDisallowedAreaGroup">
              <img src="../../../assets/geofence/add.png" class="icon">
              <img  src="../../../assets/geofence/add.png" class="icon">
              <span>添加运营策略组</span>
            </div>
          </div>
src/views/businessOperations/geofenceManagement/index.vue
@@ -154,6 +154,7 @@
      return h('img', {
        src,
        class: 'w-20px h-20px',
        onError: (e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }
      })
    },
  },
@@ -181,6 +182,7 @@
      return h('img', {
        src,
        class: 'w-20px h-20px',
        onError: (e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }
      })
    },
  },
@@ -313,6 +315,7 @@
              class={`arrow-icon ${isElectronicAreaIdOpen.value ? 'arrow-icon--open' : ''}`}
              style={{ width: '16px', height: '16px' }}
              alt="arrow"
              onError={(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }}
            />
          ),
        }}
@@ -483,7 +486,7 @@
        >
          <template #empty>
            <div class="flex-center">
              <img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px">
              <img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px" @error="(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }">
            </div>
          </template>
        </n-data-table>
src/views/businessOperations/openCity/components/TableModal.vue
@@ -213,7 +213,7 @@
            <img
              src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png"
              class="arrow-icon" :class="{ 'arrow-icon--open': isRoleSelectOpen }" style="width: 16px;height: 16px;"
              alt="arrow">
              alt="arrow" @error="(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }">
          </template>
        </n-cascader>
      </n-form-item>
src/views/businessOperations/openCity/index.vue
@@ -185,6 +185,7 @@
              class={`arrow-icon ${isRoleSelectOpen.value ? 'arrow-icon--open' : ''}`}
              style={{ width: '16px', height: '16px' }}
              alt="arrow"
              onError={(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }}
            />
          ),
        }}
@@ -285,7 +286,13 @@
        <n-data-table
          class="flex-1" :columns="columns" :data="listData" :loading="loading" flex-height
          :bordered="false" :scroll-x="1020" :header-height="18" :row-height="18"
        />
        >
          <template #empty>
            <div class="flex-center">
              <img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px" @error="(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }">
            </div>
          </template>
        </n-data-table>
        <Pagination
          :count="count" :page="pageNum" :page-size="pageSize" class="robotaxi-pagination mt-12px"
          @change="changePage"
src/views/businessOperations/pointManagement/index.vue
@@ -3024,7 +3024,7 @@
            <!-- 打点或者已打点标识 -->
            <div class="point-info-right" style="flex-shrink: 0">
              <div v-if="point.source === 'api'" class="api-point">
                <img
                <img @error="(e) => { e.target.src = '/src/assets/element-img/error-img.png' }"
                  src="/src/assets/point/pointed.png"
                  class="pointed-image"
                >
@@ -3222,7 +3222,7 @@
        <div class="operate-bottom">
          <div class="operate-card">
            <!-- 定位 -->
            <img
            <img @error="(e) => { e.target.src = '/src/assets/element-img/error-img.png' }"
              src="../../../assets/point/location.svg"
              class="location-icon location"
              @click="handleResetMapCenter"
@@ -3364,7 +3364,7 @@
                  :key="item.id"
                  class="img-item"
                >
                  <img
                  <img @error="(e) => { e.target.src = '/src/assets/element-img/error-img.png' }"
                    :src="item.url"
                    class="point-img-item"
                    @click="handlePreviewImage(item.url)"
@@ -3695,7 +3695,7 @@
                  :key="item.id"
                  class="img-item"
                >
                  <img
                  <img @error="(e) => { e.target.src = '/src/assets/element-img/error-img.png' }"
                    :src="item.url"
                    class="point-img-item"
                    @click="handlePreviewImage(item.url)"
@@ -3851,7 +3851,7 @@
        @click="closePreview"
      >
        <div class="preview-content">
          <img :src="previewImage" class="preview-image" @click.stop>
          <img :src="previewImage" class="preview-image" @click.stop @error="(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }">
          <div class="preview-close" @click="closePreview">
            <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
              <path
src/views/businessOperations/pointManagement/list.vue
@@ -584,7 +584,13 @@
          :scroll-x="tableScrollX"
          :row-key="(row) => row.id"
          @update:checked-row-keys="handleCheck"
        />
        >
          <template #empty>
            <div class="flex-center">
              <img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px" @error="(e: any) => { e.target.src = '/src/assets/element-img/error-img.png' }">
            </div>
          </template>
        </n-data-table>
        <Pagination
          :count="pagination.itemCount"
          :page="pagination.page"