董国庆
2026-05-11 2afcf172a0bfef66b2243575eb73bb925c463dfc
feat(权限): 为多个页面添加权限控制并更新路由ID

- 在多个视图组件中为按钮和操作添加 v-permission 指令,使用新的权限码
- 更新路由配置中的静态路由ID,与权限码保持一致
- 在认证存储中添加临时权限码列表,确保权限控制生效
- 修复操作工作台列表页面的权限检查逻辑
18个文件已修改
269 ■■■■■ 已修改文件
src/router/routes.static.ts 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/auth.ts 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/assetManagement/vehicleModel/index.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/operationWorkbench/list.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/siteInfo/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/operations/cruiseCheckIn/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/operations/cruiseCheckInDetails/index.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/operations/cruiseCheckInRule/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/operations/taskOrder/pendingReassignment/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/testDemo/geofenceManagement/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/transaction/directServiceManagement/detail.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/transaction/directServiceManagement/index.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/transaction/passwordFreeStrategy/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/userContent/active/activityManagement/index.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/userContent/active/coupon/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/userContent/contentCenter/opsApp.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/userContent/contentCenter/passenger.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/userContent/whitelistManagement/whitelist/index.vue 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/routes.static.ts
@@ -56,7 +56,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/testDemo/geofenceManagement/index.vue',
    id: 93,
    id: 202642974,
    pid: 9,
  },
  {
@@ -81,7 +81,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/testDemo/geofenceManagement/detail.vue',
    id: 95,
    id: 202642975,
    pid: 9,
    hide: true,
    fullScreen: true,
@@ -95,7 +95,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/testDemo/geofenceManagement/detail.vue',
    id: 96,
    id: 202642976,
    pid: 9,
    hide: true,
    fullScreen: true,
@@ -410,7 +410,7 @@
    icon: 'icon-park-outline:file-text',
    menuType: 'page',
    componentPath: '/userContent/contentCenter/passenger.vue',
    id: 3021,
    id: 202642902,
    keepAlive: false,
    pid: 302,
    fullScreen: true,
@@ -423,7 +423,7 @@
    icon: 'icon-park-outline:file-text',
    menuType: 'page',
    componentPath: '/userContent/contentCenter/opsApp.vue',
    id: 3024,
    id: 202642904,
    keepAlive: false,
    pid: 302,
    fullScreen: true,
@@ -448,7 +448,7 @@
    icon: 'icon-park-outline:file-text',
    menuType: 'page',
    componentPath: '/userContent/active/activityManagement/index.vue',
    id: 30232,
    id: 202642909,
    keepAlive: true,
    pid: 3023,
  },
@@ -640,7 +640,7 @@
    icon: 'icon-park-outline:alarm',
    menuType: 'page',
    componentPath: '/businessOperations/operationWorkbench/map.vue',
    id: 4062,
    id: 202642917,
    keepAlive: false,
    pid: 4,
    // hide: true,
@@ -654,7 +654,7 @@
    icon: 'icon-park-outline:alarm',
    menuType: 'page',
    componentPath: '/businessOperations/operationWorkbench/list.vue',
    id: 40621,
    id: 202642918,
    keepAlive: true,
    pid: 4,
    hide: true,
@@ -669,7 +669,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/businessOperations/siteInfo/index.vue',
    id: 4062,
    id: 202642935,
    keepAlive: true,
    pid: 4,
  },
@@ -875,7 +875,7 @@
    icon: 'icon-park-outline:car',
    menuType: 'page',
    componentPath: '/assetManagement/vehicleModel/index.vue',
    id: 504,
    id: 202642939,
    keepAlive: false,
    pid: 5,
  },
@@ -1046,7 +1046,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/transaction/directServiceManagement/index.vue',
    id: 607,
    id: 202642943,
    keepAlive: true,
    pid: 6,
  },
@@ -1103,7 +1103,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/transaction/passwordFreeStrategy/index.vue',
    id: 608,
    id: 202642949,
    keepAlive: true,
    pid: 6,
  },
