From 76d07c0c336eafb918fba27450d63865baeb0642 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期一, 29 九月 2025 09:19:56 +0800
Subject: [PATCH] Merge branch 'master' into dev-1.1.2

---
 src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue |    6 
 src/views/TraceIdLogManage/DbAuditLogs.vue                        |  230 ++++++
 src/views/EnterpriseManage/components/ConfigureDialog.vue         |    9 
 .eslintrc-auto-import.json                                        |    4 
 src/services/api/typings.d.ts                                     |  435 ++++++++++-
 src/views/TraceIdLogManage/components/ThreeResourceLogsView.vue   |  105 +-
 src/views/EnterpriseManage/components/WechatConfigureView.vue     |   51 
 src/views/TraceIdLogManage/components/ResourceLogsView.vue        |  106 +-
 src/views/TraceIdLogManage/components/JsonViewerDialog.vue        |   31 
 src/constants/enterprise.ts                                       |   15 
 src/views/System/SmsSettingManage.vue                             |  215 +++++
 src/services/api/sms.ts                                           |   42 +
 src/views/TraceIdLogManage/components/DbAuditLogsView.vue         |   75 -
 src/views/TraceIdLogManage/components/ExceptionLogsView.vue       |   27 
 src/services/api/index.ts                                         |    2 
 src/views/TraceIdLogManage/ThreeResourceLogs.vue                  |  281 +++++++
 src/views/TraceIdLogManage/ResourceLogs.vue                       |  281 +++++++
 auto-imports.d.ts                                                 |   10 
 src/constants/apiEnum.ts                                          |   64 +
 src/views/TraceIdLogManage/ExceptionLogs.vue                      |  185 +++++
 src/services/api/logRecords.ts                                    |   39 +
 21 files changed, 1,906 insertions(+), 307 deletions(-)

diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
index 292270a..0fb83b8 100644
--- a/.eslintrc-auto-import.json
+++ b/.eslintrc-auto-import.json
@@ -27,6 +27,7 @@
     "EnumClientType": true,
     "EnumClientTypeText": true,
     "EnumCodeUrlScene": true,
+    "EnumConsoleLogAccess": true,
     "EnumContractTemplateStatus": true,
     "EnumContractTemplateStatusText": true,
     "EnumContractTemplateStatusTextForEnterpriseFilter": true,
@@ -53,6 +54,7 @@
     "EnumEnterpriseWalletSignStatusText": true,
     "EnumEnterpriseWalletTransactionType": true,
     "EnumGetEnterpriseEmployeesQuerySignContractStatus": true,
+    "EnumLogLevel": true,
     "EnumMenuType": true,
     "EnumMenuVisitLevel": true,
     "EnumOcrAccess": true,
@@ -79,6 +81,8 @@
     "EnumSettlementCycleText": true,
     "EnumSmsAccess": true,
     "EnumSmsAccessText": true,
+    "EnumSmsAccessTextUseInSms": true,
+    "EnumSmsStatus": true,
     "EnumTaskCheckReceiveStatus": true,
     "EnumTaskCheckReceiveStatusText": true,
     "EnumTaskRecommendStatus": true,
diff --git a/auto-imports.d.ts b/auto-imports.d.ts
index 4ee3e55..9d158b2 100644
--- a/auto-imports.d.ts
+++ b/auto-imports.d.ts
@@ -29,6 +29,7 @@
   const EnumClientType: typeof import('./src/constants/apiEnum')['EnumClientType']
   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 EnumContractTemplateStatus: typeof import('./src/constants/apiEnum')['EnumContractTemplateStatus']
   const EnumContractTemplateStatusText: typeof import('./src/constants/electronSign')['EnumContractTemplateStatusText']
   const EnumContractTemplateStatusTextForEnterpriseFilter: typeof import('./src/constants/electronSign')['EnumContractTemplateStatusTextForEnterpriseFilter']
@@ -56,6 +57,7 @@
   const EnumEnterpriseWalletTransactionStatus: typeof import('./src/constants/apiEnum')['EnumEnterpriseWalletTransactionStatus']
   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 EnumMenuType: typeof import('./src/constants/apiEnum')['EnumMenuType']
   const EnumMenuVisitLevel: typeof import('./src/constants/apiEnum')['EnumMenuVisitLevel']
   const EnumOcrAccess: typeof import('./src/constants/apiEnum')['EnumOcrAccess']
@@ -83,6 +85,8 @@
   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 EnumSmsAccessTextUseInSms: typeof import('./src/constants/enterprise')['EnumSmsAccessTextUseInSms']
+  const EnumSmsStatus: typeof import('./src/constants/apiEnum')['EnumSmsStatus']
   const EnumTaskCheckReceiveStatus: typeof import('./src/constants/apiEnum')['EnumTaskCheckReceiveStatus']
   const EnumTaskCheckReceiveStatusText: typeof import('./src/constants/task')['EnumTaskCheckReceiveStatusText']
   const EnumTaskRecommendStatus: typeof import('./src/constants/apiEnum')['EnumTaskRecommendStatus']
@@ -272,7 +276,7 @@
   export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
   import('vue')
   // @ts-ignore
-  export type { EnumBillingMethod, EnumClientType, EnumCodeUrlScene, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumElectronSignVerifyType, EnumEnterpriseCostStatus, EnumEnterpriseCostType, EnumEnterpriseRealMethod, EnumEnterpriseWalletAccess, EnumEnterpriseWalletExpandindirectOrderFileType, EnumEnterpriseWalletExpandindirectOrderScene, EnumEnterpriseWalletExpandindirectOrderStatus, EnumEnterpriseWalletSignStatus, EnumEnterpriseWalletTransactionType, EnumGetEnterpriseEmployeesQuerySignContractStatus, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementOrderStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserBankCardAccess, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, EnumUserWalletTransactionType, EnumWalletTransactionStatus, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, SettlementReceiveStatus, EnumBillingMethod, EnumClientType, EnumCodeUrlScene, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumElectronSignVerifyType, EnumEnterpriseCostStatus, EnumEnterpriseCostType, EnumEnterpriseRealMethod, EnumEnterpriseWalletAccess, EnumEnterpriseWalletExpandindirectOrderFileType, EnumEnterpriseWalletExpandindirectOrderScene, EnumEnterpriseWalletExpandindirectOrderStatus, EnumEnterpriseWalletSignStatus, EnumEnterpriseWalletTransactionType, EnumGetEnterpriseEmployeesQuerySignContractStatus, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementOrderStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserBankCardAccess, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, EnumUserWalletTransactionType, EnumWalletTransactionStatus, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, SettlementReceiveStatus } from './src/constants/apiEnum'
+  export type { EnumBillingMethod, EnumClientType, EnumCodeUrlScene, EnumConsoleLogAccess, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumElectronSignVerifyType, EnumEnterpriseCostStatus, EnumEnterpriseCostType, EnumEnterpriseRealMethod, EnumEnterpriseWalletAccess, EnumEnterpriseWalletExpandindirectOrderFileType, EnumEnterpriseWalletExpandindirectOrderScene, EnumEnterpriseWalletExpandindirectOrderStatus, EnumEnterpriseWalletSignStatus, EnumEnterpriseWalletTransactionType, EnumGetEnterpriseEmployeesQuerySignContractStatus, EnumLogLevel, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumSmsStatus, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementOrderStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserBankCardAccess, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, EnumUserWalletTransactionType, EnumWalletTransactionStatus, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, SettlementReceiveStatus, EnumBillingMethod, EnumClientType, EnumCodeUrlScene, EnumConsoleLogAccess, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumElectronSignVerifyType, EnumEnterpriseCostStatus, EnumEnterpriseCostType, EnumEnterpriseRealMethod, EnumEnterpriseWalletAccess, EnumEnterpriseWalletExpandindirectOrderFileType, EnumEnterpriseWalletExpandindirectOrderScene, EnumEnterpriseWalletExpandindirectOrderStatus, EnumEnterpriseWalletSignStatus, EnumEnterpriseWalletTransactionType, EnumGetEnterpriseEmployeesQuerySignContractStatus, EnumLogLevel, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumSmsStatus, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementOrderStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserBankCardAccess, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, EnumUserWalletTransactionType, EnumWalletTransactionStatus, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, SettlementReceiveStatus } from './src/constants/apiEnum'
   import('./src/constants/apiEnum')
   // @ts-ignore
   export type { FlexWorkerEleSignEnum, FlexTaskWorkerHireEnum, FlexWorkerEleSignEnum, FlexTaskWorkerHireEnum } from './src/constants/cPerson'
@@ -340,6 +344,7 @@
     readonly EnumClientType: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumClientType']>
     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 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']>
@@ -366,6 +371,7 @@
     readonly EnumEnterpriseWalletSignStatusText: UnwrapRef<typeof import('./src/constants/enterprise')['EnumEnterpriseWalletSignStatusText']>
     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 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']>
@@ -392,6 +398,8 @@
     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 EnumSmsAccessTextUseInSms: UnwrapRef<typeof import('./src/constants/enterprise')['EnumSmsAccessTextUseInSms']>
+    readonly EnumSmsStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumSmsStatus']>
     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/apiEnum.ts b/src/constants/apiEnum.ts
index 5e7d264..e869b1b 100644
--- a/src/constants/apiEnum.ts
+++ b/src/constants/apiEnum.ts
@@ -31,6 +31,14 @@
   ElectronSignUrl = 10,
 }
 
