update 22
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/.gradle/
|
||||||
|
/build/
|
||||||
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.
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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
research.loghunter.LogHunterApplication
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
spring.application.name=log-hunter
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
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 +0,0 @@
|
|||||||
import"./index--fsvNaiQ.js";import{_ as e,a as s,h as r,G as n,i as o,t as c,n as d}from"./index-DFoOAXeQ.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 +0,0 @@
|
|||||||
import"./index--fsvNaiQ.js";import{_ as d,r,a,e as c,G as u,n as f,h as o}from"./index-DFoOAXeQ.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};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
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-DFoOAXeQ.js";import{a as A,C as F}from"./index--fsvNaiQ.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-B8xtR40N.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};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.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}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.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}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
import"./index--fsvNaiQ.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-DFoOAXeQ.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 +0,0 @@
|
|||||||
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-DFoOAXeQ.js";import"./index--fsvNaiQ.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};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
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-DFoOAXeQ.js";import{a as N,C as F}from"./index--fsvNaiQ.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-B8xtR40N.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};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.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}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.page-header[data-v-821062ae]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}.page-header h2[data-v-821062ae]{margin:0}.loading[data-v-821062ae],.empty-state[data-v-821062ae]{text-align:center;padding:60px;background:#fff;border-radius:8px;color:#666}.empty-state p[data-v-821062ae]{margin-bottom:16px}.pattern-grid[data-v-821062ae]{display:grid;grid-template-columns:repeat(auto-fill,minmax(400px,1fr));gap:20px}.pattern-card[data-v-821062ae]{transition:box-shadow .2s,transform .2s}.pattern-card[data-v-821062ae]:hover{box-shadow:0 4px 12px #00000026;transform:translateY(-2px)}.pattern-header[data-v-821062ae]{display:flex;justify-content:space-between;align-items:center}.pattern-title[data-v-821062ae]{display:flex;align-items:center;gap:10px}.pattern-title h4[data-v-821062ae]{margin:0;font-size:16px;font-weight:600}.pattern-body[data-v-821062ae]{padding:4px 0}.pattern-info[data-v-821062ae]{margin-bottom:12px}.pattern-info label[data-v-821062ae]{display:block;font-size:12px;color:#666;margin-bottom:4px}.regex-box[data-v-821062ae]{display:block;font-family:Consolas,Monaco,monospace;background:#f1f3f5;padding:10px 12px;border-radius:6px;font-size:13px;word-break:break-all;line-height:1.4;border-left:3px solid #3498db}.regex-box.exclude[data-v-821062ae]{border-left-color:#e67e22;background:#fef5e7}.pattern-meta[data-v-821062ae]{display:flex;flex-wrap:wrap;gap:12px;padding-top:8px;border-top:1px solid #eee;font-size:13px}.meta-item[data-v-821062ae]{display:flex;align-items:center;gap:4px}.meta-label[data-v-821062ae]{color:#888}.meta-value[data-v-821062ae]{font-weight:500;color:#333}.meta-item.description[data-v-821062ae]{flex-basis:100%;color:#666;font-style:italic}.pattern-actions[data-v-821062ae]{display:flex;gap:8px;padding-top:12px;border-top:1px solid #eee;margin-top:12px}.action-btn[data-v-821062ae]{flex:1;display:flex;align-items:center;justify-content:center;gap:4px;padding:10px 12px;border:none;border-radius:6px;cursor:pointer;font-size:13px;font-weight:500;transition:all .2s}.action-btn.test[data-v-821062ae]{background:#e8f4fd;color:#2980b9}.action-btn.test[data-v-821062ae]:hover{background:#d4e9f7}.action-btn.edit[data-v-821062ae]{background:#fef3e2;color:#d68910}.action-btn.edit[data-v-821062ae]:hover{background:#fce8c9}.action-btn.delete[data-v-821062ae]{background:#fdeaea;color:#c0392b}.action-btn.delete[data-v-821062ae]:hover{background:#f9d6d6}.form-group[data-v-821062ae]{margin-bottom:16px}.form-group label[data-v-821062ae]{display:flex;align-items:center;gap:8px;cursor:pointer}.test-section[data-v-821062ae]{display:flex;flex-direction:column;gap:16px}.test-pattern label[data-v-821062ae]{display:block;font-weight:500;margin-bottom:6px}.regex-display[data-v-821062ae]{display:block;font-family:monospace;background:#f8f9fa;padding:12px;border-radius:4px;font-size:13px;word-break:break-all}.test-result[data-v-821062ae]{padding:16px;border-radius:8px;margin-top:8px}.test-result.success[data-v-821062ae]{background:#d4edda;border:1px solid #c3e6cb}.test-result.fail[data-v-821062ae]{background:#f8d7da;border:1px solid #f5c6cb}.test-result h4[data-v-821062ae]{margin:0 0 12px}.test-result p[data-v-821062ae]{margin:0}.match-info[data-v-821062ae]{margin-top:8px}.match-info label[data-v-821062ae]{font-weight:500;margin-right:8px}.match-info code[data-v-821062ae]{background:#0000001a;padding:2px 6px;border-radius:3px}.error-msg[data-v-821062ae]{color:#721c24}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.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}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
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-DFoOAXeQ.js";import{C as V,b}from"./index--fsvNaiQ.js";import{F as u}from"./FormInput-BsW78DWl.js";import{B as y}from"./Button-Ddldcbk7.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};
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
*{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}
|
|
||||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user