@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.
Files changed (130) hide show
  1. package/dist/chunks/ApiTokensPage-w3JGRNQC.js +2 -0
  2. package/dist/chunks/ApiTokensPage-w3JGRNQC.js.map +1 -0
  3. package/dist/chunks/{App-BF96TQ_D.js → App-nh6_qOo8.js} +5 -5
  4. package/dist/chunks/{App-BF96TQ_D.js.map → App-nh6_qOo8.js.map} +1 -1
  5. package/dist/chunks/{AppModal-CLkMJ-96.js → AppModal-CEouaU03.js} +2 -2
  6. package/dist/chunks/{AppModal-CLkMJ-96.js.map → AppModal-CEouaU03.js.map} +1 -1
  7. package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js → ArcBaseAdmin-CX7fQz4x.js} +2 -2
  8. package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js.map → ArcBaseAdmin-CX7fQz4x.js.map} +1 -1
  9. package/dist/chunks/{DepartmentsPage-D6YVegPU.js → DepartmentsPage-BdD9VfDI.js} +2 -2
  10. package/dist/chunks/{DepartmentsPage-D6YVegPU.js.map → DepartmentsPage-BdD9VfDI.js.map} +1 -1
  11. package/dist/chunks/{DictsPage-uV3Uukwc.js → DictsPage-fxBdV1-3.js} +2 -2
  12. package/dist/chunks/{DictsPage-uV3Uukwc.js.map → DictsPage-fxBdV1-3.js.map} +1 -1
  13. package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js → EntityContextRuntime-CMhoj6qe.js} +2 -2
  14. package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js.map → EntityContextRuntime-CMhoj6qe.js.map} +1 -1
  15. package/dist/chunks/EntityContextRuntime-Dc89ZSnM.js +1 -0
  16. package/dist/chunks/{ExportButton-e2ybxuHb.js → ExportButton-DGxB2tcu.js} +2 -2
  17. package/dist/chunks/{ExportButton-e2ybxuHb.js.map → ExportButton-DGxB2tcu.js.map} +1 -1
  18. package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js → FileViewerPreviewPanel-BMZ7FdKV.js} +3 -3
  19. package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js.map → FileViewerPreviewPanel-BMZ7FdKV.js.map} +1 -1
  20. package/dist/chunks/{FilesPage-BI35mStl.js → FilesPage-DrgWELKy.js} +3 -3
  21. package/dist/chunks/{FilesPage-BI35mStl.js.map → FilesPage-DrgWELKy.js.map} +1 -1
  22. package/dist/chunks/IdentitySecurityPage-BjTKvr-O.js +9 -0
  23. package/dist/chunks/IdentitySecurityPage-BjTKvr-O.js.map +1 -0
  24. package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js → LogStatsScaffold-DaB0JeAN.js} +2 -2
  25. package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js.map → LogStatsScaffold-DaB0JeAN.js.map} +1 -1
  26. package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js → LoginLogsPage-VmYC7i6q.js} +2 -2
  27. package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js.map → LoginLogsPage-VmYC7i6q.js.map} +1 -1
  28. package/dist/chunks/{LoginLogsTable-BweUEjQX.js → LoginLogsTable-CULcc_e8.js} +2 -2
  29. package/dist/chunks/{LoginLogsTable-BweUEjQX.js.map → LoginLogsTable-CULcc_e8.js.map} +1 -1
  30. package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js → MarkdownPreviewPanel-CBcPc7Wv.js} +2 -2
  31. package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js.map → MarkdownPreviewPanel-CBcPc7Wv.js.map} +1 -1
  32. package/dist/chunks/{MasterDetailLayout-KVizcSNO.js → MasterDetailLayout-ByIBpmkZ.js} +2 -2
  33. package/dist/chunks/{MasterDetailLayout-KVizcSNO.js.map → MasterDetailLayout-ByIBpmkZ.js.map} +1 -1
  34. package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js → McpSettingsPage-C5V_rj2V.js} +2 -2
  35. package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js.map → McpSettingsPage-C5V_rj2V.js.map} +1 -1
  36. package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js → MemberAssignmentSheet-DL0fg1Yf.js} +2 -2
  37. package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js.map → MemberAssignmentSheet-DL0fg1Yf.js.map} +1 -1
  38. package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js → MenuCommandPalette-C2PvK3Gh.js} +2 -2
  39. package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js.map → MenuCommandPalette-C2PvK3Gh.js.map} +1 -1
  40. package/dist/chunks/{MenusPage-Dd7OLQYT.js → MenusPage-Bytd1HlW.js} +2 -2
  41. package/dist/chunks/{MenusPage-Dd7OLQYT.js.map → MenusPage-Bytd1HlW.js.map} +1 -1
  42. package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js → MonacoPreviewPanel-BZrNIcFZ.js} +2 -2
  43. package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js.map → MonacoPreviewPanel-BZrNIcFZ.js.map} +1 -1
  44. package/dist/chunks/{NavListPanel-Iz1RCkVw.js → NavListPanel-zwUDIYSP.js} +2 -2
  45. package/dist/chunks/{NavListPanel-Iz1RCkVw.js.map → NavListPanel-zwUDIYSP.js.map} +1 -1
  46. package/dist/chunks/{OperationLogsPage-Dt22tU4I.js → OperationLogsPage-D2BQdGNp.js} +2 -2
  47. package/dist/chunks/{OperationLogsPage-Dt22tU4I.js.map → OperationLogsPage-D2BQdGNp.js.map} +1 -1
  48. package/dist/chunks/{OperationLogsTable-B23Ry-2v.js → OperationLogsTable-DaaON4QR.js} +3 -3
  49. package/dist/chunks/{OperationLogsTable-B23Ry-2v.js.map → OperationLogsTable-DaaON4QR.js.map} +1 -1
  50. package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js → PDFPreviewPanel-CMmnWBKW.js} +3 -3
  51. package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js.map → PDFPreviewPanel-CMmnWBKW.js.map} +1 -1
  52. package/dist/chunks/{PositionsPage-BIKYQDB5.js → PositionsPage-CBZITssT.js} +2 -2
  53. package/dist/chunks/{PositionsPage-BIKYQDB5.js.map → PositionsPage-CBZITssT.js.map} +1 -1
  54. package/dist/chunks/{PreferencesSheetBody-D276rrp4.js → PreferencesSheetBody-B0poTPEA.js} +2 -2
  55. package/dist/chunks/{PreferencesSheetBody-D276rrp4.js.map → PreferencesSheetBody-B0poTPEA.js.map} +1 -1
  56. package/dist/chunks/{ProfilePage-DLftC6KZ.js → ProfilePage-DLhacdWt.js} +2 -2
  57. package/dist/chunks/{ProfilePage-DLftC6KZ.js.map → ProfilePage-DLhacdWt.js.map} +1 -1
  58. package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js → ProjectInfoPage-CJpGxpu5.js} +2 -2
  59. package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js.map → ProjectInfoPage-CJpGxpu5.js.map} +1 -1
  60. package/dist/chunks/{RelationPanel-B4BeO0Bz.js → RelationPanel-BsbfEDo2.js} +2 -2
  61. package/dist/chunks/{RelationPanel-B4BeO0Bz.js.map → RelationPanel-BsbfEDo2.js.map} +1 -1
  62. package/dist/chunks/{RolesPage-BhltU2Qm.js → RolesPage-46dzdiah.js} +2 -2
  63. package/dist/chunks/{RolesPage-BhltU2Qm.js.map → RolesPage-46dzdiah.js.map} +1 -1
  64. package/dist/chunks/{SessionConflictModal-3R8jdYkI.js → SessionConflictModal-Bm38eExL.js} +2 -2
  65. package/dist/chunks/{SessionConflictModal-3R8jdYkI.js.map → SessionConflictModal-Bm38eExL.js.map} +1 -1
  66. package/dist/chunks/SettingModuleDetail-BjxUJeH5.js +17 -0
  67. package/dist/chunks/SettingModuleDetail-BjxUJeH5.js.map +1 -0
  68. package/dist/chunks/{SettingsPage-DMzeDrnc.js → SettingsPage-C32Vuizm.js} +2 -2
  69. package/dist/chunks/{SettingsPage-DMzeDrnc.js.map → SettingsPage-C32Vuizm.js.map} +1 -1
  70. package/dist/chunks/{StatCard-C0xSZyiS.js → StatCard-CRPfkSBY.js} +2 -2
  71. package/dist/chunks/{StatCard-C0xSZyiS.js.map → StatCard-CRPfkSBY.js.map} +1 -1
  72. package/dist/chunks/{UserGroupsPage-DTJdszHl.js → UserGroupsPage-08G5MdGm.js} +2 -2
  73. package/dist/chunks/{UserGroupsPage-DTJdszHl.js.map → UserGroupsPage-08G5MdGm.js.map} +1 -1
  74. package/dist/chunks/{UserLogsPanels-z4UhQtgu.js → UserLogsPanels-nbIrMym9.js} +2 -2
  75. package/dist/chunks/{UserLogsPanels-z4UhQtgu.js.map → UserLogsPanels-nbIrMym9.js.map} +1 -1
  76. package/dist/chunks/{UserTransferSelect-BJNUXMhl.js → UserTransferSelect-C8betaWG.js} +2 -2
  77. package/dist/chunks/{UserTransferSelect-BJNUXMhl.js.map → UserTransferSelect-C8betaWG.js.map} +1 -1
  78. package/dist/chunks/{UsersPage--p68X2Yr.js → UsersPage-BjTiNEqF.js} +2 -2
  79. package/dist/chunks/{UsersPage--p68X2Yr.js.map → UsersPage-BjTiNEqF.js.map} +1 -1
  80. package/dist/chunks/{browser-BKLM0ThC-3Xar5rZw.js → browser-BKLM0ThC-Cp7Gi4-F.js} +1 -1
  81. package/dist/chunks/{code-P0HJS_q1.js → code-LswxAr98.js} +1 -1
  82. package/dist/chunks/{direct-engine-BYEscsGg.js → direct-engine-Dv_6v4sx.js} +1 -1
  83. package/dist/chunks/{html-B__1Vr_C.js → html-BokjxlLb.js} +1 -1
  84. package/dist/chunks/{line-DzLRZVEq.js → line-Bqh6atHH.js} +1 -1
  85. package/dist/chunks/{lrc-kf-TilFB.js → lrc-T5e1svZG.js} +1 -1
  86. package/dist/chunks/{markdown-xIo-vnKK.js → markdown-BpWokN1s.js} +1 -1
  87. package/dist/chunks/{patch-BEaX-xYV.js → patch-BYVX5C9G.js} +1 -1
  88. package/dist/chunks/{worker-engine-FCdIQLzN.js → worker-engine-CtUAeI4G.js} +1 -1
  89. package/dist/core/hooks/queries/settings.d.ts +6 -0
  90. package/dist/core/hooks/queries/settings.d.ts.map +1 -1
  91. package/dist/core/hooks/queries/settings.js +34 -25
  92. package/dist/core/hooks/queries/settings.js.map +1 -1
  93. package/dist/core/hooks/useAuth.d.ts +2 -0
  94. package/dist/core/hooks/useAuth.d.ts.map +1 -1
  95. package/dist/core/hooks/useAuth.js.map +1 -1
  96. package/dist/core/index.js +7 -7
  97. package/dist/core/lib/go-auth-api.d.ts +1 -1
  98. package/dist/core/lib/go-auth-api.d.ts.map +1 -1
  99. package/dist/core/lib/go-auth-api.js +12 -8
  100. package/dist/core/lib/go-auth-api.js.map +1 -1
  101. package/dist/core/lib/native-operations.d.ts +85 -4
  102. package/dist/core/lib/native-operations.d.ts.map +1 -1
  103. package/dist/core/lib/native-operations.js +1 -0
  104. package/dist/core/lib/native-operations.js.map +1 -1
  105. package/dist/core/providers/GoAuthProvider.d.ts.map +1 -1
  106. package/dist/core/providers/GoAuthProvider.js +191 -142
  107. package/dist/core/providers/GoAuthProvider.js.map +1 -1
  108. package/dist/core/session-renewal.d.ts +15 -0
  109. package/dist/core/session-renewal.d.ts.map +1 -0
  110. package/dist/core/session-renewal.js +95 -0
  111. package/dist/core/session-renewal.js.map +1 -0
  112. package/dist/core/session-transition.d.ts +2 -0
  113. package/dist/core/session-transition.d.ts.map +1 -1
  114. package/dist/core/session-transition.js +20 -7
  115. package/dist/core/session-transition.js.map +1 -1
  116. package/dist/core/session.d.ts +4 -0
  117. package/dist/core/session.d.ts.map +1 -1
  118. package/dist/core/session.js +88 -61
  119. package/dist/core/session.js.map +1 -1
  120. package/dist/index.js +1 -1
  121. package/dist/{src-C8_bzBi4.js → src-D6UlLiVN.js} +2 -2
  122. package/dist/{src-C8_bzBi4.js.map → src-D6UlLiVN.js.map} +1 -1
  123. package/package.json +9 -9
  124. package/dist/chunks/ApiTokensPage-DiRMgViD.js +0 -2
  125. package/dist/chunks/ApiTokensPage-DiRMgViD.js.map +0 -1
  126. package/dist/chunks/EntityContextRuntime-BOJySc1D.js +0 -1
  127. package/dist/chunks/IdentitySecurityPage-DW5ybVL4.js +0 -9
  128. package/dist/chunks/IdentitySecurityPage-DW5ybVL4.js.map +0 -1
  129. package/dist/chunks/SettingModuleDetail-Dppk9An1.js +0 -17
  130. package/dist/chunks/SettingModuleDetail-Dppk9An1.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-Bruge11p.js";import{$ as t,Q as n,it as r,nt as i,ot as a,rt as o,st as s}from"./clipboard-dpqHdCyy.js";import{n as c,t as l}from"./MasterDetailLayout-KVizcSNO.js";import{$n as u,Bn as d,Bt as f,C as p,D as m,Di as h,Dn as g,E as _,En as v,Fn as y,I as b,In as x,It as S,Jt as C,Kt as w,L as T,Lt as ee,Nn as te,On as ne,Or as E,Pn as D,Qn as O,Rn as re,S as k,St as ie,T as ae,Vn as oe,Vt as se,Yt as ce,_ as le,_i as ue,a as de,b as fe,br as pe,cr as me,et as he,fr as ge,gi as A,i as _e,kn as ve,kr as ye,m as j,mr as be,n as xe,o as M,oi as N,qt as Se,r as Ce,s as we,si as P,sr as Te,t as F,tt as Ee,u as I,v as L,w as De,x as Oe,xt as ke,yr as Ae,zn as je}from"./StatCard-C0xSZyiS.js";import{n as Me,t as Ne}from"./circle-check-7VdHEHqi.js";import{n as Pe,t as Fe}from"./circle-x-Dwu41gys.js";import{n as Ie,t as Le}from"./log-in-CQWfpLmf.js";import{i as Re,t as R}from"./table-columns-CvT6OHd2.js";import{n as ze,r as Be}from"./NavListPanel-Iz1RCkVw.js";import{i as Ve,n as He,r as Ue,t as We}from"./useSectionSelection-DBggfIoz.js";import{n as Ge,t as Ke}from"./LoginLogsTable-BweUEjQX.js";import{n as qe,t as Je}from"./ExportButton-e2ybxuHb.js";import{In as Ye,K as Xe,Nn as Ze,Or as Qe,kr as $e,q as et}from"./chart-data-DI8rr6W3.js";import{Cn as tt,hr as nt,nt as rt,rt as it,xn as at}from"./chart-renderer-Dl8qlg1n.js";import{C as ot,_ as z,a as st,b as ct,c as lt,d as ut,f as dt,g as ft,h as pt,i as mt,l as ht,m as gt,n as _t,o as vt,p as yt,r as bt,s as xt,t as B,u as St,v as Ct,w as wt,y as V}from"./LogStatsScaffold-m0vVUXPh.js";import{useMemo as H,useState as Tt}from"react";import{Fragment as U,jsx as W,jsxs as G}from"react/jsx-runtime";import{enumValueOf as K}from"@fudanda/client/core";import Et from"dayjs";import{useFilterQuery as Dt}from"@fudanda/admin-antd/core/hooks/useFilterQuery";import{useListSearch as Ot}from"@fudanda/admin-antd/core/hooks/useListSearch";import{formatDateTimeRangeForApi as kt,parseDateTimeParam as At,shortDate as jt}from"@fudanda/admin-antd/core/utils/date";import{useListDeepLink as Mt}from"@fudanda/admin-antd/core/hooks/useListDeepLink";import{LOGIN_EVENT_TYPES as Nt,LOGIN_EVENT_TYPE_OPTIONS as Pt,LOGIN_STATUSES as Ft,LOGIN_STATUS_OPTIONS as It}from"@fudanda/client/identity";import{buildUserChartLabels as Lt}from"@fudanda/admin-antd/core/utils/user-labels";import{loginLogKeys as Rt,useCleanLoginLogs as zt,useLoginLogList as Bt,useLoginLogStats as Vt}from"@fudanda/admin-antd/core/hooks/queries/login-logs";var q,Ht;function Ut(){return(Ut=e((()=>{P(),rt(),h(),Qe(),pe(),q=class e extends Ae{constructor(){super(...arguments),this.type=e.type}_getDefaultStyle(){return Object.assign(Object.assign({},super._getDefaultStyle()),{fill:void 0,lineWidth:0,padding:0})}_createGraphic(e={}){return nt(e)}_transformGraphicAttributes(e,t,n){let r=super._transformGraphicAttributes(e,t,n),i=r.shape??r.symbolType??e.attribute?.symbolType;return r.symbolType=$e(i)?`rect`:i,r}},q.type=`cell`,Ht=()=>{N.registerMark(q.type,q),N.registerGraphicComponent(`symbol`,nt),tt(),at(),it()}})))()}function Wt(e){return!1===e?{}:{type:`fadeIn`}}var Gt;function Kt(){return(Kt=e((()=>{P(),be(),Gt=()=>{N.registerAnimation(`heatmap`,((e,t)=>Object.assign(Object.assign({},ge),{appear:Wt(t)})))}})))()}var qt;function Jt(){return(Jt=e((()=>{u(),qt=class extends O{enableByType(e){return e!==`dimension`}}})))()}var Yt;function Xt(){return(Xt=e((()=>{oe(),Yt=Object.assign(Object.assign({},d),{cell:{name:`cell`,type:`cell`},cellBackground:{name:`cellBackground`,type:`cell`}})})))()}var J;function Zt(){return(Zt=e((()=>{D(),J=class extends te{_transformLabelSpec(e){this._addMarkLabelSpec(e,`cell`)}}})))()}var Y;function Qt(){return(Qt=e((()=>{Y={cell:{style:{shape:`rect`,fillOpacity:1}},cellBackground:{visible:!1},label:{style:{lineWidth:2}}}})))()}var $t,X,en;function tn(){return(tn=e((()=>{Ut(),g(),ye(),Kt(),x(),he(),ue(),Ye(),Xe(),Jt(),Xt(),P(),ve(),Zt(),w(),C(),Qt(),$t={valueField:!0},X=class e extends v{constructor(){super(...arguments),this.type=A.heatmap,this.transformerConstructor=J}getFieldValue(){return this._fieldValue}setFieldValue(e){this._fieldValue=Ze(e)}_getSpecUpdatePolicy(){let e=super._getSpecUpdatePolicy();return Object.assign(Object.assign({},e),{dataRelatedKeys:Object.assign(Object.assign({},e.dataRelatedKeys),$t)})}setAttrFromSpec(){super.setAttrFromSpec(),this.setFieldValue(this._spec.valueField)}initMark(){this._cellMark=this._createMark(e.mark.cell,{isSeriesMark:!0},{morph:re(this._spec,e.mark.cell.name),morphElementKey:this.getDimensionField()[0]}),this._backgroundMark=this._createMark(e.mark.cellBackground)}initMarkStyle(){this.initCellMarkStyle(),this.initCellBackgroundMarkStyle()}initLabelMarkStyle(e){e&&this.setMarkStyle(e,{fill:this._spec.cell?.style?.fill??this.getColorAttribute(),text:e=>e[this.getMeasureField()[0]]})}initCellMarkStyle(){this.setMarkStyle(this._cellMark,{x:e=>this.dataToPositionX(e),y:e=>this.dataToPositionY(e),size:()=>[this.getCellSize(this._xAxisHelper),this.getCellSize(this._yAxisHelper)],fill:this.getColorAttribute()},`normal`,E.Series)}initCellBackgroundMarkStyle(){let e=et(this._spec.cellBackground?.style?.padding??0);this.setMarkStyle(this._backgroundMark,{x:t=>{let n=this.getCellSize(this._xAxisHelper);return this.dataToPositionX(t)-n/2+e[3]},y:t=>{let n=this.getCellSize(this._yAxisHelper);return this.dataToPositionY(t)-n/2+e[0]},width:()=>this.getCellSize(this._xAxisHelper)-e[1]-e[3],height:()=>this.getCellSize(this._yAxisHelper)-e[0]-e[2]},`normal`,E.Series)}getColorAttribute(){return{scale:this._option.globalScale.getScale(`color`)??this._getDefaultColorScale(),field:this.getFieldValue()[0]}}getInteractionTriggers(){return this._parseInteractionConfig(this._cellMark?[this._cellMark]:[])}initAnimation(){let e=this._spec?.animationAppear?.preset,t=ne(this);this._cellMark.setAnimationConfig(y(N.getAnimationInKey(`heatmap`)?.(e),je(`cell`,this._spec,this._markAttributeContext),t))}getCellSize(e){return e.getBandwidth?.call(e,0)??6}initTooltip(){this._tooltipHelper=new qt(this),this._cellMark&&this._tooltipHelper.activeTriggerSet.mark.add(this._cellMark)}getDefaultShapeType(){return`rect`}getDimensionField(){return[].concat(this.fieldX,this.fieldY)}getMeasureField(){return this.getFieldValue()}getActiveMarks(){return[this._cellMark]}},X.type=A.heatmap,X.mark=Yt,X.builtInTheme={heatmap:Y},X.transformerConstructor=J,en=()=>{Ee(),Ht(),Gt(),ce(),Se(),N.registerSeries(X.type,X)}})))()}var Z;function nn(){return(nn=e((()=>{ee(),Z=class extends S{_getDefaultSeriesSpec(e){return super._getDefaultSeriesSpec(e,[`valueField`,`cell`])}}})))()}var Q,rn;function an(){return(an=e((()=>{ue(),tn(),P(),nn(),se(),ke(),Q=class extends f{constructor(){super(...arguments),this.transformerConstructor=Z,this.type=`heatmap`,this.seriesType=A.heatmap}},Q.type=`heatmap`,Q.seriesType=A.heatmap,Q.transformerConstructor=Z,rn=()=>{ie(),en(),N.registerChart(Q.type,Q)}})))()}var on;function sn(){return(sn=e((()=>{me(),an(),b(),m(),De(),on=_(`HeatmapChart`,{type:`heatmap`,vchartConstructor:Te},[rn,T,...ae])})))()}function cn(e){let t=(/\(([^)]+)\)/.exec(e)?.[1]??e).split(`,`).map(e=>e.trim());return(t[1]||t[0]||e).slice(0,40)}function ln(){let e=Oe(),[t,n]=Tt(30),r=Vt({days:t}),i=r.data??null,a=H(()=>{if(!i)return[];let e=new Map(i.dailyStats.map(e=>[e.date,e])),n=Et();return Array.from({length:t},(r,i)=>{let a=n.subtract(t-1-i,`day`).format(`YYYY-MM-DD`);return e.get(a)??{date:a,count:0,successCount:0,failCount:0}})},[i,t]),o=H(()=>lt(i?.dailyStats),[i]),{userChartData:s,userChartTitleOf:c}=H(()=>{let e=[...i?.userStats??[]].reverse(),{nameOf:t,fullOf:n}=Lt(e);return{userChartData:e.map(e=>({name:t(e),count:e.count})),userChartTitleOf:e=>n.get(e)??e}},[i]),l=H(()=>[...i?.ipFailStats??[]].reverse().map(e=>({name:e.ip,count:e.count})),[i]),u=H(()=>(i?.hourlyStats??[]).map(e=>({name:`${String(e.hour).padStart(2,`0`)}:00`,count:e.count})),[i]),d=H(()=>(i?.browserStats??[]).map(e=>({name:e.browser,value:e.count})),[i]),f=H(()=>(i?.osStats??[]).map(e=>({name:e.os,value:e.count})),[i]),p=H(()=>(i?.failReasonStats??[]).map(e=>({name:e.message,value:e.count})),[i]),m=H(()=>[...i?.locationStats??[]].reverse().map(e=>({name:e.location,count:e.count})),[i]),h=H(()=>[...i?.resolutionStats??[]].reverse().map(e=>({name:e.resolution,count:e.count})),[i]),g=H(()=>[...i?.gpuStats??[]].reverse().map(e=>({name:cn(e.gpu),count:e.count})),[i]),_=H(()=>(i?.dowHourStats??[]).map(e=>({hour:`${String(e.hour).padStart(2,`0`)}h`,weekday:bt[e.dow-1]??`周${e.dow}`,count:e.count})),[i]),v=i?.summary,y=i?.prevSummary,b=mt(v),x=st(v,y),S=H(()=>v?[{name:`成功`,value:v.successCount},{name:`失败`,value:v.failCount}]:[],[v]),C=H(()=>de({data:a,xField:`date`,series:[{field:`successCount`,name:`成功`,color:e.success},{field:`failCount`,name:`失败`,color:e.danger}],palette:e,point:t<=7,pointSize:6,fillOpacity:.26,axis:{xLabel:jt},tooltip:{title:e=>`日期:${e}`,value:e=>`${e} 次`}}),[t,a,e]),w=H(()=>M({data:s,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.success}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,labelColor:e.success,categoryAxisWidth:96,tooltip:{title:c,value:e=>`${e} 次`}}),[e,s,c]),T=H(()=>M({data:l,xField:`name`,series:[{field:`count`,name:`失败次数`,color:e.risk}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,labelColor:e.risk,categoryAxisWidth:120,tooltip:{value:e=>`${e} 次`}}),[l,e]),ee=H(()=>M({data:u,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.active}],palette:e,barMaxWidth:18,axis:{xLabel:e=>e.replace(`:00`,`h`)},tooltip:{title:e=>`${e} - ${e.replace(`:00`,`:59`)}`,value:e=>`${e} 次`}}),[u,e]),te=H(()=>I({data:S,categoryField:`name`,valueField:`value`,palette:e,donut:!0,colors:[e.success,e.danger],outerRadius:.86,innerRadius:.58,padAngle:1.5,cornerRadius:5,label:`value`,labelPosition:`inside`,labelColor:`#fff`,labelFontSize:12,indicator:{title:b==null?`--`:`${b}%`,subtitle:`成功率`},indicatorTitleFontSize:28,tooltipKey:`次数`,valueUnit:`次`}),[e,S,b]),ne=H(()=>I({data:d,categoryField:`name`,valueField:`value`,palette:e,donut:!0,innerRadius:.48,outerRadius:.82,padAngle:1,cornerRadius:3,legendLabelFontSize:11,tooltipKey:`访问次数`,valueUnit:`次`}),[d,e]),E=H(()=>I({data:f,categoryField:`name`,valueField:`value`,palette:e,donut:!0,innerRadius:.48,outerRadius:.82,padAngle:1,cornerRadius:3,legendLabelFontSize:11,tooltipKey:`访问次数`,valueUnit:`次`}),[f,e]),D=H(()=>M({data:o,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.primary}],palette:e,showLabel:!0,tooltip:{value:e=>`${e} 次`}}),[o,e]),O=H(()=>I({data:p,categoryField:`name`,valueField:`value`,palette:e,donut:!0,innerRadius:.48,outerRadius:.82,padAngle:1,cornerRadius:3,legendLabelFontSize:11,tooltipKey:`失败次数`,valueUnit:`次`}),[p,e]),re=H(()=>M({data:m,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.active}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,labelColor:e.active,categoryAxisWidth:120,tooltip:{value:e=>`${e} 次`}}),[m,e]),ie=H(()=>M({data:h,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.dataColors[4]??e.primary}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,categoryAxisWidth:96,tooltip:{value:e=>`${e} 次`}}),[h,e]),ae=H(()=>M({data:g,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.dataColors[6]??e.primary}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,categoryAxisWidth:150,tooltip:{value:e=>`${e} 次`}}),[g,e]),oe=H(()=>we({data:_,xField:`hour`,yField:`weekday`,valueField:`count`,palette:e,tooltip:{title:e=>`${e?.weekday??``} ${e?.hour??``}`,valueName:`登录次数`,value:e=>`${e} 次`}}),[_,e]);return/* @__PURE__ */ G(_t,{days:t,onDaysChange:n,loading:r.isLoading,fetching:r.isFetching,children:[/* @__PURE__ */ G(xe,{style:{marginBottom:16},children:[/* @__PURE__ */ W(F,{title:`总登录次数`,value:v?v.total.toLocaleString():R,sub:`近 ${t} 天累计`,icon:/* @__PURE__ */ W(Le,{size:22}),accent:`var(--arc-antd-color-primary)`,delta:v&&y?vt(v.total,y.total):null,deltaLabel:`较上一周期`}),/* @__PURE__ */ W(F,{title:`登录成功率`,value:b==null?R:`${b}%`,sub:v?`成功 ${v.successCount.toLocaleString()} · 失败 ${v.failCount.toLocaleString()}`:void 0,icon:/* @__PURE__ */ W(Ne,{size:22}),accent:`var(--arc-antd-color-success)`,delta:x,deltaLabel:`较上一周期`,deltaFormat:`ratio`}),/* @__PURE__ */ W(F,{title:`登录失败次数`,value:v?v.failCount.toLocaleString():R,sub:`密码错误、账号锁定等`,icon:/* @__PURE__ */ W(Fe,{size:22}),accent:v&&v.failCount>0?`var(--arc-antd-color-danger)`:void 0,delta:v&&y?vt(v.failCount,y.failCount):null,deltaLabel:`较上一周期`})]}),/* @__PURE__ */ W(B,{title:`每日登录趋势(成功 / 失败)`,children:L(a)?/* @__PURE__ */ W(z,{height:230}):/* @__PURE__ */ W(ot,{...C,options:j,height:230})}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginTop:16,marginBottom:16},children:[/* @__PURE__ */ W(B,{title:`Top 10 登录用户`,children:s.length===0?/* @__PURE__ */ W(z,{}):/* @__PURE__ */ W(k,{...w,options:j,height:260})}),/* @__PURE__ */ W(B,{danger:l.length>0,title:/* @__PURE__ */ G(U,{children:[`失败登录 Top 10 IP`,l.length>0&&/* @__PURE__ */ W(`span`,{style:{fontSize:12,fontWeight:400,marginLeft:8,color:`var(--arc-antd-color-text-2)`},children:`可能存在安全风险`})]}),children:l.length===0?/* @__PURE__ */ W(z,{tone:`success`,text:`该时间段无失败登录`}):/* @__PURE__ */ W(k,{...T,options:j,height:260})})]}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginBottom:16},children:[/* @__PURE__ */ W(B,{title:`按小时登录分布`,children:L(u)?/* @__PURE__ */ W(z,{height:240}):/* @__PURE__ */ W(k,{...ee,options:j,height:240})}),/* @__PURE__ */ W(B,{title:`成功 / 失败占比`,children:L(S)?/* @__PURE__ */ W(z,{height:240}):/* @__PURE__ */ W(V,{...te,options:j,height:240})})]}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginBottom:16},children:[/* @__PURE__ */ W(B,{title:`浏览器分布`,children:d.length===0?/* @__PURE__ */ W(z,{height:260}):/* @__PURE__ */ W(V,{...ne,options:j,height:260})}),/* @__PURE__ */ W(B,{title:`操作系统分布`,children:f.length===0?/* @__PURE__ */ W(z,{height:260}):/* @__PURE__ */ W(V,{...E,options:j,height:260})})]}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginBottom:16},children:[/* @__PURE__ */ W(B,{danger:p.length>0,title:`失败原因分布`,children:p.length===0?/* @__PURE__ */ W(z,{tone:`success`,text:`该时间段无失败登录`,height:260}):/* @__PURE__ */ W(V,{...O,options:j,height:260})}),/* @__PURE__ */ W(B,{title:`登录地点 Top 10`,children:m.length===0?/* @__PURE__ */ W(z,{height:260}):/* @__PURE__ */ W(k,{...re,options:j,height:260})})]}),/* @__PURE__ */ W(B,{title:`星期 × 小时登录热力(近 ${t} 天)`,children:L(_)?/* @__PURE__ */ W(z,{height:280}):/* @__PURE__ */ W(on,{...oe,options:j,height:280})}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginTop:16,marginBottom:16},children:[/* @__PURE__ */ W(B,{title:`设备分辨率 Top 8`,children:h.length===0?/* @__PURE__ */ W(z,{height:240}):/* @__PURE__ */ W(k,{...ie,options:j,height:240})}),/* @__PURE__ */ W(B,{title:`设备 GPU Top 8`,children:g.length===0?/* @__PURE__ */ W(z,{height:240}):/* @__PURE__ */ W(k,{...ae,options:j,height:240})})]}),/* @__PURE__ */ W(B,{title:`按星期登录分布(近 ${t} 天)`,children:L(o)?/* @__PURE__ */ W(z,{height:220}):/* @__PURE__ */ W(k,{...D,options:j,height:220})})]})}function un(){return(un=e((()=>{Ie(),Me(),Pe(),wt(),p(),sn(),ct(),fe(),le(),_e(),Ct(),Ce(),xt(),Re()})))()}function dn(){let e=He(pt,`list`),t=e.active,s={username:``,eventType:void 0,status:void 0,timeRange:null},{page:c,pageSize:u,setPage:d,buildPagination:f,bind:p,bindKeyword:m,submittedParams:h,handleSearch:g,handleReset:_,applySearch:v}=Ot({defaults:s,listKey:Rt.lists});Mt([`status`,`startTime`,`endTime`],e=>{let t=At(e.startTime),n=At(e.endTime);v({...s,status:K(Ft,e.status),timeRange:t&&n?[t,n]:null})},{getNextParams:()=>({tab:`list`})});let y=Dt({username:h.username,eventType:K(Nt,h.eventType),status:K(Ft,h.status),...kt(h.timeRange)}),b=Bt({page:c,pageSize:u,...y},t===`list`),x=b.data?.list??[],S=b.data?.total??0,C=zt(),w=C.isPending,T=yt({clean:e=>C.mutateAsync({query:{days:e}}),onCleared:()=>d(1)});return/* @__PURE__ */ G(`div`,{className:`page-container page-container--stretch`,children:[/* @__PURE__ */ W(l,{defaultSize:260,minSize:200,maxSize:400,persistKey:`login-logs`,style:{flex:1,minHeight:0,overflow:`hidden`},showDetail:t!==null,onBack:e.back,onResponsiveChange:e.responsiveChange,master:/* @__PURE__ */ W(ze,{title:`日志模块`,rawBody:!0,children:/* @__PURE__ */ W(Ue,{sections:gt,active:t,onSelect:e.select})}),detail:/* @__PURE__ */ G(l.Body,{padding:16,scroll:t===`list`?`hidden`:`auto`,style:{display:`flex`,flexDirection:`column`},children:[t===`list`&&/* @__PURE__ */ W(Ke,{searchConfig:n({keyword:/* @__PURE__ */ W(r,{placeholder:`用户名 / 昵称`,...m(`username`),width:180}),filters:/* @__PURE__ */ G(U,{children:[/* @__PURE__ */ W(o,{placeholder:`全部事件`,items:Pt,...p(`eventType`)}),/* @__PURE__ */ W(a,{items:It,...p(`status`)}),/* @__PURE__ */ W(i,{searchLabel:`登录时间`,...p(`timeRange`)})]}),onSearch:g,onReset:_,actions:/* @__PURE__ */ G(U,{children:[/* @__PURE__ */ W(Je,{entity:`system.login-logs`,query:y}),/* @__PURE__ */ W(ht,{loading:w,onClear:T.openClearModal})]}),filterTitle:`登录日志筛选`,actionTitle:`日志操作`}),dataSource:x,loading:b.isFetching,onRefresh:()=>void b.refetch(),pagination:f(S)}),t===`stats`&&/* @__PURE__ */ W(ln,{})]})}),/* @__PURE__ */ W(St,{logName:`登录日志`,control:T})]})}function $(){return($=e((()=>{c(),Be(),Ve(),ft(),We(),t(),qe(),Ge(),ut(),dt(),un(),s()})))()}$();export{dn as default};