+/** 鎺у埗鍙版棩蹇楅�氶亾 */
+export enum EnumConsoleLogAccess {
+  /**鍚庣 */
+  Back = 10,
+  /**鍓嶇 */
+  Front = 20,
+}
+
 /** 鍚堝悓鍒剁増鐘舵�� */
 export enum EnumContractTemplateStatus {
   /**寰呭埗鐗� */
@@ -199,6 +207,22 @@
   Pass = 30,
 }
 
+/** 鏃ュ織绾у埆 */
+export enum EnumLogLevel {
+  /**璺熻釜 */
+  Trace = 10,
+  /**璋冭瘯 */
+  Debug = 20,
+  /**淇℃伅 */
+  Information = 30,
+  /**璀﹀憡 */
+  Warning = 40,
+  /**閿欒 */
+  Error = 50,
+  /**涓ラ噸 */
+  Critical = 60,
+}
+
 /** 鑿滃崟绫诲瀷 */
 export enum EnumMenuType {
   /**鑿滃崟 */
@@ -321,28 +345,30 @@
   CommonServerLogRecords = 7,
   /**鍚屾鏁版嵁搴� */
   CommonServerSyncDatabase = 8,
+  /**鐭俊宸ュ叿 */
+  CommonServerSmsUtils = 9,
   /**鐢ㄦ埛璁よ瘉 */
-  UserServerAuth = 9,
+  UserServerAuth = 10,
   /**鐢ㄦ埛鑿滃崟 */
-  UserServerMenu = 10,
+  UserServerMenu = 11,
   /**鐢ㄦ埛璧勬簮 */
-  UserServerResource = 11,
+  UserServerResource = 12,
   /**鐢ㄦ埛瑙掕壊 */
-  UserServerRole = 12,
+  UserServerRole = 13,
   /**鐢ㄦ埛淇℃伅 */
-  UserServerUser = 13,
+  UserServerUser = 14,
   /**鐢靛瓙绛� */
-  UserServerElectronSign = 14,
+  UserServerElectronSign = 15,
   /**鐢ㄦ埛绠�鍘� */
-  UserServerUserResume = 15,
+  UserServerUserResume = 16,
   /**浼佷笟淇℃伅 */
-  UserServerEnterprise = 16,
+  UserServerEnterprise = 17,
   /**浼佷笟閽卞寘 */
-  UserServerEnterpriseWallet = 17,
+  UserServerEnterpriseWallet = 18,
   /**鐏靛伐淇℃伅 */
-  UserServerEnterpriseEmployee = 18,
+  UserServerEnterpriseEmployee = 19,
   /**鐢靛瓙绛� */
-  ElectronSignServerElectronSign = 19,
+  ElectronSignServerElectronSign = 20,
 }
 
 /** 璧勬簮璇锋眰鏂瑰紡 */
@@ -387,8 +413,24 @@
 
 /** 鐭俊閫氶亾 */
 export enum EnumSmsAccess {
+  /**鏃� */
+  None = 0,
   /**闃块噷浜戠煭淇� */
   AliyunSms = 10,
+  /**璇氱珛涓� */
+  ChengLiYe = 20,
+}
+
+/** 鐭俊鐘舵�� */
+export enum EnumSmsStatus {
+  /**寰呭彂閫� */
+  Wait = 0,
+  /**鍙戦�佷腑 */
+  InProcess = 10,
+  /**鍙戦�佹垚鍔� */
+  Success = 20,
+  /**鍙戦�佸け璐� */
+  Fail = 30,
 }
 
 /** 浠诲姟缁撶畻鐘舵�� */
diff --git a/src/constants/enterprise.ts b/src/constants/enterprise.ts
index efc3d0b..be49de0 100644
--- a/src/constants/enterprise.ts
+++ b/src/constants/enterprise.ts
@@ -20,10 +20,10 @@
    * 鐭俊閫氶亾閰嶇疆
    */
   ShortMessage = 4,
-  // /**
-  //  * 寰俊鏀粯閰嶇疆
-  //  */
-  // Wechat = 5,
+  /**
+   * 寰俊鏀粯閰嶇疆
+   */
+  Wechat = 5,
 }
 
 export const EnterpriseConfigureTypeText = {
@@ -31,7 +31,7 @@
   [EnterpriseConfigureType.AliPay]: '鏀粯瀹濋厤缃�',
   [EnterpriseConfigureType.Electronic]: '鐢靛瓙绛鹃厤缃�',
   [EnterpriseConfigureType.ShortMessage]: '鐭俊閫氶亾閰嶇疆',
-  // [EnterpriseConfigureType.Wechat]: '寰俊鏀粯閰嶇疆',
+  [EnterpriseConfigureType.Wechat]: '寰俊鏀粯閰嶇疆',
 };
 
 export enum VerifyStatus {
@@ -74,6 +74,11 @@
   [EnumSmsAccess.AliyunSms]: '闃块噷浜�',
 };
 
