From eb0b661cb59ce88085e5f2a17d5ce42ac8739a0f Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期一, 29 九月 2025 10:01:30 +0800 Subject: [PATCH] feat: 日志 --- src/views/TraceIdLogManage/SmsLogs.vue | 236 ++++++++++++++++++++++++++ src/views/TraceIdLogManage/DbAuditLogs.vue | 1 .eslintrc-auto-import.json | 4 src/views/TraceIdLogManage/ConsoleLogs.vue | 221 ++++++++++++++++++++++++ auto-imports.d.ts | 8 src/constants/logs.ts | 27 +++ 6 files changed, 496 insertions(+), 1 deletions(-) diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index 0fb83b8..58b65b5 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -28,6 +28,7 @@ "EnumClientTypeText": true, "EnumCodeUrlScene": true, "EnumConsoleLogAccess": true, + "EnumConsoleLogAccessText": true, "EnumContractTemplateStatus": true, "EnumContractTemplateStatusText": true, "EnumContractTemplateStatusTextForEnterpriseFilter": true, @@ -55,6 +56,7 @@ "EnumEnterpriseWalletTransactionType": true, "EnumGetEnterpriseEmployeesQuerySignContractStatus": true, "EnumLogLevel": true, + "EnumLogLevelText": true, "EnumMenuType": true, "EnumMenuVisitLevel": true, "EnumOcrAccess": true, @@ -81,8 +83,10 @@ "EnumSettlementCycleText": true, "EnumSmsAccess": true, "EnumSmsAccessText": true, + "EnumSmsAccessTextUseInLogs": true, "EnumSmsAccessTextUseInSms": true, "EnumSmsStatus": true, + "EnumSmsStatusText": true, "EnumTaskCheckReceiveStatus": true, "EnumTaskCheckReceiveStatusText": true, "EnumTaskRecommendStatus": true, diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 9d158b2..2787dce 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -30,6 +30,7 @@ const EnumClientTypeText: typeof import('./src/constants/apiEnumText')['EnumClientTypeText'] const EnumCodeUrlScene: typeof import('./src/constants/apiEnum')['EnumCodeUrlScene'] const EnumConsoleLogAccess: typeof import('./src/constants/apiEnum')['EnumConsoleLogAccess'] + const EnumConsoleLogAccessText: typeof import('./src/constants/logs')['EnumConsoleLogAccessText'] const EnumContractTemplateStatus: typeof import('./src/constants/apiEnum')['EnumContractTemplateStatus'] const EnumContractTemplateStatusText: typeof import('./src/constants/electronSign')['EnumContractTemplateStatusText'] const EnumContractTemplateStatusTextForEnterpriseFilter: typeof import('./src/constants/electronSign')['EnumContractTemplateStatusTextForEnterpriseFilter'] @@ -58,6 +59,7 @@ const EnumEnterpriseWalletTransactionType: typeof import('./src/constants/apiEnum')['EnumEnterpriseWalletTransactionType'] const EnumGetEnterpriseEmployeesQuerySignContractStatus: typeof import('./src/constants/apiEnum')['EnumGetEnterpriseEmployeesQuerySignContractStatus'] const EnumLogLevel: typeof import('./src/constants/apiEnum')['EnumLogLevel'] + const EnumLogLevelText: typeof import('./src/constants/logs')['EnumLogLevelText'] const EnumMenuType: typeof import('./src/constants/apiEnum')['EnumMenuType'] const EnumMenuVisitLevel: typeof import('./src/constants/apiEnum')['EnumMenuVisitLevel'] const EnumOcrAccess: typeof import('./src/constants/apiEnum')['EnumOcrAccess'] @@ -85,8 +87,10 @@ const EnumSettlementCycleText: typeof import('./src/constants/task')['EnumSettlementCycleText'] const EnumSmsAccess: typeof import('./src/constants/apiEnum')['EnumSmsAccess'] const EnumSmsAccessText: typeof import('./src/constants/enterprise')['EnumSmsAccessText'] + const EnumSmsAccessTextUseInLogs: typeof import('./src/constants/logs')['EnumSmsAccessTextUseInLogs'] const EnumSmsAccessTextUseInSms: typeof import('./src/constants/enterprise')['EnumSmsAccessTextUseInSms'] const EnumSmsStatus: typeof import('./src/constants/apiEnum')['EnumSmsStatus'] + const EnumSmsStatusText: typeof import('./src/constants/logs')['EnumSmsStatusText'] const EnumTaskCheckReceiveStatus: typeof import('./src/constants/apiEnum')['EnumTaskCheckReceiveStatus'] const EnumTaskCheckReceiveStatusText: typeof import('./src/constants/task')['EnumTaskCheckReceiveStatusText'] const EnumTaskRecommendStatus: typeof import('./src/constants/apiEnum')['EnumTaskRecommendStatus'] @@ -345,6 +349,7 @@ readonly EnumClientTypeText: UnwrapRef<typeof import('./src/constants/apiEnumText')['EnumClientTypeText']> readonly EnumCodeUrlScene: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumCodeUrlScene']> readonly EnumConsoleLogAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumConsoleLogAccess']> + readonly EnumConsoleLogAccessText: UnwrapRef<typeof import('./src/constants/logs')['EnumConsoleLogAccessText']> readonly EnumContractTemplateStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumContractTemplateStatus']> readonly EnumContractTemplateStatusText: UnwrapRef<typeof import('./src/constants/electronSign')['EnumContractTemplateStatusText']> readonly EnumContractTemplateStatusTextForEnterpriseFilter: UnwrapRef<typeof import('./src/constants/electronSign')['EnumContractTemplateStatusTextForEnterpriseFilter']> @@ -372,6 +377,7 @@ readonly EnumEnterpriseWalletTransactionType: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumEnterpriseWalletTransactionType']> readonly EnumGetEnterpriseEmployeesQuerySignContractStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumGetEnterpriseEmployeesQuerySignContractStatus']> readonly EnumLogLevel: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumLogLevel']> + readonly EnumLogLevelText: UnwrapRef<typeof import('./src/constants/logs')['EnumLogLevelText']> readonly EnumMenuType: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumMenuType']> readonly EnumMenuVisitLevel: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumMenuVisitLevel']> readonly EnumOcrAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumOcrAccess']> @@ -398,8 +404,10 @@ readonly EnumSettlementCycleText: UnwrapRef<typeof import('./src/constants/task')['EnumSettlementCycleText']> readonly EnumSmsAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumSmsAccess']> readonly EnumSmsAccessText: UnwrapRef<typeof import('./src/constants/enterprise')['EnumSmsAccessText']> + readonly EnumSmsAccessTextUseInLogs: UnwrapRef<typeof import('./src/constants/logs')['EnumSmsAccessTextUseInLogs']> readonly EnumSmsAccessTextUseInSms: UnwrapRef<typeof import('./src/constants/enterprise')['EnumSmsAccessTextUseInSms']> readonly EnumSmsStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumSmsStatus']> + readonly EnumSmsStatusText: UnwrapRef<typeof import('./src/constants/logs')['EnumSmsStatusText']> readonly EnumTaskCheckReceiveStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskCheckReceiveStatus']> readonly EnumTaskCheckReceiveStatusText: UnwrapRef<typeof import('./src/constants/task')['EnumTaskCheckReceiveStatusText']> readonly EnumTaskRecommendStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskRecommendStatus']> diff --git a/src/constants/logs.ts b/src/constants/logs.ts index 491e8ff..5558f67 100644 --- a/src/constants/logs.ts +++ b/src/constants/logs.ts @@ -5,3 +5,30 @@ [EnumResourceMethod.Put]: '淇敼', [EnumResourceMethod.Delete]: '鍒犻櫎', }; + +export const EnumConsoleLogAccessText = { + [EnumConsoleLogAccess.Back]: '鍚庣', + [EnumConsoleLogAccess.Front]: '鍓嶇', +}; + +export const EnumSmsAccessTextUseInLogs = { + [EnumSmsAccess.None]: '鏃�', + [EnumSmsAccess.AliyunSms]: '闃块噷浜戠煭淇�', + [EnumSmsAccess.ChengLiYe]: '璇氱珛涓�', +}; + +export const EnumSmsStatusText = { + [EnumSmsStatus.Wait]: '寰呭彂閫�', + [EnumSmsStatus.InProcess]: '鍙戦�佷腑', + [EnumSmsStatus.Success]: '鍙戦�佹垚鍔�', + [EnumSmsStatus.Fail]: '鍙戦�佸け璐�', +}; + +export const EnumLogLevelText = { + [EnumLogLevel.Trace]: '璺熻釜', + [EnumLogLevel.Debug]: '璋冭瘯', + [EnumLogLevel.Information]: '淇℃伅', + [EnumLogLevel.Warning]: '璀﹀憡', + [EnumLogLevel.Error]: '閿欒', + [EnumLogLevel.Critical]: '涓ラ噸', +}; diff --git a/src/views/TraceIdLogManage/ConsoleLogs.vue b/src/views/TraceIdLogManage/ConsoleLogs.vue new file mode 100644 index 0000000..e76704a --- /dev/null +++ b/src/views/TraceIdLogManage/ConsoleLogs.vue @@ -0,0 +1,221 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem tip-content="閫氶亾"> + <FieldRadio + v-model="extraParamState.access" + :value-enum="EnumConsoleLogAccessText" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="绛夌骇"> + <FieldRadio + v-model="extraParamState.level" + :value-enum="EnumLogLevelText" + buttonStyle + showAllBtn + @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="鎿嶄綔浜篶reatedUser" + @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.content" + style="width: 260px" + placeholder="鍐呭content" + @on-click-search="getList()" + > + </SearchInput> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.url" + style="width: 260px" + placeholder="閾炬帴鍦板潃url" + @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.ext" + style="width: 260px" + placeholder="鎵╁睍ext" + @on-click-search="getList()" + > + </SearchInput> + </QueryFilterItem> + </template> + </ProTableQueryFilterBar> + <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> + <template #createdUser="{ row }"> + <el-button + v-if="row.createdUser" + type="primary" + link + @click=" + handleAdd({ json: { createdUser: JSON.parse(JSON.stringify(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 { EnumConsoleLogAccessText, EnumLogLevelText } from '@/constants'; +import * as logRecordsServices from '@/services/api/logRecords'; +import { ModelValueType } from 'element-plus'; +import { format } from '@/utils'; +import JsonViewerDialog from './components/JsonViewerDialog.vue'; + +defineOptions({ + name: 'ConsoleLogs', +}); + +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.GetConsoleLogsQuery = { + pageModel: { + rows: pageSize, + page: pageIndex, + // orderInput: extraParamState.orderInput, + }, + createdTimeBegin: format(extraParamState.createdTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), + createdTimeEnd: format(extraParamState.createdTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), + createdUser: extraParamState.createdUser, + traceId: extraParamState.traceId, + access: extraParamState.access, + level: extraParamState.level, + content: extraParamState.content, + url: extraParamState.url, + request: extraParamState.request, + ext: extraParamState.ext, + }; + let res = await logRecordsServices.getConsoleLogs(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + createdUser: '', + traceId: '', + access: '' as any as EnumConsoleLogAccess, + level: '' as any as EnumLogLevel, + content: '', + url: '', + request: '', + ext: '', + createdTime: [] as unknown as ModelValueType, + orderInput: [{ property: 'createdTime', order: EnumPagedListOrder.Desc }], + }, + columnsRenderProps: { + createdTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, + access: { type: 'enum', valueEnum: EnumConsoleLogAccessText }, + level: { type: 'enum', valueEnum: EnumLogLevelText }, + }, + } +); + +const { dialogProps, handleAdd } = useFormDialog({ + defaultFormParams: { + json: null, + }, +}); + +function openDialog(row: API.GetConsoleLogsQueryResultItem) { + handleAdd({ + json: { + createdUser: JSON.parse(JSON.stringify(row.createdUser)), + }, + }); +} +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/TraceIdLogManage/DbAuditLogs.vue b/src/views/TraceIdLogManage/DbAuditLogs.vue index 9b62f3a..bec5a5d 100644 --- a/src/views/TraceIdLogManage/DbAuditLogs.vue +++ b/src/views/TraceIdLogManage/DbAuditLogs.vue @@ -9,7 +9,6 @@ :value-enum="EnumDbAuditOperateText" buttonStyle showAllBtn - :all-btn-value="null" @change="getList()" /> </QueryFilterItem> diff --git a/src/views/TraceIdLogManage/SmsLogs.vue b/src/views/TraceIdLogManage/SmsLogs.vue new file mode 100644 index 0000000..e29e742 --- /dev/null +++ b/src/views/TraceIdLogManage/SmsLogs.vue @@ -0,0 +1,236 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem tip-content="閫氶亾"> + <FieldRadio + v-model="extraParamState.access" + :value-enum="EnumSmsAccessTextUseInLogs" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="鏄惁浣跨敤"> + <FieldRadio + v-model="extraParamState.isUsed" + :value-enum="[ + { label: '鎴愬姛', value: true }, + { label: '澶辫触', value: false }, + ]" + buttonStyle + showAllBtn + :all-btn-value="null" + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="鍙戦�佺姸鎬�"> + <FieldRadio + v-model="extraParamState.status" + :value-enum="EnumSmsStatusText" + buttonStyle + showAllBtn + @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="鎿嶄綔浜篶reatedUser" + @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.phoneNumber" + style="width: 260px" + placeholder="鎵嬫満鍙风爜phoneNumber" + @on-click-search="getList()" + > + </SearchInput> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.templateCode" + style="width: 260px" + placeholder="妯℃澘浠g爜templateCode" + @on-click-search="getList()" + > + </SearchInput> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.templateParam" + style="width: 260px" + placeholder="妯℃澘鍙傛暟templateParam" + @on-click-search="getList()" + > + </SearchInput> + </QueryFilterItem> + </template> + </ProTableQueryFilterBar> + <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> + <template #createdUser="{ row }"> + <el-button + v-if="row.createdUser" + type="primary" + link + @click=" + handleAdd({ json: { createdUser: JSON.parse(JSON.stringify(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 { EnumSmsAccessTextUseInLogs, EnumSmsStatusText } from '@/constants'; +import * as logRecordsServices from '@/services/api/logRecords'; +import { ModelValueType } from 'element-plus'; +import { format } from '@/utils'; +import JsonViewerDialog from './components/JsonViewerDialog.vue'; + +defineOptions({ + name: 'SmsLogs', +}); + +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.GetSmsLogsQuery = { + pageModel: { + rows: pageSize, + page: pageIndex, + // orderInput: extraParamState.orderInput, + }, + createdTimeBegin: format(extraParamState.createdTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), + createdTimeEnd: format(extraParamState.createdTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), + createdUser: extraParamState.createdUser, + traceId: extraParamState.traceId, + access: extraParamState.access, + phoneNumber: extraParamState.phoneNumber, + templateCode: extraParamState.templateCode, + templateParam: extraParamState.templateParam, + isUsed: extraParamState.isUsed, + status: extraParamState.status, + }; + let res = await logRecordsServices.getSmsLogs(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + createdUser: '', + traceId: '', + access: '' as any as EnumSmsAccess, + phoneNumber: '', + templateCode: '', + templateParam: '', + isUsed: null as any as boolean, + status: '' as any as EnumSmsStatus, + createdTime: [] as unknown as ModelValueType, + orderInput: [{ property: 'createdTime', order: EnumPagedListOrder.Desc }], + }, + columnsRenderProps: { + createdTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, + expiry: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, + access: { type: 'enum', valueEnum: EnumSmsAccessTextUseInLogs }, + status: { type: 'enum', valueEnum: EnumSmsStatusText }, + isUsed: { + formatter: (row: API.GetSmsLogsQueryResultItem) => { + return row.isUsed ? '鏄�' : '鍚�'; + }, + }, + templateParam: { + formatter: (row: API.GetSmsLogsQueryResultItem) => { + return row.templateParam ? JSON.parse(row.templateParam).code : ''; + }, + }, + }, + } +); + +const { dialogProps, handleAdd } = useFormDialog({ + defaultFormParams: { + json: null, + }, +}); + +function openDialog(row: API.GetSmsLogsQueryResultItem) { + handleAdd({ + json: { + createdUser: JSON.parse(JSON.stringify(row.createdUser)), + }, + }); +} +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> -- Gitblit v1.9.1