mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 02:28:03 +08:00 
			
		
		
		
	refactor: vxe
This commit is contained in:
		| @ -1,5 +1,20 @@ | |||||||
| import request from '@/config/axios' | import request from '@/config/axios' | ||||||
|  |  | ||||||
|  | export interface ApiAccessLogVO { | ||||||
|  |   id: number | ||||||
|  |   traceId: string | ||||||
|  |   userId: string | ||||||
|  |   userType: string | ||||||
|  |   applicationName: string | ||||||
|  |   requestMethod: string | ||||||
|  |   requestParams: string | ||||||
|  |   requestUrl: string | ||||||
|  |   beginTime: string | ||||||
|  |   endTIme: string | ||||||
|  |   duration: string | ||||||
|  |   resultCode: number | ||||||
|  | } | ||||||
|  |  | ||||||
| // 查询列表API 访问日志 | // 查询列表API 访问日志 | ||||||
| export const getApiAccessLogPageApi = (params) => { | export const getApiAccessLogPageApi = (params) => { | ||||||
|   return request.get({ url: '/infra/api-access-log/page', params }) |   return request.get({ url: '/infra/api-access-log/page', params }) | ||||||
|  | |||||||
| @ -1,14 +0,0 @@ | |||||||
| export type ApiAccessLogVO = { |  | ||||||
|   id: number |  | ||||||
|   traceId: string |  | ||||||
|   userId: string |  | ||||||
|   userType: string |  | ||||||
|   applicationName: string |  | ||||||
|   requestMethod: string |  | ||||||
|   requestParams: string |  | ||||||
|   requestUrl: string |  | ||||||
|   beginTime: string |  | ||||||
|   endTIme: string |  | ||||||
|   duration: string |  | ||||||
|   resultCode: number |  | ||||||
| } |  | ||||||
| @ -1,5 +1,23 @@ | |||||||
| import request from '@/config/axios' | import request from '@/config/axios' | ||||||
|  |  | ||||||
|  | export interface ApiErrorLogVO { | ||||||
|  |   id: number | ||||||
|  |   userId: string | ||||||
|  |   userIp: string | ||||||
|  |   userAgent: string | ||||||
|  |   userType: string | ||||||
|  |   applicationName: string | ||||||
|  |   requestMethod: string | ||||||
|  |   requestParams: string | ||||||
|  |   requestUrl: string | ||||||
|  |   exceptionTime: string | ||||||
|  |   exceptionName: string | ||||||
|  |   exceptionStackTrace: string | ||||||
|  |   processUserId: string | ||||||
|  |   processStatus: number | ||||||
|  |   resultCode: number | ||||||
|  | } | ||||||
|  |  | ||||||
| // 查询列表API 访问日志 | // 查询列表API 访问日志 | ||||||
| export const getApiErrorLogPageApi = (params) => { | export const getApiErrorLogPageApi = (params) => { | ||||||
|   return request.get({ url: '/infra/api-error-log/page', params }) |   return request.get({ url: '/infra/api-error-log/page', params }) | ||||||
|  | |||||||
| @ -1,17 +0,0 @@ | |||||||
| export type ApiErrorLogVO = { |  | ||||||
|   id: number |  | ||||||
|   userId: string |  | ||||||
|   userIp: string |  | ||||||
|   userAgent: string |  | ||||||
|   userType: string |  | ||||||
|   applicationName: string |  | ||||||
|   requestMethod: string |  | ||||||
|   requestParams: string |  | ||||||
|   requestUrl: string |  | ||||||
|   exceptionTime: string |  | ||||||
|   exceptionName: string |  | ||||||
|   exceptionStackTrace: string |  | ||||||
|   processUserId: string |  | ||||||
|   processStatus: number |  | ||||||
|   resultCode: number |  | ||||||
| } |  | ||||||
| @ -13,6 +13,7 @@ VXETable.renderer.add('XDataTimePicker', { | |||||||
|       <ElDatePicker |       <ElDatePicker | ||||||
|         v-model={data[field]} |         v-model={data[field]} | ||||||
|         type={content ? (content as any) : 'datetimerange'} |         type={content ? (content as any) : 'datetimerange'} | ||||||
|  |         style="maxWidth: 330px" | ||||||
|         value-format="YYYY-MM-DD HH:mm:ss" |         value-format="YYYY-MM-DD HH:mm:ss" | ||||||
|         range-separator="-" |         range-separator="-" | ||||||
|         start-placeholder={t('common.startTimeText')} |         start-placeholder={t('common.startTimeText')} | ||||||
|  | |||||||
| @ -1,88 +1,74 @@ | |||||||
| import { reactive } from 'vue' | import { reactive } from 'vue' | ||||||
| import { useI18n } from '@/hooks/web/useI18n' |  | ||||||
| import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas' |  | ||||||
| import { DICT_TYPE } from '@/utils/dict' | import { DICT_TYPE } from '@/utils/dict' | ||||||
| const { t } = useI18n() // 国际化 | import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas' | ||||||
|  |  | ||||||
| // CrudSchema | // CrudSchema | ||||||
| const crudSchemas = reactive<CrudSchema[]>([ | const crudSchemas = reactive<VxeCrudSchema>({ | ||||||
|  |   primaryKey: 'id', | ||||||
|  |   primaryType: 'seq', | ||||||
|  |   action: true, | ||||||
|  |   actionWidth: '80px', | ||||||
|  |   columns: [ | ||||||
|     { |     { | ||||||
|     label: t('common.index'), |       title: '链路追踪', | ||||||
|     field: 'id', |  | ||||||
|     type: 'index' |  | ||||||
|   }, |  | ||||||
|   { |  | ||||||
|     label: '链路追踪', |  | ||||||
|       field: 'traceId' |       field: 'traceId' | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '用户编号', |       title: '用户编号', | ||||||
|       field: 'userId', |       field: 'userId', | ||||||
|     search: { |       isSearch: true | ||||||
|       show: true |  | ||||||
|     } |  | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '用户类型', |       title: '用户类型', | ||||||
|       field: 'userType', |       field: 'userType', | ||||||
|       dictType: DICT_TYPE.USER_TYPE, |       dictType: DICT_TYPE.USER_TYPE, | ||||||
|       dictClass: 'number', |       dictClass: 'number', | ||||||
|     search: { |       isSearch: true | ||||||
|       show: true |  | ||||||
|     } |  | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '应用名', |       title: '应用名', | ||||||
|       field: 'applicationName', |       field: 'applicationName', | ||||||
|     search: { |       isSearch: true | ||||||
|       show: true |  | ||||||
|     } |  | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '请求方法名', |       title: '请求方法名', | ||||||
|       field: 'requestMethod' |       field: 'requestMethod' | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '请求地址', |       title: '请求地址', | ||||||
|       field: 'requestUrl', |       field: 'requestUrl', | ||||||
|     search: { |       isSearch: true | ||||||
|       show: true |  | ||||||
|     } |  | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '请求时间', |       title: '请求时间', | ||||||
|       field: 'beginTime', |       field: 'beginTime', | ||||||
|  |       formatter: 'formatDate', | ||||||
|       search: { |       search: { | ||||||
|         show: true, |         show: true, | ||||||
|       component: 'DatePicker', |         itemRender: { | ||||||
|       componentProps: { |           name: 'XDataTimePicker' | ||||||
|         type: 'datetimerange', |  | ||||||
|         valueFormat: 'YYYY-MM-DD HH:mm:ss', |  | ||||||
|         defaultTime: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)] |  | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '执行时长', |       title: '执行时长', | ||||||
|     field: 'duration' |       field: 'duration', | ||||||
|  |       table: { | ||||||
|  |         slots: { | ||||||
|  |           default: 'duration_default' | ||||||
|  |         } | ||||||
|  |       } | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '操作结果', |       title: '操作结果', | ||||||
|       field: 'resultCode', |       field: 'resultCode', | ||||||
|     search: { |       isSearch: true, | ||||||
|       show: true |       table: { | ||||||
|     } |         slots: { | ||||||
|   }, |           default: 'resultCode_default' | ||||||
|   { |  | ||||||
|     label: t('table.action'), |  | ||||||
|     field: 'action', |  | ||||||
|     width: '300px', |  | ||||||
|     form: { |  | ||||||
|       show: false |  | ||||||
|     }, |  | ||||||
|     detail: { |  | ||||||
|       show: false |  | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
| ]) |     } | ||||||
| export const { allSchemas } = useCrudSchemas(crudSchemas) |   ] | ||||||
|  | }) | ||||||
|  | export const { allSchemas } = useVxeCrudSchemas(crudSchemas) | ||||||
|  | |||||||
| @ -1,80 +1,24 @@ | |||||||
| <script setup lang="ts"> |  | ||||||
| import { ref } from 'vue' |  | ||||||
| import dayjs from 'dayjs' |  | ||||||
| import { DICT_TYPE } from '@/utils/dict' |  | ||||||
| import { useTable } from '@/hooks/web/useTable' |  | ||||||
| import { useI18n } from '@/hooks/web/useI18n' |  | ||||||
| import type { ApiAccessLogVO } from '@/api/infra/apiAccessLog/types' |  | ||||||
| import { allSchemas } from './apiAccessLog.data' |  | ||||||
| import * as ApiAccessLogApi from '@/api/infra/apiAccessLog' |  | ||||||
| const { t } = useI18n() // 国际化 |  | ||||||
|  |  | ||||||
| // ========== 列表相关 ========== |  | ||||||
| const { register, tableObject, methods } = useTable<ApiAccessLogVO>({ |  | ||||||
|   getListApi: ApiAccessLogApi.getApiAccessLogPageApi |  | ||||||
| }) |  | ||||||
| const { getList, setSearchParams } = methods |  | ||||||
|  |  | ||||||
| // ========== 详情相关 ========== |  | ||||||
| const detailRef = ref() // 详情 Ref |  | ||||||
| const dialogVisible = ref(false) // 是否显示弹出层 |  | ||||||
| const dialogTitle = ref('') // 弹出层标题 |  | ||||||
|  |  | ||||||
| // 详情操作 |  | ||||||
| const handleDetail = (row: ApiAccessLogVO) => { |  | ||||||
|   // 设置数据 |  | ||||||
|   detailRef.value = row |  | ||||||
|   dialogTitle.value = t('action.detail') |  | ||||||
|   dialogVisible.value = true |  | ||||||
| } |  | ||||||
| // ========== 初始化 ========== |  | ||||||
| getList() |  | ||||||
| </script> |  | ||||||
|  |  | ||||||
| <template> | <template> | ||||||
|   <!-- 搜索工作区 --> |  | ||||||
|   <ContentWrap> |  | ||||||
|     <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" /> |  | ||||||
|   </ContentWrap> |  | ||||||
|   <ContentWrap> |   <ContentWrap> | ||||||
|     <!-- 列表 --> |     <!-- 列表 --> | ||||||
|     <Table |     <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> | ||||||
|       :columns="allSchemas.tableColumns" |       <template #duration_default="{ row }"> | ||||||
|       :selection="false" |  | ||||||
|       :data="tableObject.tableList" |  | ||||||
|       :loading="tableObject.loading" |  | ||||||
|       :pagination="{ |  | ||||||
|         total: tableObject.total |  | ||||||
|       }" |  | ||||||
|       v-model:pageSize="tableObject.pageSize" |  | ||||||
|       v-model:currentPage="tableObject.currentPage" |  | ||||||
|       @register="register" |  | ||||||
|     > |  | ||||||
|       <template #userType="{ row }"> |  | ||||||
|         <DictTag :type="DICT_TYPE.USER_TYPE" :value="row.userType" /> |  | ||||||
|       </template> |  | ||||||
|       <template #beginTime="{ row }"> |  | ||||||
|         <span>{{ dayjs(row.beginTime).format('YYYY-MM-DD HH:mm:ss') }}</span> |  | ||||||
|       </template> |  | ||||||
|       <template #duration="{ row }"> |  | ||||||
|         <span>{{ row.duration + 'ms' }}</span> |         <span>{{ row.duration + 'ms' }}</span> | ||||||
|       </template> |       </template> | ||||||
|       <template #resultCode="{ row }"> |       <template #resultCode_default="{ row }"> | ||||||
|         <span>{{ row.resultCode === 0 ? '成功' : '失败(' + row.resultMsg + ')' }}</span> |         <span>{{ row.resultCode === 0 ? '成功' : '失败(' + row.resultMsg + ')' }}</span> | ||||||
|       </template> |       </template> | ||||||
|       <template #action="{ row }"> |       <template #actionbtns_default="{ row }"> | ||||||
|         <el-button |         <!-- 操作:详情 --> | ||||||
|           link |         <XTextButton | ||||||
|           type="primary" |           preIcon="ep:view" | ||||||
|  |           :title="t('action.detail')" | ||||||
|           v-hasPermi="['infra:api-access-log:query']" |           v-hasPermi="['infra:api-access-log:query']" | ||||||
|           @click="handleDetail(row)" |           @click="handleDetail(row)" | ||||||
|         > |         /> | ||||||
|           <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }} |  | ||||||
|         </el-button> |  | ||||||
|       </template> |       </template> | ||||||
|     </Table> |     </vxe-grid> | ||||||
|   </ContentWrap> |   </ContentWrap> | ||||||
|  |  | ||||||
|   <XModal v-model="dialogVisible" :title="dialogTitle"> |   <XModal v-model="dialogVisible" :title="dialogTitle"> | ||||||
|     <!-- 对话框(详情) --> |     <!-- 对话框(详情) --> | ||||||
|     <Descriptions :schema="allSchemas.detailSchema" :data="detailRef"> |     <Descriptions :schema="allSchemas.detailSchema" :data="detailRef"> | ||||||
| @ -91,3 +35,33 @@ getList() | |||||||
|     </template> |     </template> | ||||||
|   </XModal> |   </XModal> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | <script setup lang="ts"> | ||||||
|  | import { ref } from 'vue' | ||||||
|  | import { useI18n } from '@/hooks/web/useI18n' | ||||||
|  | import { useVxeGrid } from '@/hooks/web/useVxeGrid' | ||||||
|  | import { VxeGridInstance } from 'vxe-table' | ||||||
|  | import { allSchemas } from './apiAccessLog.data' | ||||||
|  | import * as ApiAccessLogApi from '@/api/infra/apiAccessLog' | ||||||
|  | const { t } = useI18n() // 国际化 | ||||||
|  |  | ||||||
|  | // 列表相关的变量 | ||||||
|  | const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref | ||||||
|  | const { gridOptions } = useVxeGrid<ApiAccessLogApi.ApiAccessLogVO>({ | ||||||
|  |   allSchemas: allSchemas, | ||||||
|  |   topActionSlots: false, | ||||||
|  |   getListApi: ApiAccessLogApi.getApiAccessLogPageApi | ||||||
|  | }) | ||||||
|  | // ========== 详情相关 ========== | ||||||
|  | const detailRef = ref() // 详情 Ref | ||||||
|  | const dialogVisible = ref(false) // 是否显示弹出层 | ||||||
|  | const dialogTitle = ref('') // 弹出层标题 | ||||||
|  |  | ||||||
|  | // 详情操作 | ||||||
|  | const handleDetail = (row: ApiAccessLogApi.ApiAccessLogVO) => { | ||||||
|  |   // 设置数据 | ||||||
|  |   detailRef.value = row | ||||||
|  |   dialogTitle.value = t('action.detail') | ||||||
|  |   dialogVisible.value = true | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | |||||||
| @ -1,97 +1,77 @@ | |||||||
| import { reactive } from 'vue' | import { reactive } from 'vue' | ||||||
| import { useI18n } from '@/hooks/web/useI18n' |  | ||||||
| import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas' |  | ||||||
| import { DICT_TYPE } from '@/utils/dict' | import { DICT_TYPE } from '@/utils/dict' | ||||||
| const { t } = useI18n() // 国际化 | import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas' | ||||||
|  |  | ||||||
| // CrudSchema | // CrudSchema | ||||||
| const crudSchemas = reactive<CrudSchema[]>([ | const crudSchemas = reactive<VxeCrudSchema>({ | ||||||
|  |   primaryKey: 'id', | ||||||
|  |   primaryType: 'seq', | ||||||
|  |   action: true, | ||||||
|  |   actionWidth: '300', | ||||||
|  |   columns: [ | ||||||
|     { |     { | ||||||
|     label: t('common.index'), |       title: '链路追踪', | ||||||
|     field: 'id', |       field: 'traceId', | ||||||
|     type: 'index' |       isTable: false | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '链路追踪', |       title: '用户编号', | ||||||
|     field: 'traceId' |  | ||||||
|   }, |  | ||||||
|   { |  | ||||||
|     label: '用户编号', |  | ||||||
|       field: 'userId', |       field: 'userId', | ||||||
|     search: { |       isSearch: true | ||||||
|       show: true |  | ||||||
|     } |  | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '用户类型', |       title: '用户类型', | ||||||
|       field: 'userType', |       field: 'userType', | ||||||
|       dictType: DICT_TYPE.USER_TYPE, |       dictType: DICT_TYPE.USER_TYPE, | ||||||
|     search: { |       isSearch: true | ||||||
|       show: true |  | ||||||
|     } |  | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '应用名', |       title: '应用名', | ||||||
|       field: 'applicationName', |       field: 'applicationName', | ||||||
|     search: { |       isSearch: true | ||||||
|       show: true |  | ||||||
|     } |  | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '请求方法名', |       title: '请求方法名', | ||||||
|       field: 'requestMethod' |       field: 'requestMethod' | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '请求地址', |       title: '请求地址', | ||||||
|       field: 'requestUrl', |       field: 'requestUrl', | ||||||
|     search: { |       isSearch: true | ||||||
|       show: true |  | ||||||
|     } |  | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '异常发生时间', |       title: '异常发生时间', | ||||||
|       field: 'exceptionTime', |       field: 'exceptionTime', | ||||||
|  |       formatter: 'formatDate', | ||||||
|       search: { |       search: { | ||||||
|         show: true, |         show: true, | ||||||
|       component: 'DatePicker', |         itemRender: { | ||||||
|       componentProps: { |           name: 'XDataTimePicker' | ||||||
|         type: 'datetimerange', |  | ||||||
|         valueFormat: 'YYYY-MM-DD HH:mm:ss', |  | ||||||
|         defaultTime: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)] |  | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '异常名', |       title: '异常名', | ||||||
|       field: 'exceptionName' |       field: 'exceptionName' | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '处理状态', |       title: '处理状态', | ||||||
|       field: 'processStatus', |       field: 'processStatus', | ||||||
|       dictType: DICT_TYPE.INFRA_API_ERROR_LOG_PROCESS_STATUS, |       dictType: DICT_TYPE.INFRA_API_ERROR_LOG_PROCESS_STATUS, | ||||||
|       dictClass: 'number', |       dictClass: 'number', | ||||||
|     search: { |       isSearch: true | ||||||
|       show: true |  | ||||||
|     } |  | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '处理人', |       title: '处理人', | ||||||
|     field: 'processUserId' |       field: 'processUserId', | ||||||
|  |       isTable: false | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|     label: '处理时间', |       title: '处理时间', | ||||||
|     field: 'processTime' |       field: 'processTime', | ||||||
|   }, |       formatter: 'formatDate', | ||||||
|   { |       isTable: false | ||||||
|     label: t('table.action'), |  | ||||||
|     field: 'action', |  | ||||||
|     width: '300px', |  | ||||||
|     form: { |  | ||||||
|       show: false |  | ||||||
|     }, |  | ||||||
|     detail: { |  | ||||||
|       show: false |  | ||||||
|     } |     } | ||||||
|   } |   ] | ||||||
| ]) | }) | ||||||
| export const { allSchemas } = useCrudSchemas(crudSchemas) | export const { allSchemas } = useVxeCrudSchemas(crudSchemas) | ||||||
|  | |||||||
| @ -1,119 +1,47 @@ | |||||||
| <script setup lang="ts"> |  | ||||||
| import { ref } from 'vue' |  | ||||||
| import dayjs from 'dayjs' |  | ||||||
| import { DICT_TYPE } from '@/utils/dict' |  | ||||||
| import { useTable } from '@/hooks/web/useTable' |  | ||||||
| import { useI18n } from '@/hooks/web/useI18n' |  | ||||||
| import type { ApiErrorLogVO } from '@/api/infra/apiErrorLog/types' |  | ||||||
| import { allSchemas } from './apiErrorLog.data' |  | ||||||
| import * as ApiErrorLogApi from '@/api/infra/apiErrorLog' |  | ||||||
| import { InfraApiErrorLogProcessStatusEnum } from '@/utils/constants' |  | ||||||
| import { useMessage } from '@/hooks/web/useMessage' |  | ||||||
| const message = useMessage() |  | ||||||
| const { t } = useI18n() // 国际化 |  | ||||||
|  |  | ||||||
| // ========== 列表相关 ========== |  | ||||||
| const { register, tableObject, methods } = useTable<ApiErrorLogVO>({ |  | ||||||
|   getListApi: ApiErrorLogApi.getApiErrorLogPageApi, |  | ||||||
|   exportListApi: ApiErrorLogApi.exportApiErrorLogApi |  | ||||||
| }) |  | ||||||
| const { getList, setSearchParams, exportList } = methods |  | ||||||
|  |  | ||||||
| // ========== 详情相关 ========== |  | ||||||
| const detailRef = ref() // 详情 Ref |  | ||||||
| const dialogVisible = ref(false) // 是否显示弹出层 |  | ||||||
| const dialogTitle = ref('') // 弹出层标题 |  | ||||||
|  |  | ||||||
| // 详情操作 |  | ||||||
| const handleDetail = (row: ApiErrorLogVO) => { |  | ||||||
|   // 设置数据 |  | ||||||
|   detailRef.value = row |  | ||||||
|   dialogTitle.value = t('action.detail') |  | ||||||
|   dialogVisible.value = true |  | ||||||
| } |  | ||||||
| // 异常处理操作 |  | ||||||
| const handleProcessClick = (row: ApiErrorLogVO, processSttatus: number, type: string) => { |  | ||||||
|   message |  | ||||||
|     .confirm('确认标记为' + type + '?', t('common.reminder')) |  | ||||||
|     .then(async () => { |  | ||||||
|       ApiErrorLogApi.updateApiErrorLogPageApi(row.id, processSttatus).then(() => { |  | ||||||
|         message.success(t('common.updateSuccess')) |  | ||||||
|         getList() |  | ||||||
|       }) |  | ||||||
|     }) |  | ||||||
|     .catch(() => {}) |  | ||||||
| } |  | ||||||
| // ========== 初始化 ========== |  | ||||||
| getList() |  | ||||||
| </script> |  | ||||||
|  |  | ||||||
| <template> | <template> | ||||||
|   <!-- 搜索工作区 --> |  | ||||||
|   <ContentWrap> |   <ContentWrap> | ||||||
|     <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" /> |  | ||||||
|   </ContentWrap> |  | ||||||
|   <ContentWrap> |  | ||||||
|     <el-button v-hasPermi="['infra:api-error-log:export']" @click="exportList('错误数据.xls')"> |  | ||||||
|       <Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }} |  | ||||||
|     </el-button> |  | ||||||
|     <!-- 列表 --> |     <!-- 列表 --> | ||||||
|     <Table |     <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> | ||||||
|       :columns="allSchemas.tableColumns" |       <!-- 操作:导出 --> | ||||||
|       :selection="false" |       <template #toolbar_buttons> | ||||||
|       :data="tableObject.tableList" |         <XButton | ||||||
|       :loading="tableObject.loading" |           type="warning" | ||||||
|       :pagination="{ |           preIcon="ep:download" | ||||||
|         total: tableObject.total |           :title="t('action.export')" | ||||||
|       }" |           @click="handleExport()" | ||||||
|       v-model:pageSize="tableObject.pageSize" |         /> | ||||||
|       v-model:currentPage="tableObject.currentPage" |  | ||||||
|       @register="register" |  | ||||||
|     > |  | ||||||
|       <template #userType="{ row }"> |  | ||||||
|         <DictTag :type="DICT_TYPE.USER_TYPE" :value="row.userType" /> |  | ||||||
|       </template> |       </template> | ||||||
|       <template #processStatus="{ row }"> |       <template #duration_default="{ row }"> | ||||||
|         <DictTag :type="DICT_TYPE.INFRA_API_ERROR_LOG_PROCESS_STATUS" :value="row.processStatus" /> |         <span>{{ row.duration + 'ms' }}</span> | ||||||
|       </template> |       </template> | ||||||
|       <template #exceptionTime="{ row }"> |       <template #resultCode_default="{ row }"> | ||||||
|         <span>{{ dayjs(row.exceptionTime).format('YYYY-MM-DD HH:mm:ss') }}</span> |         <span>{{ row.resultCode === 0 ? '成功' : '失败(' + row.resultMsg + ')' }}</span> | ||||||
|       </template> |       </template> | ||||||
|       <template #processTime="{ row }"> |       <template #actionbtns_default="{ row }"> | ||||||
|         <span v-if="row.processTime">{{ |         <!-- 操作:详情 --> | ||||||
|           dayjs(row.processTime).format('YYYY-MM-DD HH:mm:ss') |         <XTextButton | ||||||
|         }}</span> |           preIcon="ep:view" | ||||||
|       </template> |           :title="t('action.detail')" | ||||||
|       <template #action="{ row }"> |           v-hasPermi="['infra:api-access-log:query']" | ||||||
|         <el-button |  | ||||||
|           link |  | ||||||
|           type="primary" |  | ||||||
|           v-hasPermi="['infra:api-error-log:export']" |  | ||||||
|           @click="handleDetail(row)" |           @click="handleDetail(row)" | ||||||
|         > |         /> | ||||||
|           <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }} |         <XTextButton | ||||||
|         </el-button> |           preIcon="ep:cpu" | ||||||
|         <el-button |           title="已处理" | ||||||
|           link |  | ||||||
|           type="primary" |  | ||||||
|           v-if="row.processStatus === InfraApiErrorLogProcessStatusEnum.INIT" |           v-if="row.processStatus === InfraApiErrorLogProcessStatusEnum.INIT" | ||||||
|           v-hasPermi="['infra:api-error-log:update-status']" |           v-hasPermi="['infra:api-error-log:update-status']" | ||||||
|           @click="handleProcessClick(row, InfraApiErrorLogProcessStatusEnum.DONE, '已处理')" |           @click="handleProcessClick(row, InfraApiErrorLogProcessStatusEnum.DONE, '已处理')" | ||||||
|         > |         /> | ||||||
|           <Icon icon="ep:cpu" class="mr-1px" /> 已处理 |         <XTextButton | ||||||
|         </el-button> |           preIcon="ep:mute-notification" | ||||||
|         <el-button |           title="已忽略" | ||||||
|           link |  | ||||||
|           type="primary" |  | ||||||
|           v-if="row.processStatus === InfraApiErrorLogProcessStatusEnum.INIT" |           v-if="row.processStatus === InfraApiErrorLogProcessStatusEnum.INIT" | ||||||
|           v-hasPermi="['infra:api-error-log:update-status']" |           v-hasPermi="['infra:api-error-log:update-status']" | ||||||
|           @click="handleProcessClick(row, InfraApiErrorLogProcessStatusEnum.IGNORE, '已忽略')" |           @click="handleProcessClick(row, InfraApiErrorLogProcessStatusEnum.IGNORE, '已忽略')" | ||||||
|         > |         /> | ||||||
|           <Icon icon="ep:mute-notification" class="mr-1px" /> 已忽略 |  | ||||||
|         </el-button> |  | ||||||
|       </template> |       </template> | ||||||
|     </Table> |     </vxe-grid> | ||||||
|   </ContentWrap> |   </ContentWrap> | ||||||
|  |  | ||||||
|   <XModal v-model="dialogVisible" :title="dialogTitle"> |   <XModal v-model="dialogVisible" :title="dialogTitle"> | ||||||
|     <!-- 对话框(详情) --> |     <!-- 对话框(详情) --> | ||||||
|     <Descriptions :schema="allSchemas.detailSchema" :data="detailRef" /> |     <Descriptions :schema="allSchemas.detailSchema" :data="detailRef" /> | ||||||
| @ -123,3 +51,58 @@ getList() | |||||||
|     </template> |     </template> | ||||||
|   </XModal> |   </XModal> | ||||||
| </template> | </template> | ||||||
|  | <script setup lang="ts"> | ||||||
|  | import { ref } from 'vue' | ||||||
|  | import { useI18n } from '@/hooks/web/useI18n' | ||||||
|  | import { useVxeGrid } from '@/hooks/web/useVxeGrid' | ||||||
|  | import { VxeGridInstance } from 'vxe-table' | ||||||
|  | import { allSchemas } from './apiErrorLog.data' | ||||||
|  | import * as ApiErrorLogApi from '@/api/infra/apiErrorLog' | ||||||
|  | import { InfraApiErrorLogProcessStatusEnum } from '@/utils/constants' | ||||||
|  | import { useMessage } from '@/hooks/web/useMessage' | ||||||
|  | const message = useMessage() | ||||||
|  | const { t } = useI18n() // 国际化 | ||||||
|  |  | ||||||
|  | // ========== 列表相关 ========== | ||||||
|  | const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref | ||||||
|  | const { gridOptions, getList, exportList } = useVxeGrid<ApiErrorLogApi.ApiErrorLogVO>({ | ||||||
|  |   allSchemas: allSchemas, | ||||||
|  |   getListApi: ApiErrorLogApi.getApiErrorLogPageApi, | ||||||
|  |   exportListApi: ApiErrorLogApi.exportApiErrorLogApi | ||||||
|  | }) | ||||||
|  | // ========== 详情相关 ========== | ||||||
|  | const detailRef = ref() // 详情 Ref | ||||||
|  | const dialogVisible = ref(false) // 是否显示弹出层 | ||||||
|  | const dialogTitle = ref('') // 弹出层标题 | ||||||
|  |  | ||||||
|  | // 详情操作 | ||||||
|  | const handleDetail = (row: ApiErrorLogApi.ApiErrorLogVO) => { | ||||||
|  |   // 设置数据 | ||||||
|  |   detailRef.value = row | ||||||
|  |   dialogTitle.value = t('action.detail') | ||||||
|  |   dialogVisible.value = true | ||||||
|  | } | ||||||
|  | // 导出 | ||||||
|  | const handleExport = async () => { | ||||||
|  |   await exportList(xGrid, '错误数据.xls') | ||||||
|  | } | ||||||
|  | // 异常处理操作 | ||||||
|  | const handleProcessClick = ( | ||||||
|  |   row: ApiErrorLogApi.ApiErrorLogVO, | ||||||
|  |   processSttatus: number, | ||||||
|  |   type: string | ||||||
|  | ) => { | ||||||
|  |   message | ||||||
|  |     .confirm('确认标记为' + type + '?', t('common.reminder')) | ||||||
|  |     .then(async () => { | ||||||
|  |       ApiErrorLogApi.updateApiErrorLogPageApi(row.id, processSttatus).then(() => { | ||||||
|  |         message.success(t('common.updateSuccess')) | ||||||
|  |       }) | ||||||
|  |     }) | ||||||
|  |     .finally(async () => { | ||||||
|  |       // 刷新列表 | ||||||
|  |       await getList(xGrid) | ||||||
|  |     }) | ||||||
|  |     .catch(() => {}) | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | |||||||
| @ -45,8 +45,8 @@ const crudSchemas = reactive<VxeCrudSchema>({ | |||||||
|       field: 'createTime', |       field: 'createTime', | ||||||
|       formatter: 'formatDate', |       formatter: 'formatDate', | ||||||
|       isForm: false, |       isForm: false, | ||||||
|       isSearch: true, |  | ||||||
|       search: { |       search: { | ||||||
|  |         show: true, | ||||||
|         itemRender: { |         itemRender: { | ||||||
|           name: 'XDataTimePicker' |           name: 'XDataTimePicker' | ||||||
|         } |         } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 xingyu4j
					xingyu4j