@@ -1323,7 +1323,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/operations/taskOrder/taskOrderCenter/index.vue',
    id: 7051,
    id: 202642954,
    keepAlive: true,
    pid: 705,
  },
@@ -1335,7 +1335,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/operations/taskOrder/pendingReassignment/index.vue',
    id: 7052,
    id: 202642955,
    keepAlive: true,
    pid: 705,
  },
@@ -1372,7 +1372,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/operations/cruiseCheckInRule/index.vue',
    id: 7062,
    id: 202642960,
    keepAlive: true,
    pid: 7,
  },
@@ -1384,7 +1384,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/operations/cruiseCheckInRule/add.vue',
    id: 7063,
    id: 202642961,
    keepAlive: false,
    pid: 7,
    hide: true, // 不在菜单中显示
@@ -1399,7 +1399,7 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'dir',
    componentPath: null,
    id: 706,
    id: 202642965,
    keepAlive: true,
    pid: 7,
  },
@@ -1411,9 +1411,9 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/operations/cruiseCheckIn/index.vue',
    id: 7061,
    id: 202642966,
    keepAlive: true,
    pid: 706,
    pid: 202642965,
  },
  {
    name: 'cruiseCheckInDetails',
@@ -1423,9 +1423,9 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/operations/cruiseCheckInDetails/index.vue',
    id: 7064,
    id: 202642970,
    keepAlive: true,
    pid: 706,
    pid: 202642965,
  },
  {
    name: 'cruiseCheckInDetailInfo',
@@ -1435,9 +1435,9 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/operations/cruiseCheckInDetails/detail.vue',
    id: 7065,
    id: 202642971,
    keepAlive: false,
    pid: 706,
    pid: 202642965,
    hide: true, // 不在菜单中显示
    activeMenu: '/operations/cruiseCheckInManagement/cruiseCheckInDetails',
    fullScreen: true,
@@ -1450,9 +1450,9 @@
    icon: 'icon-park-outline:list-view',
    menuType: 'page',
    componentPath: '/operations/cruiseCheckInStatistics/index.vue',
    id: 7066,
    id: 202642973,
    keepAlive: true,
    pid: 706,
    pid: 202642965,
  },
  // 新增页面--任务工单
  {
src/store/auth.ts
@@ -4,6 +4,93 @@
import { useRouteStore } from './router'
import { useTabStore } from './tab'
// 临时补充权限,待服务端正式下发后删除。
const TEMP_PERMISSION_CODES = [
  '202642901',
  '202642902',
  '202642903',
  '202642904',
  '202642905',
  '202642906',
  '202642907',
  '202642908',
  '202642909',
  '202642910',
  '202642911',
  '202642912',
  '202642913',
  '202642914',
  '202642915',
  '202642916',
  '202642917',
  '202642918',
  '202642919',
  '202642920',
  '202642921',
  '202642922',
  '202642923',
  '202642924',
  '202642925',
  '202642926',
  '202642927',
  '202642928',
  '202642929',
  '202642930',
  '202642931',
  '202642932',
  '202642933',
  '202642934',
  '202642935',
  '202642936',
  '202642937',
  '202642938',
  '202642939',
  '202642940',
  '202642941',
  '202642942',
  '202642943',
  '202642944',
  '202642945',
  '202642946',
  '202642947',
  '202642948',
  '202642949',
  '202642950',
  '202642951',
  '202642952',
  '202642953',
  '202642954',
  '202642955',
  '202642956',
  '202642957',
  '202642958',
  '202642959',
  '202642960',
  '202642961',
  '202642962',
  '202642963',
  '202642964',
  '202642965',
  '202642966',
  '202642967',
  '202642968',
  '202642969',
  '2026429691',
  '202642970',
  '202642971',
  '202642972',
  '202642973',
  '202642974',
  '202642975',
  '202642976',
  '202642977',
  '202642978',
] as const
function mergeTempPermissions(permissions: string[] = []) {
  return Array.from(new Set([...permissions.map(String), ...TEMP_PERMISSION_CODES]))
}
interface AuthStatus {
  userInfo: Entity.User | null
  token: string
@@ -14,7 +101,7 @@
    return {
      userInfo: local.get('userInfo'),
      token: local.get('accessToken') || '',
      permissions: local.get('permissions') || [],
      permissions: mergeTempPermissions(local.get('permissions') || []),
    }
  },
  getters: {
@@ -71,13 +158,15 @@
    /* 处理登录返回的数据 */
    async handleLoginInfo(data: Api.Login.Info) {
      const permissions = mergeTempPermissions(data.info.permissions || [])
      // 将token和userInfo保存下来
      local.set('userInfo', data.info.sysUser)
      local.set('accessToken', data.token.access_token)
      local.set('permissions', data.info.permissions)
      local.set('permissions', permissions)
      this.token = data.token.access_token
      this.userInfo = data.info.sysUser
      this.permissions = data.info.permissions
      this.permissions = permissions
      // 添加路由和菜单
      const routeStore = useRouteStore()
src/views/assetManagement/vehicleModel/index.vue
@@ -86,6 +86,7 @@
      return (
        <NSpace wrap={false} size={8}>
          <NButton
            v-permission="202642941"
            text
            type="primary"
            onClick={() => handleEdit(row)}
@@ -95,6 +96,7 @@
          <NButton
            text
            type="primary"
            v-permission="202642942"
            onClick={() => handleDelete(row)}
          >
            删除
@@ -208,6 +210,7 @@
            <NButton
              type="primary"
              secondary
              v-permission="202642940"
              @click="handleAdd"
            >
              新增车型
src/views/businessOperations/operationWorkbench/list.vue
@@ -5,12 +5,14 @@
import { onBeforeRouteLeave, useRoute, useRouter } from 'vue-router'
import dayjs from 'dayjs'
import SearchPanel from '@/components/custom/SearchPanel.vue'
import { useBoolean } from '@/hooks'
import { useBoolean, usePermission } from '@/hooks'
import { copyFence, fetchEnabledOpenCityList, getFenceList } from '@/service/api/operations'
import { deletePoint, enableDisablePoint, exportPointExcel, fetchFenceAndStationAreaList, fetchPointPageList } from '@/service/api/point'
import { deleteStation, fetchStationListByElectronicId, fetchStationPageList, updateStationStatus } from '@/service/api/station'
import { useWorkbenchStore } from '@/store'
import { downloadFile } from '@/utils'
const { hasPermission } = usePermission()
import sortDefault from '@/assets/geofence/sort1.png'
import sortAsc from '@/assets/geofence/sort2.png'
import sortDesc from '@/assets/geofence/sort3.png'
@@ -862,6 +864,8 @@
}
function handlePointToDetail(row: any, type: 'detail' | 'edit') {
  if(type==='detail' && !hasPermission('202642925'))
    return
  const context = buildWorkbenchMapContext('point', type, row)
  workbenchStore.setListContext({
    tab: context.tab,
@@ -879,6 +883,8 @@
}
function handleStationToMap(row: any, type: 'detail' | 'edit') {
  if(type==='detail' && !hasPermission('202642931'))
    return
  const context = buildWorkbenchMapContext('station', type, row)
  workbenchStore.setListContext({
    tab: context.tab,
@@ -1909,10 +1915,10 @@
        render(row) {
          return (
            <NSpace>
              <NButton text type="primary" onClick={() => handleFenceToDetail(row, 'edit')}>
              <NButton v-permission="202642921" text type="primary" onClick={() => handleFenceToDetail(row, 'edit')}>
                编辑
              </NButton>
              <NButton text type="primary" disabled={row.status !== 3} onClick={() => handleFenceCopy(row)}>
              <NButton v-permission="202642922" text type="primary" disabled={row.status !== 3} onClick={() => handleFenceCopy(row)}>
                复制
              </NButton>
            </NSpace>
@@ -2058,17 +2064,17 @@
          const isEnabled = Number(row.status) === 2
          return (
            <NSpace wrap={false}>
              <NButton text type="primary" onClick={() => handleStationToMap(row, 'edit')}>
              <NButton v-permission="202642930" text type="primary" onClick={() => handleStationToMap(row, 'edit')}>
                编辑
              </NButton>
              {isEnabled
                ? (
                    <NButton text type="primary" onClick={() => handleStationDisable(row)}>
                    <NButton v-permission="202642933" text type="primary" onClick={() => handleStationDisable(row)}>
                      停用
                    </NButton>
                  )
                : (
                    <NButton text type="primary" onClick={() => handleStationDelete(row)}>
                    <NButton v-permission="202642932" text type="primary" onClick={() => handleStationDelete(row)}>
                      删除
                    </NButton>
                  )}
@@ -2221,17 +2227,17 @@
        const isEnabled = row.verificationStatus === 5 && row.operationStatus === 2
        return (
          <NSpace wrap={false}>
            <NButton text type="primary" onClick={() => handlePointToDetail(row, 'edit')}>
            <NButton v-permission="202642924" text type="primary" onClick={() => handlePointToDetail(row, 'edit')}>
              编辑
            </NButton>
            {isEnabled
              ? (
                  <NButton text type="primary" onClick={() => handlePointEnableDisable(row)}>
                  <NButton v-permission="202642927" text type="primary" onClick={() => handlePointEnableDisable(row)}>
                    停用
                  </NButton>
                )
              : (
                  <NButton text type="primary" onClick={() => handlePointDelete(row)}>
                  <NButton v-permission="202642926" text type="primary" onClick={() => handlePointDelete(row)}>
                    删除
                  </NButton>
                )}
@@ -2384,6 +2390,7 @@
                已选择{{ checkedRowKeys.length }}条记录
              </span>
              <NButton
                v-permission="202642928"
                :disabled="checkedRowKeys.length === 0"
                @click="handlePointBatchExport"
              >
@@ -2395,6 +2402,7 @@
                已选择 {{ checkedRowKeys.length }} 条记录
              </span>
              <NButton
                v-permission="202642934"
                :disabled="checkedRowKeys.length === 0"
                @click="handleStationBatchExport"
              >
@@ -2404,9 +2412,10 @@
          </n-flex>
          <n-flex align="center">
            <NButton @click="handleBackToMap"> 查看地图视图 </NButton>
            <NButton v-permission="202642919" @click="handleBackToMap"> 查看地图视图 </NButton>
            <NButton
              v-if="activeTab === 'fence'"
              v-permission="202642920"
              type="primary"
              secondary
              @click="handleCreate"
@@ -2417,6 +2426,7 @@
              v-else-if="activeTab === 'point'"
              type="primary"
              secondary
              v-permission="202642923"
              @click="handleCreate"
            >
              新建点位
@@ -2425,12 +2435,14 @@
              v-else-if="activeTab === 'station'"
              trigger="hover"
              :disabled="!stationCreateDisabledReason"
            >
              <template #trigger>
                <span>
                  <NButton
                    type="primary"
                    secondary
                    v-permission="202642929"
                    :disabled="!!stationCreateDisabledReason"
                    @click="handleCreate"
                  >
src/views/businessOperations/siteInfo/index.vue
@@ -198,6 +198,7 @@
      return (
        <NSpace wrap={false}>
          <NButton
            v-permission="202642937"
            text
            type="primary"
            onClick={() => handleToDetail(row)}
@@ -205,8 +206,8 @@
            详情
          </NButton>
          <NButton
            text
            type="primary"
            v-permission="202642938"
            text type="primary"
            onClick={() => handleDelete(row)}
          >
            删除
@@ -429,7 +430,7 @@
        <n-flex justify="space-between" align="center">
          <n-flex align="center">
            <span v-if="checkedRowKeys.length > 0" style="color: rgba(23, 31, 38, 0.6);font-weight: 400;">已选择{{ checkedRowKeys.length }}条记录</span>
            <NButton :disabled="checkedRowKeys.length === 0" @click="handleBatchExport">
            <NButton v-permission="202642936" :disabled="checkedRowKeys.length === 0" @click="handleBatchExport">
              批量导出
            </NButton>
          </n-flex>
src/views/operations/cruiseCheckIn/index.vue
@@ -118,6 +118,7 @@
        <div class="flex items-center justify-start gap-2">
          <span
            class="cursor-pointer"
            v-permission="202642968"
            style={{ color: '#0068FF' }}
            onClick={() => handleEdit(row)}
          >
@@ -125,13 +126,14 @@
          </span>
          <span
            class="cursor-pointer"
            v-permission="202642969"
            style={{ color: '#0068FF' }}
            onClick={() => handleDelete(row)}
          >
            删除
          </span>
          <NSwitch
            v-permission="70214"
           v-permission="2026429691"
            value={row.status}
            checked-value={1}
            unchecked-value={0}
@@ -265,7 +267,7 @@
    <n-card class="flex-1 robotaxi-table-card">
      <template #header>
        <n-flex justify="flex-end">
          <NButton type="primary" secondary @click="handleAdd">
          <NButton v-permission="202642967" type="primary" secondary @click="handleAdd">
            新增巡游打卡地
          </NButton>
        </n-flex>
src/views/operations/cruiseCheckInDetails/index.vue
@@ -136,6 +136,7 @@
        <NButton
          type="primary"
          text
          v-permission="202642971"
          onClick={() => handleViewDetail(row)}
        >
          详情
@@ -333,7 +334,7 @@
    <n-card class="flex-1 robotaxi-table-card">
      <template #header>
        <n-flex justify="flex-end">
          <NButton type="primary" secondary @click="handleExport">
          <NButton v-permission="202642972" type="primary" secondary @click="handleExport">
            导出
          </NButton>
        </n-flex>
src/views/operations/cruiseCheckInRule/index.vue
@@ -86,6 +86,7 @@
        <div class="flex items-center justify-start gap-2">
          <span
            class="cursor-pointer"
            v-permission="202642963"
            style={{ color: '#0068FF' }}
            onClick={() => handleDetail(row)}
          >
@@ -93,6 +94,7 @@
          </span>
          <span
            class="cursor-pointer"
            v-permission="202642964"
            style={{ color: '#0068FF' }}
            onClick={() => handleDelete(row)}
          >
@@ -223,7 +225,7 @@
    <n-card class="flex-1 robotaxi-table-card">
      <template #header>
        <n-flex justify="flex-end">
          <NButton type="primary" secondary @click="handleAdd">
          <NButton v-permission="202642961" type="primary" secondary @click="handleAdd">
            添加巡游打卡规则
          </NButton>
        </n-flex>
src/views/operations/taskOrder/pendingReassignment/index.vue
@@ -390,6 +390,7 @@
          <div class="flex items-center justify-start gap-2">
            <NButton
              text
              v-permission="202642956"
              type="primary"
              onClick={() => handleReassign(row)}
            >
@@ -402,6 +403,7 @@
        <div class="flex items-center justify-start gap-2">
          <NButton
            text
            v-permission="202642957"
            type="primary"
            onClick={() => handleDetail(row)}
          >
@@ -409,6 +411,7 @@
          </NButton>
          <NButton
            text
            v-permission="202642958"
            type="primary"
            onClick={() => handleDelete(row)}
          >
@@ -505,6 +508,7 @@
      <template #header>
        <n-flex justify="flex-end">
          <NButton
            v-permission="202642959"
            @click="handleExport"
          >
            导出
src/views/testDemo/geofenceManagement/index.vue
@@ -1,6 +1,6 @@
<script setup lang="tsx">
import type { DataTableColumns } from 'naive-ui'
import { useBoolean } from '@/hooks'
import { useBoolean, usePermission } from '@/hooks'
import { copyFence, getFenceList } from '@/service/api/copyText'
import { NButton, NSpace, NTag, NTooltip } from 'naive-ui'
import SearchPanel from '@/components/custom/SearchPanel.vue'
@@ -9,6 +9,7 @@
import sortAsc from '@/assets/geofence/sort2.png'
import sortDesc from '@/assets/geofence/sort3.png'
import dayjs from 'dayjs'
const { hasPermission } = usePermission()
const router = useRouter()
const dialog = useDialog()
@@ -78,7 +79,7 @@
                  color: '#0068FF',
                  cursor: 'pointer',
                },
                onClick: () => router.push({
                onClick: () => hasPermission('202642978') && router.push({
                  name: 'testDemoGeofenceDetail',
                  query: {
                    id: row.id,
@@ -195,7 +196,7 @@
        <NSpace>
          <NButton
            text
            v-permission="405"
            v-permission="202642976"
            type="primary"
            onClick={() => handleToDetail(row, 'edit')}
          >
@@ -203,7 +204,7 @@
          </NButton>
          <NButton
            text
            v-permission="403"
            v-permission="202642977"
            type="primary"
            disabled={row.status !== 3}
            onClick={() => {
@@ -495,7 +496,7 @@
    <n-card class="flex-1 robotaxi-table-card">
      <template #header>
        <n-flex v-permission="404" justify="flex-end">
        <n-flex v-permission="202642975" justify="flex-end">
          <NButton type="primary" secondary @click="handleToDetail({}, 'add')">
            新建围栏
          </NButton>
src/views/transaction/directServiceManagement/detail.vue
@@ -156,7 +156,7 @@
        <div class="text-xl font-semibold">
          定向服务详情
        </div>
        <NButton type="primary" secondary class="w-84px" @click="handleEdit">
        <NButton v-permission="202642945" type="primary" secondary class="w-84px" @click="handleEdit">
          编辑
        </NButton>
      </div>
src/views/transaction/directServiceManagement/index.vue
@@ -225,7 +225,7 @@
        <div class="flex items-center justify-start gap-2">
          <NButton
            text
            v-permission="60701"
            v-permission="202642946"
            type="primary"
            onClick={() => handleDetail(row)}
          >
@@ -233,14 +233,14 @@
          </NButton>
          <NButton
            text
            v-permission="60703"
            v-permission="202642947"
            type="primary"
            onClick={() => handleDelete(row)}
          >
            删除
          </NButton>
          <NSwitch
            v-permission="60704"
            v-permission="202642948"
            value={isEnabled}
            onUpdateValue={val => handleToggleStatus(row, val)}
          >
@@ -345,7 +345,7 @@
      <template #header>
        <n-flex justify="flex-end">
          <NButton
            v-permission="60702"
            v-permission="202642944"
            secondary
            type="primary"
            @click="handleAdd"
src/views/transaction/passwordFreeStrategy/index.vue
@@ -167,6 +167,7 @@
        <div class="flex items-center justify-start gap-2">
          <NButton
            text
            v-permission="202642951"
            type="primary"
            onClick={() => handleEdit(row)}
          >
@@ -174,6 +175,7 @@
          </NButton>
          <NButton
            text
            v-permission="202642952"
            type="primary"
            onClick={() => handleDetail(row)}
          >
@@ -181,6 +183,7 @@
          </NButton>
          <NButton
            text
            v-permission="202642953"
            type="primary"
            onClick={() => handleDelete(row)}
          >
@@ -268,6 +271,7 @@
        <n-flex justify="flex-end">
          <NButton
            secondary
            v-permission="202642951"
            type="primary"
            @click="handleAdd"
          >
src/views/userContent/active/activityManagement/index.vue
@@ -288,26 +288,26 @@
    render: (row) => {
      const btns = []
      if (Number(row.status) === 1) {
        btns.push(<NButton text type="primary" onClick={() => handlePublish(row)}>发布</NButton>)
        btns.push(<NButton text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
        btns.push(<NButton text type="primary" onClick={() => handleEdit(row)}>编辑</NButton>)
        btns.push(<NButton text type="primary" onClick={() => handleDelete(row)}>删除</NButton>)
        btns.push(<NButton v-permission="202642914" text type="primary" onClick={() => handlePublish(row)}>发布</NButton>)
        btns.push(<NButton v-permission="202642912" text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
        btns.push(<NButton v-permission="202642911" text type="primary" onClick={() => handleEdit(row)}>编辑</NButton>)
        btns.push(<NButton v-permission="202642913" text type="primary" onClick={() => handleDelete(row)}>删除</NButton>)
      }
      else if (Number(row.status) === 2) {
        btns.push(<NButton text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
        btns.push(<NButton text type="primary" onClick={() => handlePause(row)}>暂停活动</NButton>)
        btns.push(<NButton v-permission="202642912" text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
        btns.push(<NButton v-permission="202642915" text type="primary" onClick={() => handlePause(row)}>暂停活动</NButton>)
      }
      else if (Number(row.status) === 4) {
        btns.push(<NButton text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
        btns.push(<NButton text type="primary" onClick={() => handleResume(row)}>恢复活动</NButton>)
        btns.push(<NButton text type="primary" onClick={() => handleStop(row)}>终止活动</NButton>)
        btns.push(<NButton v-permission="202642912" text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
        btns.push(<NButton v-permission="202642915" text type="primary" onClick={() => handleResume(row)}>恢复活动</NButton>)
        btns.push(<NButton v-permission="202642916" text type="primary" onClick={() => handleStop(row)}>终止活动</NButton>)
      }
      else if (Number(row.status) === 3) {
        btns.push(<NButton text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
        btns.push(<NButton text type="primary" onClick={() => handleDelete(row)}>删除</NButton>)
        btns.push(<NButton v-permission="202642912" text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
        btns.push(<NButton v-permission="202642913" text type="primary" onClick={() => handleDelete(row)}>删除</NButton>)
      }
      else {
        btns.push(<NButton text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
        btns.push(<NButton v-permission="202642912" text type="primary" onClick={() => handleDetail(row)}>详情</NButton>)
      }
      return <NSpace size={8}>{btns}</NSpace>
    },
@@ -351,7 +351,7 @@
    <n-card class="flex-1 robotaxi-table-card">
      <template #header>
        <n-flex justify="flex-end">
          <NButton type="primary" secondary @click="handleAdd">
          <NButton v-permission="202642910" type="primary" secondary @click="handleAdd">
            添加活动
          </NButton>
        </n-flex>
src/views/userContent/active/coupon/index.vue
@@ -276,6 +276,15 @@
        <NButton text type="primary" v-permission="302314" onClick={() => handleDetail(row)}>
          详情
        </NButton>
         <NButton text type="primary" v-permission="202642906" onClick={() => {}}>
          发布
        </NButton>
         <NButton text type="primary" v-permission="202642907" onClick={() => {}}>
          作废
        </NButton>
         <NButton text type="primary" v-permission="202642908" onClick={() => {}}>
          暂停
        </NButton>
        <NButton text type="primary" v-permission="302315" onClick={() => handleDelete(row)}>
          删除
        </NButton>
src/views/userContent/contentCenter/opsApp.vue
@@ -178,7 +178,7 @@
      <n-button style="padding: 8px 24px; border-radius: 4px; font-size: 14px;margin-right: 12px;" @click="handleCancel">
        取消
      </n-button>
      <n-button type="primary" style="padding: 8px 24px; border-radius: 4px; font-size: 14px;" @click="handleSave">
      <n-button v-permission="202642905" type="primary" style="padding: 8px 24px; border-radius: 4px; font-size: 14px;" @click="handleSave">
        保存
      </n-button>
    </div>
src/views/userContent/contentCenter/passenger.vue
@@ -288,7 +288,7 @@
      <n-button style="padding: 8px 24px; border-radius: 4px; font-size: 14px;margin-right: 12px;" @click="handleCancel">
        取消
      </n-button>
      <n-button type="primary" style="padding: 8px 24px; border-radius: 4px; font-size: 14px;" @click="handleSave">
      <n-button v-permission="202642903" type="primary" style="padding: 8px 24px; border-radius: 4px; font-size: 14px;" @click="handleSave">
        保存
      </n-button>
    </div>
src/views/userContent/whitelistManagement/whitelist/index.vue
@@ -246,6 +246,7 @@
        <div class="flex justify-start gap-3">
          {/*  v-permission="20264901" */}
          <span
            v-permission="20264901"
            style={{ color: '#0068FF', cursor: 'pointer' }}
            onClick={() => handleDetail(row)}
          >