diff --git a/public/admin/assets/LoginView-Dbmeqz-l.js b/public/admin/assets/LoginView-Dbmeqz-l.js index 63b35d4..3b523ba 100644 --- a/public/admin/assets/LoginView-Dbmeqz-l.js +++ b/public/admin/assets/LoginView-Dbmeqz-l.js @@ -1,4 +1,4 @@ -import{$t as e,C as t,D as n,E as r,Et as i,G as a,O as o,W as s,Y as c,Z as ee,_t as l,b as u,ct as te,d,g as f,in as p,k as ne,m as re,q as m,st as h,w as g,x as _}from"./vue.runtime.esm-bundler-OsdSFvn7.js";import{N as ie,_ as ae,a as oe,c as se,l as ce,p as le,v as ue}from"./api-Dpfxb1ca.js";import{l as de,t as fe,u as pe}from"./index-CpTiFmNV.js";import{i as v}from"./site-j0hHE9UV.js";import{n as me,t as he}from"./participantTheme-BMONOrEx.js";import{i as y,r as b,s as ge,t as _e,u as ve}from"./competitionBranding-BjQScvy4.js";/* empty css */var ye={class:`login-page-wls__wrap`},be={class:`login-page-wls__inner`},xe={class:`login-page-wls__brand`,"aria-label":`系统说明`},Se={class:`login-page-wls__logo`,"aria-hidden":`true`},Ce=[`src`],we={key:1,viewBox:`0 0 100 100`,width:`72`,height:`72`,xmlns:`http://www.w3.org/2000/svg`,"aria-hidden":`true`},Te={key:0,class:`login-page-wls__mark`},Ee=[`innerHTML`],De={key:1,class:`login-page-wls__title`},Oe=[`innerHTML`],ke={class:`login-page-wls__panel`},Ae={class:`login-page-wls__card`},je={key:0,class:`login-page-wls__card-title`},Me={class:`login-page-wls__code-row`},x=[`value`],Ne=[`disabled`],Pe=[`disabled`],Fe={class:`login-page-wls__quick-entry`,"aria-label":`快捷入口`},Ie={class:`login-page-wls__quick-row`},Le={key:0,class:`login-page-wls__debug-code`,role:`status`},Re={key:1,class:`login-page-wls__contact`,"aria-label":`咨询电话`},ze={key:0,class:`login-page-wls__contact-label`},Be={key:0,class:`login-page-wls__contact-sep`},Ve=[`href`],He={key:2},Ue={key:0,class:`login-page-wls__footer`},We={class:`login-page-wls__copyright`},Ge=`/frontend/pages/admin-checkin-mobile.html`,Ke=`/frontend/layout.html?role=reviewer`,qe=`/frontend/layout.html?role=admin`,Je=`/frontend/layout.html?role=user&lang=en`,Ye=`/frontend/layout.html?role=audience&lang=en`,S=ne({__name:`LoginView`,setup(ne){let S=de(),C=pe(),w=l(``),T=l(``),E=l(!1),D=l(!1),O=l(!1),k=l(`获取验证码`),A=l(``),j=l(!1),M=l(``),N=l(`neutral`),P=u(()=>String(S.params.slug??``).trim()),F=u(()=>S.meta.audienceLogin===!0),I=l(``),L=l(b()),R=l(!1),Xe=u(()=>N.value===`error`?`login-page-wls__hint login-page-wls__hint--error`:N.value===`success`?`login-page-wls__hint login-page-wls__hint--success`:`login-page-wls__hint`),Ze=u(()=>{let e=L.value.login.markLine;return y(e)?z(e):``}),Qe=u(()=>{let e=L.value.login.headline;return y(e)?z(e):``});function z(e){return e.replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`)}let B=u(()=>I.value?I.value:y(L.value.login.slogan)?L.value.login.slogan:``),$e=u(()=>!!I.value),et=u(()=>y(L.value.login.cardWelcome)?L.value.login.cardWelcome:``),V=u(()=>et.value.replace(/登陆/g,`登录`)),H=u(()=>y(L.value.login.footerCopyright)?L.value.login.footerCopyright:``),U=u(()=>y(L.value.login.logoUrl)?L.value.login.logoUrl:``),W=u(()=>R.value?ge(L.value):[]),tt=u(()=>{let e=P.value;return e?`/c/${encodeURIComponent(e)}/login`:`/frontend/layout.html?role=user`}),nt=u(()=>{let e=P.value;return e?`/c/${encodeURIComponent(e)}/audience/login`:`/frontend/layout.html?role=audience`}),G=0;function K(){G&&=(window.clearInterval(G),0)}function rt(){K();let e=ue();O.value=!0,k.value=`重新获取(${e}s)`,G=window.setInterval(()=>{if(--e,e<=0){K(),k.value=`获取验证码`,O.value=!1;return}k.value=`重新获取(${e}s)`},1e3)}function q(){return ae()}function J(e,t=`neutral`){M.value=e,N.value=t}function Y(){M.value=``,N.value=`neutral`}function X(e){return e.replace(/\D/g,``).slice(0,6)}function it(e){let t=e.target,n=X(t?.value??``);T.value=n,t&&t.value!==n&&(t.value=n),D.value=!1}function Z(e){if(typeof e!=`object`||!e)return`请求失败`;let t=e,n=t.message;if(typeof n==`string`&&n.trim())return n.trim();let r=t.errors;if(typeof r==`object`&&r&&!Array.isArray(r)){let e=Object.values(r).flatMap(e=>Array.isArray(e)?e.map(e=>String(e)):[]);if(e.length)return e.join(` +import{$t as e,C as t,D as n,E as r,Et as i,G as a,O as o,W as s,Y as c,Z as ee,_t as l,b as u,ct as te,d,g as f,in as p,k as ne,m as re,q as m,st as h,w as g,x as _}from"./vue.runtime.esm-bundler-OsdSFvn7.js";import{N as ie,_ as ae,a as oe,c as se,l as ce,p as le,v as ue}from"./api-Dpfxb1ca.js";import{l as de,t as fe,u as pe}from"./index-CpTiFmNV.js";import{i as v}from"./site-j0hHE9UV.js";import{n as me,t as he}from"./participantTheme-BMONOrEx.js";import{i as y,r as b,s as ge,t as _e,u as ve}from"./competitionBranding-BjQScvy4.js";/* empty css */var ye={class:`login-page-wls__wrap`},be={class:`login-page-wls__inner`},xe={class:`login-page-wls__brand`,"aria-label":`系统说明`},Se={class:`login-page-wls__logo`,"aria-hidden":`true`},Ce=[`src`],we={key:1,viewBox:`0 0 100 100`,width:`72`,height:`72`,xmlns:`http://www.w3.org/2000/svg`,"aria-hidden":`true`},Te={key:0,class:`login-page-wls__mark`},Ee=[`innerHTML`],De={key:1,class:`login-page-wls__title`},Oe=[`innerHTML`],ke={class:`login-page-wls__panel`},Ae={class:`login-page-wls__card`},je={key:0,class:`login-page-wls__card-title`},Me={class:`login-page-wls__code-row`},x=[`value`],Ne=[`disabled`],Pe=[`disabled`],Fe={class:`login-page-wls__quick-entry`,"aria-label":`快捷入口`},Ie={class:`login-page-wls__quick-row`},Le={key:0,class:`login-page-wls__debug-code`,role:`status`},Re={key:1,class:`login-page-wls__contact`,"aria-label":`咨询电话`},ze={key:0,class:`login-page-wls__contact-label`},Be={key:0,class:`login-page-wls__contact-sep`},Ve=[`href`],He={key:2},Ue={key:0,class:`login-page-wls__footer`},We={class:`login-page-wls__copyright`},Ge=`/frontend/pages/admin-checkin-mobile.html`,Ke=`/frontend/layout.html?role=reviewer`,qe=`/frontend/layout.html?role=admin`,Je=`/frontend/prototype/login-en.html?role=user`,Ye=`/frontend/prototype/login-en.html?role=audience`,S=ne({__name:`LoginView`,setup(ne){let S=de(),C=pe(),w=l(``),T=l(``),E=l(!1),D=l(!1),O=l(!1),k=l(`获取验证码`),A=l(``),j=l(!1),M=l(``),N=l(`neutral`),P=u(()=>String(S.params.slug??``).trim()),F=u(()=>S.meta.audienceLogin===!0),I=l(``),L=l(b()),R=l(!1),Xe=u(()=>N.value===`error`?`login-page-wls__hint login-page-wls__hint--error`:N.value===`success`?`login-page-wls__hint login-page-wls__hint--success`:`login-page-wls__hint`),Ze=u(()=>{let e=L.value.login.markLine;return y(e)?z(e):``}),Qe=u(()=>{let e=L.value.login.headline;return y(e)?z(e):``});function z(e){return e.replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`)}let B=u(()=>I.value?I.value:y(L.value.login.slogan)?L.value.login.slogan:``),$e=u(()=>!!I.value),et=u(()=>y(L.value.login.cardWelcome)?L.value.login.cardWelcome:``),V=u(()=>et.value.replace(/登陆/g,`登录`)),H=u(()=>y(L.value.login.footerCopyright)?L.value.login.footerCopyright:``),U=u(()=>y(L.value.login.logoUrl)?L.value.login.logoUrl:``),W=u(()=>R.value?ge(L.value):[]),tt=u(()=>{let e=P.value;return e?`/c/${encodeURIComponent(e)}/login`:`/frontend/layout.html?role=user`}),nt=u(()=>{let e=P.value;return e?`/c/${encodeURIComponent(e)}/audience/login`:`/frontend/layout.html?role=audience`}),G=0;function K(){G&&=(window.clearInterval(G),0)}function rt(){K();let e=ue();O.value=!0,k.value=`重新获取(${e}s)`,G=window.setInterval(()=>{if(--e,e<=0){K(),k.value=`获取验证码`,O.value=!1;return}k.value=`重新获取(${e}s)`},1e3)}function q(){return ae()}function J(e,t=`neutral`){M.value=e,N.value=t}function Y(){M.value=``,N.value=`neutral`}function X(e){return e.replace(/\D/g,``).slice(0,6)}function it(e){let t=e.target,n=X(t?.value??``);T.value=n,t&&t.value!==n&&(t.value=n),D.value=!1}function Z(e){if(typeof e!=`object`||!e)return`请求失败`;let t=e,n=t.message;if(typeof n==`string`&&n.trim())return n.trim();let r=t.errors;if(typeof r==`object`&&r&&!Array.isArray(r)){let e=Object.values(r).flatMap(e=>Array.isArray(e)?e.map(e=>String(e)):[]);if(e.length)return e.join(` `)}return`请求失败`}let Q=null,$=!1;async function at(){I.value=``,R.value=!1,L.value=b();let e=P.value;if(v(),!e){I.value=`缺少赛事访问地址,请从正确入口进入`,R.value=!0;return}try{let t=await fetch(`${q()}/api/v1/public/competitions/by-slug/${encodeURIComponent(e)}`,{headers:{Accept:`application/json`}});if(!t.ok){I.value=t.status===404?`赛事不存在或未发布,请核对访问地址`:`无法加载赛事信息`;return}let n=await t.json();L.value=_e(n.branding_json??n.branding??null),v(L.value.documentTitle),he(L.value.login.themePrimary);let r=L.value.login.faviconUrl;if(y(r)&&typeof document<`u`){let e=document.querySelector(`link[rel~="icon"]`);e||(e=document.createElement(`link`),e.rel=`icon`,document.head.appendChild(e)),Q===null&&(Q=e.getAttribute(`href`)||``),e.href=r}}catch{I.value=`网络错误,无法校验赛事链接`}finally{R.value=!0}}async function ot(){if(O.value)return;let e=w.value.trim();if(!/^1[3-9]\d{9}$/.test(e)){E.value=!0,D.value=!1,J(`请先填写正确手机号`,`error`);return}E.value=!1,D.value=!1,Y(),O.value=!0,k.value=`发送中...`;let t=`${q()}${ce}`;try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`,"X-Requested-With":`XMLHttpRequest`},body:JSON.stringify({mobile:e})}),r=await n.json().catch(()=>({}));if(!n.ok){J(Z(r),`error`),k.value=`获取验证码`,O.value=!1,K(),A.value=``;return}let i=r,a=typeof i.debug_code==`string`?i.debug_code.trim():``;A.value=/^\d{4,8}$/.test(a)?a:``,Y(),rt()}catch{J(`网络错误,请确认后端已启动(Vite 将 /api 代理至 php artisan serve 端口,见 vite.config)`,`error`),k.value=`获取验证码`,O.value=!1,K(),A.value=``}}async function st(){let e=/^1[3-9]\d{9}$/.test(w.value.trim()),t=X(T.value);T.value=t;let n=t.length===6;if(E.value=!e,D.value=e&&!n,!e){J(`请先填写正确手机号`,`error`);return}if(!n){J(`请输入 6 位验证码`,`error`);return}if(Y(),j.value=!0,J(`登录中...`,`neutral`),!P.value){J(`缺少赛事访问地址,请从正确入口进入`,`error`),j.value=!1;return}let r=`${q()}${F.value?oe:se}`;try{let e=fe(),n=await fetch(r,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`,"X-Requested-With":`XMLHttpRequest`},body:JSON.stringify({mobile:w.value.trim(),code:t,competition_slug:P.value,...e?{public_source_code:e}:{}})}),i=await n.json().catch(()=>({}));if(!n.ok){J(Z(i),`error`);return}Y(),F.value?(ie(i.token,P.value),localStorage.setItem(`cxxfds_audience_user`,JSON.stringify(i.user))):(localStorage.setItem(le,i.token),localStorage.setItem(`cxxfds_user`,JSON.stringify(i.user)));let a=typeof S.query.redirect==`string`?S.query.redirect:``;if(a&&a.startsWith(`/`)){await C.replace(a);return}let o=P.value;o?await C.replace(F.value?{name:`audience-form`,params:{slug:o}}:{name:`participant-apply`,params:{slug:o}}):await C.replace(`/c`)}catch{J(`网络错误,请确认后端已启动`,`error`)}finally{j.value=!1}}return s(()=>{typeof document<`u`&&(document.documentElement.classList.add(`cxxfds-login-page`),$=!0),document.body.classList.add(`login-page-wls`),at()}),a(()=>{if(typeof document<`u`&&$&&(document.documentElement.classList.remove(`cxxfds-login-page`),$=!1),document.body.classList.remove(`login-page-wls`),K(),typeof document<`u`&&(me(),Q!==null)){let e=document.querySelector(`link[rel~="icon"]`);e&&(Q===``?e.removeAttribute(`href`):e.href=Q),Q=null}}),(a,s)=>{let l=ee(`router-link`);return m(),g(`div`,ye,[_(`div`,be,[_(`aside`,xe,[_(`div`,Se,[U.value?(m(),g(`img`,{key:0,src:U.value,alt:``,class:`login-page-wls__logo-img`,width:`72`,height:`72`},null,8,Ce)):(m(),g(`svg`,we,[...s[2]||=[r(`
Media: 
Xinhua Daily; Junction News; Suzhou Daily; ICCSZ; Fiber Online
diff --git a/public/frontend/login.html b/public/frontend/login.html index 7e749ad..fc8360c 100644 --- a/public/frontend/login.html +++ b/public/frontend/login.html @@ -82,9 +82,9 @@ diff --git a/public/frontend/prototype/login-en.html b/public/frontend/prototype/login-en.html new file mode 100644 index 0000000..992f6dc --- /dev/null +++ b/public/frontend/prototype/login-en.html @@ -0,0 +1,96 @@ + + + + + + Shanghai–Suzhou Collaborative Emerging Industries Sci-Tech Innovation Competition Registration System + + + + + + + + diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 0f29a59..ba82924 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -24,8 +24,8 @@ $audienceLoginUrl = '/admin/c/'.rawurlencode($slug).'/audience/login'; $homeUrl = '/'; $homeEnUrl = '/en'; - $participantLoginEnUrl = '/frontend/layout.html?role=user&lang=en'; - $audienceLoginEnUrl = '/frontend/layout.html?role=audience&lang=en'; + $participantLoginEnUrl = '/frontend/prototype/login-en.html?role=user'; + $audienceLoginEnUrl = '/frontend/prototype/login-en.html?role=audience'; $eventSiteRelative = $eventSiteRelative ?? 'frontend/event-site.html'; $eventSitePath = public_path($eventSiteRelative); @@ -46,6 +46,14 @@ "href='event-site.html'", 'href="login.html"', "href='login.html'", + 'href="prototype/login-en.html?role=user"', + "href='prototype/login-en.html?role=user'", + 'href="prototype/login-en.html?role=audience"', + "href='prototype/login-en.html?role=audience'", + 'href="login-en.html?role=user"', + "href='login-en.html?role=user'", + 'href="login-en.html?role=audience"', + "href='login-en.html?role=audience'", 'href="layout.html?role=user&lang=en"', "href='layout.html?role=user&lang=en'", 'href="layout.html?role=audience&lang=en"', @@ -76,6 +84,14 @@ "href='".$participantLoginEnUrl."'", 'href="'.$audienceLoginEnUrl.'"', "href='".$audienceLoginEnUrl."'", + 'href="'.$participantLoginEnUrl.'"', + "href='".$participantLoginEnUrl."'", + 'href="'.$audienceLoginEnUrl.'"', + "href='".$audienceLoginEnUrl."'", + 'href="'.$participantLoginEnUrl.'"', + "href='".$participantLoginEnUrl."'", + 'href="'.$audienceLoginEnUrl.'"', + "href='".$audienceLoginEnUrl."'", 'href="'.$audienceLoginUrl.'"', "href='".$audienceLoginUrl."'", ], diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php index 610e08b..ab2555c 100644 --- a/tests/Feature/ExampleTest.php +++ b/tests/Feature/ExampleTest.php @@ -38,8 +38,8 @@ class ExampleTest extends TestCase ->assertSee('Inaugural Shanghai–Suzhou Collaborative Emerging Industries Science & Technology Innovation Competition', false) ->assertSee('COMPETE', false) ->assertSee('ATTEND', false) - ->assertSee('/frontend/layout.html?role=user&lang=en', false) - ->assertSee('/frontend/layout.html?role=audience&lang=en', false) + ->assertSee('/frontend/prototype/login-en.html?role=user', false) + ->assertSee('/frontend/prototype/login-en.html?role=audience', false) ->assertSee('href="/" lang="zh-CN"', false) ->assertSee('>中文', false) ->assertSee('hero-banner hero-banner--photonic', false);