update 22
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/dto/ErrorLogDto.class
Normal file
BIN
build/classes/java/main/research/loghunter/dto/ErrorLogDto.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/dto/FileTreeDto.class
Normal file
BIN
build/classes/java/main/research/loghunter/dto/FileTreeDto.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/dto/PatternDto.class
Normal file
BIN
build/classes/java/main/research/loghunter/dto/PatternDto.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/dto/ServerDto.class
Normal file
BIN
build/classes/java/main/research/loghunter/dto/ServerDto.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/dto/SettingDto.class
Normal file
BIN
build/classes/java/main/research/loghunter/dto/SettingDto.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/entity/ErrorLog.class
Normal file
BIN
build/classes/java/main/research/loghunter/entity/ErrorLog.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/entity/Pattern.class
Normal file
BIN
build/classes/java/main/research/loghunter/entity/Pattern.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/entity/Server.class
Normal file
BIN
build/classes/java/main/research/loghunter/entity/Server.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/entity/Setting.class
Normal file
BIN
build/classes/java/main/research/loghunter/entity/Setting.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/classes/java/main/research/loghunter/util/CryptoUtil.class
Normal file
BIN
build/classes/java/main/research/loghunter/util/CryptoUtil.class
Normal file
Binary file not shown.
1
build/resolvedMainClassName
Normal file
1
build/resolvedMainClassName
Normal file
@@ -0,0 +1 @@
|
||||
research.loghunter.LogHunterApplication
|
||||
1
build/resources/main/application.properties
Normal file
1
build/resources/main/application.properties
Normal file
@@ -0,0 +1 @@
|
||||
spring.application.name=log-hunter
|
||||
34
build/resources/main/application.yml
Normal file
34
build/resources/main/application.yml
Normal file
@@ -0,0 +1,34 @@
|
||||
server:
|
||||
port: 8080
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: log-hunter
|
||||
|
||||
datasource:
|
||||
url: jdbc:sqlite:./data/loghunter.db
|
||||
driver-class-name: org.sqlite.JDBC
|
||||
|
||||
jpa:
|
||||
database-platform: org.hibernate.community.dialect.SQLiteDialect
|
||||
hibernate:
|
||||
ddl-auto: update
|
||||
show-sql: false
|
||||
properties:
|
||||
hibernate:
|
||||
format_sql: true
|
||||
|
||||
# 정적 리소스 캐시 비활성화
|
||||
web:
|
||||
resources:
|
||||
cache:
|
||||
cachecontrol:
|
||||
no-cache: true
|
||||
no-store: true
|
||||
|
||||
# 앱 설정
|
||||
app:
|
||||
crypto:
|
||||
key: ${LOGHUNTER_CRYPTO_KEY:LogHunterDefaultKey32Bytes!!}
|
||||
export:
|
||||
path: ./exports
|
||||
1
build/resources/main/static/assets/Badge-DzuJKoKk.js
Normal file
1
build/resources/main/static/assets/Badge-DzuJKoKk.js
Normal file
@@ -0,0 +1 @@
|
||||
import"./index-09HB4Lmg.js";import{_ as e,a as s,h as r,G as n,i as o,t as c,n as d}from"./index-BB0X_WMV.js";const l={__name:"Badge",props:{text:String,variant:{type:String,default:"default"}},setup(a){return(t,i)=>(r(),s("span",{class:d(["badge",`badge-${a.variant}`])},[n(t.$slots,"default",{},()=>[o(c(a.text),1)])],2))}},g=e(l,[["__scopeId","data-v-b7bd2350"]]);export{g as B};
|
||||
1
build/resources/main/static/assets/Button-CoXLXkk7.js
Normal file
1
build/resources/main/static/assets/Button-CoXLXkk7.js
Normal file
@@ -0,0 +1 @@
|
||||
import"./index-09HB4Lmg.js";import{_ as d,r,a,e as c,G as u,n as f,h as o}from"./index-BB0X_WMV.js";const m=["type","disabled"],b={key:0,class:"spinner"},y={__name:"Button",props:{type:{type:String,default:"button"},variant:{type:String,default:"primary"},size:{type:String,default:"md"},disabled:Boolean,loading:Boolean},emits:["click"],setup(e,{expose:l}){const n=r(null);return l({focus:()=>{var t;(t=n.value)==null||t.focus()}}),(t,s)=>(o(),a("button",{ref_key:"buttonRef",ref:n,type:e.type,class:f(["btn",`btn-${e.variant}`,{"btn-sm":e.size==="sm","btn-lg":e.size==="lg"}]),disabled:e.disabled||e.loading,onClick:s[0]||(s[0]=i=>t.$emit("click",i))},[e.loading?(o(),a("span",b)):c("",!0),u(t.$slots,"default",{},void 0)],10,m))}},B=d(y,[["__scopeId","data-v-c92354e1"]]);export{B};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as C,r as g,o as x,a as l,b as s,l as w,s as I,t as d,F as B,g as T,h as o,d as R,w as m,f as L,u as _}from"./index-BB0X_WMV.js";import{a as A,C as F}from"./index-09HB4Lmg.js";import{C as O,a as W,L as N,B as V,p as E,b as M,c as $,d as P,e as z}from"./chartjs-plugin-datalabels.esm-DiDzp_cw.js";const U={class:"daily-stats"},Y={class:"page-header"},Z={class:"filter-section"},j={key:0,class:"loading"},q={key:1,class:"no-data"},G={key:2,class:"server-charts"},H={class:"chart-header"},J={class:"chart-subtitle"},K={class:"chart-wrapper"},Q={class:"chart-container"},X={__name:"DailyStats",setup(tt){O.register(W,N,V,E,M,$,P);const c=g(!1),r=g([]),n=g(f());function f(){return new Date().toISOString().split("T")[0]}function b(){const t=new Date(n.value);t.setDate(t.getDate()-1),n.value=t.toISOString().split("T")[0],i()}function y(){const t=new Date(n.value);t.setDate(t.getDate()+1),n.value=t.toISOString().split("T")[0],i()}const S={responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"top"},tooltip:{mode:"index",intersect:!1},datalabels:{display:t=>{if(t.datasetIndex!==2)return!1;const e=t.chart.data.datasets,a=t.dataIndex;return e.reduce((u,p)=>u+(p.data[a]||0),0)>0},anchor:"end",align:"end",offset:0,font:{size:9},color:"#666",formatter:(t,e)=>{const a=e.chart.data.datasets,v=e.dataIndex;return a.reduce((u,p)=>u+(p.data[v]||0),0)}}},scales:{x:{stacked:!0,ticks:{maxRotation:0,autoSkip:!0,maxTicksLimit:24,callback:function(t,e){const a=this.getLabelForValue(t);return a&&a.endsWith(":00")?a:""}},grid:{display:!1}},y:{stacked:!0,beginAtZero:!0}},barPercentage:.8,categoryPercentage:.9},D=t=>({labels:t.timeStats.map(a=>a.time),datasets:[{label:"CRITICAL",data:t.timeStats.map(a=>a.critical),backgroundColor:"#9b59b6",borderWidth:0},{label:"ERROR",data:t.timeStats.map(a=>a.error),backgroundColor:"#e74c3c",borderWidth:0},{label:"WARN",data:t.timeStats.map(a=>a.warn),backgroundColor:"#f39c12",borderWidth:0}]}),i=async()=>{c.value=!0;try{r.value=await A.getTimeStatsByServer(n.value,15)}catch(t){console.error("Failed to load stats:",t),r.value=[]}finally{c.value=!1}},h=t=>{const e=new Date(t);return`${e.getFullYear()}년 ${e.getMonth()+1}월 ${e.getDate()}일`},k=t=>t.timeStats.reduce((e,a)=>e+a.total,0);return x(()=>{i()}),(t,e)=>(o(),l("div",U,[s("div",Y,[e[1]||(e[1]=s("h2",null,"일별 에러현황",-1)),s("div",Z,[s("button",{class:"nav-btn",onClick:b},"◀ 이전"),w(s("input",{type:"date","onUpdate:modelValue":e[0]||(e[0]=a=>n.value=a),onChange:i},null,544),[[I,n.value]]),s("button",{class:"nav-btn",onClick:y},"다음 ▶")])]),c.value?(o(),l("div",j,[...e[2]||(e[2]=[s("p",null,"로딩중...",-1)])])):r.value.length===0?(o(),l("div",q,[s("p",null,d(h(n.value))+"에 분석된 에러 데이터가 없습니다.",1)])):(o(),l("div",G,[(o(!0),l(B,null,T(r.value,a=>(o(),R(_(F),{key:a.serverId,class:"server-chart-card"},{header:m(()=>[s("div",H,[s("h3",null,"🖥️ "+d(a.serverName),1),s("span",J,d(h(n.value))+" 15분 단위 에러 ("+d(k(a))+"건)",1)])]),default:m(()=>[s("div",K,[s("div",Q,[L(_(z),{data:D(a),options:S},null,8,["data"])])])]),_:2},1024))),128))]))]))}},nt=C(X,[["__scopeId","data-v-b7241be8"]]);export{nt as default};
|
||||
@@ -0,0 +1 @@
|
||||
.page-header[data-v-b7241be8]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}.page-header h2[data-v-b7241be8]{margin:0}.filter-section[data-v-b7241be8]{display:flex;align-items:center;gap:8px}.filter-section input[type=date][data-v-b7241be8]{padding:10px 16px;border:1px solid #ddd;border-radius:6px;font-size:14px;cursor:pointer}.filter-section input[type=date][data-v-b7241be8]:focus{outline:none;border-color:#3498db}.nav-btn[data-v-b7241be8]{padding:10px 16px;border:1px solid #ddd;border-radius:6px;background:#fff;cursor:pointer;font-size:14px;transition:all .2s}.nav-btn[data-v-b7241be8]:hover{background:#f0f0f0;border-color:#3498db}.loading[data-v-b7241be8],.no-data[data-v-b7241be8]{text-align:center;padding:60px;color:#666;background:#fff;border-radius:8px}.server-charts[data-v-b7241be8]{display:flex;flex-direction:column;gap:20px}.server-chart-card[data-v-b7241be8]{width:100%}.chart-header[data-v-b7241be8]{display:flex;align-items:center;gap:12px}.chart-header h3[data-v-b7241be8]{margin:0;font-size:16px}.chart-subtitle[data-v-b7241be8]{font-size:13px;color:#888}.chart-wrapper[data-v-b7241be8]{overflow-x:auto}.chart-container[data-v-b7241be8]{height:220px;min-width:100%;padding:8px 0}
|
||||
@@ -0,0 +1 @@
|
||||
.dashboard-header[data-v-abd43acf]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}.dashboard-header h2[data-v-abd43acf]{margin:0}.server-grid[data-v-abd43acf]{display:grid;grid-template-columns:repeat(auto-fill,minmax(350px,1fr));gap:20px;margin-bottom:24px}.server-card[data-v-abd43acf]{transition:box-shadow .2s}.server-card[data-v-abd43acf]:hover{box-shadow:0 4px 12px #00000026}.server-header[data-v-abd43acf]{display:flex;justify-content:space-between;align-items:center}.server-title[data-v-abd43acf]{display:flex;align-items:center;gap:10px}.server-title h4[data-v-abd43acf]{margin:0;font-size:16px}.server-info[data-v-abd43acf]{margin-bottom:12px}.info-row[data-v-abd43acf]{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid #f0f0f0}.info-row[data-v-abd43acf]:last-child{border-bottom:none}.info-row .label[data-v-abd43acf]{color:#666;font-size:13px}.info-row .value[data-v-abd43acf]{font-weight:500}.info-row .value.has-error[data-v-abd43acf]{color:#e74c3c}.progress-section[data-v-abd43acf]{padding:12px;background:#f8f9fa;border-radius:8px;margin-top:12px}.progress-header[data-v-abd43acf]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.status-text[data-v-abd43acf]{font-size:13px;color:#333}.progress-bar-container[data-v-abd43acf]{height:8px;background:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.progress-bar[data-v-abd43acf]{height:100%;background:#3498db;transition:width .3s}.progress-details[data-v-abd43acf]{display:flex;justify-content:space-between;font-size:12px;color:#666}.empty-card[data-v-abd43acf]{text-align:center}.empty-content[data-v-abd43acf]{padding:40px 20px}.empty-content p[data-v-abd43acf]{margin-bottom:16px;color:#666}.daily-charts[data-v-abd43acf]{margin-top:32px}.daily-charts h3[data-v-abd43acf]{margin-bottom:16px;font-size:18px}.chart-list[data-v-abd43acf]{display:flex;flex-direction:column;gap:16px}.chart-card[data-v-abd43acf]{width:100%}.chart-header[data-v-abd43acf]{display:flex;justify-content:space-between;align-items:center}.chart-total[data-v-abd43acf]{font-size:13px;color:#888}.chart-container[data-v-abd43acf]{height:200px;padding:8px 0}
|
||||
1
build/resources/main/static/assets/Dashboard-CWQb9z6Z.js
Normal file
1
build/resources/main/static/assets/Dashboard-CWQb9z6Z.js
Normal file
File diff suppressed because one or more lines are too long
1
build/resources/main/static/assets/DataTable-DHBS0NNE.js
Normal file
1
build/resources/main/static/assets/DataTable-DHBS0NNE.js
Normal file
@@ -0,0 +1 @@
|
||||
import"./index-09HB4Lmg.js";import{_ as h,a as e,h as a,b as o,e as u,F as d,g as i,j as f,t as c,G as y,i as g}from"./index-BB0X_WMV.js";const b={class:"data-table-wrapper"},p={class:"data-table"},$={key:0,class:"actions-col"},_={key:0},D=["colspan"],S={key:1},T=["colspan"],B=["onClick"],N={key:0,class:"actions-col"},V={__name:"DataTable",props:{columns:{type:Array,required:!0},data:{type:Array,default:()=>[]},loading:{type:Boolean,default:!1},emptyText:{type:String,default:"데이터가 없습니다."}},emits:["row-click"],setup(n){const m=(t,r)=>t==null?"-":r.type==="date"&&t?new Date(t).toLocaleString("ko-KR"):r.type==="boolean"?t?"Y":"N":t;return(t,r)=>(a(),e("div",b,[o("table",p,[o("thead",null,[o("tr",null,[(a(!0),e(d,null,i(n.columns,s=>(a(),e("th",{key:s.key,style:f({width:s.width})},c(s.label),5))),128)),t.$slots.actions?(a(),e("th",$,"작업")):u("",!0)])]),o("tbody",null,[n.loading?(a(),e("tr",_,[o("td",{colspan:n.columns.length+(t.$slots.actions?1:0),class:"loading-cell"}," 로딩 중... ",8,D)])):!n.data||n.data.length===0?(a(),e("tr",S,[o("td",{colspan:n.columns.length+(t.$slots.actions?1:0),class:"empty-cell"},c(n.emptyText),9,T)])):(a(!0),e(d,{key:2},i(n.data,(s,k)=>(a(),e("tr",{key:s.id||k,onClick:l=>t.$emit("row-click",s)},[(a(!0),e(d,null,i(n.columns,l=>(a(),e("td",{key:l.key},[y(t.$slots,l.key,{row:s,value:s[l.key]},()=>[g(c(m(s[l.key],l)),1)])]))),128)),t.$slots.actions?(a(),e("td",N,[y(t.$slots,"actions",{row:s},void 0)])):u("",!0)],8,B))),128))])])]))}},A=h(V,[["__scopeId","data-v-db5e24a9"]]);export{A as D};
|
||||
File diff suppressed because one or more lines are too long
1
build/resources/main/static/assets/ErrorLogs-C4tZmC_2.js
Normal file
1
build/resources/main/static/assets/ErrorLogs-C4tZmC_2.js
Normal file
File diff suppressed because one or more lines are too long
1
build/resources/main/static/assets/FormInput-BwPgkOAn.js
Normal file
1
build/resources/main/static/assets/FormInput-BwPgkOAn.js
Normal file
@@ -0,0 +1 @@
|
||||
import"./index-09HB4Lmg.js";import{_ as i,c as s,a as t,h as l,e as o,i as c,t as n,F as m,g as y}from"./index-BB0X_WMV.js";const h={class:"form-group"},v=["for"],b={key:0,class:"required"},g=["id","type","value","placeholder","disabled","readonly"],f=["id","value","placeholder","disabled","readonly","rows"],k=["id","value","disabled"],V={key:0,value:""},S=["value"],x={key:4,class:"error-text"},I={key:5,class:"hint-text"},B={__name:"FormInput",props:{modelValue:{type:[String,Number],default:""},label:String,type:{type:String,default:"text"},placeholder:String,required:Boolean,disabled:Boolean,readonly:Boolean,error:String,hint:String,rows:{type:Number,default:3},options:{type:Array,default:()=>[]}},emits:["update:modelValue"],setup(e){const r=s(()=>`input-${Math.random().toString(36).slice(2,9)}`);return(u,d)=>(l(),t("div",h,[e.label?(l(),t("label",{key:0,for:r.value},[c(n(e.label)+" ",1),e.required?(l(),t("span",b,"*")):o("",!0)],8,v)):o("",!0),e.type!=="textarea"&&e.type!=="select"?(l(),t("input",{key:1,id:r.value,type:e.type,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,readonly:e.readonly,class:"form-input",onInput:d[0]||(d[0]=a=>u.$emit("update:modelValue",a.target.value))},null,40,g)):e.type==="textarea"?(l(),t("textarea",{key:2,id:r.value,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,readonly:e.readonly,rows:e.rows,class:"form-input",onInput:d[1]||(d[1]=a=>u.$emit("update:modelValue",a.target.value))},null,40,f)):e.type==="select"?(l(),t("select",{key:3,id:r.value,value:e.modelValue,disabled:e.disabled,class:"form-input",onChange:d[2]||(d[2]=a=>u.$emit("update:modelValue",a.target.value))},[e.placeholder?(l(),t("option",V,n(e.placeholder),1)):o("",!0),(l(!0),t(m,null,y(e.options,a=>(l(),t("option",{key:a.value,value:a.value},n(a.label),9,S))),128))],40,k)):o("",!0),e.error?(l(),t("span",x,n(e.error),1)):o("",!0),e.hint?(l(),t("span",I,n(e.hint),1)):o("",!0)]))}},N=i(B,[["__scopeId","data-v-45f49038"]]);export{N as F};
|
||||
1
build/resources/main/static/assets/Modal-iKIn6dGt.js
Normal file
1
build/resources/main/static/assets/Modal-iKIn6dGt.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as r,d as m,a as d,e as i,b as e,t as u,G as c,j as f,m as p,T as h,h as s}from"./index-BB0X_WMV.js";import"./index-09HB4Lmg.js";const y={class:"modal-header"},_={class:"modal-body"},k={key:0,class:"modal-footer"},v={__name:"Modal",props:{modelValue:{type:Boolean,default:!1},title:{type:String,default:""},width:{type:String,default:"500px"}},emits:["update:modelValue","close"],setup(t,{emit:n}){const a=n,l=()=>{a("update:modelValue",!1),a("close")};return(o,V)=>(s(),m(h,{to:"body"},[t.modelValue?(s(),d("div",{key:0,class:"modal-overlay",onClick:p(l,["self"])},[e("div",{class:"modal",style:f({width:t.width})},[e("div",y,[e("h3",null,u(t.title),1),e("button",{class:"close-btn",onClick:l},"×")]),e("div",_,[c(o.$slots,"default",{},void 0)]),o.$slots.footer?(s(),d("div",k,[c(o.$slots,"footer",{},void 0)])):i("",!0)],4)])):i("",!0)]))}},S=r(v,[["__scopeId","data-v-90993dd3"]]);export{S as M};
|
||||
@@ -0,0 +1 @@
|
||||
.page-header[data-v-7c1c78fe]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}.page-header h2[data-v-7c1c78fe]{margin:0}.filter-section[data-v-7c1c78fe]{display:flex;align-items:center;gap:8px}.filter-section input[type=month][data-v-7c1c78fe]{padding:10px 16px;border:1px solid #ddd;border-radius:6px;font-size:14px;cursor:pointer}.filter-section input[type=month][data-v-7c1c78fe]:focus{outline:none;border-color:#3498db}.nav-btn[data-v-7c1c78fe]{padding:10px 16px;border:1px solid #ddd;border-radius:6px;background:#fff;cursor:pointer;font-size:14px;transition:all .2s}.nav-btn[data-v-7c1c78fe]:hover{background:#f0f0f0;border-color:#3498db}.loading[data-v-7c1c78fe],.no-data[data-v-7c1c78fe]{text-align:center;padding:60px;color:#666;background:#fff;border-radius:8px}.server-charts[data-v-7c1c78fe]{display:flex;flex-direction:column;gap:20px}.server-chart-card[data-v-7c1c78fe]{width:100%}.chart-header[data-v-7c1c78fe]{display:flex;align-items:center;gap:12px}.chart-header h3[data-v-7c1c78fe]{margin:0;font-size:16px}.chart-subtitle[data-v-7c1c78fe]{font-size:13px;color:#888}.chart-container[data-v-7c1c78fe]{height:220px;padding:8px 0}
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as M,r as g,o as w,a as l,b as s,l as x,s as R,t as c,F as $,g as B,h as o,d as D,w as v,f as I,u as _}from"./index-BB0X_WMV.js";import{a as N,C as F}from"./index-09HB4Lmg.js";import{C as A,a as L,L as E,B as T,p as V,b as Y,c as O,d as z,e as U}from"./chartjs-plugin-datalabels.esm-DiDzp_cw.js";const W={class:"monthly-stats"},Z={class:"page-header"},j={class:"filter-section"},q={key:0,class:"loading"},G={key:1,class:"no-data"},H={key:2,class:"server-charts"},J={class:"chart-header"},K={class:"chart-subtitle"},P={class:"chart-container"},Q={__name:"MonthlyStats",setup(X){A.register(L,E,T,V,Y,O,z);const i=g(!1),r=g([]),n=g(f());function f(){const a=new Date;return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}`}function b(){const[a,e]=n.value.split("-").map(Number),t=new Date(a,e-2,1);n.value=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}`,d()}function y(){const[a,e]=n.value.split("-").map(Number),t=new Date(a,e,1);n.value=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}`,d()}const S={responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"top"},tooltip:{mode:"index",intersect:!1},datalabels:{display:a=>{if(a.datasetIndex!==2)return!1;const e=a.chart.data.datasets,t=a.dataIndex;return e.reduce((p,h)=>p+(h.data[t]||0),0)>0},anchor:"end",align:"end",offset:2,font:{size:10,weight:"bold"},color:"#666",formatter:(a,e)=>{const t=e.chart.data.datasets,u=e.dataIndex;return t.reduce((p,h)=>p+(h.data[u]||0),0)}}},scales:{x:{stacked:!0},y:{stacked:!0,beginAtZero:!0}}},C=a=>({labels:a.dailyStats.map(t=>`${new Date(t.date).getDate()}일`),datasets:[{label:"CRITICAL",data:a.dailyStats.map(t=>t.critical),backgroundColor:"#9b59b6",borderRadius:2},{label:"ERROR",data:a.dailyStats.map(t=>t.error),backgroundColor:"#e74c3c",borderRadius:2},{label:"WARN",data:a.dailyStats.map(t=>t.warn),backgroundColor:"#f39c12",borderRadius:2}]}),d=async()=>{i.value=!0;try{const[a,e]=n.value.split("-").map(Number);r.value=await N.getMonthlyStatsByServer(a,e)}catch(a){console.error("Failed to load stats:",a),r.value=[]}finally{i.value=!1}},m=a=>{const[e,t]=a.split("-");return`${e}년 ${parseInt(t)}월`},k=a=>a.dailyStats.reduce((e,t)=>e+t.total,0);return w(()=>{d()}),(a,e)=>(o(),l("div",W,[s("div",Z,[e[1]||(e[1]=s("h2",null,"월별 에러현황",-1)),s("div",j,[s("button",{class:"nav-btn",onClick:b},"◀ 이전"),x(s("input",{type:"month","onUpdate:modelValue":e[0]||(e[0]=t=>n.value=t),onChange:d},null,544),[[R,n.value]]),s("button",{class:"nav-btn",onClick:y},"다음 ▶")])]),i.value?(o(),l("div",q,[...e[2]||(e[2]=[s("p",null,"로딩중...",-1)])])):r.value.length===0?(o(),l("div",G,[s("p",null,c(m(n.value))+"에 분석된 에러 데이터가 없습니다.",1)])):(o(),l("div",H,[(o(!0),l($,null,B(r.value,t=>(o(),D(_(F),{key:t.serverId,class:"server-chart-card"},{header:v(()=>[s("div",J,[s("h3",null,"🖥️ "+c(t.serverName),1),s("span",K,c(m(n.value))+" 일별 에러 ("+c(k(t))+"건)",1)])]),default:v(()=>[s("div",P,[I(_(U),{data:C(t),options:S},null,8,["data"])])]),_:2},1024))),128))]))]))}},st=M(Q,[["__scopeId","data-v-7c1c78fe"]]);export{st as default};
|
||||
@@ -0,0 +1 @@
|
||||
.card-header-content[data-v-fc6fccb5]{display:flex;justify-content:space-between;align-items:center}.card-header-content h3[data-v-fc6fccb5]{margin:0}.action-buttons[data-v-fc6fccb5]{display:flex;gap:4px}.regex-code[data-v-fc6fccb5]{font-family:monospace;background:#f1f3f4;padding:2px 6px;border-radius:3px;font-size:12px}.form-group[data-v-fc6fccb5]{margin-bottom:16px}.form-group label[data-v-fc6fccb5]{display:flex;align-items:center;gap:8px;cursor:pointer}.test-section[data-v-fc6fccb5]{display:flex;flex-direction:column;gap:16px}.test-pattern label[data-v-fc6fccb5]{display:block;font-weight:500;margin-bottom:6px}.regex-display[data-v-fc6fccb5]{display:block;font-family:monospace;background:#f8f9fa;padding:12px;border-radius:4px;font-size:13px;word-break:break-all}.test-result[data-v-fc6fccb5]{padding:16px;border-radius:8px;margin-top:8px}.test-result.success[data-v-fc6fccb5]{background:#d4edda;border:1px solid #c3e6cb}.test-result.fail[data-v-fc6fccb5]{background:#f8d7da;border:1px solid #f5c6cb}.test-result h4[data-v-fc6fccb5]{margin:0 0 12px}.test-result p[data-v-fc6fccb5]{margin:0}.match-info[data-v-fc6fccb5]{margin-top:8px}.match-info label[data-v-fc6fccb5]{font-weight:500;margin-right:8px}.match-info code[data-v-fc6fccb5]{background:#0000001a;padding:2px 6px;border-radius:3px}.error-msg[data-v-fc6fccb5]{color:#721c24}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
.card-header-content[data-v-6f59a208]{display:flex;justify-content:space-between;align-items:center}.card-header-content h3[data-v-6f59a208]{margin:0}.action-buttons[data-v-6f59a208]{display:flex;gap:4px}.form-group[data-v-6f59a208]{margin-bottom:16px}.form-group label[data-v-6f59a208]{display:flex;align-items:center;gap:8px;cursor:pointer}.log-path-section h4[data-v-6f59a208]{margin:0 0 12px;font-size:14px;color:#333}.log-path-form[data-v-6f59a208]{padding:16px;background:#f8f9fa;border-radius:8px;margin-bottom:20px}.log-path-inputs[data-v-6f59a208]{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;margin-bottom:12px}.log-path-list table[data-v-6f59a208]{width:100%;border-collapse:collapse}.log-path-list th[data-v-6f59a208],.log-path-list td[data-v-6f59a208]{padding:10px 12px;text-align:left;border-bottom:1px solid #eee}.log-path-list th[data-v-6f59a208]{background:#f8f9fa;font-weight:600;font-size:13px}.empty-text[data-v-6f59a208]{color:#6c757d;text-align:center;padding:20px}.warning-text[data-v-6f59a208]{color:#e74c3c;font-size:14px}.test-result[data-v-6f59a208]{padding:16px;border-radius:8px}.test-result.success[data-v-6f59a208]{background:#d4edda;border:1px solid #c3e6cb}.test-result.fail[data-v-6f59a208]{background:#f8d7da;border:1px solid #f5c6cb}.test-result p[data-v-6f59a208]{margin:0}
|
||||
1
build/resources/main/static/assets/Settings-BmmyOJaT.js
Normal file
1
build/resources/main/static/assets/Settings-BmmyOJaT.js
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as S,r as m,o as F,a as p,f as a,w as i,u as n,h as v,m as B,b as t,i as c}from"./index-BB0X_WMV.js";import{C as V,b}from"./index-09HB4Lmg.js";import{F as u}from"./FormInput-BwPgkOAn.js";import{B as y}from"./Button-CoXLXkk7.js";const k={class:"settings"},w={key:0,class:"loading"},C={class:"setting-section"},U={class:"setting-section"},h={class:"setting-section"},M={class:"setting-section"},z={class:"form-actions"},A={__name:"Settings",setup(N){const r=m(!1),d=m(!1),l=m({}),f={"server.port":"8080","export.path":"./exports","retention.days":"90","scan.timeout":"30","scan.maxFileSize":"100"},g=async()=>{r.value=!0;try{const o=await b.getAllAsMap();l.value={...f,...o}}catch(o){console.error("Failed to load settings:",o),l.value={...f}}finally{r.value=!1}},x=async()=>{d.value=!0;try{for(const[o,e]of Object.entries(l.value))await b.save({key:o,value:String(e)});alert("설정이 저장되었습니다.")}catch(o){console.error("Failed to save settings:",o),alert("설정 저장에 실패했습니다.")}finally{d.value=!1}};return F(()=>{g()}),(o,e)=>(v(),p("div",k,[a(n(V),null,{header:i(()=>[...e[5]||(e[5]=[t("div",{class:"card-header-content"},[t("h3",null,"설정")],-1)])]),default:i(()=>[r.value?(v(),p("div",w,"로딩중...")):(v(),p("form",{key:1,onSubmit:B(x,["prevent"]),class:"settings-form"},[t("div",C,[e[6]||(e[6]=t("h4",null,"일반 설정",-1)),a(n(u),{modelValue:l.value["server.port"],"onUpdate:modelValue":e[0]||(e[0]=s=>l.value["server.port"]=s),label:"서버 포트",type:"number",hint:"애플리케이션이 실행될 포트 번호 (기본: 8080)"},null,8,["modelValue"])]),t("div",U,[e[7]||(e[7]=t("h4",null,"내보내기 설정",-1)),a(n(u),{modelValue:l.value["export.path"],"onUpdate:modelValue":e[1]||(e[1]=s=>l.value["export.path"]=s),label:"내보내기 경로",placeholder:"예: C:\\LogHunter\\exports",hint:"리포트 파일이 저장될 기본 경로"},null,8,["modelValue"])]),t("div",h,[e[8]||(e[8]=t("h4",null,"데이터 관리",-1)),a(n(u),{modelValue:l.value["retention.days"],"onUpdate:modelValue":e[2]||(e[2]=s=>l.value["retention.days"]=s),label:"로그 보관 기간 (일)",type:"number",hint:"에러 로그 데이터 보관 기간 (0 = 무제한)"},null,8,["modelValue"])]),t("div",M,[e[9]||(e[9]=t("h4",null,"스캔 설정",-1)),a(n(u),{modelValue:l.value["scan.timeout"],"onUpdate:modelValue":e[3]||(e[3]=s=>l.value["scan.timeout"]=s),label:"스캔 타임아웃 (초)",type:"number",hint:"SFTP 연결 및 파일 다운로드 타임아웃"},null,8,["modelValue"]),a(n(u),{modelValue:l.value["scan.maxFileSize"],"onUpdate:modelValue":e[4]||(e[4]=s=>l.value["scan.maxFileSize"]=s),label:"최대 파일 크기 (MB)",type:"number",hint:"분석할 로그 파일의 최대 크기"},null,8,["modelValue"])]),t("div",z,[a(n(y),{onClick:g,variant:"secondary"},{default:i(()=>[...e[10]||(e[10]=[c("초기화",-1)])]),_:1}),a(n(y),{type:"submit",loading:d.value},{default:i(()=>[...e[11]||(e[11]=[c("저장",-1)])]),_:1},8,["loading"])])],32))]),_:1}),a(n(V),{class:"app-info"},{header:i(()=>[...e[12]||(e[12]=[t("h3",null,"애플리케이션 정보",-1)])]),default:i(()=>[e[13]||(e[13]=t("div",{class:"info-list"},[t("div",{class:"info-item"},[t("span",{class:"label"},"버전"),t("span",{class:"value"},"1.0.0")]),t("div",{class:"info-item"},[t("span",{class:"label"},"프레임워크"),t("span",{class:"value"},"Spring Boot 3.2 + Vue 3")]),t("div",{class:"info-item"},[t("span",{class:"label"},"데이터베이스"),t("span",{class:"value"},"SQLite (./data/loghunter.db)")])],-1))]),_:1})]))}},j=S(A,[["__scopeId","data-v-fdca948e"]]);export{j as default};
|
||||
1
build/resources/main/static/assets/Settings-CipHZo9K.css
Normal file
1
build/resources/main/static/assets/Settings-CipHZo9K.css
Normal file
@@ -0,0 +1 @@
|
||||
.settings[data-v-fdca948e]{max-width:800px}.card-header-content h3[data-v-fdca948e]{margin:0}.loading[data-v-fdca948e]{text-align:center;padding:40px;color:#666}.settings-form[data-v-fdca948e]{padding:10px 0}.setting-section[data-v-fdca948e]{margin-bottom:30px;padding-bottom:20px;border-bottom:1px solid #eee}.setting-section[data-v-fdca948e]:last-of-type{border-bottom:none}.setting-section h4[data-v-fdca948e]{margin:0 0 20px;font-size:16px;color:#2c3e50}.form-actions[data-v-fdca948e]{display:flex;justify-content:flex-end;gap:12px;margin-top:20px;padding-top:20px;border-top:1px solid #eee}.app-info[data-v-fdca948e]{margin-top:20px}.app-info h3[data-v-fdca948e]{margin:0}.info-list[data-v-fdca948e]{display:flex;flex-direction:column;gap:12px}.info-item[data-v-fdca948e]{display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid #f0f0f0}.info-item[data-v-fdca948e]:last-child{border-bottom:none}.info-item .label[data-v-fdca948e]{color:#666}.info-item .value[data-v-fdca948e]{font-weight:500}
|
||||
File diff suppressed because one or more lines are too long
6
build/resources/main/static/assets/index-09HB4Lmg.js
Normal file
6
build/resources/main/static/assets/index-09HB4Lmg.js
Normal file
File diff suppressed because one or more lines are too long
30
build/resources/main/static/assets/index-BB0X_WMV.js
Normal file
30
build/resources/main/static/assets/index-BB0X_WMV.js
Normal file
File diff suppressed because one or more lines are too long
1
build/resources/main/static/assets/index-BJ4-9mFZ.css
Normal file
1
build/resources/main/static/assets/index-BJ4-9mFZ.css
Normal file
@@ -0,0 +1 @@
|
||||
*{box-sizing:border-box}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}#app{min-height:100vh;background:#f5f5f5}.header{background:#2c3e50;color:#fff;padding:1rem 2rem;display:flex;align-items:center;gap:2rem}.header h1{font-size:1.5rem;margin:0}.header .logo{text-decoration:none;color:#fff}.header nav{display:flex;gap:1rem}.header nav a{color:#ecf0f1;text-decoration:none;padding:.5rem 1rem;border-radius:4px;transition:background .2s}.header nav a:hover{background:#34495e}.header nav a.router-link-active{background:#3498db}.main{padding:1.5rem}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user