1 line
13 KiB
JavaScript
1 line
13 KiB
JavaScript
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[662],{4527:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>f});var a=s(5155),n=s(2115),r=s(5299),l=s(9559),i=s(6046),o=s(7612);function u(){let[e,t]=(0,n.useState)(null),[s,u]=(0,n.useState)({}),[v,f]=(0,n.useState)(()=>new Set),[p,m]=(0,n.useState)("status"),[g,x]=(0,n.useState)(!0),[j,y]=(0,n.useState)(!1),[b,w]=(0,n.useState)(null),[N,k]=(0,n.useState)(null),A=(0,n.useRef)(null),E=(0,n.useRef)(null),C=(0,n.useRef)(null),M=(0,n.useMemo)(()=>(null==e?void 0:e.groups.flatMap(e=>e.fields))||[],[e]),S=(0,n.useMemo)(()=>null==e?void 0:e.groups.find(e=>e.id===p),[p,e]),R=(0,n.useMemo)(()=>[{id:"status",label:"状态"},...(null==e?void 0:e.groups.map(e=>{var t,s;return{id:e.id,label:(t=e.id,s=e.title,"auth"===t?"登录":"visual"===t?"图片":"evolink"===t?"EvoLink":"seedance"===t?"方舟":"oss"===t?"OSS":s)}}))||[]],[e]);async function z(){x(!0),k(null),w(null);try{let s=await fetch("/api/settings",{cache:"no-store"}),a=await s.json();if(!s.ok)throw Error(a.error||"读取设置失败");if(t(a),u(c(a)),f(new Set),"status"!==p&&!a.groups.some(e=>e.id===p)){var e;m((null==(e=a.groups[0])?void 0:e.id)||"status")}}catch(e){k(e instanceof Error?e.message:String(e))}finally{x(!1)}}async function _(){if(0!==v.size){y(!0),k(null),w(null);try{let e=await fetch("/api/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({values:Object.fromEntries([...v].map(e=>{var t;return[e,null!=(t=s[e])?t:""]}))})}),a=await e.json();if(!e.ok)throw Error(a.error||"保存设置失败");t(a),u(c(a)),f(new Set),w(a.restartRequired?"配置已保存,重启 Go 服务后生效。":"配置已保存并应用到当前服务。")}catch(e){k(e instanceof Error?e.message:String(e))}finally{y(!1)}}}function q(e,t){u(s=>({...s,[e]:t})),f(t=>{let s=new Set(t);return s.add(e),s})}return((0,n.useEffect)(()=>{z()},[]),(0,n.useEffect)(()=>(0,o.It)(A,e=>(0,o.xr)(e)),[]),(0,n.useEffect)(()=>{(0,o.Js)(C.current)},[N,b]),(0,n.useEffect)(()=>{(0,o.c8)(E.current)},[p]),g&&!e)?(0,a.jsxs)("section",{className:"panel settings-loading",children:[(0,a.jsx)(r.A,{className:"spin",size:18}),"正在读取配置"]}):(0,a.jsxs)("div",{className:"settings-panel",ref:A,children:[(0,a.jsx)("div",{className:"workspace-head","data-animate":!0,children:(0,a.jsx)("div",{children:(0,a.jsx)("h1",{className:"workspace-title",children:"服务设置"})})}),(0,a.jsxs)("section",{className:"panel settings-actions","data-animate":!0,children:[(0,a.jsx)("div",{className:"segmented settings-tabs","aria-label":"设置分类",children:R.map(e=>(0,a.jsx)("button",{className:p===e.id?"active":"","aria-pressed":p===e.id,type:"button",onClick:()=>m(e.id),children:e.label},e.id))}),(0,a.jsxs)("div",{className:"toolbar",children:[(0,a.jsxs)("button",{className:"button",type:"button",onClick:z,disabled:g||j,children:[g?(0,a.jsx)(r.A,{className:"spin",size:18}):(0,a.jsx)(l.A,{size:18}),"刷新"]}),(0,a.jsxs)("button",{className:"button primary",type:"button",onClick:_,disabled:j||0===v.size||!M.length&&!(null==e?void 0:e.engineAssignments.length),children:[j?(0,a.jsx)(r.A,{className:"spin",size:18}):(0,a.jsx)(i.A,{size:18}),"保存"]})]})]}),N||b?(0,a.jsxs)("div",{ref:C,children:[N?(0,a.jsx)("div",{className:"callout",role:"alert",children:N}):null,b?(0,a.jsx)("div",{className:"callout success-callout",role:"status","aria-live":"polite",children:b}):null]}):null,S?(0,a.jsxs)("section",{className:"panel settings-group","data-animate":!0,ref:E,children:[(0,a.jsx)("div",{className:"settings-group-head",children:(0,a.jsx)("div",{children:(0,a.jsx)("h2",{children:S.title})})}),(0,a.jsx)("div",{className:"settings-field-grid",children:S.fields.map(e=>{var t,n;return(0,a.jsxs)("label",{className:"field settings-field",children:[(0,a.jsxs)("span",{children:[e.label,e.secret?(0,a.jsx)("em",{children:e.configured?"已配置":"未配置"}):null]}),"select"===e.type?(0,a.jsx)("select",{value:null!=(t=s[e.key])?t:e.value,onChange:t=>q(e.key,t.target.value),children:(e.options||[]).map(e=>(0,a.jsx)("option",{value:e.value,children:e.label},e.value))}):(0,a.jsx)("input",{type:e.secret?"password":"number"===e.type?"number":"text",value:null!=(n=s[e.key])?n:"",placeholder:e.secret&&e.configured?"留空保留当前密钥":e.description||"",onChange:t=>q(e.key,t.target.value)}),(0,a.jsx)("small",{children:e.key})]},e.key)})})]},S.id):null,"status"===p?(0,a.jsxs)("section",{className:"panel settings-group","data-animate":!0,ref:E,children:[(0,a.jsx)("div",{className:"settings-group-head",children:(0,a.jsx)("div",{children:(0,a.jsx)("h2",{children:"功能引擎"})})}),(0,a.jsxs)("div",{className:"settings-service-strip",children:[(0,a.jsx)(d,{label:"即梦",value:h(null==e?void 0:e.services.visual),ready:!!(null==e?void 0:e.services.visual)}),(0,a.jsx)(d,{label:"EvoLink",value:h(null==e?void 0:e.services.evolink),ready:!!(null==e?void 0:e.services.evolink)}),(0,a.jsx)(d,{label:"Seedance",value:h(null==e?void 0:e.services.seedance),ready:!!(null==e?void 0:e.services.seedance)}),(0,a.jsx)(d,{label:"Seedream",value:h(null==e?void 0:e.services.seedream),ready:!!(null==e?void 0:e.services.seedream)}),(0,a.jsx)(d,{label:"百炼",value:h(null==e?void 0:e.services.bailian),ready:!!(null==e?void 0:e.services.bailian)}),(0,a.jsx)(d,{label:"账户",value:h(null==e?void 0:e.services.auth),ready:!!(null==e?void 0:e.services.auth)}),(0,a.jsx)(d,{label:"组织",value:h(null==e?void 0:e.services.organization),ready:!!(null==e?void 0:e.services.organization)})]}),(0,a.jsxs)("div",{className:"settings-engine-table",role:"table","aria-label":"功能引擎",children:[(0,a.jsxs)("div",{className:"settings-engine-row settings-engine-head",role:"row",children:[(0,a.jsx)("span",{children:"功能"}),(0,a.jsx)("span",{children:"引擎"}),(0,a.jsx)("span",{children:"接口"}),(0,a.jsx)("span",{children:"模型 / Key"})]}),null==e?void 0:e.engineAssignments.map(e=>{var t;return(0,a.jsxs)("div",{className:"settings-engine-row",role:"row",children:[(0,a.jsxs)("div",{className:"settings-engine-name",children:[(0,a.jsx)("strong",{children:e.label}),(0,a.jsx)("small",{children:e.id})]}),e.field?(0,a.jsx)("select",{className:"settings-engine-control",value:null!=(t=s[e.field.key])?t:e.field.value,onChange:t=>q(e.field.key,t.target.value),"aria-label":"".concat(e.label,"创作引擎"),children:(e.field.options||[]).map(e=>(0,a.jsx)("option",{value:e.value,children:e.label},e.value))}):(0,a.jsx)("strong",{className:"settings-engine-value",children:e.engineLabel}),(0,a.jsx)("span",{className:"status ".concat(e.connected?"":"failed"),children:e.connectionLabel}),(0,a.jsx)("div",{className:"settings-engine-key",children:(0,a.jsx)("small",{children:e.reqKey})})]},e.id)})]})]}):null]})}function c(e){let t={};for(let s of e.groups.flatMap(e=>e.fields))t[s.key]=s.secret?"":s.value;for(let s of e.engineAssignments)s.field&&(t[s.field.key]=s.field.value);return t}function d(e){let{label:t,value:s,ready:n}=e;return(0,a.jsxs)("div",{className:"settings-service-badge ".concat(n?"ready":""),children:[(0,a.jsx)("span",{children:t}),(0,a.jsx)("strong",{children:s})]})}function h(e){return e?"已连接":"待配置"}var v=s(4577);function f(){return(0,a.jsx)(v.BrowserAuthGuard,{children:(0,a.jsx)(p,{})})}function p(){let{isSuperAdmin:e}=(0,v.a)();return(0,a.jsx)("div",{className:"settings-page-stack",children:e?(0,a.jsx)(u,{}):(0,a.jsxs)("section",{className:"panel",children:[(0,a.jsx)("h2",{children:"系统设置"}),(0,a.jsx)("p",{className:"muted",children:"系统配置仅由超级管理员维护。"})]})})}},4577:(e,t,s)=>{"use strict";s.d(t,{BrowserAuthGuard:()=>c,BrowserAuthProvider:()=>o,ClientRedirect:()=>d,a:()=>u});var a=s(5155),n=s(2115),r=s(63),l=s(6660);let i=(0,n.createContext)(null);function o(e){let{children:t}=e,[s,r]=(0,n.useState)(null),[o,u]=(0,n.useState)("loading"),[c,d]=(0,n.useState)(null),h=(0,n.useCallback)(async e=>{try{let t=await (0,l.uK)(e);r(t),u("ready"),d(null)}catch(e){if(e instanceof DOMException&&"AbortError"===e.name)return;u("error"),d(e instanceof Error?e.message:"无法读取认证状态")}},[]);(0,n.useEffect)(()=>{let e=new AbortController;return h(e.signal),()=>e.abort()},[h]);let v=(0,n.useMemo)(()=>{var e,t;let a=(null==s?void 0:s.user)||null,n=null==(e=null==s?void 0:s.authRequired)||e,r=!n||(null==a?void 0:a.role)==="super_admin",l=r||(null==a?void 0:a.role)==="organization_admin";return{status:o,user:a,authMode:(null==s?void 0:s.authMode)||null,authRequired:n,authConfigured:null!=(t=null==s?void 0:s.authConfigured)&&t,isAdmin:l,isSuperAdmin:r,error:c,refresh:()=>h()}},[c,h,s,o]);return(0,a.jsx)(i.Provider,{value:v,children:t})}function u(){let e=(0,n.useContext)(i);if(!e)throw Error("useBrowserAuth must be used inside BrowserAuthProvider");return e}function c(e){let{children:t,role:s="user"}=e,i=u(),o=(0,r.usePathname)(),c=(0,r.useRouter)(),d="ready"===i.status&&i.authRequired&&!i.user;return((0,n.useEffect)(()=>{if(d){let e=(0,l.M6)(window.location,o||"/create");c.replace("/auth/login?next=".concat(encodeURIComponent(e)))}},[d,o,c]),"loading"===i.status||d)?(0,a.jsx)(h,{message:"正在确认登录状态…"}):"error"===i.status?(0,a.jsx)(h,{message:i.error||"无法读取认证状态",actionLabel:"重试",onAction:()=>void i.refresh()}):("admin"!==s||i.isAdmin)&&("super"!==s||i.isSuperAdmin)?(0,a.jsx)(a.Fragment,{children:t}):(0,a.jsx)(h,{message:"当前账号无权访问此页面。"})}function d(e){let{to:t,forwardNext:s=!1}=e;return(0,n.useEffect)(()=>{let e=s?new URLSearchParams(window.location.search).get("next"):null,a=e?"".concat(t,"?next=").concat(encodeURIComponent(e)):t;window.location.replace(a)},[s,t]),(0,a.jsx)(h,{message:"正在跳转…"})}function h(e){let{message:t,actionLabel:s,onAction:n}=e;return(0,a.jsxs)("section",{className:"panel",children:[(0,a.jsx)("p",{className:"muted",children:t}),s&&n?(0,a.jsx)("button",{className:"button",type:"button",onClick:n,children:s}):null]})}},6046:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(1847).A)("Save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]])},6660:(e,t,s)=>{"use strict";async function a(e){let t=await fetch("/api/auth/me",{method:"GET",cache:"no-store",credentials:"same-origin",headers:{Accept:"application/json"},signal:e});if(!t.ok)throw Error("认证状态请求失败(".concat(t.status,")"));var s,a=await t.json();if(!l(a)||"boolean"!=typeof a.authenticated||"boolean"!=typeof a.authRequired||"boolean"!=typeof a.authConfigured)throw Error("认证状态响应格式无效");if(!a.authenticated){if(null!==a.authMode||null!==a.user)throw Error("认证状态响应格式无效");return{authenticated:!1,authRequired:a.authRequired,authConfigured:a.authConfigured,authMode:null,user:null}}if(!a.authConfigured||"user"!==a.authMode&&"admin"!==a.authMode||!(l(s=a.user)&&"string"==typeof s.id&&s.id.length>0&&"string"==typeof s.subject&&s.subject===s.id&&"string"==typeof s.displayName&&"string"==typeof s.clientId&&("user"===s.role||"organization_admin"===s.role||"super_admin"===s.role)&&"active"===s.status&&("super_admin"===s.role||"string"==typeof s.organizationId&&s.organizationId.length>0)&&Array.isArray(s.authorities)&&s.authorities.every(e=>"string"==typeof e)&&Array.isArray(s.scope)&&s.scope.every(e=>"string"==typeof e)))throw Error("认证用户响应格式无效");let n="user"===a.user.role?"user":"admin";if(a.authMode!==n)throw Error("认证用户响应格式无效");return{authenticated:!0,authRequired:a.authRequired,authConfigured:a.authConfigured,authMode:a.authMode,user:a.user}}function n(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/create";if(!e||!e.startsWith("/")||e.startsWith("//")||e.includes("\\"))return t;try{let s="http://zhinian.local",a=new URL(e,s);if(a.origin!==s)return t;let n="".concat(a.pathname).concat(a.search).concat(a.hash);if(a.pathname.startsWith("/api/auth")||a.pathname.startsWith("/auth/login")||a.pathname.startsWith("/auth/admin-login"))return t;return n}catch(e){return t}}function r(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/create";return n("".concat(e.pathname).concat(e.search).concat(e.hash),t)}function l(e){return"object"==typeof e&&null!==e}s.d(t,{M6:()=>r,uK:()=>a,z3:()=>n})},7518:(e,t,s)=>{Promise.resolve().then(s.bind(s,4527))},7612:(e,t,s)=>{"use strict";s.d(t,{It:()=>l,Js:()=>u,c8:()=>o,xr:()=>i});var a=s(7605);let n="power2.out";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}function l(e,t){let s=e.current;if(!s||r())return;let n=a.os.context(()=>t(s),s);return()=>n.revert()}function i(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"[data-animate]";if(r())return;let s=a.os.utils.toArray(t,e);s.length&&a.os.fromTo(s,{autoAlpha:0,y:14},{autoAlpha:1,y:0,duration:.28,ease:n,stagger:.045,clearProps:"transform,opacity,visibility"})}function o(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10;!e||r()||a.os.fromTo(e,{autoAlpha:0,y:t},{autoAlpha:1,y:0,duration:.28,ease:n,clearProps:"transform,opacity,visibility"})}function u(e){!e||r()||a.os.fromTo(e,{scale:.985},{scale:1,duration:.22,ease:n,clearProps:"transform"})}},9559:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(1847).A)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])}},e=>{e.O(0,[592,274,441,255,358],()=>e(e.s=7518)),_N_E=e.O()}]); |