+export const EnumSmsAccessTextUseInSms = {
+  [EnumSmsAccess.AliyunSms]: '闃块噷浜�',
+  [EnumSmsAccess.ChengLiYe]: '璇氱珛涓�',
+};
+
 export const EnumRealAccessText = {
   [EnumRealAccess.BestSign]: '涓婁笂绛�',
   [EnumRealAccess.AlipaySign]: '鏀粯瀹濅俊浠荤',
diff --git a/src/services/api/index.ts b/src/services/api/index.ts
index 99078ea..c27a0d6 100644
--- a/src/services/api/index.ts
+++ b/src/services/api/index.ts
@@ -5,6 +5,7 @@
 import * as enterpriseEmployee from './enterpriseEmployee';
 import * as user from './user';
 import * as role from './role';
+import * as sms from './sms';
 import * as ocrUtils from './ocrUtils';
 import * as task from './task';
 import * as enterprise from './enterprise';
@@ -25,6 +26,7 @@
   enterpriseEmployee,
   user,
   role,
+  sms,
   ocrUtils,
   task,
   enterprise,
diff --git a/src/services/api/logRecords.ts b/src/services/api/logRecords.ts
index 0cb3919..4780141 100644
--- a/src/services/api/logRecords.ts
+++ b/src/services/api/logRecords.ts
@@ -2,6 +2,18 @@
 // @ts-ignore
 import { request } from '@/utils/request';
 
+/** 鎺у埗鍙版棩蹇楀垎椤靛垪琛ㄦ煡璇� POST /api/common/logRecords/getConsoleLogs */
+export async function getConsoleLogs(body: API.GetConsoleLogsQuery, options?: API.RequestConfig) {
+  return request<API.GetConsoleLogsQueryResult>('/api/common/logRecords/getConsoleLogs', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 鏌ヨ鏁版嵁搴撳璁℃棩蹇楀垎椤靛垪琛� POST /api/common/logRecords/getDbAuditLogs */
 export async function getDbAuditLogs(body: API.GetDbAuditLogsQuery, options?: API.RequestConfig) {
   return request<API.GetDbAuditLogsQueryResult>('/api/common/logRecords/getDbAuditLogs', {
@@ -32,6 +44,18 @@
 /** 璧勬簮鏃ュ織鍒嗛〉鍒楄〃鏌ヨ POST /api/common/logRecords/getResourceLogs */
 export async function getResourceLogs(body: API.GetResourceLogsQuery, options?: API.RequestConfig) {
   return request<API.GetResourceLogsQueryResult>('/api/common/logRecords/getResourceLogs', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鏌ヨ鐭俊鏃ュ織 POST /api/common/logRecords/getSmsLogs */
+export async function getSmsLogs(body: API.GetSmsLogsQuery, options?: API.RequestConfig) {
+  return request<API.GetSmsLogsQueryResult>('/api/common/logRecords/getSmsLogs', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json-patch+json',
@@ -85,3 +109,18 @@
     ...(options || {}),
   });
 }
+
+/** 淇濆瓨鍓嶇鏃ュ織 POST /api/common/logRecords/saveFrontConsoleLog */
+export async function saveFrontConsoleLog(
+  body: API.SaveFrontConsoleLogCommand,
+  options?: API.RequestConfig
+) {
+  return request<string>('/api/common/logRecords/saveFrontConsoleLog', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/api/sms.ts b/src/services/api/sms.ts
new file mode 100644
index 0000000..5a65279
--- /dev/null
+++ b/src/services/api/sms.ts
@@ -0,0 +1,42 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** 鏌ヨ鐭俊閰嶇疆 POST /api/common/sms/getSmsSetting */
+export async function getSmsSetting(body: API.GetSmsSettingQuery, options?: API.RequestConfig) {
+  return request<API.GetSmsSettingQueryResult>('/api/common/sms/getSmsSetting', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 淇濆瓨鐭俊閰嶇疆 POST /api/common/sms/saveSmsSetting */
+export async function saveSmsSetting(body: API.SaveSmsSettingCommand, options?: API.RequestConfig) {
+  return request<string>('/api/common/sms/saveSmsSetting', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 璇氱珛涓氱煭淇″钩鍙板洖浼犻�氱煡 POST /api/common/sms/smsChengLiYeNotify */
+export async function smsChengLiYeNotify(
+  body: API.SmsChengLiYeNotifyCommand,
+  options?: API.RequestConfig
+) {
+  return request<boolean>('/api/common/sms/smsChengLiYeNotify', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index 5623a46..80e7e2c 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -563,6 +563,13 @@
     ElectronSignUrl = 10,
   }
 
+  enum EnumConsoleLogAccess {
+    /**鍚庣 */
+    Back = 10,
+    /**鍓嶇 */
+    Front = 20,
+  }
+
   enum EnumContractTemplateStatus {
     /**寰呭埗鐗� */
     Wait = 10,
@@ -714,6 +721,21 @@
     Pass = 30,
   }
 
+  enum EnumLogLevel {
+    /**璺熻釜 */
+    Trace = 10,
+    /**璋冭瘯 */
+    Debug = 20,
+    /**淇℃伅 */
+    Information = 30,
+    /**璀﹀憡 */
+    Warning = 40,
+    /**閿欒 */
+    Error = 50,
+    /**涓ラ噸 */
+    Critical = 60,
+  }
+
   enum EnumMenuType {
     /**鑿滃崟 */
     Menu = 10,
@@ -825,28 +847,30 @@
     CommonServerLogRecords = 7,
     /**鍚屾鏁版嵁搴� */
     CommonServerSyncDatabase = 8,
+    /**鐭俊宸ュ叿 */
+    CommonServerSmsUtils = 9,
     /**鐢ㄦ埛璁よ瘉 */
-    UserServerAuth = 9,
+    UserServerAuth = 10,
     /**鐢ㄦ埛鑿滃崟 */
-    UserServerMenu = 10,
+    UserServerMenu = 11,
     /**鐢ㄦ埛璧勬簮 */
-    UserServerResource = 11,
+    UserServerResource = 12,
     /**鐢ㄦ埛瑙掕壊 */
-    UserServerRole = 12,
+    UserServerRole = 13,
     /**鐢ㄦ埛淇℃伅 */
-    UserServerUser = 13,
+    UserServerUser = 14,
     /**鐢靛瓙绛� */
-    UserServerElectronSign = 14,
+    UserServerElectronSign = 15,
     /**鐢ㄦ埛绠�鍘� */
-    UserServerUserResume = 15,
+    UserServerUserResume = 16,
     /**浼佷笟淇℃伅 */
-    UserServerEnterprise = 16,
+    UserServerEnterprise = 17,
     /**浼佷笟閽卞寘 */
-    UserServerEnterpriseWallet = 17,
+    UserServerEnterpriseWallet = 18,
     /**鐏靛伐淇℃伅 */
-    UserServerEnterpriseEmployee = 18,
+    UserServerEnterpriseEmployee = 19,
     /**鐢靛瓙绛� */
-    ElectronSignServerElectronSign = 19,
+    ElectronSignServerElectronSign = 20,
   }
 
   enum EnumResourceMethod {
@@ -887,8 +911,23 @@
   }
 
   enum EnumSmsAccess {
+    /**鏃� */
+    None = 0,
     /**闃块噷浜戠煭淇� */
     AliyunSms = 10,
+    /**璇氱珛涓� */
+    ChengLiYe = 20,
+  }
+
+  enum EnumSmsStatus {
+    /**寰呭彂閫� */
+    Wait = 0,
+    /**鍙戦�佷腑 */
+    InProcess = 10,
+    /**鍙戦�佹垚鍔� */
+    Success = 20,
+    /**鍙戦�佸け璐� */
+    Fail = 30,
   }
 
   enum EnumTaskCheckReceiveStatus {
@@ -1223,6 +1262,24 @@
     /** 閿欒鐮� */
     errorCode?: string;
     data?: GetCodeUrlQueryResult;
+    /** 鎵ц鎴愬姛 */
+    success?: boolean;
+    /** 閿欒淇℃伅 */
+    msg?: any;
+    /** 闄勫姞鏁版嵁 */
+    extras?: any;
+    /** 鏃堕棿鎴� */
+    timestamp?: number;
+  }
+
+  interface FriendlyResultGetConsoleLogsQueryResult {
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鐘舵�佺爜 */
+    code?: number;
+    /** 閿欒鐮� */
+    errorCode?: string;
+    data?: GetConsoleLogsQueryResult;
     /** 鎵ц鎴愬姛 */
     success?: boolean;
     /** 閿欒淇℃伅 */
@@ -1889,6 +1946,42 @@
     /** 閿欒鐮� */
     errorCode?: string;
     data?: GetSettlementTaskUsersQueryResult;
+    /** 鎵ц鎴愬姛 */
+    success?: boolean;
+    /** 閿欒淇℃伅 */
+    msg?: any;
+    /** 闄勫姞鏁版嵁 */
+    extras?: any;
+    /** 鏃堕棿鎴� */
+    timestamp?: number;
+  }
+
+  interface FriendlyResultGetSmsLogsQueryResult {
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鐘舵�佺爜 */
+    code?: number;
+    /** 閿欒鐮� */
+    errorCode?: string;
+    data?: GetSmsLogsQueryResult;
+    /** 鎵ц鎴愬姛 */
+    success?: boolean;
+    /** 閿欒淇℃伅 */
+    msg?: any;
+    /** 闄勫姞鏁版嵁 */
+    extras?: any;
+    /** 鏃堕棿鎴� */
+    timestamp?: number;
+  }
+
+  interface FriendlyResultGetSmsSettingQueryResult {
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鐘舵�佺爜 */
+    code?: number;
+    /** 閿欒鐮� */
+    errorCode?: string;
+    data?: GetSmsSettingQueryResult;
     /** 鎵ц鎴愬姛 */
     success?: boolean;
     /** 閿欒淇℃伅 */
@@ -2999,6 +3092,58 @@
     paramValue5?: string;
   }
 
+  interface GetConsoleLogsQuery {
+    access?: EnumConsoleLogAccess;
+    level?: EnumLogLevel;
+    /** 鍒涘缓鏃堕棿-璧峰 */
+    createdTimeBegin?: string;
+    /** 鍒涘缓鏃堕棿-鎴 */
+    createdTimeEnd?: string;
+    /** 鎿嶄綔浜� */
+    createdUser?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鍐呭 */
+    content?: string;
+    /** 閾炬帴鍦板潃 */
+    url?: string;
+    /** 浼犲弬 */
+    request?: string;
+    /** 鎵╁睍 */
+    ext?: string;
+    pageModel?: PagedListQueryPageModel;
+  }
+
+  interface GetConsoleLogsQueryResult {
+    pageModel?: PagedListQueryResultPageModel;
+    /** 鏁版嵁 */
+    data?: GetConsoleLogsQueryResultItem[];
+  }
+
+  interface GetConsoleLogsQueryResultItem {
+    /** Id */
+    id?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
+    access?: EnumConsoleLogAccess;
+    level?: EnumLogLevel;
+    /** 鍐呭 */
+    content: string;
+    /** 鍫嗘爤璺熻釜 */
+    stackTrace?: string;
+    /** 閾炬帴鍦板潃 */
+    url?: string;
+    /** 浼犲弬 */
+    request?: string;
+    /** 鎵╁睍 */
+    ext?: string;
+    /** 瀹㈡埛IP鍦板潃 */
+    clientIpAddress?: string;
+    createdUser?: GetLogsQueryResultItemCreatedUser;
+    /** 鍒涘缓鏃堕棿 */
+    createdTime?: string;
+  }
+
   interface GetContractTemplateEnterprisesQuery {
     /** 鍏抽敭瀛� */
     keywords?: string;
@@ -3074,14 +3219,23 @@
   type GetCurrentLogierMenusQuery = Record<string, any>;
 
   interface GetDbAuditLogsQuery {
-    /** 璺熻釜Id */
-    traceId?: string;
-    /** 鍏抽敭瀛� */
-    keywords?: string;
     /** 鍒涘缓鏃堕棿-璧峰 */
     createdTimeBegin?: string;
     /** 鍒涘缓鏃堕棿-鎴 */
     createdTimeEnd?: string;
+    /** 鎿嶄綔浜� */
+    createdUser?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 琛ㄥ悕 */
+    tableName?: string;
+    /** 涓婚敭 */
+    primaryKey?: string;
+    operate?: EnumDbAuditOperate;
+    /** 鏃у�� */
+    oldValues?: string;
+    /** 鏂板�� */
+    newValues?: string;
     pageModel?: PagedListQueryPageModel;
   }
 
@@ -3092,6 +3246,10 @@
   }
 
   interface GetDbAuditLogsQueryResultItem {
+    /** Id */
+    id?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
     /** 琛ㄥ悕 */
     tableName?: string;
     /** 涓婚敭 */
@@ -3101,7 +3259,7 @@
     oldValues?: string;
     /** 鏂板�� */
     newValues?: string;
-    createdUser?: GetResourceLogsQueryResultItemCreatedUser;
+    createdUser?: GetLogsQueryResultItemCreatedUser;
     /** 鍒涘缓鏃堕棿 */
     createdTime?: string;
   }
@@ -3624,14 +3782,20 @@
   }
 
   interface GetExceptionLogsQuery {
-    /** 璺熻釜Id */
-    traceId?: string;
-    /** 鍏抽敭瀛� */
-    keywords?: string;
     /** 鍒涘缓鏃堕棿-璧峰 */
     createdTimeBegin?: string;
     /** 鍒涘缓鏃堕棿-鎴 */
     createdTimeEnd?: string;
+    /** 鎿嶄綔浜� */
+    createdUser?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 绫诲瀷 */
+    type?: string;
+    /** 浠g爜 */
+    code?: string;
+    /** 娑堟伅 */
+    message?: string;
     pageModel?: PagedListQueryPageModel;
   }
 
@@ -3642,6 +3806,10 @@
   }
 
   interface GetExceptionLogsQueryResultItem {
+    /** Id */
+    id?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
     /** 绫诲瀷 */
     type?: string;
     /** 浠g爜 */
@@ -3650,7 +3818,7 @@
     message?: string;
     /** 鍫嗘爤璺熻釜 */
     stackTrace?: string;
-    createdUser?: GetResourceLogsQueryResultItemCreatedUser;
+    createdUser?: GetLogsQueryResultItemCreatedUser;
     /** 鍒涘缓鏃堕棿 */
     createdTime?: string;
   }
@@ -3701,6 +3869,20 @@
     /** 鍦板潃 */
     url?: string;
     model?: BaiduOcrBusinessLicenseResultModel;
+  }
+
+  interface GetLogsQueryResultItemCreatedUser {
+    /** Id */
+    id?: string;
+    type?: EnumUserType;
+    /** 濮撳悕 */
+    name?: string;
+    /** 鐢ㄦ埛鍚� */
+    userName?: string;
+    /** 浼佷笟Id */
+    enterpriseId?: string;
+    /** 浼佷笟鍏ㄧО */
+    enterpriseName?: string;
   }
 
   interface GetMenuQueryResult {
@@ -4366,14 +4548,29 @@
   }
 
   interface GetResourceLogsQuery {
-    /** 璺熻釜Id */
-    traceId?: string;
-    /** 鍏抽敭瀛� */
-    keywords?: string;
     /** 鍒涘缓鏃堕棿-璧峰 */
     createdTimeBegin?: string;
     /** 鍒涘缓鏃堕棿-鎴 */
     createdTimeEnd?: string;
+    /** 鎿嶄綔浜� */
+    createdUser?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
+    method?: EnumResourceMethod;
+    /** 鍩熷悕 */
+    domain?: string;
+    /** 鍦板潃 */
+    path?: string;
+    /** 璇锋眰鍙傛暟 */
+    request?: string;
+    /** 鍝嶅簲缁撴灉 */
+    response?: string;
+    /** 鏄惁鎴愬姛 */
+    isSuccess?: boolean;
+    /** 瀹㈡埛绔疘P鍦板潃 */
+    clientIpAddress?: string;
+    /** 鏈�灏忚�楁椂姣鏁� */
+    elapsedMillisecondsMin?: number;
     pageModel?: PagedListQueryPageModel;
   }
 
@@ -4386,6 +4583,8 @@
   interface GetResourceLogsQueryResultItem {
     /** Id */
     id?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
     method?: EnumResourceMethod;
     /** 鍩熷悕 */
     domain?: string;
@@ -4409,23 +4608,9 @@
     consoleLogs?: string;
     /** 鑰楁椂姣鏁� */
     elapsedMilliseconds?: number;
-    createdUser?: GetResourceLogsQueryResultItemCreatedUser;
+    createdUser?: GetLogsQueryResultItemCreatedUser;
     /** 鍒涘缓鏃堕棿 */
     createdTime?: string;
-  }
-
-  interface GetResourceLogsQueryResultItemCreatedUser {
-    /** Id */
-    id?: string;
-    type?: EnumUserType;
-    /** 濮撳悕 */
-    name?: string;
-    /** 鐢ㄦ埛鍚� */
-    userName?: string;
-    /** 浼佷笟Id */
-    enterpriseId?: string;
-    /** 浼佷笟鍏ㄧО */
-    enterpriseName?: string;
   }
 
   interface GetResourcesQueryResultItem {
@@ -4644,6 +4829,89 @@
     createdTime?: string;
     /** 鐢靛瓙鏀舵嵁涓嬭浇閾炬帴 */
     ereceiptDownloadOssUrl?: string;
+  }
+
+  interface GetSmsLogsQuery {
+    /** 鍒涘缓鏃堕棿-璧峰 */
+    createdTimeBegin?: string;
+    /** 鍒涘缓鏃堕棿-鎴 */
+    createdTimeEnd?: string;
+    /** 鎿嶄綔浜� */
+    createdUser?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
+    access?: EnumSmsAccess;
+    /** 鎵嬫満鍙风爜 */
+    phoneNumber?: string;
+    /** 妯℃澘浠g爜 */
+    templateCode?: string;
+    /** 妯℃澘鍙傛暟 */
+    templateParam?: string;
+    /** 鏄惁浣跨敤 */
+    isUsed?: boolean;
+    status?: EnumSmsStatus;
+    pageModel?: PagedListQueryPageModel;
+  }
+
+  interface GetSmsLogsQueryResult {
+    pageModel?: PagedListQueryResultPageModel;
+    /** 鏁版嵁 */
+    data?: GetSmsLogsQueryResultItem[];
+  }
+
+  interface GetSmsLogsQueryResultItem {
+    /** Id */
+    id?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
+    access?: EnumSmsAccess;
+    /** 鎵嬫満鍙风爜 */
+    phoneNumber?: string;
+    /** 妯℃澘浠g爜 */
+    templateCode?: string;
+    /** 妯℃澘鍙傛暟 */
+    templateParam?: string;
+    /** 鏈夋晥鏈� */
+    expiry?: string;
+    /** 鏄惁浣跨敤 */
+    isUsed?: boolean;
+    status?: EnumSmsStatus;
+    /** 璇锋眰Id */
+    requestId?: string;
+    /** 鍥炰紶浠g爜 */
+    code?: string;
+    /** 鍥炰紶娑堟伅 */
+    message?: string;
+    /** 鎿嶄綔浜篒d */
+    createdUserId?: string;
+    createdUser?: GetLogsQueryResultItemCreatedUser;
+    /** 鍒涘缓鏃堕棿 */
+    createdTime?: string;
+  }
+
+  type GetSmsSettingQuery = Record<string, any>;
+
+  interface GetSmsSettingQueryResult {
+    /** 鏄惁绂佺敤 */
+    isDisabled?: boolean;
+    /** 甯﹀嚭鍙傛暟 */
+    withoutParams?: boolean;
+    /** 姣忓垎閽熸渶澶ф暟閲� */
+    minutelyMaxCount?: number;
+    /** 姣忓皬鏃舵渶澶ф暟閲� */
+    hourlyMaxCount?: number;
+    /** 姣忓ぉ鏈�澶ф暟閲� */
+    dailyMaxCount?: number;
+    /** 閫氶亾閰嶇疆 */
+    accesses?: GetSmsSettingQueryResultAccess[];
+  }
+
+  interface GetSmsSettingQueryResultAccess {
+    access?: EnumSmsAccess;
+    /** 鏄惁绂佺敤 */
+    isDisabled?: boolean;
+    /** 鎺掑簭 */
+    sort?: number;
   }
 
   interface GetTaskEnterpriseQueryResult {
@@ -4929,14 +5197,29 @@
   }
 
   interface GetThreeResourceLogsQuery {
-    /** 璺熻釜Id */
-    traceId?: string;
-    /** 鍏抽敭瀛� */
-    keywords?: string;
     /** 鍒涘缓鏃堕棿-璧峰 */
     createdTimeBegin?: string;
     /** 鍒涘缓鏃堕棿-鎴 */
     createdTimeEnd?: string;
+    /** 鎿嶄綔浜� */
+    createdUser?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
+    method?: EnumResourceMethod;
+    /** 鍩熷悕 */
+    domain?: string;
+    /** 鍦板潃 */
+    path?: string;
+    /** 璇锋眰鍙傛暟 */
+    request?: string;
+    /** 鍝嶅簲缁撴灉 */
+    response?: string;
+    /** 鏄惁鎴愬姛 */
+    isSuccess?: boolean;
+    /** 瀹㈡埛绔疘P鍦板潃 */
+    clientIpAddress?: string;
+    /** 鏈�灏忚�楁椂姣鏁� */
+    elapsedMillisecondsMin?: number;
     pageModel?: PagedListQueryPageModel;
   }
 
@@ -4949,6 +5232,8 @@
   interface GetThreeResourceLogsQueryResultItem {
     /** Id */
     id?: string;
+    /** 璺熻釜Id */
+    traceId?: string;
     method?: EnumResourceMethod;
     /** 鍩熷悕 */
     domain?: string;
@@ -4966,23 +5251,9 @@
     isSuccess?: boolean;
     /** 鑰楁椂姣鏁� */
     elapsedMilliseconds?: number;
-    createdUser?: GetThreeResourceLogsQueryResultItemCreatedUser;
+    createdUser?: GetLogsQueryResultItemCreatedUser;
     /** 鍒涘缓鏃堕棿 */
     createdTime?: string;
-  }
-
-  interface GetThreeResourceLogsQueryResultItemCreatedUser {
-    /** Id */
-    id?: string;
-    type?: EnumUserType;
-    /** 濮撳悕 */
-    name?: string;
-    /** 鐢ㄦ埛鍚� */
-    userName?: string;
-    /** 浼佷笟Id */
-    enterpriseId?: string;
-    /** 浼佷笟鍏ㄧО */
-    enterpriseName?: string;
   }
 
   interface GetTraceIdLogQueryResult {
@@ -4994,6 +5265,8 @@
     exceptionLogs?: GetExceptionLogsQueryResultItem[];
     /** 鏁版嵁搴撳璁℃棩蹇� */
     dbAuditLogs?: GetDbAuditLogsQueryResultItem[];
+    /** 鎺у埗鍙版棩蹇� */
+    consoleLogs?: GetConsoleLogsQueryResultItem[];
   }
 
   interface GetUserInfoRolesQueryResultItem {
@@ -5466,6 +5739,7 @@
   }
 
   interface PersonalUserElectronSignCommandResult {
+    userSignContractStatus?: EnumTaskUserSignContractStatus;
     /** 绛剧讲鍚堝悓鐭摼鎺� */
     signContractShortUrl?: string;
     /** 绛剧讲鍚堝悓闀块摼鎺� */
@@ -5495,6 +5769,8 @@
     isReal?: boolean;
     realMethod?: EnumUserRealMethod;
     realStatus?: EnumPersonalUserRealStatus;
+    /** 鏄惁缁戝畾閾惰鍗� */
+    isBindBankCard?: boolean;
     /** 浜鸿劯璇嗗埆鍦板潃 */
     faceUrl?: string;
   }
@@ -5691,6 +5967,22 @@
     status?: EnumEnterpriseCostStatus;
   }
 
+  interface SaveFrontConsoleLogCommand {
+    /** 璺熻釜Id */
+    traceId?: string;
+    level?: EnumLogLevel;
+    /** 鍐呭 */
+    content: string;
+    /** 鍫嗘爤璺熻釜 */
+    stackTrace?: string;
+    /** 閾炬帴鍦板潃 */
+    url?: string;
+    /** 浼犲弬 */
+    request?: string;
+    /** 鎵╁睍 */
+    ext?: string;
+  }
+
   interface SaveMenuButtonCommand {
     /** 鑿滃崟Id */
     parentId?: string;
@@ -5848,6 +6140,29 @@
     menuIds?: string[];
     /** 璧勬簮 */
     resources?: GetRoleQueryResultResource[];
+  }
+
+  interface SaveSmsSettingCommand {
+    /** 鏄惁绂佺敤 */
+    isDisabled?: boolean;
+    /** 甯﹀嚭鍙傛暟 */
+    withoutParams?: boolean;
+    /** 姣忓垎閽熸渶澶ф暟閲� */
+    minutelyMaxCount?: number;
+    /** 姣忓皬鏃舵渶澶ф暟閲� */
+    hourlyMaxCount?: number;
+    /** 姣忓ぉ鏈�澶ф暟閲� */
+    dailyMaxCount?: number;
+    /** 閫氶亾閰嶇疆 */
+    accesses?: SaveSmsSettingCommandAccess[];
+  }
+
+  interface SaveSmsSettingCommandAccess {
+    access?: EnumSmsAccess;
+    /** 鏄惁绂佺敤 */
+    isDisabled?: boolean;
+    /** 鎺掑簭 */
+    sort?: number;
   }
 
   interface SaveTaskInfoCommand {
@@ -6113,6 +6428,8 @@
     status?: EnumUserStatus;
   }
 
+  type SmsChengLiYeNotifyCommand = Record<string, any>;
+
   interface SmsLoginCommand {
     /** 鎵嬫満鍙风爜 */
     phoneNumber?: string;
diff --git a/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue b/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue
index b5d4e92..d69605a 100644
--- a/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue
+++ b/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue
@@ -68,7 +68,7 @@
               </ProFormItemV2>
             </ProFormColItem>
             <ProFormColItem :span="8">
-              <ProFormItemV2 label="鎵�灞炶涓�:" prop="industryTypeId">
+              <ProFormItemV2 label="鎵�灞炶涓�:" prop="industryTypeCode">
                 <ProFormSelect
                   v-model="form.industryTypeCode"
                   placeholder="璇烽�夋嫨鎵�灞炶涓�"
@@ -248,8 +248,6 @@
   password: '',
 });
 
-console.log('form: ', form);
-
 const { isLoading } = useQuery({
   queryKey: ['enterpriseServices/getEnterprise', id],
   queryFn: async () => {
@@ -266,7 +264,7 @@
     form.legalPerson = data.legalPerson;
     form.legalIdentity = data.legalIdentity;
     form.societyCreditCode = data.societyCreditCode;
-    form.industryTypeCode = data.industryTypeCode;
+    form.industryTypeCode = data.industryTypeCode ?? '';
     form.mainBusiness = data.mainBusiness;
     form.contacts = data.contacts;
     form.contactPhoneNumber = data.contactPhoneNumber;
diff --git a/src/views/EnterpriseManage/components/ConfigureDialog.vue b/src/views/EnterpriseManage/components/ConfigureDialog.vue
index ad4c081..ae35d49 100644
--- a/src/views/EnterpriseManage/components/ConfigureDialog.vue
+++ b/src/views/EnterpriseManage/components/ConfigureDialog.vue
@@ -13,9 +13,9 @@
       <el-tab-pane lazy :name="EnterpriseConfigureType.AliPay">
         <AliPayConfigureView :id="form.id" ref="aliPayConfigureViewRef" />
       </el-tab-pane>
-      <!-- <el-tab-pane lazy :name="EnterpriseConfigureType.Wechat">
+      <el-tab-pane lazy :name="EnterpriseConfigureType.Wechat">
         <WechatConfigureView :id="form.id" ref="wechatConfigureViewRef" />
-      </el-tab-pane> -->
+      </el-tab-pane>
       <el-tab-pane lazy :name="EnterpriseConfigureType.Electronic">
         <ElectronicConfigureView :id="form.id" ref="electronicConfigureViewRef" />
       </el-tab-pane>
@@ -87,10 +87,9 @@
     res = await electronicConfigureViewRef.value?.onConfirm?.();
   } else if (form.value.enterpriseConfigureType === EnterpriseConfigureType.ShortMessage) {
     res = await shortMessageConfigureViewRef.value?.onConfirm?.();
+  } else if (form.value.enterpriseConfigureType === EnterpriseConfigureType.Wechat) {
+    res = await wechatConfigureViewRef.value?.onConfirm?.();
   }
-  //  else if (form.value.enterpriseConfigureType === EnterpriseConfigureType.Wechat) {
-  //   res = await wechatConfigureViewRef.value?.onConfirm?.();
-  // }
   if (res) {
     emit('onConfirm');
   }
diff --git a/src/views/EnterpriseManage/components/WechatConfigureView.vue b/src/views/EnterpriseManage/components/WechatConfigureView.vue
index 24c7f4d..92ed870 100644
--- a/src/views/EnterpriseManage/components/WechatConfigureView.vue
+++ b/src/views/EnterpriseManage/components/WechatConfigureView.vue
@@ -1,6 +1,6 @@
 <template>
   <LoadingLayout :loading="isLoading">
-    <ProForm :model="form" ref="dialogForm" label-width="120px">
+    <ProForm :model="form" ref="dialogForm" label-width="130px">
       <ProFormItemV2
         label="鑱旂郴浜哄鍚�:"
         prop="name"
@@ -14,6 +14,23 @@
         :checkRules="[{ message: '璇烽�夋嫨鑱旂郴浜虹被鍨�' }]"
       >
         <ProFormRadio v-model.trim="form.name" :value-enum="[]" button-style />
+      </ProFormItemV2>
+      <ProFormItemV2
+        label="涓氬姟鍔炵悊鎺堟潈鍑�:"
+        prop="url"
+        :check-rules="[{ type: 'upload', message: '璇蜂笂浼犱笟鍔″姙鐞嗘巿鏉冨嚱' }]"
+      >
+        <div style="display: flex">
+          <ProFormUpload
+            v-model:file-url="form.url"
+            :limit="1"
+            :limitFileSize="10"
+            accept="png,jpg,jpeg,pdf"
+          ></ProFormUpload>
+          <el-button style="margin-left: 10px" type="primary" link @click="downloadTemplate"
+            >妯℃澘涓嬭浇</el-button
+          >
+        </div>
       </ProFormItemV2>
       <ProFormItemV2
         label="鎵嬫満鍙�:"
@@ -33,12 +50,13 @@
         <ProFormSelect v-model="form.name" :valueEnum="[]" placeholder="璇烽�夋嫨涓讳綋绫诲瀷">
         </ProFormSelect>
       </ProFormItemV2>
-      <ProFormItemV2
-        label="鍟嗘埛绠�绉�:"
-        prop="name"
-        :checkRules="[{ type: 'phone', message: '璇疯緭鍏ュ晢鎴风畝绉�' }]"
-      >
-        <ProFormText :maxlength="64" v-model.trim="form.name" placeholder="璇疯緭鍏ュ晢鎴风畝绉�" />
+      <ProFormItemV2 label="鍟嗘埛绠�绉�:" prop="name" :checkRules="[{ message: '璇疯緭鍏ュ晢鎴风畝绉�' }]">
+        <ProFormText
+          :maxlength="64"
+          show-word-limit
+          v-model.trim="form.name"
+          placeholder="璇疯緭鍏ュ晢鎴风畝绉�"
+        />
       </ProFormItemV2>
       <ProFormItemV2
         label="瀹㈡湇鐢佃瘽:"
@@ -79,17 +97,13 @@
         <ProFormSelect v-model="form.name" :valueEnum="[]" placeholder="璇烽�夋嫨缁撶畻璐︽埛">
         </ProFormSelect>
       </ProFormItemV2>
-      <ProFormItemV2
-        label="寮�鎴烽摱琛�:"
-        prop="name"
-        :checkRules="[{ type: 'phone', message: '璇疯緭鍏ュ紑鎴烽摱琛�' }]"
-      >
-        <ProFormText :maxlength="64" v-model.trim="form.name" placeholder="璇疯緭鍏ュ紑鎴烽摱琛�" />
+      <ProFormItemV2 label="寮�鎴烽摱琛�:" prop="name" :checkRules="[{ message: '璇疯緭鍏ュ紑鎴烽摱琛�' }]">
+        <ProFormText v-model.trim="form.name" placeholder="璇疯緭鍏ュ紑鎴烽摱琛�" />
       </ProFormItemV2>
       <ProFormItemV2
         label="閾惰璐﹀彿:"
         prop="name"
-        :checkRules="[{ type: 'tel', message: '璇疯緭鍏ラ摱琛岃处鍙�' }]"
+        :checkRules="[{ message: '璇疯緭鍏ラ摱琛岃处鍙�', type: 'bankCard' }]"
       >
         <ProFormText v-model.trim="form.name" placeholder="璇疯緭鍏ラ摱琛岃处鍙�" />
       </ProFormItemV2>
@@ -112,7 +126,7 @@
 } from '@bole-core/components';
 import * as enterpriseWalletServices from '@/services/api/enterpriseWallet';
 import { useQuery } from '@tanstack/vue-query';
-import { convertWalletApiToFiles, convertWalletFilesToApi } from '@/utils';
+import { convertWalletApiToFiles, convertWalletFilesToApi, downloadFileByUrl } from '@/utils';
 
 defineOptions({
   name: 'WechatConfigureView',
@@ -167,6 +181,13 @@
   } catch (error) {}
 }
 
+function downloadTemplate() {
+  downloadFileByUrl(
+    'https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/FlexJob/temp/%E4%B8%9A%E5%8A%A1%E5%8A%9E%E7%90%86%E6%8E%88%E6%9D%83%E5%87%BD.png',
+    '涓氬姟鍔炵悊鎺堟潈鍑�'
+  );
+}
+
 defineExpose({
   onConfirm: enterpriseWalletExpandindirectCreate,
 });
diff --git a/src/views/System/SmsSettingManage.vue b/src/views/System/SmsSettingManage.vue
new file mode 100644
index 0000000..08b5b50
--- /dev/null
+++ b/src/views/System/SmsSettingManage.vue
@@ -0,0 +1,215 @@
+<template>
+  <LoadingLayout :loading="isLoading">
+    <AppContainer>
+      <PageFormLayout>
+        <ProForm :model="form" ref="formRef" label-width="120px" :is-read="isRead">
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="鏄惁绂佺敤:" prop="isDisabled">
+                <ProFormRadio
+                  v-model="form.isDisabled"
+                  :value-enum="BooleanOptions"
+                  :button-style="false"
+                ></ProFormRadio>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="甯﹀嚭鍙傛暟:" prop="withoutParams">
+                <ProFormRadio
+                  v-model="form.withoutParams"
+                  :value-enum="BooleanOptions"
+                  :button-style="false"
+                ></ProFormRadio>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="姣忓垎閽熸渶澶ф暟閲�:" prop="minutelyMaxCount">
+                <ProFormInputNumber
+                  :controls="false"
+                  :min="0"
+                  v-model="form.minutelyMaxCount"
+                  placeholder="璇疯緭鍏�"
+                ></ProFormInputNumber>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="姣忓皬鏃舵渶澶ф暟閲�:" prop="hourlyMaxCount">
+                <ProFormInputNumber
+                  :controls="false"
+                  :min="0"
+                  v-model="form.hourlyMaxCount"
+                  placeholder="璇疯緭鍏�"
+                ></ProFormInputNumber>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="姣忓ぉ鏈�澶ф暟閲�:" prop="dailyMaxCount">
+                <ProFormInputNumber
+                  :controls="false"
+                  :min="0"
+                  v-model="form.dailyMaxCount"
+                  placeholder="璇疯緭鍏�"
+                ></ProFormInputNumber>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="閫氶亾閰嶇疆:" prop="accesses">
+                <div class="access-list">
+                  <div class="access-item" v-for="(item, index) in form.accesses" :key="index">
+                    <div class="access-item-label">
+                      {{ EnumSmsAccessTextUseInSms[item.access] }}
+                    </div>
+                    <ProFormRadio
+                      v-model="item.isDisabled"
+                      :value-enum="BooleanOptions"
+                      :button-style="false"
+                    ></ProFormRadio>
+                    <ProFormInputNumber
+                      :controls="false"
+                      :min="0"
+                      v-model="item.sort"
+                      placeholder="璇疯緭鍏�"
+                    ></ProFormInputNumber>
+                  </div>
+                </div>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+        </ProForm>
+        <template #footer>
+          <el-button type="primary" v-if="isRead" @click="isRead = false">缂栬緫</el-button>
+          <el-button type="primary" v-else @click="handleConfirm">纭</el-button>
+        </template>
+      </PageFormLayout>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  LoadingLayout,
+  AppContainer,
+  PageFormLayout,
+  ProForm,
+  ProFormCol,
+  ProFormColItem,
+  ProFormItemV2,
+  ProFormInputNumber,
+  ProFormRadio,
+} from '@bole-core/components';
+import { useQuery } from '@tanstack/vue-query';
+import * as smsServices from '@/services/api/sms';
+import { BooleanOptions, EnumSmsAccessTextUseInSms } from '@/constants';
+import { FormInstance } from 'element-plus';
+import { Message } from '@bole-core/core';
+
+defineOptions({
+  name: 'SmsSettingManage',
+});
+
+const form = reactive({
+  isDisabled: false,
+  withoutParams: false,
+  minutelyMaxCount: 0,
+  hourlyMaxCount: 0,
+  dailyMaxCount: 0,
+  accesses: [] as API.SaveSmsSettingCommandAccess[],
+});
+
+const isRead = ref(true);
+
+const { isLoading } = useQuery({
+  queryKey: ['smsServices/getSmsSetting'],
+  queryFn: async () => {
+    return await smsServices.getSmsSetting(
+      {},
+      {
+        showLoading: false,
+      }
+    );
+  },
+  placeholderData: () => ({} as API.GetSmsSettingQueryResult),
+  onSuccess(data) {
+    form.isDisabled = data.isDisabled;
+    form.withoutParams = data.withoutParams;
+    form.minutelyMaxCount = data.minutelyMaxCount;
+    form.hourlyMaxCount = data.hourlyMaxCount;
+    form.dailyMaxCount = data.dailyMaxCount;
+    form.accesses = data.accesses;
+  },
+});
+
+const formRef = ref<FormInstance>();
+
+function handleConfirm() {
+  if (!formRef.value) return;
+  formRef.value.validate((valid) => {
+    if (valid) {
+      submit();
+    } else {
+      return;
+    }
+  });
+}
+
+async function submit() {
+  try {
+    let params: API.SaveSmsSettingCommand = {
+      isDisabled: form.isDisabled,
+      withoutParams: form.withoutParams,
+      minutelyMaxCount: form.minutelyMaxCount,
+      hourlyMaxCount: form.hourlyMaxCount,
+      dailyMaxCount: form.dailyMaxCount,
+      accesses: form.accesses,
+    };
+    let res = await smsServices.saveSmsSetting(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      isRead.value = true;
+    }
+  } catch (error) {}
+}
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.access-list {
+  flex: 1;
+  min-width: 0;
+
+  :deep() {
+    .el-form-item__content {
+      flex-direction: column;
+      align-items: flex-start;
+    }
+  }
+}
+
+.access-item {
+  display: flex;
+  align-items: center;
+  margin-bottom: 10px;
+
+  .access-item-label {
+    margin-right: 20px;
+    word-break: keep-all;
+  }
+
+  :deep() {
+    .el-radio-group {
+      margin-right: 20px;
+    }
+  }
+}
+</style>
diff --git a/src/views/TraceIdLogManage/DbAuditLogs.vue b/src/views/TraceIdLogManage/DbAuditLogs.vue
new file mode 100644
index 0000000..9b62f3a
--- /dev/null
+++ b/src/views/TraceIdLogManage/DbAuditLogs.vue
@@ -0,0 +1,230 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="鎿嶄綔">
+            <FieldRadio
+              v-model="extraParamState.operate"
+              :value-enum="EnumDbAuditOperateText"
+              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="鎿嶄綔浜篶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.tableName"
+              style="width: 260px"
+              placeholder="琛ㄥ悕tableName"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.primaryKey"
+              style="width: 260px"
+              placeholder="涓婚敭primaryKey"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.oldValues"
+              style="width: 260px"
+              placeholder="鏃у�紀ldValues"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.newValues"
+              style="width: 260px"
+              placeholder="鏂板�糿ewValues"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
+        <template #oldValues="{ row }">
+          <el-button
+            v-if="row.oldValues"
+            type="primary"
+            link
+            @click="handleAdd({ json: { oldValues: JSON.parse(row.oldValues) } })"
+            >鏌ョ湅</el-button
+          >
+        </template>
+        <template #newValues="{ row }">
+          <el-button
+            v-if="row.newValues"
+            type="primary"
+            link
+            @click="handleAdd({ json: { newValues: JSON.parse(row.newValues) } })"
+            >鏌ョ湅</el-button
+          >
+        </template>
+        <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 { EnumDbAuditOperateText } 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: 'DbAuditLogs',
+});
+
+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.GetDbAuditLogsQuery = {
+        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,
+        tableName: extraParamState.tableName,
+        primaryKey: extraParamState.primaryKey,
+        operate: extraParamState.operate,
+        oldValues: extraParamState.oldValues,
+        newValues: extraParamState.newValues,
+      };
+      let res = await logRecordsServices.getDbAuditLogs(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      createdUser: '',
+      traceId: '',
+      operate: '' as any as EnumDbAuditOperate,
+      tableName: '',
+      primaryKey: '',
+      oldValues: '',
+      newValues: '',
+      createdTime: [] as unknown as ModelValueType,
+      orderInput: [{ property: 'createdTime', order: EnumPagedListOrder.Desc }],
+    },
+    columnsRenderProps: {
+      createdTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      operate: { type: 'enum', valueEnum: EnumDbAuditOperateText },
+    },
+  }
+);
+
+const { dialogProps, handleAdd } = useFormDialog({
+  defaultFormParams: {
+    json: null,
+  },
+});
+
+function openDialog(row: API.GetDbAuditLogsQueryResultItem) {
+  handleAdd({
+    json: {
+      oldValues: JSON.parse(row.oldValues),
+      newValues: JSON.parse(row.newValues),
+      createdUser: JSON.parse(JSON.stringify(row.createdUser)),
+    },
+  });
+}
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/views/TraceIdLogManage/ExceptionLogs.vue b/src/views/TraceIdLogManage/ExceptionLogs.vue
new file mode 100644
index 0000000..b6e0c69
--- /dev/null
+++ b/src/views/TraceIdLogManage/ExceptionLogs.vue
@@ -0,0 +1,185 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <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.type"
+              style="width: 260px"
+              placeholder="绫诲瀷type"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.code"
+              style="width: 260px"
+              placeholder="浠g爜code"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.message"
+              style="width: 260px"
+              placeholder="娑堟伅message"
+              @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 * as logRecordsServices from '@/services/api/logRecords';
+import { ModelValueType } from 'element-plus';
+import { format } from '@/utils';
+import JsonViewerDialog from './components/JsonViewerDialog.vue';
+
+defineOptions({
+  name: 'ExceptionLogs',
+});
+
+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.GetExceptionLogsQuery = {
+        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,
+        type: extraParamState.type,
+        code: extraParamState.code,
+        message: extraParamState.message,
+      };
+      let res = await logRecordsServices.getExceptionLogs(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      createdUser: '',
+      traceId: '',
+      type: '',
+      code: '',
+      message: '',
+      createdTime: [] as unknown as ModelValueType,
+      orderInput: [{ property: 'createdTime', order: EnumPagedListOrder.Desc }],
+    },
+    columnsRenderProps: {
+      createdTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+    },
+  }
+);
+
+const { dialogProps, handleAdd } = useFormDialog({
+  defaultFormParams: {
+    json: null,
+  },
+});
+
+function openDialog(row: API.GetResourceLogsQueryResultItem) {
+  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/ResourceLogs.vue b/src/views/TraceIdLogManage/ResourceLogs.vue
new file mode 100644
index 0000000..ff92f5e
--- /dev/null
+++ b/src/views/TraceIdLogManage/ResourceLogs.vue
@@ -0,0 +1,281 @@
+<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="鎿嶄綔浜篶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.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="瀹㈡埛绔疘P鍦板潃clientIpAddress"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.elapsedMillisecondsMin"
+              style="width: 260px"
+              placeholder="鏈�灏忚�楁椂姣鏁癳lapsedMillisecondsMin"
+              @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: 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 * 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: JSON.parse(JSON.stringify(row.createdUser)),
+    },
+  });
+}
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/views/TraceIdLogManage/ThreeResourceLogs.vue b/src/views/TraceIdLogManage/ThreeResourceLogs.vue
new file mode 100644
index 0000000..0f2115a
--- /dev/null
+++ b/src/views/TraceIdLogManage/ThreeResourceLogs.vue
@@ -0,0 +1,281 @@
+<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="鎿嶄綔浜篶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.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="瀹㈡埛绔疘P鍦板潃clientIpAddress"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.elapsedMillisecondsMin"
+              style="width: 260px"
+              placeholder="鏈�灏忚�楁椂姣鏁癳lapsedMillisecondsMin"
+              @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: 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 * as logRecordsServices from '@/services/api/logRecords';
+import { ModelValueType } from 'element-plus';
+import { format } from '@/utils';
+import JsonViewerDialog from './components/JsonViewerDialog.vue';
+
+defineOptions({
+  name: 'ThreeResourceLogs',
+});
+
+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.GetThreeResourceLogsQuery = {
+        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,
+        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.getThreeResourceLogs(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: JSON.parse(JSON.stringify(row.createdUser)),
+    },
+  });
+}
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/views/TraceIdLogManage/components/DbAuditLogsView.vue b/src/views/TraceIdLogManage/components/DbAuditLogsView.vue
index 5d6f420..4521b6a 100644
--- a/src/views/TraceIdLogManage/components/DbAuditLogsView.vue
+++ b/src/views/TraceIdLogManage/components/DbAuditLogsView.vue
@@ -1,44 +1,4 @@
 <template>
