build(webui): 按 podman 正常流程重建前端产物并嵌入 Go 二进制

- make web-build(ws-usernode-web-dev 容器)重建 web/dist → internal/webui/dist
- 清空旧 hash 产物,避免 go:embed 冗余
- make build-embed 产出 bin/usernode(22MB,含新主题前端)
This commit is contained in:
2026-08-30 11:46:21 +08:00
parent 472c66ebd8
commit 13c21dfd7e
31 changed files with 60 additions and 45 deletions
+1
View File
@@ -0,0 +1 @@
import{d as D,u as H,o as R,c as $,a,w as o,r as p,g as G,b as n,e as C,f as J,h as r,i as O,j as k,k as f,l as B,t as Q,m as K,E as g,n as W,p as X,q as Y}from"./index-7syy_I7y.js";import{_ as Z}from"./_plugin-vue_export-helper-DlAUqK2U.js";const ee={class:"auth-page"},ae={class:"auth-brand"},oe={class:"brand-icon"},te={class:"inline-row"},le={class:"inline-row otp-row"},ne={class:"auth-foot"},se=D({__name:"LoginView",setup(ue){const L=J(),x=H(),v=p("admin"),c=p(!1),h=p(!1),u=K({username:"",password:""}),t=K({username:"",code:"",captcha_id:"",captcha_code:""}),s=p(null),b=p(!1),d=p(0);let S;async function i(){b.value=!0;try{s.value=await G()}catch{s.value=null}finally{b.value=!1}}function E(U){d.value=U,S=window.setInterval(()=>{d.value-=1,d.value<=0&&(window.clearInterval(S),d.value=0)},1e3)}async function y(){if(!u.username||!u.password){g.warning("请输入用户名和密码");return}c.value=!0;try{await W(u),await x.fetchMe(),L.push("/admin/dashboard")}catch{}finally{c.value=!1}}async function M(){if(!t.username||!t.captcha_code){g.warning("请输入用户名和图形验证码");return}if(!(!s.value&&(await i(),!s.value))){h.value=!0;try{await X({username:t.username,captcha_id:s.value.captcha_id,captcha_code:t.captcha_code}),g.success("验证码已发送(邮件或 CLIusernode user otp"),E(60),t.captcha_code="",await i()}catch{await i()}finally{h.value=!1}}}async function V(){if(!t.username||!t.code){g.warning("请输入用户名和 OTP 验证码");return}c.value=!0;try{await Y({username:t.username,code:t.code}),await x.fetchMe(),L.push("/me/profile")}catch{}finally{c.value=!1}}function N(){v.value==="user"&&!s.value&&i()}return R(()=>{v.value==="user"&&i()}),(U,e)=>{const P=n("Monitor"),A=n("el-icon"),m=n("el-input"),_=n("el-form-item"),w=n("el-button"),T=n("el-form"),I=n("el-tab-pane"),F=n("el-image"),j=n("el-tabs"),q=n("router-link"),z=n("el-card");return C(),$("div",ee,[a(z,{class:"auth-card",shadow:"never"},{default:o(()=>[r("div",ae,[r("span",oe,[a(A,{size:26},{default:o(()=>[a(P)]),_:1})]),e[6]||(e[6]=r("h2",null,"服务器用户管理节点",-1)),e[7]||(e[7]=r("span",{class:"sub"},"账号申请 · SSH 密钥 · 使用审计",-1))]),a(j,{modelValue:v.value,"onUpdate:modelValue":e[5]||(e[5]=l=>v.value=l),stretch:"",onTabChange:N},{default:o(()=>[a(I,{label:"管理员登录",name:"admin"},{default:o(()=>[a(T,{"label-position":"top",onSubmit:O(y,["prevent"])},{default:o(()=>[a(_,{label:"用户名"},{default:o(()=>[a(m,{modelValue:u.username,"onUpdate:modelValue":e[0]||(e[0]=l=>u.username=l),placeholder:"管理员用户名",autocomplete:"username"},null,8,["modelValue"])]),_:1}),a(_,{label:"密码"},{default:o(()=>[a(m,{modelValue:u.password,"onUpdate:modelValue":e[1]||(e[1]=l=>u.password=l),type:"password",placeholder:"密码","show-password":"",autocomplete:"current-password",onKeyup:k(y,["enter"])},null,8,["modelValue"])]),_:1}),a(w,{type:"primary",class:"auth-submit",loading:c.value,onClick:y},{default:o(()=>[...e[8]||(e[8]=[f("登录",-1)])]),_:1},8,["loading"])]),_:1})]),_:1}),a(I,{label:"外部用户登录",name:"user"},{default:o(()=>[a(T,{"label-position":"top",onSubmit:O(V,["prevent"])},{default:o(()=>[a(_,{label:"用户名"},{default:o(()=>[a(m,{modelValue:t.username,"onUpdate:modelValue":e[2]||(e[2]=l=>t.username=l),placeholder:"用户名(可带或不带 ext_ 前缀)",autocomplete:"username"},null,8,["modelValue"])]),_:1}),a(_,{label:"图形验证码"},{default:o(()=>[r("div",te,[a(m,{modelValue:t.captcha_code,"onUpdate:modelValue":e[3]||(e[3]=l=>t.captcha_code=l),placeholder:"4 位验证码",maxlength:"4",onKeyup:k(M,["enter"])},null,8,["modelValue"]),s.value?(C(),B(F,{key:0,src:s.value.image,fit:"contain",class:"captcha-img",title:"点击刷新",onClick:i},null,8,["src"])):(C(),B(w,{key:1,loading:b.value,onClick:i},{default:o(()=>[...e[9]||(e[9]=[f("获取",-1)])]),_:1},8,["loading"]))])]),_:1}),a(_,{label:"登录验证码(OTP"},{default:o(()=>[r("div",le,[a(m,{modelValue:t.code,"onUpdate:modelValue":e[4]||(e[4]=l=>t.code=l),placeholder:"6 位 OTP(邮件或 CLI 获取)",maxlength:"6",class:"otp-input",onKeyup:k(V,["enter"])},null,8,["modelValue"]),a(w,{loading:h.value,disabled:d.value>0,onClick:M},{default:o(()=>[f(Q(d.value>0?`${d.value}s 后重发`:"发送验证码"),1)]),_:1},8,["loading","disabled"])])]),_:1}),a(w,{type:"primary",class:"auth-submit",loading:c.value,onClick:V},{default:o(()=>[...e[10]||(e[10]=[f("登录",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),r("div",ne,[a(q,{to:"/apply"},{default:o(()=>[...e[11]||(e[11]=[f("还没有账号?申请新账号",-1)])]),_:1})])]),_:1})])}}}),re=Z(se,[["__scopeId","data-v-273ff0da"]]);export{re as default};