@fudanda/admin-antd 2.20261107.1-beta.1 → 2.20261109.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/ApiTokensPage-w3JGRNQC.js +2 -0
- package/dist/chunks/ApiTokensPage-w3JGRNQC.js.map +1 -0
- package/dist/chunks/{App-BF96TQ_D.js → App-nh6_qOo8.js} +5 -5
- package/dist/chunks/{App-BF96TQ_D.js.map → App-nh6_qOo8.js.map} +1 -1
- package/dist/chunks/{AppModal-CLkMJ-96.js → AppModal-CEouaU03.js} +2 -2
- package/dist/chunks/{AppModal-CLkMJ-96.js.map → AppModal-CEouaU03.js.map} +1 -1
- package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js → ArcBaseAdmin-CX7fQz4x.js} +2 -2
- package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js.map → ArcBaseAdmin-CX7fQz4x.js.map} +1 -1
- package/dist/chunks/{DepartmentsPage-D6YVegPU.js → DepartmentsPage-BdD9VfDI.js} +2 -2
- package/dist/chunks/{DepartmentsPage-D6YVegPU.js.map → DepartmentsPage-BdD9VfDI.js.map} +1 -1
- package/dist/chunks/{DictsPage-uV3Uukwc.js → DictsPage-fxBdV1-3.js} +2 -2
- package/dist/chunks/{DictsPage-uV3Uukwc.js.map → DictsPage-fxBdV1-3.js.map} +1 -1
- package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js → EntityContextRuntime-CMhoj6qe.js} +2 -2
- package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js.map → EntityContextRuntime-CMhoj6qe.js.map} +1 -1
- package/dist/chunks/EntityContextRuntime-Dc89ZSnM.js +1 -0
- package/dist/chunks/{ExportButton-e2ybxuHb.js → ExportButton-DGxB2tcu.js} +2 -2
- package/dist/chunks/{ExportButton-e2ybxuHb.js.map → ExportButton-DGxB2tcu.js.map} +1 -1
- package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js → FileViewerPreviewPanel-BMZ7FdKV.js} +3 -3
- package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js.map → FileViewerPreviewPanel-BMZ7FdKV.js.map} +1 -1
- package/dist/chunks/{FilesPage-BI35mStl.js → FilesPage-DrgWELKy.js} +3 -3
- package/dist/chunks/{FilesPage-BI35mStl.js.map → FilesPage-DrgWELKy.js.map} +1 -1
- package/dist/chunks/IdentitySecurityPage-BjTKvr-O.js +9 -0
- package/dist/chunks/IdentitySecurityPage-BjTKvr-O.js.map +1 -0
- package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js → LogStatsScaffold-DaB0JeAN.js} +2 -2
- package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js.map → LogStatsScaffold-DaB0JeAN.js.map} +1 -1
- package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js → LoginLogsPage-VmYC7i6q.js} +2 -2
- package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js.map → LoginLogsPage-VmYC7i6q.js.map} +1 -1
- package/dist/chunks/{LoginLogsTable-BweUEjQX.js → LoginLogsTable-CULcc_e8.js} +2 -2
- package/dist/chunks/{LoginLogsTable-BweUEjQX.js.map → LoginLogsTable-CULcc_e8.js.map} +1 -1
- package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js → MarkdownPreviewPanel-CBcPc7Wv.js} +2 -2
- package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js.map → MarkdownPreviewPanel-CBcPc7Wv.js.map} +1 -1
- package/dist/chunks/{MasterDetailLayout-KVizcSNO.js → MasterDetailLayout-ByIBpmkZ.js} +2 -2
- package/dist/chunks/{MasterDetailLayout-KVizcSNO.js.map → MasterDetailLayout-ByIBpmkZ.js.map} +1 -1
- package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js → McpSettingsPage-C5V_rj2V.js} +2 -2
- package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js.map → McpSettingsPage-C5V_rj2V.js.map} +1 -1
- package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js → MemberAssignmentSheet-DL0fg1Yf.js} +2 -2
- package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js.map → MemberAssignmentSheet-DL0fg1Yf.js.map} +1 -1
- package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js → MenuCommandPalette-C2PvK3Gh.js} +2 -2
- package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js.map → MenuCommandPalette-C2PvK3Gh.js.map} +1 -1
- package/dist/chunks/{MenusPage-Dd7OLQYT.js → MenusPage-Bytd1HlW.js} +2 -2
- package/dist/chunks/{MenusPage-Dd7OLQYT.js.map → MenusPage-Bytd1HlW.js.map} +1 -1
- package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js → MonacoPreviewPanel-BZrNIcFZ.js} +2 -2
- package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js.map → MonacoPreviewPanel-BZrNIcFZ.js.map} +1 -1
- package/dist/chunks/{NavListPanel-Iz1RCkVw.js → NavListPanel-zwUDIYSP.js} +2 -2
- package/dist/chunks/{NavListPanel-Iz1RCkVw.js.map → NavListPanel-zwUDIYSP.js.map} +1 -1
- package/dist/chunks/{OperationLogsPage-Dt22tU4I.js → OperationLogsPage-D2BQdGNp.js} +2 -2
- package/dist/chunks/{OperationLogsPage-Dt22tU4I.js.map → OperationLogsPage-D2BQdGNp.js.map} +1 -1
- package/dist/chunks/{OperationLogsTable-B23Ry-2v.js → OperationLogsTable-DaaON4QR.js} +3 -3
- package/dist/chunks/{OperationLogsTable-B23Ry-2v.js.map → OperationLogsTable-DaaON4QR.js.map} +1 -1
- package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js → PDFPreviewPanel-CMmnWBKW.js} +3 -3
- package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js.map → PDFPreviewPanel-CMmnWBKW.js.map} +1 -1
- package/dist/chunks/{PositionsPage-BIKYQDB5.js → PositionsPage-CBZITssT.js} +2 -2
- package/dist/chunks/{PositionsPage-BIKYQDB5.js.map → PositionsPage-CBZITssT.js.map} +1 -1
- package/dist/chunks/{PreferencesSheetBody-D276rrp4.js → PreferencesSheetBody-B0poTPEA.js} +2 -2
- package/dist/chunks/{PreferencesSheetBody-D276rrp4.js.map → PreferencesSheetBody-B0poTPEA.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DLftC6KZ.js → ProfilePage-DLhacdWt.js} +2 -2
- package/dist/chunks/{ProfilePage-DLftC6KZ.js.map → ProfilePage-DLhacdWt.js.map} +1 -1
- package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js → ProjectInfoPage-CJpGxpu5.js} +2 -2
- package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js.map → ProjectInfoPage-CJpGxpu5.js.map} +1 -1
- package/dist/chunks/{RelationPanel-B4BeO0Bz.js → RelationPanel-BsbfEDo2.js} +2 -2
- package/dist/chunks/{RelationPanel-B4BeO0Bz.js.map → RelationPanel-BsbfEDo2.js.map} +1 -1
- package/dist/chunks/{RolesPage-BhltU2Qm.js → RolesPage-46dzdiah.js} +2 -2
- package/dist/chunks/{RolesPage-BhltU2Qm.js.map → RolesPage-46dzdiah.js.map} +1 -1
- package/dist/chunks/{SessionConflictModal-3R8jdYkI.js → SessionConflictModal-Bm38eExL.js} +2 -2
- package/dist/chunks/{SessionConflictModal-3R8jdYkI.js.map → SessionConflictModal-Bm38eExL.js.map} +1 -1
- package/dist/chunks/SettingModuleDetail-BjxUJeH5.js +17 -0
- package/dist/chunks/SettingModuleDetail-BjxUJeH5.js.map +1 -0
- package/dist/chunks/{SettingsPage-DMzeDrnc.js → SettingsPage-C32Vuizm.js} +2 -2
- package/dist/chunks/{SettingsPage-DMzeDrnc.js.map → SettingsPage-C32Vuizm.js.map} +1 -1
- package/dist/chunks/{StatCard-C0xSZyiS.js → StatCard-CRPfkSBY.js} +2 -2
- package/dist/chunks/{StatCard-C0xSZyiS.js.map → StatCard-CRPfkSBY.js.map} +1 -1
- package/dist/chunks/{UserGroupsPage-DTJdszHl.js → UserGroupsPage-08G5MdGm.js} +2 -2
- package/dist/chunks/{UserGroupsPage-DTJdszHl.js.map → UserGroupsPage-08G5MdGm.js.map} +1 -1
- package/dist/chunks/{UserLogsPanels-z4UhQtgu.js → UserLogsPanels-nbIrMym9.js} +2 -2
- package/dist/chunks/{UserLogsPanels-z4UhQtgu.js.map → UserLogsPanels-nbIrMym9.js.map} +1 -1
- package/dist/chunks/{UserTransferSelect-BJNUXMhl.js → UserTransferSelect-C8betaWG.js} +2 -2
- package/dist/chunks/{UserTransferSelect-BJNUXMhl.js.map → UserTransferSelect-C8betaWG.js.map} +1 -1
- package/dist/chunks/{UsersPage--p68X2Yr.js → UsersPage-BjTiNEqF.js} +2 -2
- package/dist/chunks/{UsersPage--p68X2Yr.js.map → UsersPage-BjTiNEqF.js.map} +1 -1
- package/dist/chunks/{browser-BKLM0ThC-3Xar5rZw.js → browser-BKLM0ThC-Cp7Gi4-F.js} +1 -1
- package/dist/chunks/{code-P0HJS_q1.js → code-LswxAr98.js} +1 -1
- package/dist/chunks/{direct-engine-BYEscsGg.js → direct-engine-Dv_6v4sx.js} +1 -1
- package/dist/chunks/{html-B__1Vr_C.js → html-BokjxlLb.js} +1 -1
- package/dist/chunks/{line-DzLRZVEq.js → line-Bqh6atHH.js} +1 -1
- package/dist/chunks/{lrc-kf-TilFB.js → lrc-T5e1svZG.js} +1 -1
- package/dist/chunks/{markdown-xIo-vnKK.js → markdown-BpWokN1s.js} +1 -1
- package/dist/chunks/{patch-BEaX-xYV.js → patch-BYVX5C9G.js} +1 -1
- package/dist/chunks/{worker-engine-FCdIQLzN.js → worker-engine-CtUAeI4G.js} +1 -1
- package/dist/core/hooks/queries/settings.d.ts +6 -0
- package/dist/core/hooks/queries/settings.d.ts.map +1 -1
- package/dist/core/hooks/queries/settings.js +34 -25
- package/dist/core/hooks/queries/settings.js.map +1 -1
- package/dist/core/hooks/useAuth.d.ts +2 -0
- package/dist/core/hooks/useAuth.d.ts.map +1 -1
- package/dist/core/hooks/useAuth.js.map +1 -1
- package/dist/core/index.js +7 -7
- package/dist/core/lib/go-auth-api.d.ts +1 -1
- package/dist/core/lib/go-auth-api.d.ts.map +1 -1
- package/dist/core/lib/go-auth-api.js +12 -8
- package/dist/core/lib/go-auth-api.js.map +1 -1
- package/dist/core/lib/native-operations.d.ts +85 -4
- package/dist/core/lib/native-operations.d.ts.map +1 -1
- package/dist/core/lib/native-operations.js +1 -0
- package/dist/core/lib/native-operations.js.map +1 -1
- package/dist/core/providers/GoAuthProvider.d.ts.map +1 -1
- package/dist/core/providers/GoAuthProvider.js +191 -142
- package/dist/core/providers/GoAuthProvider.js.map +1 -1
- package/dist/core/session-renewal.d.ts +15 -0
- package/dist/core/session-renewal.d.ts.map +1 -0
- package/dist/core/session-renewal.js +95 -0
- package/dist/core/session-renewal.js.map +1 -0
- package/dist/core/session-transition.d.ts +2 -0
- package/dist/core/session-transition.d.ts.map +1 -1
- package/dist/core/session-transition.js +20 -7
- package/dist/core/session-transition.js.map +1 -1
- package/dist/core/session.d.ts +4 -0
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +88 -61
- package/dist/core/session.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{src-C8_bzBi4.js → src-D6UlLiVN.js} +2 -2
- package/dist/{src-C8_bzBi4.js.map → src-D6UlLiVN.js.map} +1 -1
- package/package.json +9 -9
- package/dist/chunks/ApiTokensPage-DiRMgViD.js +0 -2
- package/dist/chunks/ApiTokensPage-DiRMgViD.js.map +0 -1
- package/dist/chunks/EntityContextRuntime-BOJySc1D.js +0 -1
- package/dist/chunks/IdentitySecurityPage-DW5ybVL4.js +0 -9
- package/dist/chunks/IdentitySecurityPage-DW5ybVL4.js.map +0 -1
- package/dist/chunks/SettingModuleDetail-Dppk9An1.js +0 -17
- package/dist/chunks/SettingModuleDetail-Dppk9An1.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{n as t,t as n}from"./preload-helper-mKj9XlrD.js";import{Dt as r,It as i,M as a,Mt as o,O as s,_ as c,bt as l,j as u,jt as d,m as f,xt as p}from"./clipboard-dpqHdCyy.js";import{n as m,t as h}from"./ResponsiveTableActions-CnTxLUos.js";import{i as g,r as _,s as v}from"./table-columns-CvT6OHd2.js";import{n as y,t as b}from"./ConfigurableTable-8sYmeul2.js";import{n as x,t as ee}from"./AppModal-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{n as t,t as n}from"./preload-helper-mKj9XlrD.js";import{Dt as r,It as i,M as a,Mt as o,O as s,_ as c,bt as l,j as u,jt as d,m as f,xt as p}from"./clipboard-dpqHdCyy.js";import{n as m,t as h}from"./ResponsiveTableActions-CnTxLUos.js";import{i as g,r as _,s as v}from"./table-columns-CvT6OHd2.js";import{n as y,t as b}from"./ConfigurableTable-8sYmeul2.js";import{n as x,t as ee}from"./AppModal-CEouaU03.js";import{n as S,t as te}from"./UserDisplay-BpkQ78cZ.js";import{Suspense as C,lazy as w,useEffect as T,useMemo as ne,useState as E}from"react";import{Fragment as D,jsx as O,jsxs as k}from"react/jsx-runtime";import{useSearchParams as A}from"react-router-dom";import{formatDateTime as j}from"@fudanda/admin-antd/core/utils/date";import{EMPTY_PLACEHOLDER as M}from"@fudanda/admin-antd/core/utils/empty-placeholder";import{supportsEntityRelations as N}from"@fudanda/client/platform/entity-catalog";import{formatUserLabel as P}from"@fudanda/admin-antd/core/utils/user-labels";import{useOperationLogDetail as F}from"@fudanda/admin-antd/core/hooks/queries/operation-logs";var I,L;function R(){return(R=e((()=>{
|
|
2
2
|
/**
|
|
3
3
|
* @license lucide-react v1.67.0 - ISC
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the ISC license.
|
|
6
6
|
* See the LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
|
-
p(),I={name:`link-2`,size:24,node:[[`path`,{d:`M9 17H7A5 5 0 0 1 7 7h2`,key:`8i5ue5`}],[`path`,{d:`M15 7h2a5 5 0 1 1 0 10h-2`,key:`1b9ql8`}],[`line`,{x1:`8`,x2:`16`,y1:`12`,y2:`12`,key:`1jonct`}]]},I.node,L=l(I)})))()}function z({entityRef:e,onOpen:t}){let[n,r]=E(!1);return N(e.type)?/* @__PURE__ */ k(D,{children:[/* @__PURE__ */ O(f,{size:`small`,theme:`borderless`,icon:/* @__PURE__ */ O(L,{size:14}),onClick:n=>{n.stopPropagation(),t?t(e):r(!0)},children:`关联信息`}),n&&/* @__PURE__ */ O(C,{fallback:null,children:/* @__PURE__ */ O(B,{entityRef:e,onClose:()=>r(!1)})})]}):null}var B;function V(){return(V=e((()=>{a(),R(),t(),w(()=>n(()=>import(`./EntityContextRuntime-
|
|
9
|
-
//# sourceMappingURL=OperationLogsTable-
|
|
8
|
+
p(),I={name:`link-2`,size:24,node:[[`path`,{d:`M9 17H7A5 5 0 0 1 7 7h2`,key:`8i5ue5`}],[`path`,{d:`M15 7h2a5 5 0 1 1 0 10h-2`,key:`1b9ql8`}],[`line`,{x1:`8`,x2:`16`,y1:`12`,y2:`12`,key:`1jonct`}]]},I.node,L=l(I)})))()}function z({entityRef:e,onOpen:t}){let[n,r]=E(!1);return N(e.type)?/* @__PURE__ */ k(D,{children:[/* @__PURE__ */ O(f,{size:`small`,theme:`borderless`,icon:/* @__PURE__ */ O(L,{size:14}),onClick:n=>{n.stopPropagation(),t?t(e):r(!0)},children:`关联信息`}),n&&/* @__PURE__ */ O(C,{fallback:null,children:/* @__PURE__ */ O(B,{entityRef:e,onClose:()=>r(!1)})})]}):null}var B;function V(){return(V=e((()=>{a(),R(),t(),w(()=>n(()=>import(`./EntityContextRuntime-Dc89ZSnM.js`),[],import.meta.url)),B=w(()=>n(()=>import(`./EntityContextRuntime-Dc89ZSnM.js`).then(e=>({default:e.EntityContextSheet})),[],import.meta.url))})))()}function H(e,t=e=>e.id,{fixed:n}={}){return{title:`关联信息`,key:`entityRelations`,width:120,fixed:n,render:(n,r)=>{let i=t(r);return i==null?null:/* @__PURE__ */ O(z,{entityRef:{type:e,key:String(i)}})}}}function U(){return(U=e((()=>{V()})))()}function W(e){if(e==null||!Number.isFinite(e)||e<0)return M;if(e===0)return`<1 μs`;let t=e=>Number(e.toPrecision(6)).toString();return e<1?`${t(e*1e3)} μs`:e<1e3?`${t(e)} ms`:`${t(e/1e3)} s`}function G(e){return e.durationUs==null?e.durationMs===0?`精度不足`:W(e.durationMs):W(e.durationUs/1e3)}function K(){return(K=e((()=>{})))()}function q({log:e}){let t=e.durationUs==null?`此记录只有整毫秒精度,或未采集耗时;无法还原微秒,零值不计入耗时统计。`:`服务端从请求开始至审计写入前的处理耗时:${e.durationUs} μs,不含后续提交和响应传输。`;return/* @__PURE__ */ O(u,{content:t,children:/* @__PURE__ */ O(`span`,{children:G(e)})})}function J({label:e,children:t}){return/* @__PURE__ */ k(`div`,{style:Q,children:[/* @__PURE__ */ O(`div`,{style:X,children:e}),/* @__PURE__ */ O(`div`,{style:Z,children:t})]})}function Y({searchConfig:e,dataSource:t,loading:n,pagination:a,onRefresh:l,columnSettings:u,columnSettingsKey:f}){let[p,m]=A(),g=p.get(`operationLogId`),y=g&&/^[1-9]\d*$/.test(g)&&Number.isSafeInteger(Number(g))?Number(g):void 0,[x,S]=E(null),C=F(y,y!==void 0),[w,M]=E(`basic`);T(()=>{if(!y||!C.data)return;S(C.data);let e=new URLSearchParams(p);e.delete(`operationLogId`),m(e,{replace:!0})},[y,C.data,p,m]);let N=()=>{if(S(null),M(`basic`),!p.has(`operationLogId`))return;let e=new URLSearchParams(p);e.delete(`operationLogId`),m(e,{replace:!0})},I=ne(()=>[{title:`ID`,dataIndex:`id`,width:70,defaultHidden:!0},{title:`操作人`,dataIndex:`username`,width:130,render:(e,t)=>/* @__PURE__ */ O(`span`,{className:`operation-log-actor`,children:/* @__PURE__ */ O(te,{username:e,nickname:t.nickname})})},{title:`功能模块`,dataIndex:`module`,width:110,ellipsis:{showTitle:!1},render:v},{title:`操作描述`,dataIndex:`description`,minWidth:180,render:v},{title:`请求方法`,dataIndex:`method`,width:80,render:e=>/* @__PURE__ */ O(s,{color:`blue`,children:e})},{title:`请求路径`,dataIndex:`path`,width:200,defaultHidden:!0,render:v},{title:`IP 地址`,dataIndex:`ip`,width:130,render:e=>e??`-`},{title:`操作地点`,dataIndex:`location`,width:160,defaultHidden:!0,render:v},{title:`操作系统`,dataIndex:`os`,width:130,defaultHidden:!0,render:v},{title:`浏览器`,dataIndex:`browser`,width:150,defaultHidden:!0,render:v},{title:`耗时`,align:`right`,dataIndex:`durationMs`,width:110,render:(e,t)=>/* @__PURE__ */ O(q,{log:t})},_(`操作时间`,`createdAt`),{...H(`platform.operation-log`,void 0,{fixed:`right`}),defaultHidden:!0},{title:`状态`,dataIndex:`responseCode`,width:80,fixed:`right`,render:e=>{let t=e!=null&&e>=200&&e<400;return/* @__PURE__ */ O(s,{color:t?`green`:`red`,children:t?`成功`:`失败`})}},h({width:80,actions:e=>[{key:`detail`,label:`详情`,onClick:()=>S(e)}]})],[]);return/* @__PURE__ */ k(D,{children:[/* @__PURE__ */ O(b,{searchConfig:e,bordered:!0,columns:I,dataSource:t,loading:n,pagination:a,rowKey:`id`,onRefresh:l,columnSettings:u,columnSettingsKey:f}),/* @__PURE__ */ O(ee,{title:`操作日志详情`,visible:x!==null,onCancel:N,footer:null,width:960,style:{top:40},bodyStyle:{padding:`0 0 4px`},children:x&&(()=>{let e=x.responseCode,t=e!=null&&e>=200&&e<400,n=/* @__PURE__ */ O(q,{log:x});return/* @__PURE__ */ k(o,{collapsible:`auto`,type:`line`,style:{padding:`0 4px`},activeKey:w,onChange:M,children:[/* @__PURE__ */ O(d,{tab:`基础信息`,itemKey:`basic`,children:/* @__PURE__ */ O(c,{className:`operation-log-details`,data:[{key:`ID`,value:x.id},{key:`操作人`,value:P(x.username,x.nickname)},{key:`功能模块`,value:x.module??`-`},{key:`操作描述`,value:x.description},{key:`请求方法`,value:/* @__PURE__ */ O(s,{color:`blue`,size:`small`,children:x.method})},{key:`响应状态`,value:/* @__PURE__ */ O(s,{color:t?`green`:`red`,size:`small`,children:e??`-`})},{key:`耗时`,value:n},{key:`操作时间`,value:j(x.createdAt)},{key:`IP 地址`,value:x.ip??`-`},{key:`操作地点`,value:`-`},{key:`浏览器`,value:x.browser??`-`},{key:`操作系统`,value:x.os??`-`},{key:`请求 ID`,span:`filled`,value:x.requestId?/* @__PURE__ */ k(`div`,{children:[/* @__PURE__ */ O(i.Text,{copyable:!0,size:`small`,children:x.requestId}),/* @__PURE__ */ O(`div`,{style:X,children:`在 OpenObserve 日志中按 request_id 查询;如已采集链路,可用日志中的 trace_id 查看链路。`})]}):`-`}],column:{xs:1,sm:1,md:2},layout:`horizontal`,align:`left`})}),/* @__PURE__ */ O(d,{tab:`请求详情`,itemKey:`request`,children:/* @__PURE__ */ k(`div`,{style:{padding:`4px 0 8px`},children:[/* @__PURE__ */ O(J,{label:`请求路径`,children:x.path}),x.userAgent&&/* @__PURE__ */ O(J,{label:`User-Agent`,children:x.userAgent}),x.requestBody?/* @__PURE__ */ O(J,{label:`请求体`,children:w===`request`&&/* @__PURE__ */ O(r,{className:`operation-log-json-viewer`,value:(()=>{try{return JSON.stringify(JSON.parse(x.requestBody),null,2)}catch{return x.requestBody}})(),height:220,width:`100%`,options:{readOnly:!0,autoWrap:!0,formatOptions:{tabSize:2,insertSpaces:!0}}},x.id)}):/* @__PURE__ */ O(`div`,{style:{padding:`20px 0`,textAlign:`center`,color:`var(--arc-antd-color-text-2)`,fontSize:13},children:`无请求体`})]})}),/* @__PURE__ */ O(d,{tab:`响应详情`,itemKey:`response`,children:/* @__PURE__ */ O(`div`,{style:{padding:`20px 0`,textAlign:`center`,color:`var(--semi-color-text-2)`,fontSize:13},children:`未记录响应体`})})]})})()})]})}var X,Z,Q;function $(){return($=e((()=>{a(),x(),y(),m(),g(),S(),U(),K(),X={color:`var(--arc-antd-color-text-2)`,fontSize:12,marginBottom:2},Z={fontSize:13,overflowWrap:`anywhere`},Q={padding:`8px 0`,borderBottom:`1px solid var(--arc-antd-color-border)`}})))()}export{B as a,L as c,K as i,R as l,$ as n,z as o,W as r,V as s,Y as t};
|
|
9
|
+
//# sourceMappingURL=OperationLogsTable-DaaON4QR.js.map
|
package/dist/chunks/{OperationLogsTable-B23Ry-2v.js.map → OperationLogsTable-DaaON4QR.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationLogsTable-B23Ry-2v.js","mappings":"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","names":["__iconData","createLucideIcon","EntityRelationButton","open","setOpen","useState","supportsEntityRelations","entityRef","_Fragment","Button","Link2","event","onOpen","Suspense","EntityContextSheet","lazy","__vitePreload","module","entityRelationColumn","record","key","keyOf","entityType","formatOperationLatency","ms","EMPTY_PLACEHOLDER","rounded","value","formatOperationDuration","log","OperationDuration","hint","Tooltip","DetailField","detailItemStyle","detailLabelStyle","label","detailValueStyle","OperationLogsTable","searchParams","setSearchParams","useSearchParams","operationLogParam","linkedOperationLogId","detailLog","setDetailLog","linkedDetailQuery","useOperationLogDetail","detailActiveTab","setDetailActiveTab","useEffect","next","closeDetail","columns","useMemo","UserDisplayCell","v","r","renderEllipsis","Tag","dateTimeColumn","success","createOperationColumn","ConfigurableTable","AppModal","resCode","resOk","duration","Tabs","TabPane","Descriptions","formatUserLabel","formatDateTime","Typography","JsonViewer"],"ignoreList":[0],"sources":["../../../../node_modules/lucide-react/dist/esm/icons/link-2.mjs","../../src/components/entity-relations/EntityRelationButton.tsx","../../src/components/entity-relations/entity-relation-columns.tsx","../../src/utils/operation-duration.ts","../../src/components/logs/OperationLogsTable.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.67.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"link-2\",\n size: 24,\n node: [\n [\"path\", { d: \"M9 17H7A5 5 0 0 1 7 7h2\", key: \"8i5ue5\" }],\n [\"path\", { d: \"M15 7h2a5 5 0 1 1 0 10h-2\", key: \"1b9ql8\" }],\n [\"line\", { x1: \"8\", x2: \"16\", y1: \"12\", y2: \"12\", key: \"1jonct\" }]\n ]\n};\n__iconData.node;\nconst Link2 = createLucideIcon(__iconData);\n\nexport { __iconData, Link2 as default };\n//# sourceMappingURL=link-2.mjs.map\n","import { lazy, Suspense, useState } from 'react';\nimport { Button, Spin } from \"@/ui\";\nimport { Link2 } from 'lucide-react';\nimport { supportsEntityRelations, type CanonicalEntityRef, type CanonicalEntityType } from '@fudanda/shared/platform/entity-catalog';\nconst EntityContextRuntime = lazy(() => import(\"@/components/entity-relations/EntityContextRuntime\"));\nexport const EntityContextSheet = lazy(() => import(\"@/components/entity-relations/EntityContextRuntime\").then((module) => ({ default: module.EntityContextSheet })));\n/** Entry components keep relation queries, contracts and renderers out of the application shell. */\nexport function EntityContextView(props: {\n readonly entityType: CanonicalEntityType;\n readonly entityKey: string | undefined;\n readonly showAnchor?: boolean;\n}) {\n return <Suspense fallback={<Spin size=\"small\"/>}><EntityContextRuntime {...props}/></Suspense>;\n}\n/** Entry points may probe an object; the sheet always authorizes its exact ref. */\nexport default function EntityRelationButton({ entityRef, onOpen }: {\n readonly entityRef: CanonicalEntityRef;\n readonly onOpen?: (ref: CanonicalEntityRef) => void;\n}) {\n const [open, setOpen] = useState(false);\n if (!supportsEntityRelations(entityRef.type))\n return null;\n return <>\n <Button size=\"small\" theme=\"borderless\" icon={<Link2 size={14}/>} onClick={(event) => {\n event.stopPropagation();\n if (onOpen)\n onOpen(entityRef);\n else\n setOpen(true);\n }}>关联信息</Button>\n {open && <Suspense fallback={null}><EntityContextSheet entityRef={entityRef} onClose={() => setOpen(false)}/></Suspense>}\n </>;\n}\n","import type { ColumnProps } from \"@/ui\";\nimport type { CanonicalEntityType } from '@fudanda/shared/platform/entity-catalog';\nimport EntityRelationButton from \"@/components/entity-relations/EntityRelationButton\";\n/**\n * A notification dispatch points to its outbox; an absent key never falls back to the row ID.\n *\n * `fixed: 'right'` 只用于把本列并入表格尾部连续的右固定块(紧邻状态 / 操作列左侧):\n * Semi 以「其后所有列宽之和」作为每个右固定列的 sticky 偏移,非固定列夹在固定块中间时,\n * 它前面那一列的偏移会为它留出一道缝、普通列从缝里滑过(见 ui-patterns.md → 表格列宽)。\n */\nexport function entityRelationColumn<T extends {\n id: number;\n}>(entityType: CanonicalEntityType, keyOf: (record: T) => number | null | undefined = (record) => record.id, { fixed }: {\n fixed?: 'right';\n} = {}): ColumnProps<T> {\n return {\n title: '关联信息', key: 'entityRelations', width: 120, fixed,\n render: (_: unknown, record: T) => {\n const key = keyOf(record);\n return key == null ? null : <EntityRelationButton entityRef={{ type: entityType, key: String(key) }}/>;\n },\n };\n}\n","import { EMPTY_PLACEHOLDER } from '@fudanda/react-core/utils/empty-placeholder';\n\n/** Input remains milliseconds for chart axes; display sub-millisecond values in microseconds. */\nexport function formatOperationLatency(ms: number | null | undefined): string {\n if (ms == null || !Number.isFinite(ms) || ms < 0) return EMPTY_PLACEHOLDER;\n if (ms === 0) return '<1 μs';\n const rounded = (value: number) => Number(value.toPrecision(6)).toString();\n if (ms < 1) return `${rounded(ms * 1000)} μs`;\n if (ms < 1000) return `${rounded(ms)} ms`;\n return `${rounded(ms / 1000)} s`;\n}\n\nexport function formatOperationDuration(log: { durationMs?: number | null; durationUs?: number | null }): string {\n if (log.durationUs != null) return formatOperationLatency(log.durationUs / 1000);\n // Historical zero can mean either truncation or absent collection; never invent microseconds.\n if (log.durationMs === 0) return '精度不足';\n return formatOperationLatency(log.durationMs);\n}\n","import { useEffect, useMemo, useState, type CSSProperties, type ReactNode } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Descriptions, JsonViewer, TabPane, Tabs, Tag, Tooltip, Typography } from \"@/ui\";\nimport AppModal from \"@/components/AppModal\";\nimport type { ColumnProps, TableProps } from \"@/ui\";\nimport type { OperationLog } from '@fudanda/shared/platform';\nimport ConfigurableTable from \"@/components/ConfigurableTable\";\nimport { createOperationColumn } from \"@/components/ResponsiveTableActions\";\nimport { formatDateTime } from \"@fudanda/react-core/utils/date\";\nimport \"@/components/logs/OperationLogsTable.css\";\nimport { dateTimeColumn, renderEllipsis } from \"@/utils/table-columns\";\nimport { UserDisplayCell } from \"@/components/UserDisplay\";\nimport { formatUserLabel } from \"@fudanda/react-core/utils/user-labels\";\nimport { useOperationLogDetail } from \"@fudanda/react-core/hooks/queries/operation-logs\";\nimport { entityRelationColumn } from \"@/components/entity-relations/entity-relation-columns\";\nimport { formatOperationDuration } from '@/utils/operation-duration';\n\nfunction OperationDuration({ log }: { log: OperationLog }) {\n const hint = log.durationUs == null\n ? '此记录只有整毫秒精度,或未采集耗时;无法还原微秒,零值不计入耗时统计。'\n : `服务端从请求开始至审计写入前的处理耗时:${log.durationUs} μs,不含后续提交和响应传输。`;\n return <Tooltip content={hint}><span>{formatOperationDuration(log)}</span></Tooltip>;\n}\ninterface OperationLogsTableProps {\n readonly searchConfig?: TableProps<OperationLog>['searchConfig'];\n readonly dataSource: OperationLog[];\n readonly loading?: boolean;\n readonly pagination?: TableProps<OperationLog>['pagination'];\n readonly onRefresh?: () => void;\n readonly columnSettings?: boolean;\n readonly columnSettingsKey?: string;\n}\nconst detailLabelStyle: CSSProperties = { color: 'var(--arc-antd-color-text-2)', fontSize: 12, marginBottom: 2 };\nconst detailValueStyle: CSSProperties = { fontSize: 13, overflowWrap: 'anywhere' };\nconst detailItemStyle: CSSProperties = { padding: '8px 0', borderBottom: '1px solid var(--arc-antd-color-border)' };\nfunction DetailField({ label, children }: Readonly<{\n label: string;\n children: ReactNode;\n}>) {\n return (<div style={detailItemStyle}>\n <div style={detailLabelStyle}>{label}</div>\n <div style={detailValueStyle}>{children}</div>\n </div>);\n}\n\nexport function OperationLogsTable({ searchConfig, dataSource, loading, pagination, onRefresh, columnSettings, columnSettingsKey, }: OperationLogsTableProps) {\n const [searchParams, setSearchParams] = useSearchParams();\n const operationLogParam = searchParams.get('operationLogId');\n const linkedOperationLogId = operationLogParam && /^[1-9]\\d*$/.test(operationLogParam) && Number.isSafeInteger(Number(operationLogParam)) ? Number(operationLogParam) : undefined;\n const [detailLog, setDetailLog] = useState<OperationLog | null>(null);\n const linkedDetailQuery = useOperationLogDetail(linkedOperationLogId, linkedOperationLogId !== undefined);\n const [detailActiveTab, setDetailActiveTab] = useState('basic');\n useEffect(() => {\n if (!linkedOperationLogId || !linkedDetailQuery.data)\n return;\n setDetailLog(linkedDetailQuery.data);\n const next = new URLSearchParams(searchParams);\n next.delete('operationLogId');\n setSearchParams(next, { replace: true });\n }, [linkedOperationLogId, linkedDetailQuery.data, searchParams, setSearchParams]);\n const closeDetail = () => {\n setDetailLog(null);\n setDetailActiveTab('basic');\n if (!searchParams.has('operationLogId'))\n return;\n const next = new URLSearchParams(searchParams);\n next.delete('operationLogId');\n setSearchParams(next, { replace: true });\n };\n const columns = useMemo<ColumnProps<OperationLog>[]>(() => [\n { title: 'ID', dataIndex: 'id', width: 70, defaultHidden: true },\n {\n title: '操作人',\n dataIndex: 'username',\n width: 130,\n render: (v: string | null, r: OperationLog) => (<span className=\"operation-log-actor\">\n <UserDisplayCell username={v} nickname={r.nickname}/>\n\n </span>),\n },\n { title: '功能模块', dataIndex: 'module', width: 110, ellipsis: { showTitle: false }, render: renderEllipsis },\n { title: '操作描述', dataIndex: 'description', minWidth: 180, render: renderEllipsis },\n { title: '请求方法', dataIndex: 'method', width: 80, render: (v: string) => <Tag color=\"blue\">{v}</Tag> },\n { title: '请求路径', dataIndex: 'path', width: 200, defaultHidden: true, render: renderEllipsis },\n { title: 'IP 地址', dataIndex: 'ip', width: 130, render: (v: string | null) => v ?? '-' },\n { title: '操作地点', dataIndex: 'location', width: 160, defaultHidden: true, render: renderEllipsis },\n { title: '操作系统', dataIndex: 'os', width: 130, defaultHidden: true, render: renderEllipsis },\n { title: '浏览器', dataIndex: 'browser', width: 150, defaultHidden: true, render: renderEllipsis },\n {\n title: '耗时',\n align: 'right',\n dataIndex: 'durationMs',\n width: 110,\n render: (_v: number | null, record: OperationLog) => <OperationDuration log={record}/>,\n },\n dateTimeColumn('操作时间', 'createdAt'),\n { ...entityRelationColumn<OperationLog>('platform.operation-log', undefined, { fixed: 'right' }), defaultHidden: true },\n {\n title: '状态',\n dataIndex: 'responseCode',\n width: 80,\n fixed: 'right' as const,\n render: (v: number | null) => {\n const success = v != null && v >= 200 && v < 400;\n return <Tag color={success ? 'green' : 'red'}>{success ? '成功' : '失败'}</Tag>;\n },\n },\n createOperationColumn<OperationLog>({\n width: 80,\n actions: (record) => [{ key: 'detail', label: '详情', onClick: () => setDetailLog(record) }],\n }),\n ], []);\n return (<>\n <ConfigurableTable<OperationLog> searchConfig={searchConfig} bordered columns={columns} dataSource={dataSource} loading={loading} pagination={pagination} rowKey=\"id\" onRefresh={onRefresh} columnSettings={columnSettings} columnSettingsKey={columnSettingsKey}/>\n\n <AppModal title=\"操作日志详情\" visible={detailLog !== null} onCancel={closeDetail} footer={null} width={960} style={{ top: 40 }} bodyStyle={{ padding: '0 0 4px' }}>\n {detailLog && (() => {\n const resCode = detailLog.responseCode;\n const resOk = resCode != null && resCode >= 200 && resCode < 400;\n const duration = <OperationDuration log={detailLog}/>;\n return (<Tabs collapsible=\"auto\" type=\"line\" style={{ padding: '0 4px' }} activeKey={detailActiveTab} onChange={setDetailActiveTab}>\n <TabPane tab=\"基础信息\" itemKey=\"basic\">\n <Descriptions className=\"operation-log-details\" data={[\n { key: 'ID', value: detailLog.id },\n { key: '操作人', value: formatUserLabel(detailLog.username, detailLog.nickname) },\n { key: '功能模块', value: detailLog.module ?? '-' },\n { key: '操作描述', value: detailLog.description },\n {\n key: '请求方法',\n value: <Tag color=\"blue\" size=\"small\">{detailLog.method}</Tag>,\n },\n {\n key: '响应状态',\n value: <Tag color={resOk ? 'green' : 'red'} size=\"small\">{resCode ?? '-'}</Tag>,\n },\n { key: '耗时', value: duration },\n { key: '操作时间', value: formatDateTime(detailLog.createdAt) },\n { key: 'IP 地址', value: detailLog.ip ?? '-' },\n { key: '操作地点', value: '-' },\n { key: '浏览器', value: detailLog.browser ?? '-' },\n { key: '操作系统', value: detailLog.os ?? '-' },\n {\n key: '请求 ID',\n span: 'filled',\n value: detailLog.requestId\n ? (<div>\n <Typography.Text copyable size=\"small\">{detailLog.requestId}</Typography.Text>\n <div style={detailLabelStyle}>在 OpenObserve 日志中按 request_id 查询;如已采集链路,可用日志中的 trace_id 查看链路。</div>\n </div>)\n : '-',\n },\n ]} column={{ xs: 1, sm: 1, md: 2 }} layout=\"horizontal\" align=\"left\"/>\n </TabPane>\n <TabPane tab=\"请求详情\" itemKey=\"request\">\n <div style={{ padding: '4px 0 8px' }}>\n <DetailField label=\"请求路径\">{detailLog.path}</DetailField>\n {detailLog.userAgent && (<DetailField label=\"User-Agent\">{detailLog.userAgent}</DetailField>)}\n {detailLog.requestBody ? (<DetailField label=\"请求体\">\n {detailActiveTab === 'request' && (<JsonViewer className=\"operation-log-json-viewer\" key={detailLog.id} value={(() => {\n try {\n return JSON.stringify(JSON.parse(detailLog.requestBody), null, 2);\n }\n catch {\n return detailLog.requestBody;\n }\n })()} height={220} width=\"100%\" options={{ readOnly: true, autoWrap: true, formatOptions: { tabSize: 2, insertSpaces: true } }}/>)}\n </DetailField>) : (<div style={{ padding: '20px 0', textAlign: 'center', color: 'var(--arc-antd-color-text-2)', fontSize: 13 }}>无请求体</div>)}\n </div>\n </TabPane>\n <TabPane tab=\"响应详情\" itemKey=\"response\">\n <div style={{ padding: '20px 0', textAlign: 'center', color: 'var(--semi-color-text-2)', fontSize: 13 }}>未记录响应体</div>\n </TabPane>\n </Tabs>);\n })()}\n </AppModal>\n </>);\n}\nexport default OperationLogsTable;\n"]}
|
|
1
|
+
{"version":3,"file":"OperationLogsTable-DaaON4QR.js","mappings":"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","names":["__iconData","createLucideIcon","EntityRelationButton","open","setOpen","useState","supportsEntityRelations","entityRef","_Fragment","Button","Link2","event","onOpen","Suspense","EntityContextSheet","lazy","__vitePreload","module","entityRelationColumn","record","key","keyOf","entityType","formatOperationLatency","ms","EMPTY_PLACEHOLDER","rounded","value","formatOperationDuration","log","OperationDuration","hint","Tooltip","DetailField","detailItemStyle","detailLabelStyle","label","detailValueStyle","OperationLogsTable","searchParams","setSearchParams","useSearchParams","operationLogParam","linkedOperationLogId","detailLog","setDetailLog","linkedDetailQuery","useOperationLogDetail","detailActiveTab","setDetailActiveTab","useEffect","next","closeDetail","columns","useMemo","UserDisplayCell","v","r","renderEllipsis","Tag","dateTimeColumn","success","createOperationColumn","ConfigurableTable","AppModal","resCode","resOk","duration","Tabs","TabPane","Descriptions","formatUserLabel","formatDateTime","Typography","JsonViewer"],"ignoreList":[0],"sources":["../../../../node_modules/lucide-react/dist/esm/icons/link-2.mjs","../../src/components/entity-relations/EntityRelationButton.tsx","../../src/components/entity-relations/entity-relation-columns.tsx","../../src/utils/operation-duration.ts","../../src/components/logs/OperationLogsTable.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.67.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"link-2\",\n size: 24,\n node: [\n [\"path\", { d: \"M9 17H7A5 5 0 0 1 7 7h2\", key: \"8i5ue5\" }],\n [\"path\", { d: \"M15 7h2a5 5 0 1 1 0 10h-2\", key: \"1b9ql8\" }],\n [\"line\", { x1: \"8\", x2: \"16\", y1: \"12\", y2: \"12\", key: \"1jonct\" }]\n ]\n};\n__iconData.node;\nconst Link2 = createLucideIcon(__iconData);\n\nexport { __iconData, Link2 as default };\n//# sourceMappingURL=link-2.mjs.map\n","import { lazy, Suspense, useState } from 'react';\nimport { Button, Spin } from \"@/ui\";\nimport { Link2 } from 'lucide-react';\nimport { supportsEntityRelations, type CanonicalEntityRef, type CanonicalEntityType } from '@fudanda/shared/platform/entity-catalog';\nconst EntityContextRuntime = lazy(() => import(\"@/components/entity-relations/EntityContextRuntime\"));\nexport const EntityContextSheet = lazy(() => import(\"@/components/entity-relations/EntityContextRuntime\").then((module) => ({ default: module.EntityContextSheet })));\n/** Entry components keep relation queries, contracts and renderers out of the application shell. */\nexport function EntityContextView(props: {\n readonly entityType: CanonicalEntityType;\n readonly entityKey: string | undefined;\n readonly showAnchor?: boolean;\n}) {\n return <Suspense fallback={<Spin size=\"small\"/>}><EntityContextRuntime {...props}/></Suspense>;\n}\n/** Entry points may probe an object; the sheet always authorizes its exact ref. */\nexport default function EntityRelationButton({ entityRef, onOpen }: {\n readonly entityRef: CanonicalEntityRef;\n readonly onOpen?: (ref: CanonicalEntityRef) => void;\n}) {\n const [open, setOpen] = useState(false);\n if (!supportsEntityRelations(entityRef.type))\n return null;\n return <>\n <Button size=\"small\" theme=\"borderless\" icon={<Link2 size={14}/>} onClick={(event) => {\n event.stopPropagation();\n if (onOpen)\n onOpen(entityRef);\n else\n setOpen(true);\n }}>关联信息</Button>\n {open && <Suspense fallback={null}><EntityContextSheet entityRef={entityRef} onClose={() => setOpen(false)}/></Suspense>}\n </>;\n}\n","import type { ColumnProps } from \"@/ui\";\nimport type { CanonicalEntityType } from '@fudanda/shared/platform/entity-catalog';\nimport EntityRelationButton from \"@/components/entity-relations/EntityRelationButton\";\n/**\n * A notification dispatch points to its outbox; an absent key never falls back to the row ID.\n *\n * `fixed: 'right'` 只用于把本列并入表格尾部连续的右固定块(紧邻状态 / 操作列左侧):\n * Semi 以「其后所有列宽之和」作为每个右固定列的 sticky 偏移,非固定列夹在固定块中间时,\n * 它前面那一列的偏移会为它留出一道缝、普通列从缝里滑过(见 ui-patterns.md → 表格列宽)。\n */\nexport function entityRelationColumn<T extends {\n id: number;\n}>(entityType: CanonicalEntityType, keyOf: (record: T) => number | null | undefined = (record) => record.id, { fixed }: {\n fixed?: 'right';\n} = {}): ColumnProps<T> {\n return {\n title: '关联信息', key: 'entityRelations', width: 120, fixed,\n render: (_: unknown, record: T) => {\n const key = keyOf(record);\n return key == null ? null : <EntityRelationButton entityRef={{ type: entityType, key: String(key) }}/>;\n },\n };\n}\n","import { EMPTY_PLACEHOLDER } from '@fudanda/react-core/utils/empty-placeholder';\n\n/** Input remains milliseconds for chart axes; display sub-millisecond values in microseconds. */\nexport function formatOperationLatency(ms: number | null | undefined): string {\n if (ms == null || !Number.isFinite(ms) || ms < 0) return EMPTY_PLACEHOLDER;\n if (ms === 0) return '<1 μs';\n const rounded = (value: number) => Number(value.toPrecision(6)).toString();\n if (ms < 1) return `${rounded(ms * 1000)} μs`;\n if (ms < 1000) return `${rounded(ms)} ms`;\n return `${rounded(ms / 1000)} s`;\n}\n\nexport function formatOperationDuration(log: { durationMs?: number | null; durationUs?: number | null }): string {\n if (log.durationUs != null) return formatOperationLatency(log.durationUs / 1000);\n // Historical zero can mean either truncation or absent collection; never invent microseconds.\n if (log.durationMs === 0) return '精度不足';\n return formatOperationLatency(log.durationMs);\n}\n","import { useEffect, useMemo, useState, type CSSProperties, type ReactNode } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Descriptions, JsonViewer, TabPane, Tabs, Tag, Tooltip, Typography } from \"@/ui\";\nimport AppModal from \"@/components/AppModal\";\nimport type { ColumnProps, TableProps } from \"@/ui\";\nimport type { OperationLog } from '@fudanda/shared/platform';\nimport ConfigurableTable from \"@/components/ConfigurableTable\";\nimport { createOperationColumn } from \"@/components/ResponsiveTableActions\";\nimport { formatDateTime } from \"@fudanda/react-core/utils/date\";\nimport \"@/components/logs/OperationLogsTable.css\";\nimport { dateTimeColumn, renderEllipsis } from \"@/utils/table-columns\";\nimport { UserDisplayCell } from \"@/components/UserDisplay\";\nimport { formatUserLabel } from \"@fudanda/react-core/utils/user-labels\";\nimport { useOperationLogDetail } from \"@fudanda/react-core/hooks/queries/operation-logs\";\nimport { entityRelationColumn } from \"@/components/entity-relations/entity-relation-columns\";\nimport { formatOperationDuration } from '@/utils/operation-duration';\n\nfunction OperationDuration({ log }: { log: OperationLog }) {\n const hint = log.durationUs == null\n ? '此记录只有整毫秒精度,或未采集耗时;无法还原微秒,零值不计入耗时统计。'\n : `服务端从请求开始至审计写入前的处理耗时:${log.durationUs} μs,不含后续提交和响应传输。`;\n return <Tooltip content={hint}><span>{formatOperationDuration(log)}</span></Tooltip>;\n}\ninterface OperationLogsTableProps {\n readonly searchConfig?: TableProps<OperationLog>['searchConfig'];\n readonly dataSource: OperationLog[];\n readonly loading?: boolean;\n readonly pagination?: TableProps<OperationLog>['pagination'];\n readonly onRefresh?: () => void;\n readonly columnSettings?: boolean;\n readonly columnSettingsKey?: string;\n}\nconst detailLabelStyle: CSSProperties = { color: 'var(--arc-antd-color-text-2)', fontSize: 12, marginBottom: 2 };\nconst detailValueStyle: CSSProperties = { fontSize: 13, overflowWrap: 'anywhere' };\nconst detailItemStyle: CSSProperties = { padding: '8px 0', borderBottom: '1px solid var(--arc-antd-color-border)' };\nfunction DetailField({ label, children }: Readonly<{\n label: string;\n children: ReactNode;\n}>) {\n return (<div style={detailItemStyle}>\n <div style={detailLabelStyle}>{label}</div>\n <div style={detailValueStyle}>{children}</div>\n </div>);\n}\n\nexport function OperationLogsTable({ searchConfig, dataSource, loading, pagination, onRefresh, columnSettings, columnSettingsKey, }: OperationLogsTableProps) {\n const [searchParams, setSearchParams] = useSearchParams();\n const operationLogParam = searchParams.get('operationLogId');\n const linkedOperationLogId = operationLogParam && /^[1-9]\\d*$/.test(operationLogParam) && Number.isSafeInteger(Number(operationLogParam)) ? Number(operationLogParam) : undefined;\n const [detailLog, setDetailLog] = useState<OperationLog | null>(null);\n const linkedDetailQuery = useOperationLogDetail(linkedOperationLogId, linkedOperationLogId !== undefined);\n const [detailActiveTab, setDetailActiveTab] = useState('basic');\n useEffect(() => {\n if (!linkedOperationLogId || !linkedDetailQuery.data)\n return;\n setDetailLog(linkedDetailQuery.data);\n const next = new URLSearchParams(searchParams);\n next.delete('operationLogId');\n setSearchParams(next, { replace: true });\n }, [linkedOperationLogId, linkedDetailQuery.data, searchParams, setSearchParams]);\n const closeDetail = () => {\n setDetailLog(null);\n setDetailActiveTab('basic');\n if (!searchParams.has('operationLogId'))\n return;\n const next = new URLSearchParams(searchParams);\n next.delete('operationLogId');\n setSearchParams(next, { replace: true });\n };\n const columns = useMemo<ColumnProps<OperationLog>[]>(() => [\n { title: 'ID', dataIndex: 'id', width: 70, defaultHidden: true },\n {\n title: '操作人',\n dataIndex: 'username',\n width: 130,\n render: (v: string | null, r: OperationLog) => (<span className=\"operation-log-actor\">\n <UserDisplayCell username={v} nickname={r.nickname}/>\n\n </span>),\n },\n { title: '功能模块', dataIndex: 'module', width: 110, ellipsis: { showTitle: false }, render: renderEllipsis },\n { title: '操作描述', dataIndex: 'description', minWidth: 180, render: renderEllipsis },\n { title: '请求方法', dataIndex: 'method', width: 80, render: (v: string) => <Tag color=\"blue\">{v}</Tag> },\n { title: '请求路径', dataIndex: 'path', width: 200, defaultHidden: true, render: renderEllipsis },\n { title: 'IP 地址', dataIndex: 'ip', width: 130, render: (v: string | null) => v ?? '-' },\n { title: '操作地点', dataIndex: 'location', width: 160, defaultHidden: true, render: renderEllipsis },\n { title: '操作系统', dataIndex: 'os', width: 130, defaultHidden: true, render: renderEllipsis },\n { title: '浏览器', dataIndex: 'browser', width: 150, defaultHidden: true, render: renderEllipsis },\n {\n title: '耗时',\n align: 'right',\n dataIndex: 'durationMs',\n width: 110,\n render: (_v: number | null, record: OperationLog) => <OperationDuration log={record}/>,\n },\n dateTimeColumn('操作时间', 'createdAt'),\n { ...entityRelationColumn<OperationLog>('platform.operation-log', undefined, { fixed: 'right' }), defaultHidden: true },\n {\n title: '状态',\n dataIndex: 'responseCode',\n width: 80,\n fixed: 'right' as const,\n render: (v: number | null) => {\n const success = v != null && v >= 200 && v < 400;\n return <Tag color={success ? 'green' : 'red'}>{success ? '成功' : '失败'}</Tag>;\n },\n },\n createOperationColumn<OperationLog>({\n width: 80,\n actions: (record) => [{ key: 'detail', label: '详情', onClick: () => setDetailLog(record) }],\n }),\n ], []);\n return (<>\n <ConfigurableTable<OperationLog> searchConfig={searchConfig} bordered columns={columns} dataSource={dataSource} loading={loading} pagination={pagination} rowKey=\"id\" onRefresh={onRefresh} columnSettings={columnSettings} columnSettingsKey={columnSettingsKey}/>\n\n <AppModal title=\"操作日志详情\" visible={detailLog !== null} onCancel={closeDetail} footer={null} width={960} style={{ top: 40 }} bodyStyle={{ padding: '0 0 4px' }}>\n {detailLog && (() => {\n const resCode = detailLog.responseCode;\n const resOk = resCode != null && resCode >= 200 && resCode < 400;\n const duration = <OperationDuration log={detailLog}/>;\n return (<Tabs collapsible=\"auto\" type=\"line\" style={{ padding: '0 4px' }} activeKey={detailActiveTab} onChange={setDetailActiveTab}>\n <TabPane tab=\"基础信息\" itemKey=\"basic\">\n <Descriptions className=\"operation-log-details\" data={[\n { key: 'ID', value: detailLog.id },\n { key: '操作人', value: formatUserLabel(detailLog.username, detailLog.nickname) },\n { key: '功能模块', value: detailLog.module ?? '-' },\n { key: '操作描述', value: detailLog.description },\n {\n key: '请求方法',\n value: <Tag color=\"blue\" size=\"small\">{detailLog.method}</Tag>,\n },\n {\n key: '响应状态',\n value: <Tag color={resOk ? 'green' : 'red'} size=\"small\">{resCode ?? '-'}</Tag>,\n },\n { key: '耗时', value: duration },\n { key: '操作时间', value: formatDateTime(detailLog.createdAt) },\n { key: 'IP 地址', value: detailLog.ip ?? '-' },\n { key: '操作地点', value: '-' },\n { key: '浏览器', value: detailLog.browser ?? '-' },\n { key: '操作系统', value: detailLog.os ?? '-' },\n {\n key: '请求 ID',\n span: 'filled',\n value: detailLog.requestId\n ? (<div>\n <Typography.Text copyable size=\"small\">{detailLog.requestId}</Typography.Text>\n <div style={detailLabelStyle}>在 OpenObserve 日志中按 request_id 查询;如已采集链路,可用日志中的 trace_id 查看链路。</div>\n </div>)\n : '-',\n },\n ]} column={{ xs: 1, sm: 1, md: 2 }} layout=\"horizontal\" align=\"left\"/>\n </TabPane>\n <TabPane tab=\"请求详情\" itemKey=\"request\">\n <div style={{ padding: '4px 0 8px' }}>\n <DetailField label=\"请求路径\">{detailLog.path}</DetailField>\n {detailLog.userAgent && (<DetailField label=\"User-Agent\">{detailLog.userAgent}</DetailField>)}\n {detailLog.requestBody ? (<DetailField label=\"请求体\">\n {detailActiveTab === 'request' && (<JsonViewer className=\"operation-log-json-viewer\" key={detailLog.id} value={(() => {\n try {\n return JSON.stringify(JSON.parse(detailLog.requestBody), null, 2);\n }\n catch {\n return detailLog.requestBody;\n }\n })()} height={220} width=\"100%\" options={{ readOnly: true, autoWrap: true, formatOptions: { tabSize: 2, insertSpaces: true } }}/>)}\n </DetailField>) : (<div style={{ padding: '20px 0', textAlign: 'center', color: 'var(--arc-antd-color-text-2)', fontSize: 13 }}>无请求体</div>)}\n </div>\n </TabPane>\n <TabPane tab=\"响应详情\" itemKey=\"response\">\n <div style={{ padding: '20px 0', textAlign: 'center', color: 'var(--semi-color-text-2)', fontSize: 13 }}>未记录响应体</div>\n </TabPane>\n </Tabs>);\n })()}\n </AppModal>\n </>);\n}\nexport default OperationLogsTable;\n"]}
|