1 line
17 KiB
JavaScript
Executable File
1 line
17 KiB
JavaScript
Executable File
import{D as e,N as t,Y as n,w as r}from"./dist-CxIYsDur.js";import{B as i,F as a,Gt as o,H as s,Ht as ee,I as c,R as l,Wt as te,_ as ne,a as u,b as d,ct as f,d as p,et as m,f as re,m as h,p as g,t as _,tt as v,u as y,ut as b,v as x,vt as S,y as C}from"./_plugin-vue_export-helper-BmDUjPB3.js";import{c as ie,i as w,l as ae,o as T,r as E,s as D,t as O}from"./index-BdquF2dM.js";import{t as k}from"./request-D2yY8ZUb.js";function oe(e){return k.post(`/auth/login`,e)}function se(e,t){return k.post(`/auth/send-pair-code`,{email:e,expireMinutes:t})}function ce(e,t){return k.post(`/auth/verify-pair-code`,{email:e,code:t})}const le=w(`user`,()=>{let e=b(localStorage.getItem(`erp_token`)||``),t=b(null),n=y(()=>!!e.value),r=y(()=>t.value);function i(t){e.value=t,localStorage.setItem(`erp_token`,t)}function a(e){t.value=e,localStorage.setItem(`current_user`,JSON.stringify(e))}function o(){e.value=``,t.value=null,localStorage.removeItem(`erp_token`),localStorage.removeItem(`current_user`)}function s(){let n=localStorage.getItem(`erp_token`),r=localStorage.getItem(`current_user`);if(n&&(e.value=n),r)try{t.value=JSON.parse(r)}catch(e){console.error(`Failed to parse stored user:`,e)}}return{token:e,userInfo:t,isLoggedIn:n,currentUser:r,setToken:i,setUserInfo:a,clearUser:o,init:s}});var ue={class:`login-container`},de={class:`form-section`},fe={class:`login-tabs`},pe=[`onClick`],me={class:`tab-icon`},he={class:`tab-text`},ge={class:`welcome`},_e={class:`form-item`},ve={class:`form-item`},ye={key:0,class:`form-item captcha-item`},be=[`title`],xe={class:`form-options`},Se={key:1,class:`pair-code-section`},Ce={class:`pair-code-header`},we={class:`pair-code-tip`},Te={class:`form-item pair-code-input`},Ee={class:`pair-code-actions`},De={class:`form-item`},Oe={class:`form-item sms-code`},ke={class:`form-options`},Ae={class:`wechat-section`},je={class:`qr-wrapper`},Me={key:0,class:`qr-loading`},Ne={key:1,class:`qr-box`},Pe={class:`qr-inner`},Fe=[`src`,`alt`],Ie={key:0,class:`qr-expire`},Le={key:2,class:`qr-error`},Re={class:`qr-tip`},ze={class:`wechat-status`},Be={class:`login-footer`},Ve={class:`forget-steps`},He={class:`forget-form`},Ue={key:2,class:`success-box`},A=_(d({__name:`Login`,setup(d){let{t:_}=O(),w=le(),k=T(),A=b(!1),j=b(`password`),M=b(!1),N=b(!1),P=b(0),F=b(0),I=null,L=b(0),R=b(!1),z=b(``),B=b(``),We=b([]);b(0);let Ge=b(!1),V=b(``);b(``);let H=b(!1),U=b(``),W=b(``),G=b(!1),K=b(0),q=null,Ke=()=>{let e=localStorage.getItem(`device_id`);if(e)V.value=e;else{let e=`DVC-`+Date.now().toString(36).toUpperCase()+`-`+Math.random().toString(36).substr(2,9).toUpperCase();localStorage.setItem(`device_id`,e),V.value=e}},qe=()=>{let e=Array.from({length:4},()=>`ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789`[Math.floor(Math.random()*55)]).join(``);B.value=e.toLowerCase(),We.value=e.split(``).map(e=>({char:e,rotate:Math.random()*60-30,color:[`#d4af37`,`#409eff`,`#67c23a`,`#e6a23c`,`#f56c6c`][Math.floor(Math.random()*5)],size:20+Math.floor(Math.random()*10)}))},J=()=>{qe()},Je=b(),Y=b(),Ye=y(()=>[{key:`password`,name:_(`login.passwordLogin`)||`密码登录`,icon:`🔐`},{key:`sms`,name:_(`login.smsLogin`)||`短信登录`,icon:`📱`},{key:`wechat`,name:_(`login.wechatLogin`)||`微信登录`,icon:``}]),Xe=y(()=>({password:{title:_(`login.welcomeTitle`),subtitle:_(`login.welcomeSubtitle`)},sms:{title:_(`login.phoneLoginTitle`),subtitle:_(`login.phoneLoginSubtitle`)},wechat:{title:_(`login.wechatTitle`)||`微信登录`,subtitle:_(`login.wechatSubtitle`)||`使用微信扫码安全登录`}})),Ze=y(()=>Xe[j.value]?.title),Qe=y(()=>Xe[j.value]?.subtitle),X=f({username:``,password:``,remember:!1}),Z=f({phone:``,code:``,remember:!1}),Q=f({phone:``,code:``,newPassword:``,confirmPassword:``}),$e={username:[{required:!0,message:`请输入用户名`,trigger:`blur`}],password:[{required:!0,message:`请输入密码`,trigger:`blur`},{min:6,message:`密码至少6位`,trigger:`blur`}],captcha:[{required:!0,message:`请输入验证码`,trigger:`blur`}]},et={phone:[{required:!0,message:`请输入手机号`,trigger:`blur`},{pattern:/^1[3-9]\d{9}$/,message:`手机号格式错误`,trigger:`blur`}],code:[{required:!0,message:`请输入验证码`,trigger:`blur`}]},tt=()=>{if(!Z.phone||!/^1[3-9]\d{9}$/.test(Z.phone)){E.warning(`请输入正确手机号`);return}if(Ge.value){if(!z.value){E.warning(`请先输入图形验证码`);return}if(z.value.toLowerCase()!==B.value){E.error(`图形验证码错误`),J();return}}E.success(`验证码已发送`),F.value=60,I=setInterval(()=>{F.value--,F.value<=0&&I&&(clearInterval(I),I=null)},1e3)},nt=async()=>{Je.value?.validate(async e=>{if(e){if(R.value&&z.value.toLowerCase()!==B.value){E.error(`图形验证码错误`),J();return}M.value=!0;try{let e=await oe({username:X.username,password:X.password,device_id:V.value});if(e.code===200){if(e.data.require_pair_code){H.value=!0,U.value=e.data.email,E.warning(`检测到新设备登录,需要配对码验证`),M.value=!1;return}L.value=0,R.value=!1,w.setToken(e.data.token),w.setUserInfo(e.data.user),localStorage.setItem(`last_login_device`,V.value),e.data.user?.roleCode===`super_admin`?(localStorage.setItem(`is_super_admin`,`true`),E.success(`登录成功!欢迎使用总控平台`),k.replace(`/sa/dashboard`)):(localStorage.removeItem(`is_super_admin`),E.success(`登录成功!`),k.replace(`/`))}else throw Error(e.message||`登录失败`)}catch(e){L.value++;let t=`登录失败,请稍后重试`;e?.response?.data?.message?t=e.response.data.message:e?.message&&(t=e.message),e?.response?.data?.data?.require_captcha&&(R.value=!0,qe()),L.value>=5?(localStorage.setItem(`login_banned_`+X.username,(Date.now()+600*1e3).toString()),E.error(`连续5次登录失败,账号已被临时锁定10分钟`)):E.error(t)}finally{M.value=!1}}})},rt=async()=>{if(!U.value){E.error(`邮箱地址无效`);return}G.value=!0;try{let e=await se(U.value,10);if(e.code===200)E.success(`配对码已发送至您的邮箱`),K.value=60,q=setInterval(()=>{K.value--,K.value<=0&&q&&(clearInterval(q),q=null)},1e3);else throw Error(e.message||`发送失败`)}catch(e){E.error(e?.response?.data?.message||e.message||`发送配对码失败`)}finally{G.value=!1}},$=async()=>{if(!W.value||W.value.length!==8){E.warning(`请输入8位配对码`);return}G.value=!0;try{let e=await ce(U.value,W.value);if(e.code===200)E.success(`验证成功!`),w.setToken(e.data.token),w.setUserInfo(e.data.user),localStorage.setItem(`last_login_device`,V.value),e.data.user?.roleCode===`super_admin`?(localStorage.setItem(`is_super_admin`,`true`),k.replace(`/sa/dashboard`)):(localStorage.removeItem(`is_super_admin`),k.replace(`/`));else throw Error(e.message||`验证失败`)}catch(e){E.error(e?.response?.data?.message||e.message||`配对码验证失败`)}finally{G.value=!1}},it=()=>{H.value=!1,W.value=``,U.value=``},at=()=>{Y.value?.validate(async e=>{if(!e)return;M.value=!0,await new Promise(e=>setTimeout(e,800));let t={username:Z.phone,name:`手机用户`,role:`user`};localStorage.setItem(`erp_token`,`mock_token_`+Date.now()),localStorage.setItem(`current_user`,JSON.stringify(t)),E.success(`登录成功!`),k.replace(`/`),M.value=!1})};return a(()=>{A.value=!0,Ke();let e=localStorage.getItem(`login_banned_`+X.username);if(e&&parseInt(e)>Date.now()){let t=Math.ceil((parseInt(e)-Date.now())/6e4);E.error(`账号已被锁定,请${t}分钟后再试`)}}),c(()=>{I&&clearInterval(I)}),(a,c)=>{let d=s(`el-input`),f=s(`el-form-item`),y=s(`el-icon`),b=s(`el-checkbox`),w=s(`el-link`),T=s(`el-button`),E=s(`el-form`),O=s(`el-step`),k=s(`el-steps`),oe=s(`el-dialog`);return l(),h(`div`,ue,[c[21]||=p(`div`,{class:`bg-decoration`},[p(`div`,{class:`circle circle-1`}),p(`div`,{class:`circle circle-2`}),p(`div`,{class:`circle circle-3`})],-1),p(`div`,{class:ee([`login-card`,{"fade-in":A.value}])},[c[19]||=ne(`<div class="brand-section" data-v-804e4d15><div class="brand-content" data-v-804e4d15><div class="logo-wrapper" data-v-804e4d15><div class="logo-circle" data-v-804e4d15><svg viewBox="0 0 100 100" class="logo-svg" data-v-804e4d15><defs data-v-804e4d15><linearGradient id="goldGrad" x1="0%" y1="0%" x2="100%" y2="100%" data-v-804e4d15><stop offset="0%" style="stop-color:#d4af37;" data-v-804e4d15></stop><stop offset="50%" style="stop-color:#f5e6a3;" data-v-804e4d15></stop><stop offset="100%" style="stop-color:#d4af37;" data-v-804e4d15></stop></linearGradient></defs><circle cx="50" cy="50" r="45" fill="none" stroke="url(#goldGrad)" stroke-width="2" data-v-804e4d15></circle><path d="M30 50 L45 65 L70 35" fill="none" stroke="url(#goldGrad)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" data-v-804e4d15></path></svg></div></div><h1 class="brand-title" data-v-804e4d15>智能ERP</h1><p class="brand-subtitle" data-v-804e4d15>Smart Enterprise Management</p><div class="brand-desc" data-v-804e4d15><p data-v-804e4d15>高效 · 智能 · 协同</p></div><div class="brand-features" data-v-804e4d15><div class="feature" data-v-804e4d15><span class="feature-icon" data-v-804e4d15>✦</span><span data-v-804e4d15>全流程数字化管理</span></div><div class="feature" data-v-804e4d15><span class="feature-icon" data-v-804e4d15>✦</span><span data-v-804e4d15>智能化业务处理</span></div><div class="feature" data-v-804e4d15><span class="feature-icon" data-v-804e4d15>✦</span><span data-v-804e4d15>数据驱动决策</span></div></div></div></div>`,1),p(`div`,de,[p(`div`,fe,[(l(!0),h(u,null,i(Ye.value,e=>(l(),h(`button`,{key:e.key,class:ee([`tab-btn`,{active:j.value===e.key}]),onClick:t=>j.value=e.key},[p(`span`,me,o(e.icon),1),p(`span`,he,o(e.name),1)],10,pe))),128))]),p(`div`,ge,[p(`h2`,null,o(Ze.value),1),p(`p`,null,o(Qe.value),1)]),v(C(E,{ref_key:`passwordFormRef`,ref:Je,model:X,rules:$e,onSubmit:ae(nt,[`prevent`]),class:`login-form`},{default:m(()=>[p(`div`,_e,[C(f,{prop:`username`},{default:m(()=>[C(d,{modelValue:X.username,"onUpdate:modelValue":c[0]||=e=>X.username=e,placeholder:S(_)(`login.username`),size:`large`,"prefix-icon":S(n)},null,8,[`modelValue`,`placeholder`,`prefix-icon`])]),_:1})]),p(`div`,ve,[C(f,{prop:`password`},{default:m(()=>[C(d,{modelValue:X.password,"onUpdate:modelValue":c[1]||=e=>X.password=e,placeholder:S(_)(`login.password`),size:`large`,"prefix-icon":S(e),type:`password`,"show-password":``},null,8,[`modelValue`,`placeholder`,`prefix-icon`])]),_:1})]),R.value?(l(),h(`div`,ye,[C(d,{modelValue:z.value,"onUpdate:modelValue":c[2]||=e=>z.value=e,placeholder:S(_)(`login.captcha`),size:`large`,maxlength:`4`,style:{width:`60%`}},{prefix:m(()=>[C(y,null,{default:m(()=>[C(S(r))]),_:1})]),_:1},8,[`modelValue`,`placeholder`]),p(`div`,{class:`captcha-img`,onClick:J,title:S(_)(`login.clickRefresh`)},[(l(!0),h(u,null,i(We.value,(e,t)=>(l(),h(`span`,{key:t,style:te({transform:`rotate(${e.rotate}deg)`,color:e.color,fontSize:e.size+`px`})},o(e.char),5))),128))],8,be)])):g(``,!0),p(`div`,xe,[C(b,{modelValue:X.remember,"onUpdate:modelValue":c[3]||=e=>X.remember=e},{default:m(()=>[x(o(S(_)(`login.rememberPwd`)),1)]),_:1},8,[`modelValue`]),C(w,{type:`primary`,underline:!1,onClick:c[4]||=e=>N.value=!0},{default:m(()=>[x(o(S(_)(`login.forgotPwd`)),1)]),_:1})]),H.value?(l(),h(`div`,Se,[p(`div`,Ce,[c[16]||=p(`span`,{class:`pair-code-icon`},`🔐`,-1),p(`span`,null,o(S(_)(`login.newDeviceVerify`)||`新设备验证`),1)]),p(`p`,we,o(S(_)(`login.pairCodeSent`)||`配对码已发送至:`)+o(U.value),1),p(`div`,Te,[C(d,{modelValue:W.value,"onUpdate:modelValue":c[5]||=e=>W.value=e,placeholder:S(_)(`login.enterPairCode`)||`请输入8位配对码`,size:`large`,maxlength:`8`,onKeyup:ie($,[`enter`])},{prefix:m(()=>[C(y,null,{default:m(()=>[C(S(r))]),_:1})]),_:1},8,[`modelValue`,`placeholder`])]),p(`div`,Ee,[C(T,{size:`large`,onClick:it,disabled:G.value},{default:m(()=>[x(o(S(_)(`common.cancel`)),1)]),_:1},8,[`disabled`]),C(T,{size:`large`,onClick:rt,loading:G.value,disabled:K.value>0},{default:m(()=>[x(o(K.value>0?K.value+`s`:S(_)(`login.getPairCode`)||`获取配对码`),1)]),_:1},8,[`loading`,`disabled`]),C(T,{type:`primary`,size:`large`,onClick:$,loading:G.value,disabled:!W.value},{default:m(()=>[x(o(S(_)(`common.confirm`)),1)]),_:1},8,[`loading`,`disabled`])])])):g(``,!0),H.value?g(``,!0):(l(),re(f,{key:2},{default:m(()=>[C(T,{type:`primary`,size:`large`,class:`login-btn`,loading:M.value,"native-type":`submit`},{default:m(()=>[x(o(M.value?S(_)(`login.loggingIn`)||`登录中...`:S(_)(`login.loginBtn`)||`登 录`),1)]),_:1},8,[`loading`])]),_:1}))]),_:1},8,[`model`]),[[D,j.value===`password`]]),v(C(E,{ref_key:`smsFormRef`,ref:Y,model:Z,rules:et,onSubmit:ae(at,[`prevent`]),class:`login-form`},{default:m(()=>[p(`div`,De,[C(f,{prop:`phone`},{default:m(()=>[C(d,{modelValue:Z.phone,"onUpdate:modelValue":c[6]||=e=>Z.phone=e,placeholder:S(_)(`login.phone`),size:`large`,"prefix-icon":S(t)},null,8,[`modelValue`,`placeholder`,`prefix-icon`])]),_:1})]),p(`div`,Oe,[C(f,{prop:`code`},{default:m(()=>[C(d,{modelValue:Z.code,"onUpdate:modelValue":c[7]||=e=>Z.code=e,placeholder:S(_)(`login.phoneCode`),size:`large`,"prefix-icon":S(r),maxlength:`6`},null,8,[`modelValue`,`placeholder`,`prefix-icon`])]),_:1}),C(T,{class:`sms-btn`,disabled:F.value>0,onClick:tt},{default:m(()=>[x(o(F.value>0?F.value+`s`:S(_)(`login.getCode`)||`获取验证码`),1)]),_:1},8,[`disabled`])]),p(`div`,ke,[C(b,{modelValue:Z.remember,"onUpdate:modelValue":c[8]||=e=>Z.remember=e},{default:m(()=>[x(o(S(_)(`login.autoLogin`)||`自动登录`),1)]),_:1},8,[`modelValue`])]),C(f,null,{default:m(()=>[C(T,{type:`primary`,size:`large`,class:`login-btn`,loading:M.value,"native-type":`submit`},{default:m(()=>[x(o(M.value?S(_)(`login.verifying`)||`验证中...`:S(_)(`login.verifyLogin`)||`验证登录`),1)]),_:1},8,[`loading`])]),_:1})]),_:1},8,[`model`]),[[D,j.value===`sms`]]),v(p(`div`,Ae,[p(`div`,je,[a.wechatLoading?(l(),h(`div`,Me,o(S(_)(`common.loading`)),1)):a.wechatQRCodeUrl?(l(),h(`div`,Ne,[p(`div`,Pe,[p(`img`,{src:a.wechatQRCodeUrl,alt:S(_)(`login.wechatScanLogin`)||`微信扫码登录`,class:`qr-image`},null,8,Fe)]),a.wechatQRExpire>0?(l(),h(`div`,Ie,o(S(_)(`login.qrExpire`)||`二维码`)+` `+o(a.wechatQRExpire)+o(S(_)(`login.secondsExpire`)||`秒 后过期`),1)):g(``,!0)])):(l(),h(`div`,Le,[p(`p`,null,o(S(_)(`login.loadFailed`)||`加载失败`),1),C(T,{size:`small`,onClick:a.loadWechatQR},{default:m(()=>[x(o(S(_)(`login.reload`)||`重新加载`),1)]),_:1},8,[`onClick`])])),p(`div`,Re,[c[17]||=p(`svg`,{class:`wechat-icon-svg`,viewBox:`0 0 24 24`,width:`20`,height:`20`,fill:`#07c160`},[p(`path`,{d:`M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 01.213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 00.167-.054l1.903-1.114a.864.864 0 01.717-.098 10.16 10.16 0 002.896.43c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348z`})],-1),p(`span`,null,o(S(_)(`login.wechatScanTip`)||`打开微信扫一扫登录`),1)])]),p(`div`,ze,[c[18]||=p(`span`,{class:`status-dot`},null,-1),p(`span`,null,o(a.wechatStatus||S(_)(`login.wechatScanQr`)||`请使用微信扫描二维码`),1)])],512),[[D,j.value===`wechat`]]),p(`div`,Be,[p(`p`,null,`© 2026 `+o(S(_)(`login.copyright`)||`智能ERP管理系统`)+` · `+o(S(_)(`login.secureLogin`)||`安全登录`),1)])])],2),C(oe,{modelValue:N.value,"onUpdate:modelValue":c[15]||=e=>N.value=e,title:S(_)(`login.resetPwd`)||`重置密码`,width:`400px`,"append-to-body":``,class:`forget-dialog`},{footer:m(()=>[C(T,{onClick:c[13]||=e=>N.value=!1},{default:m(()=>[x(o(S(_)(`common.cancel`)),1)]),_:1}),C(T,{type:`primary`,onClick:c[14]||=e=>P.value++},{default:m(()=>[x(o(P.value<2?S(_)(`common.next`)||`下一步`:S(_)(`login.loginNow`)||`立即登录`),1)]),_:1})]),default:m(()=>[p(`div`,Ve,[C(k,{active:P.value,"finish-status":`success`,simple:``},{default:m(()=>[C(O,{title:S(_)(`login.verify`)||`验证`},null,8,[`title`]),C(O,{title:S(_)(`login.reset`)||`重置`},null,8,[`title`]),C(O,{title:S(_)(`login.complete`)||`完成`},null,8,[`title`])]),_:1},8,[`active`])]),p(`div`,He,[P.value===0?(l(),h(u,{key:0},[C(d,{modelValue:Q.phone,"onUpdate:modelValue":c[9]||=e=>Q.phone=e,placeholder:S(_)(`login.phone`),size:`large`},{prefix:m(()=>[C(y,null,{default:m(()=>[C(S(t))]),_:1})]),_:1},8,[`modelValue`,`placeholder`]),C(d,{modelValue:Q.code,"onUpdate:modelValue":c[10]||=e=>Q.code=e,placeholder:S(_)(`login.phoneCode`),size:`large`,style:{width:`60%`}},{prefix:m(()=>[C(y,null,{default:m(()=>[C(S(r))]),_:1})]),_:1},8,[`modelValue`,`placeholder`]),C(T,{size:`large`,style:{width:`38%`}},{default:m(()=>[x(o(S(_)(`login.getCode`)||`获取验证码`),1)]),_:1})],64)):P.value===1?(l(),h(u,{key:1},[C(d,{modelValue:Q.newPassword,"onUpdate:modelValue":c[11]||=e=>Q.newPassword=e,placeholder:S(_)(`login.newPassword`)||`新密码`,size:`large`,"show-password":``},{prefix:m(()=>[C(y,null,{default:m(()=>[C(S(e))]),_:1})]),_:1},8,[`modelValue`,`placeholder`]),C(d,{modelValue:Q.confirmPassword,"onUpdate:modelValue":c[12]||=e=>Q.confirmPassword=e,placeholder:S(_)(`login.confirmPassword`),size:`large`,"show-password":``},{prefix:m(()=>[C(y,null,{default:m(()=>[C(S(e))]),_:1})]),_:1},8,[`modelValue`,`placeholder`])],64)):(l(),h(`div`,Ue,[c[20]||=p(`span`,{class:`success-icon`},`✓`,-1),p(`p`,null,o(S(_)(`login.resetPwdSuccess`)||`密码重置成功!`),1)]))])]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-804e4d15`]]);export{A as default}; |