-  <!-- <el-collapse v-model="activeName" accordion>
-    <el-collapse-item
-      v-for="item in dbAuditLogs"
-      :key="item.createdTime"
-      name="1"
-      style="overflow: auto; max-height: 600px"
-    >
-      <ProForm :model="item" is-read>
-        <ProFormItemV2 label="tableName:">
-          {{ item.tableName }}
-        </ProFormItemV2>
-        <ProFormItemV2 label="primaryKey:">{{ item.primaryKey }} </ProFormItemV2>
-        <ProFormItemV2 label="operate:"> {{ EnumDbAuditOperateText[item.operate] }}</ProFormItemV2>
-        <ProFormItemV2 label="oldValues:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.oldValues)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="newValues:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.newValues)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="createdUser:">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(JSON.stringify(item.createdUser))"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="createdTime:">
-          {{ format(item.createdTime, 'YYYY-MM-DD HH:mm:ss') }}</ProFormItemV2
-        >
-      </ProForm>
-    </el-collapse-item>
-  </el-collapse> -->
   <AppContainer>
     <ProTableV2
       :columns="columns"
@@ -47,12 +7,18 @@
       :column-render-map="columnsRenderProps"
     >
       <template #oldValues="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.stringify(row.oldValues) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { oldValues: JSON.parse(row.oldValues) } })"
           >鏌ョ湅</el-button
         >
       </template>
       <template #newValues="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.stringify(row.newValues) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { newValues: JSON.parse(row.newValues) } })"
           >鏌ョ湅</el-button
         >
       </template>
