| <template> | 
|   <LoadingLayout :loading="state.loading"> | 
|     <AppContainer> | 
|       <ProTableQueryFilterBar @on-reset="reset"> | 
|         <template #query> | 
|           <QueryFilterItem tip-content="是否成功"> | 
|             <FieldRadio | 
|               v-model="extraParamState.isSuccess" | 
|               :value-enum="[ | 
|                 { label: '成功', value: true }, | 
|                 { label: '失败', value: false }, | 
|               ]" | 
|               buttonStyle | 
|               showAllBtn | 
|               :all-btn-value="null" | 
|               @change="getList()" | 
|             /> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem tip-content="创建时间"> | 
|             <FieldDatePicker | 
|               v-model="extraParamState.createdTime" | 
|               type="daterange" | 
|               range-separator="~" | 
|               start-placeholder="开始时间" | 
|               end-placeholder="结束时间" | 
|               clearable | 
|               @change="getList()" | 
|             ></FieldDatePicker> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <SearchInput | 
|               v-model="extraParamState.createdUser" | 
|               style="width: 260px" | 
|               placeholder="操作人createdUser" | 
|               @on-click-search="getList()" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <SearchInput | 
|               v-model="extraParamState.traceId" | 
|               style="width: 260px" | 
|               placeholder="跟踪Id(traceId)" | 
|               @on-click-search="getList()" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <SearchInput | 
|               v-model="extraParamState.domain" | 
|               style="width: 260px" | 
|               placeholder="域名domain" | 
|               @on-click-search="getList()" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <SearchInput | 
|               v-model="extraParamState.path" | 
|               style="width: 260px" | 
|               placeholder="地址path" | 
|               @on-click-search="getList()" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <SearchInput | 
|               v-model="extraParamState.request" | 
|               style="width: 260px" | 
|               placeholder="请求参数request" | 
|               @on-click-search="getList()" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <SearchInput | 
|               v-model="extraParamState.response" | 
|               style="width: 260px" | 
|               placeholder="响应结果response" | 
|               @on-click-search="getList()" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <SearchInput | 
|               v-model="extraParamState.clientIpAddress" | 
|               style="width: 260px" | 
|               placeholder="客户端IP地址clientIpAddress" | 
|               @on-click-search="getList()" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <SearchInput | 
|               v-model="extraParamState.elapsedMillisecondsMin" | 
|               style="width: 260px" | 
|               placeholder="最小耗时毫秒数elapsedMillisecondsMin" | 
|               @on-click-search="getList()" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|         </template> | 
|       </ProTableQueryFilterBar> | 
|       <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> | 
|         <template #requestHeaders="{ row }"> | 
|           <el-button | 
|             v-if="row.requestHeaders" | 
|             type="primary" | 
|             link | 
|             @click="handleAdd({ json: { requestHeaders: JSON.parse(row.requestHeaders) } })" | 
|             >查看</el-button | 
|           > | 
|         </template> | 
|         <template #request="{ row }"> | 
|           <el-button | 
|             v-if="row.request" | 
|             type="primary" | 
|             link | 
|             @click="handleAdd({ json: { request: JSON.parse(row.request) } })" | 
|             >查看</el-button | 
|           > | 
|         </template> | 
|         <template #responseHeaders="{ row }"> | 
|           <el-button | 
|             v-if="row.responseHeaders" | 
|             type="primary" | 
|             link | 
|             @click="handleAdd({ json: { responseHeaders: JSON.parse(row.responseHeaders) } })" | 
|             >查看</el-button | 
|           > | 
|         </template> | 
|         <template #response="{ row }"> | 
|           <el-button | 
|             v-if="row.response" | 
|             type="primary" | 
|             link | 
|             @click="handleAdd({ json: { response: JSON.parse(row.response) } })" | 
|             >查看</el-button | 
|           > | 
|         </template> | 
|         <template #createdUser="{ row }"> | 
|           <el-button | 
|             v-if="row.createdUser" | 
|             type="primary" | 
|             link | 
|             @click="handleAdd({ json: { createdUser: row.createdUser } })" | 
|             >查看</el-button | 
|           > | 
|         </template> | 
|       </ProTableV2> | 
|       <JsonViewerDialog v-bind="dialogProps" /> | 
|     </AppContainer> | 
|   </LoadingLayout> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
| import { | 
|   ProTableQueryFilterBar, | 
|   SearchInput, | 
|   LoadingLayout, | 
|   AppContainer, | 
|   QueryFilterItem, | 
|   useTable, | 
|   ProTableV2, | 
|   FieldRadio, | 
|   FieldDatePicker, | 
|   useFormDialog, | 
| } from '@bole-core/components'; | 
| import * as logRecordsServices from '@/services/api/logRecords'; | 
| import { ModelValueType } from 'element-plus'; | 
| import { format } from '@/utils'; | 
| import JsonViewerDialog from './components/JsonViewerDialog.vue'; | 
|   | 
| defineOptions({ | 
|   name: 'ResourceLogs', | 
| }); | 
|   | 
| const operationBtnMap: Record<string, OperationBtnType> = { | 
|   detailBtn: { emits: { onClick: (role) => openDialog(role) } }, | 
| }; | 
|   | 
| const { column, operationBtns } = useAccess({ | 
|   operationBtnMap, | 
| }); | 
|   | 
| const BaseState = { | 
|   loading: true, | 
| }; | 
|   | 
| const state = reactive({ ...BaseState }); | 
|   | 
| onMounted(async () => { | 
|   await getList(); | 
|   state.loading = false; | 
| }); | 
|   | 
| const { | 
|   getDataSource: getList, | 
|   proTableProps, | 
|   paginationState, | 
|   extraParamState, | 
|   reset, | 
| } = useTable( | 
|   async ({ pageIndex, pageSize }, extraParamState) => { | 
|     try { | 
|       let params: API.GetResourceLogsQuery = { | 
|         pageModel: { | 
|           rows: pageSize, | 
|           page: pageIndex, | 
|           // orderInput: extraParamState.orderInput, | 
|         }, | 
|         createdUser: extraParamState.createdUser, | 
|         createdTimeBegin: format(extraParamState.createdTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), | 
|         createdTimeEnd: format(extraParamState.createdTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), | 
|         traceId: extraParamState.traceId, | 
|         method: extraParamState.method, | 
|         domain: extraParamState.domain, | 
|         path: extraParamState.path, | 
|         request: extraParamState.request, | 
|         response: extraParamState.response, | 
|         isSuccess: extraParamState.isSuccess, | 
|         clientIpAddress: extraParamState.clientIpAddress, | 
|         elapsedMillisecondsMin: extraParamState.elapsedMillisecondsMin, | 
|       }; | 
|       let res = await logRecordsServices.getResourceLogs(params, { | 
|         showLoading: !state.loading, | 
|       }); | 
|       return res; | 
|     } catch (error) {} | 
|   }, | 
|   { | 
|     defaultExtraParams: { | 
|       createdUser: '', | 
|       traceId: '', | 
|       method: '' as any as EnumResourceMethod, | 
|       domain: '', | 
|       path: '', | 
|       request: '', | 
|       response: '', | 
|       isSuccess: null as any as boolean, | 
|       clientIpAddress: '', | 
|       elapsedMillisecondsMin: null, | 
|       createdTime: [] as unknown as ModelValueType, | 
|       orderInput: [{ property: 'createdTime', order: EnumPagedListOrder.Desc }], | 
|     }, | 
|     columnsRenderProps: { | 
|       createdTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, | 
|       method: { type: 'enum', valueEnum: EnumResourceMethodText }, | 
|       isSuccess: { | 
|         formatter: (row: API.GetResourceLogsQueryResultItem) => { | 
|           return row.isSuccess ? '是' : '否'; | 
|         }, | 
|       }, | 
|     }, | 
|   } | 
| ); | 
|   | 
| const { dialogProps, handleAdd } = useFormDialog({ | 
|   defaultFormParams: { | 
|     json: null, | 
|   }, | 
| }); | 
|   | 
| function openDialog(row: API.GetResourceLogsQueryResultItem) { | 
|   handleAdd({ | 
|     json: { | 
|       requestHeaders: JSON.parse(row.requestHeaders), | 
|       request: JSON.parse(row.request), | 
|       responseHeaders: JSON.parse(row.responseHeaders), | 
|       response: JSON.parse(row.response), | 
|       createdUser: row.createdUser, | 
|     }, | 
|   }); | 
| } | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
| @use '@/style/common.scss' as *; | 
| </style> |