filecat 7.21.2 → 7.22.0

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 (50) hide show
  1. package/build/dist/122.4dcdda2738126091bb48.js +1 -0
  2. package/build/dist/1317.4d1617ed6eddfd2960b5.js +1 -0
  3. package/build/dist/2334.9568f51c698d1e261092.js +1 -0
  4. package/build/dist/{4924.32129da284e5464bf078.js → 2543.c1df37b86fd6b03c3976.js} +2 -2
  5. package/build/dist/259.5dbfcbe6ecd5e8ce07ca.js +1 -0
  6. package/build/dist/2674.983f76fc32b01e807e4d.js +1 -0
  7. package/build/dist/3355.221b11ae8755cb58412f.js +1 -0
  8. package/build/dist/{3402.30e70a3fe5d2c355bae5.js → 3402.913056b796b3aa4dfd5f.js} +1 -1
  9. package/build/dist/4091.4ec37d360601d3f388ee.js +1 -0
  10. package/build/dist/4564.d7a5595346660e89760b.js +2 -0
  11. package/build/dist/4564.d7a5595346660e89760b.js.LICENSE.txt +39 -0
  12. package/build/dist/4598.48aad39fc631a51c30d3.js +1 -0
  13. package/build/dist/47.423c0f43594850475f8d.js +1 -0
  14. package/build/dist/5272.16c3f9821799656a93a9.js +1 -0
  15. package/build/dist/6097.3b8a75477b58137301a6.js +1 -0
  16. package/build/dist/676.ad9fb1447bfc5b04b30a.js +1 -0
  17. package/build/dist/7181.031a335fc6a96a548882.js +1 -0
  18. package/build/dist/7678.b2889b36fac2b90a9061.js +1 -0
  19. package/build/dist/{8435.5cf0507f0dfbd7576fff.js → 8435.1f63fa3aa621962786b1.js} +1 -1
  20. package/build/dist/{8765.13b3b3db8cf2edb74526.js → 8765.800f703d3d31566267ab.js} +1 -1
  21. package/build/dist/9202.acca2abe478020a45f13.js +1 -0
  22. package/build/dist/9260.2f474cb25f7647cb995a.js +1 -0
  23. package/build/dist/{9546.cd3b1747ad87bbd7ccc4.js → 9546.2dc17877ae589e21d6d2.js} +1 -1
  24. package/build/dist/9765.15869054c7b8e56ccc76.js +1 -0
  25. package/build/dist/991.2ff5a3ada566cb075df6.js +1 -0
  26. package/build/dist/index.html +1 -1
  27. package/build/dist/main.19ecdddaf894b36f1a47.js +2 -0
  28. package/build/main.js +1 -1
  29. package/package.json +5 -1
  30. package/build/dist/2334.8944eba9ea6bea2c873b.js +0 -1
  31. package/build/dist/2543.a6ee7f78b6f447ccae9f.js +0 -1
  32. package/build/dist/259.ed90168189edc15b3ea6.js +0 -1
  33. package/build/dist/2674.26ef7b92f7a50dde4275.js +0 -1
  34. package/build/dist/3355.70ffd73778049aa73d5c.js +0 -1
  35. package/build/dist/3528.f4bf3684610c3ce28c08.js +0 -1
  36. package/build/dist/4091.bbca4ee92e5d078ee770.js +0 -1
  37. package/build/dist/4598.6528d76c619352e7e1f3.js +0 -1
  38. package/build/dist/47.0ad0f7d1c95e6691b317.js +0 -1
  39. package/build/dist/5272.124204f2cb80d69e8561.js +0 -1
  40. package/build/dist/5877.afb89fcd6cbae1ab8e39.js +0 -1
  41. package/build/dist/6097.98ee6ec678fafcc2c2ba.js +0 -1
  42. package/build/dist/676.4671c5b267b93fd2112d.js +0 -1
  43. package/build/dist/7181.2403d6d75f9d4ea6917d.js +0 -1
  44. package/build/dist/7678.5769d70f52981f9434d1.js +0 -1
  45. package/build/dist/8358.1d1c09cc6b9185e388a2.js +0 -1
  46. package/build/dist/9260.72cae497ae765cc00d54.js +0 -1
  47. package/build/dist/9765.2f0daa101ea2bc02379a.js +0 -1
  48. package/build/dist/main.f512bdab9a0595432be0.js +0 -2
  49. /package/build/dist/{4924.32129da284e5464bf078.js.LICENSE.txt → 2543.c1df37b86fd6b03c3976.js.LICENSE.txt} +0 -0
  50. /package/build/dist/{main.f512bdab9a0595432be0.js.LICENSE.txt → main.19ecdddaf894b36f1a47.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunkfilecat=self.webpackChunkfilecat||[]).push([[8358],{77481(e,t,s){s.d(t,{S:()=>l,X:()=>o});var n=s(96540),i=s(61443),a=s(74848);function o(e){const[t,s]=n.useState([]),o=(0,n.useRef)(-1),[l,r]=(0,n.useState)(-1),[c,d]=(0,n.useState)(-1);(0,n.useEffect)(()=>{e.children?s(Array.isArray(e.children)?e.children:[e.children]):s(e.rows)},[e.rows,e.children]);const u=()=>{o.current=-1,r(-1),d(-1)};return(0,a.jsxs)("table",{children:[(0,a.jsx)("thead",{children:(0,a.jsx)("tr",{children:e.headers?.map((t,s)=>{const n=!!e.filter&&(e.filter.column??0)===s;let o=t;if(n){const s=e.filter,n=s.options.find(e=>e.value===s.value);null!=s.value&&n&&(o=`${t} (${n.label})`)}return(0,a.jsx)("th",{className:n?"table-filter-col":"",children:n?(0,a.jsx)(i.l6,{value:e.filter.value,options:e.filter.options,onChange:e.filter.onChange,bare:!0,trigger_label:o}):t},s)})})}),(0,a.jsx)("tbody",{children:t.map((t,s)=>{const n=!!e.onRowDrag;return(0,a.jsx)("tr",{className:n?(l===s?"row-dragging":"")+(c===s?" row-drop-target":""):"",draggable:n,onContextMenu:()=>{e.handleContextMenu&&e.handleContextMenu(t)},onDragStart:e=>{n&&(o.current=s,r(s),e.dataTransfer.effectAllowed="move")},onDragOver:e=>{!n||o.current<0||(e.preventDefault(),e.dataTransfer.dropEffect="move",d(s))},onDrop:t=>{n&&(t.preventDefault(),(()=>{const t=o.current,s=c;u(),t<0||s<0||t===s||e.onRowDrag?.(t,s)})())},onDragEnd:u,children:t.map((s,n)=>{const i=n===t.length-1?"small":"";return(0,a.jsx)("td",{className:i,style:{width:e.width??"auto"},children:s},n)})},s)})})]})}function l(e){return(0,a.jsx)("div",{style:{display:e.isFlex?"flex":"block"},children:e.columns.map((e,t)=>(0,a.jsx)("div",{children:e},t))})}},88358(e,t,s){s.r(t),s.d(t,{default:()=>xe});var n=s(96540),i=s(75725),a=s(23430),o=s(70447),l=s(85997),r=s(61443),c=s(14284),d=s(53459),u=s(77481),h=s(22022),p=s(82893),m=s(40505),_=s(62042),x=s(21499),j=s(21469),v=s(64694),f=s(74848);function g(e){const{t}=(0,h.Bd)(),[s,a]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{if(e.getItems){const t=await e.getItems();a(t)}})()},[]);return(0,f.jsx)(i.xh,{children:(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e.title}),e.info_click&&(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{e.info_click()},title:"信息"})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:t("添加"),onClick:()=>{const t=[];for(let s=0;s<e.headers.length-1;s++)t.push("");a([t,...s])}}),(0,f.jsx)(l.rA,{icon:"save",title:t("保存"),onClick:async()=>{e.save&&await e.save(s)}})]}),children:(0,f.jsx)(u.X,{headers:e.headers,rows:s.map((n,i)=>{const o=[];for(let t=0;t<e.headers.length;t++)o.push((0,f.jsx)(r.Sm,{value:n[t],handleInputChange:e=>{n[t]=e,a([...s])},no_border:!0}));return o.push((0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"delete",title:t("删除"),onClick:()=>(e=>{s.splice(e,1),a([...s])})(i)}),n[0]&&(0,f.jsx)(l.rA,{icon:"content_copy",title:t("复制地址"),onClick:()=>{const e=(0,x.bi)(`${window.location.origin}${j.m.base_url}`,n[0]);(0,m.lW)(e),(0,_.SK)(e)}}),n[0]&&e.need_copy&&(0,f.jsx)(l.rA,{icon:"open_in_new",title:t("打开新页面"),onClick:()=>{const e=(0,x.bi)(`${window.location.origin}${j.m.base_url}`,n[0]);window.open(e)}})]})),o}),width:"10rem",onRowDrag:(e,t)=>{a((0,v.TI)(s,e,t))}})})})}var y=s(34843),w=s(78247),b=s(24659);function S(){const{t:e}=(0,h.Bd)(),[t,s]=(0,y.fp)(p.AG.prompt_card),a=(0,b.K)(),g=[e("路由"),e("auth"),e("备注")],[S,C]=(0,y.fp)(p.AG.editorSetting),[k,A]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{const e=await c.XO.get("api/customer_router");e.code===d.m.Success&&A(e.data)})()},[]);return(0,f.jsx)(i.xh,{children:(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("api_rt")})," ",(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{(()=>{let e=(0,f.jsx)("div",{children:'默认需要以 "/api" 开头的路由。'});s({open:!0,title:"信息",context_div:(0,f.jsx)("div",{children:e})})})()},title:"信息"})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{A([{note:"",needAuth:!1,router:""},...k])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{(await c.XO.post("api/customer_router/save",k)).code===d.m.Success&&(0,_.SK)(e("保存成功"))}})]}),children:(0,f.jsx)(u.X,{headers:g,rows:k.map((t,s)=>{const n=[(0,f.jsx)(r.Sm,{value:t.router,handleInputChange:e=>{t.router=e,A([...k])},no_border:!0}),(0,f.jsx)(r.l6,{defaultValue:t.needAuth,onChange:e=>{t.needAuth=e,A([...k])},options:a,no_border:!0}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e,A([...k])},no_border:!0}),(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{k.splice(e,1),A([...k])})(s)}),(0,f.jsx)(l.rA,{icon:"edit",title:e("编辑"),onClick:()=>(async t=>{if(!t.router)return void(0,_.zN)(e("路由不能为空"));const s=await c.XO.get(`jscode/${encodeURIComponent(t.router)}`);C({model:"ace/mode/javascript",open:!0,fileName:t.router,save:async s=>{const n={context:s,router:t.router};(await c.XO.post("jscode/save",n)).code===d.m.Success&&(w.xK.set_value_temp(""),C({open:!1,model:"",fileName:"",save:null}),(0,_.SK)(e("成功")))}}),w.xK.set_value_temp(s.data)})(t)}),t.router&&(0,f.jsx)(l.rA,{icon:"content_copy",title:e("复制地址"),onClick:()=>{(0,m.lW)((0,x.bi)(window.location.origin+j.m.base_url,t.router)),(0,_.SK)(e("已复制"))}})]})];return n}),width:"10rem",onRowDrag:(e,t)=>{A((0,v.TI)(k,e,t))}})})})}var C=s(23496),k=s(4412);function A(){const{t:e}=(0,h.Bd)(),[t,s]=(0,y.fp)(p.AG.prompt_card),[a,o]=(0,y.fp)(p.AG.router_jump),l=[e("路由"),e("路径"),e("过期时间(s)"),e("备注")],r=[e("路由"),e("文件路径"),"token","user id",e("备注")];return(0,f.jsxs)(n.Fragment,{children:[(0,f.jsx)(k.aZ,{position:"right"}),(0,f.jsxs)(i.fI,{children:[(0,f.jsxs)(i.VP,{maxWidth:"50rem",children:[(0,f.jsx)(g,{title:e("页面资源路由"),headers:l,getItems:async()=>{const t=await c.XO.get(C.s.setting_customer_router);if(t.code===d.m.Success){if(a?.page_self_router_api_data){for(const s of t.data)s[1]===a?.page_self_router_api_data[1]&&(0,_.N9)(e("已经存在的页面资源路由配置目录设置"));const s={};Object.assign(s,a?.page_self_router_api_data),t.data=[s,...t.data],o({})}return t.data}return[]},save:async e=>{(await c.XO.post(C.s.setting_customer_router_save,e)).code===d.m.Success&&(0,_.SK)("success")},info_click:()=>{let e=(0,f.jsx)("div",{children:'默认需要以 "/api" 开头的路由,会自动识别地址,将页面转到对应结果。路径支持文件路径(如果是文件夹路径的最后最后一个名字将会成为资源实际地址,整个目录将会变成一个http目录),http地址。'});s({open:!0,title:"信息",context_div:(0,f.jsx)("div",{children:e})})},need_copy:!0}),(0,f.jsx)(g,{title:e("wf_rt"),headers:r,getItems:async()=>{const e=await c.XO.get(C.s.setting_customer_workflow_router);return e.code===d.m.Success?e.data:[]},save:async t=>{(await c.XO.post(C.s.setting_customer_workflow_router_save,t)).code===d.m.Success&&(0,_.SK)(e("保存成功"))},info_click:()=>{let e=(0,f.jsx)("div",{children:'默认需要以 "/api" 开头的路由,文件路径是有效的workflow路径。token也可以是文件绝对路径,请求的时候请设置同样的authorization请求头字段。'});s({open:!0,title:"信息",context_div:(0,f.jsx)("div",{children:e})})}})]}),(0,f.jsx)(i.VP,{maxWidth:"50rem",children:(0,f.jsx)(S,{})})]})]})}var I=s(74777),N=s(18840),V=s(6960),$=s(7523);function X(){const{t:e}=(0,h.Bd)(),{check_user_auth:t}=(0,w.MH)(),[s,i]=(0,n.useState)(!1),[u,m]=(0,n.useState)("https://registry.npmjs.org"),[x,j]=(0,n.useState)(""),[v,g]=(0,n.useState)(180),[b,S]=(0,n.useState)(!1),[C,k]=(0,y.fp)(p.AG.prompt_card);(0,n.useEffect)(()=>{(async()=>{const e=await c.XO.get("auto_upgrade_setting");if(e.code===d.m.Success){const t=e.data;i(t.open||!1),m(t.version_check_url||"https://registry.npmjs.org"),j(t.exe_download_url||""),g(t.check_interval_seconds||180)}})()},[]);return t(a.oV.sys_setting_page)?(0,f.jsxs)(o.Zp,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("自动升级")}),(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{k({open:!0,title:e("信息"),context_div:(0,f.jsx)("div",{children:e("自动升级在 windows 下目前可能不稳定")})})},title:e("信息")})]}),rightBottomCom:(0,f.jsx)(l.C3,{text:e("保存"),clickFun:async()=>{if(!u)return void(0,_.zN)(e("ver_req"));if(s&&(!v||v<10))return void(0,_.zN)(e("chk_10s"));const t=new I.Mm;t.open=s,t.version_check_url=u,t.exe_download_url=x,t.check_interval_seconds=v;(await c.XO.post("auto_upgrade_setting/save",t)).code===d.m.Success&&(0,_.SK)(e("保存成功"))}}),children:[(0,f.jsx)("div",{children:e("ver_url")}),(0,f.jsx)(r.Sm,{placeholder:"https://registry.npmjs.org",value:u,handleInputChange:e=>{m(e)}}),(0,f.jsx)(r.l6,{value:s,onChange:e=>{i(e)},options:[{title:e("开启"),value:!0},{title:e("关闭"),value:!1}]}),s&&(0,f.jsxs)(f.Fragment,{children:[!1,(0,f.jsx)("div",{children:e("检测频率(秒)")}),(0,f.jsx)(r.Sm,{placeholder:e("def_180"),value:v,handleInputChange:e=>{g(Number(e)||180)}}),(0,f.jsx)("div",{style:{marginTop:"12px"},children:(0,f.jsx)(l.C3,{text:e(b?"升级检测中...":"立即升级"),clickFun:async()=>{S(!0);try{(await c.XO.post("auto_upgrade_setting/upgrade_now",{})).code===d.m.Success&&(0,_.SK)(e("已触发升级检测,请查看服务端日志"))}catch(t){(0,_.zN)(e("触发升级失败"))}finally{S(!1)}}})})]})]}):null}function F(){const{t:e}=(0,h.Bd)(),[,t]=(0,y.fp)(p.AG.prompt_card),[s,i]=(0,n.useState)(""),[a,m]=(0,n.useState)(5610),[x,j]=(0,n.useState)(5710);(0,n.useEffect)(()=>{(async()=>{const e=await c.XO.get("sys_option/status");if(e.code===d.m.Success){const t=e.data?.sys_env;i((t?.browser_proxy_allow||[]).join("\n")),m(t?.browser_proxy_port_start||5610),j(t?.browser_proxy_port_end||5710)}})()},[]);return(0,f.jsxs)(o.Zp,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("网页代理")}),(0,f.jsx)(l.rA,{icon:"info",title:e("信息"),onClick:()=>{t({open:!0,title:e("信息"),context_div:(0,f.jsx)("div",{children:(0,f.jsx)("div",{children:e("wbvpn_tip")})})})}})]}),rightBottomCom:(0,f.jsx)(l.C3,{text:e("确定修改"),clickFun:async()=>{const t=s.split("\n").map(e=>e.trim()).filter(e=>!!e);(await c.XO.post(C.s.setting_sys_option_status_save,{type:I.Mu.sys_env,value:{browser_proxy_allow:t,browser_proxy_port_start:Number(a)||5610,browser_proxy_port_end:Number(x)||5710}})).code===d.m.Success&&(0,_.SK)(e("修改成功"))}}),children:[(0,f.jsx)("div",{children:e("wbvpn_allow")}),(0,f.jsx)(r.Z2,{style:{minHeight:"5rem",resize:"vertical"},placeholder:e("wbvpn_allow_ph"),value:s,onChange:e=>{i(e.target.value)}}),(0,f.jsx)("div",{children:e("wbvpn_port_range")}),(0,f.jsx)(u.S,{isFlex:!0,columns:[(0,f.jsx)(r.Sm,{placeholder:"5610",value:a,handleInputChange:e=>m(e)}),(0,f.jsx)("span",{style:{padding:"0 6px"},children:"-"}),(0,f.jsx)(r.Sm,{placeholder:"5710",value:x,handleInputChange:e=>j(e)})]})]})}function K(){const[e,t]=(0,n.useState)(""),[s,a]=(0,n.useState)(""),[m,x]=(0,n.useState)(!1),[j,v]=(0,n.useState)(""),[g,b]=(0,n.useState)(!1),[S,A]=(0,n.useState)(""),[K,z]=(0,y.fp)(p.AG.prompt_card),[,B]=(0,y.fp)(p.AG.editorSetting),[O,P]=(0,n.useState)(I.aM.close),[T,E]=(0,n.useState)(!1),[M,D]=(0,n.useState)(void 0),[G,q]=(0,n.useState)(""),{t:R,i18n:W}=(0,h.Bd)(),[Z,U]=(0,y.fp)(p.AG.user_base_info),{check_user_auth:H}=(0,w.MH)(),{initUserInfo:J}=(0,n.useContext)($.F),Q=async()=>{const e=await c.XO.get("sys_option/status");if(e.code===d.m.Success){b(e.data.recycle_open),A(e.data.recycle_dir);const s=e.data.sys_env;t(s?.web_site_title),a(s?.logo||""),x(s?.show_login_user_info),v(s?.http_proxy||""),q(s?.control_env_str||N.CU)}const s=await c.XO.get("token");if(s.code===d.m.Success){const e=s.data;if(!e)return;e.length&&D(e.length),e.mode&&P(e.mode),void 0!==e.persist&&E(e.persist)}};(0,n.useEffect)(()=>{Q()},[]);return(0,f.jsxs)("div",{children:[(0,f.jsx)(k.aZ,{children:(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)("span",{className:"credits",children:[R("系统运行于"),": ",(0,V.s)(Z.runing_time_length)]}),(0,f.jsx)("span",{className:"credits",children:(0,f.jsxs)("a",{href:"https://github.com/xiaobaidadada/filecat",target:"_blank",children:["version:7.21.2",null!=Z.latest_version&&"7.21.2"!==Z.latest_version?` -> ${Z.latest_version}`:""]})}),(0,f.jsx)("span",{className:"credits",children:(0,f.jsx)("a",{href:R("官网地址"),target:"_blank",children:`filecat ${R("功能文档")}`})}),(0,f.jsxs)("span",{className:"credits",children:[R("安装方式")," :",Z.process_env_run_env]})]})}),(0,f.jsx)(i.xh,{children:(0,f.jsxs)(i.fI,{children:[(0,f.jsxs)(i.VP,{widthPer:33,children:[(0,f.jsxs)(o.Zp,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:R("通用设置")})," ",(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{z({open:!0,title:R("信息"),context_div:(0,f.jsx)("div",{children:(0,f.jsx)("div",{children:R("pxy_tip")})})})},title:R("信息")})]}),rightBottomCom:(0,f.jsx)(l.C3,{text:R("确定修改"),clickFun:async()=>{(await c.XO.post(C.s.setting_sys_option_status_save,{type:I.Mu.sys_env,value:{web_site_title:e,show_login_user_info:m,http_proxy:j,logo:s}})).code===d.m.Success&&((0,_.SK)(R("修改成功")),J())}}),rightTopCom:(0,f.jsx)(l.rA,{icon:"tune",title:R("环境控制"),onClick:()=>{w.xK.set_value_temp(G||N.CU),B({model:"ace/mode/yaml",open:!0,fileName:"",not_auto_save:!0,save:async e=>{const t=await c.XO.post(C.s.setting_sys_option_status_save,{type:I.Mu.sys_env,value:{control_env_str:e}});t.code===d.m.Success?(q(e),(0,_.SK)(R("修改成功")),Q()):(0,_.zN)(`${t.message??R("保存失败")}`)}})}}),children:[R("网站标题"),(0,f.jsx)(r.Sm,{value:e,handleInputChange:e=>{t(e)}}),R("网站 Logo"),(0,f.jsx)(r.Sm,{placeholder:R("lclorur"),value:s,handleInputChange:e=>{a(e)}}),(0,f.jsx)("div",{children:R("pxy_url")}),(0,f.jsx)(r.Sm,{placeholder:"http://127.0.0.1:7890",value:j,handleInputChange:e=>{v(e)}}),R("lgn_usr"),(0,f.jsx)("input",{type:"checkbox",checked:m,onChange:()=>{x(!m)}})]}),(0,f.jsx)(X,{}),(0,f.jsx)(F,{})]}),(0,f.jsxs)(i.VP,{widthPer:33,children:[(0,f.jsxs)(o.Zp,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:R("文件回收站")})," ",(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{z({open:!0,title:R("信息"),context_div:(0,f.jsx)("div",{children:R("格式:[被删除的文件所在父目录] 回收站目录 [; ...]")})})},title:R("信息")})]}),rightBottomCom:(0,f.jsx)(l.C3,{text:R("确定修改"),clickFun:async()=>{if(g&&!S)return void(0,_.zN)(R("目录不能为空"));(await c.XO.post(C.s.setting_sys_option_status_save,{type:I.Mu.cyc,value:S,open:g})).code===d.m.Success&&(0,_.SK)(R("修改成功"))}}),children:[(0,f.jsx)(r.Sm,{placeholder:R("目录"),value:S,handleInputChange:e=>{A(e)}}),(0,f.jsx)(r.l6,{value:g,onChange:e=>{b(e)},options:[{title:R("开启"),value:!0},{title:R("关闭"),value:!1}]})]}),(0,f.jsxs)(o.Zp,{title:R("tk_exp"),rightBottomCom:(0,f.jsx)(u.S,{isFlex:!0,columns:[(0,f.jsx)(l.C3,{text:R("清空token"),clickFun:async()=>{(await c.XO.get("token/clear")).code===d.m.Success&&(0,_.SK)(R("清理完成,重新登录"))}}),(0,f.jsx)(l.C3,{text:R("保存"),clickFun:async()=>{const e=new I.Gd;e.mode=O,e.persist=T,I.aM.length!==e.mode||M||(0,_.zN)(R("秒数不能为空")),e.length=parseInt(M);(await c.XO.post("token/save",e)).code===d.m.Success&&(0,_.SK)(R("保存成功"))}})]}),children:[(0,f.jsx)(u.S,{isFlex:!0,columns:[(0,f.jsx)(r.U6,{value:1,context:R("关闭"),selected:O===I.aM.close,onchange:()=>{P(I.aM.close)}}),(0,f.jsx)(r.U6,{value:1,context:R("指定时间"),selected:O===I.aM.length,onchange:()=>{P(I.aM.length)}}),(0,f.jsx)(r.U6,{value:1,context:R("永不过期"),selected:O===I.aM.forver,onchange:()=>{P(I.aM.forver)}})]}),O===I.aM.length&&(0,f.jsx)(r.Sm,{placeholder:R("秒"),value:M,handleInputChange:e=>{D(e)}}),(0,f.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:6,marginTop:8,whiteSpace:"nowrap"},children:[(0,f.jsx)("input",{type:"checkbox",checked:T,onChange:()=>E(!T)}),R("持久化")]})]})]})]})})]})}var z=s(92350),B=s(69675),O=s(32361);const P=[{key:"second",min:0,max:59,label:"秒"},{key:"minute",min:0,max:59,label:"分"},{key:"hour",min:0,max:23,label:"时"},{key:"day",min:1,max:31,label:"日"},{key:"month",min:1,max:12,label:"月"},{key:"week",min:0,max:7,label:"星期"}];function T(e){switch(e.mode){case"step":return`*/${e.step??1}`;case"range":return`${e.from??0}-${e.to??0}`;case"list":return(e.values??[]).join(",");default:return"*"}}function E(e){return[T(e.second),T(e.minute),T(e.hour),T(e.day),T(e.month),T(e.week)].join(" ")}function M(e,t,s){const n=(e??"").trim();if(!n)return null;if("*"===n)return{mode:"every"};if(n.startsWith("*/")){const e=Number(n.slice(2));return!Number.isInteger(e)||e<=0?null:{mode:"step",step:e}}if(n.includes("-")&&!n.includes(",")){const[e,i]=n.split("-").map(Number);return Number.isInteger(e)&&Number.isInteger(i)?e<t||i>s||e>i?null:{mode:"range",from:e,to:i}:null}const i=n.split(","),a=[];for(const e of i){const n=Number(e.trim());if(!Number.isInteger(n)||n<t||n>s)return null;a.push(n)}return 0===a.length?null:{mode:"list",values:a}}function D(e){const t=(e??"").trim().split(/\s+/);if(6!==t.length)return null;const s={};for(let e=0;e<6;e++){const n=P[e],i=M(t[e],n.min,n.max);if(!i)return null;s[n.key]=i}return s}function G(e){return e<10?`0${e}`:`${e}`}function q(e,t,s){switch(e.mode){case"step":return`每 ${e.step} ${t}`;case"range":return`${e.from} 到 ${e.to} ${t}`;case"list":return`${(e.values??[]).slice().sort((e,t)=>e-t).join("、")} ${t}`;default:return null}}function R(e){const{second:t,minute:s,hour:n,day:i,month:a,week:o}=e,l=(e,t)=>"list"===e.mode&&1===(e.values??[]).length&&e.values[0]===t,r=[];if("list"===n.mode&&"list"===s.mode&&l(t,0)){const e=(n.values??[]).slice().sort((e,t)=>e-t),t=(s.values??[]).slice().sort((e,t)=>e-t);e.length===t.length&&e.length>1&&t.length>1?r.push(e.map((e,s)=>`${G(e)}:${G(t[s])}`).join("、")):1===e.length&&1===t.length?r.push(`${G(e[0])}:${G(t[0])}`):r.push(`${e.map(G).join("、")} 时 ${t.join("、")} 分`)}else if("list"===n.mode&&"step"===s.mode&&l(t,0))r.push(`${(n.values??[]).map(G).join("、")} 时内每 ${s.step} 分钟`);else if("every"===n.mode&&"list"===s.mode&&l(t,0))r.push(`每小时的 ${(s.values??[]).join("、")} 分`);else if("every"===n.mode&&"step"===s.mode&&l(t,0))r.push(`每 ${s.step} 分钟`);else if("every"===n.mode&&"every"===s.mode&&l(t,0))r.push("每分钟");else if("every"===n.mode&&"every"===s.mode&&"step"===t.mode)r.push(`每 ${t.step} 秒`);else if("every"===n.mode&&"every"===s.mode&&"every"===t.mode)r.push("每秒");else if("every"===n.mode&&"every"===s.mode&&"list"===t.mode)r.push(`每分钟的第 ${(t.values??[]).join("、")} 秒`);else{const e=[],i=q(n,"时"),a=q(s,"分"),o=l(t,0)?null:q(t,"秒");i&&e.push(i),a&&e.push(a),o&&e.push(o),e.length>0&&r.push(e.join(" "))}const c="list"===i.mode&&1===(i.values??[]).length?i.values[0]:null,d="list"===a.mode&&1===(a.values??[]).length?a.values[0]:null,u="list"===o.mode&&1===(o.values??[]).length?o.values[0]:null;let h="";if(null!==d&&null!==c)h=`每年 ${d} 月 ${c} 号`;else if(null!==d)h=`每年 ${d} 月`;else if(null!==c)h=`每月 ${c} 号`;else if(null!==u)h=`每${["周日","周一","周二","周三","周四","周五","周六","周日"][u]??`星期 ${u}`}`;else{const e=[];"every"!==a.mode&&e.push(q(a,"月")),"every"!==i.mode&&e.push(q(i,"号")),"every"!==o.mode&&e.push(`星期 ${q(o,"")}`),e.length&&(h=e.join(" "))}h||(h="每天");const p=r.join(",");return/^(每|每天)/.test(p)?`${p}${"每天"===h?"":","+h} 执行`:`${h} ${p} 执行`}const W=[{label:"任意 (*)",value:"every"},{label:"每隔 (*/n)",value:"step"},{label:"区间 (a-b)",value:"range"},{label:"指定 (a,b)",value:"list"}];function Z(e,t,s=!1){const n=[];for(let i=e;i<=t;i++)n.push({label:s?String(i).padStart(2,"0"):String(i),value:i});return n}const U=({label:e,field:t,min:s,max:i,pad:a,week_label:o,onChange:l})=>{const c=(0,n.useMemo)(()=>Z(s,i,a),[s,i,a]),d=(0,n.useMemo)(()=>{if(!o)return c;const e=["周日","周一","周二","周三","周四","周五","周六","周日"];return c.map(t=>({value:t.value,label:`${t.value} (${e[t.value]})`}))},[c,o]);return(0,f.jsxs)("div",{className:"cron-field",children:[(0,f.jsx)("span",{className:"cron-field__label",children:e}),(0,f.jsx)(r.l6,{value:t.mode,onChange:e=>{l("every"===e?{mode:"every"}:"step"===e?{mode:"step",step:t.step??1}:"range"===e?{mode:"range",from:t.from??s,to:t.to??i}:{mode:"list",values:t.values??[s]})},options:W,no_border:!0,width:"7.5rem"}),"step"===t.mode&&(0,f.jsxs)("div",{className:"cron-field__param",children:[(0,f.jsx)("span",{children:"每"}),(0,f.jsx)(r.l6,{value:t.step??1,onChange:e=>l({mode:"step",step:e}),options:Z(1,i),no_border:!0,width:"4.5rem"}),(0,f.jsx)("span",{children:e})]}),"range"===t.mode&&(0,f.jsxs)("div",{className:"cron-field__param",children:[(0,f.jsx)(r.l6,{value:t.from??s,onChange:e=>l({mode:"range",from:e,to:t.to??i}),options:d,no_border:!0,width:"6.5rem"}),(0,f.jsx)("span",{children:"到"}),(0,f.jsx)(r.l6,{value:t.to??i,onChange:e=>l({mode:"range",from:t.from??s,to:e}),options:d,no_border:!0,width:"6.5rem"})]}),"list"===t.mode&&(0,f.jsxs)("div",{className:"cron-field__param cron-field__param--list",children:[(t.values??[]).map((e,s)=>(0,f.jsxs)("span",{className:"cron-tag",children:[(0,f.jsx)(r.l6,{value:e,onChange:e=>((e,s)=>{const n=[...t.values??[]];n[e]=s,l({mode:"list",values:n})})(s,e),options:d,no_border:!0,width:"6.5rem"}),(0,f.jsx)("i",{className:"material-icons cron-tag__del",onClick:()=>(e=>{const s=(t.values??[]).filter((t,s)=>s!==e);l(s.length?{mode:"list",values:s}:{mode:"every"})})(s),children:"close"})]},s)),(0,f.jsx)("i",{className:"material-icons cron-tag__add",onClick:()=>{const e=[...t.values??[]],n=new Set(e);let a=s;for(;n.has(a)&&a<i;)a++;l({mode:"list",values:[...e,a]})},children:"add"})]})]})};const H=[{label:"每分钟",make:()=>({second:{mode:"every"},minute:{mode:"every"},hour:{mode:"every"},day:{mode:"every"},month:{mode:"every"},week:{mode:"every"},second:{mode:"list",values:[0]}})},{label:"每 5 分钟",make:()=>({second:{mode:"every"},minute:{mode:"every"},hour:{mode:"every"},day:{mode:"every"},month:{mode:"every"},week:{mode:"every"},minute:{mode:"step",step:5},second:{mode:"list",values:[0]}})},{label:"每小时",make:()=>({second:{mode:"every"},minute:{mode:"every"},hour:{mode:"every"},day:{mode:"every"},month:{mode:"every"},week:{mode:"every"},minute:{mode:"list",values:[0]},second:{mode:"list",values:[0]}})},{label:"每天 0 点",make:()=>({second:{mode:"every"},minute:{mode:"every"},hour:{mode:"every"},day:{mode:"every"},month:{mode:"every"},week:{mode:"every"},hour:{mode:"list",values:[0]},minute:{mode:"list",values:[0]},second:{mode:"list",values:[0]}})},{label:"每天 8 点",make:()=>({second:{mode:"every"},minute:{mode:"every"},hour:{mode:"every"},day:{mode:"every"},month:{mode:"every"},week:{mode:"every"},hour:{mode:"list",values:[8]},minute:{mode:"list",values:[0]},second:{mode:"list",values:[0]}})},{label:"每周一 0 点",make:()=>({second:{mode:"every"},minute:{mode:"every"},hour:{mode:"every"},day:{mode:"every"},month:{mode:"every"},week:{mode:"every"},hour:{mode:"list",values:[0]},minute:{mode:"list",values:[0]},second:{mode:"list",values:[0]},week:{mode:"list",values:[1]}})},{label:"每月 1 号 0 点",make:()=>({second:{mode:"every"},minute:{mode:"every"},hour:{mode:"every"},day:{mode:"every"},month:{mode:"every"},week:{mode:"every"},hour:{mode:"list",values:[0]},minute:{mode:"list",values:[0]},second:{mode:"list",values:[0]},day:{mode:"list",values:[1]}})}],J=({value:e,onChange:t,no_border:s})=>{const[i,a]=(0,n.useState)(!1),o=(0,n.useRef)(null),l=(0,n.useRef)(null),r=(0,n.useMemo)(()=>D(e??"")??{second:{mode:"every"},minute:{mode:"every"},hour:{mode:"every"},day:{mode:"every"},month:{mode:"every"},week:{mode:"every"}},[e]),c=!!e&&!D(e??""),d=(0,O.r)({active:i,trigger_ref:o,floating_ref:l,width:384,max_height:26});(0,B.$)(i,[o,l],()=>a(!1));const u=e=>{t(E(e))};return(0,f.jsxs)("div",{className:"cron-input "+(i?"cron-input--open":""),children:[(0,f.jsxs)("div",{ref:o,className:"cron-input__display "+(s?"cron-input__display--no-border":""),title:c?"表达式格式不正确":`${e||""} ${R(r)}`.trim(),onClick:()=>a(!i),children:[(0,f.jsx)("span",{className:"cron-input__expr "+(c?"cron-input__expr--invalid":""),children:e||"(未设置)"}),!s&&(0,f.jsx)("span",{className:"cron-input__desc",children:c?"表达式格式不正确":R(r)}),(0,f.jsx)("i",{className:"material-icons cron-input__arrow",children:"arrow_drop_down"})]}),i&&(0,f.jsxs)("div",{ref:l,className:"cron-editor",style:{left:d.left,top:d.top,...d.css_vars,visibility:d.ready?"visible":"hidden"},children:[(0,f.jsxs)("div",{className:"cron-editor__scroll",children:[(0,f.jsxs)("div",{className:"cron-editor__row",children:[(0,f.jsx)("span",{className:"cron-editor__title",children:"常用"}),(0,f.jsx)("div",{className:"cron-editor__presets",children:H.map(e=>(0,f.jsx)("button",{className:"cron-preset",onClick:()=>u(e.make()),children:e.label},e.label))})]}),(0,f.jsx)("div",{className:"cron-editor__fields",children:P.map(e=>(0,f.jsx)(U,{label:e.label,field:r[e.key],min:e.min,max:e.max,pad:"day"!==e.key&&"month"!==e.key&&"week"!==e.key,week_label:"week"===e.key,onChange:t=>{return s=e.key,n=t,void u({...r,[s]:n});var s,n}},e.key))})]}),(0,f.jsxs)("div",{className:"cron-editor__footer",children:[(0,f.jsx)("span",{className:"cron-editor__preview",children:E(r)}),(0,f.jsx)("button",{className:"cron-editor__done",onClick:()=>a(!1),children:"完成"})]})]})]})};function Q(){const{t:e,i18n:t}=(0,h.Bd)(),{initUserInfo:s,reloadUserInfo:a}=(0,n.useContext)($.F),[m,x]=(0,n.useState)([]),[j,g]=(0,n.useState)([]),[S,C]=(0,y.fp)(p.AG.prompt_card),[,k]=(0,y.fp)(p.AG.editorSetting),[A,I]=(0,n.useState)([]),[N,V]=(0,n.useState)([]),[X,F]=(0,n.useState)([]),[K,B]=(0,n.useState)([]),[O,P]=(0,n.useState)(""),[T,E]=(0,n.useState)([]),M=(0,b.K)(),D=[e("软件"),e("是否安装"),e("路径")],G=[e("编号"),e("路径"),e("备注")],q=[e("编号"),e("路径"),e("是否开启"),e("备注")],R=[e("编号"),e("文件路径"),e("是否开启"),e("系统启动执行"),e("cron表达式"),e("用户id"),e("备注")],W=[e("编号"),e("路径"),e("单用户并发数量"),e("系统并发数量"),e("big_res"),e("big_sz"),e("大文件并发数量"),e("big_ck"),e("备注")],Z=[e("编号"),e("名称"),e("路径"),e("是否开启"),e("params"),e("备注")],{check_user_auth:U}=(0,w.MH)(),H=async()=>{const e=await c.XO.get("env/path/get");e.code===d.m.Success&&F(e.data)},Q=async()=>{const e=await c.XO.get("workflow_setting_get");e.code===d.m.Success&&B(e.data)};(0,n.useEffect)(()=>{(async()=>{const e=await c.XO.get("outside/software/get");e.code===d.m.Success&&g(e.data);const t=await c.XO.get("pty_cmd");t.code===d.m.Success&&P(t.data),H(),Q();const s=await c.XO.get("protection_dir/sys");s.code===d.m.Success&&I(s.data??[]);const n=await c.XO.get("dir_upload_max_num");n.code===d.m.Success&&V(n.data??[]);const i=await c.XO.get("plugin/list");i.code===d.m.Success&&E(i.data??[])})()},[]);const L=(0,z.Q)(),Y=async()=>{await c.XO.post("plugin/list/save",T)};return(0,f.jsxs)(n.Fragment,{children:[(0,f.jsx)(i.J,{widthPer:100,maxWidth:"100rem",children:(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("up_conc")})," ",(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{L("文件上传")},title:e("信息")})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{V([...N,{path:"",note:"",user_upload_num:2,sys_upload_num:6,ws_file_standard_size:52428800,ws_file_parallel_num:2,ws_file_block_mb_size:524288}])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{for(const e of N)if(e.open_ws_file){if("number"!=typeof e.ws_file_block_mb_size)return void(0,_.zN)(`编号:${e.index??""} 文件块的大小设置有问题`);if("number"!=typeof e.ws_file_parallel_num)return void(0,_.zN)(`编号:${e.index??""} 并发数量设置有问题`);if("number"!=typeof e.ws_file_standard_size)return void(0,_.zN)(`编号:${e.index??""} 大文件size设置有问题`)}(0,v.di)(N,e=>e.index??0);(await c.XO.post("dir_upload_max_num/save",N)).code===d.m.Success&&((0,_.SK)(e("保存成功")),a())}})]}),children:(0,f.jsx)(u.X,{headers:W,rows:N.map((t,s)=>{const n=[(0,f.jsx)(r.Sm,{value:t.index,placeholder:s,handleInputChange:e=>{t.index=parseInt(e)},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.path,handleInputChange:e=>{t.path=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.user_upload_num,handleInputChange:e=>{t.user_upload_num=parseInt(e)},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.sys_upload_num,handleInputChange:e=>{t.sys_upload_num=parseInt(e)},no_border:!0}),(0,f.jsx)(r.l6,{value:!0===t.open_ws_file,onChange:e=>{t.open_ws_file=e,V([...N])},options:M,no_border:!0}),(0,f.jsx)(r.Sm,{value:"number"==typeof t.ws_file_standard_size?t.ws_file_standard_size/1024/1024:void 0,handleInputChange:e=>{t.ws_file_standard_size=1024*parseInt(e)*1024},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.ws_file_parallel_num,handleInputChange:e=>{t.ws_file_parallel_num=parseInt(e)},no_border:!0}),(0,f.jsx)(r.Sm,{value:"number"==typeof t.ws_file_block_mb_size?t.ws_file_block_mb_size/1024/1024:void 0,handleInputChange:e=>{t.ws_file_block_mb_size=1024*parseInt(e)*1024},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{N.splice(e,1),V([...N])})(s)})];return n}),width:"10rem",onRowDrag:(e,t)=>{V((0,v.TI)(N,e,t))}})})}),(0,f.jsx)(i.J,{widthPer:100,maxWidth:"100rem",children:(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("Workflow Job")}),(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{L("Workflow")},title:e("信息")})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{B([...K,{open:!1}])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{(await c.XO.post("workflow_setting_save",K)).code===d.m.Success&&((0,_.SK)("ok"),Q())}})]}),children:(0,f.jsx)(u.X,{headers:R,rows:K.map((t,s)=>{const n=[(0,f.jsx)("div",{children:s}),(0,f.jsx)(r.Sm,{value:t.file_path,handleInputChange:e=>{t.file_path=e},no_border:!0}),(0,f.jsx)(r.l6,{value:!!t.open,onChange:e=>{t.open=e,B([...K])},options:M,no_border:!0}),(0,f.jsx)(r.l6,{value:!!t.sys_power_on,onChange:e=>{t.sys_power_on=e,B([...K])},options:M,no_border:!0}),(0,f.jsx)(J,{value:t.cron_str,onChange:e=>{t.cron_str=e,B([...K])},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.user_id,handleInputChange:e=>{t.user_id=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{K.splice(e,1),B([...K])})(s)})];return n}),width:"10rem",onRowDrag:(e,t)=>{B((0,v.TI)(K,e,t))}})})}),(0,f.jsxs)(i.fI,{children:[(0,f.jsx)(i.VP,{widthPer:50,maxWidth:"50rem",children:(0,f.jsxs)(i.xh,{children:[(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("PATH")}),(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{L("环境路径")},title:e("信息")})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"list",title:e("查看"),onClick:async()=>{const t=await c.XO.get("env/process/view");t.code===d.m.Success?C({open:!0,title:e("进程环境变量"),context_div:(0,f.jsx)("pre",{style:{whiteSpace:"pre-wrap",wordBreak:"break-all",maxHeight:"60vh",overflow:"auto",margin:0,fontSize:"0.85rem",lineHeight:"1.5"},children:t.data})}):(0,_.zN)(e("获取失败"))}}),(0,f.jsx)(l.rA,{icon:"edit",title:e("编辑"),onClick:async()=>{const t=await c.XO.get("env/process/get");t.code===d.m.Success?(w.xK.set_value_temp(t.data??""),k({model:"ace/mode/ini",open:!0,fileName:"",save:async e=>{await c.XO.post("env/process/save",{text:e})}})):(0,_.zN)(e("获取失败"))}}),(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{F([...X,{path:"",note:""}])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{(await c.XO.post("env/path/save",{paths:X})).code===d.m.Success&&((0,_.SK)(e("保存成功")),H(),s())}})]}),children:(0,f.jsx)(u.X,{headers:q,rows:X.map((t,s)=>{const n=[(0,f.jsx)("div",{children:s}),(0,f.jsx)(r.Sm,{value:t.path,handleInputChange:e=>{t.path=e},no_border:!0}),(0,f.jsx)(r.l6,{value:!!t.open,onChange:e=>{t.open=e,F([...X])},options:M,no_border:!0}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{X.splice(e,1),F([...X])})(s)})];return n}),width:"10rem",onRowDrag:(e,t)=>{F((0,v.TI)(X,e,t))}})}),(0,f.jsx)(o.Zp,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("PTY CMD")}),(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{L("pty")},title:e("信息")})]}),rightBottomCom:(0,f.jsx)(l.C3,{text:e("更新"),clickFun:async()=>{(await c.XO.post("pty_cmd/save",{str:O})).code===d.m.Success&&((0,_.SK)(e("保存成功")),a())}}),children:(0,f.jsx)(r.Sm,{placeholder:e("cmd need pty env"),value:O,handleInputChange:e=>{P(e)}})}),(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("插件配置")}),(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{L("插件配置")},title:e("信息")})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{E([...T,{name:"",path:"",note:"",open:!1}])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:Y})]}),children:(0,f.jsx)(u.X,{headers:Z,rows:T.map((t,s)=>{const n=[s,(0,f.jsx)(r.Sm,{value:t.name,handleInputChange:e=>{t.name=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.path,handleInputChange:e=>{t.path=e},no_border:!0}),(0,f.jsx)(r.l6,{value:!!t.open,onChange:e=>{t.open=e,E([...T])},options:M,no_border:!0}),(0,f.jsx)(l.mu,{icon:"edit",value:t.params,save:async e=>{t.params=e,await Y()},title:""}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{T.splice(e,1),E([...T])})(s)})];return n}),width:"10rem",onRowDrag:(e,t)=>{E((0,v.TI)(T,e,t))}})})]})}),(0,f.jsx)(i.VP,{widthPer:50,maxWidth:"50rem",children:(0,f.jsxs)(i.xh,{children:[(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("系统保护路径")})," ",(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{L("保护目录")},title:e("信息")})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{I([...A,{path:"",note:""}])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{(await c.XO.post("protection_dir/sys/save",A)).code===d.m.Success&&((0,_.SK)(e("保存成功")),a())}})]}),children:(0,f.jsx)(u.X,{headers:G,rows:A.map((t,s)=>{const n=[(0,f.jsx)("div",{children:s}),(0,f.jsx)(r.Sm,{value:t.path,handleInputChange:e=>{t.path=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{A.splice(e,1),I([...A])})(s)})];return n}),width:"10rem",onRowDrag:(e,t)=>{I((0,v.TI)(A,e,t))}})}),(0,f.jsx)(o.uF,{title:e("外部软件"),rightTopCom:(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{(await c.XO.post("outside/software/save",j)).code===d.m.Success&&((0,_.SK)(e("保存成功")),s())}}),children:(0,f.jsx)(u.X,{headers:D,rows:j.map((t,s)=>[(0,f.jsx)("div",{children:t.id}),(0,f.jsx)(o.fq,{ok:t.installed}),(0,f.jsx)(r.Sm,{value:t.path,handleInputChange:e=>{t.path=e},no_border:!0,placeholder:e("use_env")}),(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{L(t.id)},title:e("信息")})]),width:"10rem"})})]})})]})]})}function L(e){const{t,i18n:s}=(0,h.Bd)(),[i,o]=(0,y.fp)(p.AG.user_base_info),l=[{title:t("用户权限"),list:[{title:t("用户管理"),permission:a.oV.user_manage},{title:t("角色管理"),permission:a.oV.role_manage}]},{title:t("系统管理权限"),list:[{title:t("系统信息"),permission:a.oV.all_sys},{title:t("系统进程关闭"),permission:a.oV.sys_process_close},{title:t("dc_ctdl"),permission:a.oV.docker_container_update},{title:t("dc_idl"),permission:a.oV.docker_images_delete},{title:t("systemd管理"),permission:a.oV.systemd},{title:t("防火墙管理"),permission:a.oV.firewall}]},{title:t("网络功能权限"),list:[{title:t("系统网络"),permission:a.oV.vir_net},{title:t("内网穿透"),permission:a.oV.tcp_proxy},{title:"ddns",permission:a.oV.ddns}]},{title:t("Ai 设置权限"),list:[{title:t("Ai 配置"),permission:a.oV.ai_agent_setting},{title:t("ai_page"),permission:a.oV.ai_agent_page},{title:t("sw_mdl"),permission:a.oV.ai_model_switch}]},{title:t("文件权限"),list:[{title:t("log_del"),permission:a.oV.filecat_file_delete_cut_rename},{title:t("log_wr"),permission:a.oV.filecat_file_context_update_upload_created_copy_decompression},{title:t("内容更新"),permission:a.oV.filecat_file_context_update},{title:t("文件回收站修改"),permission:a.oV.recycle_file_save},{title:t("文件分享"),permission:a.oV.share_file}]},{title:t("系统设置权限"),list:[{title:t("系统页面"),permission:a.oV.sys_setting_page},{title:t("tk_time"),permission:a.oV.token_update},{title:t("修改密码"),permission:a.oV.update_password},{title:t("磁盘挂载"),permission:a.oV.sys_disk_mount},{title:t("通用设置"),permission:a.oV.sys_env_setting_key},{title:t("md_set"),permission:a.oV.md_editor_setting},{title:t("目录挂载"),permission:a.oV.file_mount}]},{title:t("系统环境设置"),list:[{title:t("sys_env"),permission:a.oV.sys_env_page},{title:t("up_lim"),permission:a.oV.dir_upload_max_num},{title:t("path_md"),permission:a.oV.env_path_update},{title:"pty cmd "+t("更新"),permission:a.oV.pty_cmd_update},{title:"workflow job",permission:a.oV.workflow_job},{title:t("path_up"),permission:a.oV.sys_protection_dir},{title:t("外部软件路径"),permission:a.oV.outside_software_path}]},{title:t("个人环境设置"),list:[{title:t("个性化设置"),permission:a.oV.private_sys_env}]},{title:t("自定义路由"),list:[{title:t("自定义路由页面"),permission:a.oV.auth_router_page},{title:t("wf_api"),permission:a.oV.workflow_api},{title:t("自定义资源路由"),permission:a.oV.code_resource},{title:t("api_rt"),permission:a.oV.code_api}]},{title:t("标签编辑权限"),list:[{title:t("ssh代理"),permission:a.oV.ssh_proxy_tag_update},{title:t("http代理"),permission:a.oV.http_proxy_tag_update},{title:t("浏览器代理"),permission:a.oV.browser_proxy_tag_update},{title:t("rdp代理"),permission:a.oV.rdp_proxy_tag_update},{title:t("网络唤醒"),permission:a.oV.wol_proxy_tag_update},{title:t("rtsp播放器"),permission:a.oV.rtsp_proxy_tag_update}]},{title:t("代理功能"),list:[{title:t("ssh代理"),permission:a.oV.ssh_proxy},{title:t("http代理"),permission:a.oV.http_proxy},{title:t("pxy_off"),permission:a.oV.http_proxy_download_cancel},{title:t("浏览器代理"),permission:a.oV.browser_proxy},{title:t("浏览器代理编辑"),permission:a.oV.browser_proxy_edit},{title:t("rdp代理"),permission:a.oV.rdp_proxy}]},{title:t("其他功能"),list:[{title:t("wf_run"),permission:a.oV.workflow_exe},{title:t("wf_user"),permission:a.oV.workflow_exe_user,noDisable:!0},{title:t("网络唤醒"),permission:a.oV.wol_proxy},{title:t("端口扫描"),permission:a.oV.port_scan},{title:t("rtsp播放器"),permission:a.oV.rtsp_proxy},{title:t("ssh_sv"),permission:a.oV.crypto_ssh_file},{title:t("cmd_rst"),permission:a.oV.shell_cmd_filecat_restart},{title:t("cmd_upg"),permission:a.oV.shell_cmd_filecat_upgrade},{title:t("cmd_dwn"),permission:a.oV.shell_cmd_filecat_kill_self},{title:t("cmd_ai"),permission:a.oV.ai_chat_cmd}]}];return(0,f.jsx)(n.Fragment,{children:l.map((t,s)=>(0,f.jsxs)("div",{children:[(0,f.jsx)("h3",{children:t.title}),t.list.map((t,s)=>(0,f.jsxs)("div",{children:[(0,f.jsx)("input",{type:"checkbox",disabled:!t.noDisable&&e.is_disable(t.permission),checked:e.is_selected(t.permission,t.noDisable),onChange:()=>{e.select_auth(t.permission)}}),t.title]},s))]},s))})}const Y=new Map;function ee(){const{t:e,i18n:t}=(0,h.Bd)(),{initUserInfo:s,reloadUserInfo:m}=(0,n.useContext)($.F),[j,g]=(0,y.fp)(p.AG.user_base_info),[w,b]=(0,n.useState)([]),[S,C]=(0,y.fp)(p.AG.prompt_card),[k,A]=(0,n.useState)(!1),[I,N]=(0,n.useState)(!1),[V,X]=(0,y.fp)(p.AG.confirm),[F,K]=(0,n.useState)(""),[B,O]=(0,n.useState)(""),[P,T]=(0,n.useState)(""),[E,M]=(0,n.useState)([]),[D,G]=(0,n.useState)([]),[q,R]=(0,n.useState)([]),[W,Z]=(0,n.useState)(""),[U,H]=(0,n.useState)(""),[J,Q]=(0,n.useState)("en"),[ee,te]=(0,n.useState)(""),[se,ne]=(0,n.useState)([]),[ie,ae]=(0,n.useState)(""),[oe,le]=(0,n.useState)(!1),[re,ce]=(0,n.useState)(""),[de,ue]=(0,n.useState)(""),[he,pe]=(0,n.useState)({}),me=(0,z.o)(),[_e,xe]=(0,n.useState)([]),[je,ve]=(0,n.useState)(void 0),fe=[e("用户id"),e("用户名"),e("目录范围"),e("备注")],ge=async()=>{const e=await c.wm.get("all_users");if(e.code===d.m.Success){const t=e.data??[];if(je){const e=[];for(const s of t)`${s.id}${s.username}${s.cwd}${s.note}`.includes(je)&&e.push(s);b(e)}else b(t)}const t=await c.wm.get("all_roles");if(t.code===d.m.Success){xe(t.data),Y.clear();for(const e of t.data)Y.set(e.role_id,e)}},ye=e=>{K(e?.username??""),O(e?.password??""),T(e?.cwd??""),M(e?.access_dirs??[]),G(e?.not_access_dirs??[]),R(e?.only_read_dirs??[]),Z(e?.access_cmd??""),H(e?.not_access_cmd??""),Q(e?.language??""),te(e?.theme??""),ne(e?.auth_list??[]),ae(e?.note??""),le(e?.is_root??!1),ce(e?.id??""),e?.bind_role_id?we(e.bind_role_id,e.auth_list??[]):(ue(""),pe({}))};(0,n.useEffect)(()=>{ge()},[]);const we=(e,t=[])=>{if(!e)return ue(""),void pe({});const s=Y.get(e);if(s){if(s.cwd&&T(s.cwd),s.access_dirs&&s.access_dirs.length>0&&M(s.access_dirs),s.not_access_dirs&&s.not_access_dirs.length>0&&G(s.not_access_dirs),s.only_read_dirs&&s.only_read_dirs.length>0&&R(s.only_read_dirs),s.access_cmd&&Z(s.access_cmd),s.not_access_cmd&&H(s.not_access_cmd),s.language&&Q(s.language),s.theme&&te(s.theme),s.auth_list&&s.auth_list.length>0){const e=new Set(s.auth_list);for(const s of t)e.add(s);ne(Array.from(e))}ue(e),pe(s)}},be=()=>{if(!F)return void(0,_.zN)("username not empty");if((0,x.CB)(F))return void(0,_.zN)("username not empty char");if(!P)return void(0,_.zN)("cwd not empty");const e=new a.E0;return e.language=J,e.theme=ee,e.access_dirs=E,e.username=F,e.password=B,e.not_access_dirs=D,e.only_read_dirs=q,e.cwd=P,e.note=ie,e.access_cmd=W,e.not_access_cmd=U,e.auth_list=se,e.bind_role_id=de,e};return(0,f.jsxs)(i.fI,{children:[(0,f.jsx)(i.VP,{widthPer:50,maxWidth:"40rem",children:(0,f.jsx)(i.xh,{children:(0,f.jsx)(o.uF,{self_title:(0,f.jsx)("span",{className:" div-row ",children:(0,f.jsx)("h2",{children:e("用户")})}),rightTopCom:(0,f.jsxs)("div",{className:"div-row",style:{gap:"0.5rem"},children:[(0,f.jsx)(r.Sm,{placeholder:e("过滤"),value:je,handleInputChange:e=>{ve(e)},handlerEnter:()=>{ge()}}),(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{A(!0),N(!1),ye(void 0)}})]}),children:(0,f.jsx)(u.X,{headers:fe,rows:w.map((t,s)=>{const n=[(0,f.jsx)("p",{children:t.id}),(0,f.jsx)(o.xP,{children:t.username}),(0,f.jsx)(o.xP,{children:t.cwd}),(0,f.jsx)(o.xP,{children:t.note}),(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"edit",title:e("编辑"),onClick:()=>(e=>{A(!1),N(!0),ye(e)})(t)}),!t.is_root&&(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(async t=>{X({open:!0,title:e("确定删除吗"),handle:async()=>{const s=new a.E0;s.username=t,(await c.wm.post("delete_user",s)).code===d.m.Success&&((0,_.SK)(e("删除完成")),ge(),X({open:!1,handle:null}))}})})(t.username)})]})];return n}),width:"10rem"})})})}),(0,f.jsx)(i.VP,{widthPer:50,maxWidth:"40rem",children:(k||I)&&(0,f.jsx)(i.xh,{children:(0,f.jsxs)(o.Zp,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e(""+(k?"添加":"编辑"))})," "]}),rightBottomCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"cancel",title:e("取消"),onClick:()=>{A(!1),N(!1),ye(void 0)}}),k&&(0,f.jsx)(l.rA,{icon:"add_circle",title:e("添加"),onClick:async()=>{if(!B)return void(0,_.zN)("password not empty");if((0,x.CB)(B))return void(0,_.zN)("username not empty char");const t=be(),s=await c.wm.post("create_user",t);ge(),s.code===d.m.Success&&((0,_.SK)(e("创建完成")),ge(),A(!1),N(!1),ye(void 0))}}),I&&(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{const t=be();if(!t)return;t.id=re;(await c.wm.post("save_user",t)).code===d.m.Success&&((0,_.SK)(e("保存完成")),ge())}})]}),children:[(0,f.jsx)("label",{children:e("用户名")}),(0,f.jsx)(r.Sm,{value:F,handleInputChange:e=>K(e)}),(0,f.jsx)("label",{children:e("密码")}),(0,f.jsx)(r.Sm,{type:"password",value:B,handleInputChange:e=>O(e)}),(0,f.jsxs)("label",{children:[!he?.access_dirs?.length&&(0,f.jsx)(l.rA,{icon:"add",onClick:()=>{M([...E,""])},title:"添加"}),e("目录范围")]}),(0,f.jsx)(r.Sm,{disabled:""!==he.cwd&&void 0!==he.cwd,value:P,handleInputChange:e=>T(e)}),(E??[]).map((t,s)=>(0,f.jsxs)("div",{style:{display:"flex"},children:[(0,f.jsx)("div",{style:{width:"90%"},children:(0,f.jsx)(r.Sm,{disabled:0!==he?.access_dirs?.length&&void 0!==he?.access_dirs?.length,value:t,handleInputChange:e=>{E[s]=e,M([...E])}})}),0===he?.access_dirs?.length||void 0===he?.access_dirs?.length&&(0,f.jsx)(l.rA,{icon:"delete",onClick:()=>{E.splice(s,1),M([...E])},title:e("删除")})]},s)),(0,f.jsxs)("label",{children:[!he?.not_access_dirs?.length&&(0,f.jsx)(l.rA,{icon:"add",onClick:()=>{G([...D,""])},title:e("添加")}),e("禁止目录范围")]}),(D??[]).map((t,s)=>(0,f.jsxs)("div",{style:{display:"flex"},children:[(0,f.jsx)("div",{style:{width:"90%"},children:(0,f.jsx)(r.Sm,{disabled:0!==he?.not_access_dirs?.length&&void 0!==he?.not_access_dirs?.length,value:t,handleInputChange:e=>{D[s]=e,G([...D])}})}),0===he?.not_access_dirs?.length||void 0===he?.not_access_dirs?.length&&(0,f.jsx)(l.rA,{icon:"delete",onClick:()=>{D.splice(s,1),G([...D])},title:e("删除")})]},s)),(0,f.jsxs)("label",{children:[!he?.only_read_dirs?.length&&(0,f.jsx)(l.rA,{icon:"add",onClick:()=>{R([...q,""])},title:e("添加")}),e("只读目录范围")]}),(q??[]).map((t,s)=>(0,f.jsxs)("div",{style:{display:"flex"},children:[(0,f.jsx)("div",{style:{width:"90%"},children:(0,f.jsx)(r.Sm,{disabled:0!==he?.only_read_dirs?.length&&void 0!==he?.only_read_dirs?.length,value:t,handleInputChange:e=>{q[s]=e,R([...q])}})}),0===he?.only_read_dirs?.length||void 0===he?.only_read_dirs?.length&&(0,f.jsx)(l.rA,{icon:"delete",onClick:()=>{q.splice(s,1),R([...q])},title:e("删除")})]},s)),(0,f.jsx)("label",{children:e("可执行的命令")}),(0,f.jsx)(r.Sm,{disabled:""!==he.access_cmd&&void 0!==he.access_cmd,value:W,placeholder:"use blank split",handleInputChange:e=>Z(e)}),(0,f.jsx)("label",{children:e("禁止执行的命令")}),(0,f.jsx)(r.Sm,{disabled:""!==he.not_access_cmd&&void 0!==he.not_access_cmd,value:U,placeholder:"use blank split",handleInputChange:e=>H(e)}),!oe&&(0,f.jsxs)(n.Fragment,{children:[(0,f.jsx)("label",{children:e("角色")}),(0,f.jsx)(r.l6,{value:de,onChange:e=>{we(e)},options:(()=>{const e=[];e.push({title:"NOT",value:""});for(let t of _e)e.push({title:t.role_name,value:t.role_id});return e})()})]}),(0,f.jsx)("label",{children:e("语言")}),(0,f.jsx)(r.l6,{disabled:""!==he.language&&void 0!==he.language,value:J,onChange:e=>{Q(e)},options:[{title:e("跟随系统"),value:"sys"},{title:"English",value:"en"},{title:"中文",value:"zh"}]}),(0,f.jsx)("label",{children:e("主题")}),(0,f.jsx)(r.l6,{disabled:""!==he.theme&&void 0!==he.theme,value:ee,onChange:e=>{te(e)},options:me}),(0,f.jsx)(L,{is_disable:e=>{if(!0===oe)return!0;if(de){const t=Y.get(de);if(t)return(t.auth_list??[]).includes(e)}return!1},is_selected:(e,t)=>!t&&!0===oe||void 0!==se?.find(t=>t===e),select_auth:e=>{se?se.includes(e)?((0,v.I)(se,t=>t===e),ne([...se])):ne([...se,e]):ne([e])}}),(0,f.jsx)("label",{children:e("备注")}),(0,f.jsx)(r.Sm,{value:ie,handleInputChange:e=>ae(e)})]})})})]})}function te(){const{t:e,i18n:t}=(0,h.Bd)(),{initUserInfo:s}=(0,n.useContext)($.F),[m,x]=(0,n.useState)([]),[j,g]=(0,y.fp)(p.AG.prompt_card),[w,b]=(0,n.useState)(!1),[S,C]=(0,n.useState)(!1),[k,A]=(0,y.fp)(p.AG.confirm),[I,N]=(0,n.useState)(""),[V,X]=(0,n.useState)(""),[F,K]=(0,n.useState)([]),[B,O]=(0,n.useState)([]),[P,T]=(0,n.useState)([]),[E,M]=(0,n.useState)(""),[D,G]=(0,n.useState)(""),[q,R]=(0,n.useState)(""),[W,Z]=(0,n.useState)(""),[U,H]=(0,n.useState)([]),[J,Q]=(0,n.useState)(""),[Y,ee]=(0,n.useState)(""),te=(0,z.o)(),se=[e("角色id"),e("角色名"),e("备注")],ne=async()=>{const e=await c.wm.get("all_roles");e.code===d.m.Success&&x(e.data)},ie=e=>{N(e?.role_name??""),X(e?.cwd??""),K(e?.access_dirs??[]),O(e?.not_access_dirs??[]),T(e?.only_read_dirs??[]),M(e?.access_cmd??""),G(e?.not_access_cmd??""),R(e?.language??""),Z(e?.theme??""),H(e?.auth_list??[]),Q(e?.role_id??""),ee(e?.role_note??"")};(0,n.useEffect)(()=>{ne()},[]);const ae=()=>{if(!I)return void(0,_.zN)("role_name not empty");const e=new a.E0;return e.language=q,e.theme=W,e.access_dirs=F,e.role_name=I,e.not_access_dirs=B,e.only_read_dirs=P,e.cwd=V,e.access_cmd=E,e.not_access_cmd=D,e.auth_list=U,e.role_note=Y,e};return(0,f.jsxs)(i.fI,{children:[(0,f.jsx)(i.VP,{widthPer:50,maxWidth:"40rem",children:(0,f.jsx)(i.xh,{children:(0,f.jsx)(o.uF,{self_title:(0,f.jsx)("span",{className:" div-row ",children:(0,f.jsx)("h2",{children:e("角色")})}),rightTopCom:(0,f.jsx)("div",{children:(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{b(!0),C(!1),ie(void 0)}})}),children:(0,f.jsx)(u.X,{headers:se,rows:m.map((t,s)=>{const n=[(0,f.jsx)("p",{children:t.role_id}),(0,f.jsx)(o.xP,{children:t.role_name}),(0,f.jsx)(o.xP,{children:t.role_note}),(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"edit",title:e("编辑"),onClick:()=>(e=>{b(!1),C(!0),ie(e)})(t)}),!t.is_root&&(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(async t=>{A({open:!0,title:e("确定删除吗"),handle:async()=>{const s=new a.E0;s.role_id=t,(await c.wm.post("delete_role",s)).code===d.m.Success&&((0,_.SK)(e("删除完成")),ne(),A({open:!1,handle:null}))}})})(t.role_id)})]})];return n}),width:"10rem"})})})}),(0,f.jsx)(i.VP,{widthPer:50,maxWidth:"40rem",children:(w||S)&&(0,f.jsx)(i.xh,{children:(0,f.jsxs)(o.Zp,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e(""+(w?"添加":"编辑"))})," "]}),rightBottomCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"cancel",title:e("取消"),onClick:()=>{b(!1),C(!1),ie(void 0)}}),w&&(0,f.jsx)(l.rA,{icon:"add_circle",title:e("添加"),onClick:async()=>{const t=ae();if(!t)return;const s=await c.wm.post("create_role",t);ne(),s.code===d.m.Success&&((0,_.SK)(e("创建完成")),ne(),b(!1),C(!1),ie(void 0))}}),S&&(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{const t=ae();if(!t)return;t.role_id=J;(await c.wm.post("save_role",t)).code===d.m.Success&&((0,_.SK)(e("保存完成")),ne())}})]}),children:[(0,f.jsx)("label",{children:e("角色名")}),(0,f.jsx)(r.Sm,{value:I,handleInputChange:e=>N(e)}),(0,f.jsx)("label",{children:e("角色备注")}),(0,f.jsx)(r.Sm,{value:Y,handleInputChange:e=>ee(e)}),(0,f.jsxs)("label",{children:[(0,f.jsx)(l.rA,{icon:"add",onClick:()=>{K([...F,""])},title:"添加"}),e("目录范围")]}),(0,f.jsx)(r.Sm,{value:V,handleInputChange:e=>X(e)}),(F??[]).map((e,t)=>(0,f.jsxs)("div",{style:{display:"flex"},children:[(0,f.jsx)("div",{style:{width:"90%"},children:(0,f.jsx)(r.Sm,{value:e,handleInputChange:e=>{F[t]=e,K([...F])}})}),(0,f.jsx)(l.rA,{icon:"delete",onClick:()=>{F.splice(t,1),K([...F])},title:"删除"})]},t)),(0,f.jsxs)("label",{children:[(0,f.jsx)(l.rA,{icon:"add",onClick:()=>{O([...B,""])},title:"添加"}),e("禁止目录范围")]}),(B??[]).map((t,s)=>(0,f.jsxs)("div",{style:{display:"flex"},children:[(0,f.jsx)("div",{style:{width:"90%"},children:(0,f.jsx)(r.Sm,{value:t,handleInputChange:e=>{B[s]=e,O([...B])}})}),(0,f.jsx)(l.rA,{icon:"delete",onClick:()=>{B.splice(s,1),O([...B])},title:e("删除")})]},s)),(0,f.jsxs)("label",{children:[(0,f.jsx)(l.rA,{icon:"add",onClick:()=>{T([...P,""])},title:e("添加")}),e("只读目录范围")]}),(P??[]).map((e,t)=>(0,f.jsxs)("div",{style:{display:"flex"},children:[(0,f.jsx)("div",{style:{width:"90%"},children:(0,f.jsx)(r.Sm,{value:e,handleInputChange:e=>{P[t]=e,T([...P])}})}),(0,f.jsx)(l.rA,{icon:"delete",onClick:()=>{P.splice(t,1),T([...P])},title:"删除"})]},t)),(0,f.jsx)("label",{children:e("可执行的命令")}),(0,f.jsx)(r.Sm,{value:E,placeholder:"use blank split",handleInputChange:e=>M(e)}),(0,f.jsx)("label",{children:e("禁止执行的命令")}),(0,f.jsx)(r.Sm,{value:D,placeholder:"use blank split",handleInputChange:e=>G(e)}),(0,f.jsx)("label",{children:e("语言")}),(0,f.jsx)(r.l6,{value:q,onChange:e=>{R(e)},options:[{title:e("跟随系统"),value:"sys"},{title:"NOT",value:""},{title:"English",value:"en"},{title:"中文",value:"zh"}]}),(0,f.jsx)("label",{children:e("主题")}),(0,f.jsx)(r.l6,{value:W,onChange:e=>{Z(e)},options:te}),(0,f.jsx)(L,{is_disable:()=>!1,is_selected:(e,t)=>void 0!==U?.find(t=>t===e),select_auth:e=>{U?(U.find(t=>t==e)?(0,v.I)(U,t=>t===e):U.push(e),H([...U])):H([e])}})]})})})]})}var se=s(93245);function ne(e){const{t}=(0,h.Bd)(),[s,i]=(0,n.useState)((e.children_list??[]).map(e=>({path:e.path,note:e.note}))),a=[t("编号"),t("目录"),t("备注")],c=()=>{i([...s,{path:"",note:""}])};(0,n.useEffect)(()=>{s?.length||c()});return(0,f.jsx)(o.uF,{self_title:(0,f.jsx)("span",{className:" div-row ",children:(0,f.jsx)("h2",{children:t("sub_dir")})}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:t("添加"),onClick:c}),(0,f.jsx)(l.rA,{icon:"save",title:t("保存"),onClick:()=>{e.on_confirm(s.filter(e=>e.path))}}),(0,f.jsx)(l.rA,{icon:"close",title:t("取消"),onClick:e.on_cancel})]}),children:(0,f.jsx)(u.X,{headers:a,rows:s.map((e,n)=>[(0,f.jsx)("span",{children:n}),(0,f.jsx)(r.Sm,{value:e.path,handleInputChange:t=>{e.path=t},no_border:!0}),(0,f.jsx)(r.Sm,{value:e.note,handleInputChange:t=>{e.note=t},no_border:!0}),(0,f.jsx)("div",{children:(0,f.jsx)(l.rA,{icon:"delete",title:t("删除"),onClick:()=>{i(s.filter((e,t)=>t!==n))}})})]),width:"10rem"})})}function ie(){const{t:e,i18n:t}=(0,h.Bd)(),{initUserInfo:s,reloadUserInfo:m}=(0,n.useContext)($.F),[x,j]=(0,n.useState)([]),[g,w]=(0,y.fp)(p.AG.prompt_card),[S,k]=(0,n.useState)([]),[A,N]=(0,n.useState)([]),[V,X]=(0,n.useState)([]),[F,K]=(0,y.fp)(p.AG.user_base_info),B=(0,b.K)(),O=(0,z.o)(),P=[e("编号"),e("路径"),e("是否默认"),e("备注"),e("sub_dir")],T=[e("编号"),e("路径"),e("备注")],E=[e("编号"),e("命令"),e("父编号"),e("备注")],M=[e("文件后缀"),e("命令"),e("其他参数"),e("备注")],[D,G]=(0,n.useState)(""),[q,R]=(0,n.useState)(""),[W,Z]=(0,n.useState)(""),[U,H]=(0,n.useState)(!1),[J,Q]=(0,n.useState)(""),[L,Y]=(0,n.useState)(""),[ee,te]=(0,n.useState)(""),[ie,ae]=(0,n.useState)(!1),[oe,le]=(0,n.useState)(""),[re,ce]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{const e=await c.XO.get("filesSetting");e.code===d.m.Success&&(j(e.data.dirs),N(e.data.quick_cmd),X(e.data.file_quick_cmd));const t=await c.XO.get("protection_dir");t.code===d.m.Success&&k(t.data??[])})(),Q(F?.user_data?.language),Y(F?.user_data?.theme),te(F?.user_data?.upload_file_ignore);const e=F?.user_data?.editor_auto_save;ae(!!e?.enable),le(null!=e?.interval?String(e.interval):""),ce(e?.editors??[])},[]);const de=(0,z.Q)();return(0,f.jsx)(n.Fragment,{children:(0,f.jsxs)(i.fI,{children:[(0,f.jsxs)(i.VP,{widthPer:33,children:[(0,f.jsx)(i.xh,{children:(0,f.jsxs)(o.Zp,{title:e("修改密码"),rightBottomCom:(0,f.jsx)(l.C3,{text:e("确定修改"),clickFun:async()=>{if(!D||!q)return void(0,_.zN)(e("账号密码不能为空"));if(q!==W)return void(0,_.zN)(e("两次密码不一样"));const t=new a.tl;t.username=D,t.password=q,t.confirm_password=W,t.user_id=F.user_data.id;(await c.wm.post("updatePassword",t)).code===d.m.Success&&(0,_.SK)(e("修改成功"))}}),children:[(0,f.jsx)(r.Sm,{placeholder:e("新账号"),value:D,handleInputChange:e=>{G(e)}}),(0,f.jsx)(r.cA,{placeholder:e("新密码"),handleInputChange:e=>{R(e)}}),(0,f.jsx)(r.cA,{placeholder:e("确认密码"),handleInputChange:e=>{Z(e)}})]})}),(0,f.jsx)(i.xh,{children:(0,f.jsxs)(o.Zp,{title:e("个性化设置"),rightBottomCom:(0,f.jsx)(l.C3,{text:e("确定修改"),clickFun:async()=>{(await c.XO.post(C.s.setting_sys_option_status_save,{type:I.Mu.private_sys_env,value:{language:J,theme:L,upload_file_ignore:ee}})).code===d.m.Success&&((0,_.SK)(e("修改成功")),s())}}),children:[e("语言"),(0,f.jsx)(r.l6,{value:J,onChange:e=>{Q(e)},options:[{title:e("跟随系统"),value:"sys"},{title:"English",value:"en"},{title:"中文",value:"zh"},{title:"Deutsch",value:"de"},{title:"ドイツ語",value:"ja"},{title:"독일어",value:"ko"},{title:"Немецкий язык",value:"ru"},{title:"Allemand",value:"fr"},{title:"Alemán",value:"es"}]}),e("主题"),(0,f.jsx)(r.l6,{value:L,onChange:e=>{Y(e)},options:O}),(0,f.jsx)(r.Sm,{value:ee,handleInputChange:e=>{te(e)},placeholderOut:e("拖拽文件上传忽略列表"),placeholder:"node_modules *.js",no_border:!0})]})}),(0,f.jsx)(i.xh,{children:(0,f.jsxs)(o.Zp,{title:e("编辑器自动保存"),rightBottomCom:(0,f.jsx)(l.C3,{text:e("确定修改"),clickFun:async()=>{const t=parseInt(String(oe),10);if(isNaN(t)||t<1)return void(0,_.zN)(e("请输入不小于 1 的整数(秒)"));(await c.wm.post(C.s.user_save_private_attr,{is_editor_auto_save:!0,editor_auto_save:{enable:ie,interval:t,editors:re}})).code===d.m.Success&&((0,_.SK)(e("修改成功")),s())}}),children:[(0,f.jsx)(r.BC,{label:e("开启"),children:(0,f.jsx)(r.l6,{value:ie,onChange:e=>{ae(e)},options:B,no_border:!0})}),(0,f.jsx)(r.BC,{label:e("自动保存间隔(秒)"),children:(0,f.jsx)(r.Sm,{type:"number",value:oe,handleInputChange:e=>{le(e)},placeholder:"30",no_border:!0})}),(0,f.jsx)("h3",{children:e("编辑器")}),se.d.map(t=>(0,f.jsxs)("div",{children:[(0,f.jsx)("input",{type:"checkbox",checked:re.includes(t.id),onChange:e=>{const s=e.target.checked;ce(s?[...re,t.id]:re.filter(e=>e!==t.id))}}),e(t.label)]},t.id))]})})]}),(0,f.jsxs)(i.VP,{children:[(0,f.jsxs)(i.xh,{children:[(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("文件夹路径")})," ",(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{de("文件夹路径")},title:e("信息")})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{j([...x,{note:"",default:!1,path:""}])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{for(let e=0;e<x.length;e++)x[e].index=e;(await c.XO.post("filesSetting/save",{dirs:x})).code===d.m.Success&&((0,_.SK)(e("保存成功")),m(),s())}})]}),children:(0,f.jsx)(u.X,{headers:P,rows:x.map((t,s)=>{const n=[(0,f.jsx)("div",{children:s}),(0,f.jsx)(r.Sm,{value:t.path,handleInputChange:e=>{t.path=e},no_border:!0}),(0,f.jsx)(r.l6,{value:t.default,onChange:e=>{((e,t,s)=>{const n=[];for(let e=0;e<x.length;e++)x[e].default=e===s&&t,n.push(x[e]);j(n)})(0,e,s)},options:B,no_border:!0}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,f.jsxs)("div",{className:"div-row",children:[(0,f.jsx)("span",{children:t.children?.length??0}),0!==s&&(0,f.jsx)(l.rA,{icon:"folder_open",title:e("sub_dir"),onClick:()=>(e=>{w({open:!0,main_context_div:(0,f.jsx)(ne,{children_list:e.children,on_cancel:()=>{w({open:!1})},on_confirm:t=>{e.children=t,j([...x]),w({open:!1})}})})})(t)})]}),(0,f.jsx)("div",{children:0!==s&&(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{x.splice(e,1),j([...x])})(s)})})];return n}),width:"10rem",onRowDrag:(e,t)=>{0!==e&&0!==t&&j((0,v.TI)(x,e,t))}})}),(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("个人保护路径")})," ",(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{de("保护目录")},title:e("信息")})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{k([...S,{path:"",note:""}])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{(await c.XO.post("protection_dir/save",S)).code===d.m.Success&&((0,_.SK)(e("保存成功")),m())}})]}),children:(0,f.jsx)(u.X,{headers:T,rows:S.map((t,s)=>{const n=[(0,f.jsx)("div",{children:s}),(0,f.jsx)(r.Sm,{value:t.path,handleInputChange:e=>{t.path=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{S.splice(e,1),k([...S])})(s)})];return n}),width:"10rem",onRowDrag:(e,t)=>{k((0,v.TI)(S,e,t))}})})]}),(0,f.jsxs)(i.xh,{children:[(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("目录快捷命令")}),(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{de("目录快捷命令")},title:"info"})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{N([...A,{cmd:"",note:""}])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{(await c.XO.post("filesSetting/save",{quick_cmd:A})).code===d.m.Success&&((0,_.SK)(e("保存成功")),s())}})]}),children:(0,f.jsx)(u.X,{headers:E,rows:A.map((t,s)=>{const n=[(0,f.jsx)(r.Sm,{value:t.index,handleInputChange:e=>{t.index=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.cmd,handleInputChange:e=>{t.cmd=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.father_index,handleInputChange:e=>{t.father_index=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{A.splice(e,1),N([...A])})(s)})];return n}),width:"10rem",onRowDrag:(e,t)=>{N((0,v.TI)(A,e,t))}})}),(0,f.jsx)(o.uF,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("文件快捷命令")}),(0,f.jsx)(l.rA,{icon:"info",onClick:()=>{de("文件快捷命令")},title:"info"})]}),rightTopCom:(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{X([...V,{cmd:"",note:"",file_suffix:"",params:""}])}}),(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{(await c.XO.post("filesSetting/save",{file_quick_cmd:V})).code===d.m.Success&&((0,_.SK)(e("保存成功")),s())}})]}),children:(0,f.jsx)(u.X,{headers:M,rows:V.map((t,s)=>{const n=[(0,f.jsx)(r.Sm,{value:t.file_suffix,handleInputChange:e=>{t.file_suffix=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.cmd,handleInputChange:e=>{t.cmd=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.params,handleInputChange:e=>{t.params=e},no_border:!0}),(0,f.jsx)(r.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{V.splice(e,1),X([...V])})(s)})];return n}),width:"10rem",onRowDrag:(e,t)=>{X((0,v.TI)(V,e,t))}})})]})]})]})})}var ae=s(45907),oe=s(17903);const le=["password","private_key","secret_key"],re="webdav",ce="@authorize",de="@tcp_account",ue={smb:[{keys:["server","username","password"],on_next:"load_shares"},{keys:["share"]}],baidu:[{keys:["app_id","app_key","secret_key"],on_next:"save_app"},{keys:[ce]}],tcp_proxy:[{keys:["client_num_id"],on_next:"save_app"},{keys:[de]}]};function he(){const{t:e}=(0,h.Bd)(),t=(0,ae.y)(),[,s]=(0,y.fp)(p.AG.prompt_card),[i,a]=(0,n.useState)([]),[d,m]=(0,n.useState)([]),[x,j]=(0,n.useState)(!1),[v,g]=(0,n.useState)(""),[w,b]=(0,n.useState)(re),[S,C]=(0,n.useState)(""),[k,A]=(0,n.useState)({}),[I,N]=(0,n.useState)(1),[V,$]=(0,n.useState)([]),[X,F]=(0,n.useState)({}),[K,z]=(0,n.useState)("oob"),[B,O]=(0,n.useState)(""),[P,T]=(0,n.useState)(null),[E,M]=(0,n.useState)(!0),D=async()=>{try{const[e,t]=await Promise.all([c.I2.post("credential/list",{}),c.I2.post("credential/meta",{})]);a(Array.isArray(e?.data)?e.data:[]),m(Array.isArray(t?.data)?t.data:[])}catch(e){}};(0,n.useEffect)(()=>{D()},[]);const G=d.find(e=>e.type===w)?.fields??[],q=ue[w],R=q?.length??1,W=()=>{j(!1),g(""),b(re),C(""),A({}),N(1),$([]),O(""),M(!0)},Z=async e=>{const t=Array.from(new Set(e.map(e=>e.options_source).filter(e=>Boolean(e)))),s={};for(const e of t){const t=await c.I2.post("credential/options",{source:e});s[e]=(t?.data??[]).map(e=>({label:e.label,value:e.value}))}F(s)},U=t=>{if(!S.trim())return e("请填写备注");for(const s of G){if(!1===t.includes(s.key))continue;const n=String(k[s.key]??"").trim()||v&&le.includes(s.key);if(s.required&&!n)return e(s.label)}},H=async()=>{try{const e=await c.I2.post("baidu/authorize_url",{id:v,mode:K});e?.data&&window.open(e.data,"_blank","noopener,noreferrer")}catch(e){}},J=async()=>{if(B.trim())try{const t=await c.I2.post("baidu/exchange",{id:v,code:B.trim(),mode:K});(0,_.SK)(`${e("授权成功")}:${t?.data?.baidu_name??""}`),O(""),await D()}catch(e){}else(0,_.zN)(e("请填写授权码"))},Q=async()=>{if(P)if(P.account_name.trim())try{await c.I2.post("credential/account_save",{credential_id:v,account_id:P.id,note:P.note,account_name:P.account_name,password:P.password}),(0,_.SK)(e("已保存")),T(null),await D()}catch(e){}else(0,_.zN)(e("请填写对端账号"))},L=q?.[I-1]?.keys??G.map(e=>e.key),Y=L.includes(ce),ee=L.includes(de),te=I===R,se=R>1;return(0,f.jsxs)(o.Zp,{self_title:(0,f.jsxs)("span",{className:" div-row ",children:[(0,f.jsx)("h2",{children:e("凭证管理")}),(0,f.jsx)(l.rA,{icon:"info",title:e("信息"),onClick:()=>{s({open:!0,title:e("信息"),context_div:(0,f.jsxs)("div",{children:[(0,f.jsxs)("ul",{children:[(0,f.jsx)("li",{children:e("crd_tp")}),(0,f.jsx)("li",{children:e("pwdkept")}),(0,f.jsx)("li",{children:e("tstbfrs")})]}),(0,f.jsxs)("ul",{children:[(0,f.jsxs)("li",{children:[(0,f.jsx)("b",{children:"WebDAV"}),":",e("prtwbdv")]}),(0,f.jsxs)("li",{children:[(0,f.jsx)("b",{children:"SSH / SFTP"}),":",e("prtsftp")]}),(0,f.jsxs)("li",{children:[(0,f.jsx)("b",{children:"S3 兼容对象存储"}),":",e("prt_s3")]}),(0,f.jsxs)("li",{children:[(0,f.jsx)("b",{children:"SMB"}),":",e("prt_smb")]}),(0,f.jsxs)("li",{children:[(0,f.jsx)("b",{children:"百度网盘"}),":",e("prt_bd")]}),(0,f.jsxs)("li",{children:[(0,f.jsx)("b",{children:e("本地目录")}),":",e("prt_local")]})]})]})})}})]}),rightBottomCom:(0,f.jsxs)("div",{children:[!x&&(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{W(),j(!0)}}),x&&(0,f.jsxs)(f.Fragment,{children:[se&&I>1&&(0,f.jsx)(l.rA,{icon:"arrow_back",title:e("上一步"),onClick:()=>N(I-1)}),se&&!te&&(0,f.jsx)(l.rA,{icon:"arrow_forward",title:e("下一步"),onClick:async()=>{const t=U(q?.[I-1]?.keys??[]);if(t)return void(0,_.zN)(`${e("请填写")}${t}`);const s=q?.[I-1]?.on_next;try{if("load_shares"===s&&!await(async()=>{const t=await c.I2.post("share/list",{driver:w,id:v||void 0,config:{server:k.server,username:k.username,password:k.password}}),s=t?.data??[];return s.length?($(s.map(e=>({label:e.name,value:e.name}))),!0):((0,_.zN)(e("没有找到共享")),!1)})())return;if("save_app"===s&&!await(async()=>{try{const e=await c.I2.post(v?"credential/update":"credential/add",{id:v||void 0,type:w,note:S,config:k,enabled:E});return!v&&e?.data?.id&&g(e.data.id),!0}catch(e){return!1}})())return;N(I+1)}catch(e){}}}),(!se||te)&&(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{const t=U(G.map(e=>e.key));if(t)(0,_.zN)(`${e("请填写")}${t}`);else try{await c.I2.post(v?"credential/update":"credential/add",{id:v||void 0,type:w,note:S,config:k,enabled:E}),(0,_.SK)(e("保存成功")),W(),await D()}catch(e){}}}),(0,f.jsx)(l.rA,{icon:"cancel",title:e("取消"),onClick:W})]})]}),children:[x&&(0,f.jsxs)(n.Fragment,{children:[(0,f.jsx)(r.Sm,{placeholder:e("备注"),value:S,handleInputChange:C}),(0,f.jsx)(r.l6,{value:w,options:d.map(e=>({title:e.name,value:e.type})),onChange:e=>{b(e),A({}),$([]),F({}),N(1),O("");const t=d.find(t=>t.type===e)?.fields??[];t.some(e=>e.options_source)&&Z(t)}}),Y?(()=>{const s=i.find(e=>e.id===v)?.accounts??[];return(0,f.jsxs)(n.Fragment,{children:[(0,f.jsx)(r.BC,{label:e("授权方式"),label_width:"6rem",children:(0,f.jsxs)("div",{className:"div-row",children:[(0,f.jsx)(r.U6,{name:"baidu_auth_mode",value:"one_click",context:e("一键授权"),selected:"one_click"===K,onchange:()=>z("one_click")}),(0,f.jsx)(r.U6,{name:"baidu_auth_mode",value:"oob",context:e("outh_ob"),selected:"oob"===K,onchange:()=>z("oob")})]})}),"oob"===K&&(0,f.jsx)(r.BC,{label:e("授权码"),label_width:"6rem",children:(0,f.jsx)(r.Sm,{placeholder:e("粘贴授权码 code"),value:B,handleInputChange:O})}),(0,f.jsxs)("div",{className:"div-row",children:[(0,f.jsx)(l.rA,{icon:"open_in_new",title:e("去授权"),onClick:H}),"oob"===K&&(0,f.jsx)(l.rA,{icon:"check",title:e("完成授权"),onClick:J})]}),s.length>0&&(0,f.jsx)(u.X,{headers:[e("账号名"),e("百度账号"),e("授权状态"),e("使用"),e("授权时间"),e("操作")],rows:s.map(s=>[(0,f.jsx)(o.xP,{context:s.note||s.account_name||s.id}),(0,f.jsx)(o.xP,{context:s.account_name||s.id}),(0,f.jsx)(o.xP,{context:s.authorized?e("已授权"):e("未授权")}),(0,f.jsx)(o.xP,{context:!1===s.enabled?e("停用"):e("启用")}),(0,f.jsx)("p",{children:s.obtained_at?(0,oe.eK)(s.obtained_at):"-"}),(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"network_check",title:e("授权检测"),onClick:()=>(async(t,s)=>{try{const n=await c.I2.post("baidu/verify",{id:t,account_id:s}),i=n?.data??{};i.valid?(0,_.SK)(e("账号可用")):(0,_.zN)(`${e("账号不可用")}:${i.error??""}`),await D()}catch(e){}})(v,s.id)}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>((s,n)=>{t({title:e("确认删除"),sub_title:n.note||n.account_name||n.id,confirm_fun:async()=>{try{await c.I2.post("baidu/deauthorize",{id:s,account_id:n.id}),(0,_.SK)(e("已删除")),await D()}catch(e){}}})})(v,s)})]})])})]},ce)})():ee?(()=>{const s=i.find(e=>e.id===v)?.accounts??[];return(0,f.jsxs)(n.Fragment,{children:[(0,f.jsx)("div",{className:"div-row",children:(0,f.jsx)(r.BC,{label:e("备注"),label_width:"6rem",children:(0,f.jsx)(r.Sm,{placeholder:e("便于辨认的名字"),value:P?.note??"",handleInputChange:e=>T({...P??{note:"",account_name:"",password:""},note:e})})})}),(0,f.jsxs)("div",{className:"div-row",children:[(0,f.jsx)(r.BC,{label:e("对端账号"),label_width:"6rem",children:(0,f.jsx)(r.Sm,{placeholder:e("对端 FileCat 登录名"),value:P?.account_name??"",handleInputChange:e=>T({...P??{note:"",account_name:"",password:""},account_name:e})})}),(0,f.jsx)(r.BC,{label:e("对端密码"),label_width:"6rem",children:(0,f.jsx)(r.Sm,{placeholder:e("留空表示不修改"),value:P?.password??"",handleInputChange:e=>T({...P??{note:"",account_name:"",password:""},password:e})})})]}),(0,f.jsxs)("div",{className:"div-row",children:[(0,f.jsx)(l.rA,{icon:"save",title:e("保存账号"),onClick:Q}),P&&(0,f.jsx)(l.rA,{icon:"close",title:e("取消"),onClick:()=>T(null)})]}),s.length>0&&(0,f.jsx)(u.X,{headers:[e("备注"),e("对端账号"),e("密码"),e("操作")],rows:s.map(s=>[(0,f.jsx)(o.xP,{context:s.note||s.account_name||s.id}),(0,f.jsx)(o.xP,{context:s.account_name||s.id}),(0,f.jsx)(o.xP,{context:s.has_password?e("已设置"):e("未设置")}),(0,f.jsxs)("div",{className:"div-row",children:[(0,f.jsx)(l.rA,{icon:"network_check",title:e("验证登录"),onClick:()=>(async t=>{const s=P?.id===t.id;try{const n=await c.I2.post("credential/account_verify",{credential_id:v,account_id:t.id,account_name:s?P.account_name:t.account_name,password:s?P.password:void 0}),i=n?.data??{};i.ok?(0,_.SK)(e("账号可用")):(0,_.zN)(`${e("账号不可用")}:${i.error??""}`)}catch(e){}})(s)}),(0,f.jsx)(l.rA,{icon:"edit",title:e("编辑"),onClick:()=>T({id:s.id,note:s.note??"",account_name:s.account_name??"",password:""})}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(s=>{t({title:e("确认删除"),sub_title:s.note||s.account_name||s.id,confirm_fun:async()=>{try{await c.I2.post("credential/account_remove",{credential_id:v,account_id:s.id}),(0,_.SK)(e("已删除")),await D()}catch(e){}}})})(s)})]})])})]},de)})():G.filter(e=>L.includes(e.key)).map(t=>{if(t.options_source)return(0,f.jsx)(r.BC,{label:e(t.label),label_width:"6rem",children:(0,f.jsx)(r.l6,{value:k[t.key]??"",options:X[t.options_source]??[],onChange:e=>A({...k,[t.key]:e})})},t.key);if("share"===t.key&&"smb"===w)return(0,f.jsx)(r.BC,{label:e(t.label),label_width:"6rem",children:(0,f.jsx)(r.l6,{value:k[t.key]??"",options:V,onChange:e=>A({...k,[t.key]:e})})},t.key);const s="password"===t.type;return(0,f.jsx)(n.Fragment,{children:(0,f.jsx)(r.Sm,{type:s?"password":"text",placeholder:t.label,value:k[t.key]??"",handleInputChange:e=>A({...k,[t.key]:e})})},t.key)})]}),!x&&(0,f.jsx)(u.X,{headers:[e("备注"),e("类型"),e("操作")],rows:i.map(s=>{return[(0,f.jsx)(o.xP,{context:s.note}),(0,f.jsx)(o.xP,{context:(n=s.type,d.find(e=>e.type===n)?.name??n)}),(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"edit",title:e("编辑"),onClick:()=>(e=>{j(!0),g(e.id),b(e.type),C(e.note??""),A({...e.config??{}}),O(""),M(!1!==e.enabled),N(ue[e.type]?.length??1),"smb"===e.type&&c.I2.post("share/list",{driver:"smb",id:e.id,config:e.config??{}}).then(e=>{$((e?.data??[]).map(e=>({label:e.name,value:e.name})))}).catch(()=>{});const t=d.find(t=>t.type===e.type)?.fields??[];t.some(e=>e.options_source)&&Z(t).catch(()=>{})})(s)}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(async s=>{t({title:e("确认删除"),sub_title:s.note,confirm_fun:async()=>{try{await c.I2.post("credential/delete",{id:s.id}),(0,_.SK)(e("已删除")),await D()}catch(e){}}})})(s)})]})];var n})})]})}function pe(){const{t:e}=(0,h.Bd)(),t=(0,ae.y)(),[s,i]=(0,n.useState)([]),[a,d]=(0,n.useState)([]),[p,m]=(0,n.useState)([]),[x,j]=(0,n.useState)(!1),[v,g]=(0,n.useState)(""),[y,w]=(0,n.useState)("webdav"),[b,S]=(0,n.useState)(""),[C,k]=(0,n.useState)(""),[A,I]=(0,n.useState)(""),[N,V]=(0,n.useState)(""),[$,X]=(0,n.useState)(""),[F,K]=(0,n.useState)(!1),z=async()=>{try{const[e,t,s]=await Promise.all([c.I2.post("list",{}),c.I2.post("credential/list",{}),c.I2.post("driver/list",{})]);i(Array.isArray(e?.data)?e.data:[]),d(Array.isArray(t?.data)?t.data:[]),m(Array.isArray(s?.data)?s.data:[])}catch(e){}};(0,n.useEffect)(()=>{z()},[]);const B=(0,oe.p_)(C,a),O=B.length>0,P=()=>{j(!1),g(""),w("webdav"),S(""),k(""),I(""),V(""),X(""),K(!1)};return(0,f.jsxs)(o.Zp,{self_title:(0,f.jsx)("span",{className:" div-row ",children:(0,f.jsx)("h2",{children:e("挂载列表")})}),rightBottomCom:(0,f.jsxs)("div",{children:[!x&&(0,f.jsx)(l.rA,{icon:"add",title:e("添加"),onClick:()=>{P(),j(!0)}}),x&&(0,f.jsx)(l.rA,{icon:"network_check",title:e("测试连接"),onClick:async()=>{if(C)try{const t=await c.I2.post("test",{id:v||void 0,driver:y,credential_id:C,account_id:A,root_dir:N}),s=t?.data;s?.ok?(0,_.SK)(`${e("连接成功")}(${s.count??0})`):(0,_.zN)(`${e("连接失败")}:${s?.error??""}`)}catch(e){}else(0,_.zN)(e("请选择凭据"))}}),x&&(0,f.jsx)(l.rA,{icon:"save",title:e("保存"),onClick:async()=>{if(C)if(!O||A)if(b.trim())try{await c.I2.post(v?"update":"add",{id:v||void 0,driver:y,mount_path:b,credential_id:C,account_id:O?A:void 0,root_dir:N,note:$,color:oe.OT,readonly:!1,enabled:!0,forward_to_remote:F}),(0,_.SK)(e("保存成功")),P(),await z()}catch(e){}else(0,_.zN)(e("munt_rq"));else(0,_.zN)(e("请选择账号"));else(0,_.zN)(e("请选择凭据"))}}),x&&(0,f.jsx)(l.rA,{icon:"cancel",title:e("取消"),onClick:P})]}),children:[x&&(0,f.jsxs)(n.Fragment,{children:[(0,f.jsx)(r.BC,{label:e("挂载类型"),label_width:"6rem",children:(0,f.jsx)(r.l6,{value:y,options:p.map(e=>({title:e.name,value:e.type})),onChange:e=>{w(e),k(""),I("")}})}),(0,f.jsx)(r.BC,{label:e("凭据"),label_width:"6rem",required:!0,children:(0,f.jsx)(r.l6,{value:C,options:(T=y,(0,oe.XT)(T,a)),onChange:e=>{k(e),I("")}})}),O&&(0,f.jsx)(r.BC,{label:e("账号"),label_width:"6rem",required:!0,children:(0,f.jsx)(r.l6,{value:A,options:B,onChange:I})}),(0,f.jsx)(r.BC,{label:e("本地目录"),label_width:"6rem",required:!0,children:(0,f.jsx)(r.Sm,{placeholder:e("被挂载的本地绝对路径"),value:b,handleInputChange:S})}),(0,f.jsx)(r.BC,{label:e("strtdrt"),label_width:"6rem",children:(0,f.jsx)(r.Sm,{placeholder:e("远端目录"),value:N,handleInputChange:V})}),(0,f.jsx)(r.BC,{label:e("备注"),label_width:"6rem",children:(0,f.jsx)(r.Sm,{placeholder:e("列表显示的名称"),value:$,handleInputChange:X})}),"tcp_proxy"===y&&(0,f.jsx)(r.BC,{label:e("ftr2rmt"),label_width:"6rem",children:(0,f.jsx)(l.Ay,{checked:F,onChange:K,title:e("ftr2rmt_tip")})})]}),!x&&(0,f.jsx)(u.X,{headers:[e("备注"),e("挂载类型"),e("凭据"),e("账号"),e("操作")],rows:s.map(s=>{const n=a.find(e=>e.id===s.credential_id),i=(n?.accounts??[]).find(e=>e.id===s.account_id);return[(0,f.jsx)("p",{children:s.note}),(0,f.jsx)("p",{children:(o=s.driver,p.find(e=>e.type===o)?.name??o)}),(0,f.jsx)("p",{children:n?n.note:e("凭据已丢失")}),(0,f.jsx)("p",{children:s.account_id?i?i.note||i.account_name||i.nickname||i.id:e("账号已丢失"):"-"}),(0,f.jsxs)("div",{children:[(0,f.jsx)(l.rA,{icon:"edit",title:e("编辑"),onClick:()=>(e=>{j(!0),g(e.id),w(e.driver),S(e.mount_path??""),k(e.credential_id??""),I(e.account_id??""),V(e.root_dir??""),X(e.note??""),K(Boolean(e.forward_to_remote))})(s)}),(0,f.jsx)(l.rA,{icon:"delete",title:e("删除"),onClick:()=>(async s=>{t({title:e("确认删除"),sub_title:s.mount_path,confirm_fun:async()=>{try{await c.I2.post("delete",{id:s.id}),(0,_.SK)(e("已删除")),await z()}catch(e){}}})})(s)})]})];var o})})]});var T}function me(){const{t:e}=(0,h.Bd)(),{check_user_auth:t}=(0,w.MH)(),s=t(a.oV.file_mount),[r,d]=(0,y.fp)(p.AG.mount_enabled);(0,n.useEffect)(()=>{s&&(async()=>{try{const e=await c.I2.post("enabled/get",{});d(!0===e?.data)}catch(e){d(!1)}})()},[s]);return s?(0,f.jsxs)(n.Fragment,{children:[(0,f.jsxs)(k.aZ,{position:"right",children:[(0,f.jsx)("span",{className:"header-label",children:e("总开关")}),(0,f.jsx)(l.rA,{icon:!0===r?"cloud_done":"cloud_off",title:e(!0===r?"muntont":"muntoff"),selected:!0===r,onClick:async()=>{const t=!r;try{const s=await c.I2.post("enabled/set",{enabled:t}),n=!0===s?.data;d(n),(0,_.SK)(e(n?"挂载已启用":"挂载已停用"))}catch(e){}}})]}),(0,f.jsx)(i.xh,{children:(0,f.jsxs)(i.fI,{children:[(0,f.jsx)(i.VP,{widthPer:50,maxWidth:"60rem",children:(0,f.jsx)(he,{})}),(0,f.jsx)(i.VP,{widthPer:50,maxWidth:"60rem",children:(0,f.jsx)(pe,{})})]})})]}):(0,f.jsx)(i.fI,{children:(0,f.jsx)(i.VP,{children:(0,f.jsx)(o.Zp,{self_title:(0,f.jsx)("h2",{children:e("网盘挂载")}),children:(0,f.jsx)("p",{children:e("nmuntpr")})})})})}var _e=s(87361);function xe(){const{t:e}=(0,h.Bd)(),{check_user_auth:t}=(0,w.MH)(),s=[{index:2,name:`${e("个人环境")}`,rto:"private_env_setting",component:(0,f.jsx)(ie,{})}];return t(a.oV.sys_setting_page)&&s.unshift({index:1,name:e("系统"),rto:"password",component:(0,f.jsx)(K,{})}),t(a.oV.sys_env_page)&&s.push({index:3,name:`${e("系统环境")}`,rto:"env_setting/",component:(0,f.jsx)(Q,{})}),t(a.oV.auth_router_page)&&s.push({index:4,name:e("自定义路由"),rto:"customer_router/",component:(0,f.jsx)(A,{})}),t(a.oV.file_mount)&&s.push({index:5,name:e("网盘挂载"),rto:"mount_setting/",component:(0,f.jsx)(me,{})}),t(a.oV.user_manage)&&s.push({index:6,name:e("用户管理"),rto:"user_manager/",component:(0,f.jsx)(ee,{})}),t(a.oV.role_manage)&&s.push({index:7,name:e("角色管理"),rto:"role_manager/",component:(0,f.jsx)(te,{})}),(0,f.jsx)(i.W1,{optionList:s,father_route:_e.o.setting})}},92350(e,t,s){s.d(t,{Q:()=>u,o:()=>p});var n=s(34843),i=s(82893),a=s(74777),o=s(96540),l=s(22022),r=s(23430),c=s(14284),d=s(74848);function u(){const[e,t]=(0,n.fp)(i.AG.prompt_card),{t:s,i18n:o}=(0,l.Bd)();return e=>{let n;e===a.jk.ffmpeg?n=(0,d.jsx)("div",{children:"视频转换,rtsp播放器等媒体功能都需要这个软件。linux下你可以使用apt或者yum来安装,或者直接输入软件的位置"}):e===a.jk.smartmontools?n=(0,d.jsx)("div",{children:"磁盘检查需要这个软件。linux下你可以使用apt或者yum来安装,或者直接输入软件的位置。"}):"保护目录"===e?n=(0,d.jsxs)("div",{children:["在删除的时候保护目录会拒绝删除。",(0,d.jsxs)("ul",{children:[(0,d.jsx)("li",{children:"可以使用 /* 来表达该目录下所有文件都禁止删除"}),(0,d.jsx)("li",{children:"可以使用 /** 来表达该目录下所有子目录文件都禁止删除"})]})]}):"文件夹路径"===e?n=(0,d.jsx)("div",{children:"用于在文件夹下切换根目录"}):"环境路径"===e?n=(0,d.jsx)("div",{children:"当在不同用户环境下运行的时候由于没有执行终端去加载PATH,这里可以添加额外的PATH路径,点击这里的保存还会更新系统上的path路径"}):"pty"===e?n=(0,d.jsx)("div",{children:"一些需要Pty环境的命令"}):"文件上传"===e?n=(0,d.jsx)("div",{children:(0,d.jsxs)("ul",{children:[(0,d.jsx)("li",{children:"对于不同的目录(包括所有子目录),可能是机械或者固态硬盘,机械硬盘在处理多个小文件的时候会做随机i/o,由于一般只有一个盘头所以会影响整体效率,特别是写操作,这里提供了上传时候的最大数量限制,对于下载数量目前不做限制."}),(0,d.jsx)("li",{children:"大文件支持断点和分块并发传输,建议并发数量设置为2,分块大小设置为10MB,大文件判断为500MB,设置过大的话会上传的时候会占据较大内存"})]})}):"目录快捷命令"===e?n=(0,d.jsx)("div",{children:"右键文件夹空白处用于,打开终端快捷执行命令"}):"文件快捷命令"===e?n=(0,d.jsx)("div",{children:"用于右键特定后缀的文件,执行一些快捷命令,文件后缀可以是多个,用空格分割"}):"Workflow"===e?n=(0,d.jsx)("div",{children:(0,d.jsxs)("ul",{children:[(0,d.jsx)("li",{children:"在特定的时间启动系统中的workflow任务"}),(0,d.jsx)("li",{children:"cron表达式是定时器 格式为: 秒 分 时 日 月 星期"}),(0,d.jsxs)("li",{children:[(0,d.jsx)("li",{children:'1. "*"(通配符,所有值)'}),(0,d.jsx)("li",{children:'2. "," 是枚举: 0 0 1,15 * * *'}),(0,d.jsx)("li",{children:'3. "-" 是范围: 0 0 1-5 * * *'}),(0,d.jsx)("li",{children:'4. "/" 是步长,标识每隔n执行 */3 * * * * * 每隔三秒,必须配合 * 使用 ,/ 只能写一次 ,有了/就成了定时器,而不是指定时间执行'})]})]})}):"插件配置"===e?n=(0,d.jsx)("div",{children:s("路径可以是一个 js 文件也可以是一个node 项目目录")}):"机器人配置"===e&&(n=(0,d.jsxs)("div",{children:[(0,d.jsx)("dv",{children:"机器人功能用于开通各种第三方支持的机器人,让第三方机器人接入本地的 AI 模型。"}),(0,d.jsxs)("ul",{children:[(0,d.jsx)("li",{children:" 1. qq 机器人需要先在手机 app 中添加,然后在https://q.qq.com/qqbot/ 登录机器人配置页面,在开发管理中复制机器人的 appId,appSecret 到这里就完成了配置了。目前 qq 机器人不稳定,且创建后无法删除(2026.07.05)"}),(0,d.jsx)("li",{children:" 2. https://opensource.dingtalk.com/developerpedia/docs/explore/tutorials/stream/bot/nodejs/create-bot 这个是钉钉机器人开通教程,注意复制钉钉的 clientId 的是时候不要复制成appId 了。"}),(0,d.jsx)("li",{children:" 3. 企业微信机器人的开通甚至不需要 pc 操作,在通讯录中点击智能机器人,选择 api 模式,就创建完成了,手机上直接复制 id 和密钥。"}),(0,d.jsx)("li",{children:" 4. 飞书https://open.feishu.cn/document/develop-an-echo-bot/introduction?from=banner 登录这个开发者后台,按照这个地址教程创建机器人,使用的时候这个机器人是作为一个应用,可以在工作台内搜索你的这个机器人的名字。"})]})]})),t({open:!0,title:"信息",context_div:(0,d.jsx)("div",{children:n})})}}let h=r.Ky;function p(){const[e,t]=(0,o.useState)([]);return(0,o.useEffect)(()=>{(async()=>{try{const e=await c.XO.get("themes");if(0===e.code){const s=e.data||[];h=[...r.Ky,...s],t(h)}else console.warn("获取主题列表失败,使用默认列表"),t(h)}catch(e){t(h)}})()},[]),e}},6960(e,t,s){s.d(t,{s:()=>o});var n=s(72635);const i=1440,a=525600;function o(e){e=e>1e12?e:1e3*e;const t=Date.now(),s=Math.abs(t-e)/6e4;return s<1?n.Ay.t("小于一分钟"):s<60?`${s.toFixed(0)} ${n.Ay.t("分钟前")}`:s<i?`${(s/60).toFixed(0)} ${n.Ay.t("小时前")}`:s<43200?`${(s/i).toFixed(0)} ${n.Ay.t("天前")}`:s<a?`${(s/43200).toFixed(0)} ${n.Ay.t("月前")}`:`${(s/a).toFixed(0)} ${n.Ay.t("年前")}`}},93245(e,t,s){s.d(t,{a:()=>r,d:()=>l});var n=s(96540),i=s(34843),a=s(82893),o=s(23430);const l=[{id:o.nE.ace,label:"文本编辑器(ace)"},{id:o.nE.md,label:"md编辑器"},{id:o.nE.mind,label:"思维导图编辑器"},{id:o.nE.draw,label:"draw编辑器"},{id:o.nE.timeline,label:"时间线编辑器"},{id:o.nE.image,label:"图片编辑器"},{id:o.nE.excel,label:"excel编辑器"}];function r(e,t,s,o=!1){const[l]=(0,i.fp)(a.AG.user_base_info),r=l?.user_data?.editor_auto_save,c=(0,n.useRef)(r);c.current=r;const d=(0,n.useRef)(t);d.current=t;const u=(0,n.useRef)(s);u.current=s,(0,n.useEffect)(()=>{if(o)return;const t=c.current;if(!t?.enable||t.interval<=0||!t.editors?.includes(e))return;const s=setInterval(()=>{d.current()&&u.current(!0)},1e3*t.interval);return()=>clearInterval(s)},[r,e,o])}},24659(e,t,s){s.d(t,{K:()=>i});var n=s(22022);const i=()=>{const{t:e}=(0,n.Bd)();return[{title:e("是"),value:!0,color:"#28a745"},{title:e("否"),value:!1,color:"#666666"}]}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunkfilecat=self.webpackChunkfilecat||[]).push([[9260],{19260(t){t.exports=JSON.parse('{"title":"FileCat","修改密码":"비밀번호 변경","自定义auth":"사용자 정의 인증","tk_exp":"토큰 만료 시간","目标":"대상","目标列表":"대상 목록","被同步的源目录":"동기화할 소스 디렉터리","成功":"성공","已开启":"활성화됨","已关闭":"비활성화됨","sy_tp1":"설정 파일, 코드 파일 등 작은 파일만 지원합니다","sy_tp2":"기본적으로 파일은 수정된 후에만 동기화됩니다. 전체 동기화를 켜면 해당 클라이언트는 접속할 때마다 모든 파일을 재귀 동기화합니다.","sy_tp3":"하나의 작업에 여러 대상을 설정할 수 있으며, 각 대상마다 디렉터리와 전체 동기화를 지정할 수 있습니다.","立即同步":"지금 동기화","已触发同步":"동기화 시작됨","操作失败":"작업 실패","tsk_off":"먼저 작업을 켜고 저장하세요","mnt_type":"마운트 유형","cred_sel":"자격 증명","lcl_abs":"마운트할 로컬 절대 경로","rem_dir":"원격 디렉터리","disp_only":"목록에 표시할 이름","tag_pub":"태그 편집은 모든 사용자에게 표시됩니다","https_s":"HTTPS 설정","ssl_crt":"SSL 인증서 경로","ssl_key":"SSL 개인 키 경로","crt_pth":"인증서 파일 경로 (cert.pem/fullchain.pem)","ky_pth":"개인 키 파일 경로 (privkey.pem)","语言":"언어","文件夹路径":"폴더 경로","编号":"번호","路径":"경로","sub_dir":"하위 디렉터리","是否默认":"기본값인가요?","备注":"비고","编辑SQL":"SQL 편집","SQL 预设":"SQL 프리셋","耗时":"경과 시간","确认":"확인","请输入备注":"메모를 입력하세요","查询全部表":"모든 테이블 조회","SQL预设设置":"SQL 프리셋 설정","SQL预设":"SQL 프리셋","更新保存":"업데이트 및 저장","创建新预选项":"새 프리셋 만들기","添加预设":"프리셋 추가","SQL代码":"SQL 코드","保存成功":"저장되었습니다","大纲":"개요","新建主题":"새 테마","编辑主题":"테마 편집","删除主题":"테마 삭제","主题名称":"테마 이름","请输入主题名称":"테마 이름을 입력하세요","主题实时预览":"실시간 미리보기","删除成功":"삭제됨","删除失败":"삭제 실패","cf_thm":"이 테마를 삭제할까요?","导出PDF":"PDF 내보내기","no_head":"아직 제목이 없습니다","未命名标题":"제목 없음","更新成功":"업데이트되었습니다","创建成功":"생성되었습니다","sql_in":"SQL 문을 입력하세요","新密码":"새 비밀번호","新账号":"새 계정","关闭":"닫기","开启":"열기","展开":"펼치기","指定时间":"지정 시간","永不过期":"만료되지 않음","清空token":"토큰 비우기","保存":"저장","确定":"확인","确定修改":"변경 확인","删除":"삭제","添加":"추가","系统":"시스템","follow_sys":"시스템 설정 따르기","no_theme":"테마 없음","自定义页面路由":"사용자 정의 페이지 라우트 ","api_rt":"사용자 정의 API 라우트","跳转路由":"이동 라우트","路由":"라우트","文件":"파일","自定义路由":"사용자 지정 라우트","编辑":"편집","查看":"보기","默认配置":"기본 구성","设置":"설정","退出登录":"로그아웃","虚拟网络":"가상 네트워크","系统信息":"시스템 정보","工具箱":"도구 상자","索引":"색인","文件夹":"폴더","客户端":"클라이언트","服务器":"서버","服务端":"서버 측","基本信息":"기본 정보","系统性能":"시스템 성능","总容量":"총 용량","剩余":"남은","使用率":"사용률","内存":"메모리","系统进程":"시스템 프로세스","doc_ct":"Docker 컨테이너","物理硬盘":"물리적 하드 디스크","文件硬盘":"파일 하드 디스크","容器":"컨테이너","名字":"이름","镜像":"이미지","命令":"명령","状态":"상태","选择":"선택","过滤":"필터링","账号":"계정","密码":"비밀번호","目录":"디렉토리","私钥路径":"개인 키 경로","连接地址":"연결 주소","端口":"포트","port":"포트","host":"호스트","key":"키","代理":"프록시","浏览器":"브라우저","网络唤醒":"네트워크 부팅","时间工具":"시간 도구","切换样式":"스타일 변경","更多":"더 보기","创建文件夹":"폴더 생성","创建文件":"파일 생성","连接":"연결","地址":"주소","目标设备":"대상 기기","发送":"보내기","腾讯":"텐센트","云":"클라우드","厂商":"제조사","名称":"이름","厂商名称":"제조사 이름","类型":"유형","容量":"용량","挂载位置":"마운트 위치","剩余容量":"남은 용량","登录":"로그인","是":"예","否":"아니오","秒":"초","流量转发":"트래픽 전달","点对点":"P2P","模式":"모드","虚拟":"가상","在线状态":"온라인 상태","物理":"물리적","账号设置":"계정 설정","说明":"설명","文件系统类型":"파일 시스템 유형","机械":"기계식","固态":"SSD","复制":"복사","剪切":"잘라내기","压缩":"압축","下载":"다운로드","重命名":"이름 변경","创建文本文件":"텍스트 파일 생성","解压":"압축 해제","转换到":"변환","自定义":"사용자 정의","粘贴到此处":"여기에 붙여넣기","创建":"생성","制造商":"제조사","总内存":"총 메모리","最大":"최대","品牌":"브랜드","逻辑核心":"논리 코어","搜索当前目录":"현재 디렉토리 검색","压缩文件":"파일 압축","取消":"취소","环境控制":"환경 제어","control_env_tip":"env 형식의 key-value 텍스트로 설정하며, 주석 처리하면 비활성화됩니다. allowed_hosts는 일치하는 호스트만 허용하고 forbid_hosts는 일치하는 호스트를 거부합니다. 값은 정규식 배열입니다(전체 일치, 포트를 제외한 호스트 이름만). 거부된 요청은 응답 없이 즉시 연결이 끊깁니다.","只支持以下配置项":"지원되는 키만 사용 가능","值必须是 JSON 数组":"값은 JSON 배열이어야 합니다","正则表达式不合法":"정규식이 올바르지 않습니다","运行":"실행","格式":"형식","压缩到":"압축 위치","进度":"진행 상황","解压到":"압축 해제 위치","当前目录":"현재 디렉토리","解压文件":"파일 압축 해제","视频格式转换":"비디오 형식 변환","gen_dir":"생성된 파일의 대상 파일은 이 디렉토리에 있습니다.","ff_fmt":"ffmpeg에서 지원하는 대상 형식","del_f":"선택한 파일을 삭제하시겠습니까?","输入目录名":"디렉토리 이름 입력","cut_ovr":"잘라내기(덮어쓰기) 확인","cp_ovr":"복사(덮어쓰기) 확인","修改名字":"이름 변경","输入新名字":"새 이름 입력","个文件正在上传":"개의 파일이 업로드 중입니다.","确定删除":"삭제 확인","是否删除":"삭제하시겠습니까?","输入文本名":"텍스트 이름 입력","添加索引":"색인 추가","物理核心":"물리 코어","创建目录":"디렉토리 생성","访问目录":"디렉토리 접근","mac_dst":"대상 기기의 MAC 주소","要代理的url":"프록시할 URL","系统代理端口":"시스템 프로록시 포트","返回":"돌아가기","不允许为空":"비어 있을 수 없습니다.","ff_none":"ffmpeg을 찾을 수 없습니다.","disk":"하드 디스크","part":"파티션","lvm":"논리 볼륨 관리","网址":"웹 주소","环境":"환경","外部软件":"외부 소프트웨어","保护路径":"보호 경로","软件":"소프트웨어","是否安装":"설치되어 있습니까?","角色管理":"역할 관리","用户管理":"사용자 관리","角色id":"역할 ID","角色名":"역할 이름","用户id":"사용자 ID","用户名":"사용자 이름","目录范围":"디렉토리 범위","可执行的命令":"실행 가능한 명령","禁止目录范围":"금지된 디렉토리 범위","可执行命令":"실행 가능한 명령","系统进程关闭":"시스템 프로세스 종료","dc_ctdl":"Docker 컨테이너 정지, 삭제","dc_idl":"Docker 이미지 삭제","tk_time":"토큰 시간 변경","自定义资源路由":"사용자 정의 리소스 라우트","磁盘挂载":"디스크 마운트","ssh_sv":"SSH 키를 디스크에 저장","外部软件路径":"외부 소프트웨어 경로","log_del":"파일 삭제, 잘라내기, 이름 변경","内容更新":"내용 업데이트","标签编辑权限":"태그 편집 권한","ssh代理":"SSH 프록시","http代理":"HTTP 프록시","浏览器代理":"브라우저 프록시","rdp代理":"RDP 프록시","rtsp播放器":"RTSP 플레이어","角色":"역할","文件回收站":"휴지통","个人保护路径":"개인 보호 경로","系统保护路径":"시스템 보호 경로","小于一分钟":"1분 미만","分钟前":"분 전","小时前":"시간 전","天前":"일 전","月前":"달 전","年前":"년 전","挂载位置磁盘":"마운트 위치 디스크","信息":"정보","磁盘剩余":"디스크 남은 용량","文件系统":"파일 시스템","文件夹数":"폴더 수","文件数":"파일 수","当前位置":"현재 위치","输入文件名":"파일 이름 입력","o_stdo":"Studio로 열기","o_img":"이미지 편집기로 열기","预览图片":"이미지 미리보기","运行并实时查看":"실행하고 실시간으로 보기","实时查看":"실시간으로 보기","输入参数运行":"매개변수를 입력하여 실행","以文本打开":"텍스트로 열기","以日志打开":"로그로 열기","上传":"업로드","文件选项":"파일 옵션","添加类目":"카테고리 추가","全部编辑":"전체 편집","输入类目名":"카테고리 이름 입력","折叠":"접기","全部折叠":"모두 접기","(无内容)":"(내용 없음)","请求头":"요청 헤더","请求体":"요청 본문","值":"값","上传文件":"파일 업로드","下载到本地目录":"로컬 디렉토리로 다운로드","本地地址":"로컬 주소","完成":"완료","结束":"종료","响应头":"응답 헤더","正在下载":"다운로드 중","输入标签名":"태그 이름 입력","frm_lm":"양식에 파일이 포함되어 있어 브라우저 제한으로 추가할 수 없습니다.","非对称密钥":"비대칭 키","将覆盖密钥文件":"키 파일을 덮어쓸 것입니다.","加密算法":"암호화 알고리즘","输出格式":"출력 형식","普通PEM":"일반 PEM","生成":"생성","ssh_dir":".ssh 디렉토리에 저장","私钥":"개인 키","时间转换器":"시간 변환기","格式化时间":"시간 형식 지정","毫秒":"밀리초","分秒":"분과 초","实时信息":"실시간 정보","运行用户":"실행 사용자","当前系统":"현재 시스템","进程":"프로세스","ld_wait":"로딩 중, 잠시 기다려 주세요...","选中":"선택됨","创建用户":"사용자 생성","升序":"오름차순","降序":"내림차순","dc_nne":"Docker를 감지할 수 없습니다. 호스트에 Docker가 설치되어 있지 않거나 컨테이너가 비어 있을 수 있습니다.","过滤镜像":"이미지 필터링","列表更新":"목록 업데이트","执行命令":"명령 실행","打印日志":"로그 출력","删除容器":"컨테이너 삭제","删除镜像":"이미지 삭제","doc_img":"Docker 이미지","doc_icf":"선택한 이미지를 삭제하시겠습니까?","系统运行于":"시스템이 실행 중인 위치","全局变量":"전역 변수","up_conc":"파일 업로드 최대 동시 제한","单用户并发数量":"단일 사용자 동시 수","系统并发数量":"시스템 동시 수","big_res":"대용량 파일 중단점을 사용하시겠습니까?","big_sz":"대용량 파일 판단 크기(MB)","大文件并发数量":"대용량 파일 동시 수","big_ck":"대용량 파일 분할 크기(MB)","页面资源路由":"페이지 리소스 라우트","wf_rt":"워크플로 트리거 라우트","过期时间(s)":"만료 시간(초)","文件路径":"파일 경로","path_up":"시스템 보호 경로 업데이트","path_md":"PATH 경로 변경","执行用户":"실행 사용자","执行":"실행","wf_api":"워크플로 트리거 API 변경","up_lim":"디렉토리 파일 업로드 수 제한 변경","功能权限":"기능 권한","角色备注":"역할 비고","pxy_off":"HTTP 프록시 다운로드 비활성화","工具功能":"도구 기능","全局变量设置":"전역 변수 설정","文件回收站修改":"휴지통 수정","文件权限":"파일 권한","log_wr":"파일 생성, 업로드, 내용 업데이트, 압축 해제","只读目录范围":"읽기 전용 디렉토리 범위","更新":"업데이트","use_env":"기본적으로 환경 변수 사용","sync_sv":"선택한 서버에 정보 동기화","add_rot":"HTTP 리소스 루트 디렉토리 추가","dl_here":"이 디렉토리에서 HTTP 리소스 다운로드","文件排序":"파일 정렬","系统默认":"시스템 기본값","修改时间":"수정 시간","时间逆序":"시간 역순","时间顺序":"시간 순서","大小逆序":"크기 역순","大小顺序":"크기 순서","文件大小":"파일 크기","网站标题":"웹사이트 제목","通用设置":"일반 설정","主题":"테마","时区":"시간대","时间":"시간","服务器时间":"서버 시간","在线时间":"온라인 시간","离线时间":"오프라인 시간","在线":"온라인","离线":"오프라인","功能文档":"기능 문서","官网地址":"https://filecat.xiaobaidadada.fun/","远程代理":"원격 프록시","系统管理":"시스템 관리","网址导航":"웹 주소 탐색","目录快捷命令":"디렉터리 바로 가기 명령","文件快捷命令":"파일 바로 가기 명령","系统网络":"시스템 네트워크","复制名字":"이름 복사","分享":"공유","复制绝对路径":"절대 경로 복사","复制相对路径":"상대 경로 복사","切换目录":"디렉터리 전환","统计信息":"통계 정보","更新AI知识库":"AI 지식베이스 업데이트","exp_hr":"남은 만료 시간(시간)","可以为空":"비워도 됩니다","自动加载":"자동 로드","本地知识库":"로컬 지식베이스","知识库加载信息":"지식베이스 로드 정보","最近一次加载":"최근 로드 시각","加载进度":"로드 진행률","总文件数量":"총 파일 수","总文件字符数量":"총 파일 문자 수","总文件大小":"총 파일 크기","总耗时":"총 소요 시간","上一页":"이전 페이지","目标地址":"대상 주소","目标端口":"대상 포트","连接状态":"연결 상태","个人设置":"개인 설정","系统设置":"시스템 설정","文件后缀":"파일 확장자","禁止执行的命令":"실행 금지 명령","Ai 配置":"AI 설정","文件分享":"파일 공유","输入跳转的目录":"이동할 디렉터리 입력","文件分享列表":"파일 공유 목록","过期小时":"만료 시간(시간)","下载次数":"다운로드 횟수","剩余时间":"남은 시간","文件加载方式":"파일 로드 방식","全部加载文件":"모든 파일 로드","scrll_l":"페이지 스크롤로 파일 로드","剩余时间(h)":"남은 시간 (h)","网络代理":"네트워크 프록시","个人":"개인","安装方式":"설치 방식","是否开启":"사용","系统启动执行":"시스템 시작 시 실행","表达式":"식","用户":"사용자","详细信息":"상세 정보","服务器配置":"서버 설정","客户端列表":"클라이언트 목록","更多服务器":"더 많은 서버","端口映射":"포트 매핑","序号":"번호","服务器端口":"서버 포트","转发客户端名称":"전달 클라이언트 이름","服务端口":"서비스 포트","转发ip":"전달 IP","转发端口":"전달 포트","客户端代理配置":"클라이언트 프록시 설정","客户端桥接配置":"클라이언트 브리지 설정","远程地址":"원격 주소","在线时长":"온라인 시간","fwd_nm":"전달 클라이언트 이름","sv_ntf":"저장하고 클라이언트에 첫 번째 키와 포트를 알림","br_port":"브리지 서버 포트 목록","输入消息":"메시지 입력","用户权限":"사용자 권한","系统管理权限":"시스템 관리 권한","网络功能权限":"네트워크 기능 권한","Ai 设置权限":"AI 설정 권한","系统设置权限":"시스템 설정 권한","系统环境设置":"시스템 환경 설정","sys_env":"시스템 환경 설정 페이지","自定义路由页面":"사용자 지정 라우트 페이지","代理功能":"프록시 기능","其他功能":"기타 기능","ddns":"DDNS","ai_page":"AI 채팅 페이지","pty cmd":"PTY 명령","wf_run":"워크플로 실행","wf_user":"워크플로 실행 사용자","cmd_rst":"filecat-restart 재시작 명령","cmd_upg":"filecat-upgrade 업그레이드 명령","cmd_dwn":"filecat-down 메인 프로세스 종료 명령","cmd_ai":"AI 명령(AI 채팅)","个性化设置":"개인화 설정","lgn_usr":"로그인 시 사용자 정보 표시","个人环境":"개인 환경","系统环境":"시스템 환경","持久化":"지속","个人环境设置":"개인 환경 설정","其他参数":"기타 매개변수","父编号":"부모 ID","代理配置":"프록시 구성","桥接配置":"브리지 구성","brg_tip":"클라이언트에 포트를 설정합니다. 이 포트에 접속하면 다른 클라이언트의 네트워크 환경 내 첫 번째 주소로 트래픽이 전달됩니다.","内网穿透":"내부망 침투","fc_pxy":"Filecat 프록시 액세스","fc_pxyw":"Filecat 프록시 액세스 서버 프론트엔드 사용","fc_pxyr":"사용자 정의 Filecat 프록시 주소","fc_pxyc":"filecat 프록시 URL 복사","fc_pxyo":"filecat 프록시 URL 열기","对端账号":"원격 계정","对端密码":"원격 비밀번호","保存账号":"계정 저장","验证登录":"로그인 확인","已设置":"설정됨","未设置":"미설정","便于辨认的名字":"알아보기 쉬운 이름","对端 FileCat 登录名":"원격 FileCat 로그인","留空表示不修改":"비우면 변경 안 함","请填写对端账号":"원격 계정을 입력하세요","已保存":"저장됨","原客户端":"원본 클라이언트","原目录":"원본 디렉토리","目标客户端":"대상 클라이언트","目标目录":"대상 디렉토리","忽略目录":"무시 디렉토리","双向同步":"양방향 동기화","客户端文件同步":"클라이언트 파일 동기화","客户端设置":"클라이언트 설정","pxy_nln":"로컬 (인트라넷) 주소에 프록시 서버 사용 안 함","忽略ip":"IP 무시","ai_ask":"모든 것을 서버에 문의","本地目录":"로컬 디렉토리","响应体":"응답 본문","客户端功能":"클라이언트 기능","全量同步":"전체 동기화","公钥":"공개 키","跟随系统":"시스템 설정 따름","字符消耗统计":"문자 소비 통계","加载中...":"로딩 중...","对话轮次":"대화 라운드","AI输入字符":"AI 입력 문자","AI输出字符":"AI 출력 문자","暂无统计数据":"통계 데이터 없음","会话":"세션","新会话":"새 세션","提示词":"프롬프트","llm_pmt":"LLM 편집 프롬프트","LLM编辑开关":"LLM 편집 스위치","编辑规则":"편집 규칙","选择系统提示词":"시스템 프롬프트 선택","清空全部会话":"모든 세션 지우기","cf_all":"모든 채팅 세션을 삭제하시겠습니까?","cf_msgs":"선택한 메시지를 삭제하시겠습니까?","cf_ses":"선택한 세션을 삭제하시겠습니까?","cf_one":"이 메시지를 삭제하시겠습니까?","批量选择":"일괄 선택","查看所有用户会话":"모든 사용자 세션","查看全部会话时不可发送消息":"모든 세션을 보는 중에는 메시지를 보낼 수 없습니다","仅看我的会话":"내 세션만 보기","取消批量选择":"일괄 선택 취소","删除选中消息":"선택 메시지 삭제","删除选中会话":"선택 세션 삭제","切换模型":"모델 전환","添加文件":"파일 추가","无描述":"설명 없음","暂无工具":"도구 없음","查看工具":"도구 보기","加载工具":"도구 로드","系统会话提示词":"시스템 세션 프롬프트","删除记录":"레코드 삭제","手动加载":"수동 로드","从索引删除":"인덱스에서 삭제","知识库开关":"지식 베이스 스위치","文本对话":"텍스트 대화","图片生成":"이미지 생성","向量嵌入":"벡터 임베딩","图片参数设置":"이미지 매개변수 설정","更多属性":"더 많은 속성","model类型":"모델 유형","成为tool":"도구 되기","操作":"작업","查看Git提交":"Git 커밋 보기","Git":"Git","变更":"Changes","提交记录":"Commits","全选":"Select All","没有变更":"No changes","暂无提交记录":"No commits yet","分支":"Branch","git_msg":"Enter commit message...","提交":"커밋","暂存全部":"Stage All","暂存选中":"Stage Selected","取消暂存":"Unstage","已暂存":"Staged","已暂存全部":"All staged","已取消暂存":"Unstaged","请输入提交信息":"Please enter commit message","提交成功":"Commit successful","推送成功":"Push successful","拉取成功":"Pull successful","切换分支成功":"Branch switched","远程操作":"Remote Operations","拉取":"Pull","推送":"Push","强制推送":"Force Push","暂存工作区":"Stash","暂存工作区成功":"Stash successful","恢复工作区":"Stash Pop","恢复工作区成功":"Stash pop successful","刷新":"Refresh","请先选择文件":"Please select files first","提示:":"Tips:","git_stg":"Check files on the left, then use \\"Stage Selected\\" to add them to staging area","git_cmt":"Enter commit message and click \\"Commit\\"","git_cf":"If conflicts occur, please resolve them in shell before committing","git_frc":"\\"Force Push\\" will overwrite the remote branch, use with caution","配置表":"Config Table","自动升级":"자동 업그레이드","exe_tpl":"EXE 다운로드 URL 템플릿","offcal":"비워두면 공식 GitHub Releases 사용","检测频率(秒)":"확인 간격(초)","def_180":"기본값 180초(3분)","chk_10s":"확인 간격은 10초 미만일 수 없습니다","ver_url":"버전 확인 URL","ver_req":"버전 확인 URL은 비워둘 수 없습니다","用户配置":"사용자 설정","邮箱":"이메일","代理设置":"프록시 설정","全局代理":"전역 프록시","仓库代理":"저장소 프록시","修改":"편집","用户配置已保存":"사용자 설정이 저장되었습니다","代理配置已保存":"프록시 설정이 저장되었습니다","pxy_clr":"비워두면 프록시가 삭제됩니다","pxy_nte":"사용자 설정과 전역 프록시는 모든 저장소에 적용됩니다","pxy_url":"HTTP 프록시 주소","pxy_tip":"filecat 시스템이 발행하는 HTTP 요청(버전 확인, 자동 업그레이드, DDNS, 명령 다운로드, 사용자 지정 라우팅 등)에 적용됩니다. 참고: macOS에서 시스템 프록시가 이미 활성화된 경우 이중 프록시를 피하려면 여기를 비워 두세요.","端口扫描":"포트 스캔","目标主机":"대상 호스트","起始端口":"시작 포트","结束端口":"종료 포트","并发数":"동시 실행 수","超时(ms)":"시간 초과(ms)","扫描":"스캔","扫描结果":"스캔 결과","扫描完成":"스캔 완료","扫描失败":"스캔 실패","正在扫描...":"스캔 중...","未发现开放端口":"열린 포트가 없습니다","scan_in":"매개변수를 입력하고 스캔을 클릭하세요","hostreq":"호스트 주소는 필수입니다","端口范围无效":"잘못된 포트 범위","portrng":"시작 포트는 종료 포트보다 클 수 없습니다","开放":"열림","总计扫描":"총 스캔","已发现":"발견","当前":"현재","扫描已取消":"스캔이 취소되었습니다","自动换行":"자동 들여쓰기","不换行":"감쓰기 안함","替换":"바꾸기","env编辑":"env 편집","命令确认":"명령 확인","命令检测开启":"명령 감지 활성화","命令检测关闭":"명령 감지 비활성화","命令检测已开启":"명령 감지가 켜졌습니다","命令检测已关闭":"명령 감지가 꺼졌습니다","此会话不再询问":"이 세션에서 다시 묻지 않기","doc_pxy":"Docker 프록시 설정","HTTP 代理":"HTTP 프록시","pxy_htt":"HTTPS 프록시","pxy_nne":"No Proxy","保存失败":"저장 실패","MD编辑器":"MD 편집기","行":"행","列":"열","默认":"기본","删除行":"행 삭제","删除列":"열 삭제","上方插入行":"위에 행 삽입","切换表头行":"머리글 행 전환","合并单元格":"셀 병합","拆分单元格":"셀 분할","下方插入行":"아래에 행 삽입","左侧插入列":"왼쪽에 열 삽입","右侧插入列":"오른쪽에 열 삽입","插入表格":"표 삽입","加载中":"로딩 중","打开失败":"열기 실패","重启失败":"다시 시작 실패","doc_cfg":"Docker 설정","名单视图":"목록 보기","文本视图":"텍스트 보기","目标(To)":"대상(To)","动作":"동작","fw_from":"출처(From)","删除规则":"규칙 삭제","规则编号":"규칙 번호","点击复制":"클릭하여 복사","镜像加速":"레지스트리 미러","不安全仓库":"비보안 레지스트리","开启调试":"디버그 활성화","数据存储目录":"데이터 루트","存储驱动":"스토리지 드라이버","日志驱动":"로그 드라이버","fw_iptb":"iptables 활성화","lve_rst":"Live Restore","添加规则":"규칙 추가","请填写端口号":"포트를 입력하세요","方向":"방향","协议":"프로토콜","来源地址":"출발지 주소","获取失败":"가져오기 실패","进程环境变量":"프로세스 환경 변수","端口实例":"포트 인스턴스","srchbln":"빈 검색 모드로 디렉터리 열기","搜索会话":"세션 검색","sw_mdl":"AI 모델 전환 허용","选择模型":"모델 선택","mv_self":"폴더를 자기 자신 안으로 이동할 수 없습니다","网站 Logo":"웹사이트 로고","lclorur":"로컬 파일 경로 또는 http(s) 이미지 URL","全部":"전체","源码模式":"소스 모드","实时编辑模式":"실시간 편집 모드","编辑器设置":"편집기 설정","正文最大宽度":"본문 최대 너비","正文左右边距":"본문 좌우 여백","正文字号":"본문 글자 크기","行高":"줄 높이","恢复默认":"기본값 복원","保存中":"저장 중","预览":"미리보기","nprmtp":"이 설정을 변경할 권한이 없습니다. 아래는 현재 구성입니다.","md_set":"MD 편집기 설정","目录挂载":"디렉터리 마운트","总开关":"마스터 스위치","挂载":"마운트","挂载到网盘":"클라우드에 마운트","编辑挂载配置":"마운트 설정 편집","取消挂载":"마운트 해제","确认取消挂载":"마운트 해제 확인","已取消挂载":"마운트 해제됨","该目录尚未挂载":"이 디렉터리는 마운트되지 않았습니다","挂载目录":"마운트 디렉터리","只读":"읽기 전용","挂载类型":"마운트 유형","显示名称":"표시 이름","标识色":"표시 색상","只读模式":"읽기 전용 모드","测试连接":"연결 테스트","测试中":"테스트 중","连接成功":"연결 성공","连接失败":"연결 실패","请选择挂载类型":"마운트 유형을 선택하세요","请填写":"입력하세요: ","未授权":"미인증","服务地址":"서버 주소","起始目录":"시작 디렉터리","留空表示根目录":"비워 두면 루트 디렉터리","主机":"호스트","默认 22":"기본 22","私钥内容":"개인 키 내용","与私钥二选一":"개인 키와 둘 중 하나만 입력","与密码二选一":"비밀번호와 둘 중 하나만 입력","存储桶":"버킷","区域":"리전","强制路径风格":"경로 스타일 강제","授权账号":"인증된 계정","百度网盘授权":"Baidu 넷디스크 인증","去授权":"인증하기","完成授权":"인증 완료","授权码":"인증 코드","回调地址":"리디렉션 URI","rqappky":"AppKey를 입력하세요","rq_scrt":"SecretKey를 입력하세요","请填写授权码":"인증 코드를 입력하세요","svappfr":"먼저 앱 설정을 저장하세요","授权成功":"인증 성공","账号可用":"계정을 사용할 수 있습니다","账号不可用":"계정을 사용할 수 없습니다","校验":"검증","已授权账号":"인증된 계정","已删除":"삭제됨","处理中":"처리 중","AppKey":"AppKey","网盘挂载":"클라우드 마운트","凭据管理":"자격 증명","凭据":"자격 증명","新增凭据":"자격 증명 추가","凭据已丢失":"자격 증명 없음","挂载列表":"마운트 목록","新增挂载":"마운트 추가","munt_rq":"마운트 디렉터리는 비워 둘 수 없습니다","请选择凭据":"자격 증명을 선택하세요","请选择类型":"유형을 선택하세요","启用":"활성화","已停用":"비활성화","确认删除":"삭제 확인:","nmuntpr":"현재 계정에 디렉터리 마운트 권한이 없습니다","百度网盘":"Baidu 넷디스크","应用配置":"앱 설정","授权":"인증","授权失败":"인증 실패","strtdrt":"시작 디렉터리","ftr2rmt":"원격으로 전달","ftr2rmt_tip":"이 디렉터리의 터미널, 워크플로, git 요청은 원격 FileCat에서 실행됩니다","授权检测":"인증 확인","scrtkep":"SecretKey를 비우면 변경하지 않습니다","编辑应用":"앱 편집","新增授权账号":"인증 계정 추가","一键授权":"원클릭 인증","outh_ob":"수동 (oob)","pst_cd":"인증 코드 붙여넣기","确认授权":"인증 확인","授权检测/刷新":"검증/새로 고침","检测完成":"검증 완료","导入":"가져옴","账号名":"계정 이름","百度账号":"Baidu 계정","网盘昵称":"넷디스크 닉네임","授权状态":"인증 상태","过期时间":"만료 시간","授权时间":"인증 시간","已授权":"인증됨","已过期":"만료됨","停用":"비활성화","已配置":"설정됨","未配置":"설정 안 됨","网盘使用":"넷디스크 사용","自动刷新":"자동 새로 고침","编辑账号":"계정 편집","使用":"사용","当前为挂载目录":"마운트된 디렉터리","启用挂载":"마운트 사용","已启用":"사용 중","挂载已启用":"마운트를 사용했습니다","挂载已停用":"마운트를 해제했습니다","muntont":"마운트 사용 중, 클릭하여 해제","muntoff":"마운트 사용 안 함, 클릭하여 사용","凭证管理":"자격 증명","授权方式":"인증 방식","去授权(一键)":"인증하기(원클릭)","去授权(手动)":"인증하기(수동)","保存应用配置":"앱 설정 저장","atathtp":"원클릭: 인증 후 자동으로 이 페이지로 돌아오며 계정이 자동으로 추가됩니다","atathnt":"원클릭은 Baidu 콘솔에 이 서비스의 /mount/baidu/callback 을 리디렉션 URI로 등록해야 합니다","pstatht":"수동: 리디렉션 URI가 필요 없습니다. 인증 후 Baidu 페이지에서 코드를 복사해 아래에 붙여넣고 완료를 클릭하세요","crd_tp":"자격 증명은 클라우드 드라이브/원격 호스트에 연결하기 위한 계정 정보입니다. 여러 마운트에서 공유할 수 있으며 한 번 수정하면 모두 적용됩니다.","bidacct":"Baidu Netdisk 계정은 여기서 관리하지 않습니다. 아래 \\"Baidu Netdisk\\" 패널에서 인증하세요. 인증 후 해당 계정이 자동으로 생성됩니다.","pwdkept":"편집 시 비밀번호 계열 필드를 비워 두면 원래 값이 유지됩니다.","tstbfrs":"저장하기 전에 \\"연결 테스트\\"를 눌러 계정이 사용 가능한지 확인할 수 있습니다.","prtwbdv":"범용 파일 프로토콜로, 지엔궈윈·Synology NAS·Nextcloud·Alist 등이 지원합니다. 서비스 주소와 계정만 있으면 상대 디렉터리에 접근할 수 있습니다.","prtsftp":"SSH로 원격 서버의 디렉터리에 접근하고 SFTP 하위 시스템으로 파일을 전송합니다. 다른 Linux 머신의 디렉터리를 마운트하는 데 적합합니다.","prt_s3":"S3 프로토콜로 연결하는 객체 스토리지 서비스입니다. 예: MinIO, Alibaba Cloud OSS, Tencent COS, Qiniu, Cloudflare R2. 엔드포인트, 버킷, 키 쌍이 필요합니다.","深搜":"심층 검색","搜索":"검색","搜索中":"검색 중","范围":"범위","结果过多":"결과가 너무 많습니다. 키워드를 좁혀 주세요","已显示":"표시","搜文件名":"파일 이름 재귀 검색","搜到该处":"폴더로 이동","打开所在目录":"폴더 열기","输入后搜":"파일 이름 입력 후 Enter","无匹配":"일치하는 파일이 없습니다","结果截断":"결과가 너무 많습니다. 처음 500개","缩放调整":"확대/축소 조정","缩放调整成功":"확대/축소 조정 성공","缩放百分比":"확대/축소 비율","未加载":"미로드","加载成功":"로드 완료","加载失败":"로드 실패","个工具":"개 도구","No share found":"공유를 찾을 수 없습니다","Enter host first":"먼저 호스트를 입력하세요","下一步":"다음","上一步":"이전","共享目录":"공유 폴더","prt_smb":"Windows 공유 폴더(SMB/CIFS). 호스트와 계정을 입력하면 공유 이름을 선택할 수 있습니다.","prt_bd":"Baidu Netdisk. Baidu 오픈 플랫폼에서 앱을 만들고 AppKey / SecretKey를 입력한 뒤 계정을 인증하세요.","没有找到共享":"공유를 찾을 수 없습니다","粘贴授权码 code":"인증 코드 붙여넣기","重新授权":"다시 인증","请选择账号":"계정을 선택하세요","请填写备注":"비고를 입력하세요","账号已丢失":"계정을 찾을 수 없음","已暂存的更改":"스테이지된 변경 사항","全部暂存":"모두 스테이지","全部取消暂存":"모두 스테이지 해제","暂存":"스테이지","无差异":"차이 없음","二进制文件":"바이너리 파일","单栏":"통합 보기","并排":"나란히 보기","点击左侧文件查看差异":"왼쪽 파일을 클릭하여 차이를 확인하세요","未跟踪文件无差异":"추적되지 않은 파일은 차이가 없습니다","请先暂存要提交的文件":"먼저 커밋할 파일을 스테이지하세요","没有已更改的文件":"변경된 파일이 없습니다","未暂存":"스테이지되지 않음","逐行归属":"줄별 이력","无法读取该文件的归属信息":"이 파일의 이력 정보를 읽을 수 없습니다","全部文件":"모든 파일","新建分支":"새 브랜치","删除分支":"브랜치 삭제","确认删除分支":"브랜치를 삭제하시겠습니까?","合并到此分支":"이 브랜치로 병합","新分支名":"새 브랜치 이름","当前分支":"현재 브랜치","切换到":"전환","分支创建成功":"브랜치가 생성되었습니다","分支删除成功":"브랜치가 삭제되었습니다","合并成功":"병합되었습니다","标签":"태그","新建标签":"새 태그","标签名":"태그 이름","暂无标签":"태그 없음","标签创建成功":"태그가 생성되었습니다","标签删除成功":"태그가 삭제되었습니다","标签推送成功":"태그를 푸시했습니다","删除标签":"태그 삭제","确认删除标签":"태그를 삭제하시겠습니까?","请输入标签名":"태그 이름을 입력하세요","推送到远程":"원격으로 푸시","基于提交":"커밋 기준","基于当前提交":"현재 커밋 기준","暂存工作区记录":"스태시 목록","暂无记录":"기록 없음","恢复并删除":"적용 후 삭제","已恢复并删除记录":"복원 후 삭제했습니다","已应用":"적용되었습니다","远程分支":"원격 브랜치","拉取远程信息":"가져오기","拉取并清理已删除分支":"가져오기 및 정리","未配置远程仓库":"원격이 설정되지 않았습니다","签出到本地":"로컬로 체크아웃","拉取完成":"가져오기 완료","冲突":"충돌","采用我方版本":"내 변경 사용","采用对方版本":"상대 변경 사용","标记已解决":"해결됨으로 표시","标记全部已解决":"병합 완료","放弃合并":"병합 중단","确认放弃当前合并并恢复到操作前状态":"중단하고 이전 상태로 복원하시겠습니까?","已解决冲突":"충돌이 해결되었습니다","已放弃合并":"병합이 중단되었습니다","合并已完成":"병합이 완료되었습니다","撤销提交":"커밋 되돌리기","将生成一个反向提交来撤销":"되돌리기 위한 역 커밋을 생성합니다","已撤销":"되돌렸습니다","摘取提交":"체리픽","将该提交应用到当前分支":"이 커밋을 현재 브랜치에 적용","摘取成功":"체리픽 완료","搜索提交":"커밋 검색","提交信息关键词":"커밋 메시지","作者":"작성자","请输入搜索条件":"검색 조건을 입력하세요","操作历史":"작업 이력","回退到此处":"여기로 되돌리기","强制回退(丢弃改动)":"강제 리셋 (변경 버림)","此操作将永久丢弃未提交的改动":"커밋되지 않은 변경 사항이 영구히 삭제됩니다","已回退":"되돌렸습니다","已强制回退":"강제 리셋 완료","子模块":"서브모듈","无子模块":"서브모듈 없음","初始化并更新子模块":"서브모듈 초기화 및 업데이트","子模块更新完成":"서브모듈이 업데이트되었습니다","未初始化":"초기화되지 않음","与记录不一致":"기록과 다름","正常":"정상","当前提交":"현재 커밋","领先上游":"업스트림보다 앞섬","落后上游":"업스트림보다 뒤처짐","钩子":"훅","停用钩子":"훅 비활성화","确认删除并停用":"삭제하고 비활성화하시겠습니까","保存并启用":"저장 후 활성화","已保存并启用":"저장 후 활성화되었습니다","与工作区对比":"작업 트리와 비교","仓库":"저장소","初始化仓库":"저장소 초기화","克隆仓库":"저장소 복제","仓库初始化成功":"저장소가 초기화되었습니다","克隆成功":"복제되었습니다","目录名":"디렉터리 이름","请输入目录名":"디렉터리 이름을 입력하세요","仓库地址":"저장소 주소","请输入仓库地址":"저장소 주소를 입력하세요","当前目录下没有仓库":"여기에 저장소가 없습니다","进入":"열기","修改最后一次提交":"마지막 커밋 수정","已修改最后一次提交":"마지막 커밋이 수정되었습니다","分支比较":"브랜치 비교","两个分支没有差异":"브랜치 간 차이가 없습니다","确认删除远程分支":"원격 브랜치 삭제","该分支会从远程仓库删除":"이 브랜치는 원격 저장소에서 삭제됩니다","删除远程分支":"원격 브랜치 삭제","将":"병합","合并到":"으로","未推送":"푸시되지 않음","已到底部":"더 없음","没有可提交的更改":"커밋할 변경 없음","存在未暂存的改动,是否一并暂存并提交?":"스테이지되지 않은 변경이 있습니다. 함께 스테이지하고 커밋할까요?","二进制文件无法比较":"바이너리 파일은 비교할 수 없습니다","请选择文件查看改动":"변경 사항을 보려면 파일을 선택하세요","clk_edt":"클릭하여 편집","rendering":"렌더링 중…","思维导图":"마인드맵","新窗口打开":"새 탭에서 열기","已选":"선택됨","复制所选":"선택 항목 복사","删除所选":"선택 항목 삭제","全部复制":"전체 복사","多选":"선택","wbvpn_allow":"WebVPN 대상 허용 목록","wbvpn_allow_ph":"한 줄에 하나: 192.168.1.0/24 (CIDR) / 192.168.1.1 (IP) / router.local (도메인, 정확히 일치, 하위 도메인 제외)","wbvpn_tip":"WebVPN 대상 허용 목록. 한 줄에 하나, 세 가지 형식:\\n · CIDR 범위: 192.168.1.0/24\\n · 정확한 IP: 192.168.1.1 (10.0.0.5, fd00::/8, ::1 도 가능)\\n · 정확한 도메인: router.local, nas.example.com (정확히 일치, 하위 도메인 미포함)\\n공인 주소는 기본 허용. 사설, 루프백, 링크 로컬, 클라우드 메타데이터 (169.254.169.254) 등 제한 주소는 기본 차단됩니다. 잘못된 줄은 무시됩니다.","wbvpn_port_range":"프록시 포트 범위","wbvpn_port_tip":"각 대상은 독립적인 포트를 사용합니다. 접속 URL을 열면 해당 사이트를 사용할 수 있으며, 경로가 그대로 유지되어 SPA 라우팅이 정상 동작하고 사이트가 Origin 별로 격리됩니다.","wbvpn_port_tip2":"접속에는 로그인이 필요합니다. 여기서 열면 토큰이 한 번 전달되고 이후에는 쿠키로 세션이 유지됩니다. 대상은 여전히 허용 목록/주소 정책의 적용을 받습니다.","wbvpn_port_tip3":"페이지의 링크가 【활성화된 대상】을 가리키면 해당 대상의 포트로 자동 변환되어 클릭해도 프록시 안에 머뭅니다. 대상으로 설정되지 않은 도메인은 그대로 둡니다.","网页代理目标":"프록시 대상","访问地址":"접속 URL","打开":"열기","已复制":"복사됨","复制失败":"복사 실패","添加成功":"추가됨","目标地址不能为空":"대상 주소를 입력하세요","目标地址例如":"대상 주소, 예: 192.168.1.1:8080","网页代理":"웹 프록시","当前窗口打开":"현재 탭에서 열기","修改成功":"수정되었습니다","浏览器代理编辑":"브라우저 프록시 편집","已禁用":"사용 중지","prt_local":"로컬 디렉토리. 이 컴퓨터에 이미 존재하는 절대 경로를 소스로 지정하면 마운트 후 filecat 내에서 디렉토리 링크로 접근할 수 있습니다.","移动到最上":"맨 위로 이동","移动到最下":"맨 아래로 이동","会话设置":"세션 설정","服务器工作目录":"서버 작업 디렉터리","服务器工作目录提示":"예: D:\\\\projects\\\\myapp","AI 聊天":"AI 채팅","动态域名解析":"동적 DNS","平台":"공급자","账号凭证":"자격 증명","域名绑定":"도메인 바인딩","IP 来源":"IP 소스","域名":"도메인","多个域名用空格分隔":"여러 도메인은 공백으로 구분","绑定":"바인딩","填写格式":"형식","请填写账号凭证":"자격 증명을 입력하세요","确定删除吗":"삭제하시겠습니까?","ddns_help_1":"DDNS를 설정하면 DNS 레코드를 현재 공용 IP로 자동 업데이트합니다.","ddns_help_2":"IP 소스는 로컬 네트워크 인터페이스와 사용자 지정 HTTP 엔드포인트를 지원합니다.","请输入地址":"URL을 입력하세요","IP 来源管理":"IP 소스 관리","暂无数据":"데이터 없음","http_source_tip":"IP 소스를 추가합니다. 공용 IP를 반환하는 HTTP 엔드포인트(예: https://4.ipw.cn) 또는 고정 IP를 사용할 수 있습니다.","同步间隔":"동기화 간격","账号状态":"계정","上次同步":"마지막 동기화","验证":"검증","未验证":"미검증","失败":"실패","同步完成":"동기화 완료","间隔不能小于 10 秒":"간격은 10초 이상이어야 합니다","文字":"텍스트","请填写完整的账号凭证":"모든 자격 증명을 입력하세요","加载时间线失败":"타임라인 로드 실패","展开编辑":"편집 표시","收起编辑":"편집 숨기기","添加阶段":"단계 추가","上移":"위로 이동","下移":"아래로 이동","起始时间":"시작 시간","结束时间":"종료 시간","阶段倒置":"단계 반전","在阶段前插入":"앞에 삽입","在阶段后插入":"뒤에 삽입","拖动排序":"드래그하여 순서 변경","导出 SVG":"SVG 내보내기","折叠全部阶段":"모든 단계 접기","展开全部阶段":"모든 단계 펼치기","导出图片":"이미지로 내보내기","导出图片失败":"이미지 내보내기 실패","撤销":"실행 취소","重做":"다시 실행","缩小":"축소","放大":"확대","重置缩放":"확대/축소 초기화","进入编辑模式":"편집 모드 시작","退出编辑模式":"편집 모드 종료","事件":"이벤트","标题":"제목","描述":"설명","日期":"날짜","左侧":"왼쪽","右侧":"오른쪽","颜色":"색상","自定义颜色":"사용자 지정 색상","跟随阶段":"단계 따르기","拖动事件气泡可改变位置与所属阶段":"버블을 드래그하여 위치와 단계 변경","删除事件":"이벤트 삭제","在左侧添加事件":"왼쪽에 이벤트 추가","在右侧添加事件":"오른쪽에 이벤트 추가","删除阶段":"단계 삭제","阶段":"단계","阶段头":"단계 헤더","显示":"표시","隐藏":"숨기기","拖动阶段头可调整顺序":"헤더를 드래그하여 순서 변경","用上移下移调整事件顺序,用左右切换事件所在侧":"위/아래로 이벤트 순서를, 좌/우로 이벤트 표시 위치를 변경합니다","拖动调整阶段高度":"드래그하여 단계 높이 조정","未命名":"제목 없음","有未保存的修改,确定要关闭吗?":"저장되지 않은 변경 사항이 있습니다. 닫으시겠습니까?","纵向":"세로","横向":"가로","节点样式":"노드 스타일","圆点":"점","圆形":"원","方形":"사각형","图片":"이미지","卡片样式":"카드 스타일","卡片":"카드","朴素":"심플","气泡":"말풍선","连线风格":"선 스타일","实线":"실선","虚线":"파선","点线":"점선","显示连线":"연결선 표시","上侧":"위쪽","下侧":"아래쪽","添加事件":"이벤트 추가","图片地址":"이미지 URL","拖动调整卡片宽度":"드래그하여 카드 너비 조정","拖动调整连线长度":"드래그하여 연결선 길이 조정","隐藏阶段头":"단계 헤더 숨기기","显示阶段头":"단계 헤더 표시","时间线":"타임라인","添加子节点":"자식 노드 추가","添加同级节点":"형제 노드 추가","删除节点":"노드 삭제","插入图片":"이미지 삽입","插入图标":"아이콘 삽입","插入超链接":"하이퍼링크 삽입","节点备注":"노드 메모","结构":"구조","逻辑结构图":"논리 구조도","组织结构图":"조직도","目录组织图":"카탈로그 구조도","时间轴(左)":"타임라인(왼쪽)","时间轴(下)":"타임라인(아래)","时间轴(上)":"타임라인(위)","时间轴(竖)":"타임라인(세로)","鱼骨图":"피시본","鱼骨图(右)":"피시본(오른쪽)","曲线":"곡선","直线":"직선","直连":"직접 연결","默认主题":"기본","经典":"클래식","暗色":"어두운","极简":"미니멀","缤纷":"화려한","请先选中一个节点":"먼저 노드를 선택하세요","请输入链接地址":"링크 주소 입력","加载思维导图失败":"마인드맵 로드 실패","编辑器尚未就绪":"편집기 준비 안 됨","中心主题":"중심 주제","适应窗口":"창에 맞춤","插入父节点":"부모 노드 삽입","粘贴":"붙여넣기","节点标签":"노드 태그","请输入节点备注":"노드 메모 입력","请输入节点标签,多个用逗号分隔":"태그 입력(쉼표로 구분)","添加概要":"요약 추가","删除概要":"요약 삭제","请先选中要合并的节点(按住 Ctrl 拖框可多选)":"병합할 노드를 먼저 선택하세요 (Ctrl+드래그로 다중 선택)","删除图标":"아이콘 삭제","删除备注":"메모 삭제","删除超链接":"링크 삭제","供应商设置":"공급자 설정","默认model":"기본 모델","全局prompt":"전역 프롬프트","全局":"전역","model请求参数json编写":"요청 매개변수 JSON","额外参数设置":"추가 매개변수","编辑器自动保存":"에디터 자동 저장","自动保存间隔(秒)":"자동 저장 간격(초)","请输入不小于 1 的整数(秒)":"1 이상의 정수를 입력하세요(초)","文本编辑器(ace)":"텍스트 에디터(Ace)","md编辑器":"MD 에디터","思维导图编辑器":"마인드맵 에디터","draw编辑器":"Draw 에디터","时间线编辑器":"타임라인 에디터","图片编辑器":"이미지 에디터","excel编辑器":"Excel 에디터","编辑器":"에디터","cron表达式":"Cron 표현식","系统提示词":"시스템 프롬프트","不使用":"사용 안 함","消息数":"메시지 수","来源":"출처","更多操作":"추가 작업","环境变量":"환경 변수","暂无环境变量":"환경 변수가 없습니다","环境变量的 KEY 不能为空":"환경 변수 KEY는 비워둘 수 없습니다","重启成功":"재시작 성공","重启服务":"서비스 재시작","配置已保存,是否立即重启该服务让新配置生效?":"설정이 저장되었습니다. 지금 서비스를 재시작하여 적용하시겠습니까?","暂停中":"일시정지 중","discard":"변경 사항 취소","discarded":"변경 사항을 취소했습니다","discard_untracked_tip":"이 파일은 버전 관리 대상이 아닙니다. 취소하면 영구적으로 삭제됩니다. 계속하시겠습니까?","discard_modified_tip":"로컬 변경 사항이 삭제되고 저장소 버전으로 되돌아갑니다. 계속하시겠습니까?","discard_selected_tip":"선택한 {{n}}개 파일의 로컬 변경 사항을 삭제합니다. 계속하시겠습니까?","加载资源失败":"리소스를 불러오지 못했습니다","网络错误":"네트워크 오류","没有安装smartmontools":"smartmontools가 설치되어 있지 않습니다","挂载文件已生效":"마운트 파일이 적용되었습니다","刷新成功":"새로고침 완료","未选择转发送 client":"전달 클라이언트를 선택하지 않았습니다","删除完成":"삭제 완료","保护路径不能删除":"보호된 경로는 삭제할 수 없습니다","MCP工具加载成功":"MCP 도구 로드 완료","没有选中":"선택된 항목이 없습니다","不能为空":"비워 둘 수 없습니다","和原文件格式后缀一样":"원본 파일과 같은 확장자입니다","发生错误":"오류가 발생했습니다","不支持的文件后缀":"지원하지 않는 확장자입니다","更新到AI知识库成功":"AI 지식 베이스에 추가되었습니다","文件名不能为空":"파일 이름을 비워 둘 수 없습니다","挂载目录不能为空":"마운트 디렉터리를 비워 둘 수 없습니다","重复挂载":"중복 마운트입니다","该设备块没有具体路径":"이 장치에는 구체적인 경로가 없습니다","该设备块没有文件系统":"이 장치에는 파일 시스템이 없습니다","路由不能为空":"라우트를 비워 둘 수 없습니다","创建完成":"생성 완료","保存完成":"저장 완료","获取进程输出失败":"프로세스 출력을 가져오지 못했습니다","进程已终止":"프로세스가 종료되었습니다","终止进程失败":"프로세스 종료 실패","账号密码不能为空":"계정과 비밀번호를 비워 둘 수 없습니다","两次密码不一样":"비밀번호가 일치하지 않습니다","目录不能为空":"디렉터리를 비워 둘 수 없습니다","秒数不能为空":"초를 비워 둘 수 없습니다","清理完成,重新登录":"정리 완료, 다시 로그인하세요","密钥不能为空":"키를 비워 둘 수 없습니다","保存到服务器":"서버에 저장","加载资源失败,请检查文件":"리소스를 불러오지 못했습니다. 파일을 확인하세요","操作成功":"완료","未获取到路径":"경로를 가져오지 못했습니다","复制成功":"복사 완료","暂无聊天记录":"채팅 기록이 없습니다","暂无内容":"내용이 없습니다","到达顶部":"맨 위에 도달했습니다","范围在0-100":"범위는 0-100입니다","不存在的http method":"지원하지 않는 HTTP 메서드입니다","不存在":"존재하지 않습니다","不是数字":"숫자가 아닙니다","已经存在的页面资源路由配置目录设置":"이 페이지 리소스 라우트 디렉터리는 이미 설정되어 있습니다","mac地址不能为空":"MAC 주소를 비워 둘 수 없습니다","发送唤醒命令成功":"깨우기 명령을 보냈습니다","不能都为空":"모두 비워 둘 수 없습니다"}')}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunkfilecat=self.webpackChunkfilecat||[]).push([[9765],{59765(e){e.exports=JSON.parse('{"title":"FileCat","修改密码":"Change Password","自定义auth":"Custom Auth","tk_exp":"Token Expiration Time","目标":"Target","目标列表":"Targets","被同步的源目录":"Source dir to sync","成功":"Success","已开启":"Enabled","已关闭":"Disabled","sy_tp1":"Only small files are supported, such as config and code files","sy_tp2":"Files are not synced immediately by default, only after modification. With full sync enabled for a target, that client recursively syncs all files on every connect, which is heavy for large trees.","sy_tp3":"One task can have multiple targets, each with its own directory and full sync option.","立即同步":"Sync now","已触发同步":"Sync triggered","操作失败":"Operation failed","tsk_off":"Please enable and save the task first","mnt_type":"Mount type","cred_sel":"Credential","lcl_abs":"Local absolute path to mount","rem_dir":"Remote dir","disp_only":"Name shown in list","语言":"Language","文件夹路径":"Folder Path","编号":"Number","路径":"Path","sub_dir":"Subdirectory","是否默认":"Default","备注":"Remarks","编辑SQL":"Edit SQL","SQL 预设":"SQL Preset","耗时":"Elapsed time","确认":"Confirm","请输入备注":"Please enter note","查询全部表":"Query All Tables","SQL预设设置":"SQL Preset Settings","SQL预设":"SQL Preset","更新保存":"Update & Save","创建新预选项":"Create New Preset","添加预设":"Add Preset","SQL代码":"SQL Code","保存成功":"Saved successfully","大纲":"Outline","新建主题":"New Theme","编辑主题":"Edit Theme","删除主题":"Delete Theme","主题名称":"Theme Name","请输入主题名称":"Please enter theme name","主题实时预览":"Live preview","删除成功":"Deleted","删除失败":"Delete failed","cf_thm":"Delete this theme?","导出PDF":"Export PDF","no_head":"No headings yet","未命名标题":"Untitled heading","更新成功":"Updated successfully","创建成功":"Created successfully","sql_in":"Please enter SQL statement","新密码":"New Password","新账号":"New Account","关闭":"Close","开启":"Open","展开":"Expand","指定时间":"Specified Time","永不过期":"Never Expire","清空token":"Clear Token","保存":"Save","确定":"Confirm","确定修改":"Confirm Modification","删除":"Delete","添加":"Add","系统":"System","follow_sys":"Follow system setting","no_theme":"No theme","自定义页面路由":"Custom Page Route","api_rt":"Custom API Route","跳转路由":"Redirect Route","路由":"Route","文件":"File","自定义路由":"Custom Routes","编辑":"Edit","查看":"View","默认配置":"Default Configuration","设置":"Settings","退出登录":"Log Out","虚拟网络":"Virtual Network","系统信息":"System Information","工具箱":"Toolbox","索引":"Index","文件夹":"Folder","客户端":"Client","服务器":"Server","服务端":"Server Side","基本信息":"Basic Information","系统性能":"System Performance","总容量":"Total Capacity","剩余":"Remaining","使用率":"Usage Rate","内存":"Memory","系统进程":"System Processes","doc_ct":"Docker Containers","物理硬盘":"Physical Hard Disk","文件硬盘":"File Hard Disk","容器":"Container","名字":"Name","镜像":"Image","命令":"Command","状态":"Status","选择":"Select","过滤":"Filter","账号":"Account","密码":"Password","目录":"Directory","私钥路径":"Private Key Path","连接地址":"Connection Address","端口":"Port","port":"port","host":"host","key":"key","代理":"Proxy","浏览器":"Browser","网络唤醒":"Wake-on-LAN","时间工具":"Time Tools","切换样式":"Switch Style","更多":"More","创建文件夹":"Create Folder","创建文件":"Create File","连接":"Connect","地址":"Address","目标设备":"Target Device","发送":"Send","腾讯":"Tencent","云":"Cloud","厂商":"Vendor","名称":"Name","厂商名称":"Vendor Name","类型":"Type","容量":"Capacity","挂载位置":"Mount Point","剩余容量":"Remaining Capacity","登录":"Login","是":"Yes","否":"No","秒":"Seconds","流量转发":"Traffic Forwarding","点对点":"Peer-to-Peer","模式":"Mode","虚拟":"Virtual","在线状态":"Online Status","物理":"Physical","账号设置":"Account Settings","说明":"Description","文件系统类型":"File System Type","机械":"Mechanical","固态":"Solid State","复制":"Copy","剪切":"Cut","压缩":"Compress","下载":"Download","重命名":"Rename","创建文本文件":"Create Text File","解压":"Extract","转换到":"Convert To","自定义":"Custom","粘贴到此处":"Paste Here","创建":"Create","制造商":"Manufacturer","总内存":"Total Memory","最大":"Maximum","品牌":"Brand","逻辑核心":"Logical Cores","搜索当前目录":"Search Current Directory","压缩文件":"Compressed File","取消":"Cancel","环境控制":"Environment Control","control_env_tip":"Configured with env-style key-value text; comment out a line to disable it. allowed_hosts only permits matching hosts, forbid_hosts rejects matching hosts. Values are regular expression arrays (full match, hostname only without port). Rejected requests are disconnected immediately without any response.","只支持以下配置项":"Only these keys are supported","值必须是 JSON 数组":"Value must be a JSON array","正则表达式不合法":"Invalid regular expression","运行":"Run","格式":"Format","压缩到":"Compress To","进度":"Progress","解压到":"Extract To","当前目录":"Current Directory","解压文件":"Extract File","视频格式转换":"Video Format Conversion","gen_dir":"The generated file is in this directory","ff_fmt":"Target formats supported by ffmpeg","del_f":"Delete selected files?","输入目录名":"Enter directory name","cut_ovr":"Confirm cut (overwrite)","cp_ovr":"Confirm copy (overwrite)","修改名字":"Change Name","输入新名字":"Enter new name","个文件正在上传":"files are uploading","确定删除":"Confirm Deletion","是否删除":"Delete?","输入文本名":"Enter text name","添加索引":"Add Index","物理核心":"Physical Cores","创建目录":"Create Directory","访问目录":"Access Directory","mac_dst":"Target Device MAC Address","要代理的url":"URL to Proxy","系统代理端口":"System Proxy Port","返回":"Return","不允许为空":"Cannot be empty","ff_none":"ffmpeg not found","disk":"Disk","part":"Partition","lvm":"Logical Volume","网址":"Website","环境":"Environment","外部软件":"External Software","保护路径":"Protected Path","软件":"Software","是否安装":"Installed","角色管理":"Role Management","用户管理":"User Management","角色id":"Role ID","角色名":"Role Name","用户id":"User ID","用户名":"Username","目录范围":"Directory Scope","可执行的命令":"Executable Commands","禁止目录范围":"Forbidden Directory Scope","可执行命令":"Executable Command","系统进程关闭":"System Process Shutdown","dc_ctdl":"Stop/Delete Docker Container","dc_idl":"Delete Docker Image","tk_time":"Modify Token Time","自定义资源路由":"Custom Resource Route","磁盘挂载":"Disk Mount","ssh_sv":"Save SSH Key to Disk","外部软件路径":"External Software Path","log_del":"File Delete, Cut, Rename","内容更新":"Update Content","标签编辑权限":"Label Edit Permission","ssh代理":"SSH Proxy","http代理":"HTTP Proxy","浏览器代理":"Browser Proxy","rdp代理":"RDP Proxy","rtsp播放器":"RTSP Player","tag_pub":"Label edits are visible to all users","角色":"Role","文件回收站":"File Recycle Bin","个人保护路径":"Personal Protected Path","系统保护路径":"System Protected Path","小于一分钟":"Less than a minute","分钟前":"Minutes ago","小时前":"Hours ago","天前":"Days ago","月前":"Months ago","年前":"Years ago","挂载位置磁盘":"Mounted Disk","信息":"Information","磁盘剩余":"Disk Remaining","文件系统":"File System","文件夹数":"Number of Folders","文件数":"Number of Files","当前位置":"Current Location","输入文件名":"Enter File Name","o_stdo":"Open with Studio","o_img":"Open with Image Editor","预览图片":"Preview Image","运行并实时查看":"Run and View in Real Time","实时查看":"Real-Time View","输入参数运行":"Run with Parameters","以文本打开":"Open as Text","以日志打开":"Open as Log","上传":"Upload","文件选项":"File Options","添加类目":"Add Category","全部编辑":"Edit All","输入类目名":"Enter Category Name","折叠":"Collapse","全部折叠":"Collapse All","(无内容)":"(No Content)","请求头":"Request Header","请求体":"Request Body","值":"Value","上传文件":"Upload File","下载到本地目录":"Download to Local Directory","本地地址":"Local Address","完成":"Complete","结束":"End","响应头":"Response Header","正在下载":"Downloading","输入标签名":"Enter Label Name","frm_lm":"Form contains file, browser restrictions prevent addition","非对称密钥":"Asymmetric Key","将覆盖密钥文件":"Will Overwrite Key File","加密算法":"Encryption Algorithm","输出格式":"Output Format","普通PEM":"Standard PEM","生成":"Generate","ssh_dir":"Save to .ssh Directory","私钥":"Private Key","时间转换器":"Time Converter","格式化时间":"Format Time","毫秒":"Milliseconds","分秒":"Minutes and Seconds","实时信息":"Real-Time Info","运行用户":"Running User","当前系统":"Current System","进程":"Process","ld_wait":"Loading, please wait...","选中":"Selected","创建用户":"Create User","升序":"Ascending","降序":"Descending","dc_nne":"Docker not detected, host may not have Docker installed or no containers","过滤镜像":"Filter Images","列表更新":"Update List","执行命令":"Execute Command","打印日志":"Print Logs","删除容器":"Delete Container","删除镜像":"Delete Image","doc_img":"Docker Image","doc_icf":"Are you sure you want to delete selected image(s)?","系统运行于":"System Running On","全局变量":"Global Variables","up_conc":"Max Concurrent File Uploads","单用户并发数量":"Concurrent Uploads Per User","系统并发数量":"System Concurrent Uploads","big_res":"Enable Large File Resume","big_sz":"Large File Threshold (MB)","大文件并发数量":"Large File Concurrent Uploads","big_ck":"Large File Chunk Size (MB)","页面资源路由":"Page Resource Route","wf_rt":"Workflow Trigger Route","过期时间(s)":"Expiration Time (s)","文件路径":"File Path","path_up":"Update System Protected Path","path_md":"Modify PATH Variable","执行用户":"Executing User","执行":"Execute","wf_api":"Modify Workflow Trigger API","up_lim":"Modify Directory Upload File Count Limit","功能权限":"Feature Permissions","角色备注":"Role Remarks","pxy_off":"Disable HTTP Proxy Download","工具功能":"Tool Functions","全局变量设置":"Global Variable Settings","文件回收站修改":"Modify File Recycle Bin","文件权限":"File Permission","log_wr":"File creation, upload, content update, decompress","只读目录范围":"Scope of the read-only directory","更新":"update","use_env":"Environment variables are used by default","sync_sv":"sync message to selected server","add_rot":"Add the HTTP Resource Root Directory","dl_here":"Download the HTTP resources in this directory","文件排序":"file sort","系统默认":"sys default","修改时间":"mtime","时间逆序":"time desc","时间顺序":"time asc","大小逆序":"size desc","大小顺序":"size asc","文件大小":"file size","网站标题":"web site title","通用设置":"Common Setting","主题":"theme","时区":"time zone","时间":"time","服务器时间":"server time","在线时间":"online time","离线时间":"offline time","在线":"online","离线":"offline","功能文档":"Function Specification","官网地址":"https://filecat.xiaobaidadada.fun/#/en","远程代理":"Remote Proxy","系统管理":"System Management","网址导航":"Site Navigation","目录快捷命令":"Directory Shortcut Command","文件快捷命令":"File Shortcut Command","系统网络":"Sys Net","复制名字":"Copy Name","分享":"Share","复制绝对路径":"Copy Absolute Path","复制相对路径":"Copy Relative Path","切换目录":"Switch Directory","统计信息":"Statistics","更新AI知识库":"Update AI Knowledge Base","exp_hr":"Remaining Expiration Time (hours)","可以为空":"Can be empty","自动加载":"Auto Load","本地知识库":"Local Knowledge Base","知识库加载信息":"Knowledge Base Load Info","最近一次加载":"Last Load Time","加载进度":"Load Progress","总文件数量":"Total File Count","总文件字符数量":"Total File Character Count","总文件大小":"Total File Size","总耗时":"Total Duration","上一页":"Previous Page","目标地址":"Target Address","目标端口":"Target Port","连接状态":"Connection Status","个人设置":"Personal Settings","系统设置":"System Settings","文件后缀":"File Suffix","禁止执行的命令":"Forbidden Commands","Ai 配置":"AI Configuration","文件分享":"File Sharing","输入跳转的目录":"Enter target directory to jump","文件分享列表":"File Sharing List","过期小时":"Expiration Hours","下载次数":"Download Count","剩余时间":"Remaining Time","文件加载方式":"File Loading Mode","全部加载文件":"Load All Files","scrll_l":"Load Files with Infinite Scroll","剩余时间(h)":"Remaining Time (h)","网络代理":"Network Proxy","个人":"Personal","安装方式":"Installation Method","是否开启":"Enabled","系统启动执行":"Run on System Startup","表达式":"Expression","用户":"User","详细信息":"Details","服务器配置":"Server Configuration","客户端列表":"Client List","更多服务器":"More Servers","端口映射":"Port Mapping","序号":"No.","服务器端口":"Server Port","转发客户端名称":"Forwarding Client Name","服务端口":"Service Port","转发ip":"Forwarding IP","转发端口":"Forwarding Port","客户端代理配置":"Client Proxy Configuration","客户端桥接配置":"Client Bridge Configuration","远程地址":"Remote Address","在线时长":"Online Duration","fwd_nm":"Forwarding Client Name","sv_ntf":"Save and Notify the Client of the First Key and Port","br_port":"Bridge Server Port List","输入消息":"Enter Message","用户权限":"User Permissions","系统管理权限":"System Management Permissions","网络功能权限":"Network Feature Permissions","Ai 设置权限":"AI Settings Permissions","系统设置权限":"System Settings Permissions","系统环境设置":"System Environment Settings","sys_env":"System Environment Settings Page","自定义路由页面":"Custom Route Page","代理功能":"Proxy Features","其他功能":"Other Features","ddns":"DDNS","ai_page":"AI Chat Page","pty cmd":"PTY Cmd","wf_run":"Workflow Execution","wf_user":"Workflow Execution User","cmd_rst":"filecat-restart Restart Command","cmd_upg":"filecat-upgrade Upgrade Command","cmd_dwn":"filecat-down Close Main Process Command","cmd_ai":"AI Command (AI Chat)","个性化设置":"Personalized Settings","lgn_usr":"Display User Info on Login","pxy_url":"HTTP Proxy Address","pxy_tip":"Used for HTTP requests issued by the filecat system (version check, auto-upgrade, DDNS, command download, custom routing, etc.). Note: on macOS, if the system proxy is already enabled, leave this blank to avoid double proxying.","个人环境":"Personal Environment","系统环境":"System Environment","持久化":"Persist","个人环境设置":"Personal Environment Settings","其他参数":"Other Parameters","父编号":"Parent ID","代理配置":"Proxy Configuration","桥接配置":"Bridge Configuration","brg_tip":"Set a port on the client. Accessing this port forwards traffic to the first address within the network environment of another client.","内网穿透":"Intranet Penetration","fc_pxy":"Filecat Proxy Access","fc_pxyw":"Filecat Proxy Access Using Server Frontend","fc_pxyr":"Custom Filecat Proxy Address","fc_pxyc":"Copy filecat proxy URL","fc_pxyo":"Open filecat proxy URL","对端账号":"Remote account","对端密码":"Remote password","保存账号":"Save account","验证登录":"Verify login","已设置":"Set","未设置":"Not set","便于辨认的名字":"A recognizable name","对端 FileCat 登录名":"Remote FileCat login","留空表示不修改":"Leave empty to keep unchanged","请填写对端账号":"Please enter the remote account","已保存":"Saved","文件列表展示":"File List Display","缩放调整":"Zoom Adjustment","缩放百分比":"Zoom Percentage","范围":"Range","结果过多":"Too many results, refine your keyword","已显示":"Shown","时间展示":"Time Display","最近时间":"Recent Time","准确时间":"Exact Time","缩放调整成功":"Zoom adjusted successfully","原客户端":"Source Client","原目录":"Source Directory","目标客户端":"Target Client","目标目录":"Target Directory","忽略目录":"Ignore Directory","双向同步":"Bidirectional Sync","客户端文件同步":"Client File Sync","客户端设置":"Client Settings","pxy_nln":"Do not use proxy server for local (Intranet) addresses","忽略ip":"Ignore IP","ai_ask":"Ask server about everything","本地目录":"Local directory","响应体":"Response body","客户端功能":"Client features","全量同步":"Full synchronization","公钥":"Public Key","跟随系统":"Follow system","字符消耗统计":"Character Usage Statistics","加载中...":"Loading...","对话轮次":"Conversation Turns","AI输入字符":"AI Input Characters","AI输出字符":"AI Output Characters","暂无统计数据":"No Statistics Available","会话":"Sessions","新会话":"New Session","提示词":"Prompt","llm_pmt":"LLM-Editable Prompt","LLM编辑开关":"LLM Edit Switch","编辑规则":"Edit Rules","选择系统提示词":"Select System Prompt","清空全部会话":"Clear All Sessions","cf_all":"Confirm delete all chat sessions?","cf_msgs":"Confirm delete selected messages?","cf_ses":"Confirm delete selected sessions?","cf_one":"Confirm delete this message?","批量选择":"Batch Select","查看所有用户会话":"All Users\' Sessions","查看全部会话时不可发送消息":"Cannot send messages while viewing all sessions","仅看我的会话":"My Sessions Only","取消批量选择":"Cancel Batch Select","删除选中消息":"Delete Selected Messages","删除选中会话":"Delete Selected Sessions","切换模型":"Switch Model","添加文件":"Add File","无描述":"No Description","暂无工具":"No Tools","查看工具":"View Tools","加载工具":"Load Tools","系统会话提示词":"System Session Prompts","删除记录":"Delete Record","手动加载":"Manual Load","从索引删除":"Delete from Index","知识库开关":"Knowledge Base Switch","文本对话":"Text Chat","图片生成":"Image Generation","向量嵌入":"Vector Embedding","图片参数设置":"Image Parameter Settings","更多属性":"More Attributes","model类型":"Model Type","成为tool":"Become Tool","操作":"Operations","https_s":"HTTPS Settings","ssl_crt":"SSL Certificate Path","ssl_key":"SSL Private Key Path","crt_pth":"Certificate Path (cert.pem/fullchain.pem)","ky_pth":"Private Key Path (privkey.pem)","查看Git提交":"View Git Commits","Git":"Git","变更":"Changes","提交记录":"Commits","全选":"Select All","没有变更":"No changes","暂无提交记录":"No commits yet","分支":"Branch","git_msg":"Enter commit message...","提交":"Commit","暂存全部":"Stage All","暂存选中":"Stage Selected","取消暂存":"Unstage","已暂存":"Staged","已暂存全部":"All staged","已取消暂存":"Unstaged","请输入提交信息":"Please enter commit message","提交成功":"Commit successful","推送成功":"Push successful","拉取成功":"Pull successful","切换分支成功":"Branch switched","远程操作":"Remote Operations","拉取":"Pull","推送":"Push","强制推送":"Force Push","暂存工作区":"Stash","暂存工作区成功":"Stash successful","恢复工作区":"Stash Pop","恢复工作区成功":"Stash pop successful","刷新":"Refresh","请先选择文件":"Please select files first","提示:":"Tips:","git_stg":"Check files on the left, then use \\"Stage Selected\\" to add them to staging area","git_cmt":"Enter commit message and click \\"Commit\\"","git_cf":"If conflicts occur, please resolve them in shell before committing","git_frc":"\\"Force Push\\" will overwrite the remote branch, use with caution","配置表":"Config Table","自动升级":"Auto Upgrade","exe_tpl":"EXE Download URL Template","offcal":"Leave empty to use official GitHub Releases","检测频率(秒)":"Check Interval (seconds)","def_180":"Default 180s (3 minutes)","chk_10s":"Check interval cannot be less than 10 seconds","ver_url":"Version Check URL","ver_req":"Version check URL cannot be empty","用户配置":"User Config","邮箱":"Email","代理设置":"Proxy Settings","全局代理":"Global Proxy","仓库代理":"Repository Proxy","修改":"Edit","用户配置已保存":"User config saved","代理配置已保存":"Proxy config saved","pxy_clr":"Leave empty to clear proxy","pxy_nte":"User config and global proxy apply to all repositories","端口扫描":"Port Scan","目标主机":"Target Host","起始端口":"Start Port","结束端口":"End Port","并发数":"Concurrency","超时(ms)":"Timeout (ms)","扫描":"Scan","扫描结果":"Scan Results","扫描完成":"Scan complete","扫描失败":"Scan failed","正在扫描...":"Scanning...","未发现开放端口":"No open ports found","scan_in":"Enter parameters and click scan","hostreq":"Host address cannot be empty","端口范围无效":"Invalid port range","portrng":"Start port cannot be greater than end port","开放":"Open","总计扫描":"Total Scanned","已发现":"Found","当前":"Current","扫描已取消":"Scan cancelled","自动换行":"Auto Wrap","不换行":"No Wrap","替换":"Replace","env编辑":"Env edit","命令确认":"Command Confirm","命令检测开启":"Enable command detection","命令检测关闭":"Disable command detection","命令检测已开启":"Command detection enabled","命令检测已关闭":"Command detection disabled","此会话不再询问":"Don\'t ask again for this session","doc_pxy":"Docker Proxy Config","HTTP 代理":"HTTP Proxy","pxy_htt":"HTTPS Proxy","pxy_nne":"No Proxy","保存失败":"Save failed","MD编辑器":"MD Editor","行":"Row","列":"Column","默认":"Default","删除行":"Delete row","删除列":"Delete column","上方插入行":"Insert row above","切换表头行":"Toggle Header Row","合并单元格":"Merge Cells","拆分单元格":"Split Cell","下方插入行":"Insert row below","左侧插入列":"Insert column left","右侧插入列":"Insert column right","插入表格":"Insert table","加载中":"Loading","打开失败":"Failed to open","重启失败":"Restart failed","doc_cfg":"Docker Config","名单视图":"List view","文本视图":"Text view","目标(To)":"Target (To)","动作":"Action","fw_from":"Source (From)","删除规则":"Delete rule","规则编号":"Rule number","点击复制":"Click to copy","镜像加速":"Registry Mirrors","不安全仓库":"Insecure Registries","开启调试":"Enable debug","数据存储目录":"Data Root","存储驱动":"Storage Driver","日志驱动":"Log Driver","fw_iptb":"Enable iptables","lve_rst":"Live Restore","添加规则":"Add rule","请填写端口号":"Please enter a port","方向":"Direction","协议":"Protocol","来源地址":"Source address","获取失败":"Failed to get","进程环境变量":"Process Environment Variables","端口实例":"Port Instance","srchbln":"Open directory in blank search mode","搜索会话":"Search sessions","sw_mdl":"Allow switching AI models","选择模型":"Select model","mv_self":"Cannot move a folder into itself","网站 Logo":"Website Logo","lclorur":"Local file path or http(s) image URL","全部":"All","源码模式":"Source mode","实时编辑模式":"Live edit mode","编辑器设置":"Editor settings","正文最大宽度":"Max content width","正文左右边距":"Content side padding","正文字号":"Content font size","行高":"Line height","恢复默认":"Restore defaults","保存中":"Saving","预览":"Preview","nprmtp":"You do not have permission to change this setting. The current configuration is shown below.","md_set":"MD editor settings","目录挂载":"Directory Mount","总开关":"Master switch","挂载":"Mount","挂载到网盘":"Mount to cloud drive","编辑挂载配置":"Edit mount settings","取消挂载":"Unmount","确认取消挂载":"Confirm unmount","已取消挂载":"Unmounted","该目录尚未挂载":"This directory is not mounted","挂载目录":"Mount directory","只读":"Read-only","挂载类型":"Mount type","显示名称":"Display name","标识色":"Marker color","只读模式":"Read-only mode","测试连接":"Test connection","测试中":"Testing","连接成功":"Connection succeeded","连接失败":"Connection failed","请选择挂载类型":"Please select a mount type","请填写":"Please fill in: ","未授权":"Unauthorized","服务地址":"Server URL","起始目录":"Start directory","留空表示根目录":"Leave empty for the root directory","主机":"Host","默认 22":"Default 22","私钥内容":"Private key content","与私钥二选一":"Choose either this or the private key","与密码二选一":"Choose either this or the password","存储桶":"Bucket","区域":"Region","强制路径风格":"Force path style","授权账号":"Authorized account","百度网盘授权":"Baidu Netdisk authorization","去授权":"Authorize","完成授权":"Complete authorization","授权码":"Authorization code","回调地址":"Redirect URI","rqappky":"Please enter AppKey","rq_scrt":"Please enter SecretKey","请填写授权码":"Please enter the authorization code","svappfr":"Please save the app configuration first","授权成功":"Authorization succeeded","账号可用":"Account is available","账号不可用":"Account is unavailable","校验":"Verify","已授权账号":"Authorized accounts","已删除":"Deleted","处理中":"Processing","AppKey":"AppKey","网盘挂载":"Cloud drive mount","凭据管理":"Credentials","凭据":"Credential","新增凭据":"Add credential","凭据已丢失":"Credential missing","挂载列表":"Mounts","新增挂载":"Add mount","munt_rq":"Mount directory cannot be empty","请选择凭据":"Please select a credential","请选择类型":"Please select a type","启用":"Enabled","已停用":"Disabled","确认删除":"Confirm deletion of","nmuntpr":"The current account has no permission for directory mounting","百度网盘":"Baidu Netdisk","应用配置":"App settings","授权":"Authorize","授权失败":"Authorization failed","strtdrt":"Start dir","ftr2rmt":"Forward to remote","ftr2rmt_tip":"Terminal, workflow and git requests under this dir run on the remote FileCat","授权检测":"Auth check","scrtkep":"Leave SecretKey empty to keep unchanged","编辑应用":"Edit app","新增授权账号":"Add authorized account","一键授权":"One-click authorize","outh_ob":"Manual (oob)","pst_cd":"Paste the authorization code","确认授权":"Confirm authorization","授权检测/刷新":"Verify / refresh","检测完成":"Check completed","导入":"imported","账号名":"Account name","百度账号":"Baidu account","网盘昵称":"Netdisk nickname","授权状态":"Auth status","过期时间":"Expires at","授权时间":"Authorized at","已授权":"Authorized","已过期":"Expired","停用":"Disable","已配置":"Configured","未配置":"Not configured","网盘使用":"Netdisk enabled","自动刷新":"Auto refresh","编辑账号":"Edit account","使用":"Use","当前为挂载目录":"Mounted directory","启用挂载":"Enable mounts","已启用":"Enabled","挂载已启用":"Mounts enabled","挂载已停用":"Mounts disabled","muntont":"Mounts enabled, click to disable","muntoff":"Mounts disabled, click to enable","凭证管理":"Credentials","授权方式":"Authorization Mode","去授权(一键)":"Authorize (one-click)","去授权(手动)":"Authorize (manual)","保存应用配置":"Save App Config","atathtp":"One-click: you will be redirected back here after authorization and the account is added automatically","atathnt":"One-click requires registering this service\'s /mount/baidu/callback as the redirect URI in Baidu\'s console","pstatht":"Manual: no redirect URI needed. After authorizing, copy the code on Baidu\'s page, paste it below and click Complete","crd_tp":"A credential is the account info used to connect to a cloud drive / remote host. It can be shared by multiple mounts, and editing it takes effect everywhere at once.","bidacct":"Baidu Netdisk accounts are not managed here. Authorize them in the \\"Baidu Netdisk\\" panel below; the corresponding account is created automatically after authorization.","pwdkept":"When editing, leaving a password-type field empty means the original value is kept.","tstbfrs":"Before saving, you can click \\"Test connection\\" to verify the account works.","prtwbdv":"A general-purpose file protocol supported by Jianguoyun, Synology NAS, Nextcloud, Alist and more. One service URL plus an account is enough to browse the remote directory.","prtsftp":"Access a directory on a remote server over SSH, transferring files via the SFTP subsystem. Ideal for mounting a directory from another Linux machine.","prt_s3":"Object storage services reachable over the S3 protocol, such as MinIO, Alibaba Cloud OSS, Tencent COS, Qiniu and Cloudflare R2. Requires a service endpoint, a bucket and a key pair.","深搜":"Deep Search","搜索":"Search","搜索中":"Searching","搜文件名":"Search file name recursively","搜到该处":"Go to its folder","打开所在目录":"Open containing folder","输入后搜":"Type a file name and press Enter","无匹配":"No matching files found","结果截断":"Too many results, showing first 500","未加载":"Not loaded","加载成功":"Loaded","加载失败":"Load failed","个工具":"tools","No share found":"No share found","Enter host first":"Enter host first","下一步":"Next","上一步":"Back","共享目录":"Share folder","prt_smb":"Windows shared folder (SMB/CIFS). Fill in the host and account, then pick a share name from the list.","prt_bd":"Baidu Netdisk. Create an app on the Baidu Open Platform, fill in AppKey / SecretKey, then authorize an account.","没有找到共享":"No shares found","粘贴授权码 code":"Paste authorization code","重新授权":"Reauthorize","请选择账号":"Please select an account","请填写备注":"Please enter a note","账号已丢失":"Account missing","已暂存的更改":"Staged Changes","全部暂存":"Stage All","全部取消暂存":"Unstage All","暂存":"Stage","无差异":"No differences","二进制文件":"Binary file","单栏":"Unified","并排":"Side by side","点击左侧文件查看差异":"Click a file on the left to view its diff","未跟踪文件无差异":"Untracked files have no diff","请先暂存要提交的文件":"Stage the files you want to commit first","没有已更改的文件":"No changed files","未暂存":"Unstaged","逐行归属":"Blame","无法读取该文件的归属信息":"Cannot read blame info for this file","全部文件":"All files","新建分支":"New branch","删除分支":"Delete branch","确认删除分支":"Delete branch?","合并到此分支":"Merge into this branch","新分支名":"New branch name","当前分支":"Current branch","切换到":"Switch to","分支创建成功":"Branch created","分支删除成功":"Branch deleted","合并成功":"Merged","标签":"Tags","新建标签":"New tag","标签名":"Tag name","暂无标签":"No tags","标签创建成功":"Tag created","标签删除成功":"Tag deleted","标签推送成功":"Tag pushed","删除标签":"Delete tag","确认删除标签":"Delete tag?","请输入标签名":"Enter a tag name","推送到远程":"Push to remote","基于提交":"Based on commit","基于当前提交":"Based on current commit","暂存工作区记录":"Stashes","暂无记录":"No records","恢复并删除":"Pop","已恢复并删除记录":"Restored and removed","已应用":"Applied","远程分支":"Remote branches","拉取远程信息":"Fetch","拉取并清理已删除分支":"Fetch and prune","未配置远程仓库":"No remote configured","签出到本地":"Checkout locally","拉取完成":"Fetch complete","冲突":"Conflicts","采用我方版本":"Use ours","采用对方版本":"Use theirs","标记已解决":"Mark resolved","标记全部已解决":"Finish merge","放弃合并":"Abort merge","确认放弃当前合并并恢复到操作前状态":"Abort and restore to the previous state?","已解决冲突":"Conflict resolved","已放弃合并":"Merge aborted","合并已完成":"Merge finished","撤销提交":"Revert commit","将生成一个反向提交来撤销":"Will create a reverse commit to revert","已撤销":"Reverted","摘取提交":"Cherry-pick","将该提交应用到当前分支":"Apply this commit to the current branch","摘取成功":"Cherry-picked","搜索提交":"Search commits","提交信息关键词":"Commit message","作者":"Author","请输入搜索条件":"Enter search criteria","操作历史":"History","回退到此处":"Reset here","强制回退(丢弃改动)":"Hard reset (discard changes)","此操作将永久丢弃未提交的改动":"This permanently discards uncommitted changes","已回退":"Reset done","已强制回退":"Hard reset done","子模块":"Submodules","无子模块":"No submodules","初始化并更新子模块":"Init and update submodules","子模块更新完成":"Submodules updated","未初始化":"Not initialized","与记录不一致":"Differs from record","正常":"Normal","当前提交":"Current commit","领先上游":"Ahead of upstream","落后上游":"Behind upstream","钩子":"Hooks","停用钩子":"Disable hook","确认删除并停用":"Delete and disable","保存并启用":"Save and enable","已保存并启用":"Saved and enabled","与工作区对比":"Compare with worktree","仓库":"Repos","初始化仓库":"Init repository","克隆仓库":"Clone repository","仓库初始化成功":"Repository initialized","克隆成功":"Cloned","目录名":"Directory name","请输入目录名":"Enter a directory name","仓库地址":"Repository URL","请输入仓库地址":"Enter a repository URL","当前目录下没有仓库":"No repositories here","进入":"Open","修改最后一次提交":"Amend last commit","已修改最后一次提交":"Last commit amended","分支比较":"Compare branches","两个分支没有差异":"No differences between branches","确认删除远程分支":"Delete remote branch","该分支会从远程仓库删除":"This branch will be deleted from the remote repository","删除远程分支":"Delete remote branch","将":"Merge","合并到":"into","未推送":"Not pushed","已到底部":"No more","没有可提交的更改":"Nothing to commit","存在未暂存的改动,是否一并暂存并提交?":"There are unstaged changes. Stage and commit them together?","二进制文件无法比较":"Binary file cannot be compared","请选择文件查看改动":"Select a file to view changes","clk_edt":"Click to edit","rendering":"Rendering…","思维导图":"Mind map","新窗口打开":"Open in new tab","已选":"Selected","复制所选":"Copy selected","删除所选":"Delete selected","全部复制":"Copy all","多选":"Select","wbvpn_allow":"WebVPN Target Allowlist","wbvpn_allow_ph":"One entry per line: 192.168.1.0/24 (CIDR) / 192.168.1.1 (IP) / router.local (domain, exact match, no subdomains)","wbvpn_tip":"WebVPN target allowlist. One entry per line. Three formats are supported:\\n · CIDR range: 192.168.1.0/24\\n · Exact IP: 192.168.1.1 (also 10.0.0.5, fd00::/8, ::1)\\n · Exact domain: router.local, nas.example.com (exact match, subdomains are NOT included)\\nPublic addresses are allowed by default. Private, loopback, link-local, cloud metadata (169.254.169.254) and other reserved addresses are denied unless listed here. Malformed lines are ignored.","wbvpn_port_range":"Proxy Port Range","wbvpn_port_tip":"Each target occupies an independent port. Open the access URL to browse that site; the page path stays clean so SPA routing works and sites are isolated by origin.","wbvpn_port_tip2":"Access requires login: opening from here carries a token once, then a cookie keeps the session. Targets are still subject to the allowlist / address policy.","wbvpn_port_tip3":"Links in the page that point to an enabled target are automatically rewritten to that target\'s port, so clicks stay inside the proxy; domains that are not configured as targets are left untouched.","网页代理目标":"Proxy Targets","访问地址":"Access URL","打开":"Open","已复制":"Copied","复制失败":"Copy failed","添加成功":"Added","目标地址不能为空":"Target address cannot be empty","目标地址例如":"Target address, e.g. 192.168.1.1:8080","网页代理":"Web Proxy","当前窗口打开":"Open in current tab","修改成功":"Updated","浏览器代理编辑":"Browser Proxy Editing","已禁用":"Disabled","prt_local":"Local directory. Enter an existing absolute path on this machine as the source; after mounting you can access it as a directory link inside filecat.","移动到最上":"Move to Top","移动到最下":"Move to Bottom","会话设置":"Session Settings","服务器工作目录":"Server Working Directory","服务器工作目录提示":"e.g. D:\\\\projects\\\\myapp","AI 聊天":"AI Chat","动态域名解析":"Dynamic DNS","平台":"Provider","账号凭证":"Credentials","域名绑定":"Domain Binding","IP 来源":"IP Source","域名":"Domain","多个域名用空格分隔":"Separate multiple domains with spaces","绑定":"Binding","填写格式":"Format","请填写账号凭证":"Please fill in credentials","确定删除吗":"Confirm delete?","ddns_help_1":"Configure DDNS to auto-update DNS records with your current public IP.","ddns_help_2":"IP sources include local network interfaces and custom HTTP endpoints.","请输入地址":"Please enter the URL","IP 来源管理":"Manage IP Sources","暂无数据":"No data","http_source_tip":"Add an IP source: either an HTTP endpoint that returns your public IP (e.g. https://4.ipw.cn), or a fixed IP address.","同步间隔":"Sync Interval","账号状态":"Account","上次同步":"Last Sync","验证":"Verify","未验证":"Unverified","失败":"Failed","同步完成":"Sync completed","间隔不能小于 10 秒":"Interval must be at least 10 seconds","文字":"Text","请填写完整的账号凭证":"Please fill in all credential fields","加载时间线失败":"Failed to load timeline","展开编辑":"Show edit tools","收起编辑":"Hide edit tools","添加阶段":"Add phase","上移":"Move up","下移":"Move down","起始时间":"Start time","结束时间":"End time","阶段倒置":"Reverse phases","在阶段前插入":"Insert before","在阶段后插入":"Insert after","拖动排序":"Drag to reorder","导出 SVG":"Export SVG","折叠全部阶段":"Collapse all phases","展开全部阶段":"Expand all phases","导出图片":"Export as image","导出图片失败":"Failed to export image","撤销":"Undo","重做":"Redo","缩小":"Zoom out","放大":"Zoom in","重置缩放":"Reset zoom","进入编辑模式":"Enter edit mode","退出编辑模式":"Exit edit mode","事件":"Event","标题":"Title","描述":"Description","日期":"Date","左侧":"Left","右侧":"Right","颜色":"Color","自定义颜色":"Custom color","跟随阶段":"Follow phase","拖动事件气泡可改变位置与所属阶段":"Drag the bubble to change its position and phase","删除事件":"Delete event","在左侧添加事件":"Add event on the left","在右侧添加事件":"Add event on the right","删除阶段":"Delete phase","阶段":"Phase","阶段头":"Phase header","显示":"Show","隐藏":"Hide","拖动阶段头可调整顺序":"Drag the phase header to reorder","用上移下移调整事件顺序,用左右切换事件所在侧":"Use move up/down to reorder events, and left/right to switch the event side","拖动调整阶段高度":"Drag to resize phase height","未命名":"Untitled","有未保存的修改,确定要关闭吗?":"There are unsaved changes. Close anyway?","纵向":"Vertical","横向":"Horizontal","节点样式":"Node style","圆点":"Dot","圆形":"Circle","方形":"Square","图片":"Image","卡片样式":"Card style","卡片":"Card","朴素":"Plain","气泡":"Bubble","连线风格":"Line style","实线":"Solid","虚线":"Dashed","点线":"Dotted","显示连线":"Show connectors","上侧":"Top","下侧":"Bottom","添加事件":"Add event","图片地址":"Image URL","拖动调整卡片宽度":"Drag to resize card width","拖动调整连线长度":"Drag to adjust connector length","隐藏阶段头":"Hide phase header","显示阶段头":"Show phase header","时间线":"Timeline","添加子节点":"Add child node","添加同级节点":"Add sibling node","删除节点":"Delete node","插入图片":"Insert image","插入图标":"Insert icon","插入超链接":"Insert hyperlink","节点备注":"Node note","结构":"Structure","逻辑结构图":"Logical structure","组织结构图":"Organization chart","目录组织图":"Catalog chart","时间轴(左)":"Timeline (left)","时间轴(下)":"Timeline (bottom)","时间轴(上)":"Timeline (top)","时间轴(竖)":"Timeline (vertical)","鱼骨图":"Fishbone","鱼骨图(右)":"Fishbone (right)","曲线":"Curve","直线":"Straight","直连":"Direct","默认主题":"Default","经典":"Classic","暗色":"Dark","极简":"Minimal","缤纷":"Colorful","请先选中一个节点":"Select a node first","请输入链接地址":"Enter link URL","加载思维导图失败":"Failed to load mind map","编辑器尚未就绪":"Editor not ready","中心主题":"Central topic","适应窗口":"Fit to window","插入父节点":"Insert parent node","粘贴":"Paste","节点标签":"Node tag","请输入节点备注":"Enter node note","请输入节点标签,多个用逗号分隔":"Enter tags, separated by commas","添加概要":"Add summary","删除概要":"Remove summary","请先选中要合并的节点(按住 Ctrl 拖框可多选)":"Select the nodes to merge first (hold Ctrl and drag to multi-select)","删除图标":"Remove icon","删除备注":"Remove note","删除超链接":"Remove link","供应商设置":"Provider Settings","默认model":"Default model","全局prompt":"Global prompt","全局":"Global","model请求参数json编写":"Request params JSON","额外参数设置":"Extra params","编辑器自动保存":"Editor Auto-Save","自动保存间隔(秒)":"Auto-save interval (sec)","请输入不小于 1 的整数(秒)":"Please enter an integer >= 1 (seconds)","文本编辑器(ace)":"Text editor (Ace)","md编辑器":"MD editor","思维导图编辑器":"Mind map editor","draw编辑器":"Draw editor","时间线编辑器":"Timeline editor","图片编辑器":"Image editor","excel编辑器":"Excel editor","编辑器":"Editors","cron表达式":"Cron Expression","系统提示词":"System prompt","不使用":"None","消息数":"Messages","来源":"Source","更多操作":"More actions","环境变量":"Environment Variables","暂无环境变量":"No environment variables","环境变量的 KEY 不能为空":"Environment variable KEY cannot be empty","重启成功":"Restarted successfully","重启服务":"Restart service","配置已保存,是否立即重启该服务让新配置生效?":"Configuration saved. Restart the service now to apply it?","暂停中":"Pausing","discard":"Discard Changes","discarded":"Changes discarded","discard_untracked_tip":"This file is not tracked. Discarding will delete it permanently. Continue?","discard_modified_tip":"Local changes will be discarded and reverted to the repository version. Continue?","discard_selected_tip":"Local changes to the selected {{n}} file(s) will be discarded. Continue?","加载资源失败":"Failed to load resource","网络错误":"Network error","没有安装smartmontools":"smartmontools is not installed","挂载文件已生效":"Mount file applied","刷新成功":"Refreshed","未选择转发送 client":"No forwarding client selected","删除完成":"Deleted","保护路径不能删除":"Protected path cannot be deleted","MCP工具加载成功":"MCP tools loaded","没有选中":"Nothing selected","不能为空":"Cannot be empty","和原文件格式后缀一样":"Same extension as the original file","发生错误":"An error occurred","不支持的文件后缀":"Unsupported file extension","更新到AI知识库成功":"Added to AI knowledge base","文件名不能为空":"File name cannot be empty","挂载目录不能为空":"Mount directory cannot be empty","重复挂载":"Duplicate mount","该设备块没有具体路径":"This device has no specific path","该设备块没有文件系统":"This device has no filesystem","路由不能为空":"Route cannot be empty","创建完成":"Created","保存完成":"Saved","获取进程输出失败":"Failed to get process output","进程已终止":"Process terminated","终止进程失败":"Failed to terminate process","账号密码不能为空":"Account and password cannot be empty","两次密码不一样":"Passwords do not match","目录不能为空":"Directory cannot be empty","秒数不能为空":"Seconds cannot be empty","清理完成,重新登录":"Cleanup complete, please log in again","密钥不能为空":"Key cannot be empty","保存到服务器":"Save to server","加载资源失败,请检查文件":"Failed to load resource, please check the file","操作成功":"Done","未获取到路径":"Failed to get path","复制成功":"Copied","暂无聊天记录":"No chat history","暂无内容":"No content","到达顶部":"Reached the top","范围在0-100":"Range is 0-100","不存在的http method":"Unsupported HTTP method","不存在":"Not found","不是数字":"Not a number","已经存在的页面资源路由配置目录设置":"This page resource route directory is already configured","mac地址不能为空":"MAC address cannot be empty","发送唤醒命令成功":"Wake command sent","不能都为空":"Fields cannot all be empty"}')}}]);