@@ -60,7 +26,7 @@
         <el-button
           type="primary"
           link
-          @click="handleAdd({ json: JSON.parse(JSON.stringify(row.createdUser)) })"
+          @click="handleAdd({ json: { createdUser: JSON.parse(JSON.stringify(row.createdUser)) } })"
           >鏌ョ湅</el-button
         >
       </template>
@@ -76,6 +42,7 @@
   defineColumns,
   ProTableV2Props,
   useFormDialog,
+  defineOperationBtns,
 } from '@bole-core/components';
 import JsonViewerDialog from './JsonViewerDialog.vue';
 
@@ -107,6 +74,18 @@
   }))
 );
 
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'detailBtn',
+      name: '鏌ョ湅',
+    },
+    emits: {
+      onClick: (role) => openDialog(role),
+    },
+  },
+]);
+
 const columnsRenderProps: ProTableV2Props['columnRenderMap'] = {
   operate: { type: 'enum', valueEnum: EnumDbAuditOperateText },
   createdTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
@@ -117,6 +96,16 @@
     json: null,
   },
 });
+
+function openDialog(row: API.GetDbAuditLogsQueryResultItem) {
+  handleAdd({
+    json: {
+      oldValues: JSON.parse(row.oldValues),
+      newValues: JSON.parse(row.newValues),
+      createdUser: JSON.parse(JSON.stringify(row.createdUser)),
+    },
+  });
+}
 </script>
 
 <style lang="scss" scoped>
