Archived
chore: 提交 React 前端构建产物(app.js 330KB / auth.js 38KB / app.css 56KB)
为什么:部署不经 node 构建(dockerignore 排除了源码),服务端 直接读 dist/index.html 与 /assets,因此构建产物必须入库; 文件名经 vite 固定(无内容 hash),golden 契约才能跨构建成立。 gzip 后 app.js 97KB / auth.js 12KB / app.css 11KB。
This commit is contained in:
1 parent
8803444755
commit
58853abd3c
6 files changed
+88
No files matched your search
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
import{c as Et,o as kt}from"./app.js";function _t(){Promise.prototype.finally||(Promise.prototype.finally=function(e){var t=this.constructor||Promise;return this.then(function(a){return t.resolve(e()).then(function(){return a})},function(a){return t.resolve(e()).then(function(){throw a})})});var je="2.4.0",ze=[{v:"2.4.0",date:"2026-09-21",items:["修复:老内核浏览器(Chrome 57-62)操作按钮卡加载的问题","安全:登录失败次数过多临时锁定;公网错误信息不再暴露内部细节","优化:用户列表不再携带明文网易云 Cookie(按需单独查看)"]},{v:"2.1.0",date:"2026-08-28",items:["计费改为按次计费:一首歌 1 次,歌单打包按歌曲数量扣减","免费试用改为 3 次(3 首歌),注册页领取,每设备限一次","卡密系统升级为次数卡,后台可管理用户次数"]},{v:"2.0.0",date:"2026-08-28",items:["新增站点账号系统:强制登录、邮箱验证码注册","新增管理后台:用户管理、全局Cookie、SMTP、日志、卡密、公告、数据库备份","新增个人中心:剩余次数、卡密充值、公告查看"]},{v:"1.2.0",date:"2026-03-29",items:["修复部分歌曲解析失败的问题","优化界面交互体验"]}];function n(e,t){return document.querySelector(e)}function b(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}var q=null;function d(e,t){q||(q=document.createElement("div"),q.style.cssText="position:fixed;top:18px;left:50%;transform:translateX(-50%);z-index:99999;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;",document.body.appendChild(q));var a=document.createElement("div");a.textContent=e,a.style.cssText="padding:10px 18px;border-radius:10px;font-size:13px;color:#fff;background:"+(t==="error"?"linear-gradient(135deg,#ff5f57,#e0483f)":t==="success"?"linear-gradient(135deg,#34c759,#2aa64c)":"rgba(30,30,30,.92)")+";box-shadow:0 6px 24px rgba(0,0,0,.25);opacity:0;transform:translateY(-8px);transition:all .25s;max-width:80vw;",q.appendChild(a),requestAnimationFrame(function(){a.style.opacity="1",a.style.transform="translateY(0)"}),setTimeout(function(){a.style.opacity="0",a.style.transform="translateY(-8px)",setTimeout(function(){a.remove()},300)},2600)}function l(e,t){var a=Object.keys(t||{}).map(function(o){return encodeURIComponent(o)+"="+encodeURIComponent(t[o]==null?"":t[o])}).join("&"),i=typeof AbortController<"u"?new AbortController:null,r=null;return i&&(r=setTimeout(function(){try{i.abort()}catch{}},3e4)),fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"},body:a,credentials:"same-origin",signal:i?i.signal:void 0}).then(function(o){return o.json().then(function(s){return r&&clearTimeout(r),s},function(s){throw r&&clearTimeout(r),s})}).catch(function(){return r&&clearTimeout(r),{status:0,success:!1,message:"网络异常,请检查连接后重试"}})}function Ne(e){var t=typeof AbortController<"u"?new AbortController:null,a=null;return t&&(a=setTimeout(function(){try{t.abort()}catch{}},15e3)),fetch(e,{credentials:"same-origin",signal:t?t.signal:void 0}).then(function(i){return i.json().then(function(r){return a&&clearTimeout(a),r},function(r){throw a&&clearTimeout(a),r})})}function Fe(){if(window.__siteDeviceIdCache)return window.__siteDeviceIdCache;var e="netease_device_id",t="";try{t=localStorage.getItem(e)||""}catch{}if(!t){t="dev-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,10);try{localStorage.setItem(e,t)}catch{}}return window.__siteDeviceIdCache=t,t}var c=null,_="",h=null,re=!1,ie=3,oe=["changelog-modal","stats-modal","api-modal","cookie-modal","login-modal","register-modal","announce-modal"];function B(e){if(oe.indexOf(e)!==-1){kt(e);return}var t=n("#"+e);t&&t.classList.add("show")}function p(e){if(oe.indexOf(e)!==-1){Et(e);return}var t=n("#"+e);t&&t.classList.remove("show")}function D(){window.SITE_LOGGED_IN=!!c;var e=!c&&re,t=n("#btn-open-register");t&&(t.hidden=!e),["goto-register","goto-register2"].forEach(function(g){var k=n("#"+g);k&&(k.hidden=!e)}),b(".auth-trial-box").forEach(function(g){g.hidden=!e}),b(".reg-gift-num").forEach(function(g){g.textContent=ie});var a=n("#auth-guest-area"),i=n("#auth-user-area");if(a&&i)if(c){a.hidden=!0,i.hidden=!1;var r=n("#auth-duration-pill");r&&(r.textContent="⏳ "+(_||"0 次"));var o=n("#user-avatar");o&&(o.textContent=(c.username||"U").charAt(0).toUpperCase(),o.title=c.username+(c.role==="admin"?"(管理员)":""))}else a.hidden=!1,i.hidden=!0;var s=n("#tab-usercenter"),u=n("#tab-useradmin");s&&(s.hidden=!c),u&&(u.hidden=!(c&&c.role==="admin"));var f=n("#tab-global");f&&(f.hidden=!(c&&c.role==="admin"))}function X(){return Ne("/auth/me").then(function(e){var t=e.data||{};if(c=t.user||null,_=t.duration_text||"",h=t.announcement||null,re=!!t.smtp_configured,typeof t.register_credits=="number"&&(ie=t.register_credits),D(),S(),ge(),c&&typeof window.SITE_TASKS_BOOTSTRAP=="function")try{window.SITE_TASKS_BLine truncated
|
||||
`).map(function(o){return v(o)}).join("<br>"));var r=document.getElementById("cookie-modal");if(!(r&&r.classList.contains("show")))if(B("announce-modal"),c)l("/auth/ann_seen",{});else try{localStorage.setItem("netease_ann_once_seen",String(h.updated_at))}catch{}}}function v(e){return String(e??"").replace(/[&<>"']/g,function(t){return{"&":"&","<":"<",">":">",'"':""","'":"'"}[t]})}var pe=!1,G="success";function nt(){var e=n("#ua-gate"),t=n("#ua-content");if(!(!e||!t)){var a=!!(c&&c.role==="admin");e.hidden=a,t.hidden=!a,a&&!pe&&(pe=!0,C(),$(),dt(),A(),V(),gt(),Q())}}function at(){b("#admin-side .admin-side-item[data-view]").forEach(function(u){u.setAttribute("tabindex","0"),u.setAttribute("role","button"),u.addEventListener("click",function(){b("#admin-side .admin-side-item").forEach(function(f){f.classList.remove("active")}),u.classList.add("active"),b(".admin-view").forEach(function(f){f.classList.toggle("active",f.getAttribute("data-aview")===u.getAttribute("data-view"))})}),u.addEventListener("keydown",function(f){(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),u.click())})});var e=n("#ua-back");e&&e.addEventListener("click",function(){var u=n("#tab-useradmin");u&&u.classList.remove("active");var f=document.querySelector('.tab[data-tab="search"]');f&&f.click()});var t=n("#ua-logout");t&&t.addEventListener("click",ve),[e,t].forEach(function(u){u&&(u.setAttribute("tabindex","0"),u.setAttribute("role","button"),u.addEventListener("keydown",function(f){(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),u.click())}))});var a=n("#ua-playkey-show"),i=n("#ua-playkey-value");function r(u){navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(u).then(function(){d("密钥已复制","success")},function(){d("复制失败,请手动选择文本复制","error")}):d("复制失败,请点击「显示密钥」后手动复制","error")}a&&a.addEventListener("click",function(){if(a.dataset.state==="shown"){i.value="",i.placeholder="点击「显示密钥」查看",a.textContent="显示密钥",a.dataset.state="";return}l("/admin/site/play_key/get",{}).then(function(u){if(u.status!==200){d(u.message||"获取失败","error");return}i.value=u.data.key,a.textContent="隐藏",a.dataset.state="shown"})});var o=n("#ua-playkey-copy");o&&o.addEventListener("click",function(){l("/admin/site/play_key/get",{}).then(function(u){if(u.status!==200){d(u.message||"获取失败","error");return}r(u.data.key)})});var s=n("#ua-playkey-rotate");s&&s.addEventListener("click",function(){confirm("刷新后旧密钥立即全部失效(外部旧地址将打不开),确定继续?")&&l("/admin/site/play_key/rotate",{}).then(function(u){if(u.status!==200){d(u.message||"刷新失败","error");return}i.value=u.data.key,a.textContent="隐藏",a.dataset.state="shown",d("密钥已刷新,旧密钥已全部失效","success")})})}function rt(){var e=n("#ua-users-refresh");if(!(!e||n("#ua-user-create"))){var t=document.createElement("button");t.className="btn btn-sm btn-primary",t.id="ua-user-create",t.type="button",t.textContent="➕ 添加用户",t.addEventListener("click",it),e.parentNode.insertBefore(t,e)}}function it(){var e=n("#site-create-user-modal");e&&e.remove();var t=document.createElement("div");t.className="modal-mask show",t.id="site-create-user-modal",t.setAttribute("data-dynamic","1"),t.innerHTML='<div class="modal" style="width:400px;"> <div class="modal-header"><div class="modal-title">➕ 添加用户</div></div> <div class="modal-body"> <input class="input" id="cnu-username" placeholder="用户名(3-20位)" style="width:100%;margin-bottom:10px;"/> <input class="input" id="cnu-password" placeholder="初始密码(至少8位)" style="width:100%;margin-bottom:10px;"/> <input class="input" id="cnu-email" placeholder="邮箱(可选)" style="width:100%;margin-bottom:10px;"/> <input class="input" id="cnu-count" type="number" min="0" value="10" placeholder="下载次数" style="width:100%;"/> </div> <div style="display:flex;gap:10px;padding:0 22px 20px;"> <button class="btn btn-primary" id="cnu-submit" type="button" style="flex:1;">创 建</button> <button class="btn" id="cnu-cancel" type="button" style="flex:1;">取消</button> </div></div>',document.body.appendChild(t),t.addEventListener("click",function(r){r.target===t&&t.remove()});var a=n("#cnu-cancel");a&&a.addEventListener("click",function(){t.remove()});var i=n("#cnu-submit");i&&i.addEventListener("click",function(){var r={username:(n("#cnu-username")||{}).value||"",password:(n("#cnu-password")||{}).value||"",email:(n("#cnu-email")||{}).value||"",count:(n("#cnu-count")||{}).value||0};if(!r.username||r.password.length<8){d("请填写用户名和至少 8 位密码","error");return}i.disabled=!0,l("/admin/site/user/create",r).then(function(o){d(o.message||(o.status===200?"创建成功":"创建失败"),o.status===200?"success":"error"),o.status===200&&(t.remove(),C())}).finally(function(){i.disabled=!1
Line truncated
|
||||
请输入封禁原因(将展示给用户):`,"违规使用,封禁处理");if(s===null)return;l("/admin/site/user/ban",{id:r.getAttribute("data-uban"),action:"ban",reason:s}).then(function(u){d(u.message||(u.status===200?"已封禁":"操作失败"),u.status===200?"success":"error"),u.status===200&&C()})}else{if(!window.confirm("解封用户「"+o+"」?解封后可正常登录使用。"))return;l("/admin/site/user/ban",{id:r.getAttribute("data-uban"),action:"unban"}).then(function(u){d(u.message||(u.status===200?"已解封":"操作失败"),u.status===200?"success":"error"),u.status===200&&C()})}})}),b("[data-udel]",t).forEach(function(r){r.addEventListener("click",function(){window.confirm("确定删除用户「"+r.getAttribute("data-name")+"」?")&&l("/admin/site/user/delete",{id:r.getAttribute("data-udel")}).then(function(o){d(o.message||"已删除",o.status===200?"success":"error"),C()})})}),b("[data-ucookie]",t).forEach(function(r){r.addEventListener("click",function(){l("/admin/site/user/cookie",{username:r.getAttribute("data-ucookie")}).then(function(o){if(o.status!==200){d(o.message||"获取失败","error");return}var s=o.data&&o.data.cookie||"";if(!s){d("该用户未登录过网易云账号","info");return}prompt("用户网易云 Cookie(Ctrl+C 复制):",s)})})})}})}var w=null,F="",K=0;function $(){l("/admin/cookie/status",{}).then(function(e){var t=n("#ua-cookie-status");if(t){if(e.status!==200){t.textContent=e.message||"获取失败";return}var a=e.data||{};t.textContent=(a.is_valid?"✅ 有效":"❌ 未登录")+(a.cookie_count!=null?" · Cookie "+a.cookie_count+" 个":"")}})}function ot(){l("/admin/qr/create",{}).then(function(e){if(e.status!==200){d(e.message||"生成二维码失败","error");return}var t=e.data||{};F=t.unikey||"";var a=n("#ua-qr-box"),i=n("#ua-qr-tip");if(t.qr_svg){var r="data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(t.qr_svg)));a.innerHTML='<img src="'+r+'" style="width:180px;height:180px;" alt="二维码"/>'}i&&(i.textContent="请使用网易云音乐手机 APP 扫码"),w&&clearInterval(w),K++,w=setInterval(st,3e3)})}function st(){if(!F){w&&clearInterval(w);return}var e=K;l("/admin/qr/check",{unikey:F}).then(function(t){if(e===K){var a=n("#ua-qr-tip");if(t.status!==200){w&&clearInterval(w),a&&(a.textContent=t.message||"检查失败");return}var i=t.data&&t.data.status;i==="waiting"?a&&(a.textContent="等待扫码..."):i==="scanned"?a&&(a.textContent="✅ 已扫码,请在手机上确认"):i==="success"?(w&&clearInterval(w),a&&(a.textContent="🎉 登录成功,Cookie 已保存"),d("全局账号登录成功","success"),$()):(w&&clearInterval(w),a&&(a.textContent="二维码已过期,请重新生成"))}})}function ut(){window.confirm("确定删除全局 Cookie?删除后需重新扫码登录。")&&l("/admin/cookie/delete",{}).then(function(e){w&&clearInterval(w),F="",K++,d(e.message||"已删除",e.status===200?"success":"error");var t=n("#ua-qr-box"),a=n("#ua-qr-tip");t&&(t.innerHTML=""),a&&(a.textContent="点击下方按钮生成二维码"),$()})}function dt(){l("/admin/site/smtp/get",{}).then(function(e){if(e.status===200){var t=e.data||{};n("#ua-smtp-host")&&(n("#ua-smtp-host").value=t.host||""),n("#ua-smtp-port")&&(n("#ua-smtp-port").value=t.port||587),n("#ua-smtp-sender")&&(n("#ua-smtp-sender").value=t.sender||"")}})}function ct(){l("/admin/site/smtp/save",{host:(n("#ua-smtp-host")||{}).value||"",port:(n("#ua-smtp-port")||{}).value||587,sender:(n("#ua-smtp-sender")||{}).value||"",password:(n("#ua-smtp-pass")||{}).value||""}).then(function(e){d(e.message||"已保存",e.status===200?"success":"error");var t=n("#ua-smtp-pass");t&&(t.value="")})}function lt(){var e=(n("#ua-smtp-test-to")||{}).value||"";if(!e){d("请填写测试收件邮箱","error");return}var t=n("#ua-smtp-test");t.disabled=!0,l("/admin/site/smtp/test",{to:e}).then(function(a){d(a.message||"已发送",a.status===200?"success":"error")}).finally(function(){t.disabled=!1})}var E=1;function A(){l("/admin/site/logs",{type:G,page:E}).then(function(e){var t=n("#ua-log-list");if(t){if(e.status!==200){t.textContent=e.message||"加载失败";return}var a=e.data&&e.data.logs||[],i=e.data&&e.data.total||0,r=e.data&&e.data.pages||1;E=e.data&&e.data.page||1,window._uaLogPages=r;var o;if((o=n("#ua-log-page"))&&(o.textContent=E),(o=n("#ua-log-pages"))&&(o.textContent=r),(o=n("#ua-log-total"))&&(o.textContent=i),!a.length){t.textContent="暂无日志";return}t.innerHTML=a.map(function(s){return"<div>["+v(s.time)+"] "+v(s.username||"-")+" · "+v(s.action)+" · IP "+v(s.ip)+(s.detail?" · "+v(s.detail):"")+"</div>"}).join("")}})}function ft(){var e=G==="fail"?"失败":"成功";window.confirm("确定清除全部「"+e+"」日志?该操作不可恢复。")&&l("/admin/site/logs/clear",{type:G}).then(function(t){d(t.message||(t.status===200?"已清除":"清除失败"),t.status===200?"success":"error"),E=1,A()})}function mt(){var e=(n("#ua-card-minutes")||{}).value||"10";if(e==="custom"&&(e=(n("#
Line truncated
|
||||
`)),d("已生成 "+(t.data.count||0)+" 张卡密("+(t.data.credits||0)+" 次/张),已复制到文本框,请及时保存","success"),V(0)})}var I=0,Y=0,ae=100;function vt(e,t){if(t&&!(e==="delete"&&!window.confirm("确定删除卡密 "+t.slice(0,4)+"**** 吗?删除后不可恢复。"))){var a=e==="delete"?"/admin/site/cards/delete":"/admin/site/cards/disable",i={code:t,disabled:e==="enable"?"0":"1"};l(a,i).then(function(r){d(r.message||(r.status===200?"操作成功":"操作失败"),r.status===200?"success":"error"),r.status===200&&V()})}}function be(){var e=n("#ua-cards-pager");if(e){if(Y<=0){e.hidden=!0;return}var t=Math.max(1,Math.ceil(Y/ae));e.hidden=!1,e.textContent="";var a=document.createElement("button");a.className="btn btn-sm",a.type="button",a.textContent="上一页",a.disabled=I<=0,a.addEventListener("click",function(){V(I-1)});var i=document.createElement("button");i.className="btn btn-sm",i.type="button",i.textContent="下一页",i.disabled=I>=t-1,i.addEventListener("click",function(){V(I+1)});var r=document.createElement("span");r.className="hint",r.textContent="第 "+(I+1)+" / "+t+" 页 · 共 "+Y+" 张",e.appendChild(a),e.appendChild(r),e.appendChild(i)}}function V(e){typeof e=="number"&&(I=Math.max(0,e)),l("/admin/site/cards/list",{limit:ae,offset:I*ae}).then(function(t){var a=n("#ua-cards-body");if(a){if(t.status!==200){a.innerHTML='<tr><td colspan="8">加载失败</td></tr>';return}var i=t.data&&t.data.cards||[];if(Y=t.data&&t.data.total||0,!i.length){a.innerHTML='<tr><td colspan="8">暂无卡密</td></tr>',be();return}a.innerHTML=i.map(function(r){var o,s;return r.used_by?(o="已使用",s='<span class="hint">—</span>'):r.disabled?(o="已禁用",s='<button class="btn btn-sm" data-card-act="enable" data-card-code="'+v(r.code)+'" type="button">启用</button> <button class="btn btn-danger btn-sm" data-card-act="delete" data-card-code="'+v(r.code)+'" type="button">删除</button>'):(o=r.expired?"已过期":"未使用",s='<button class="btn btn-sm" data-card-act="disable" data-card-code="'+v(r.code)+'" type="button">禁用</button> <button class="btn btn-danger btn-sm" data-card-act="delete" data-card-code="'+v(r.code)+'" type="button">删除</button>'),"<tr><td>"+v(r.code)+"</td><td>"+v(String(r.minutes))+" 次</td><td>"+o+"</td><td>"+v(r.used_by||"-")+"</td><td>"+v(r.note||"-")+"</td><td>"+(r.expire_at?new Date(r.expire_at*1e3).toLocaleDateString():"永久")+"</td><td>"+v(r.created_at?new Date(r.created_at*1e3).toLocaleDateString():"-")+"</td><td>"+s+"</td></tr>"}).join(""),be(),Array.prototype.forEach.call(a.querySelectorAll("button[data-card-act]"),function(r){r.addEventListener("click",function(){vt(r.getAttribute("data-card-act"),r.getAttribute("data-card-code"))})})}})}function gt(){l("/admin/site/ann/get",{}).then(function(e){if(e.status===200){var t=e.data||{};n("#ua-ann-title")&&(n("#ua-ann-title").value=t.title||""),n("#ua-ann-content")&&(n("#ua-ann-content").value=t.content||""),n("#ua-ann-mode")&&(n("#ua-ann-mode").value=t.popup_mode||"off")}})}function pt(){l("/admin/site/ann/save",{title:(n("#ua-ann-title")||{}).value||"",content:(n("#ua-ann-content")||{}).value||"",popup_mode:(n("#ua-ann-mode")||{}).value||"off"}).then(function(e){d(e.message||"已保存",e.status===200?"success":"error")})}function he(e){return!e&&e!==0?"-":e>1048576?(e/1048576).toFixed(2)+" MB":e>1024?(e/1024).toFixed(1)+" KB":e+" B"}function Q(){l("/admin/site/backup/list",{}).then(function(e){var t=n("#ua-db-body");if(t){if(e.status!==200){t.innerHTML='<tr><td colspan="4">加载失败</td></tr>';return}var a=e.data||{},i=n("#ua-db-size");i&&(i.textContent=he(a.db_size||0));var r=n("#ua-db-hours");r&&a.interval_hours!=null&&(r.value=a.interval_hours);var o=a.backups||[];if(!o.length){t.innerHTML='<tr><td colspan="4">暂无备份</td></tr>';return}t.innerHTML=o.map(function(s){return"<tr><td>"+v(s.name)+"</td><td>"+he(s.size)+"</td><td>"+v(s.time)+'</td><td><a class="btn btn-sm" href="/admin/site/backup/download?name='+encodeURIComponent(s.name)+'">下载</a> <button class="btn btn-sm" data-restore="'+v(s.name)+'">恢复</button> <button class="btn btn-sm" data-bdel="'+v(s.name)+'" style="color:var(--color-error);">删除</button></td></tr>'}).join(""),b("[data-restore]",t).forEach(function(s){s.addEventListener("click",function(){window.confirm("确定用该备份覆盖当前数据库?")&&l("/admin/site/backup/restore",{name:s.getAttribute("data-restore")}).then(function(u){d(u.message||"已恢复",u.status===200?"success":"error"),u.status===200&&setTimeout(function(){location.reload()},1200)})})}),b("[data-bdel]",t).forEach(function(s){s.addEventListener("click",function(){window.confirm("确定删除该备份?")&&l("/admin/site/backup/delete",{name:s.getAttribute("data-bdel")}).then(function(u){d(u.message||"已删除",u.status===200?"success":"error"),Q()})})})}})}function bt(){l("/admin/site/backup/create",{}).then(function(e){d(e.message||"备份完成",e.status===200?"success":"error"
Line truncated
|
||||
//# sourceMappingURL=auth.js.map
|
||||
Reference in new issue
Block a user