PageSourceSearch

https://bloglab.net/assets/js/nGCatEJK.js

js bloglab.net collected 2026-10-08 19:59:46 UTC 11,732 bytes, 20 lines download raw bytes

1import{r as u,o as ce,a as H,b as g,f as e,h as l,aj as me,ak as ve,p as E,ar as fe,q as p,y as C,al as W,i as s,l as v,am as q,V as m,X as V,a5 as pe,t as c,B as G,g as O,e as X,n as Z,C as U,Y as k,Z as w,N as J,O as K,au as Ve,av as P,aw as ge,aa as z,m as M,$ as be,R as S,a0 as $,F as _e,k as ye,a4 as Q,H as ke,M as we,at as ee,d as xe}from"./D30iY_rE.js";const Ce=g("div",{class:"d-flex justify-space-between align-center mb-6"},[g("div",null,[g("h1",{class:"text-h4 font-weight-bold mb-2"},"공지사항 / 알림 관리"),g("p",{class:"text-body-2 text-grey"},"공지사항 및 수동 알림을 관리합니다")])],-1),Ue={class:"d-flex justify-end mb-4"},Ie={class:"d-flex align-center"},Ne={__name:"NoticeManagement",setup(he){const x=u("notices"),B=u([]),I=u(!1),b=u(!1),_=u(!1),h=u(!1),y=u(!1),A=u(!1),f=u(null),D=u(!1),L=u(""),F=u("success"),le=[{title:"제목",key:"title"},{title:"상태",key:"isActive",width:100},{title:"조회수",key:"viewCount",width:100},{title:"작성자",key:"author",width:120},{title:"작성일",key:"createdAt",width:150},{title:"관리",key:"actions",sortable:!1,width:100}],i=u({title:"",content:"",isImportant:!1,isActive:!0}),N=u(!1),Y=u([]),n=u({title:"",message:"",target:"all",selectedUserIds:[]}),ae=[{label:"서비스 점검",title:"서비스 점검 안내",message:`안녕하세요. 서비스 점검이 예정되어 있습니다.
2
3점검 시간: 
4점검 내용: 
5
6이용에 불편을 드려 죄송합니다.`},{label:"업데이트 안내",title:"시스템 업데이트 안내",message:`안녕하세요. 시스템 업데이트가 완료되었습니다.
7
8업데이트 내용:
9- 
10
11감사합니다.`},{label:"긴급 공지",title:"긴급 공지사항",message:`안녕하세요. 긴급 안내 드립니다.
12
13내용: 
14
15빠른 시일 내에 조치하겠습니다.`},{label:"이벤트 안내",title:"이벤트 안내",message:`안녕하세요. 이벤트를 안내드립니다.
16
17이벤트 기간: 
18이벤트 내용: 
19
20많은 참여 부탁드립니다.`}],te=o=>xe(o).format("YYYY-MM-DD HH:mm"),r=(o,t="success")=>{L.value=o,F.value=t,D.value=!0},T=async()=>{I.value=!0;try{const o=await p.notices.adminList();B.value=o.data.data.notices||[]}catch(o){console.error("공지사항 목록 조회 실패:",o),r("공지사항 목록 조회에 실패했습니다","error")}finally{I.value=!1}},se=()=>{_.value=!1,i.value={title:"",content:"",isImportant:!1,isActive:!0},b.value=!0},oe=o=>{_.value=!0,f.value=o,i.value={title:o.title,content:o.content,isImportant:o.isImportant,isActive:o.isActive},b.value=!0},j=()=>{b.value=!1,f.value=null},R=async()=>{var o,t;if(!i.value.title||!i.value.content){r("제목과 내용을 입력해주세요","error");return}h.value=!0;try{_.value?(await p.notices.update(f.value.id,i.value),r("공지사항이 수정되었습니다","success")):(await p.notices.create(i.value),r("공지사항이 추가되었습니다 (알림 자동 발송)","success")),j(),T()}catch(a){console.error("공지사항 저장 실패:",a),r(((t=(o=a.response)==null?void 0:o.data)==null?void 0:t.message)||"공지사항 저장에 실패했습니다","error")}finally{h.value=!1}},ne=o=>{f.value=o,y.value=!0},ue=async()=>{A.value=!0;try{await p.notices.delete(f.value.id),r("공지사항이 삭제되었습니다","success"),y.value=!1,T()}catch(o){console.error("공지사항 삭제 실패:",o),r("공지사항 삭제에 실패했습니다","error")}finally{A.value=!1}},ie=async()=>{var o;try{const t=await p.users.list({page:1,limit:500}),a=((o=t.data.data)==null?void 0:o.users)||t.data.data||[];Y.value=a.map(d=>({id:d.id,label:`${d.username} (${d.email||"-"})`}))}catch(t){console.error("유저 목록 조회 실패:",t)}},de=o=>{n.value.title=o.title,n.value.message=o.message},re=async()=>{var o,t;if(!n.value.title||!n.value.message){r("제목과 내용을 입력해주세요","error");return}if(n.value.target==="selected"&&n.value.selectedUserIds.length===0){r("발송 대상 유저를 선택해주세요","error");return}N.value=!0;try{const a={title:n.value.title,message:n.value.message};n.value.target==="selected"&&(a.targetUserIds=n.value.selectedUserIds);const d=await p.notifications.adminSend(a);r(d.data.message||"알림이 발송되었습니다","success"),n.value={title:"",message:"",target:"all",selectedUserIds:[]}}catch(a){console.error("알림 발송 실패:",a),r(((t=(o=a.response)==null?void 0:o.data)==null?void 0:t.message)||"알림 발송에 실패했습니다","error")}finally{N.value=!1}};return ce(()=>{T(),ie()}),(o,t)=>(C(),H("div",null,[Ce,e(me,{modelValue:x.value,"onUpdate:modelValue":t[0]||(t[0]=a=>x.value=a),color:"primary",class:"mb-4"},{default:l(()=>[e(W,{value:"notices"},{default:l(()=>[e(v,{start:""},{default:l(()=>[s("mdi-bullhorn")]),_:1}),s(" 공지사항 ")]),_:1}),e(W,{value:"send-notification"},{default:l(()=>[e(v,{start:""},{default:l(()=>[s("mdi-send")]),_:1}),s(" 수동 알림 발송 ")]),_:1})]),_:1},8,["modelValue"]),e(ve,{modelValue:x.value,"onUpdate:modelValue":t[5]||(t[5]=a=>x.value=a)},{default:l(()=>[e(q,{value:"notices"},{default:l(()=>
20[g("div",Ue,[e(m,{color:"primary","prepend-icon":"mdi-plus",onClick:se},{default:l(()=>[s(" 공지사항 추가 ")]),_:1})]),e(V,{elevation:"0",class:"rounded-lg"},{default:l(()=>[e(pe,{headers:le,items:B.value,loading:I.value,class:"elevation-0"},{"item.title":l(({item:a})=>[g("div",Ie,[a.isImportant?(C(),O(G,{key:0,color:"red",size:"x-small",class:"mr-2"},{default:l(()=>[s("중요")]),_:1})):X("",!0),s(" "+c(a.title),1)])]),"item.isActive":l(({item:a})=>[e(G,{color:a.isActive?"success":"grey",size:"small"},{default:l(()=>[s(c(a.isActive?"공개":"비공개"),1)]),_:2},1032,["color"])]),"item.viewCount":l(({item:a})=>[s(c(a.viewCount||0),1)]),"item.author":l(({item:a})=>{var d;return[s(c(((d=a.author)==null?void 0:d.username)||"-"),1)]}),"item.createdAt":l(({item:a})=>[s(c(te(a.createdAt)),1)]),"item.actions":l(({item:a})=>[e(m,{icon:"",size:"small",variant:"text",onClick:d=>oe(a)},{default:l(()=>[e(v,null,{default:l(()=>[s("mdi-pencil")]),_:1})]),_:2},1032,["onClick"]),e(m,{icon:"",size:"small",variant:"text",color:"error",onClick:d=>ne(a)},{default:l(()=>[e(v,null,{default:l(()=>[s("mdi-delete")]),_:1})]),_:2},1032,["onClick"])]),_:1},8,["items","loading"])]),_:1})]),_:1}),e(q,{value:"send-notification"},{default:l(()=>[e(Z,null,{default:l(()=>[e(U,{cols:"12",md:"8"},{default:l(()=>[e(V,{elevation:"0",class:"rounded-lg"},{default:l(()=>[e(k,{class:"text-subtitle-1 font-weight-bold"},{default:l(()=>[s("알림 발송")]),_:1}),e(w,null,{default:l(()=>[e(J,{modelValue:n.value.title,"onUpdate:modelValue":t[1]||(t[1]=a=>n.value.title=a),label:"알림 제목 *",variant:"outlined",density:"comfortable",placeholder:"예: 서비스 점검 안내",class:"mb-3"},null,8,["modelValue"]),e(K,{modelValue:n.value.message,"onUpdate:modelValue":t[2]||(t[2]=a=>n.value.message=a),label:"알림 내용 *",variant:"outlined",density:"comfortable",rows:"6",placeholder:"유저에게 전달할 메시지를 입력하세요",class:"mb-3"},null,8,["modelValue"]),e(Ve,{modelValue:n.value.target,"onUpdate:modelValue":t[3]||(t[3]=a=>n.value.target=a),inline:"",class:"mb-3"},{default:l(()=>[e(P,{label:"전체 유저",value:"all"}),e(P,{label:"특정 유저 선택",value:"selected"})]),_:1},8,["modelValue"]),n.value.target==="selected"?(C(),O(ge,{key:0,modelValue:n.value.selectedUserIds,"onUpdate:modelValue":t[4]||(t[4]=a=>n.value.selectedUserIds=a),items:Y.value,"item-title":"label","item-value":"id",label:"유저 선택",variant:"outlined",density:"comfortable",multiple:"",chips:"","closable-chips":"",class:"mb-3"},null,8,["modelValue","items"])):X("",!0)]),_:1}),e(z,{class:"pa-4 pt-0"},{default:l(()=>[e(M),e(m,{color:"primary",variant:"flat",size:"large","prepend-icon":"mdi-send",loading:N.value,onClick:re},{default:l(()=>[s(" 알림 발송 ")]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1}),e(U,{cols:"12",md:"4"},{default:l(()=>[e(V,{elevation:"0",class:"rounded-lg"},{default:l(()=>[e(k,{class:"text-subtitle-1 font-weight-bold"},{default:l(()=>[s("안내")]),_:1}),e(w,null,{default:l(()=>[e(be,{density:"compact"},{default:l(()=>[e(S,null,{prepend:l(()=>[e(v,{color:"info",size:"20"},{default:l(()=>[s("mdi-information")]),_:1})]),default:l(()=>[e($,{class:"text-body-2"},{default:l(()=>[s("전체 유저에게 실시간 알림이 발송됩니다")]),_:1})]),_:1}),e(S,null,{prepend:l(()=>[e(v,{color:"info",size:"20"},{default:l(()=>[s("mdi-bell-ring")]),_:1})]),default:l(()=>[e($,{class:"text-body-2"},{default:l(()=>[s("유저 로그인 시 읽지 않은 알림 팝업이 표시됩니다")]),_:1})]),_:1}),e(S,null,{prepend:l(()=>[e(v,{color:"info",size:"20"},{default:l(()=>[s("mdi-bell")]),_:1})]),default:l(()=>[e($,{class:"text-body-2"},{default:l(()=>[s("알림은 종 아이콘에서 확인할 수 있습니다")]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),e(V,{elevation:"0",class:"rounded-lg mt-4"},{default:l(()=>[e(k,{class:"text-subtitle-1 font-weight-bold"},{default:l(()=>[s("빠른 템플릿")]),_:1}),e(w,null,{default:l(()=>[(C(),H(_e,null,ye(ae,(a,d)=>e(m,{key:d,variant:"outlined",size:"small",class:"mr-2 mb-2",onClick:Ae=>de(a)},{default:l(()=>[s(c(a.label),1)]),_:2},1032,["onClick"])),64))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),e(E,{modelValue:b.value,"onUpdate:modelValue":t[10]||(t[10]=a=>b.value=a),"max-width":"700",persistent:""},{default:l(()=>[e(V,null,{default:l(()=>[e(k,null,{default:l(()=>[s(c(_.value?"공지사항 수정":"공지사항 추가"),1)]),_:1}),e(Q),e(w,{class:"pa-4"},{default:l(()=>[e(ke,{ref:"form",onSubmit:we(R,["prevent"])},{default:l(()=>[e(J,{modelValue:i.value.title,"onUpdate:modelValue":t[6]||(t[6]=a=>i.value.title=a),label:"제목 *",variant:"outlined",density:"comfortable",rules:[a=>!!a||"제목을 입력해주세요"],class:"mb-3"},null,8,["modelValue","rules"]),e(K,{modelValue:i.value.content,"onUpdate:modelValue":t[7]||(t[7]=a=>i.value.content=a),label:"내용 *",variant:"outlined",density:"comfortable",rows:"10",rules:[a=>!!a||"내용을 입력해주세요"],class:"mb-3"},null,8,["modelValue","rules"]),e(Z,null,{default:l(()=>[e(U,{cols:"6"},{default:l(()=>[e(ee,{modelValue:i.value.isImportant,"onUpdate:modelValue":t[8]||(t[8]=a=>i.value.isImportant=a),label:"중요 공지",color:"red",hint:"중요 공지는 상단에 고정됩니다","persistent-hint":""},null,8,["modelValue"])]),_:1}),e(U,{cols:"6"},{default:l(()=>[e(ee,{modelValue:i.value.isActive,"onUpdate:modelValue":t[9]||(t[9]=a=>i.value.isActive=a),label:"공개",color:"primary",hint:"비공개 시 사용자에게 표시되지 않습니다","persistent-hint":""},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},512)]),_:1}),e(Q),e(z,null,{default:l(()=>[e(M),e(m,{variant:"text",onClick:j},{default:l(()=>[s("취소")]),_:1}),e(m,{color:"primary",loading:h.value,onClick:R},{default:l(()=>[s(c(_.value?"수정":"추가"),1)]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),e(E,{modelValue:y.value,"onUpdate:modelValue":t[12]||(t[12]=a=>y.value=a),"max-width":"400"},{default:l(()=>[e(V,null,{default:l(()=>[e(k,null,{default:l(()=>[s("공지사항 삭제")]),_:1}),e(w,null,{default:l(()=>{var a;return[s(' "'+c((a=f.value)==null?void 0:a.title)+'" 공지사항을 삭제하시겠습니까? ',1)]}),_:1}),e(z,null,{default:l(()=>[e(M),e(m,{variant:"text",onClick:t[11]||(t[11]=a=>y.value=!1)},{default:l(()=>[s("취소")]),_:1}),e(m,{color:"error",loading:A.value,onClick:ue},{default:l(()=>[s("삭제")]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),e(fe,{modelValue:D.value,"onUpdate:modelValue":t[13]||(t[13]=a=>D.value=a),color:F.value,timeout:"3000"},{default:l(()=>[s(c(L.value),1)]),_:1},8,["modelValue","color"])]))}};export{Ne as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.