diff --git a/src/views/TraceIdLogManage/components/ExceptionLogsView.vue b/src/views/TraceIdLogManage/components/ExceptionLogsView.vue
index 1181afd..6625456 100644
--- a/src/views/TraceIdLogManage/components/ExceptionLogsView.vue
+++ b/src/views/TraceIdLogManage/components/ExceptionLogsView.vue
@@ -1,31 +1,4 @@
 <template>
-  <!-- <el-collapse v-model="activeName" accordion>
-    <el-collapse-item
-      v-for="item in exceptionLogs"
-      :key="item.createdTime"
-      name="1"
-      style="overflow: auto; max-height: 600px"
-    >
-      <ProForm :model="item" is-read>
-        <ProFormItemV2 label="type:">
-          {{ item.type }}
-        </ProFormItemV2>
-        <ProFormItemV2 label="code:">{{ item.code }} </ProFormItemV2>
-        <ProFormItemV2 label="message:"> {{ item.message }}</ProFormItemV2>
-        <ProFormItemV2 label="stackTrace:"> {{ item.stackTrace }}</ProFormItemV2>
-        <ProFormItemV2 label="createdUser:">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(JSON.stringify(item.createdUser))"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="createdTime:">
-          {{ format(item.createdTime, 'YYYY-MM-DD HH:mm:ss') }}</ProFormItemV2
-        >
-      </ProForm>
-    </el-collapse-item>
-  </el-collapse> -->
   <AppContainer>
     <ProTableV2
       :columns="columns"
