dark mode

This commit is contained in:
cyq 2023-07-30 23:52:39 +08:00
parent 5f75e1358a
commit 30fd1852be
40 changed files with 679 additions and 561 deletions

View File

@ -3,9 +3,9 @@
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Client;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use App\Models\Client;
use Illuminate\View\View;
class ClientController extends Controller
@ -22,11 +22,6 @@ public function index(): View
return view('admin.clients.index', ['clients' => $clients, 'count' => $count]);
}
public function create(Request $request): View
{
return view('admin.clients.create');
}
public function edit(Client $client): View
{
return view('admin.clients.edit', ['client' => $client]);
@ -44,6 +39,11 @@ public function store(Request $request): RedirectResponse
return redirect()->route('admin.clients.index')->with('success', '创建成功');
}
public function create(Request $request): View
{
return view('admin.clients.create');
}
public function update(Request $request, Client $client)
{
$request->validate([

View File

@ -1 +1 @@
import{r as l,o as t,c as o,a as e,t as v,j as y,v as w,F as b,e as C,b as p,g as f,l as B}from"./app-211db244.js";import{i as m}from"./http-6b833e16.js";const G=e("div",null,[e("h3",null,"流量充值")],-1),N=e("h5",null,"您要充值多少元的流量?",-1),T=f(" 每 GB 价格: "),U=f(" 元。 "),D={class:"input-group mb-3"},F=e("div",{class:"input-group-append"},[e("span",{class:"input-group-text"},"GB")],-1),M={key:0},j=f("大约 "),E=["textContent"],L=f(" 元。"),P={key:0},R=e("h5",{class:"mt-3"},"您将要使用哪个平台充值?",-1),S=e("p",null,"如果您在选中的平台没有账号,我们将会帮您自动创建一个。",-1),q={class:"form-group form-check"},z=["id","value"],A=["textContent","for"],H={key:1},I=e("h5",{class:"mt-3"},"暂时没有可用的",-1),J=[I],K={key:2},O=e("h5",{class:"mt-3"},"让我们来选择支付方式。",-1),Q=e("p",null,"在支付后,您的流量大概需要数秒钟到账。",-1),W={class:"form-group form-check"},X=["id","value"],Y=["textContent","for"],Z={key:3},$=["textContent","disabled"],ee={key:0},te={key:1,class:"mt-3"},oe=e("h5",null,"完成",-1),ne=e("p",null,"如果您浏览器没有打开新的创建,请点击以下链接来打开。",-1),se=["href"],ie={name:"Charge",setup(le){const g=l(0),u=l([]),i=l(""),r=l({}),d=l(""),c=l(10),h=l(""),_=l(!1);m.get("price").then(s=>{g.value=s.data.price_per_gb}),m.get("providers").then(s=>{u.value=s.data,u.value.length>0&&(i.value=u.value[0],x())});function x(){m.get("providers/"+i.value+"/payments").then(s=>{r.value=s.data,r.value.length>0&&(d.value=r.value[0].name)})}function V(){_.value=!0,m.post("providers/"+i.value+"/charge",{payment:d.value,traffic:c.value}).then(s=>{h.value=s.data.redirect_url,setTimeout(()=>{window.open(h.value,"_blank")})}).finally(()=>{_.value=!1})}return(s,a)=>(t(),o(b,null,[G,e("div",null,[N,e("p",null,[T,e("span",null,v(g.value),1),U]),e("div",D,[y(e("input",{autofocus:"",type:"number",class:"form-control",placeholder:"输入您要的流量 (单位: GB)","onUpdate:modelValue":a[0]||(a[0]=n=>c.value=n)},null,512),[[w,c.value]]),F]),c.value?(t(),o("div",M,[e("p",null,[j,e("span",{textContent:v(c.value*g.value)},null,8,E),L]),u.value?(t(),o("div",P,[R,S,(t(!0),o(b,null,C(u.value,n=>(t(),o("div",q,[y(e("input",{type:"radio",class:"form-check-input",name:"provider",id:"providers_"+n,value:n,"onUpdate:modelValue":a[1]||(a[1]=k=>i.value=k),onChange:x},null,40,z),[[B,i.value,void 0,{value:!0}]]),e("label",{textContent:v(n),class:"form-check-label",for:"providers_"+n},null,8,A)]))),256))])):(t(),o("div",H,J)),r.value?(t(),o("div",K,[O,Q,(t(!0),o(b,null,C(r.value,n=>(t(),o("div",W,[y(e("input",{type:"radio",class:"form-check-input",name:"payment",id:"payments_"+n.name,"onUpdate:modelValue":a[2]||(a[2]=k=>d.value=k),value:n.name},null,8,X),[[B,d.value]]),e("label",{textContent:v(n.title),class:"form-check-label",for:"payments_"+n.name},null,8,Y)]))),256))])):p("",!0),d.value?(t(),o("div",Z,[e("button",{class:"btn btn-primary mt-3",onClick:V,textContent:v(_.value?"请稍后":"立即支付"),disabled:_.value},null,8,$)])):p("",!0)])):p("",!0)]),_.value?(t(),o("p",ee,"正在创建订单...")):p("",!0),h.value?(t(),o("div",te,[oe,ne,e("a",{href:h.value,class:"link",target:"_blank"},"支付",8,se)])):p("",!0)],64))}};export{ie as default};
import{r as l,o as t,c as o,a as e,t as v,j as y,v as w,F as b,e as C,b as p,g as f,l as B}from"./app-67d01e14.js";import{i as m}from"./http-77971bb6.js";const G=e("div",null,[e("h3",null,"流量充值")],-1),N=e("h5",null,"您要充值多少元的流量?",-1),T=f(" 每 GB 价格: "),U=f(" 元。 "),D={class:"input-group mb-3"},F=e("div",{class:"input-group-append"},[e("span",{class:"input-group-text"},"GB")],-1),M={key:0},j=f("大约 "),E=["textContent"],L=f(" 元。"),P={key:0},R=e("h5",{class:"mt-3"},"您将要使用哪个平台充值?",-1),S=e("p",null,"如果您在选中的平台没有账号,我们将会帮您自动创建一个。",-1),q={class:"form-group form-check"},z=["id","value"],A=["for","textContent"],H={key:1},I=e("h5",{class:"mt-3"},"暂时没有可用的",-1),J=[I],K={key:2},O=e("h5",{class:"mt-3"},"让我们来选择支付方式。",-1),Q=e("p",null,"在支付后,您的流量大概需要数秒钟到账。",-1),W={class:"form-group form-check"},X=["id","value"],Y=["for","textContent"],Z={key:3},$=["disabled","textContent"],ee={key:0},te={key:1,class:"mt-3"},oe=e("h5",null,"完成",-1),ne=e("p",null,"如果您浏览器没有打开新的创建,请点击以下链接来打开。",-1),se=["href"],ie={name:"Charge",setup(le){const g=l(0),u=l([]),i=l(""),r=l({}),d=l(""),c=l(10),h=l(""),_=l(!1);m.get("price").then(s=>{g.value=s.data.price_per_gb}),m.get("providers").then(s=>{u.value=s.data,u.value.length>0&&(i.value=u.value[0],x())});function x(){m.get("providers/"+i.value+"/payments").then(s=>{r.value=s.data,r.value.length>0&&(d.value=r.value[0].name)})}function V(){_.value=!0,m.post("providers/"+i.value+"/charge",{payment:d.value,traffic:c.value}).then(s=>{h.value=s.data.redirect_url,setTimeout(()=>{window.open(h.value,"_blank")})}).finally(()=>{_.value=!1})}return(s,a)=>(t(),o(b,null,[G,e("div",null,[N,e("p",null,[T,e("span",null,v(g.value),1),U]),e("div",D,[y(e("input",{"onUpdate:modelValue":a[0]||(a[0]=n=>c.value=n),autofocus:"",class:"form-control",placeholder:"输入您要的流量 (单位: GB)",type:"number"},null,512),[[w,c.value]]),F]),c.value?(t(),o("div",M,[e("p",null,[j,e("span",{textContent:v(c.value*g.value)},null,8,E),L]),u.value?(t(),o("div",P,[R,S,(t(!0),o(b,null,C(u.value,n=>(t(),o("div",q,[y(e("input",{id:"providers_"+n,"onUpdate:modelValue":a[1]||(a[1]=k=>i.value=k),value:n,class:"form-check-input",name:"provider",type:"radio",onChange:x},null,40,z),[[B,i.value,void 0,{value:!0}]]),e("label",{for:"providers_"+n,class:"form-check-label",textContent:v(n)},null,8,A)]))),256))])):(t(),o("div",H,J)),r.value?(t(),o("div",K,[O,Q,(t(!0),o(b,null,C(r.value,n=>(t(),o("div",W,[y(e("input",{id:"payments_"+n.name,"onUpdate:modelValue":a[2]||(a[2]=k=>d.value=k),value:n.name,class:"form-check-input",name:"payment",type:"radio"},null,8,X),[[B,d.value]]),e("label",{for:"payments_"+n.name,class:"form-check-label",textContent:v(n.title)},null,8,Y)]))),256))])):p("",!0),d.value?(t(),o("div",Z,[e("button",{disabled:_.value,class:"btn btn-primary mt-3",onClick:V,textContent:v(_.value?"请稍后":"立即支付")},null,8,$)])):p("",!0)])):p("",!0)]),_.value?(t(),o("p",ee,"正在创建订单...")):p("",!0),h.value?(t(),o("div",te,[oe,ne,e("a",{href:h.value,class:"link",target:"_blank"},"支付",8,se)])):p("",!0)],64))}};export{ie as default};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{i as u}from"./http-6b833e16.js";import{r as c,o as l,c as n,a as t,F as r,e as d,t as o}from"./app-211db244.js";const h=t("h3",null,"客户端下载",-1),_={class:"table table-bordered mt-3"},i=t("thead",null,[t("tr",null,[t("th",null,"名称"),t("th",null,"架构"),t("th",null,"下载")])],-1),m=["href"],B={name:"Downloads",setup(p){const a=c([]);return u.get("clients").then(s=>{a.value=s.data}),(s,f)=>(l(),n(r,null,[h,t("table",_,[i,t("tbody",null,[(l(!0),n(r,null,d(a.value,e=>(l(),n("tr",null,[t("td",null,o(e.name),1),t("td",null,o(e.arch),1),t("td",null,[t("a",{href:e.url},"下载",8,m)])]))),256))])])],64))}};export{B as default};
import{i as u}from"./http-77971bb6.js";import{r as c,o as l,c as n,a as t,F as r,e as d,t as o}from"./app-67d01e14.js";const h=t("h3",null,"客户端下载",-1),_={class:"table table-bordered mt-3"},i=t("thead",null,[t("tr",null,[t("th",null,"名称"),t("th",null,"架构"),t("th",null,"下载")])],-1),m=["href"],B={name:"Downloads",setup(p){const a=c([]);return u.get("clients").then(s=>{a.value=s.data}),(s,f)=>(l(),n(r,null,[h,t("table",_,[i,t("tbody",null,[(l(!0),n(r,null,d(a.value,e=>(l(),n("tr",null,[t("td",null,o(e.name),1),t("td",null,o(e.arch),1),t("td",null,[t("a",{href:e.url},"下载",8,m)])]))),256))])])],64))}};export{B as default};

View File

@ -1 +1 @@
import{i as o}from"./http-6b833e16.js";import{r as u,o as l,c,a as e,t as n,u as i,b as d,F as h}from"./app-211db244.js";const p=e("div",null,[e("h3",null,"欢迎")],-1),k={class:"mt-3"},f={key:0,class:"mt-3"},v=e("h3",null,"实名认证",-1),b=e("p",null," 注意,您没有完成实名认证,请点击下方按钮完成实名认证,否则您只能使用中国大陆以外的隧道。 ",-1),g=e("a",{class:"btn btn-primary",target:"_blank",href:"https://oauth.laecloud.com/real_name"},"实名认证",-1),y=e("h3",null,"访问密钥",-1),x={class:"mt-3"},B={key:0,class:"text-success"},A={name:"Index",setup(T){const r=window.Base.SiteName,s=u({name:"loading...",traffic:""}),a=u("");o.get("user").then(t=>{s.value=t.data});function _(){o.post("tokens").then(t=>{a.value=t.data.token})}function m(){o.delete("tokens").then(t=>{alert("所有 Token 删除成功。")})}return(t,w)=>(l(),c(h,null,[p,e("div",k,[e("p",null,"用户名: "+n(s.value.name),1),e("p",null,"剩余流量: "+n(s.value.traffic)+" GB",1)]),s.value.realnamed?d("",!0):(l(),c("div",f,[v,b,g,e("p",null,"在实名认证后,请重新登录 "+n(i(r))+"。",1)])),y,e("div",x,[e("p",null," 访问密钥是用于访问 "+n(i(r))+" API 的密钥,您可以使用它来开发自己的客户端。 ",1),a.value?(l(),c("p",B,"获取成功,请妥善保管您的 Token: "+n(a.value),1)):d("",!0),e("button",{class:"btn btn-primary",onClick:_}," 获取新密钥 "),e("button",{class:"btn btn-danger",style:{"margin-left":"5px"},onClick:m}," 删除所有密钥 ")])],64))}};export{A as default};
import{i as o}from"./http-77971bb6.js";import{r as u,o as l,c,a as e,t as n,u as i,b as d,F as h}from"./app-67d01e14.js";const p=e("div",null,[e("h3",null,"欢迎")],-1),k={class:"mt-3"},f={key:0,class:"mt-3"},v=e("h3",null,"实名认证",-1),b=e("p",null," 注意,您没有完成实名认证,请点击下方按钮完成实名认证,否则您只能使用中国大陆以外的隧道。 ",-1),g=e("a",{class:"btn btn-primary",href:"https://oauth.laecloud.com/real_name",target:"_blank"},"实名认证",-1),y=e("h3",null,"访问密钥",-1),x={class:"mt-3"},B={key:0,class:"text-success"},A={name:"Index",setup(T){const r=window.Base.SiteName,s=u({name:"loading...",traffic:""}),a=u("");o.get("user").then(t=>{s.value=t.data});function _(){o.post("tokens").then(t=>{a.value=t.data.token})}function m(){o.delete("tokens").then(t=>{alert("所有 Token 删除成功。")})}return(t,w)=>(l(),c(h,null,[p,e("div",k,[e("p",null,"用户名: "+n(s.value.name),1),e("p",null,"剩余流量: "+n(s.value.traffic)+" GB",1)]),s.value.realnamed?d("",!0):(l(),c("div",f,[v,b,g,e("p",null,"在实名认证后,请重新登录 "+n(i(r))+"。",1)])),y,e("div",x,[e("p",null," 访问密钥是用于访问 "+n(i(r))+" API 的密钥,您可以使用它来开发自己的客户端。 ",1),a.value?(l(),c("p",B,"获取成功,请妥善保管您的 Token: "+n(a.value),1)):d("",!0),e("button",{class:"btn btn-primary",onClick:_}," 获取新密钥 "),e("button",{class:"btn btn-danger",style:{"margin-left":"5px"},onClick:m}," 删除所有密钥 ")])],64))}};export{A as default};

View File

@ -1 +1 @@
import{i as d}from"./http-6b833e16.js";import{r as p,d as _,o as s,c as r,a as e,F as c,e as i,t as o,f as h,w as u,g as m}from"./app-211db244.js";const v=e("h3",null,"隧道列表",-1),k={class:"table table-hover"},f=e("thead",null,[e("tr",null,[e("th",{scope:"col"},"ID"),e("th",{scope:"col"},"名称"),e("th",{scope:"col"},"协议"),e("th",{scope:"col"},"本地地址"),e("th",{scope:"col"},"远程端口/域名"),e("th",{scope:"col"},"服务器"),e("th",{scope:"col"},"状态")])],-1),g={key:0},x={key:1},y={key:0,class:"text-success"},b={key:1,class:"text-danger"},V={name:"Index",setup(w){const a=p([{id:"0",protocol:"",server:{server_address:"",server_port:"",name:""},run_id:""}]);return d.get("tunnels").then(l=>{a.value=l.data,console.log(a.value)}),(l,B)=>{const n=_("router-link");return s(),r(c,null,[v,e("table",k,[f,e("tbody",null,[(s(!0),r(c,null,i(a.value,t=>(s(),r("tr",null,[e("th",null,o(t.id),1),e("td",null,[h(n,{to:{name:"tunnels.show",params:{id:t.id}}},{default:u(()=>[m(o(t.name),1)]),_:2},1032,["to"])]),e("td",null,o(t.protocol.toString().toUpperCase()),1),e("td",null,o(t.local_address),1),e("td",null,[t.protocol==="http"||t.protocol==="https"?(s(),r("span",g,o(t.custom_domain),1)):(s(),r("span",x,o(t.server.server_address)+":"+o(t.remote_port),1))]),e("td",null,o(t.server.name),1),e("td",null,[t.run_id?(s(),r("span",y,"在线")):(s(),r("span",b,"离线"))])]))),256))])])],64)}}};export{V as default};
import{i as d}from"./http-77971bb6.js";import{r as p,d as _,o as s,c as r,a as e,F as c,e as i,t as o,f as h,w as u,g as m}from"./app-67d01e14.js";const v=e("h3",null,"隧道列表",-1),k={class:"table table-hover"},f=e("thead",null,[e("tr",null,[e("th",{scope:"col"},"ID"),e("th",{scope:"col"},"名称"),e("th",{scope:"col"},"协议"),e("th",{scope:"col"},"本地地址"),e("th",{scope:"col"},"远程端口/域名"),e("th",{scope:"col"},"服务器"),e("th",{scope:"col"},"状态")])],-1),g={key:0},x={key:1},y={key:0,class:"text-success"},b={key:1,class:"text-danger"},V={name:"Index",setup(w){const a=p([{id:"0",protocol:"",server:{server_address:"",server_port:"",name:""},run_id:""}]);return d.get("tunnels").then(l=>{a.value=l.data,console.log(a.value)}),(l,B)=>{const n=_("router-link");return s(),r(c,null,[v,e("table",k,[f,e("tbody",null,[(s(!0),r(c,null,i(a.value,t=>(s(),r("tr",null,[e("th",null,o(t.id),1),e("td",null,[h(n,{to:{name:"tunnels.show",params:{id:t.id}}},{default:u(()=>[m(o(t.name),1)]),_:2},1032,["to"])]),e("td",null,o(t.protocol.toString().toUpperCase()),1),e("td",null,o(t.local_address),1),e("td",null,[t.protocol==="http"||t.protocol==="https"?(s(),r("span",g,o(t.custom_domain),1)):(s(),r("span",x,o(t.server.server_address)+":"+o(t.remote_port),1))]),e("td",null,o(t.server.name),1),e("td",null,[t.run_id?(s(),r("span",y,"在线")):(s(),r("span",b,"离线"))])]))),256))])])],64)}}};export{V as default};

View File

@ -1,4 +1,4 @@
import{i as Tl}from"./http-6b833e16.js";import{r as tm,m as em,i as cL,n as pL,o as rm,c as am,a as Ke,t as kh,b as dL,F as gL}from"./app-211db244.js";/*! *****************************************************************************
import{i as Tl}from"./http-77971bb6.js";import{r as tm,m as em,i as cL,n as pL,o as rm,c as am,a as Ke,t as kh,b as dL,F as gL}from"./app-67d01e14.js";/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any

View File

@ -1 +0,0 @@
import{p as k,r as y,i as b,q as C,o as p,c as h,a as f,t as E,f as L,u as _}from"./app-211db244.js";import{i as v}from"./http-6b833e16.js";function g(){return g=Object.assign?Object.assign.bind():function(i){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(i[a]=t[a])}return i},g.apply(this,arguments)}var B=function(){var e=!1,t=[],a=function(){if(!e){e=!0;for(var d=0,s=t.length;d<s;d++)t[d]()}},r=function(d){if(!e){t.push(d);return}d()},n={resolved:function(){return e},resolve:a,promise:{then:r}};return n},S=Object.prototype.hasOwnProperty;function A(){var i=B();return{notify:function(){i.resolve()},wait:function(){return i.promise},render:function(t,a,r){this.wait().then(function(){r(window.grecaptcha.render(t,a))})},reset:function(t){typeof t>"u"||(this.assertLoaded(),this.wait().then(function(){return window.grecaptcha.reset(t)}))},execute:function(t){typeof t>"u"||(this.assertLoaded(),this.wait().then(function(){return window.grecaptcha.execute(t)}))},checkRecaptchaLoad:function(){S.call(window,"grecaptcha")&&S.call(window.grecaptcha,"render")&&this.notify()},assertLoaded:function(){if(!i.resolved())throw new Error("ReCAPTCHA has not been loaded")}}}var u=A();typeof window<"u"&&(window.vueRecaptchaApiLoaded=u.notify);var O=k({name:"VueRecaptcha",props:{sitekey:{type:String,required:!0},theme:{type:String},badge:{type:String},type:{type:String},size:{type:String},tabindex:{type:String},loadRecaptchaScript:{type:Boolean,default:!0},recaptchaScriptId:{type:String,default:"__RECAPTCHA_SCRIPT"},recaptchaHost:{type:String,default:"www.google.com"},language:{type:String,default:""}},emits:["render","verify","expired","error"],setup:function(e,t){var a=t.slots,r=t.emit,n=y(null),c=y(null),d=function(l){r("verify",l)},s=function(){r("expired")},x=function(){r("error")};return b(function(){if(u.checkRecaptchaLoad(),e.loadRecaptchaScript&&!document.getElementById(e.recaptchaScriptId)){var o=document.createElement("script");o.id=e.recaptchaScriptId,o.src="https://"+e.recaptchaHost+"/recaptcha/api.js?onload=vueRecaptchaApiLoaded&render=explicit&hl="+e.language,o.async=!0,o.defer=!0,document.head.appendChild(o)}var l=g({},e,{callback:d,"expired-callback":s,"error-callback":x}),w=n.value,R=a.default?w.children[0]:w;u.render(R,l,function(m){c.value=m,r("render",m)})}),{root:n,widgetId:c,reset:function(){u.reset(c.value)},execute:function(){u.execute(c.value)}}},render:function(){var e=this.$slots.default,t;return typeof e=="function"?t=e():t=e,C("div",{ref:"root"},t)}});const P=f("h3",null,"流量补给",-1),V={key:0},j={key:1},H=f("p",null,"完成验证码以签到",-1),$={name:"Sign",setup(i){const e=window.Base.ReCaptcha,t=y({last_sign_at:null,traffic:0});v.get("user").then(r=>{t.value.traffic=r.data.traffic});function a(r){v.post("traffic",{recaptcha:r}).then(n=>{t.value=n.data;let c=`获得了 ${n.data.traffic} GB 流量!`;n.data.traffic===0&&(c="没有获得流量~"),alert(c)}).finally(()=>{v.get("user").then(n=>{t.value.traffic=n.data.traffic}).finally(()=>{})})}return(r,n)=>(p(),h("div",null,[P,f("div",null,[f("p",null,"当前流量: "+E(t.value.traffic)+"GB",1),t.value.is_signed?(p(),h("div",V,"今日已签到")):(p(),h("div",j,[H,L(_(O),{sitekey:_(e),loadRecaptchaScript:"",recaptchaHost:"www.recaptcha.net",onVerify:a},null,8,["sitekey"])]))])]))}};export{$ as default};

View File

@ -0,0 +1 @@
import{p as R,r as f,i as b,q as C,o as h,c as v,a as s,t as E,f as L,u as _}from"./app-67d01e14.js";import{i as y}from"./http-77971bb6.js";function g(){return g=Object.assign?Object.assign.bind():function(i){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[r]=t[r])}return i},g.apply(this,arguments)}var B=function(){var e=!1,t=[],r=function(){if(!e){e=!0;for(var n=0,l=t.length;n<l;n++)t[n]()}},c=function(n){if(!e){t.push(n);return}n()},d={resolved:function(){return e},resolve:r,promise:{then:c}};return d},S=Object.prototype.hasOwnProperty;function A(){var i=B();return{notify:function(){i.resolve()},wait:function(){return i.promise},render:function(t,r,c){this.wait().then(function(){c(window.grecaptcha.render(t,r))})},reset:function(t){typeof t>"u"||(this.assertLoaded(),this.wait().then(function(){return window.grecaptcha.reset(t)}))},execute:function(t){typeof t>"u"||(this.assertLoaded(),this.wait().then(function(){return window.grecaptcha.execute(t)}))},checkRecaptchaLoad:function(){S.call(window,"grecaptcha")&&S.call(window.grecaptcha,"render")&&this.notify()},assertLoaded:function(){if(!i.resolved())throw new Error("ReCAPTCHA has not been loaded")}}}var u=A();typeof window<"u"&&(window.vueRecaptchaApiLoaded=u.notify);var O=R({name:"VueRecaptcha",props:{sitekey:{type:String,required:!0},theme:{type:String},badge:{type:String},type:{type:String},size:{type:String},tabindex:{type:String},loadRecaptchaScript:{type:Boolean,default:!0},recaptchaScriptId:{type:String,default:"__RECAPTCHA_SCRIPT"},recaptchaHost:{type:String,default:"www.google.com"},language:{type:String,default:""}},emits:["render","verify","expired","error"],setup:function(e,t){var r=t.slots,c=t.emit,d=f(null),a=f(null),n=function(p){c("verify",p)},l=function(){c("expired")},x=function(){c("error")};return b(function(){if(u.checkRecaptchaLoad(),e.loadRecaptchaScript&&!document.getElementById(e.recaptchaScriptId)){var o=document.createElement("script");o.id=e.recaptchaScriptId,o.src="https://"+e.recaptchaHost+"/recaptcha/api.js?onload=vueRecaptchaApiLoaded&render=explicit&hl="+e.language,o.async=!0,o.defer=!0,document.head.appendChild(o)}var p=g({},e,{callback:n,"expired-callback":l,"error-callback":x}),m=d.value,k=r.default?m.children[0]:m;u.render(k,p,function(w){a.value=w,c("render",w)})}),{root:d,widgetId:a,reset:function(){u.reset(a.value)},execute:function(){u.execute(a.value)}}},render:function(){var e=this.$slots.default,t;return typeof e=="function"?t=e():t=e,C("div",{ref:"root"},t)}});const P=s("h3",null,"流量补给",-1),V={key:0},j={key:1},H=s("p",null,"完成验证码以签到",-1),$={name:"Sign",setup(i){const e=window.Base.ReCaptcha,t=f({last_sign_at:null,traffic:0}),r=f("");window.matchMedia("(prefers-color-scheme: dark)").matches?r.value="dark":r.value="light",y.get("user").then(d=>{t.value.traffic=d.data.traffic});function c(d){y.post("traffic",{recaptcha:d}).then(a=>{t.value=a.data;let n=`获得了 ${a.data.traffic} GB 流量!`;a.data.traffic===0&&(n="没有获得流量~"),alert(n)}).finally(()=>{y.get("user").then(a=>{t.value.traffic=a.data.traffic}).finally(()=>{})})}return(d,a)=>(h(),v("div",null,[P,s("div",null,[s("p",null,"当前流量: "+E(t.value.traffic)+"GB",1),t.value.is_signed?(h(),v("div",V,"今日已签到")):(h(),v("div",j,[H,L(_(O),{sitekey:_(e),theme:r.value,loadRecaptchaScript:"",recaptchaHost:"www.recaptcha.net",onVerify:c},null,8,["sitekey","theme"])]))])]))}};export{$ as default};

View File

@ -1 +0,0 @@
.link[data-v-04d8426c]{color:#007bff;text-decoration:none;cursor:pointer}

View File

@ -0,0 +1 @@
import{_ as w,r as u,o as t,c as o,a as e,j as m,v as k,b as r,F as f,e as I,t as b,g as x,l as S,s as B,x as N}from"./app-67d01e14.js";import{i as y}from"./http-77971bb6.js";const a=_=>(B("data-v-37623621"),_=_(),N(),_),U=a(()=>e("div",null,[e("h3",null,"发工单")],-1)),D=a(()=>e("h5",null,"有遇到什么问题吗?",-1)),F=x(" 您可以选择以下常见问题: "),M=x("   "),j={class:"input-group mb-3"},E={key:0,class:"input-group"},L={key:1},R={key:0},q=a(()=>e("h5",{class:"mt-3"},"选择发工单的平台",-1)),z=a(()=>e("p",null,"如果您在选中的平台没有账号,我们将会帮您自动创建一个。",-1)),A={class:"form-group form-check"},G=["id","value"],H=["for","textContent"],J={key:1},K=a(()=>e("h5",{class:"mt-3"},"暂时没有可用的提供商",-1)),O=[K],P={key:2},Q=["disabled","textContent"],W={key:0},X={key:1,class:"mt-3"},Y=a(()=>e("h5",null,"完成",-1)),Z=a(()=>e("p",null,"如果您浏览器没有打开新的创建,请点击以下链接来打开。",-1)),$=["href"],ee={name:"Ticket",setup(_){const c=u([]),v=u(""),l=u(""),n=u(""),p=u(""),d=u(!1);y.get("providers").then(h=>{c.value=h.data,c.value.length>0&&(v.value=c.value[0])});function g(){d.value=!0,y.post("providers/"+v.value+"/ticket",{title:l.value,content:n.value}).then(h=>{p.value=h.data.redirect_url,setTimeout(()=>{window.open(p.value,"_blank")})}).finally(()=>{d.value=!1})}function C(){l.value="域名 {你的域名} 过白。",n.value="您好,我的域名已备案,请将我的域名 {你的域名} 加入白名单,谢谢。"}function T(){l.value="{节点} 的隧道无法连接。",n.value="您好,这个节点无法连接,请检查。"}return(h,i)=>(t(),o(f,null,[U,e("div",null,[D,e("div",{class:"mb-3"},[F,e("a",{class:"link",onClick:C},"域名白名单"),M,e("a",{class:"link",onClick:T},"映射问题")]),e("div",j,[m(e("input",{"onUpdate:modelValue":i[0]||(i[0]=s=>l.value=s),autofocus:"",class:"form-control",placeholder:"简要概述您遇到的问题",type:"text"},null,512),[[k,l.value]])]),l.value?(t(),o("div",E,[m(e("textarea",{"onUpdate:modelValue":i[1]||(i[1]=s=>n.value=s),class:"form-control",placeholder:"详细说明您遇到的问题..."},null,512),[[k,n.value]])])):r("",!0),l.value?(t(),o("div",L,[c.value?(t(),o("div",R,[q,z,(t(!0),o(f,null,I(c.value,s=>(t(),o("div",A,[m(e("input",{id:"providers_"+s,"onUpdate:modelValue":i[2]||(i[2]=V=>v.value=V),value:s,class:"form-check-input",name:"provider",type:"radio"},null,8,G),[[S,v.value,void 0,{value:!0}]]),e("label",{for:"providers_"+s,class:"form-check-label",textContent:b(s)},null,8,H)]))),256))])):(t(),o("div",J,O)),n.value?(t(),o("div",P,[e("button",{disabled:d.value,class:"btn btn-primary mt-3",onClick:g,textContent:b(d.value?"请稍后":"创建工单")},null,8,Q)])):r("",!0)])):r("",!0)]),d.value?(t(),o("p",W,"正在打开工单...")):r("",!0),p.value?(t(),o("div",X,[Y,Z,e("a",{href:p.value,class:"link",target:"_blank"},"打开工单",8,$)])):r("",!0)],64))}},se=w(ee,[["__scopeId","data-v-37623621"]]);export{se as default};

View File

@ -0,0 +1 @@
.link[data-v-37623621]{color:#007bff;text-decoration:none;cursor:pointer}

View File

@ -1 +0,0 @@
import{_ as w,r as c,o as t,c as o,a as e,j as m,v as k,b as r,F as f,e as I,t as b,g as x,l as S,s as B,x as N}from"./app-211db244.js";import{i as y}from"./http-6b833e16.js";const a=_=>(B("data-v-04d8426c"),_=_(),N(),_),U=a(()=>e("div",null,[e("h3",null,"发工单")],-1)),D=a(()=>e("h5",null,"有遇到什么问题吗?",-1)),F=x(" 您可以选择以下常见问题: "),M=x("   "),j={class:"input-group mb-3"},E={key:0,class:"input-group"},L={key:1},R={key:0},q=a(()=>e("h5",{class:"mt-3"},"选择发工单的平台",-1)),z=a(()=>e("p",null,"如果您在选中的平台没有账号,我们将会帮您自动创建一个。",-1)),A={class:"form-group form-check"},G=["id","value"],H=["textContent","for"],J={key:1},K=a(()=>e("h5",{class:"mt-3"},"暂时没有可用的提供商",-1)),O=[K],P={key:2},Q=["textContent","disabled"],W={key:0},X={key:1,class:"mt-3"},Y=a(()=>e("h5",null,"完成",-1)),Z=a(()=>e("p",null,"如果您浏览器没有打开新的创建,请点击以下链接来打开。",-1)),$=["href"],ee={name:"Ticket",setup(_){const u=c([]),v=c(""),l=c(""),n=c(""),p=c(""),d=c(!1);y.get("providers").then(h=>{u.value=h.data,u.value.length>0&&(v.value=u.value[0])});function g(){d.value=!0,y.post("providers/"+v.value+"/ticket",{title:l.value,content:n.value}).then(h=>{p.value=h.data.redirect_url,setTimeout(()=>{window.open(p.value,"_blank")})}).finally(()=>{d.value=!1})}function C(){l.value="域名 {你的域名} 过白。",n.value="您好,我的域名已备案,请将我的域名 {你的域名} 加入白名单,谢谢。"}function T(){l.value="{节点} 的隧道无法连接。",n.value="您好,这个节点无法连接,请检查。"}return(h,i)=>(t(),o(f,null,[U,e("div",null,[D,e("div",{class:"mb-3"},[F,e("a",{onClick:C,class:"link"},"域名白名单"),M,e("a",{onClick:T,class:"link"},"映射问题")]),e("div",j,[m(e("input",{autofocus:"",type:"text",class:"form-control",placeholder:"简要概述您遇到的问题","onUpdate:modelValue":i[0]||(i[0]=s=>l.value=s)},null,512),[[k,l.value]])]),l.value?(t(),o("div",E,[m(e("textarea",{class:"form-control","onUpdate:modelValue":i[1]||(i[1]=s=>n.value=s),placeholder:"详细说明您遇到的问题..."},null,512),[[k,n.value]])])):r("",!0),l.value?(t(),o("div",L,[u.value?(t(),o("div",R,[q,z,(t(!0),o(f,null,I(u.value,s=>(t(),o("div",A,[m(e("input",{type:"radio",class:"form-check-input",name:"provider",id:"providers_"+s,value:s,"onUpdate:modelValue":i[2]||(i[2]=V=>v.value=V)},null,8,G),[[S,v.value,void 0,{value:!0}]]),e("label",{textContent:b(s),class:"form-check-label",for:"providers_"+s},null,8,H)]))),256))])):(t(),o("div",J,O)),n.value?(t(),o("div",P,[e("button",{class:"btn btn-primary mt-3",onClick:g,textContent:b(d.value?"请稍后":"创建工单"),disabled:d.value},null,8,Q)])):r("",!0)])):r("",!0)]),d.value?(t(),o("p",W,"正在打开工单...")):r("",!0),p.value?(t(),o("div",X,[Y,Z,e("a",{href:p.value,class:"link",target:"_blank"},"打开工单",8,$)])):r("",!0)],64))}},se=w(ee,[["__scopeId","data-v-04d8426c"]]);export{se as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{y as a,m as n}from"./app-211db244.js";let t=a.create({baseURL:"/api",timeout:1e4,headers:{"X-Requested-With":"XMLHttpRequest","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]').getAttribute("content")}});t.interceptors.request.use(e=>(e.headers,e.headers.Accept="application/json",e),e=>(console.error(e),Promise.reject(e)));t.interceptors.response.use(e=>Promise.resolve(e),e=>{console.error("axios error",e);let s=[];e.response.data.data&&(s=e.response.data.data),e.response.data.message&&(s=e.response.data.message),e.response.data.error&&(s=e.response.data.error.message),e.response.status===429?alert("请求次数过多"):e.response.status===401||(e.response.status===404?n.push({name:"index"}):s.length!==0&&alert(s))});export{t as i};
import{y as a,m as n}from"./app-67d01e14.js";let t=a.create({baseURL:"/api",timeout:1e4,headers:{"X-Requested-With":"XMLHttpRequest","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]').getAttribute("content")}});t.interceptors.request.use(e=>(e.headers,e.headers.Accept="application/json",e),e=>(console.error(e),Promise.reject(e)));t.interceptors.response.use(e=>Promise.resolve(e),e=>{console.error("axios error",e);let s=[];e.response.data.data&&(s=e.response.data.data),e.response.data.message&&(s=e.response.data.message),e.response.data.error&&(s=e.response.data.error.message),e.response.status===429?alert("请求次数过多"):e.response.status===401||(e.response.status===404?n.push({name:"index"}):s.length!==0&&alert(s))});export{t as i};

View File

@ -1,6 +1,6 @@
{
"_http-6b833e16.js": {
"file": "assets/http-6b833e16.js",
"_http-77971bb6.js": {
"file": "assets/http-77971bb6.js",
"imports": [
"resources/js/app.js"
]
@ -19,7 +19,7 @@
"src": "resources/css/app.css"
},
"resources/js/app.css": {
"file": "assets/app-81a45845.css",
"file": "assets/app-1e655b61.css",
"src": "resources/js/app.css"
},
"resources/js/app.js": {
@ -28,7 +28,7 @@
"assets/bootstrap-icons-c6569d46.woff"
],
"css": [
"assets/app-81a45845.css"
"assets/app-1e655b61.css"
],
"dynamicImports": [
"resources/js/views/Index.vue",
@ -40,84 +40,84 @@
"resources/js/views/Charge.vue",
"resources/js/views/Ticket.vue"
],
"file": "assets/app-211db244.js",
"file": "assets/app-67d01e14.js",
"isEntry": true,
"src": "resources/js/app.js"
},
"resources/js/views/Charge.vue": {
"file": "assets/Charge-d1ecb160.js",
"file": "assets/Charge-fb5d591d.js",
"imports": [
"resources/js/app.js",
"_http-6b833e16.js"
"_http-77971bb6.js"
],
"isDynamicEntry": true,
"src": "resources/js/views/Charge.vue"
},
"resources/js/views/Downloads.vue": {
"file": "assets/Downloads-e5dffa76.js",
"file": "assets/Downloads-72e33985.js",
"imports": [
"_http-6b833e16.js",
"_http-77971bb6.js",
"resources/js/app.js"
],
"isDynamicEntry": true,
"src": "resources/js/views/Downloads.vue"
},
"resources/js/views/Index.vue": {
"file": "assets/Index-443e868d.js",
"file": "assets/Index-0f5af2d2.js",
"imports": [
"_http-6b833e16.js",
"_http-77971bb6.js",
"resources/js/app.js"
],
"isDynamicEntry": true,
"src": "resources/js/views/Index.vue"
},
"resources/js/views/Sign.vue": {
"file": "assets/Sign-2481bba2.js",
"file": "assets/Sign-31ea5fb9.js",
"imports": [
"resources/js/app.js",
"_http-6b833e16.js"
"_http-77971bb6.js"
],
"isDynamicEntry": true,
"src": "resources/js/views/Sign.vue"
},
"resources/js/views/Ticket.css": {
"file": "assets/Ticket-41ca6517.css",
"file": "assets/Ticket-ce48f17d.css",
"src": "resources/js/views/Ticket.css"
},
"resources/js/views/Ticket.vue": {
"css": [
"assets/Ticket-41ca6517.css"
"assets/Ticket-ce48f17d.css"
],
"file": "assets/Ticket-cf55d5a2.js",
"file": "assets/Ticket-7b4ccbe7.js",
"imports": [
"resources/js/app.js",
"_http-6b833e16.js"
"_http-77971bb6.js"
],
"isDynamicEntry": true,
"src": "resources/js/views/Ticket.vue"
},
"resources/js/views/Tunnels/Create.vue": {
"file": "assets/Create-4178bbcb.js",
"file": "assets/Create-9a56850d.js",
"imports": [
"resources/js/app.js",
"_http-6b833e16.js"
"_http-77971bb6.js"
],
"isDynamicEntry": true,
"src": "resources/js/views/Tunnels/Create.vue"
},
"resources/js/views/Tunnels/Index.vue": {
"file": "assets/Index-17439f01.js",
"file": "assets/Index-83b4b241.js",
"imports": [
"_http-6b833e16.js",
"_http-77971bb6.js",
"resources/js/app.js"
],
"isDynamicEntry": true,
"src": "resources/js/views/Tunnels/Index.vue"
},
"resources/js/views/Tunnels/Show.vue": {
"file": "assets/Show-505d00c3.js",
"file": "assets/Show-aadff2c8.js",
"imports": [
"_http-6b833e16.js",
"_http-77971bb6.js",
"resources/js/app.js"
],
"isDynamicEntry": true,

View File

@ -10,26 +10,26 @@ h3,
h4,
h5,
h6 {
font-weight: 400 !important;
font-weight: 400 !important;
}
.text-auto {
color: #333;
color: #333;
}
.text-reverse {
color: #fff;
color: #fff;
}
.text-reverse:hover {
color: #fff;
color: #fff;
}
.text-reverse:visited {
color: #fff;
color: #fff;
}
.bg-reverse {
background-color: #333;
background-color: #333;
}

View File

@ -1,13 +1,13 @@
<template>
<div>
<Nav />
</div>
<div>
<Layout />
</div>
<div>
<Nav/>
</div>
<div>
<Layout/>
</div>
</template>
<script setup>
import Layout from './components/Layout.vue'
import Nav from './components/Nav.vue'
import Layout from './components/Layout.vue'
import Nav from './components/Nav.vue'
</script>

View File

@ -4,7 +4,7 @@ import './bootstrap';
import 'bootstrap/dist/css/bootstrap.min.css';
import "bootstrap-icons/font/bootstrap-icons.css";
import { createApp } from "vue";
import {createApp} from "vue";
import axios from "axios";
import VueAxios from "vue-axios";

View File

@ -5,6 +5,7 @@
*/
import axios from 'axios';
window.axios = axios;
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

View File

@ -1,16 +1,16 @@
<template>
<main class="py-4">
<div class="container mb-8">
<router-view />
</div>
</main>
<main class="py-4">
<div class="container mb-8">
<router-view/>
</div>
</main>
</template>
<style scoped>
.mb-8 {
.mb-8 {
margin-bottom: 8rem;
}
}
</style>

View File

@ -3,10 +3,11 @@
<template v-for="item in items">
<li class="nav-item">
<router-link
class="nav-link text-auto"
:to="{ name: item.route }"
active-class="active"
>{{ item.name }}</router-link
class="nav-link text-auto"
>{{ item.name }}
</router-link
>
</li>
</template>
@ -17,9 +18,9 @@
<li class="nav-item">
<a
class="nav-link text-auto"
target="_blank"
href="https://wiki.laecloud.com/PortIO"
>文档</a
target="_blank"
>文档</a
>
</li>
<li class="nav-item">
@ -29,7 +30,7 @@
</template>
<script setup>
import { ref } from "vue";
import {ref} from "vue";
const items = ref([
{

View File

@ -9,41 +9,41 @@
/>
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent"
aria-expanded="false"
aria-label="切换导航"
class="navbar-toggler"
data-bs-target="#navbarSupportedContent"
data-bs-toggle="collapse"
type="button"
>
<span class="bi bi-list text-auto fs-1"></span>
</button>
<div
class="collapse navbar-collapse"
id="navbarSupportedContent"
class="collapse navbar-collapse"
>
<MenuVue />
<MenuVue/>
</div>
</div>
</nav>
</div>
<div
class="offcanvas offcanvas-end"
tabindex="-1"
id="offcanvasUserRight"
aria-labelledby="offcanvasUserRightLabel"
class="offcanvas offcanvas-end"
tabindex="-1"
>
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasUserRightLabel">
<h5 id="offcanvasUserRightLabel" class="offcanvas-title">
用户 ID
</h5>
<button
type="button"
aria-label="Close"
class="btn-close"
data-bs-dismiss="offcanvas"
aria-label="Close"
type="button"
></button>
</div>
<div class="offcanvas-body position-relative">
@ -55,7 +55,7 @@
</div>
</template>
<script setup>
import { ref } from "vue";
import {ref} from "vue";
import MenuVue from "./Menu.vue";
// read window.Base.SiteName as sitename

View File

@ -58,7 +58,7 @@ instance.interceptors.response.use(
//
// }
} else if (error.response.status === 404) {
router.push({ name: "index" });
router.push({name: "index"});
} else {
if (data.length !== 0) {
alert(data);

View File

@ -1,5 +1,5 @@
import { createRouter, createWebHistory } from "vue-router";
import { Tooltip, Toast } from 'bootstrap';
import {createRouter, createWebHistory} from "vue-router";
import {Toast, Tooltip} from 'bootstrap';
const routes = [
@ -98,7 +98,7 @@ routes.forEach((route) => {
route.beforeEnter = (to, from, next) => {
// 如果是管理员页面,且用户不是管理员,则跳转到首页
if (route.meta.admin && !isAdmin()) {
next({ name: "index" });
next({name: "index"});
} else {
next();
}

View File

@ -10,11 +10,11 @@
</p>
<div class="input-group mb-3">
<input
v-model="amount"
autofocus
type="number"
class="form-control"
placeholder="输入您要的流量 (单位: GB)"
v-model="amount"
type="number"
/>
<div class="input-group-append">
<span class="input-group-text">GB</span>
@ -30,18 +30,18 @@
<template v-for="p in providers">
<div class="form-group form-check">
<input
type="radio"
:id="'providers_' + p"
v-model.value="provider"
:value="p"
class="form-check-input"
name="provider"
:id="'providers_' + p"
:value="p"
v-model.value="provider"
type="radio"
@change="getPayments"
/>
<label
v-text="p"
class="form-check-label"
:for="'providers_' + p"
class="form-check-label"
v-text="p"
></label>
</div>
</template>
@ -56,17 +56,17 @@
<template v-for="py in payments">
<div class="form-group form-check">
<input
type="radio"
class="form-check-input"
name="payment"
:id="'payments_' + py.name"
v-model="payment"
:value="py.name"
class="form-check-input"
name="payment"
type="radio"
/>
<label
v-text="py.title"
class="form-check-label"
:for="'payments_' + py.name"
class="form-check-label"
v-text="py.title"
></label>
</div>
</template>
@ -74,10 +74,10 @@
<div v-if="payment">
<button
:disabled="loading"
class="btn btn-primary mt-3"
@click="pay"
v-text="loading ? '请稍后' : '立即支付'"
:disabled="loading"
></button>
</div>
</div>
@ -93,7 +93,7 @@
</template>
<script setup>
import { ref } from "vue";
import {ref} from "vue";
import http from "../plugins/http";

View File

@ -23,7 +23,7 @@
</template>
<script setup>
import { ref } from "vue";
import {ref} from "vue";
import http from '../plugins/http'
const items = ref([])

View File

@ -8,16 +8,16 @@
<p>剩余流量: {{ user.traffic }} GB</p>
</div>
<div class="mt-3" v-if="!user.realnamed">
<div v-if="!user.realnamed" class="mt-3">
<h3>实名认证</h3>
<p>
注意您没有完成实名认证请点击下方按钮完成实名认证否则您只能使用中国大陆以外的隧道
</p>
<a
class="btn btn-primary"
target="_blank"
href="https://oauth.laecloud.com/real_name"
>实名认证</a
target="_blank"
>实名认证</a
>
<p>在实名认证后请重新登录 {{ sitename }}</p>
</div>
@ -39,7 +39,7 @@
</template>
<script setup>
import { ref } from "vue";
import {ref} from "vue";
import http from "../plugins/http";
const sitename = window.Base.SiteName;

View File

@ -4,64 +4,64 @@
<h3>服务器</h3>
<div class="mb-3">
<label for="serverName" class="form-label">服务器名称</label>
<label class="form-label" for="serverName">服务器名称</label>
<input
type="text"
required
class="form-control"
id="serverName"
placeholder="输入服务器名称,他将会被搜索到"
name="name"
v-model="data.name"
class="form-control"
name="name"
placeholder="输入服务器名称,他将会被搜索到"
required
type="text"
/>
</div>
<h3>Frps 信息</h3>
<div class="mb-3">
<label for="serverAddr" class="form-label">Frps 地址</label>
<label class="form-label" for="serverAddr">Frps 地址</label>
<input
type="text"
required
class="form-control"
id="serverAddr"
name="server_address"
v-model="data.server_address"
class="form-control"
name="server_address"
required
type="text"
/>
</div>
<div class="mb-3">
<label for="serverPort" class="form-label">Frps 端口</label>
<label class="form-label" for="serverPort">Frps 端口</label>
<input
type="text"
required
class="form-control"
id="serverPort"
name="server_port"
v-model="data.server_port"
class="form-control"
name="server_port"
required
type="text"
/>
</div>
<div class="mb-3">
<label for="serverToken" class="form-label">Frps 令牌</label>
<label class="form-label" for="serverToken">Frps 令牌</label>
<input
type="text"
required
class="form-control"
id="serverToken"
name="token"
v-model="data.token"
class="form-control"
name="token"
required
type="text"
/>
</div>
<h3>服务器位置</h3>
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="is_china_mainland"
value="1"
id="is_china_mainland"
v-model="data.is_china_mainland"
class="form-check-input"
name="is_china_mainland"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="is_china_mainland">
在中国大陆
@ -73,98 +73,98 @@
<h3>Frps Dashboard 配置</h3>
<div class="mb-3">
<label for="dashboardPort" class="form-label">端口</label>
<label class="form-label" for="dashboardPort">端口</label>
<input
type="text"
required
class="form-control"
id="dashboardPort"
name="dashboard_port"
v-model="data.dashboard_port"
class="form-control"
name="dashboard_port"
required
type="text"
/>
</div>
<div class="mb-3">
<label for="dashboardUser" class="form-label">登录用户名</label>
<label class="form-label" for="dashboardUser">登录用户名</label>
<input
type="text"
required
class="form-control"
id="dashboardUser"
name="dashboard_user"
v-model="data.dashboard_user"
class="form-control"
name="dashboard_user"
required
type="text"
/>
</div>
<div class="mb-3">
<label for="dashboardPwd" class="form-label">密码</label>
<label class="form-label" for="dashboardPwd">密码</label>
<input
type="text"
required
class="form-control"
id="dashboardPwd"
name="dashboard_password"
v-model="data.dashboard_password"
class="form-control"
name="dashboard_password"
required
type="text"
/>
</div>
<h3>端口范围限制</h3>
<div class="input-group input-group-sm mb-3">
<input
type="text"
required
class="form-control"
placeholder="最小端口,比如:1024"
name="min_port"
v-model="data.min_port"
class="form-control"
name="min_port"
placeholder="最小端口,比如:1024"
required
type="text"
/>
<input
type="text"
required
class="form-control"
placeholder="最大端口,比如:65535"
name="max_port"
v-model="data.max_port"
class="form-control"
name="max_port"
placeholder="最大端口,比如:65535"
required
type="text"
/>
</div>
<h3>最多隧道数量</h3>
<div class="input-group input-group-sm mb-3">
<input
type="text"
required
class="form-control"
placeholder="最多隧道数量,比如:1024个隧道"
name="max_tunnels"
v-model="data.max_tunnels"
class="form-control"
name="max_tunnels"
placeholder="最多隧道数量,比如:1024个隧道"
required
type="text"
/>
</div>
<h3>隧道协议限制</h3>
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_http"
value="1"
id="allow_http"
v-model="data.allow_http"
class="form-check-input"
name="allow_http"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_http">
允许 HTTP
</label>
<br />
<br/>
超文本传输协议
</div>
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_https"
value="1"
id="allow_https"
v-model="data.allow_https"
class="form-check-input"
name="allow_https"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_https">
允许 HTTPS
@ -173,12 +173,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_tcp"
value="1"
id="allow_tcp"
v-model="data.allow_tcp"
class="form-check-input"
name="allow_tcp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_tcp">
允许 TCP
@ -187,12 +187,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_udp"
value="1"
id="allow_udp"
v-model="data.allow_udp"
class="form-check-input"
name="allow_udp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_udp">
允许 UDP
@ -201,12 +201,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_stcp"
value="1"
id="allow_stcp"
v-model="data.allow_stcp"
class="form-check-input"
name="allow_stcp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_stcp">
允许 STCP
@ -215,12 +215,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_sudp"
value="1"
id="allow_sudp"
v-model="data.allow_sudp"
class="form-check-input"
name="allow_sudp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_sudp">
允许 SUDP
@ -229,12 +229,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_xtcp"
value="1"
id="allow_xtcp"
v-model="data.allow_xtcp"
class="form-check-input"
name="allow_xtcp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_xtcp">
允许 XTCP
@ -243,8 +243,8 @@
<div class="col-auto">
<button
type="submit"
class="btn btn-primary mb-3"
type="submit"
@click.prevent="submit"
>
新建服务器
@ -255,7 +255,7 @@
</template>
<script setup>
import { ref } from "vue";
import {ref} from "vue";
import http from "../../plugins/http";
const data = ref({

View File

@ -2,64 +2,64 @@
<div class="row">
<div class="col">
<div class="mb-3">
<label for="serverName" class="form-label">服务器名称</label>
<label class="form-label" for="serverName">服务器名称</label>
<input
type="text"
required
class="form-control"
id="serverName"
placeholder="输入服务器名称,它将会被搜索到"
name="name"
v-model="data.name"
class="form-control"
name="name"
placeholder="输入服务器名称,它将会被搜索到"
required
type="text"
/>
</div>
<h3>Frps 信息</h3>
<div class="mb-3">
<label for="serverAddr" class="form-label">Frps 地址</label>
<label class="form-label" for="serverAddr">Frps 地址</label>
<input
type="text"
required
class="form-control"
id="serverAddr"
name="server_address"
v-model="data.server_address"
class="form-control"
name="server_address"
required
type="text"
/>
</div>
<div class="mb-3">
<label for="serverPort" class="form-label">Frps 端口</label>
<label class="form-label" for="serverPort">Frps 端口</label>
<input
type="text"
required
class="form-control"
id="serverPort"
name="server_port"
v-model="data.server_port"
class="form-control"
name="server_port"
required
type="text"
/>
</div>
<div class="mb-3">
<label for="serverToken" class="form-label">Frps 令牌</label>
<label class="form-label" for="serverToken">Frps 令牌</label>
<input
type="text"
required
class="form-control"
id="serverToken"
name="token"
v-model="data.token"
class="form-control"
name="token"
required
type="text"
/>
</div>
<h3>服务器位置</h3>
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="is_china_mainland"
value="1"
id="is_china_mainland"
v-model="data.is_china_mainland"
class="form-check-input"
name="is_china_mainland"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="is_china_mainland">
在中国大陆
@ -71,82 +71,82 @@
<h3>Frps Dashboard 配置</h3>
<div class="mb-3">
<label for="dashboardPort" class="form-label">端口</label>
<label class="form-label" for="dashboardPort">端口</label>
<input
type="text"
required
class="form-control"
id="dashboardPort"
name="dashboard_port"
v-model="data.dashboard_port"
class="form-control"
name="dashboard_port"
required
type="text"
/>
</div>
<div class="mb-3">
<label for="dashboardUser" class="form-label">登录用户名</label>
<label class="form-label" for="dashboardUser">登录用户名</label>
<input
type="text"
required
class="form-control"
id="dashboardUser"
name="dashboard_user"
v-model="data.dashboard_user"
class="form-control"
name="dashboard_user"
required
type="text"
/>
</div>
<div class="mb-3">
<label for="dashboardPwd" class="form-label">密码</label>
<label class="form-label" for="dashboardPwd">密码</label>
<input
type="text"
required
class="form-control"
id="dashboardPwd"
name="dashboard_password"
v-model="data.dashboard_password"
class="form-control"
name="dashboard_password"
required
type="text"
/>
</div>
<h3>端口范围限制</h3>
<div class="input-group input-group-sm mb-3">
<input
type="text"
required
class="form-control"
placeholder="最小端口,比如:1024"
name="min_port"
v-model="data.min_port"
class="form-control"
name="min_port"
placeholder="最小端口,比如:1024"
required
type="text"
/>
<input
type="text"
required
class="form-control"
placeholder="最大端口,比如:65535"
name="max_port"
v-model="data.max_port"
class="form-control"
name="max_port"
placeholder="最大端口,比如:65535"
required
type="text"
/>
</div>
<h3>最多隧道数量</h3>
<div class="input-group input-group-sm mb-3">
<input
type="text"
required
class="form-control"
placeholder="最多隧道数量,比如:1024个隧道"
name="max_tunnels"
v-model="data.max_tunnels"
class="form-control"
name="max_tunnels"
placeholder="最多隧道数量,比如:1024个隧道"
required
type="text"
/>
</div>
<h3>隧道协议限制</h3>
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_http"
value="1"
id="allow_http"
v-model="data.allow_http"
class="form-check-input"
name="allow_http"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_http">
允许 HTTP
@ -157,12 +157,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_https"
value="1"
id="allow_https"
v-model="data.allow_https"
class="form-check-input"
name="allow_https"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_https">
允许 HTTPS
@ -171,12 +171,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_tcp"
value="1"
id="allow_tcp"
v-model="data.allow_tcp"
class="form-check-input"
name="allow_tcp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_tcp">
允许 TCP
@ -185,12 +185,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_udp"
value="1"
id="allow_udp"
v-model="data.allow_udp"
class="form-check-input"
name="allow_udp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_udp">
允许 UDP
@ -199,12 +199,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_stcp"
value="1"
id="allow_stcp"
v-model="data.allow_stcp"
class="form-check-input"
name="allow_stcp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_stcp">
允许 STCP
@ -213,12 +213,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_sudp"
value="1"
id="allow_sudp"
v-model="data.allow_sudp"
class="form-check-input"
name="allow_sudp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_sudp">
允许 SUDP
@ -227,12 +227,12 @@
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="allow_xtcp"
value="1"
id="allow_xtcp"
v-model="data.allow_xtcp"
class="form-check-input"
name="allow_xtcp"
type="checkbox"
value="1"
/>
<label class="form-check-label" for="allow_xtcp">
允许 XTCP
@ -241,16 +241,16 @@
<div class="col-auto mt-3">
<button
type="submit"
class="btn btn-primary mb-3"
type="submit"
@click.prevent="submit"
>
修改服务器配置
</button>
<button
type="submit"
class="btn btn-danger mb-3"
style="margin-left: 5px "
type="submit"
@click.prevent="destroy"
>
删除服务器

View File

@ -13,7 +13,7 @@
query: {
server_id: server.id
}
}" class="list-group-item list-group-item-action" aria-current="true">
}" aria-current="true" class="list-group-item list-group-item-action">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">{{ server.name }}</h5>
<small>
@ -74,7 +74,6 @@ http.get('servers').then((res) => {
})
const isAdmin = () => {
return window['Base']['User']['is_admin']
}

View File

@ -9,6 +9,7 @@
<p>完成验证码以签到</p>
<vue-recaptcha
:sitekey="key"
:theme="theme"
loadRecaptchaScript
recaptchaHost="www.recaptcha.net"
@verify="sign"
@ -19,8 +20,8 @@
</template>
<script setup>
import { ref } from "vue";
import { VueRecaptcha } from 'vue-recaptcha';
import {ref} from "vue";
import {VueRecaptcha} from 'vue-recaptcha';
import http from "../plugins/http";
@ -31,6 +32,14 @@ const traffic = ref({
traffic: 0,
});
const theme = ref("")
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme.value = "dark"
} else {
theme.value = "light"
}
http.get("user")
.then((res) => {
traffic.value.traffic = res.data.traffic;

View File

@ -8,24 +8,24 @@
<div class="mb-3">
您可以选择以下常见问题
<a @click="common_domain" class="link">域名白名单</a>
<a class="link" @click="common_domain">域名白名单</a>
&nbsp;
<a @click="common_problem" class="link">映射问题</a>
<a class="link" @click="common_problem">映射问题</a>
</div>
<div class="input-group mb-3">
<input
v-model="title"
autofocus
type="text"
class="form-control"
placeholder="简要概述您遇到的问题"
v-model="title"
type="text"
/>
</div>
<div class="input-group" v-if="title">
<div v-if="title" class="input-group">
<textarea
class="form-control"
v-model="content"
class="form-control"
placeholder="详细说明您遇到的问题..."
></textarea>
</div>
@ -37,17 +37,17 @@
<template v-for="p in providers">
<div class="form-group form-check">
<input
type="radio"
:id="'providers_' + p"
v-model.value="provider"
:value="p"
class="form-check-input"
name="provider"
:id="'providers_' + p"
:value="p"
v-model.value="provider"
type="radio"
/>
<label
v-text="p"
class="form-check-label"
:for="'providers_' + p"
class="form-check-label"
v-text="p"
></label>
</div>
</template>
@ -58,10 +58,10 @@
<div v-if="content">
<button
:disabled="loading"
class="btn btn-primary mt-3"
@click="submit"
v-text="loading ? '请稍后' : '创建工单'"
:disabled="loading"
></button>
</div>
</div>
@ -77,7 +77,7 @@
</template>
<script setup>
import { ref } from "vue";
import {ref} from "vue";
import http from "../plugins/http";

View File

@ -4,12 +4,12 @@
<h5>好的名称是好的开始</h5>
<div class="form-floating mb-3">
<input v-model="data.name" type="text" class="form-control" id="tunnelName" placeholder="起一个易于辨别的名字">
<input id="tunnelName" v-model="data.name" class="form-control" placeholder="起一个易于辨别的名字" type="text">
<label for="tunnelName">隧道名称</label>
</div>
<div class="form-floating mb-3">
<select v-model="data.server_id" class="form-select" id="serverSelect">
<select id="serverSelect" v-model="data.server_id" class="form-select">
<option v-for="server in servers" :value="server.id">{{ server.name }}</option>
</select>
<label for="serverSelect">服务器</label>
@ -17,43 +17,44 @@
<div v-if="server">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="protocolHTTP" value="http" :disabled="!server.allow_http"
v-model="data.protocol">
<input id="protocolHTTP" v-model="data.protocol" :disabled="!server.allow_http" class="form-check-input" type="radio"
value="http">
<label class="form-check-label" for="protocolHTTP">HTTP</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="protocolHTTPS" value="https" :disabled="!server.allow_https"
v-model="data.protocol">
<input id="protocolHTTPS" v-model="data.protocol" :disabled="!server.allow_https" class="form-check-input"
type="radio"
value="https">
<label class="form-check-label" for="protocolHTTPS">HTTPS</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="protocolTCP" value="tcp" :disabled="!server.allow_tcp"
v-model="data.protocol">
<input id="protocolTCP" v-model="data.protocol" :disabled="!server.allow_tcp" class="form-check-input" type="radio"
value="tcp">
<label class="form-check-label" for="protocolTCP">TCP</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="protocolUDP" value="udp" :disabled="!server.allow_udp"
v-model="data.protocol">
<input id="protocolUDP" v-model="data.protocol" :disabled="!server.allow_udp" class="form-check-input" type="radio"
value="udp">
<label class="form-check-label" for="protocolUDP">UDP</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="protocolSTCP" value="stcp" :disabled="!server.allow_stcp"
v-model="data.protocol">
<input id="protocolSTCP" v-model="data.protocol" :disabled="!server.allow_stcp" class="form-check-input" type="radio"
value="stcp">
<label class="form-check-label" for="protocolSTCP">STCP</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="protocolSUDP" value="sudp" :disabled="!server.allow_sudp"
v-model="data.protocol">
<input id="protocolSUDP" v-model="data.protocol" :disabled="!server.allow_sudp" class="form-check-input" type="radio"
value="sudp">
<label class="form-check-label" for="protocolSUDP">SUDP</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="protocolXTCP" value="xtcp" :disabled="!server.allow_xtcp"
v-model="data.protocol">
<input id="protocolXTCP" v-model="data.protocol" :disabled="!server.allow_xtcp" class="form-check-input" type="radio"
value="xtcp">
<label class="form-check-label" for="protocolXTCP">XTCP</label>
</div>
@ -61,8 +62,8 @@
<h5 class="mt-3">本地服务的地址</h5>
<div class="form-floating mb-3">
<input v-model="data.local_address" type="text" class="form-control" id="localAddress"
placeholder="比如 127.0.0.1:80">
<input id="localAddress" v-model="data.local_address" class="form-control" placeholder="比如 127.0.0.1:80"
type="text">
<label for="localAddress">本地地址</label>
</div>
@ -70,8 +71,8 @@
<div v-if="data.protocol === 'http'|| data.protocol === 'https'">
<h5>自定义域名</h5>
<div class="form-floating mb-3">
<input v-model="data.custom_domain" type="text" class="form-control" id="customDomain"
placeholder="比如 example.com">
<input id="customDomain" v-model="data.custom_domain" class="form-control" placeholder="比如 example.com"
type="text">
<label for="customDomain">自定义域名</label>
</div>
</div>
@ -79,8 +80,8 @@
<div v-if="data.protocol === 'tcp' || data.protocol === 'udp'">
<h5>外部端口</h5>
<div class="form-floating mb-3">
<input v-model="data.remote_port" type="text" class="form-control" id="remotePort"
placeholder="比如 25565">
<input id="remotePort" v-model="data.remote_port" class="form-control" placeholder="比如 25565"
type="text">
<label for="remotePort">外部端口</label>
</div>
</div>
@ -88,8 +89,8 @@
<div v-if="data.protocol === 'stcp' || data.protocol === 'sudp' || data.protocol === 'xtcp' ">
<h5>访问密钥</h5>
<div class="form-floating mb-3">
<input v-model="data.sk" type="text" class="form-control" id="sk"
placeholder="比如 25565">
<input id="sk" v-model="data.sk" class="form-control" placeholder="比如 25565"
type="text">
<label for="sk">访问密钥</label>
</div>

View File

@ -3,40 +3,40 @@
<table class="table table-hover">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">名称</th>
<th scope="col">协议</th>
<th scope="col">本地地址</th>
<th scope="col">远程端口/域名</th>
<!-- <th scope="col">连接数</th>
<th scope="col">下载流量</th>
<th scope="col">上载流量</th> -->
<th scope="col">服务器</th>
<th scope="col">状态</th>
</tr>
<tr>
<th scope="col">ID</th>
<th scope="col">名称</th>
<th scope="col">协议</th>
<th scope="col">本地地址</th>
<th scope="col">远程端口/域名</th>
<!-- <th scope="col">连接数</th>
<th scope="col">下载流量</th>
<th scope="col">上载流量</th> -->
<th scope="col">服务器</th>
<th scope="col">状态</th>
</tr>
</thead>
<tbody>
<tr v-for="tunnel in tunnels">
<th>{{ tunnel.id }}</th>
<td>
<router-link
:to="{
<tr v-for="tunnel in tunnels">
<th>{{ tunnel.id }}</th>
<td>
<router-link
:to="{
name: 'tunnels.show',
params: { id: tunnel.id },
}"
>
{{ tunnel.name }}
</router-link>
</td>
<td>
{{ tunnel.protocol.toString().toUpperCase() }}
</td>
<td>
{{ tunnel.local_address }}
</td>
>
{{ tunnel.name }}
</router-link>
</td>
<td>
{{ tunnel.protocol.toString().toUpperCase() }}
</td>
<td>
{{ tunnel.local_address }}
</td>
<td>
<td>
<span
v-if="
tunnel.protocol === 'http' ||
@ -45,30 +45,30 @@
>
{{ tunnel.custom_domain }}
</span>
<span v-else>
<span v-else>
{{ tunnel.server.server_address }}:{{
tunnel.remote_port
}}
tunnel.remote_port
}}
</span>
</td>
</td>
<!-- <td>0</td>
<td>0.000 Bytes</td>
<td>0.000 Bytes</td> -->
<!-- <td>0</td>
<td>0.000 Bytes</td>
<td>0.000 Bytes</td> -->
<td>{{ tunnel.server.name }}</td>
<td>{{ tunnel.server.name }}</td>
<td>
<span class="text-success" v-if="tunnel.run_id">在线</span>
<span class="text-danger" v-else="tunnel.run_id">离线</span>
</td>
</tr>
<td>
<span v-if="tunnel.run_id" class="text-success">在线</span>
<span v-else="tunnel.run_id" class="text-danger">离线</span>
</td>
</tr>
</tbody>
</table>
</template>
<script setup>
import { ref } from "vue";
import {ref} from "vue";
import http from "../../plugins/http";
const tunnels = ref([

View File

@ -10,15 +10,15 @@
<div>
<h2>配置文件</h2>
<pre
>{{ tunnel.config.server }}
>{{ tunnel.config.server }}
{{ tunnel.config.client }}
</pre>
</div>
<!-- <div v-if="tunnel.tunnel">
<!-- <div v-if="tunnel.tunnel">
</div> -->
</div> -->
<div v-if="tunnel.run_id" class="mb-3">
<h2>强制下线</h2>
@ -34,11 +34,12 @@
</template>
<script setup>
import { onMounted, onUnmounted, ref } from "vue";
import {onMounted, onUnmounted, ref} from "vue";
import http from "../../plugins/http";
import router from "../../plugins/router";
import * as echarts from "echarts";
import Humanize from 'humanize-plus'
const showChart = ref(false);
let chart = undefined;
@ -148,7 +149,7 @@ function deleteTunnel() {
http.delete(`/tunnels/${tunnel_id}`).then(() => {
alert("删除成功");
router.push({ name: "tunnels" });
router.push({name: "tunnels"});
});
}
}
@ -188,10 +189,10 @@ function refresh() {
for (let i = 0; i < 7; i++) {
dates.push(
now.getFullYear() +
"-" +
(now.getMonth() + 1) +
"-" +
now.getDate()
"-" +
(now.getMonth() + 1) +
"-" +
now.getDate()
);
now = new Date(
now.getFullYear(),

View File

@ -4,13 +4,16 @@
@csrf
@method('PUT')
<label for="name" class="form-label">名称</label>
<input type="text" name="name" id="name" placeholder="名称" class="form-control mb-3" required value="{{ $client->name }}">
<input type="text" name="name" id="name" placeholder="名称" class="form-control mb-3" required
value="{{ $client->name }}">
<label for="name" class="form-label">架构</label>
<input type="text" name="arch" id="arch" placeholder="架构" class="form-control mb-3" required value="{{ $client->arch }}">
<input type="text" name="arch" id="arch" placeholder="架构" class="form-control mb-3" required
value="{{ $client->arch }}">
<label for="name" class="form-label">下载链接</label>
<input type="text" name="url" id="url" placeholder="下载链接" class="form-control mb-3" required value="{{ $client->url }}">
<input type="text" name="url" id="url" placeholder="下载链接" class="form-control mb-3" required
value="{{ $client->url }}">
<button class="btn btn-primary" type="submit">保存更改</button>
</form>

View File

@ -26,7 +26,7 @@
总计: {{ $count }}
</div>
<table class="mt-3 table table-hover text-center table-bordered" style="vertical-align: middle">
<table class="mt-3 table table-hover text-center table-bordered" style="vertical-align: middle">
<thead>
<tr>
<th>ID</th>

View File

@ -2,13 +2,13 @@
<html lang="cn">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>木韩内网穿透</title>
<link rel="shortcut icon" type="image/jpg" href="/favicon.ico" />
<link href="static/css/5b2abac487cc40918ae5402f74195717.css" rel="stylesheet" />
<link rel="stylesheet" href="static/css/style.css" />
<link rel="shortcut icon" type="image/jpg" href="/favicon.ico"/>
<link href="static/css/5b2abac487cc40918ae5402f74195717.css" rel="stylesheet"/>
<link rel="stylesheet" href="static/css/style.css"/>
<script src="static/js/anime.min.js"></script>
<script src="static/js/scrollreveal.min.js"></script>
</head>
@ -20,22 +20,25 @@
<svg width="337" height="222" viewBox="0 0 337 222" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient x1="50%" y1="55.434%" x2="50%" y2="0%" id="header-shape-1">
<stop stop-color="#E0E1FE" stop-opacity="0" offset="0%" />
<stop stop-color="#E0E1FE" offset="100%" />
<stop stop-color="#E0E1FE" stop-opacity="0" offset="0%"/>
<stop stop-color="#E0E1FE" offset="100%"/>
</linearGradient>
</defs>
<path d="M1103.21 0H1440v400h-400c145.927-118.557 166.997-251.89 63.21-400z" transform="translate(-1103)" fill="url(#header-shape-1)" fill-rule="evenodd" />
<path d="M1103.21 0H1440v400h-400c145.927-118.557 166.997-251.89 63.21-400z"
transform="translate(-1103)" fill="url(#header-shape-1)" fill-rule="evenodd"/>
</svg>
</div>
<div class="header-shape header-shape-2">
<svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg" style="overflow: visible">
<svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"
style="overflow: visible">
<defs>
<linearGradient x1="93.05%" y1="19.767%" x2="15.034%" y2="85.765%" id="header-shape-2">
<stop stop-color="#FF3058" offset="0%" />
<stop stop-color="#FF6381" offset="100%" />
<stop stop-color="#FF3058" offset="0%"/>
<stop stop-color="#FF6381" offset="100%"/>
</linearGradient>
</defs>
<circle class="anime-element fadeup-animation" cx="64" cy="64" r="64" fill="url(#header-shape-2)" fill-rule="evenodd" />
<circle class="anime-element fadeup-animation" cx="64" cy="64" r="64" fill="url(#header-shape-2)"
fill-rule="evenodd"/>
</svg>
</div>
<div class="container">
@ -47,19 +50,19 @@
<title>Dual Net</title>
<defs>
<linearGradient x1="114.674%" y1="39.507%" x2="-52.998%" y2="39.507%" id="logo-a">
<stop stop-color="#8D92FA" offset="0%" />
<stop stop-color="#8D92FA" stop-opacity="0" offset="100%" />
<stop stop-color="#8D92FA" offset="0%"/>
<stop stop-color="#8D92FA" stop-opacity="0" offset="100%"/>
</linearGradient>
<linearGradient x1="93.05%" y1="19.767%" x2="15.034%" y2="85.765%" id="logo-b">
<stop stop-color="#FF3058" offset="0%" />
<stop stop-color="#FF6381" offset="100%" />
<stop stop-color="#FF3058" offset="0%"/>
<stop stop-color="#FF6381" offset="100%"/>
</linearGradient>
<linearGradient x1="32.716%" y1="-20.176%" x2="32.716%" y2="148.747%" id="logo-c">
<stop stop-color="#FF97AA" offset="0%" />
<stop stop-color="#FF97AA" stop-opacity="0" offset="100%" />
<stop stop-color="#FF97AA" offset="0%"/>
<stop stop-color="#FF97AA" stop-opacity="0" offset="100%"/>
</linearGradient>
</defs>
<img src="static/picture/logo.png" alt="Dual Net" width="160px" />
<img src="static/picture/logo.png" alt="Dual Net" width="160px"/>
</svg>
</a>
@ -74,7 +77,7 @@
<div class="hero-inner">
<div class="hero-copy">
<h1 class="hero-title mt-0">
木韩内网穿透<br />全新的内网穿透服务商
木韩内网穿透<br/>全新的内网穿透服务商
</h1>
<div class="hero-form field field-grouped">
@ -88,185 +91,260 @@
<div class="hero-illustration">
<div class="hero-shape hero-shape-1">
<svg width="40" height="40" xmlns="http://www.w3.org/2000/svg" style="overflow: visible">
<circle class="anime-element fadeup-animation" cx="20" cy="20" r="20" fill="#FFD8CD" fill-rule="evenodd" />
<circle class="anime-element fadeup-animation" cx="20" cy="20" r="20" fill="#FFD8CD"
fill-rule="evenodd"/>
</svg>
</div>
<div class="hero-shape hero-shape-2">
<svg width="88" height="88" xmlns="http://www.w3.org/2000/svg" style="overflow: visible">
<circle class="anime-element fadeup-animation" cx="44" cy="44" r="44" fill="#FFD2DA" fill-rule="evenodd" />
<circle class="anime-element fadeup-animation" cx="44" cy="44" r="44" fill="#FFD2DA"
fill-rule="evenodd"/>
</svg>
</div>
<div class="hero-main-shape">
<svg width="940" height="647" viewBox="0 0 940 647" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="overflow: visible">
<svg width="940" height="647" viewBox="0 0 940 647" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" style="overflow: visible">
<defs>
<linearGradient x1="100%" y1="0%" x2="0%" y2="100%" id="hero-illustration-a">
<stop stop-color="#261FB6" offset="0%" />
<stop stop-color="#4950F6" offset="100%" />
<stop stop-color="#261FB6" offset="0%"/>
<stop stop-color="#4950F6" offset="100%"/>
</linearGradient>
<linearGradient x1="89.764%" y1="16.809%" x2="11.987%" y2="82.178%" id="hero-illustration-b">
<stop stop-color="#FC8464" offset="0%" />
<stop stop-color="#FB5C32" offset="100%" />
<linearGradient x1="89.764%" y1="16.809%" x2="11.987%" y2="82.178%"
id="hero-illustration-b">
<stop stop-color="#FC8464" offset="0%"/>
<stop stop-color="#FB5C32" offset="100%"/>
</linearGradient>
<linearGradient x1="100%" y1="23.096%" x2="4.439%" y2="96.586%" id="hero-illustration-c">
<stop stop-color="#1ADAB7" offset="0%" />
<stop stop-color="#55EBD0" offset="100%" />
<linearGradient x1="100%" y1="23.096%" x2="4.439%" y2="96.586%"
id="hero-illustration-c">
<stop stop-color="#1ADAB7" offset="0%"/>
<stop stop-color="#55EBD0" offset="100%"/>
</linearGradient>
<filter x="-13%" y="-150%" width="126.1%" height="400%" filterUnits="objectBoundingBox" id="hero-illustration-d">
<feGaussianBlur stdDeviation="32" in="SourceGraphic" />
<filter x="-13%" y="-150%" width="126.1%" height="400%"
filterUnits="objectBoundingBox" id="hero-illustration-d">
<feGaussianBlur stdDeviation="32" in="SourceGraphic"/>
</filter>
<linearGradient x1="0%" y1="100%" x2="46.694%" y2="42.915%" id="hero-illustration-f">
<stop stop-color="#EEF1FA" offset="0%" />
<stop stop-color="#FFF" offset="100%" />
<linearGradient x1="0%" y1="100%" x2="46.694%" y2="42.915%"
id="hero-illustration-f">
<stop stop-color="#EEF1FA" offset="0%"/>
<stop stop-color="#FFF" offset="100%"/>
</linearGradient>
<rect id="hero-illustration-e" width="800" height="450" rx="4" />
<linearGradient x1="100%" y1="-12.816%" x2="0%" y2="-12.816%" id="hero-illustration-g">
<stop stop-color="#D2DAF0" stop-opacity="0" offset="0%" />
<stop stop-color="#D2DAF0" offset="50.045%" />
<stop stop-color="#D2DAF0" stop-opacity="0" offset="100%" />
<rect id="hero-illustration-e" width="800" height="450" rx="4"/>
<linearGradient x1="100%" y1="-12.816%" x2="0%" y2="-12.816%"
id="hero-illustration-g">
<stop stop-color="#D2DAF0" stop-opacity="0" offset="0%"/>
<stop stop-color="#D2DAF0" offset="50.045%"/>
<stop stop-color="#D2DAF0" stop-opacity="0" offset="100%"/>
</linearGradient>
<linearGradient x1="116.514%" y1="-21.201%" x2="0%" y2="100%" id="hero-illustration-h">
<stop stop-color="#55EBD0" offset="0%" />
<stop stop-color="#4950F6" offset="100%" />
<linearGradient x1="116.514%" y1="-21.201%" x2="0%" y2="100%"
id="hero-illustration-h">
<stop stop-color="#55EBD0" offset="0%"/>
<stop stop-color="#4950F6" offset="100%"/>
</linearGradient>
<path id="hero-illustration-j" d="M0 0h308v288H0z" />
<filter x="-15.6%" y="-12.5%" width="139%" height="141.7%" filterUnits="objectBoundingBox" id="hero-illustration-i">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1" />
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1" result="shadowBlurOuter1" />
<feColorMatrix values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0" in="shadowBlurOuter1" />
<path id="hero-illustration-j" d="M0 0h308v288H0z"/>
<filter x="-15.6%" y="-12.5%" width="139%" height="141.7%"
filterUnits="objectBoundingBox" id="hero-illustration-i">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1"/>
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1"
result="shadowBlurOuter1"/>
<feColorMatrix
values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0"
in="shadowBlurOuter1"/>
</filter>
<circle id="hero-illustration-k" cx="16" cy="16" r="16" />
<circle id="hero-illustration-k" cx="16" cy="16" r="16"/>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="hero-illustration-m">
<stop stop-color="#C6FDF3" offset="0%" />
<stop stop-color="#C6FDF3" stop-opacity="0" offset="100%" />
<stop stop-color="#C6FDF3" offset="0%"/>
<stop stop-color="#C6FDF3" stop-opacity="0" offset="100%"/>
</linearGradient>
<linearGradient x1="2.875%" y1="89.028%" x2="99.412%" y2="6.885%" id="hero-illustration-n">
<stop stop-color="#83F0DD" offset="0%" />
<stop stop-color="#1ADAB7" offset="50.924%" />
<stop stop-color="#55EBD0" offset="100%" />
<linearGradient x1="2.875%" y1="89.028%" x2="99.412%" y2="6.885%"
id="hero-illustration-n">
<stop stop-color="#83F0DD" offset="0%"/>
<stop stop-color="#1ADAB7" offset="50.924%"/>
<stop stop-color="#55EBD0" offset="100%"/>
</linearGradient>
<linearGradient x1="50%" y1="1.569%" x2="50%" y2="97.315%" id="hero-illustration-o">
<stop stop-color="#FF97AA" offset="0%" />
<stop stop-color="#FF6381" offset="100%" />
<stop stop-color="#FF97AA" offset="0%"/>
<stop stop-color="#FF6381" offset="100%"/>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="hero-illustration-p">
<stop stop-color="#FCAC96" offset="0%" />
<stop stop-color="#FC8464" offset="100%" />
<stop stop-color="#FCAC96" offset="0%"/>
<stop stop-color="#FC8464" offset="100%"/>
</linearGradient>
<circle id="hero-illustration-r" cx="28" cy="28" r="28" />
<filter x="-85.7%" y="-64.3%" width="314.3%" height="314.3%" filterUnits="objectBoundingBox" id="hero-illustration-q">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1" />
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1" result="shadowBlurOuter1" />
<feColorMatrix values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0" in="shadowBlurOuter1" />
<circle id="hero-illustration-r" cx="28" cy="28" r="28"/>
<filter x="-85.7%" y="-64.3%" width="314.3%" height="314.3%"
filterUnits="objectBoundingBox" id="hero-illustration-q">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1"/>
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1"
result="shadowBlurOuter1"/>
<feColorMatrix
values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0"
in="shadowBlurOuter1"/>
</filter>
<circle id="hero-illustration-t" cx="36" cy="36" r="36" />
<filter x="-66.7%" y="-50%" width="266.7%" height="266.7%" filterUnits="objectBoundingBox" id="hero-illustration-s">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1" />
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1" result="shadowBlurOuter1" />
<feColorMatrix values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0" in="shadowBlurOuter1" />
<circle id="hero-illustration-t" cx="36" cy="36" r="36"/>
<filter x="-66.7%" y="-50%" width="266.7%" height="266.7%"
filterUnits="objectBoundingBox" id="hero-illustration-s">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1"/>
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1"
result="shadowBlurOuter1"/>
<feColorMatrix
values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0"
in="shadowBlurOuter1"/>
</filter>
<circle id="hero-illustration-v" cx="28" cy="28" r="28" />
<filter x="-85.7%" y="-64.3%" width="314.3%" height="314.3%" filterUnits="objectBoundingBox" id="hero-illustration-u">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1" />
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1" result="shadowBlurOuter1" />
<feColorMatrix values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0" in="shadowBlurOuter1" />
<circle id="hero-illustration-v" cx="28" cy="28" r="28"/>
<filter x="-85.7%" y="-64.3%" width="314.3%" height="314.3%"
filterUnits="objectBoundingBox" id="hero-illustration-u">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1"/>
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1"
result="shadowBlurOuter1"/>
<feColorMatrix
values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0"
in="shadowBlurOuter1"/>
</filter>
<circle id="hero-illustration-x" cx="24" cy="24" r="24" />
<filter x="-100%" y="-75%" width="350%" height="350%" filterUnits="objectBoundingBox" id="hero-illustration-w">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1" />
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1" result="shadowBlurOuter1" />
<feColorMatrix values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0" in="shadowBlurOuter1" />
<circle id="hero-illustration-x" cx="24" cy="24" r="24"/>
<filter x="-100%" y="-75%" width="350%" height="350%"
filterUnits="objectBoundingBox" id="hero-illustration-w">
<feOffset dx="12" dy="24" in="SourceAlpha" result="shadowOffsetOuter1"/>
<feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1"
result="shadowBlurOuter1"/>
<feColorMatrix
values="0 0 0 0 0.0666666667 0 0 0 0 0.062745098 0 0 0 0 0.243137255 0 0 0 0.08 0"
in="shadowBlurOuter1"/>
</filter>
</defs>
<g fill="none" fill-rule="evenodd">
<path class="anime-element stroke-animation" d="M600,300 C600,465.685425 465.685425,600 300,600 C134.314575,600 1.3749042e-14,465.685425 3.60373576e-15,300 C-6.54157051e-15,134.314575 134.314575,-1.29473326e-14 300,-2.30926389e-14 C465.685425,-3.32379452e-14 600,134.314575 600,300 Z" fill="url(#hero-illustration-a)" stroke="#4950F6" />
<path class="anime-element stroke-animation"
d="M600,300 C600,465.685425 465.685425,600 300,600 C134.314575,600 1.3749042e-14,465.685425 3.60373576e-15,300 C-6.54157051e-15,134.314575 134.314575,-1.29473326e-14 300,-2.30926389e-14 C465.685425,-3.32379452e-14 600,134.314575 600,300 Z"
fill="url(#hero-illustration-a)" stroke="#4950F6"/>
<g transform="translate(435 518)">
<circle class="anime-element fadeup-animation" fill="url(#hero-illustration-b)" cx="106" cy="32" r="32" />
<circle class="anime-element fadeup-animation" fill="url(#hero-illustration-c)" cx="12" cy="117" r="12" />
<circle class="anime-element fadeup-animation" fill="url(#hero-illustration-b)"
cx="106" cy="32" r="32"/>
<circle class="anime-element fadeup-animation" fill="url(#hero-illustration-c)"
cx="12" cy="117" r="12"/>
</g>
<g class="anime-element fadeleft-animation">
<g transform="translate(103 75)">
<path fill-opacity=".24" fill="#11103E" filter="url(#hero-illustration-d)" d="M32 410h736v64H32z" />
<use fill="url(#hero-illustration-f)" xlink:href="#hero-illustration-e" />
<path fill-opacity=".24" fill="#11103E" filter="url(#hero-illustration-d)"
d="M32 410h736v64H32z"/>
<use fill="url(#hero-illustration-f)" xlink:href="#hero-illustration-e"/>
</g>
<g transform="translate(123 87)">
<circle fill="#D2DAF0" cx="4" cy="4" r="4" />
<circle fill="#D2DAF0" cx="20" cy="4" r="4" />
<circle fill="#D2DAF0" cx="36" cy="4" r="4" />
<path fill-opacity=".56" fill="#FFF" d="M736 2h24v4h-24z" />
<path fill="url(#hero-illustration-g)" d="M27 20h706v2H27z" />
<circle fill="#D2DAF0" cx="4" cy="4" r="4"/>
<circle fill="#D2DAF0" cx="20" cy="4" r="4"/>
<circle fill="#D2DAF0" cx="36" cy="4" r="4"/>
<path fill-opacity=".56" fill="#FFF" d="M736 2h24v4h-24z"/>
<path fill="url(#hero-illustration-g)" d="M27 20h706v2H27z"/>
</g>
<g transform="translate(396 157)">
<path fill="#FFF" d="M0 0h308v144H0z" />
<path fill="#EEF1FA" d="M28 119h252v1H28zM28 94h252v1H28zM28 69h252v1H28zM28 44h252v1H28z" />
<path stroke="url(#hero-illustration-h)" stroke-width="3" d="M26 119l49.19-38.316 14.615 19.035 16.36-19.035 31.306 4.272 33.079-23.54 34.86 38.303 15.625-50.412 16.356 12.109 16.472-12.11 15.075 21.443 16.976-21.442" />
<rect fill="#D2DAF0" x="28" y="20" width="24" height="4" rx="2" />
<path fill="#FFF" d="M0 0h308v144H0z"/>
<path fill="#EEF1FA"
d="M28 119h252v1H28zM28 94h252v1H28zM28 69h252v1H28zM28 44h252v1H28z"/>
<path stroke="url(#hero-illustration-h)" stroke-width="3"
d="M26 119l49.19-38.316 14.615 19.035 16.36-19.035 31.306 4.272 33.079-23.54 34.86 38.303 15.625-50.412 16.356 12.109 16.472-12.11 15.075 21.443 16.976-21.442"/>
<rect fill="#D2DAF0" x="28" y="20" width="24" height="4" rx="2"/>
</g>
<g>
<path fill="#FFF" d="M396 333h308v144H396z" />
<path fill="#EEF1FA" d="M424 452h252v1H424zM424 427h252v1H424zM424 402h252v1H424zM424 377h252v1H424z" />
<path fill="url(#hero-illustration-o)" d="M28 24h12v96H28z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-p)" d="M52 67h12v53H52z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-o)" d="M76 24h12v96H76z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-p)" d="M100 82h12v38h-12z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-o)" d="M124 45h12v75h-12z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-p)" d="M148 67h12v53h-12z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-o)" d="M172 82h12v38h-12z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-p)" d="M196 45h12v75h-12z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-o)" d="M220 67h12v53h-12z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-p)" d="M244 82h12v38h-12z" transform="translate(396 333)" />
<path fill="url(#hero-illustration-o)" d="M268 45h12v75h-12z" transform="translate(396 333)" />
<path fill="#FFF" d="M396 333h308v144H396z"/>
<path fill="#EEF1FA"
d="M424 452h252v1H424zM424 427h252v1H424zM424 402h252v1H424zM424 377h252v1H424z"/>
<path fill="url(#hero-illustration-o)" d="M28 24h12v96H28z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-p)" d="M52 67h12v53H52z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-o)" d="M76 24h12v96H76z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-p)" d="M100 82h12v38h-12z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-o)" d="M124 45h12v75h-12z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-p)" d="M148 67h12v53h-12z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-o)" d="M172 82h12v38h-12z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-p)" d="M196 45h12v75h-12z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-o)" d="M220 67h12v53h-12z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-p)" d="M244 82h12v38h-12z"
transform="translate(396 333)"/>
<path fill="url(#hero-illustration-o)" d="M268 45h12v75h-12z"
transform="translate(396 333)"/>
</g>
</g>
<g class="anime-element fadeleft-animation">
<g transform="translate(56 157)">
<use fill="#000" filter="url(#hero-illustration-i)" xlink:href="#hero-illustration-j" />
<use fill="#FFF" xlink:href="#hero-illustration-j" />
<path fill="#EEF1FA" d="M0 191h308v1H0zM28 44h252v1H28z" />
<rect fill="#D2DAF0" x="28" y="20" width="24" height="4" rx="2" />
<rect fill="#ABABC9" x="28" y="216" width="64" height="4" rx="2" />
<rect fill="#D2DAF0" x="256" y="216" width="24" height="4" rx="2" />
<rect fill="#D2DAF0" x="64" y="20" width="24" height="4" rx="2" />
<use fill="#000" filter="url(#hero-illustration-i)"
xlink:href="#hero-illustration-j"/>
<use fill="#FFF" xlink:href="#hero-illustration-j"/>
<path fill="#EEF1FA" d="M0 191h308v1H0zM28 44h252v1H28z"/>
<rect fill="#D2DAF0" x="28" y="20" width="24" height="4" rx="2"/>
<rect fill="#ABABC9" x="28" y="216" width="64" height="4" rx="2"/>
<rect fill="#D2DAF0" x="256" y="216" width="24" height="4" rx="2"/>
<rect fill="#D2DAF0" x="64" y="20" width="24" height="4" rx="2"/>
<g transform="translate(28 232)">
<mask id="hero-illustration-l" fill="#fff">
<use xlink:href="#hero-illustration-k" />
<use xlink:href="#hero-illustration-k"/>
</mask>
<use fill="#ABABC9" xlink:href="#hero-illustration-k" />
<image mask="url(#hero-illustration-l)" x="-2" width="33" height="33" xlink:href="" />
<use fill="#ABABC9" xlink:href="#hero-illustration-k"/>
<image mask="url(#hero-illustration-l)" x="-2" width="33" height="33"
xlink:href=""/>
</g>
<path d="M308 89.82v101.063H0v-33.728l3.038-3.799 10.783-7.894 8.687-2.646h9.246l21.198 10.54 9.852 3.251 6.608-3.25 8.644-12.005 6.87-6.388 7.892-1.512 10.906 6.066 13.895 15.802 11.188 5.944h5.692l7.314-3.28 7.19-9.37 5.879-13.65 10.774-21.657 8.34-14.026 9.243-12.336 9.594-7.043 15.407-3.881 6.362 1.497 14.939 7.765 10.531 8.166 13.17 12.338 12.362 7.52 12.756 3.746 8.366-1.542 8.96-5.366 10.183-15.377L308 89.82z" fill="url(#hero-illustration-m)" />
<path d="M308 84.066v8.885c-13.215 32.373-36.292 33.308-68.007 2.699-18.456-17.814-33.74-21.583-47.058-13.978-10.675 6.097-19.593 18.713-29.342 38.963-2.594 5.388-10.386 22.73-11.136 24.336-11.298 24.181-27.067 24.181-45.624.363-12.17-13.657-21.486-13.657-29.221-.248-3.596 6.232-6.872 9.923-10.352 11.627-3.677 1.8-7.4 1.412-12.305-.82-2.416-1.098-12.51-6.8-14.82-7.981a101.498 101.498 0 0 0-4.586-2.208c-11.912-5.359-23.695-.926-35.549 13.65v-4.62c11.94-13.38 24.255-17.4 36.78-11.766 1.571.707 3.13 1.46 4.72 2.273 2.416 1.235 12.425 6.889 14.697 7.922 4.167 1.895 7.013 2.192 9.744.855 2.836-1.388 5.748-4.67 9.072-10.432 8.843-15.326 20.622-15.326 34.123-.172 17.344 22.257 30.338 22.257 40.603.287.734-1.572 8.536-18.936 11.151-24.368 9.998-20.768 19.193-33.776 30.557-40.266 14.618-8.348 31.298-4.234 50.63 14.424 32.601 31.465 54.068 28.367 65.923-9.425z" fill="url(#hero-illustration-n)" fill-rule="nonzero" />
<path
d="M308 89.82v101.063H0v-33.728l3.038-3.799 10.783-7.894 8.687-2.646h9.246l21.198 10.54 9.852 3.251 6.608-3.25 8.644-12.005 6.87-6.388 7.892-1.512 10.906 6.066 13.895 15.802 11.188 5.944h5.692l7.314-3.28 7.19-9.37 5.879-13.65 10.774-21.657 8.34-14.026 9.243-12.336 9.594-7.043 15.407-3.881 6.362 1.497 14.939 7.765 10.531 8.166 13.17 12.338 12.362 7.52 12.756 3.746 8.366-1.542 8.96-5.366 10.183-15.377L308 89.82z"
fill="url(#hero-illustration-m)"/>
<path
d="M308 84.066v8.885c-13.215 32.373-36.292 33.308-68.007 2.699-18.456-17.814-33.74-21.583-47.058-13.978-10.675 6.097-19.593 18.713-29.342 38.963-2.594 5.388-10.386 22.73-11.136 24.336-11.298 24.181-27.067 24.181-45.624.363-12.17-13.657-21.486-13.657-29.221-.248-3.596 6.232-6.872 9.923-10.352 11.627-3.677 1.8-7.4 1.412-12.305-.82-2.416-1.098-12.51-6.8-14.82-7.981a101.498 101.498 0 0 0-4.586-2.208c-11.912-5.359-23.695-.926-35.549 13.65v-4.62c11.94-13.38 24.255-17.4 36.78-11.766 1.571.707 3.13 1.46 4.72 2.273 2.416 1.235 12.425 6.889 14.697 7.922 4.167 1.895 7.013 2.192 9.744.855 2.836-1.388 5.748-4.67 9.072-10.432 8.843-15.326 20.622-15.326 34.123-.172 17.344 22.257 30.338 22.257 40.603.287.734-1.572 8.536-18.936 11.151-24.368 9.998-20.768 19.193-33.776 30.557-40.266 14.618-8.348 31.298-4.234 50.63 14.424 32.601 31.465 54.068 28.367 65.923-9.425z"
fill="url(#hero-illustration-n)" fill-rule="nonzero"/>
</g>
</g>
<g>
<g class="anime-element fadeleft-animation">
<g transform="translate(164 483)">
<use fill="#000" filter="url(#hero-illustration-q)" xlink:href="#hero-illustration-r" />
<use fill="#FFF" xlink:href="#hero-illustration-r" />
<use fill="#000" filter="url(#hero-illustration-q)"
xlink:href="#hero-illustration-r"/>
<use fill="#FFF" xlink:href="#hero-illustration-r"/>
</g>
<path d="M200 506c-.6.3-1.2.4-1.9.5.7-.4 1.2-1 1.4-1.8-.6.4-1.3.6-2.1.8-.6-.6-1.5-1-2.4-1-1.7 0-3.2 1.5-3.2 3.3 0 .3 0 .5.1.7-2.7-.1-5.2-1.4-6.8-3.4-.3.5-.4 1-.4 1.7 0 1.1.6 2.1 1.5 2.7-.5 0-1-.2-1.5-.4 0 1.6 1.1 2.9 2.6 3.2-.3.1-.6.1-.9.1-.2 0-.4 0-.6-.1.4 1.3 1.6 2.3 3.1 2.3-1.1.9-2.5 1.4-4.1 1.4h-.8c1.5.9 3.2 1.5 5 1.5 6 0 9.3-5 9.3-9.3v-.4c.7-.5 1.3-1.1 1.7-1.8z" fill="#1DA1F2" fill-rule="nonzero" />
<path
d="M200 506c-.6.3-1.2.4-1.9.5.7-.4 1.2-1 1.4-1.8-.6.4-1.3.6-2.1.8-.6-.6-1.5-1-2.4-1-1.7 0-3.2 1.5-3.2 3.3 0 .3 0 .5.1.7-2.7-.1-5.2-1.4-6.8-3.4-.3.5-.4 1-.4 1.7 0 1.1.6 2.1 1.5 2.7-.5 0-1-.2-1.5-.4 0 1.6 1.1 2.9 2.6 3.2-.3.1-.6.1-.9.1-.2 0-.4 0-.6-.1.4 1.3 1.6 2.3 3.1 2.3-1.1.9-2.5 1.4-4.1 1.4h-.8c1.5.9 3.2 1.5 5 1.5 6 0 9.3-5 9.3-9.3v-.4c.7-.5 1.3-1.1 1.7-1.8z"
fill="#1DA1F2" fill-rule="nonzero"/>
</g>
<g class="anime-element fadeleft-animation">
<g transform="translate(251 390)">
<use fill="#000" filter="url(#hero-illustration-s)" xlink:href="#hero-illustration-t" />
<use fill="#FFF" xlink:href="#hero-illustration-t" />
<use fill="#000" filter="url(#hero-illustration-s)"
xlink:href="#hero-illustration-t"/>
<use fill="#FFF" xlink:href="#hero-illustration-t"/>
</g>
<g fill-rule="nonzero">
<path d="M290.56 415.485a2.137 2.137 0 1 0-4.066 1.32l5.526 17.004a2.137 2.137 0 0 0 2.6 1.325c1.135-.327 1.826-1.532 1.464-2.646l-5.525-17.003" fill="#DFA22F" />
<path d="M281.996 418.267a2.137 2.137 0 0 0-4.065 1.321l5.526 17.003a2.137 2.137 0 0 0 2.6 1.325c1.134-.326 1.826-1.531 1.464-2.645l-5.525-17.004" fill="#3CB187" />
<path d="M297.515 429.567a2.137 2.137 0 1 0-1.32-4.065l-17.004 5.526a2.137 2.137 0 0 0-1.325 2.6c.327 1.134 1.532 1.825 2.646 1.464l17.003-5.525" fill="#CE1E5B" />
<path fill="#392538" d="M282.735 434.37l4.064-1.321-1.32-4.065-4.065 1.321 1.321 4.064" />
<path d="M291.298 431.587l4.064-1.32-1.32-4.066-4.065 1.321 1.321 4.065" fill="#BB242A" />
<path d="M294.733 421.004a2.137 2.137 0 0 0-1.321-4.066l-17.003 5.527a2.136 2.136 0 0 0-1.325 2.6c.326 1.134 1.531 1.825 2.645 1.463l17.004-5.524" fill="#72C5CD" />
<path d="M279.952 425.806l4.065-1.32c-.5-1.537-.964-2.965-1.32-4.065l-4.066 1.322 1.321 4.063" fill="#248C73" />
<path d="M288.515 423.024l4.065-1.32-1.321-4.066-4.065 1.321 1.321 4.065" fill="#62803A" />
<path
d="M290.56 415.485a2.137 2.137 0 1 0-4.066 1.32l5.526 17.004a2.137 2.137 0 0 0 2.6 1.325c1.135-.327 1.826-1.532 1.464-2.646l-5.525-17.003"
fill="#DFA22F"/>
<path
d="M281.996 418.267a2.137 2.137 0 0 0-4.065 1.321l5.526 17.003a2.137 2.137 0 0 0 2.6 1.325c1.134-.326 1.826-1.531 1.464-2.645l-5.525-17.004"
fill="#3CB187"/>
<path
d="M297.515 429.567a2.137 2.137 0 1 0-1.32-4.065l-17.004 5.526a2.137 2.137 0 0 0-1.325 2.6c.327 1.134 1.532 1.825 2.646 1.464l17.003-5.525"
fill="#CE1E5B"/>
<path fill="#392538"
d="M282.735 434.37l4.064-1.321-1.32-4.065-4.065 1.321 1.321 4.064"/>
<path d="M291.298 431.587l4.064-1.32-1.32-4.066-4.065 1.321 1.321 4.065"
fill="#BB242A"/>
<path
d="M294.733 421.004a2.137 2.137 0 0 0-1.321-4.066l-17.003 5.527a2.136 2.136 0 0 0-1.325 2.6c.326 1.134 1.531 1.825 2.645 1.463l17.004-5.524"
fill="#72C5CD"/>
<path
d="M279.952 425.806l4.065-1.32c-.5-1.537-.964-2.965-1.32-4.065l-4.066 1.322 1.321 4.063"
fill="#248C73"/>
<path
d="M288.515 423.024l4.065-1.32-1.321-4.066-4.065 1.321 1.321 4.065"
fill="#62803A"/>
</g>
</g>
<g class="anime-element fadeleft-animation">
<g transform="translate(28 221)">
<use fill="#000" filter="url(#hero-illustration-u)" xlink:href="#hero-illustration-v" />
<use fill="#FFF" xlink:href="#hero-illustration-v" />
<use fill="#000" filter="url(#hero-illustration-u)"
xlink:href="#hero-illustration-v"/>
<use fill="#FFF" xlink:href="#hero-illustration-v"/>
</g>
<text font-family="AppleColorEmoji, Apple Color Emoji" font-size="19" fill="#11103E" transform="translate(28 221)">
<text font-family="AppleColorEmoji, Apple Color Emoji" font-size="19"
fill="#11103E" transform="translate(28 221)">
<tspan x="17" y="36">
🚀
</tspan>
@ -274,10 +352,12 @@
</g>
<g class="anime-element fadeleft-animation">
<g transform="translate(325 257)">
<use fill="#000" filter="url(#hero-illustration-w)" xlink:href="#hero-illustration-x" />
<use fill="#FFF" xlink:href="#hero-illustration-x" />
<use fill="#000" filter="url(#hero-illustration-w)"
xlink:href="#hero-illustration-x"/>
<use fill="#FFF" xlink:href="#hero-illustration-x"/>
</g>
<text font-family="AppleColorEmoji, Apple Color Emoji" font-size="16" fill="#11103E" transform="translate(325 257)">
<text font-family="AppleColorEmoji, Apple Color Emoji" font-size="16"
fill="#11103E" transform="translate(325 257)">
<tspan x="13" y="31">
👋
</tspan>
@ -311,8 +391,9 @@
<div class="feature-icon" style="background: #ffd2da">
<svg width="88" height="88" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="nonzero">
<path d="M43 47v7a13 13 0 0 0 13-13v-7c-7.18 0-13 5.82-13 13z" fill="#FF6381" />
<path d="M32 41v4a9 9 0 0 0 9 9v-4a9 9 0 0 0-9-9z" fill="#FF97AA" />
<path d="M43 47v7a13 13 0 0 0 13-13v-7c-7.18 0-13 5.82-13 13z"
fill="#FF6381"/>
<path d="M32 41v4a9 9 0 0 0 9 9v-4a9 9 0 0 0-9-9z" fill="#FF97AA"/>
</g>
</svg>
</div>
@ -331,8 +412,12 @@
<div class="feature-icon" style="background: #ffd8cd">
<svg width="88" height="88" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="nonzero">
<path d="M54 56h-9a2 2 0 0 1-2-2V43a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2zm-9-13v10h9V43h-9z" fill="#FCAC96" />
<path d="M41 50h-7V34h14v5h2v-5a2 2 0 0 0-2-2H34a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h7v-4z" fill="#FC8464" />
<path
d="M54 56h-9a2 2 0 0 1-2-2V43a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2zm-9-13v10h9V43h-9z"
fill="#FCAC96"/>
<path
d="M41 50h-7V34h14v5h2v-5a2 2 0 0 0-2-2H34a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h7v-4z"
fill="#FC8464"/>
</g>
</svg>
</div>
@ -351,9 +436,12 @@
<div class="feature-icon" style="background: #c6fdf3">
<svg width="88" height="88" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="nonzero">
<circle fill="#1ADAB7" cx="38" cy="50" r="5" />
<path d="M53 42h2v-8a1 1 0 0 0-1-1h-8v2h5.586l-8.293 8.293a1 1 0 1 0 1.414 1.414L53 36.414V42z" fill="#1ADAB7" />
<path fill="#83F0DD" d="M34 41.414l3-3 3 3L41.414 40l-3-3 3-3L40 32.586l-3 3-3-3L32.586 34l3 3-3 3zM55.414 48L54 46.586l-3 3-3-3L46.586 48l3 3-3 3L48 55.414l3-3 3 3L55.414 54l-3-3z" />
<circle fill="#1ADAB7" cx="38" cy="50" r="5"/>
<path
d="M53 42h2v-8a1 1 0 0 0-1-1h-8v2h5.586l-8.293 8.293a1 1 0 1 0 1.414 1.414L53 36.414V42z"
fill="#1ADAB7"/>
<path fill="#83F0DD"
d="M34 41.414l3-3 3 3L41.414 40l-3-3 3-3L40 32.586l-3 3-3-3L32.586 34l3 3-3 3zM55.414 48L54 46.586l-3 3-3-3L46.586 48l3 3-3 3L48 55.414l3-3 3 3L55.414 54l-3-3z"/>
</g>
</svg>
</div>
@ -372,8 +460,11 @@
<div class="feature-icon" style="background: #e0e1fe">
<svg width="88" height="88" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="nonzero">
<path d="M41 42h-7a1 1 0 0 1-1-1v-7a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1zM41 55h-7a1 1 0 0 1-1-1v-7a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1z" fill="#4950F6" />
<path fill="#8D92FA" d="M45 34h10v2H45zM45 39h10v2H45zM45 47h10v2H45zM45 52h10v2H45z" />
<path
d="M41 42h-7a1 1 0 0 1-1-1v-7a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1zM41 55h-7a1 1 0 0 1-1-1v-7a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1z"
fill="#4950F6"/>
<path fill="#8D92FA"
d="M45 34h10v2H45zM45 39h10v2H45zM45 47h10v2H45zM45 52h10v2H45z"/>
</g>
</svg>
</div>
@ -396,19 +487,24 @@
<svg width="280" height="280" viewBox="0 0 280 280" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient x1="100%" y1="0%" x2="0%" y2="100%" id="testimonials-shape-1">
<stop stop-color="#261FB6" offset="0%" />
<stop stop-color="#4950F6" offset="100%" />
<stop stop-color="#261FB6" offset="0%"/>
<stop stop-color="#4950F6" offset="100%"/>
</linearGradient>
</defs>
<circle cx="140" cy="685" r="140" transform="translate(0 -545)" fill="url(#testimonials-shape-1)" fill-rule="evenodd" />
<circle cx="140" cy="685" r="140" transform="translate(0 -545)" fill="url(#testimonials-shape-1)"
fill-rule="evenodd"/>
</svg>
</div>
<div class="testimonials-shape testimonials-shape-2">
<svg width="125" height="107" viewBox="0 0 125 107" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<circle fill="#C6FDF3" cx="48" cy="59" r="48" />
<path d="M58.536 39.713c0-6.884 1.72-14.007 5.163-21.368 3.443-7.36 8.167-13.458 14.173-18.292l11.645 7.91c-3.589 4.98-6.262 10.016-8.02 15.106S78.86 33.598 78.86 39.384v13.623H58.536V39.713z" fill="#55EBD0" />
<path d="M93.252 39.713c0-6.884 1.722-14.007 5.164-21.368 3.442-7.36 8.166-13.458 14.172-18.292l11.646 7.91c-3.589 4.98-6.262 10.016-8.02 15.106s-2.637 10.529-2.637 16.315v13.623H93.252V39.713z" fill="#1ADAB7" />
<circle fill="#C6FDF3" cx="48" cy="59" r="48"/>
<path
d="M58.536 39.713c0-6.884 1.72-14.007 5.163-21.368 3.443-7.36 8.167-13.458 14.173-18.292l11.645 7.91c-3.589 4.98-6.262 10.016-8.02 15.106S78.86 33.598 78.86 39.384v13.623H58.536V39.713z"
fill="#55EBD0"/>
<path
d="M93.252 39.713c0-6.884 1.722-14.007 5.164-21.368 3.442-7.36 8.166-13.458 14.172-18.292l11.646 7.91c-3.589 4.98-6.262 10.016-8.02 15.106s-2.637 10.529-2.637 16.315v13.623H93.252V39.713z"
fill="#1ADAB7"/>
</g>
</svg>
</div>
@ -416,11 +512,12 @@
<svg width="48" height="48" viewBox="0 0 48 48" mlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient x1="93.05%" y1="19.767%" x2="15.034%" y2="85.765%" id="testimonials-shape-3">
<stop stop-color="#FF3058" offset="0%" />
<stop stop-color="#FF6381" offset="100%" />
<stop stop-color="#FF3058" offset="0%"/>
<stop stop-color="#FF6381" offset="100%"/>
</linearGradient>
</defs>
<circle cx="24" cy="434" r="24" transform="translate(0 -410)" fill="url(#testimonials-shape-3)" fill-rule="evenodd" />
<circle cx="24" cy="434" r="24" transform="translate(0 -410)" fill="url(#testimonials-shape-3)"
fill-rule="evenodd"/>
</svg>
</div>
<div class="container">
@ -433,7 +530,7 @@
<div class="testimonial-inner">
<div class="testimonial-main">
<div class="testimonial-header">
<img class="mb-16" src="static/picture/pic1.jpg" alt="Testimonial" />
<img class="mb-16" src="static/picture/pic1.jpg" alt="Testimonial"/>
</div>
<div class="testimonial-body">
<p class="mb-0">
@ -453,7 +550,7 @@
<div class="testimonial-inner">
<div class="testimonial-main">
<div class="testimonial-header">
<img class="mb-16" src="static/picture/pic2.jpg" alt="Testimonial" />
<img class="mb-16" src="static/picture/pic2.jpg" alt="Testimonial"/>
</div>
<div class="testimonial-body">
<p class="mb-0">
@ -473,7 +570,7 @@
<div class="testimonial-inner">
<div class="testimonial-main">
<div class="testimonial-header">
<img class="mb-16" src="static/picture/pic3.jpg" alt="Testimonial" />
<img class="mb-16" src="static/picture/pic3.jpg" alt="Testimonial"/>
</div>
<div class="testimonial-body">
<p class="mb-0">
@ -519,20 +616,22 @@
<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg">
<title>Dual Net</title>
<defs>
<linearGradient x1="114.674%" y1="39.507%" x2="-52.998%" y2="39.507%" id="logo-footer-a">
<stop stop-color="#8D92FA" offset="0%" />
<stop stop-color="#8D92FA" stop-opacity="0" offset="100%" />
<linearGradient x1="114.674%" y1="39.507%" x2="-52.998%" y2="39.507%"
id="logo-footer-a">
<stop stop-color="#8D92FA" offset="0%"/>
<stop stop-color="#8D92FA" stop-opacity="0" offset="100%"/>
</linearGradient>
<linearGradient x1="93.05%" y1="19.767%" x2="15.034%" y2="85.765%" id="logo-footer-b">
<stop stop-color="#FF3058" offset="0%" />
<stop stop-color="#FF6381" offset="100%" />
<stop stop-color="#FF3058" offset="0%"/>
<stop stop-color="#FF6381" offset="100%"/>
</linearGradient>
<linearGradient x1="32.716%" y1="-20.176%" x2="32.716%" y2="148.747%" id="logo-footer-c">
<stop stop-color="#FF97AA" offset="0%" />
<stop stop-color="#FF97AA" stop-opacity="0" offset="100%" />
<linearGradient x1="32.716%" y1="-20.176%" x2="32.716%" y2="148.747%"
id="logo-footer-c">
<stop stop-color="#FF97AA" offset="0%"/>
<stop stop-color="#FF97AA" stop-opacity="0" offset="100%"/>
</linearGradient>
</defs>
<img src="static/picture/logo.png" alt="Dual Net" width="120px" />
<img src="static/picture/logo.png" alt="Dual Net" width="120px"/>
</svg>
</a>
@ -541,38 +640,42 @@
<a style="margin-left: 5px" href="#">服务条款</a><a style="margin-left: 5px" href="#">联系我们</a>
</ul>
<div class="footer-links">
<a href="https://beian.miit.gov.cn/" target="_blank">粤ICP备2021166927号</a> &nbsp;&nbsp;| 本站已运行&nbsp;[&nbsp;<SPAN id=span_dt_dt style="color: #9EA0A1;"></SPAN>
<SCRIPT language=javascript>function show_date_time(){
<a href="https://beian.miit.gov.cn/" target="_blank">粤ICP备2021166927号</a> &nbsp;&nbsp;| 本站已运行&nbsp;[&nbsp;<SPAN
id=span_dt_dt style="color: #9EA0A1;"></SPAN>
<SCRIPT language=javascript>function show_date_time() {
window.setTimeout("show_date_time()", 1000);
BirthDay=new Date("5/21/2021 00:00:00");
today=new Date();
timeold=(today.getTime()-BirthDay.getTime());
sectimeold=timeold/1000
secondsold=Math.floor(sectimeold);
msPerDay=24*60*60*1000
e_daysold=timeold/msPerDay
daysold=Math.floor(e_daysold);
e_hrsold=(e_daysold-daysold)*24;
hrsold=Math.floor(e_hrsold);
e_minsold=(e_hrsold-hrsold)*60;
minsold=Math.floor((e_hrsold-hrsold)*60);
seconds=Math.floor((e_minsold-minsold)*60);
span_dt_dt.innerHTML='<font style=color:#F4F8F4>'+daysold+'</font> 天 <font style=color:#F4F8F4>'+hrsold+'</font> 时 <font style=color:#F4F8F4>'+minsold+'</font> 分 <font style=color:#F4F8F4>'+seconds+'</font> 秒';
BirthDay = new Date("5/21/2021 00:00:00");
today = new Date();
timeold = (today.getTime() - BirthDay.getTime());
sectimeold = timeold / 1000
secondsold = Math.floor(sectimeold);
msPerDay = 24 * 60 * 60 * 1000
e_daysold = timeold / msPerDay
daysold = Math.floor(e_daysold);
e_hrsold = (e_daysold - daysold) * 24;
hrsold = Math.floor(e_hrsold);
e_minsold = (e_hrsold - hrsold) * 60;
minsold = Math.floor((e_hrsold - hrsold) * 60);
seconds = Math.floor((e_minsold - minsold) * 60);
span_dt_dt.innerHTML = '<font style=color:#F4F8F4>' + daysold + '</font> 天 <font style=color:#F4F8F4>' + hrsold + '</font> 时 <font style=color:#F4F8F4>' + minsold + '</font> 分 <font style=color:#F4F8F4>' + seconds + '</font> 秒';
}
show_date_time();</script>
&nbsp;] </div>
&nbsp;]
</div>
</li>
</ul>
<ul class="footer-social-links list-reset">
</ul>
<div class="footer-copyright">&copy; 2021-<?php echo date("Y"); ?> 木韩内网穿透&trade; . 保留一切权利 ·&nbsp;<br>
<div class="footer-copyright">&copy; 2021-<?php echo date("Y"); ?> 木韩内网穿透&trade; . 保留一切权利 ·&nbsp;<br>
木韩网络科技有限公司 版权所有 . 本站由木韩网络和旗下莱云共同运营.
</div>
</div>
</div>
</footer>
</div>
<script data-cfasync="false" src="static/js/email-decode.min.js"></script><script src="static/js/main.min.js"></script>
<script data-cfasync="false" src="static/js/email-decode.min.js"></script>
<script src="static/js/main.min.js"></script>
</body>
</html>