@@ -693,19 +693,6 @@ <h2>媒体结果</h2>
693693 < span class ="hint "> 设置为 0 表示关闭对应自动切换;429/503 和鉴权错误仍会保护性切换。</ span >
694694 </ div >
695695 </ section >
696- < section >
697- < div class ="section-head "> < h2 > 授权操作</ h2 > < button id ="saveAuthBtn " class ="primary "> 保存授权 Cookie</ button > </ div >
698- < div class ="content stack ">
699- < div class ="notice "> 点击“网页授权”会启动容器内浏览器,并在新界面打开 noVNC。登录完成后回到这里保存 Cookie。</ div >
700- < div class ="row button-row ">
701- < button id ="reopenAuthBtn "> 打开授权界面</ button >
702- < button id ="reloadAuthBtn "> 刷新授权浏览器</ button >
703- < button id ="diagnoseAuthBtn "> 检查授权状态</ button >
704- < button id ="closeAuthBtn "> 关闭授权会话</ button >
705- </ div >
706- < div id ="authDiagnoseBox " class ="hint "> 授权浏览器启动后,可先检查是否已经拿到 Gemini Cookie,再保存到账户池。</ div >
707- </ div >
708- </ section >
709696 </ div >
710697 < section >
711698 < div class ="section-head "> < h2 > 账户池</ h2 > < button id ="refreshAccountsBtn "> 刷新</ button > </ div >
@@ -717,7 +704,6 @@ <h2>媒体结果</h2>
717704 < button id ="validateCurrentBtn "> 验证当前</ button >
718705 < button id ="validateAllBtn "> 验证全部</ button >
719706 < button id ="manualOpenBtn "> 手动添加</ button >
720- < button id ="authOpenBtn " class ="primary "> 网页授权</ button >
721707 </ div >
722708 < div id ="accountList " class ="account-grid "> </ div >
723709 </ div >
@@ -755,6 +741,15 @@ <h2>系统设置</h2>
755741 < label > Public URL< input id ="objectStoragePublicUrl " placeholder ="https://cdn.example.com/media "> </ label >
756742 </ div >
757743 < div class ="stack ">
744+ < div class ="notice "> 网页授权集中在系统设置中操作:启动授权浏览器后,在 noVNC 里完成 Google/Gemini 登录,检查到 Cookie 后保存到账户池。保存完成会自动关闭授权界面。</ div >
745+ < div class ="row button-row ">
746+ < button id ="authOpenBtn " class ="primary "> 网页授权</ button >
747+ < button id ="reloadAuthBtn "> 刷新授权浏览器</ button >
748+ < button id ="diagnoseAuthBtn "> 检查授权状态</ button >
749+ < button id ="saveAuthBtn "> 保存授权 Cookie</ button >
750+ < button id ="closeAuthBtn "> 关闭授权会话</ button >
751+ </ div >
752+ < div id ="authDiagnoseBox " class ="hint "> 授权浏览器启动后,可先检查是否已经拿到 Gemini Cookie,再保存到账户池。</ div >
758753 < div class ="split ">
759754 < label > Access Key ID< input id ="objectStorageAccessKey " autocomplete ="off "> </ label >
760755 < label > Secret Access Key< input id ="objectStorageSecretKey " type ="password " autocomplete ="new-password " placeholder ="保存后会脱敏显示 "> </ label >
@@ -993,7 +988,7 @@ <h2>系统设置</h2>
993988 }
994989 function readinessReasonText ( reason ) {
995990 const map = {
996- no_accounts : "还没有授权 Gemini 账户,请到“账户设置”使用网页授权或手动添加 Cookie。" ,
991+ no_accounts : "还没有授权 Gemini 账户,请到“系统设置”使用网页授权,或到“ 账户设置”手动添加 Cookie。" ,
997992 no_available_accounts : "账户都已停用或过期,请重新验证、启用或重新授权。" ,
998993 readiness_error : "调用就绪检查失败,请检查外部 API Key、管理员会话或服务状态。" ,
999994 } ;
@@ -1021,7 +1016,7 @@ <h2>系统设置</h2>
10211016 </div>
10221017 </div>
10231018 <div class="diagnostic-actions">
1024- <button data-panel-action="auth">网页授权 </button>
1019+ <button data-panel-action="system- auth">去系统设置授权 </button>
10251020 <button data-panel-action="validate-all">验证全部账户</button>
10261021 </div>
10271022 </div>` ;
@@ -1101,10 +1096,10 @@ <h2>系统设置</h2>
11011096 <div class="diagnostic">
11021097 <div>
11031098 <div class="diagnostic-title">当前没有可用账户</div>
1104- <div class="hint">请添加 Cookie,或使用网页授权重新登录 Gemini 。</div>
1099+ <div class="hint">请到系统设置完成网页授权,或手动添加 Cookie 。</div>
11051100 </div>
11061101 <div class="diagnostic-actions">
1107- <button class="primary" data-panel-action="auth">网页授权 </button>
1102+ <button class="primary" data-panel-action="system- auth">去系统设置授权 </button>
11081103 <button data-panel-action="validate-all">验证全部账户</button>
11091104 </div>
11101105 </div>` ;
@@ -1138,7 +1133,7 @@ <h2>系统设置</h2>
11381133 </div>
11391134 </div>
11401135 <div class="diagnostic-actions">
1141- ${ current . expired ? `<button class="primary" data-panel-action="auth">重新网页授权 </button>` : "" }
1136+ ${ current . expired ? `<button class="primary" data-panel-action="system- auth">去系统设置重新授权 </button>` : "" }
11421137 <button data-panel-action="validate-current">验证当前</button>
11431138 <button data-panel-action="validate-all">验证全部</button>
11441139 </div>
@@ -1353,14 +1348,17 @@ <h2>系统设置</h2>
13531348 $ ( infoId ) . textContent = "" ;
13541349 setMsg ( "已清空参考附件" ) ;
13551350 }
1356-
1357- document . querySelectorAll ( "nav button" ) . forEach ( btn => btn . onclick = ( ) => {
1351+ function activateTab ( tabId ) {
1352+ const btn = document . querySelector ( `nav button[data-tab="${ tabId } "]` ) ;
1353+ if ( ! btn ) return ;
13581354 document . querySelectorAll ( "nav button" ) . forEach ( b => b . classList . toggle ( "active" , b === btn ) ) ;
1359- document . querySelectorAll ( ".view" ) . forEach ( v => v . classList . toggle ( "active" , v . id === btn . dataset . tab ) ) ;
1360- if ( btn . dataset . tab === "gems" ) refreshGems ( ) . catch ( e => setMsg ( e . message ) ) ;
1361- if ( btn . dataset . tab === "media" ) refreshMedia ( ) . catch ( e => setMsg ( e . message ) ) ;
1362- if ( btn . dataset . tab === "system" ) refreshSystemSettings ( ) . catch ( e => setMsg ( e . message ) ) ;
1363- } ) ;
1355+ document . querySelectorAll ( ".view" ) . forEach ( v => v . classList . toggle ( "active" , v . id === tabId ) ) ;
1356+ if ( tabId === "gems" ) refreshGems ( ) . catch ( e => setMsg ( e . message ) ) ;
1357+ if ( tabId === "media" ) refreshMedia ( ) . catch ( e => setMsg ( e . message ) ) ;
1358+ if ( tabId === "system" ) refreshSystemSettings ( ) . catch ( e => setMsg ( e . message ) ) ;
1359+ }
1360+
1361+ document . querySelectorAll ( "nav button" ) . forEach ( btn => btn . onclick = ( ) => activateTab ( btn . dataset . tab ) ) ;
13641362 document . body . onclick = event => {
13651363 const close = event . target . closest ( "[data-close-modal]" ) ;
13661364 if ( close ) closeModal ( close . dataset . closeModal ) ;
@@ -1632,8 +1630,9 @@ <h2>系统设置</h2>
16321630 const btn = event . target . closest ( "button[data-panel-action]" ) ;
16331631 if ( ! btn ) return ;
16341632 const action = btn . dataset . panelAction ;
1635- if ( action === "auth" ) {
1636- await startAuth ( ) . catch ( e => setMsg ( e . message ) ) ;
1633+ if ( action === "system-auth" ) {
1634+ activateTab ( "system" ) ;
1635+ setMsg ( "请在系统设置中完成网页授权。" ) ;
16371636 return ;
16381637 }
16391638 if ( action === "validate-current" ) {
@@ -1654,6 +1653,11 @@ <h2>系统设置</h2>
16541653 if ( ! state . authWindow ) throw new Error ( "浏览器阻止了弹窗,请允许此站点打开新窗口。" ) ;
16551654 $ ( "authDiagnoseBox" ) . textContent = "授权浏览器已打开。登录完成后点击“检查授权状态”,确认 Cookie 可用后再保存。" ;
16561655 }
1656+ async function closeAuthSession ( ) {
1657+ await api ( "/v1/auth/session" , { method : "DELETE" } ) ;
1658+ if ( state . authWindow && ! state . authWindow . closed ) state . authWindow . close ( ) ;
1659+ state . authWindow = null ;
1660+ }
16571661 async function diagnoseAuth ( ) {
16581662 const data = await api ( "/v1/auth/diagnose" ) ;
16591663 const ok = Boolean ( data . has_secure_1psid ) ;
@@ -1666,20 +1670,24 @@ <h2>系统设置</h2>
16661670 return data ;
16671671 }
16681672 $ ( "authOpenBtn" ) . onclick = ( ) => startAuth ( ) . catch ( e => setMsg ( e . message ) ) ;
1669- $ ( "reopenAuthBtn" ) . onclick = ( ) => startAuth ( ) . catch ( e => setMsg ( e . message ) ) ;
16701673 $ ( "reloadAuthBtn" ) . onclick = ( ) => api ( "/v1/auth/press" , { method : "POST" , body : JSON . stringify ( { key : "F5" } ) } ) . catch ( e => setMsg ( e . message ) ) ;
16711674 $ ( "diagnoseAuthBtn" ) . onclick = ( ) => diagnoseAuth ( ) . catch ( e => {
16721675 $ ( "authDiagnoseBox" ) . textContent = `无法检查授权状态:${ e . message } ` ;
16731676 setMsg ( e . message ) ;
16741677 } ) ;
1675- $ ( "closeAuthBtn" ) . onclick = async ( ) => { await api ( "/v1/auth/session" , { method : "DELETE" } ) ; if ( state . authWindow && ! state . authWindow . closed ) state . authWindow . close ( ) ; } ;
1678+ $ ( "closeAuthBtn" ) . onclick = async ( ) => {
1679+ await closeAuthSession ( ) ;
1680+ $ ( "authDiagnoseBox" ) . textContent = "授权会话已关闭。" ;
1681+ } ;
16761682 $ ( "authSaveConfirmBtn" ) . onclick = async ( ) => {
16771683 try {
16781684 const data = await api ( "/v1/auth/save" , { method : "POST" , body : JSON . stringify ( { name : $ ( "authSaveName" ) . value || null } ) } ) ;
16791685 closeModal ( "authSaveModal" ) ;
16801686 await refreshAll ( ) ;
1687+ await closeAuthSession ( ) . catch ( ( ) => { } ) ;
16811688 const savedText = data . saved ? `授权 Cookie 已保存到账户池 #${ data . account_id } ,当前共 ${ data . account_count ?? ( data . accounts || [ ] ) . length } 个账户。` : "授权 Cookie 未确认保存。" ;
1682- setMsg ( data . validation ?. valid ? `${ savedText } 验证通过。` : `${ savedText } 但验证失败:${ data . validation ?. message || "请稍后重新验证。" } ` ) ;
1689+ $ ( "authDiagnoseBox" ) . textContent = `${ savedText } 授权界面已关闭。` ;
1690+ setMsg ( data . validation ?. valid ? `${ savedText } 验证通过,授权界面已关闭。` : `${ savedText } 但验证失败:${ data . validation ?. message || "请稍后重新验证。" } 授权界面已关闭。` ) ;
16831691 } catch ( error ) {
16841692 $ ( "authSaveDiagnose" ) . textContent = `保存失败:${ error . message } 。请先点击“检查授权状态”,确认已发现 __Secure-1PSID。` ;
16851693 setMsg ( error . message ) ;
0 commit comments