diff --git a/src/views/TraceIdLogManage/components/JsonViewerDialog.vue b/src/views/TraceIdLogManage/components/JsonViewerDialog.vue
index 013001b..5346c74 100644
--- a/src/views/TraceIdLogManage/components/JsonViewerDialog.vue
+++ b/src/views/TraceIdLogManage/components/JsonViewerDialog.vue
@@ -1,12 +1,23 @@
 <template>
   <ProDialog title="鏌ョ湅" v-model="visible" destroy-on-close draggable>
-    <json-viewer
-      :copyable="true"
-      :boxed="true"
-      :preview-mode="true"
-      :value="form.json"
-      expanded
-    ></json-viewer>
+    <ProForm :model="form" ref="dialogForm" label-width="120px">
+      <ProFormItemV2
+        v-for="(item, index) in jsonList"
+        :label="`${item}锛歚"
+        :key="index"
+        prop="electronSignAccesses"
+        required
+      >
+        <json-viewer
+          :copyable="true"
+          :boxed="true"
+          :preview-mode="true"
+          :value="form.json?.[item]"
+          expanded
+        ></json-viewer>
+      </ProFormItemV2>
+    </ProForm>
+
     <template #footer>
       <span class="dialog-footer">
         <el-button @click="emit('onCancel')">鍙� 娑�</el-button>