2
- //# sourceMappingURL=LoginLogsPage-BzBUR4Oo.js.map
1
+ import{n as e}from"./rolldown-runtime-Bruge11p.js";import{$ as t,Q as n,it as r,nt as i,ot as a,rt as o,st as s}from"./clipboard-dpqHdCyy.js";import{n as c,t as l}from"./MasterDetailLayout-ByIBpmkZ.js";import{$n as u,Bn as d,Bt as f,C as p,D as m,Di as h,Dn as g,E as _,En as v,Fn as y,I as b,In as x,It as S,Jt as C,Kt as w,L as T,Lt as ee,Nn as te,On as ne,Or as E,Pn as D,Qn as O,Rn as re,S as k,St as ie,T as ae,Vn as oe,Vt as se,Yt as ce,_ as le,_i as ue,a as de,b as fe,br as pe,cr as me,et as he,fr as ge,gi as A,i as _e,kn as ve,kr as ye,m as j,mr as be,n as xe,o as M,oi as N,qt as Se,r as Ce,s as we,si as P,sr as Te,t as F,tt as Ee,u as I,v as L,w as De,x as Oe,xt as ke,yr as Ae,zn as je}from"./StatCard-CRPfkSBY.js";import{n as Me,t as Ne}from"./circle-check-7VdHEHqi.js";import{n as Pe,t as Fe}from"./circle-x-Dwu41gys.js";import{n as Ie,t as Le}from"./log-in-CQWfpLmf.js";import{i as Re,t as R}from"./table-columns-CvT6OHd2.js";import{n as ze,r as Be}from"./NavListPanel-zwUDIYSP.js";import{i as Ve,n as He,r as Ue,t as We}from"./useSectionSelection-DBggfIoz.js";import{n as Ge,t as Ke}from"./LoginLogsTable-CULcc_e8.js";import{n as qe,t as Je}from"./ExportButton-DGxB2tcu.js";import{In as Ye,K as Xe,Nn as Ze,Or as Qe,kr as $e,q as et}from"./chart-data-DI8rr6W3.js";import{Cn as tt,hr as nt,nt as rt,rt as it,xn as at}from"./chart-renderer-Dl8qlg1n.js";import{C as ot,_ as z,a as st,b as ct,c as lt,d as ut,f as dt,g as ft,h as pt,i as mt,l as ht,m as gt,n as _t,o as vt,p as yt,r as bt,s as xt,t as B,u as St,v as Ct,w as wt,y as V}from"./LogStatsScaffold-DaB0JeAN.js";import{useMemo as H,useState as Tt}from"react";import{Fragment as U,jsx as W,jsxs as G}from"react/jsx-runtime";import{enumValueOf as K}from"@fudanda/client/core";import Et from"dayjs";import{useFilterQuery as Dt}from"@fudanda/admin-antd/core/hooks/useFilterQuery";import{useListSearch as Ot}from"@fudanda/admin-antd/core/hooks/useListSearch";import{formatDateTimeRangeForApi as kt,parseDateTimeParam as At,shortDate as jt}from"@fudanda/admin-antd/core/utils/date";import{useListDeepLink as Mt}from"@fudanda/admin-antd/core/hooks/useListDeepLink";import{LOGIN_EVENT_TYPES as Nt,LOGIN_EVENT_TYPE_OPTIONS as Pt,LOGIN_STATUSES as Ft,LOGIN_STATUS_OPTIONS as It}from"@fudanda/client/identity";import{buildUserChartLabels as Lt}from"@fudanda/admin-antd/core/utils/user-labels";import{loginLogKeys as Rt,useCleanLoginLogs as zt,useLoginLogList as Bt,useLoginLogStats as Vt}from"@fudanda/admin-antd/core/hooks/queries/login-logs";var q,Ht;function Ut(){return(Ut=e((()=>{P(),rt(),h(),Qe(),pe(),q=class e extends Ae{constructor(){super(...arguments),this.type=e.type}_getDefaultStyle(){return Object.assign(Object.assign({},super._getDefaultStyle()),{fill:void 0,lineWidth:0,padding:0})}_createGraphic(e={}){return nt(e)}_transformGraphicAttributes(e,t,n){let r=super._transformGraphicAttributes(e,t,n),i=r.shape??r.symbolType??e.attribute?.symbolType;return r.symbolType=$e(i)?`rect`:i,r}},q.type=`cell`,Ht=()=>{N.registerMark(q.type,q),N.registerGraphicComponent(`symbol`,nt),tt(),at(),it()}})))()}function Wt(e){return!1===e?{}:{type:`fadeIn`}}var Gt;function Kt(){return(Kt=e((()=>{P(),be(),Gt=()=>{N.registerAnimation(`heatmap`,((e,t)=>Object.assign(Object.assign({},ge),{appear:Wt(t)})))}})))()}var qt;function Jt(){return(Jt=e((()=>{u(),qt=class extends O{enableByType(e){return e!==`dimension`}}})))()}var Yt;function Xt(){return(Xt=e((()=>{oe(),Yt=Object.assign(Object.assign({},d),{cell:{name:`cell`,type:`cell`},cellBackground:{name:`cellBackground`,type:`cell`}})})))()}var J;function Zt(){return(Zt=e((()=>{D(),J=class extends te{_transformLabelSpec(e){this._addMarkLabelSpec(e,`cell`)}}})))()}var Y;function Qt(){return(Qt=e((()=>{Y={cell:{style:{shape:`rect`,fillOpacity:1}},cellBackground:{visible:!1},label:{style:{lineWidth:2}}}})))()}var $t,X,en;function tn(){return(tn=e((()=>{Ut(),g(),ye(),Kt(),x(),he(),ue(),Ye(),Xe(),Jt(),Xt(),P(),ve(),Zt(),w(),C(),Qt(),$t={valueField:!0},X=class e extends v{constructor(){super(...arguments),this.type=A.heatmap,this.transformerConstructor=J}getFieldValue(){return this._fieldValue}setFieldValue(e){this._fieldValue=Ze(e)}_getSpecUpdatePolicy(){let e=super._getSpecUpdatePolicy();return Object.assign(Object.assign({},e),{dataRelatedKeys:Object.assign(Object.assign({},e.dataRelatedKeys),$t)})}setAttrFromSpec(){super.setAttrFromSpec(),this.setFieldValue(this._spec.valueField)}initMark(){this._cellMark=this._createMark(e.mark.cell,{isSeriesMark:!0},{morph:re(this._spec,e.mark.cell.name),morphElementKey:this.getDimensionField()[0]}),this._backgroundMark=this._createMark(e.mark.cellBackground)}initMarkStyle(){this.initCellMarkStyle(),this.initCellBackgroundMarkStyle()}initLabelMarkStyle(e){e&&this.setMarkStyle(e,{fill:this._spec.cell?.style?.fill??this.getColorAttribute(),text:e=>e[this.getMeasureField()[0]]})}initCellMarkStyle(){this.setMarkStyle(this._cellMark,{x:e=>this.dataToPositionX(e),y:e=>this.dataToPositionY(e),size:()=>[this.getCellSize(this._xAxisHelper),this.getCellSize(this._yAxisHelper)],fill:this.getColorAttribute()},`normal`,E.Series)}initCellBackgroundMarkStyle(){let e=et(this._spec.cellBackground?.style?.padding??0);this.setMarkStyle(this._backgroundMark,{x:t=>{let n=this.getCellSize(this._xAxisHelper);return this.dataToPositionX(t)-n/2+e[3]},y:t=>{let n=this.getCellSize(this._yAxisHelper);return this.dataToPositionY(t)-n/2+e[0]},width:()=>this.getCellSize(this._xAxisHelper)-e[1]-e[3],height:()=>this.getCellSize(this._yAxisHelper)-e[0]-e[2]},`normal`,E.Series)}getColorAttribute(){return{scale:this._option.globalScale.getScale(`color`)??this._getDefaultColorScale(),field:this.getFieldValue()[0]}}getInteractionTriggers(){return this._parseInteractionConfig(this._cellMark?[this._cellMark]:[])}initAnimation(){let e=this._spec?.animationAppear?.preset,t=ne(this);this._cellMark.setAnimationConfig(y(N.getAnimationInKey(`heatmap`)?.(e),je(`cell`,this._spec,this._markAttributeContext),t))}getCellSize(e){return e.getBandwidth?.call(e,0)??6}initTooltip(){this._tooltipHelper=new qt(this),this._cellMark&&this._tooltipHelper.activeTriggerSet.mark.add(this._cellMark)}getDefaultShapeType(){return`rect`}getDimensionField(){return[].concat(this.fieldX,this.fieldY)}getMeasureField(){return this.getFieldValue()}getActiveMarks(){return[this._cellMark]}},X.type=A.heatmap,X.mark=Yt,X.builtInTheme={heatmap:Y},X.transformerConstructor=J,en=()=>{Ee(),Ht(),Gt(),ce(),Se(),N.registerSeries(X.type,X)}})))()}var Z;function nn(){return(nn=e((()=>{ee(),Z=class extends S{_getDefaultSeriesSpec(e){return super._getDefaultSeriesSpec(e,[`valueField`,`cell`])}}})))()}var Q,rn;function an(){return(an=e((()=>{ue(),tn(),P(),nn(),se(),ke(),Q=class extends f{constructor(){super(...arguments),this.transformerConstructor=Z,this.type=`heatmap`,this.seriesType=A.heatmap}},Q.type=`heatmap`,Q.seriesType=A.heatmap,Q.transformerConstructor=Z,rn=()=>{ie(),en(),N.registerChart(Q.type,Q)}})))()}var on;function sn(){return(sn=e((()=>{me(),an(),b(),m(),De(),on=_(`HeatmapChart`,{type:`heatmap`,vchartConstructor:Te},[rn,T,...ae])})))()}function cn(e){let t=(/\(([^)]+)\)/.exec(e)?.[1]??e).split(`,`).map(e=>e.trim());return(t[1]||t[0]||e).slice(0,40)}function ln(){let e=Oe(),[t,n]=Tt(30),r=Vt({days:t}),i=r.data??null,a=H(()=>{if(!i)return[];let e=new Map(i.dailyStats.map(e=>[e.date,e])),n=Et();return Array.from({length:t},(r,i)=>{let a=n.subtract(t-1-i,`day`).format(`YYYY-MM-DD`);return e.get(a)??{date:a,count:0,successCount:0,failCount:0}})},[i,t]),o=H(()=>lt(i?.dailyStats),[i]),{userChartData:s,userChartTitleOf:c}=H(()=>{let e=[...i?.userStats??[]].reverse(),{nameOf:t,fullOf:n}=Lt(e);return{userChartData:e.map(e=>({name:t(e),count:e.count})),userChartTitleOf:e=>n.get(e)??e}},[i]),l=H(()=>[...i?.ipFailStats??[]].reverse().map(e=>({name:e.ip,count:e.count})),[i]),u=H(()=>(i?.hourlyStats??[]).map(e=>({name:`${String(e.hour).padStart(2,`0`)}:00`,count:e.count})),[i]),d=H(()=>(i?.browserStats??[]).map(e=>({name:e.browser,value:e.count})),[i]),f=H(()=>(i?.osStats??[]).map(e=>({name:e.os,value:e.count})),[i]),p=H(()=>(i?.failReasonStats??[]).map(e=>({name:e.message,value:e.count})),[i]),m=H(()=>[...i?.locationStats??[]].reverse().map(e=>({name:e.location,count:e.count})),[i]),h=H(()=>[...i?.resolutionStats??[]].reverse().map(e=>({name:e.resolution,count:e.count})),[i]),g=H(()=>[...i?.gpuStats??[]].reverse().map(e=>({name:cn(e.gpu),count:e.count})),[i]),_=H(()=>(i?.dowHourStats??[]).map(e=>({hour:`${String(e.hour).padStart(2,`0`)}h`,weekday:bt[e.dow-1]??`周${e.dow}`,count:e.count})),[i]),v=i?.summary,y=i?.prevSummary,b=mt(v),x=st(v,y),S=H(()=>v?[{name:`成功`,value:v.successCount},{name:`失败`,value:v.failCount}]:[],[v]),C=H(()=>de({data:a,xField:`date`,series:[{field:`successCount`,name:`成功`,color:e.success},{field:`failCount`,name:`失败`,color:e.danger}],palette:e,point:t<=7,pointSize:6,fillOpacity:.26,axis:{xLabel:jt},tooltip:{title:e=>`日期:${e}`,value:e=>`${e} 次`}}),[t,a,e]),w=H(()=>M({data:s,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.success}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,labelColor:e.success,categoryAxisWidth:96,tooltip:{title:c,value:e=>`${e} 次`}}),[e,s,c]),T=H(()=>M({data:l,xField:`name`,series:[{field:`count`,name:`失败次数`,color:e.risk}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,labelColor:e.risk,categoryAxisWidth:120,tooltip:{value:e=>`${e} 次`}}),[l,e]),ee=H(()=>M({data:u,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.active}],palette:e,barMaxWidth:18,axis:{xLabel:e=>e.replace(`:00`,`h`)},tooltip:{title:e=>`${e} - ${e.replace(`:00`,`:59`)}`,value:e=>`${e} 次`}}),[u,e]),te=H(()=>I({data:S,categoryField:`name`,valueField:`value`,palette:e,donut:!0,colors:[e.success,e.danger],outerRadius:.86,innerRadius:.58,padAngle:1.5,cornerRadius:5,label:`value`,labelPosition:`inside`,labelColor:`#fff`,labelFontSize:12,indicator:{title:b==null?`--`:`${b}%`,subtitle:`成功率`},indicatorTitleFontSize:28,tooltipKey:`次数`,valueUnit:`次`}),[e,S,b]),ne=H(()=>I({data:d,categoryField:`name`,valueField:`value`,palette:e,donut:!0,innerRadius:.48,outerRadius:.82,padAngle:1,cornerRadius:3,legendLabelFontSize:11,tooltipKey:`访问次数`,valueUnit:`次`}),[d,e]),E=H(()=>I({data:f,categoryField:`name`,valueField:`value`,palette:e,donut:!0,innerRadius:.48,outerRadius:.82,padAngle:1,cornerRadius:3,legendLabelFontSize:11,tooltipKey:`访问次数`,valueUnit:`次`}),[f,e]),D=H(()=>M({data:o,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.primary}],palette:e,showLabel:!0,tooltip:{value:e=>`${e} 次`}}),[o,e]),O=H(()=>I({data:p,categoryField:`name`,valueField:`value`,palette:e,donut:!0,innerRadius:.48,outerRadius:.82,padAngle:1,cornerRadius:3,legendLabelFontSize:11,tooltipKey:`失败次数`,valueUnit:`次`}),[p,e]),re=H(()=>M({data:m,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.active}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,labelColor:e.active,categoryAxisWidth:120,tooltip:{value:e=>`${e} 次`}}),[m,e]),ie=H(()=>M({data:h,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.dataColors[4]??e.primary}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,categoryAxisWidth:96,tooltip:{value:e=>`${e} 次`}}),[h,e]),ae=H(()=>M({data:g,xField:`name`,series:[{field:`count`,name:`登录次数`,color:e.dataColors[6]??e.primary}],palette:e,horizontal:!0,barMinHeight:3,cornerRadius:5,showLabel:!0,categoryAxisWidth:150,tooltip:{value:e=>`${e} 次`}}),[g,e]),oe=H(()=>we({data:_,xField:`hour`,yField:`weekday`,valueField:`count`,palette:e,tooltip:{title:e=>`${e?.weekday??``} ${e?.hour??``}`,valueName:`登录次数`,value:e=>`${e} 次`}}),[_,e]);return/* @__PURE__ */ G(_t,{days:t,onDaysChange:n,loading:r.isLoading,fetching:r.isFetching,children:[/* @__PURE__ */ G(xe,{style:{marginBottom:16},children:[/* @__PURE__ */ W(F,{title:`总登录次数`,value:v?v.total.toLocaleString():R,sub:`近 ${t} 天累计`,icon:/* @__PURE__ */ W(Le,{size:22}),accent:`var(--arc-antd-color-primary)`,delta:v&&y?vt(v.total,y.total):null,deltaLabel:`较上一周期`}),/* @__PURE__ */ W(F,{title:`登录成功率`,value:b==null?R:`${b}%`,sub:v?`成功 ${v.successCount.toLocaleString()} · 失败 ${v.failCount.toLocaleString()}`:void 0,icon:/* @__PURE__ */ W(Ne,{size:22}),accent:`var(--arc-antd-color-success)`,delta:x,deltaLabel:`较上一周期`,deltaFormat:`ratio`}),/* @__PURE__ */ W(F,{title:`登录失败次数`,value:v?v.failCount.toLocaleString():R,sub:`密码错误、账号锁定等`,icon:/* @__PURE__ */ W(Fe,{size:22}),accent:v&&v.failCount>0?`var(--arc-antd-color-danger)`:void 0,delta:v&&y?vt(v.failCount,y.failCount):null,deltaLabel:`较上一周期`})]}),/* @__PURE__ */ W(B,{title:`每日登录趋势(成功 / 失败)`,children:L(a)?/* @__PURE__ */ W(z,{height:230}):/* @__PURE__ */ W(ot,{...C,options:j,height:230})}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginTop:16,marginBottom:16},children:[/* @__PURE__ */ W(B,{title:`Top 10 登录用户`,children:s.length===0?/* @__PURE__ */ W(z,{}):/* @__PURE__ */ W(k,{...w,options:j,height:260})}),/* @__PURE__ */ W(B,{danger:l.length>0,title:/* @__PURE__ */ G(U,{children:[`失败登录 Top 10 IP`,l.length>0&&/* @__PURE__ */ W(`span`,{style:{fontSize:12,fontWeight:400,marginLeft:8,color:`var(--arc-antd-color-text-2)`},children:`可能存在安全风险`})]}),children:l.length===0?/* @__PURE__ */ W(z,{tone:`success`,text:`该时间段无失败登录`}):/* @__PURE__ */ W(k,{...T,options:j,height:260})})]}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginBottom:16},children:[/* @__PURE__ */ W(B,{title:`按小时登录分布`,children:L(u)?/* @__PURE__ */ W(z,{height:240}):/* @__PURE__ */ W(k,{...ee,options:j,height:240})}),/* @__PURE__ */ W(B,{title:`成功 / 失败占比`,children:L(S)?/* @__PURE__ */ W(z,{height:240}):/* @__PURE__ */ W(V,{...te,options:j,height:240})})]}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginBottom:16},children:[/* @__PURE__ */ W(B,{title:`浏览器分布`,children:d.length===0?/* @__PURE__ */ W(z,{height:260}):/* @__PURE__ */ W(V,{...ne,options:j,height:260})}),/* @__PURE__ */ W(B,{title:`操作系统分布`,children:f.length===0?/* @__PURE__ */ W(z,{height:260}):/* @__PURE__ */ W(V,{...E,options:j,height:260})})]}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginBottom:16},children:[/* @__PURE__ */ W(B,{danger:p.length>0,title:`失败原因分布`,children:p.length===0?/* @__PURE__ */ W(z,{tone:`success`,text:`该时间段无失败登录`,height:260}):/* @__PURE__ */ W(V,{...O,options:j,height:260})}),/* @__PURE__ */ W(B,{title:`登录地点 Top 10`,children:m.length===0?/* @__PURE__ */ W(z,{height:260}):/* @__PURE__ */ W(k,{...re,options:j,height:260})})]}),/* @__PURE__ */ W(B,{title:`星期 × 小时登录热力(近 ${t} 天)`,children:L(_)?/* @__PURE__ */ W(z,{height:280}):/* @__PURE__ */ W(on,{...oe,options:j,height:280})}),/* @__PURE__ */ G(`div`,{className:`chart-grid`,style:{marginTop:16,marginBottom:16},children:[/* @__PURE__ */ W(B,{title:`设备分辨率 Top 8`,children:h.length===0?/* @__PURE__ */ W(z,{height:240}):/* @__PURE__ */ W(k,{...ie,options:j,height:240})}),/* @__PURE__ */ W(B,{title:`设备 GPU Top 8`,children:g.length===0?/* @__PURE__ */ W(z,{height:240}):/* @__PURE__ */ W(k,{...ae,options:j,height:240})})]}),/* @__PURE__ */ W(B,{title:`按星期登录分布(近 ${t} 天)`,children:L(o)?/* @__PURE__ */ W(z,{height:220}):/* @__PURE__ */ W(k,{...D,options:j,height:220})})]})}function un(){return(un=e((()=>{Ie(),Me(),Pe(),wt(),p(),sn(),ct(),fe(),le(),_e(),Ct(),Ce(),xt(),Re()})))()}function dn(){let e=He(pt,`list`),t=e.active,s={username:``,eventType:void 0,status:void 0,timeRange:null},{page:c,pageSize:u,setPage:d,buildPagination:f,bind:p,bindKeyword:m,submittedParams:h,handleSearch:g,handleReset:_,applySearch:v}=Ot({defaults:s,listKey:Rt.lists});Mt([`status`,`startTime`,`endTime`],e=>{let t=At(e.startTime),n=At(e.endTime);v({...s,status:K(Ft,e.status),timeRange:t&&n?[t,n]:null})},{getNextParams:()=>({tab:`list`})});let y=Dt({username:h.username,eventType:K(Nt,h.eventType),status:K(Ft,h.status),...kt(h.timeRange)}),b=Bt({page:c,pageSize:u,...y},t===`list`),x=b.data?.list??[],S=b.data?.total??0,C=zt(),w=C.isPending,T=yt({clean:e=>C.mutateAsync({query:{days:e}}),onCleared:()=>d(1)});return/* @__PURE__ */ G(`div`,{className:`page-container page-container--stretch`,children:[/* @__PURE__ */ W(l,{defaultSize:260,minSize:200,maxSize:400,persistKey:`login-logs`,style:{flex:1,minHeight:0,overflow:`hidden`},showDetail:t!==null,onBack:e.back,onResponsiveChange:e.responsiveChange,master:/* @__PURE__ */ W(ze,{title:`日志模块`,rawBody:!0,children:/* @__PURE__ */ W(Ue,{sections:gt,active:t,onSelect:e.select})}),detail:/* @__PURE__ */ G(l.Body,{padding:16,scroll:t===`list`?`hidden`:`auto`,style:{display:`flex`,flexDirection:`column`},children:[t===`list`&&/* @__PURE__ */ W(Ke,{searchConfig:n({keyword:/* @__PURE__ */ W(r,{placeholder:`用户名 / 昵称`,...m(`username`),width:180}),filters:/* @__PURE__ */ G(U,{children:[/* @__PURE__ */ W(o,{placeholder:`全部事件`,items:Pt,...p(`eventType`)}),/* @__PURE__ */ W(a,{items:It,...p(`status`)}),/* @__PURE__ */ W(i,{searchLabel:`登录时间`,...p(`timeRange`)})]}),onSearch:g,onReset:_,actions:/* @__PURE__ */ G(U,{children:[/* @__PURE__ */ W(Je,{entity:`system.login-logs`,query:y}),/* @__PURE__ */ W(ht,{loading:w,onClear:T.openClearModal})]}),filterTitle:`登录日志筛选`,actionTitle:`日志操作`}),dataSource:x,loading:b.isFetching,onRefresh:()=>void b.refetch(),pagination:f(S)}),t===`stats`&&/* @__PURE__ */ W(ln,{})]})}),/* @__PURE__ */ W(St,{logName:`登录日志`,control:T})]})}function $(){return($=e((()=>{c(),Be(),Ve(),ft(),We(),t(),qe(),Ge(),ut(),dt(),un(),s()})))()}$();export{dn as default};
2
+ //# sourceMappingURL=LoginLogsPage-VmYC7i6q.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoginLogsPage-BzBUR4Oo.js","mappings":"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","names":["CellMark","BaseMark","createSymbol","attrs","symbolAttrs","g","groupAttrs","symbolType","isNil","Factory","registerShadowRoot","registerSymbol","registerSymbolDataLabel","heatmapPresetAnimation","preset","FadeInOutAnimation","BaseSeriesTooltipHelper","activeType","baseSeriesMark","BaseSeriesSpecTransformer","spec","HeatmapSeries","CartesianSeries","SeriesTypeEnum","HeatmapSeriesSpecTransformer","array","f","policy","HEATMAP_SERIES_DATA_RELATED_KEYS","shouldMarkDoMorph","textMark","datum","AttributeLevel","padding","normalizePadding","width","height","appearPreset","animationParams","getGroupAnimationParams","animationConfig","userAnimationConfig","axisHelper","HeatmapSeriesTooltipHelper","heatmapSeriesMark","registerTextMark","registerCellMark","registerHeatmapAnimation","registerCartesianBandAxis","registerCartesianLinearAxis","CartesianChartSpecTransformer","HeatmapChart","BaseChart","HeatmapChartSpecTransformer","registerMarkTooltipProcessor","registerHeatmapSeries","createChart","VChart","registerHeatmapChart","registerLabel","registers","shortGpuName","parts","gpu","s","LoginLogStatsPanel","palette","useChartPalette","days","setDays","useState","statsQuery","useLoginLogStats","stats","filledDailyStats","useMemo","dataMap","d","today","dayjs","date","weekdayChartData","weekdayBuckets","items","buildUserChartLabels","nameOf","fullOf","x","ipFailChartData","hourlyChartData","browserData","osData","failReasonData","locationChartData","resolutionChartData","gpuChartData","dowHourData","WEEKDAY_LABELS","summary","prevSummary","successRate","calcSuccessRate","successRateDelta","calcSuccessRateDelta","statusPieData","trendSpec","makeAreaSpec","shortDate","value","userBarSpec","makeBarSpec","userChartData","userChartTitleOf","ipFailBarSpec","hourlySpec","statusSpec","makePieSpec","browserSpec","osSpec","weekdaySpec","v","failReasonSpec","locationSpec","resolutionSpec","gpuSpec","dowHourSpec","makeHeatmapSpec","LogStatsScaffold","StatGrid","StatCard","EMPTY_PLACEHOLDER","LogIn","deltaOf","CheckCircle2","XCircle","ChartPanel","isEmptyValues","EmptyChart","AreaChart","chartOptions","BarChart","_Fragment","PieChart","LoginLogsPage","navigation","useSectionSelection","LOG_SECTION_KEYS","activeTab","defaultParams","useListSearch","loginLogKeys","useListDeepLink","startTime","parseDateTimeParam","params","endTime","applySearch","enumValueOf","LOGIN_STATUSES","filterQuery","useFilterQuery","submittedParams","LOGIN_EVENT_TYPES","formatDateTimeRangeForApi","listQuery","useLoginLogList","data","total","cleanLogsMutation","useCleanLoginLogs","clearLogsLoading","clearLogs","useClearLogs","setPage","MasterDetailLayout","NavListPanel","SectionNavigation","LOG_SECTIONS","LoginLogsTable","buildTableSearch","KeywordInput","bindKeyword","FilterSelect","LOGIN_EVENT_TYPE_OPTIONS","bind","StatusSelect","LOGIN_STATUS_OPTIONS","DateRangeFilter","handleSearch","handleReset","ExportButton","ClearLogsButtons","buildPagination","ClearLogsModal"],"ignoreList":[0,1,2,3,4,5,6,7,8,9],"sources":["../../../../node_modules/@visactor/vchart/esm/mark/cell.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/animation.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/tooltip-helper.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/constant.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/heatmap-transformer.js","../../../../node_modules/@visactor/vchart/esm/theme/builtin/common/series/heatmap.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/heatmap.js","../../../../node_modules/@visactor/vchart/esm/chart/heatmap/heatmap-transformer.js","../../../../node_modules/@visactor/vchart/esm/chart/heatmap/heatmap.js","../../../../node_modules/@visactor/react-vchart/esm/charts/HeatmapChart.js","../../src/pages/system/login-logs/LoginLogStatsPanel.tsx","../../src/pages/system/login-logs/LoginLogsPage.tsx"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,"import { useState, useMemo } from 'react';\nimport { LogIn, CheckCircle2, XCircle } from 'lucide-react';\nimport { AreaChart, BarChart, HeatmapChart, PieChart, EmptyChart, useChartPalette, chartOptions, makeAreaSpec, makeBarSpec, makeHeatmapSpec, makePieSpec, isEmptyValues, StatCard, StatGrid } from \"@/components/charts/index\";\nimport dayjs from 'dayjs';\nimport { useLoginLogStats } from \"@fudanda/react-core/hooks/queries/login-logs\";\nimport { buildUserChartLabels } from \"@fudanda/react-core/utils/user-labels\";\nimport { ChartPanel, LogStatsScaffold, WEEKDAY_LABELS, calcSuccessRate, calcSuccessRateDelta, deltaOf, weekdayBuckets } from \"@/components/logs/LogStatsScaffold\";\nimport { shortDate } from \"@fudanda/react-core/utils/date\";\nimport { EMPTY_PLACEHOLDER } from \"@/utils/table-columns\";\ninterface BarDatum {\n readonly name: string;\n readonly count: number;\n}\ninterface PieDatum {\n readonly name: string;\n readonly value: number;\n}\n/** GPU 名多为 \"ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 ...)\",提取括号内主体便于坐标轴展示 */\nfunction shortGpuName(gpu: string): string {\n const inner = /\\(([^)]+)\\)/.exec(gpu)?.[1] ?? gpu;\n const parts = inner.split(',').map((s) => s.trim());\n return (parts[1] || parts[0] || gpu).slice(0, 40);\n}\nexport default function LoginLogStatsPanel() {\n const palette = useChartPalette();\n const [days, setDays] = useState<number>(30);\n const statsQuery = useLoginLogStats({ days });\n const stats = statsQuery.data ?? null;\n const filledDailyStats = useMemo(() => {\n if (!stats)\n return [];\n const dataMap = new Map(stats.dailyStats.map((d) => [d.date, d]));\n const today = dayjs();\n return Array.from({ length: days }, (_, i) => {\n const date = today.subtract(days - 1 - i, 'day').format('YYYY-MM-DD');\n return dataMap.get(date) ?? { date, count: 0, successCount: 0, failCount: 0 };\n });\n }, [stats, days]);\n const weekdayChartData = useMemo<BarDatum[]>(() => weekdayBuckets(stats?.dailyStats), [stats]);\n const { userChartData, userChartTitleOf } = useMemo(() => {\n const items = [...(stats?.userStats ?? [])].reverse();\n const { nameOf, fullOf } = buildUserChartLabels(items);\n return {\n userChartData: items.map((d) => ({ name: nameOf(d), count: d.count })),\n userChartTitleOf: (x: string) => fullOf.get(x) ?? x,\n };\n }, [stats]);\n const ipFailChartData = useMemo<BarDatum[]>(() => [...(stats?.ipFailStats ?? [])].reverse().map((d) => ({ name: d.ip, count: d.count })), [stats]);\n const hourlyChartData = useMemo<BarDatum[]>(() => (stats?.hourlyStats ?? []).map((d) => ({ name: `${String(d.hour).padStart(2, '0')}:00`, count: d.count })), [stats]);\n const browserData = useMemo<PieDatum[]>(() => (stats?.browserStats ?? []).map((d) => ({ name: d.browser, value: d.count })), [stats]);\n const osData = useMemo<PieDatum[]>(() => (stats?.osStats ?? []).map((d) => ({ name: d.os, value: d.count })), [stats]);\n const failReasonData = useMemo<PieDatum[]>(() => (stats?.failReasonStats ?? []).map((d) => ({ name: d.message, value: d.count })), [stats]);\n const locationChartData = useMemo<BarDatum[]>(() => [...(stats?.locationStats ?? [])].reverse().map((d) => ({ name: d.location, count: d.count })), [stats]);\n const resolutionChartData = useMemo<BarDatum[]>(() => [...(stats?.resolutionStats ?? [])].reverse().map((d) => ({ name: d.resolution, count: d.count })), [stats]);\n const gpuChartData = useMemo<BarDatum[]>(() => [...(stats?.gpuStats ?? [])].reverse().map((d) => ({ name: shortGpuName(d.gpu), count: d.count })), [stats]);\n const dowHourData = useMemo(() => (stats?.dowHourStats ?? []).map((d) => ({\n hour: `${String(d.hour).padStart(2, '0')}h`,\n weekday: WEEKDAY_LABELS[d.dow - 1] ?? `周${d.dow}`,\n count: d.count,\n })), [stats]);\n const summary = stats?.summary;\n const prevSummary = stats?.prevSummary;\n const successRate = calcSuccessRate(summary);\n const successRateDelta = calcSuccessRateDelta(summary, prevSummary);\n const statusPieData = useMemo<PieDatum[]>(() => (summary\n ? [\n { name: '成功', value: summary.successCount },\n { name: '失败', value: summary.failCount },\n ]\n : []), [summary]);\n const trendSpec = useMemo(() => makeAreaSpec({\n data: filledDailyStats,\n xField: 'date',\n series: [\n { field: 'successCount', name: '成功', color: palette.success },\n { field: 'failCount', name: '失败', color: palette.danger },\n ],\n palette,\n point: days <= 7,\n pointSize: 6,\n fillOpacity: 0.26,\n axis: { xLabel: shortDate },\n tooltip: {\n title: (value) => `日期:${value}`,\n value: (value) => `${value} 次`,\n },\n }), [days, filledDailyStats, palette]);\n const userBarSpec = useMemo(() => makeBarSpec({\n data: userChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.success }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n labelColor: palette.success,\n categoryAxisWidth: 96,\n tooltip: { title: userChartTitleOf, value: (value) => `${value} 次` },\n }), [palette, userChartData, userChartTitleOf]);\n const ipFailBarSpec = useMemo(() => makeBarSpec({\n data: ipFailChartData,\n xField: 'name',\n series: [{ field: 'count', name: '失败次数', color: palette.risk }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n labelColor: palette.risk,\n categoryAxisWidth: 120,\n tooltip: { value: (value) => `${value} 次` },\n }), [ipFailChartData, palette]);\n const hourlySpec = useMemo(() => makeBarSpec({\n data: hourlyChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.active }],\n palette,\n barMaxWidth: 18,\n axis: { xLabel: (value) => value.replace(':00', 'h') },\n tooltip: {\n title: (value) => `${value} - ${value.replace(':00', ':59')}`,\n value: (value) => `${value} 次`,\n },\n }), [hourlyChartData, palette]);\n const statusSpec = useMemo(() => makePieSpec({\n data: statusPieData,\n categoryField: 'name',\n valueField: 'value',\n palette,\n donut: true,\n colors: [palette.success, palette.danger],\n outerRadius: 0.86,\n innerRadius: 0.58,\n padAngle: 1.5,\n cornerRadius: 5,\n label: 'value',\n labelPosition: 'inside',\n labelColor: '#fff',\n labelFontSize: 12,\n indicator: { title: successRate == null ? '--' : `${successRate}%`, subtitle: '成功率' },\n indicatorTitleFontSize: 28,\n tooltipKey: '次数',\n valueUnit: '次',\n }), [palette, statusPieData, successRate]);\n const browserSpec = useMemo(() => makePieSpec({\n data: browserData,\n categoryField: 'name',\n valueField: 'value',\n palette,\n donut: true,\n innerRadius: 0.48,\n outerRadius: 0.82,\n padAngle: 1,\n cornerRadius: 3,\n legendLabelFontSize: 11,\n tooltipKey: '访问次数',\n valueUnit: '次',\n }), [browserData, palette]);\n const osSpec = useMemo(() => makePieSpec({\n data: osData,\n categoryField: 'name',\n valueField: 'value',\n palette,\n donut: true,\n innerRadius: 0.48,\n outerRadius: 0.82,\n padAngle: 1,\n cornerRadius: 3,\n legendLabelFontSize: 11,\n tooltipKey: '访问次数',\n valueUnit: '次',\n }), [osData, palette]);\n const weekdaySpec = useMemo(() => makeBarSpec({\n data: weekdayChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.primary }],\n palette,\n showLabel: true,\n tooltip: { value: (v) => `${v} 次` },\n }), [weekdayChartData, palette]);\n const failReasonSpec = useMemo(() => makePieSpec({\n data: failReasonData,\n categoryField: 'name',\n valueField: 'value',\n palette,\n donut: true,\n innerRadius: 0.48,\n outerRadius: 0.82,\n padAngle: 1,\n cornerRadius: 3,\n legendLabelFontSize: 11,\n tooltipKey: '失败次数',\n valueUnit: '次',\n }), [failReasonData, palette]);\n const locationSpec = useMemo(() => makeBarSpec({\n data: locationChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.active }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n labelColor: palette.active,\n categoryAxisWidth: 120,\n tooltip: { value: (v) => `${v} 次` },\n }), [locationChartData, palette]);\n const resolutionSpec = useMemo(() => makeBarSpec({\n data: resolutionChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.dataColors[4] ?? palette.primary }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n categoryAxisWidth: 96,\n tooltip: { value: (v) => `${v} 次` },\n }), [resolutionChartData, palette]);\n const gpuSpec = useMemo(() => makeBarSpec({\n data: gpuChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.dataColors[6] ?? palette.primary }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n categoryAxisWidth: 150,\n tooltip: { value: (v) => `${v} 次` },\n }), [gpuChartData, palette]);\n const dowHourSpec = useMemo(() => makeHeatmapSpec({\n data: dowHourData,\n xField: 'hour',\n yField: 'weekday',\n valueField: 'count',\n palette,\n tooltip: {\n title: (d) => `${(d as {\n weekday?: string;\n })?.weekday ?? ''} ${(d as {\n hour?: string;\n })?.hour ?? ''}`,\n valueName: '登录次数',\n value: (v) => `${v} 次`,\n },\n }), [dowHourData, palette]);\n return (<LogStatsScaffold days={days} onDaysChange={setDays} loading={statsQuery.isLoading} fetching={statsQuery.isFetching}>\n <StatGrid style={{ marginBottom: 16 }}>\n <StatCard title=\"总登录次数\" value={summary ? summary.total.toLocaleString() : EMPTY_PLACEHOLDER} sub={`近 ${days} 天累计`} icon={<LogIn size={22}/>} accent=\"var(--arc-antd-color-primary)\" delta={summary && prevSummary ? deltaOf(summary.total, prevSummary.total) : null} deltaLabel=\"较上一周期\"/>\n <StatCard title=\"登录成功率\" value={successRate == null ? EMPTY_PLACEHOLDER : `${successRate}%`} sub={summary ? `成功 ${summary.successCount.toLocaleString()} · 失败 ${summary.failCount.toLocaleString()}` : undefined} icon={<CheckCircle2 size={22}/>} accent=\"var(--arc-antd-color-success)\" delta={successRateDelta} deltaLabel=\"较上一周期\" deltaFormat=\"ratio\"/>\n <StatCard title=\"登录失败次数\" value={summary ? summary.failCount.toLocaleString() : EMPTY_PLACEHOLDER} sub=\"密码错误、账号锁定等\" icon={<XCircle size={22}/>} accent={summary && summary.failCount > 0 ? 'var(--arc-antd-color-danger)' : undefined} delta={summary && prevSummary ? deltaOf(summary.failCount, prevSummary.failCount) : null} deltaLabel=\"较上一周期\"/>\n </StatGrid>\n\n <ChartPanel title=\"每日登录趋势(成功 / 失败)\">\n {isEmptyValues(filledDailyStats) ? <EmptyChart height={230}/> : (<AreaChart {...trendSpec} options={chartOptions} height={230}/>)}\n </ChartPanel>\n\n <div className=\"chart-grid\" style={{ marginTop: 16, marginBottom: 16 }}>\n <ChartPanel title=\"Top 10 登录用户\">\n {userChartData.length === 0 ? <EmptyChart /> : (<BarChart {...userBarSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n <ChartPanel danger={ipFailChartData.length > 0} title={(<>\n 失败登录 Top 10 IP\n {ipFailChartData.length > 0 && <span style={{ fontSize: 12, fontWeight: 400, marginLeft: 8, color: 'var(--arc-antd-color-text-2)' }}>可能存在安全风险</span>}\n </>)}>\n {ipFailChartData.length === 0 ? <EmptyChart tone=\"success\" text=\"该时间段无失败登录\"/> : (<BarChart {...ipFailBarSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n </div>\n\n <div className=\"chart-grid\" style={{ marginBottom: 16 }}>\n <ChartPanel title=\"按小时登录分布\">\n {isEmptyValues(hourlyChartData) ? <EmptyChart height={240}/> : (<BarChart {...hourlySpec} options={chartOptions} height={240}/>)}\n </ChartPanel>\n <ChartPanel title=\"成功 / 失败占比\">\n {isEmptyValues(statusPieData) ? <EmptyChart height={240}/> : (<PieChart {...statusSpec} options={chartOptions} height={240}/>)}\n </ChartPanel>\n </div>\n\n <div className=\"chart-grid\" style={{ marginBottom: 16 }}>\n <ChartPanel title=\"浏览器分布\">\n {browserData.length === 0 ? <EmptyChart height={260}/> : (<PieChart {...browserSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n <ChartPanel title=\"操作系统分布\">\n {osData.length === 0 ? <EmptyChart height={260}/> : (<PieChart {...osSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n </div>\n\n <div className=\"chart-grid\" style={{ marginBottom: 16 }}>\n <ChartPanel danger={failReasonData.length > 0} title=\"失败原因分布\">\n {failReasonData.length === 0 ? <EmptyChart tone=\"success\" text=\"该时间段无失败登录\" height={260}/> : (<PieChart {...failReasonSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n <ChartPanel title=\"登录地点 Top 10\">\n {locationChartData.length === 0 ? <EmptyChart height={260}/> : (<BarChart {...locationSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n </div>\n\n <ChartPanel title={`星期 × 小时登录热力(近 ${days} 天)`}>\n {isEmptyValues(dowHourData) ? <EmptyChart height={280}/> : (<HeatmapChart {...dowHourSpec} options={chartOptions} height={280}/>)}\n </ChartPanel>\n\n <div className=\"chart-grid\" style={{ marginTop: 16, marginBottom: 16 }}>\n <ChartPanel title=\"设备分辨率 Top 8\">\n {resolutionChartData.length === 0 ? <EmptyChart height={240}/> : (<BarChart {...resolutionSpec} options={chartOptions} height={240}/>)}\n </ChartPanel>\n <ChartPanel title=\"设备 GPU Top 8\">\n {gpuChartData.length === 0 ? <EmptyChart height={240}/> : (<BarChart {...gpuSpec} options={chartOptions} height={240}/>)}\n </ChartPanel>\n </div>\n\n <ChartPanel title={`按星期登录分布(近 ${days} 天)`}>\n {isEmptyValues(weekdayChartData) ? <EmptyChart height={220}/> : (<BarChart {...weekdaySpec} options={chartOptions} height={220}/>)}\n </ChartPanel>\n </LogStatsScaffold>);\n}\n","import { MasterDetailLayout } from '@/components/MasterDetailLayout';\nimport { NavListPanel } from '@/components/NavListPanel';\nimport { SectionNavigation } from '@/components/SectionNavigation';\nimport { LOG_SECTIONS, LOG_SECTION_KEYS } from '@/components/logs/log-sections';\nimport { useSectionSelection } from '@/hooks/useSectionSelection';\nimport { buildTableSearch } from \"@/components/list-page/index\";\nimport ExportButton from \"@/components/ExportButton\";\nimport { LoginLogsTable } from \"@/components/logs/LoginLogsTable\";\nimport { ClearLogsButtons, ClearLogsModal } from \"@/components/logs/ClearLogsControl\";\nimport { useClearLogs } from \"@/hooks/useClearLogs\";\nimport { formatDateTimeRangeForApi, parseDateTimeParam } from \"@fudanda/react-core/utils/date\";\nimport LoginLogStatsPanel from \"@/pages/system/login-logs/LoginLogStatsPanel\";\nimport { loginLogKeys, useCleanLoginLogs, useLoginLogList } from \"@fudanda/react-core/hooks/queries/login-logs\";\nimport { enumValueOf } from '@fudanda/shared/core';\nimport { LOGIN_EVENT_TYPE_OPTIONS, LOGIN_EVENT_TYPES, LOGIN_STATUS_OPTIONS, LOGIN_STATUSES } from '@fudanda/shared/identity';\nimport { useListSearch } from \"@fudanda/react-core/hooks/useListSearch\";\nimport { DateRangeFilter, FilterSelect, KeywordInput, StatusSelect } from \"@/components/search-filters\";\nimport { useFilterQuery } from \"@fudanda/react-core/hooks/useFilterQuery\";\nimport { useListDeepLink } from \"@fudanda/react-core/hooks/useListDeepLink\";\nexport default function LoginLogsPage() {\n const navigation = useSectionSelection(LOG_SECTION_KEYS, 'list');\n const activeTab = navigation.active;\n interface SearchParams {\n username: string;\n eventType?: string;\n status?: string;\n timeRange: [\n Date,\n Date\n ] | null;\n }\n const defaultParams: SearchParams = { username: '', eventType: undefined, status: undefined, timeRange: null };\n const { page, pageSize, setPage, buildPagination, bind, bindKeyword, submittedParams, handleSearch, handleReset, applySearch, } = useListSearch<SearchParams>({ defaults: defaultParams, listKey: loginLogKeys.lists });\n // 首页登录趋势图表下钻(?status=…&startTime=…&endTime=…):按某天与状态预置筛选,消费后即从地址栏移除;\n // 同时在同一次导航里把页签切回列表——深链要看的是记录,停在上次离开的「统计分析」页签会看不到结果\n useListDeepLink(['status', 'startTime', 'endTime'], (params) => {\n const startTime = parseDateTimeParam(params.startTime);\n const endTime = parseDateTimeParam(params.endTime);\n applySearch({\n ...defaultParams,\n status: enumValueOf(LOGIN_STATUSES, params.status),\n timeRange: startTime && endTime ? [startTime, endTime] : null,\n });\n }, { getNextParams: () => ({ tab: 'list' }) });\n // 已提交筛选 → 契约查询参数:列表与导出共用同一份映射\n const filterQuery = useFilterQuery({\n username: submittedParams.username,\n eventType: enumValueOf(LOGIN_EVENT_TYPES, submittedParams.eventType),\n status: enumValueOf(LOGIN_STATUSES, submittedParams.status),\n ...formatDateTimeRangeForApi(submittedParams.timeRange),\n });\n const listQuery = useLoginLogList({ page, pageSize, ...filterQuery }, activeTab === 'list');\n const data = listQuery.data?.list ?? [];\n const total = listQuery.data?.total ?? 0;\n const cleanLogsMutation = useCleanLoginLogs();\n const clearLogsLoading = cleanLogsMutation.isPending;\n const clearLogs = useClearLogs({\n clean: (days) => cleanLogsMutation.mutateAsync({ query: { days } }),\n onCleared: () => setPage(1),\n });\n return (<div className=\"page-container page-container--stretch\">\n <MasterDetailLayout defaultSize={260} minSize={200} maxSize={400} persistKey=\"login-logs\"\n style={{ flex: 1, minHeight: 0, overflow: 'hidden' }} showDetail={activeTab !== null}\n onBack={navigation.back} onResponsiveChange={navigation.responsiveChange}\n master={<NavListPanel title=\"日志模块\" rawBody>\n <SectionNavigation sections={LOG_SECTIONS} active={activeTab} onSelect={navigation.select} />\n </NavListPanel>}\n detail={<MasterDetailLayout.Body padding={16} scroll={activeTab === 'list' ? 'hidden' : 'auto'} style={{ display: 'flex', flexDirection: 'column' }}>\n {activeTab === 'list' && (\n <LoginLogsTable searchConfig={buildTableSearch({\n keyword: (<KeywordInput placeholder=\"用户名 / 昵称\" {...bindKeyword('username')} width={180}/>),\n filters: ((<>\n <FilterSelect placeholder=\"全部事件\" items={LOGIN_EVENT_TYPE_OPTIONS} {...bind('eventType')}/>\n <StatusSelect items={LOGIN_STATUS_OPTIONS} {...bind('status')}/>\n <DateRangeFilter searchLabel=\"登录时间\" {...bind('timeRange')}/>\n </>)),\n onSearch: (handleSearch),\n onReset: (handleReset),\n actions: ((<>\n <ExportButton entity=\"system.login-logs\" query={filterQuery}/>\n <ClearLogsButtons loading={clearLogsLoading} onClear={clearLogs.openClearModal}/>\n </>)),\n filterTitle: \"登录日志筛选\",\n actionTitle: \"日志操作\"\n })} dataSource={data} loading={listQuery.isFetching} onRefresh={() => void listQuery.refetch()} pagination={buildPagination(total)}/>\n )}\n {activeTab === 'stats' && <LoginLogStatsPanel />}\n </MasterDetailLayout.Body>} />\n <ClearLogsModal logName=\"登录日志\" control={clearLogs}/>\n </div>);\n}\n"]}
1
+ {"version":3,"file":"LoginLogsPage-VmYC7i6q.js","mappings":"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","names":["CellMark","BaseMark","createSymbol","attrs","symbolAttrs","g","groupAttrs","symbolType","isNil","Factory","registerShadowRoot","registerSymbol","registerSymbolDataLabel","heatmapPresetAnimation","preset","FadeInOutAnimation","BaseSeriesTooltipHelper","activeType","baseSeriesMark","BaseSeriesSpecTransformer","spec","HeatmapSeries","CartesianSeries","SeriesTypeEnum","HeatmapSeriesSpecTransformer","array","f","policy","HEATMAP_SERIES_DATA_RELATED_KEYS","shouldMarkDoMorph","textMark","datum","AttributeLevel","padding","normalizePadding","width","height","appearPreset","animationParams","getGroupAnimationParams","animationConfig","userAnimationConfig","axisHelper","HeatmapSeriesTooltipHelper","heatmapSeriesMark","registerTextMark","registerCellMark","registerHeatmapAnimation","registerCartesianBandAxis","registerCartesianLinearAxis","CartesianChartSpecTransformer","HeatmapChart","BaseChart","HeatmapChartSpecTransformer","registerMarkTooltipProcessor","registerHeatmapSeries","createChart","VChart","registerHeatmapChart","registerLabel","registers","shortGpuName","parts","gpu","s","LoginLogStatsPanel","palette","useChartPalette","days","setDays","useState","statsQuery","useLoginLogStats","stats","filledDailyStats","useMemo","dataMap","d","today","dayjs","date","weekdayChartData","weekdayBuckets","items","buildUserChartLabels","nameOf","fullOf","x","ipFailChartData","hourlyChartData","browserData","osData","failReasonData","locationChartData","resolutionChartData","gpuChartData","dowHourData","WEEKDAY_LABELS","summary","prevSummary","successRate","calcSuccessRate","successRateDelta","calcSuccessRateDelta","statusPieData","trendSpec","makeAreaSpec","shortDate","value","userBarSpec","makeBarSpec","userChartData","userChartTitleOf","ipFailBarSpec","hourlySpec","statusSpec","makePieSpec","browserSpec","osSpec","weekdaySpec","v","failReasonSpec","locationSpec","resolutionSpec","gpuSpec","dowHourSpec","makeHeatmapSpec","LogStatsScaffold","StatGrid","StatCard","EMPTY_PLACEHOLDER","LogIn","deltaOf","CheckCircle2","XCircle","ChartPanel","isEmptyValues","EmptyChart","AreaChart","chartOptions","BarChart","_Fragment","PieChart","LoginLogsPage","navigation","useSectionSelection","LOG_SECTION_KEYS","activeTab","defaultParams","useListSearch","loginLogKeys","useListDeepLink","startTime","parseDateTimeParam","params","endTime","applySearch","enumValueOf","LOGIN_STATUSES","filterQuery","useFilterQuery","submittedParams","LOGIN_EVENT_TYPES","formatDateTimeRangeForApi","listQuery","useLoginLogList","data","total","cleanLogsMutation","useCleanLoginLogs","clearLogsLoading","clearLogs","useClearLogs","setPage","MasterDetailLayout","NavListPanel","SectionNavigation","LOG_SECTIONS","LoginLogsTable","buildTableSearch","KeywordInput","bindKeyword","FilterSelect","LOGIN_EVENT_TYPE_OPTIONS","bind","StatusSelect","LOGIN_STATUS_OPTIONS","DateRangeFilter","handleSearch","handleReset","ExportButton","ClearLogsButtons","buildPagination","ClearLogsModal"],"ignoreList":[0,1,2,3,4,5,6,7,8,9],"sources":["../../../../node_modules/@visactor/vchart/esm/mark/cell.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/animation.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/tooltip-helper.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/constant.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/heatmap-transformer.js","../../../../node_modules/@visactor/vchart/esm/theme/builtin/common/series/heatmap.js","../../../../node_modules/@visactor/vchart/esm/series/heatmap/heatmap.js","../../../../node_modules/@visactor/vchart/esm/chart/heatmap/heatmap-transformer.js","../../../../node_modules/@visactor/vchart/esm/chart/heatmap/heatmap.js","../../../../node_modules/@visactor/react-vchart/esm/charts/HeatmapChart.js","../../src/pages/system/login-logs/LoginLogStatsPanel.tsx","../../src/pages/system/login-logs/LoginLogsPage.tsx"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,"import { useState, useMemo } from 'react';\nimport { LogIn, CheckCircle2, XCircle } from 'lucide-react';\nimport { AreaChart, BarChart, HeatmapChart, PieChart, EmptyChart, useChartPalette, chartOptions, makeAreaSpec, makeBarSpec, makeHeatmapSpec, makePieSpec, isEmptyValues, StatCard, StatGrid } from \"@/components/charts/index\";\nimport dayjs from 'dayjs';\nimport { useLoginLogStats } from \"@fudanda/react-core/hooks/queries/login-logs\";\nimport { buildUserChartLabels } from \"@fudanda/react-core/utils/user-labels\";\nimport { ChartPanel, LogStatsScaffold, WEEKDAY_LABELS, calcSuccessRate, calcSuccessRateDelta, deltaOf, weekdayBuckets } from \"@/components/logs/LogStatsScaffold\";\nimport { shortDate } from \"@fudanda/react-core/utils/date\";\nimport { EMPTY_PLACEHOLDER } from \"@/utils/table-columns\";\ninterface BarDatum {\n readonly name: string;\n readonly count: number;\n}\ninterface PieDatum {\n readonly name: string;\n readonly value: number;\n}\n/** GPU 名多为 \"ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 ...)\",提取括号内主体便于坐标轴展示 */\nfunction shortGpuName(gpu: string): string {\n const inner = /\\(([^)]+)\\)/.exec(gpu)?.[1] ?? gpu;\n const parts = inner.split(',').map((s) => s.trim());\n return (parts[1] || parts[0] || gpu).slice(0, 40);\n}\nexport default function LoginLogStatsPanel() {\n const palette = useChartPalette();\n const [days, setDays] = useState<number>(30);\n const statsQuery = useLoginLogStats({ days });\n const stats = statsQuery.data ?? null;\n const filledDailyStats = useMemo(() => {\n if (!stats)\n return [];\n const dataMap = new Map(stats.dailyStats.map((d) => [d.date, d]));\n const today = dayjs();\n return Array.from({ length: days }, (_, i) => {\n const date = today.subtract(days - 1 - i, 'day').format('YYYY-MM-DD');\n return dataMap.get(date) ?? { date, count: 0, successCount: 0, failCount: 0 };\n });\n }, [stats, days]);\n const weekdayChartData = useMemo<BarDatum[]>(() => weekdayBuckets(stats?.dailyStats), [stats]);\n const { userChartData, userChartTitleOf } = useMemo(() => {\n const items = [...(stats?.userStats ?? [])].reverse();\n const { nameOf, fullOf } = buildUserChartLabels(items);\n return {\n userChartData: items.map((d) => ({ name: nameOf(d), count: d.count })),\n userChartTitleOf: (x: string) => fullOf.get(x) ?? x,\n };\n }, [stats]);\n const ipFailChartData = useMemo<BarDatum[]>(() => [...(stats?.ipFailStats ?? [])].reverse().map((d) => ({ name: d.ip, count: d.count })), [stats]);\n const hourlyChartData = useMemo<BarDatum[]>(() => (stats?.hourlyStats ?? []).map((d) => ({ name: `${String(d.hour).padStart(2, '0')}:00`, count: d.count })), [stats]);\n const browserData = useMemo<PieDatum[]>(() => (stats?.browserStats ?? []).map((d) => ({ name: d.browser, value: d.count })), [stats]);\n const osData = useMemo<PieDatum[]>(() => (stats?.osStats ?? []).map((d) => ({ name: d.os, value: d.count })), [stats]);\n const failReasonData = useMemo<PieDatum[]>(() => (stats?.failReasonStats ?? []).map((d) => ({ name: d.message, value: d.count })), [stats]);\n const locationChartData = useMemo<BarDatum[]>(() => [...(stats?.locationStats ?? [])].reverse().map((d) => ({ name: d.location, count: d.count })), [stats]);\n const resolutionChartData = useMemo<BarDatum[]>(() => [...(stats?.resolutionStats ?? [])].reverse().map((d) => ({ name: d.resolution, count: d.count })), [stats]);\n const gpuChartData = useMemo<BarDatum[]>(() => [...(stats?.gpuStats ?? [])].reverse().map((d) => ({ name: shortGpuName(d.gpu), count: d.count })), [stats]);\n const dowHourData = useMemo(() => (stats?.dowHourStats ?? []).map((d) => ({\n hour: `${String(d.hour).padStart(2, '0')}h`,\n weekday: WEEKDAY_LABELS[d.dow - 1] ?? `周${d.dow}`,\n count: d.count,\n })), [stats]);\n const summary = stats?.summary;\n const prevSummary = stats?.prevSummary;\n const successRate = calcSuccessRate(summary);\n const successRateDelta = calcSuccessRateDelta(summary, prevSummary);\n const statusPieData = useMemo<PieDatum[]>(() => (summary\n ? [\n { name: '成功', value: summary.successCount },\n { name: '失败', value: summary.failCount },\n ]\n : []), [summary]);\n const trendSpec = useMemo(() => makeAreaSpec({\n data: filledDailyStats,\n xField: 'date',\n series: [\n { field: 'successCount', name: '成功', color: palette.success },\n { field: 'failCount', name: '失败', color: palette.danger },\n ],\n palette,\n point: days <= 7,\n pointSize: 6,\n fillOpacity: 0.26,\n axis: { xLabel: shortDate },\n tooltip: {\n title: (value) => `日期:${value}`,\n value: (value) => `${value} 次`,\n },\n }), [days, filledDailyStats, palette]);\n const userBarSpec = useMemo(() => makeBarSpec({\n data: userChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.success }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n labelColor: palette.success,\n categoryAxisWidth: 96,\n tooltip: { title: userChartTitleOf, value: (value) => `${value} 次` },\n }), [palette, userChartData, userChartTitleOf]);\n const ipFailBarSpec = useMemo(() => makeBarSpec({\n data: ipFailChartData,\n xField: 'name',\n series: [{ field: 'count', name: '失败次数', color: palette.risk }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n labelColor: palette.risk,\n categoryAxisWidth: 120,\n tooltip: { value: (value) => `${value} 次` },\n }), [ipFailChartData, palette]);\n const hourlySpec = useMemo(() => makeBarSpec({\n data: hourlyChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.active }],\n palette,\n barMaxWidth: 18,\n axis: { xLabel: (value) => value.replace(':00', 'h') },\n tooltip: {\n title: (value) => `${value} - ${value.replace(':00', ':59')}`,\n value: (value) => `${value} 次`,\n },\n }), [hourlyChartData, palette]);\n const statusSpec = useMemo(() => makePieSpec({\n data: statusPieData,\n categoryField: 'name',\n valueField: 'value',\n palette,\n donut: true,\n colors: [palette.success, palette.danger],\n outerRadius: 0.86,\n innerRadius: 0.58,\n padAngle: 1.5,\n cornerRadius: 5,\n label: 'value',\n labelPosition: 'inside',\n labelColor: '#fff',\n labelFontSize: 12,\n indicator: { title: successRate == null ? '--' : `${successRate}%`, subtitle: '成功率' },\n indicatorTitleFontSize: 28,\n tooltipKey: '次数',\n valueUnit: '次',\n }), [palette, statusPieData, successRate]);\n const browserSpec = useMemo(() => makePieSpec({\n data: browserData,\n categoryField: 'name',\n valueField: 'value',\n palette,\n donut: true,\n innerRadius: 0.48,\n outerRadius: 0.82,\n padAngle: 1,\n cornerRadius: 3,\n legendLabelFontSize: 11,\n tooltipKey: '访问次数',\n valueUnit: '次',\n }), [browserData, palette]);\n const osSpec = useMemo(() => makePieSpec({\n data: osData,\n categoryField: 'name',\n valueField: 'value',\n palette,\n donut: true,\n innerRadius: 0.48,\n outerRadius: 0.82,\n padAngle: 1,\n cornerRadius: 3,\n legendLabelFontSize: 11,\n tooltipKey: '访问次数',\n valueUnit: '次',\n }), [osData, palette]);\n const weekdaySpec = useMemo(() => makeBarSpec({\n data: weekdayChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.primary }],\n palette,\n showLabel: true,\n tooltip: { value: (v) => `${v} 次` },\n }), [weekdayChartData, palette]);\n const failReasonSpec = useMemo(() => makePieSpec({\n data: failReasonData,\n categoryField: 'name',\n valueField: 'value',\n palette,\n donut: true,\n innerRadius: 0.48,\n outerRadius: 0.82,\n padAngle: 1,\n cornerRadius: 3,\n legendLabelFontSize: 11,\n tooltipKey: '失败次数',\n valueUnit: '次',\n }), [failReasonData, palette]);\n const locationSpec = useMemo(() => makeBarSpec({\n data: locationChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.active }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n labelColor: palette.active,\n categoryAxisWidth: 120,\n tooltip: { value: (v) => `${v} 次` },\n }), [locationChartData, palette]);\n const resolutionSpec = useMemo(() => makeBarSpec({\n data: resolutionChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.dataColors[4] ?? palette.primary }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n categoryAxisWidth: 96,\n tooltip: { value: (v) => `${v} 次` },\n }), [resolutionChartData, palette]);\n const gpuSpec = useMemo(() => makeBarSpec({\n data: gpuChartData,\n xField: 'name',\n series: [{ field: 'count', name: '登录次数', color: palette.dataColors[6] ?? palette.primary }],\n palette,\n horizontal: true,\n barMinHeight: 3,\n cornerRadius: 5,\n showLabel: true,\n categoryAxisWidth: 150,\n tooltip: { value: (v) => `${v} 次` },\n }), [gpuChartData, palette]);\n const dowHourSpec = useMemo(() => makeHeatmapSpec({\n data: dowHourData,\n xField: 'hour',\n yField: 'weekday',\n valueField: 'count',\n palette,\n tooltip: {\n title: (d) => `${(d as {\n weekday?: string;\n })?.weekday ?? ''} ${(d as {\n hour?: string;\n })?.hour ?? ''}`,\n valueName: '登录次数',\n value: (v) => `${v} 次`,\n },\n }), [dowHourData, palette]);\n return (<LogStatsScaffold days={days} onDaysChange={setDays} loading={statsQuery.isLoading} fetching={statsQuery.isFetching}>\n <StatGrid style={{ marginBottom: 16 }}>\n <StatCard title=\"总登录次数\" value={summary ? summary.total.toLocaleString() : EMPTY_PLACEHOLDER} sub={`近 ${days} 天累计`} icon={<LogIn size={22}/>} accent=\"var(--arc-antd-color-primary)\" delta={summary && prevSummary ? deltaOf(summary.total, prevSummary.total) : null} deltaLabel=\"较上一周期\"/>\n <StatCard title=\"登录成功率\" value={successRate == null ? EMPTY_PLACEHOLDER : `${successRate}%`} sub={summary ? `成功 ${summary.successCount.toLocaleString()} · 失败 ${summary.failCount.toLocaleString()}` : undefined} icon={<CheckCircle2 size={22}/>} accent=\"var(--arc-antd-color-success)\" delta={successRateDelta} deltaLabel=\"较上一周期\" deltaFormat=\"ratio\"/>\n <StatCard title=\"登录失败次数\" value={summary ? summary.failCount.toLocaleString() : EMPTY_PLACEHOLDER} sub=\"密码错误、账号锁定等\" icon={<XCircle size={22}/>} accent={summary && summary.failCount > 0 ? 'var(--arc-antd-color-danger)' : undefined} delta={summary && prevSummary ? deltaOf(summary.failCount, prevSummary.failCount) : null} deltaLabel=\"较上一周期\"/>\n </StatGrid>\n\n <ChartPanel title=\"每日登录趋势(成功 / 失败)\">\n {isEmptyValues(filledDailyStats) ? <EmptyChart height={230}/> : (<AreaChart {...trendSpec} options={chartOptions} height={230}/>)}\n </ChartPanel>\n\n <div className=\"chart-grid\" style={{ marginTop: 16, marginBottom: 16 }}>\n <ChartPanel title=\"Top 10 登录用户\">\n {userChartData.length === 0 ? <EmptyChart /> : (<BarChart {...userBarSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n <ChartPanel danger={ipFailChartData.length > 0} title={(<>\n 失败登录 Top 10 IP\n {ipFailChartData.length > 0 && <span style={{ fontSize: 12, fontWeight: 400, marginLeft: 8, color: 'var(--arc-antd-color-text-2)' }}>可能存在安全风险</span>}\n </>)}>\n {ipFailChartData.length === 0 ? <EmptyChart tone=\"success\" text=\"该时间段无失败登录\"/> : (<BarChart {...ipFailBarSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n </div>\n\n <div className=\"chart-grid\" style={{ marginBottom: 16 }}>\n <ChartPanel title=\"按小时登录分布\">\n {isEmptyValues(hourlyChartData) ? <EmptyChart height={240}/> : (<BarChart {...hourlySpec} options={chartOptions} height={240}/>)}\n </ChartPanel>\n <ChartPanel title=\"成功 / 失败占比\">\n {isEmptyValues(statusPieData) ? <EmptyChart height={240}/> : (<PieChart {...statusSpec} options={chartOptions} height={240}/>)}\n </ChartPanel>\n </div>\n\n <div className=\"chart-grid\" style={{ marginBottom: 16 }}>\n <ChartPanel title=\"浏览器分布\">\n {browserData.length === 0 ? <EmptyChart height={260}/> : (<PieChart {...browserSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n <ChartPanel title=\"操作系统分布\">\n {osData.length === 0 ? <EmptyChart height={260}/> : (<PieChart {...osSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n </div>\n\n <div className=\"chart-grid\" style={{ marginBottom: 16 }}>\n <ChartPanel danger={failReasonData.length > 0} title=\"失败原因分布\">\n {failReasonData.length === 0 ? <EmptyChart tone=\"success\" text=\"该时间段无失败登录\" height={260}/> : (<PieChart {...failReasonSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n <ChartPanel title=\"登录地点 Top 10\">\n {locationChartData.length === 0 ? <EmptyChart height={260}/> : (<BarChart {...locationSpec} options={chartOptions} height={260}/>)}\n </ChartPanel>\n </div>\n\n <ChartPanel title={`星期 × 小时登录热力(近 ${days} 天)`}>\n {isEmptyValues(dowHourData) ? <EmptyChart height={280}/> : (<HeatmapChart {...dowHourSpec} options={chartOptions} height={280}/>)}\n </ChartPanel>\n\n <div className=\"chart-grid\" style={{ marginTop: 16, marginBottom: 16 }}>\n <ChartPanel title=\"设备分辨率 Top 8\">\n {resolutionChartData.length === 0 ? <EmptyChart height={240}/> : (<BarChart {...resolutionSpec} options={chartOptions} height={240}/>)}\n </ChartPanel>\n <ChartPanel title=\"设备 GPU Top 8\">\n {gpuChartData.length === 0 ? <EmptyChart height={240}/> : (<BarChart {...gpuSpec} options={chartOptions} height={240}/>)}\n </ChartPanel>\n </div>\n\n <ChartPanel title={`按星期登录分布(近 ${days} 天)`}>\n {isEmptyValues(weekdayChartData) ? <EmptyChart height={220}/> : (<BarChart {...weekdaySpec} options={chartOptions} height={220}/>)}\n </ChartPanel>\n </LogStatsScaffold>);\n}\n","import { MasterDetailLayout } from '@/components/MasterDetailLayout';\nimport { NavListPanel } from '@/components/NavListPanel';\nimport { SectionNavigation } from '@/components/SectionNavigation';\nimport { LOG_SECTIONS, LOG_SECTION_KEYS } from '@/components/logs/log-sections';\nimport { useSectionSelection } from '@/hooks/useSectionSelection';\nimport { buildTableSearch } from \"@/components/list-page/index\";\nimport ExportButton from \"@/components/ExportButton\";\nimport { LoginLogsTable } from \"@/components/logs/LoginLogsTable\";\nimport { ClearLogsButtons, ClearLogsModal } from \"@/components/logs/ClearLogsControl\";\nimport { useClearLogs } from \"@/hooks/useClearLogs\";\nimport { formatDateTimeRangeForApi, parseDateTimeParam } from \"@fudanda/react-core/utils/date\";\nimport LoginLogStatsPanel from \"@/pages/system/login-logs/LoginLogStatsPanel\";\nimport { loginLogKeys, useCleanLoginLogs, useLoginLogList } from \"@fudanda/react-core/hooks/queries/login-logs\";\nimport { enumValueOf } from '@fudanda/shared/core';\nimport { LOGIN_EVENT_TYPE_OPTIONS, LOGIN_EVENT_TYPES, LOGIN_STATUS_OPTIONS, LOGIN_STATUSES } from '@fudanda/shared/identity';\nimport { useListSearch } from \"@fudanda/react-core/hooks/useListSearch\";\nimport { DateRangeFilter, FilterSelect, KeywordInput, StatusSelect } from \"@/components/search-filters\";\nimport { useFilterQuery } from \"@fudanda/react-core/hooks/useFilterQuery\";\nimport { useListDeepLink } from \"@fudanda/react-core/hooks/useListDeepLink\";\nexport default function LoginLogsPage() {\n const navigation = useSectionSelection(LOG_SECTION_KEYS, 'list');\n const activeTab = navigation.active;\n interface SearchParams {\n username: string;\n eventType?: string;\n status?: string;\n timeRange: [\n Date,\n Date\n ] | null;\n }\n const defaultParams: SearchParams = { username: '', eventType: undefined, status: undefined, timeRange: null };\n const { page, pageSize, setPage, buildPagination, bind, bindKeyword, submittedParams, handleSearch, handleReset, applySearch, } = useListSearch<SearchParams>({ defaults: defaultParams, listKey: loginLogKeys.lists });\n // 首页登录趋势图表下钻(?status=…&startTime=…&endTime=…):按某天与状态预置筛选,消费后即从地址栏移除;\n // 同时在同一次导航里把页签切回列表——深链要看的是记录,停在上次离开的「统计分析」页签会看不到结果\n useListDeepLink(['status', 'startTime', 'endTime'], (params) => {\n const startTime = parseDateTimeParam(params.startTime);\n const endTime = parseDateTimeParam(params.endTime);\n applySearch({\n ...defaultParams,\n status: enumValueOf(LOGIN_STATUSES, params.status),\n timeRange: startTime && endTime ? [startTime, endTime] : null,\n });\n }, { getNextParams: () => ({ tab: 'list' }) });\n // 已提交筛选 → 契约查询参数:列表与导出共用同一份映射\n const filterQuery = useFilterQuery({\n username: submittedParams.username,\n eventType: enumValueOf(LOGIN_EVENT_TYPES, submittedParams.eventType),\n status: enumValueOf(LOGIN_STATUSES, submittedParams.status),\n ...formatDateTimeRangeForApi(submittedParams.timeRange),\n });\n const listQuery = useLoginLogList({ page, pageSize, ...filterQuery }, activeTab === 'list');\n const data = listQuery.data?.list ?? [];\n const total = listQuery.data?.total ?? 0;\n const cleanLogsMutation = useCleanLoginLogs();\n const clearLogsLoading = cleanLogsMutation.isPending;\n const clearLogs = useClearLogs({\n clean: (days) => cleanLogsMutation.mutateAsync({ query: { days } }),\n onCleared: () => setPage(1),\n });\n return (<div className=\"page-container page-container--stretch\">\n <MasterDetailLayout defaultSize={260} minSize={200} maxSize={400} persistKey=\"login-logs\"\n style={{ flex: 1, minHeight: 0, overflow: 'hidden' }} showDetail={activeTab !== null}\n onBack={navigation.back} onResponsiveChange={navigation.responsiveChange}\n master={<NavListPanel title=\"日志模块\" rawBody>\n <SectionNavigation sections={LOG_SECTIONS} active={activeTab} onSelect={navigation.select} />\n </NavListPanel>}\n detail={<MasterDetailLayout.Body padding={16} scroll={activeTab === 'list' ? 'hidden' : 'auto'} style={{ display: 'flex', flexDirection: 'column' }}>\n {activeTab === 'list' && (\n <LoginLogsTable searchConfig={buildTableSearch({\n keyword: (<KeywordInput placeholder=\"用户名 / 昵称\" {...bindKeyword('username')} width={180}/>),\n filters: ((<>\n <FilterSelect placeholder=\"全部事件\" items={LOGIN_EVENT_TYPE_OPTIONS} {...bind('eventType')}/>\n <StatusSelect items={LOGIN_STATUS_OPTIONS} {...bind('status')}/>\n <DateRangeFilter searchLabel=\"登录时间\" {...bind('timeRange')}/>\n </>)),\n onSearch: (handleSearch),\n onReset: (handleReset),\n actions: ((<>\n <ExportButton entity=\"system.login-logs\" query={filterQuery}/>\n <ClearLogsButtons loading={clearLogsLoading} onClear={clearLogs.openClearModal}/>\n </>)),\n filterTitle: \"登录日志筛选\",\n actionTitle: \"日志操作\"\n })} dataSource={data} loading={listQuery.isFetching} onRefresh={() => void listQuery.refetch()} pagination={buildPagination(total)}/>\n )}\n {activeTab === 'stats' && <LoginLogStatsPanel />}\n </MasterDetailLayout.Body>} />\n <ClearLogsModal logName=\"登录日志\" control={clearLogs}/>\n </div>);\n}\n"]}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,O as n,_ as r,m as i}from"./clipboard-dpqHdCyy.js";import{i as a,r as o,s}from"./table-columns-CvT6OHd2.js";import{n as c,t as l}from"./ConfigurableTable-8sYmeul2.js";import{n as u,t as d}from"./AppModal-CLkMJ-96.js";import{n as f,t as p}from"./UserDisplay-BpkQ78cZ.js";import{useMemo as m,useState as h}from"react";import{Fragment as g,jsx as _,jsxs as v}from"react/jsx-runtime";import{formatDateTime as y}from"@fudanda/admin-antd/core/utils/date";import{LOGIN_EVENT_TYPE_LABELS as b}from"@fudanda/client/identity";import{formatUserLabel as x}from"@fudanda/admin-antd/core/utils/user-labels";function S({status:e,size:t}){return/* @__PURE__ */ _(n,{color:e===`success`?`green`:`red`,size:t,children:e===`success`?`成功`:`失败`})}function C({eventType:e,size:t}){let r=e??`login`;return/* @__PURE__ */ _(n,{color:T[r],size:t,children:b[r]})}function w({searchConfig:e,dataSource:t,loading:n,pagination:a,onRefresh:c,columnSettings:u,columnSettingsKey:f}){let[b,w]=h(null),T=m(()=>[{title:`ID`,dataIndex:`id`,width:80,defaultHidden:!0},{title:`用户`,dataIndex:`username`,width:160,render:(e,t)=>/* @__PURE__ */ _(p,{username:e,nickname:t.nickname})},{title:`事件`,dataIndex:`eventType`,width:110,render:e=>/* @__PURE__ */ _(C,{eventType:e})},{title:`事件信息`,dataIndex:`message`,minWidth:160,render:s},{title:`IP 地址`,dataIndex:`ip`,width:150,render:e=>e??`-`},{title:`地点`,dataIndex:`location`,width:180,defaultHidden:!0,render:s},{title:`浏览器`,dataIndex:`browser`,width:150,defaultHidden:!0,render:s},{title:`操作系统`,dataIndex:`os`,width:150,defaultHidden:!0,render:s},o(`操作时间`,`createdAt`),{title:`状态`,dataIndex:`status`,width:90,fixed:`right`,render:e=>/* @__PURE__ */ _(S,{status:e})},{title:`操作`,key:`operation`,width:80,fixed:`right`,render:(e,t)=>/* @__PURE__ */ _(i,{theme:`borderless`,type:`primary`,size:`small`,onClick:()=>w(t),children:`详情`})}],[]);return/* @__PURE__ */ v(g,{children:[/* @__PURE__ */ _(l,{searchConfig:e,bordered:!0,columns:T,dataSource:t,loading:n,pagination:a,rowKey:`id`,onRefresh:c,columnSettings:u,columnSettingsKey:f}),/* @__PURE__ */ _(d,{title:`登录日志详情`,visible:b!==null,onCancel:()=>w(null),footer:null,width:960,style:{top:40},children:b&&/* @__PURE__ */ _(r,{className:`login-log-details`,data:[{key:`ID`,value:String(b.id)},{key:`用户`,value:x(b.username,b.nickname)},{key:`事件`,value:/* @__PURE__ */ _(C,{eventType:b.eventType,size:`small`})},{key:`状态`,value:/* @__PURE__ */ _(S,{status:b.status,size:`small`})},{key:`IP 地址`,value:b.ip??`-`},{key:`地点`,value:`-`},{key:`浏览器`,value:b.browser??`-`},{key:`操作系统`,value:b.os??`-`},{key:`操作时间`,value:y(b.createdAt),span:`filled`},{key:`事件信息`,value:b.message??`-`,span:`filled`},{key:`User-Agent`,value:b.userAgent??`-`,span:`filled`}],column:{xs:1,sm:1,md:2},layout:`horizontal`,align:`left`})})]})}var T;function E(){return(E=e((()=>{t(),u(),c(),a(),f(),T={login:`cyan`,logout:`blue`,impersonate:`orange`,impersonate_end:`grey`,kicked:`red`}})))()}export{E as n,w as t};
2
- //# sourceMappingURL=LoginLogsTable-BweUEjQX.js.map
1
+ import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,O as n,_ as r,m as i}from"./clipboard-dpqHdCyy.js";import{i as a,r as o,s}from"./table-columns-CvT6OHd2.js";import{n as c,t as l}from"./ConfigurableTable-8sYmeul2.js";import{n as u,t as d}from"./AppModal-CEouaU03.js";import{n as f,t as p}from"./UserDisplay-BpkQ78cZ.js";import{useMemo as m,useState as h}from"react";import{Fragment as g,jsx as _,jsxs as v}from"react/jsx-runtime";import{formatDateTime as y}from"@fudanda/admin-antd/core/utils/date";import{LOGIN_EVENT_TYPE_LABELS as b}from"@fudanda/client/identity";import{formatUserLabel as x}from"@fudanda/admin-antd/core/utils/user-labels";function S({status:e,size:t}){return/* @__PURE__ */ _(n,{color:e===`success`?`green`:`red`,size:t,children:e===`success`?`成功`:`失败`})}function C({eventType:e,size:t}){let r=e??`login`;return/* @__PURE__ */ _(n,{color:T[r],size:t,children:b[r]})}function w({searchConfig:e,dataSource:t,loading:n,pagination:a,onRefresh:c,columnSettings:u,columnSettingsKey:f}){let[b,w]=h(null),T=m(()=>[{title:`ID`,dataIndex:`id`,width:80,defaultHidden:!0},{title:`用户`,dataIndex:`username`,width:160,render:(e,t)=>/* @__PURE__ */ _(p,{username:e,nickname:t.nickname})},{title:`事件`,dataIndex:`eventType`,width:110,render:e=>/* @__PURE__ */ _(C,{eventType:e})},{title:`事件信息`,dataIndex:`message`,minWidth:160,render:s},{title:`IP 地址`,dataIndex:`ip`,width:150,render:e=>e??`-`},{title:`地点`,dataIndex:`location`,width:180,defaultHidden:!0,render:s},{title:`浏览器`,dataIndex:`browser`,width:150,defaultHidden:!0,render:s},{title:`操作系统`,dataIndex:`os`,width:150,defaultHidden:!0,render:s},o(`操作时间`,`createdAt`),{title:`状态`,dataIndex:`status`,width:90,fixed:`right`,render:e=>/* @__PURE__ */ _(S,{status:e})},{title:`操作`,key:`operation`,width:80,fixed:`right`,render:(e,t)=>/* @__PURE__ */ _(i,{theme:`borderless`,type:`primary`,size:`small`,onClick:()=>w(t),children:`详情`})}],[]);return/* @__PURE__ */ v(g,{children:[/* @__PURE__ */ _(l,{searchConfig:e,bordered:!0,columns:T,dataSource:t,loading:n,pagination:a,rowKey:`id`,onRefresh:c,columnSettings:u,columnSettingsKey:f}),/* @__PURE__ */ _(d,{title:`登录日志详情`,visible:b!==null,onCancel:()=>w(null),footer:null,width:960,style:{top:40},children:b&&/* @__PURE__ */ _(r,{className:`login-log-details`,data:[{key:`ID`,value:String(b.id)},{key:`用户`,value:x(b.username,b.nickname)},{key:`事件`,value:/* @__PURE__ */ _(C,{eventType:b.eventType,size:`small`})},{key:`状态`,value:/* @__PURE__ */ _(S,{status:b.status,size:`small`})},{key:`IP 地址`,value:b.ip??`-`},{key:`地点`,value:`-`},{key:`浏览器`,value:b.browser??`-`},{key:`操作系统`,value:b.os??`-`},{key:`操作时间`,value:y(b.createdAt),span:`filled`},{key:`事件信息`,value:b.message??`-`,span:`filled`},{key:`User-Agent`,value:b.userAgent??`-`,span:`filled`}],column:{xs:1,sm:1,md:2},layout:`horizontal`,align:`left`})})]})}var T;function E(){return(E=e((()=>{t(),u(),c(),a(),f(),T={login:`cyan`,logout:`blue`,impersonate:`orange`,impersonate_end:`grey`,kicked:`red`}})))()}export{E as n,w as t};
2
+ //# sourceMappingURL=LoginLogsTable-CULcc_e8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoginLogsTable-BweUEjQX.js","mappings":"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","names":["LoginStatusTag","Tag","status","LoginEventTypeTag","normalized","eventType","LOGIN_EVENT_TYPE_COLORS","LOGIN_EVENT_TYPE_LABELS","LoginLogsTable","detailLog","setDetailLog","useState","columns","useMemo","UserDisplayCell","v","r","renderEllipsis","dateTimeColumn","Button","record","_Fragment","ConfigurableTable","AppModal","Descriptions","formatUserLabel","formatDateTime"],"ignoreList":[],"sources":["../../src/components/logs/LoginLogsTable.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { Button, Descriptions, Tag } from \"@/ui\";\nimport AppModal from \"@/components/AppModal\";\nimport type { ColumnProps, TableProps } from \"@/ui\";\nimport type { TagColor } from \"@/ui\";\nimport { LOGIN_EVENT_TYPE_LABELS, type LoginEventType, type LoginLog } from '@fudanda/shared/identity';\nimport ConfigurableTable from \"@/components/ConfigurableTable\";\nimport { formatDateTime } from \"@fudanda/react-core/utils/date\";\nimport { dateTimeColumn, renderEllipsis } from \"@/utils/table-columns\";\nimport { UserDisplayCell } from \"@/components/UserDisplay\";\nimport { formatUserLabel } from \"@fudanda/react-core/utils/user-labels\";\nimport '@/components/logs/LoginLogsTable.css';\ninterface LoginLogsTableProps {\n readonly searchConfig?: TableProps<LoginLog>['searchConfig'];\n readonly dataSource: LoginLog[];\n readonly loading?: boolean;\n readonly pagination?: TableProps<LoginLog>['pagination'];\n readonly onRefresh?: () => void;\n readonly columnSettings?: boolean;\n readonly columnSettingsKey?: string;\n}\nfunction LoginStatusTag({ status, size }: Readonly<{\n status: LoginLog['status'];\n size?: 'small' | 'default' | 'large';\n}>) {\n return (<Tag color={status === 'success' ? 'green' : 'red'} size={size}>\n {status === 'success' ? '成功' : '失败'}\n </Tag>);\n}\nconst LOGIN_EVENT_TYPE_COLORS: Record<LoginEventType, TagColor> = {\n login: 'cyan',\n logout: 'blue',\n impersonate: 'orange',\n impersonate_end: 'grey',\n kicked: 'red',\n};\nfunction LoginEventTypeTag({ eventType, size }: Readonly<{\n eventType?: LoginLog['eventType'];\n size?: 'small' | 'default' | 'large';\n}>) {\n const normalized: LoginEventType = eventType ?? 'login';\n return (<Tag color={LOGIN_EVENT_TYPE_COLORS[normalized]} size={size}>\n {LOGIN_EVENT_TYPE_LABELS[normalized]}\n </Tag>);\n}\nexport function LoginLogsTable({ searchConfig, dataSource, loading, pagination, onRefresh, columnSettings, columnSettingsKey, }: LoginLogsTableProps) {\n const [detailLog, setDetailLog] = useState<LoginLog | null>(null);\n const columns = useMemo<ColumnProps<LoginLog>[]>(() => [\n { title: 'ID', dataIndex: 'id', width: 80, defaultHidden: true },\n { title: '用户', dataIndex: 'username', width: 160, render: (v: string, r: LoginLog) => <UserDisplayCell username={v} nickname={r.nickname}/> },\n {\n title: '事件',\n dataIndex: 'eventType',\n width: 110,\n render: (eventType: LoginLog['eventType']) => <LoginEventTypeTag eventType={eventType}/>,\n },\n { title: '事件信息', dataIndex: 'message', minWidth: 160, render: renderEllipsis },\n { title: 'IP 地址', dataIndex: 'ip', width: 150, render: (v: string | null) => v ?? '-' },\n { title: '地点', dataIndex: 'location', width: 180, defaultHidden: true, render: renderEllipsis },\n { title: '浏览器', dataIndex: 'browser', width: 150, defaultHidden: true, render: renderEllipsis },\n { title: '操作系统', dataIndex: 'os', width: 150, defaultHidden: true, render: renderEllipsis },\n dateTimeColumn('操作时间', 'createdAt'),\n {\n title: '状态',\n dataIndex: 'status',\n width: 90,\n fixed: 'right' as const,\n render: (status: LoginLog['status']) => <LoginStatusTag status={status}/>,\n },\n {\n title: '操作',\n key: 'operation',\n width: 80,\n fixed: 'right' as const,\n render: (_: unknown, record: LoginLog) => (<Button theme=\"borderless\" type=\"primary\" size=\"small\" onClick={() => setDetailLog(record)}>\n 详情\n </Button>),\n },\n ], []);\n return (<>\n <ConfigurableTable<LoginLog> 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={() => setDetailLog(null)} footer={null} width={960} style={{ top: 40 }}>\n {detailLog && (<Descriptions className=\"login-log-details\" data={[\n { key: 'ID', value: String(detailLog.id) },\n { key: '用户', value: formatUserLabel(detailLog.username, detailLog.nickname) },\n { key: '事件', value: <LoginEventTypeTag eventType={detailLog.eventType} size=\"small\"/> },\n {\n key: '状态',\n value: <LoginStatusTag status={detailLog.status} size=\"small\"/>,\n },\n { key: 'IP 地址', value: detailLog.ip ?? '-' },\n { key: '地点', value: '-' },\n { key: '浏览器', value: detailLog.browser ?? '-' },\n { key: '操作系统', value: detailLog.os ?? '-' },\n { key: '操作时间', value: formatDateTime(detailLog.createdAt), span: 'filled' },\n { key: '事件信息', value: detailLog.message ?? '-', span: 'filled' },\n { key: 'User-Agent', value: detailLog.userAgent ?? '-', span: 'filled' },\n ]} column={{ xs: 1, sm: 1, md: 2 }} layout=\"horizontal\" align=\"left\"/>)}\n </AppModal>\n </>);\n}\nexport default LoginLogsTable;\n"]}
1
+ {"version":3,"file":"LoginLogsTable-CULcc_e8.js","mappings":"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","names":["LoginStatusTag","Tag","status","LoginEventTypeTag","normalized","eventType","LOGIN_EVENT_TYPE_COLORS","LOGIN_EVENT_TYPE_LABELS","LoginLogsTable","detailLog","setDetailLog","useState","columns","useMemo","UserDisplayCell","v","r","renderEllipsis","dateTimeColumn","Button","record","_Fragment","ConfigurableTable","AppModal","Descriptions","formatUserLabel","formatDateTime"],"ignoreList":[],"sources":["../../src/components/logs/LoginLogsTable.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { Button, Descriptions, Tag } from \"@/ui\";\nimport AppModal from \"@/components/AppModal\";\nimport type { ColumnProps, TableProps } from \"@/ui\";\nimport type { TagColor } from \"@/ui\";\nimport { LOGIN_EVENT_TYPE_LABELS, type LoginEventType, type LoginLog } from '@fudanda/shared/identity';\nimport ConfigurableTable from \"@/components/ConfigurableTable\";\nimport { formatDateTime } from \"@fudanda/react-core/utils/date\";\nimport { dateTimeColumn, renderEllipsis } from \"@/utils/table-columns\";\nimport { UserDisplayCell } from \"@/components/UserDisplay\";\nimport { formatUserLabel } from \"@fudanda/react-core/utils/user-labels\";\nimport '@/components/logs/LoginLogsTable.css';\ninterface LoginLogsTableProps {\n readonly searchConfig?: TableProps<LoginLog>['searchConfig'];\n readonly dataSource: LoginLog[];\n readonly loading?: boolean;\n readonly pagination?: TableProps<LoginLog>['pagination'];\n readonly onRefresh?: () => void;\n readonly columnSettings?: boolean;\n readonly columnSettingsKey?: string;\n}\nfunction LoginStatusTag({ status, size }: Readonly<{\n status: LoginLog['status'];\n size?: 'small' | 'default' | 'large';\n}>) {\n return (<Tag color={status === 'success' ? 'green' : 'red'} size={size}>\n {status === 'success' ? '成功' : '失败'}\n </Tag>);\n}\nconst LOGIN_EVENT_TYPE_COLORS: Record<LoginEventType, TagColor> = {\n login: 'cyan',\n logout: 'blue',\n impersonate: 'orange',\n impersonate_end: 'grey',\n kicked: 'red',\n};\nfunction LoginEventTypeTag({ eventType, size }: Readonly<{\n eventType?: LoginLog['eventType'];\n size?: 'small' | 'default' | 'large';\n}>) {\n const normalized: LoginEventType = eventType ?? 'login';\n return (<Tag color={LOGIN_EVENT_TYPE_COLORS[normalized]} size={size}>\n {LOGIN_EVENT_TYPE_LABELS[normalized]}\n </Tag>);\n}\nexport function LoginLogsTable({ searchConfig, dataSource, loading, pagination, onRefresh, columnSettings, columnSettingsKey, }: LoginLogsTableProps) {\n const [detailLog, setDetailLog] = useState<LoginLog | null>(null);\n const columns = useMemo<ColumnProps<LoginLog>[]>(() => [\n { title: 'ID', dataIndex: 'id', width: 80, defaultHidden: true },\n { title: '用户', dataIndex: 'username', width: 160, render: (v: string, r: LoginLog) => <UserDisplayCell username={v} nickname={r.nickname}/> },\n {\n title: '事件',\n dataIndex: 'eventType',\n width: 110,\n render: (eventType: LoginLog['eventType']) => <LoginEventTypeTag eventType={eventType}/>,\n },\n { title: '事件信息', dataIndex: 'message', minWidth: 160, render: renderEllipsis },\n { title: 'IP 地址', dataIndex: 'ip', width: 150, render: (v: string | null) => v ?? '-' },\n { title: '地点', dataIndex: 'location', width: 180, defaultHidden: true, render: renderEllipsis },\n { title: '浏览器', dataIndex: 'browser', width: 150, defaultHidden: true, render: renderEllipsis },\n { title: '操作系统', dataIndex: 'os', width: 150, defaultHidden: true, render: renderEllipsis },\n dateTimeColumn('操作时间', 'createdAt'),\n {\n title: '状态',\n dataIndex: 'status',\n width: 90,\n fixed: 'right' as const,\n render: (status: LoginLog['status']) => <LoginStatusTag status={status}/>,\n },\n {\n title: '操作',\n key: 'operation',\n width: 80,\n fixed: 'right' as const,\n render: (_: unknown, record: LoginLog) => (<Button theme=\"borderless\" type=\"primary\" size=\"small\" onClick={() => setDetailLog(record)}>\n 详情\n </Button>),\n },\n ], []);\n return (<>\n <ConfigurableTable<LoginLog> 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={() => setDetailLog(null)} footer={null} width={960} style={{ top: 40 }}>\n {detailLog && (<Descriptions className=\"login-log-details\" data={[\n { key: 'ID', value: String(detailLog.id) },\n { key: '用户', value: formatUserLabel(detailLog.username, detailLog.nickname) },\n { key: '事件', value: <LoginEventTypeTag eventType={detailLog.eventType} size=\"small\"/> },\n {\n key: '状态',\n value: <LoginStatusTag status={detailLog.status} size=\"small\"/>,\n },\n { key: 'IP 地址', value: detailLog.ip ?? '-' },\n { key: '地点', value: '-' },\n { key: '浏览器', value: detailLog.browser ?? '-' },\n { key: '操作系统', value: detailLog.os ?? '-' },\n { key: '操作时间', value: formatDateTime(detailLog.createdAt), span: 'filled' },\n { key: '事件信息', value: detailLog.message ?? '-', span: 'filled' },\n { key: 'User-Agent', value: detailLog.userAgent ?? '-', span: 'filled' },\n ]} column={{ xs: 1, sm: 1, md: 2 }} layout=\"horizontal\" align=\"left\"/>)}\n </AppModal>\n </>);\n}\nexport default LoginLogsTable;\n"]}