@@ -17,7 +28,7 @@
 </template>
 
 <script setup lang="ts">
-import { ProDialog } from '@bole-core/components';
+import { ProDialog, ProForm, ProFormItemV2 } from '@bole-core/components';
 import JsonViewer from 'vue-json-viewer';
 
 defineOptions({
@@ -37,6 +48,10 @@
 
 const form = defineModel<Form>('form');
 
+const jsonList = computed(() => {
+  return Object.keys(form.value.json);
+});
+
 const emit = defineEmits<{
   (e: 'onConfirm'): void;
   (e: 'onCancel'): void;
diff --git a/src/views/TraceIdLogManage/components/ResourceLogsView.vue b/src/views/TraceIdLogManage/components/ResourceLogsView.vue
index 1c2096b..f7b9f3c 100644
--- a/src/views/TraceIdLogManage/components/ResourceLogsView.vue
+++ b/src/views/TraceIdLogManage/components/ResourceLogsView.vue
@@ -1,66 +1,4 @@
 <template>
-  <!-- <el-collapse v-model="activeName" accordion>
-    <el-collapse-item
-      v-for="item in resourceLogs"
-      :key="item.id"
-      name="1"
-      style="overflow: auto; max-height: 600px"
-    >
-      <template #title>
-        <el-button type="primary" @click="resend(item.id)" link>閲嶆柊鍙戦��</el-button>
-      </template>
-      <ProForm :model="item" is-read style="padding: 0 20px">
-        <ProFormItemV2 label="method:">
-          {{ EnumResourceMethodText[item.method] }}
-        </ProFormItemV2>
-        <ProFormItemV2 label="domain:">{{ item.domain }} </ProFormItemV2>
-        <ProFormItemV2 label="path:"> {{ item.path }}</ProFormItemV2>
-        <ProFormItemV2 label="requestHeaders:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.requestHeaders)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="request:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.request)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="responseHeaders:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.responseHeaders)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="response:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.response)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="isSuccess:"> {{ item.isSuccess ? '鏄�' : '鍚�' }}</ProFormItemV2>
-        <ProFormItemV2 label="clientIpAddress:"> {{ item.clientIpAddress }}</ProFormItemV2>
-        <ProFormItemV2 label="refererUrl:"> {{ item.refererUrl }}</ProFormItemV2>
-        <ProFormItemV2 label="consoleLogs:"> {{ item.consoleLogs }}</ProFormItemV2>
-        <ProFormItemV2 label="elapsedMilliseconds:"> {{ item.elapsedMilliseconds }}</ProFormItemV2>
-        <ProFormItemV2 label="createdUser:">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(JSON.stringify(item.createdUser))"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="createdTime:">
-          {{ format(item.createdTime, 'YYYY-MM-DD HH:mm:ss') }}</ProFormItemV2
-        >
-      </ProForm>
-    </el-collapse-item>
-  </el-collapse> -->
   <AppContainer>
     <ProTableV2
       :columns="columns"
@@ -70,22 +8,34 @@
       :column-render-map="columnsRenderProps"
     >
       <template #requestHeaders="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.parse(row.requestHeaders) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { requestHeaders: JSON.parse(row.requestHeaders) } })"
           >鏌ョ湅</el-button
         >
       </template>
       <template #request="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.parse(row.request) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { request: JSON.parse(row.request) } })"
           >鏌ョ湅</el-button
         >
       </template>
       <template #responseHeaders="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.parse(row.responseHeaders) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { responseHeaders: JSON.parse(row.responseHeaders) } })"
           >鏌ョ湅</el-button
         >
       </template>
       <template #response="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.parse(row.response) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { response: JSON.parse(row.response) } })"
           >鏌ョ湅</el-button
         >
       </template>
@@ -93,7 +43,7 @@
         <el-button
           type="primary"
           link
-          @click="handleAdd({ json: JSON.parse(JSON.stringify(row.createdUser)) })"
+          @click="handleAdd({ json: { createdUser: JSON.parse(JSON.stringify(row.createdUser)) } })"
           >鏌ョ湅</el-button
         >
       </template>
@@ -115,6 +65,7 @@
 import * as logRecordsServices from '@/services/api/logRecords';
 import { Message } from '@bole-core/core';
 import JsonViewerDialog from './JsonViewerDialog.vue';
+import { request } from 'http';
 
 defineOptions({
   name: 'ResourceLogsView',
@@ -155,6 +106,15 @@
 const operationBtns = defineOperationBtns([
   {
     data: {
+      enCode: 'detailBtn',
+      name: '鏌ョ湅',
+    },
+    emits: {
+      onClick: (role) => openDialog(role),
+    },
+  },
+  {
+    data: {
       enCode: 'reSendBtn',
       name: '閲嶆柊鍙戦��',
     },
@@ -189,6 +149,18 @@
     }
   } catch (error) {}
 }
+
+function openDialog(row: API.GetResourceLogsQueryResultItem) {
+  handleAdd({
+    json: {
+      requestHeaders: row.requestHeaders,
+      request: row.request,
+      responseHeaders: row.responseHeaders,
+      response: row.response,
+      createdUser: JSON.stringify(row.createdUser),
+    },
+  });
+}
 </script>
 
 <style lang="scss" scoped>
diff --git a/src/views/TraceIdLogManage/components/ThreeResourceLogsView.vue b/src/views/TraceIdLogManage/components/ThreeResourceLogsView.vue
index e650493..333817d 100644
--- a/src/views/TraceIdLogManage/components/ThreeResourceLogsView.vue
+++ b/src/views/TraceIdLogManage/components/ThreeResourceLogsView.vue
@@ -1,84 +1,40 @@
 <template>
-  <!-- <el-collapse v-model="activeName" accordion>
-    <el-collapse-item
-      v-for="item in threeResourceLogs"
-      :key="item.id"
-      name="1"
-      style="overflow: auto; max-height: 600px"
-    >
-      <ProForm :model="item" is-read>
-        <ProFormItemV2 label="method:">
-          {{ EnumResourceMethodText[item.method] }}
-        </ProFormItemV2>
-        <ProFormItemV2 label="domain:">{{ item.domain }} </ProFormItemV2>
-        <ProFormItemV2 label="path:"> {{ item.path }}</ProFormItemV2>
-        <ProFormItemV2 label="requestHeaders:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.requestHeaders)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="request:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.request)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="responseHeaders:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.responseHeaders)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="response:" label-position="top">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(item.response)"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="isSuccess:"> {{ item.isSuccess ? '鏄�' : '鍚�' }}</ProFormItemV2>
-        <ProFormItemV2 label="elapsedMilliseconds:"> {{ item.elapsedMilliseconds }}</ProFormItemV2>
-        <ProFormItemV2 label="createdUser:">
-          <json-viewer
-            :copyable="true"
-            :boxed="true"
-            :value="JSON.parse(JSON.stringify(item.createdUser))"
-          ></json-viewer>
-        </ProFormItemV2>
-        <ProFormItemV2 label="createdTime:">
-          {{ format(item.createdTime, 'YYYY-MM-DD HH:mm:ss') }}</ProFormItemV2
-        >
-      </ProForm>
-    </el-collapse-item>
-  </el-collapse> -->
   <AppContainer>
     <ProTableV2
       :columns="columns"
-      :show-pagination="false"
+      :operationBtns="operationBtns"
       :table-data="threeResourceLogs"
       :column-render-map="columnsRenderProps"
     >
       <template #requestHeaders="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.parse(row.requestHeaders) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { requestHeaders: JSON.parse(row.requestHeaders) } })"
           >鏌ョ湅</el-button
         >
       </template>
       <template #request="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.parse(row.request) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { request: JSON.parse(row.request) } })"
           >鏌ョ湅</el-button
         >
       </template>
       <template #responseHeaders="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.parse(row.responseHeaders) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { responseHeaders: JSON.parse(row.responseHeaders) } })"
           >鏌ョ湅</el-button
         >
       </template>
       <template #response="{ row }">
-        <el-button type="primary" link @click="handleAdd({ json: JSON.parse(row.response) })"
+        <el-button
+          type="primary"
+          link
+          @click="handleAdd({ json: { response: JSON.parse(row.response) } })"
           >鏌ョ湅</el-button
         >
       </template>
@@ -86,7 +42,7 @@
         <el-button
           type="primary"
           link
-          @click="handleAdd({ json: JSON.parse(JSON.stringify(row.createdUser)) })"
+          @click="handleAdd({ json: { createdUser: JSON.parse(JSON.stringify(row.createdUser)) } })"
           >鏌ョ湅</el-button
         >
       </template>
@@ -102,6 +58,7 @@
   defineColumns,
   ProTableV2Props,
   useFormDialog,
+  defineOperationBtns,
 } from '@bole-core/components';
 import { EnumResourceMethodText } from '@/constants';
 import JsonViewerDialog from './JsonViewerDialog.vue';
@@ -138,6 +95,18 @@
   }))
 );
 
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'detailBtn',
+      name: '鏌ョ湅',
+    },
+    emits: {
+      onClick: (role) => openDialog(role),
+    },
+  },
+]);
+
 const columnsRenderProps: ProTableV2Props['columnRenderMap'] = {
   method: { type: 'enum', valueEnum: EnumResourceMethodText },
   isSuccess: {
@@ -153,4 +122,16 @@
     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: JSON.parse(JSON.stringify(row.createdUser)),
+    },
+  });
+}
 </script>

--
Gitblit v1.9.1