Files
yakpanel-core/YakPanel/templates/default/login.html

1385 lines
100 KiB
HTML
Raw Normal View History

2026-04-07 02:04:22 +05:30
<!doctype html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{{g.title}}</title>
<link rel="shortcut icon" href="/static/vite/favicon.ico" type="image/x-icon" />
<style type="text/css">
* {
margin: 0;
padding: 0;
}
html,
body {
width: 100%;
height: 100%;
}
body {
line-height: 1.4;
background-color: var(--page-bg);
font-family: "微软雅黑", Arial, Helvetica, sans-serif;
font-size: 12px;
color: var(--login-body-color);
}
input {
background: none;
box-sizing: border-box;
-webkit-appearance: none;
}
button {
outline: none;
background: none;
box-sizing: border-box;
}
::-webkit-scrollbar {
width: 10px;
height: 1px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
box-shadow: inset 0 0 5px rgb(0 0 0 / 20%);
background: #999;
}
::-webkit-scrollbar-track {
box-shadow: inset 0 0 5px rgb(0 0 0 / 20%);
border-radius: 10px;
background: #ededed;
}
.hide {
display: none !important;
}
.bt_link {
text-decoration: none;
color: #20a53a;
}
.main {
position: relative;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
height: 100%;
}
.login-bg {
width: 100%;
height: 100%;
background-position: center center;
background-repeat: no-repeat;
background-size: cover;
position: absolute;
top: 0;
left: 0;
}
.login-bg.active {
background-image: url('{{ g['panel_theme']['login']['bg_image'] }}');
opacity: {{ g['panel_theme']['login']['bg_image_opacity'] / 100 }};
}
.login {
position: relative;
width: 360px;
height: 270px;
padding: 80px 40px 90px;
background: var(--login-bg);
border-radius: var(--login-box-radius);
box-shadow: var(--login-box-shadow);
}
.login.code {
height: 345px;
}
.entrance {
position: absolute;
top: 5px;
right: 5px;
}
.entrance .bg_img {
width: 60px;
height: 60px;
background-image: var(--login-qr-code-img);
background-size: 120px 120px;
background-repeat: no-repeat;
background-position: 0 0;
cursor: pointer;
}
.entrance .bg_img:hover {
background-position: -60px 0;
}
.entrance .bg_img.pc {
background-position: 0 -60px;
}
.entrance .bg_img.pc:hover {
background-position: -60px -60px;
}
.entrance .tips {
position: absolute;
display: flex;
align-items: center;
top: 15px;
right: 55px;
max-width: 380px;
padding: 8px 10px;
background-color: var(--login-tips-bg);
border-radius: 4px;
text-align: center;
white-space: nowrap;
}
.entrance .tips::before {
content: "";
position: absolute;
top: 8px;
right: -11px;
width: 0;
height: 0;
margin-left: -6px;
border: 6px solid var(--login-tips-bg);
border-color: transparent transparent transparent var(--login-tips-bg);
}
.entrance .tips .icon {
display: inline-flex;
}
.entrance .tips .text {
display: inline-flex;
white-space: nowrap;
}
.icon {
width: 16px;
height: 16px;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.icon.scan {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAgCAYAAACYTcH3AAAAAXNSR0IArs4c6QAAAdFJREFUWEdjZIACuSUW1kyMTKUMDAyODAwMfDBxLHTDg+hjjXjkGUSnOvBwC/7czPCf0QGPugcMDAy7HkQfS4epYQQxoA45gs8CJLkHD6KPKeJTK7/MKovxP8NUIs2Dew7sGIWlVhMYGBjyoZqvMjD+f43LIKZ/DL33Yo5vIWSR/BKrYkam/z441SGF2h/W/zJPwo4/hThmmeV+WJD++8+s/Sjm8DVCllEqr7jUMvQ/A+MqsDn//jk+iD1xAMMxD6KPgcVoDRQWWzgwMDHtH3UMekiPhgyutDdUQsa6n+H//4L//xnuPIw5pkrrnAQyX3aBlTIzK8MdEJuJmUn9XsSRW/BsrLDMMpKB8f/xB5EnQMU0XQA4qhgYGEBlDIimS5lCrM8Gl2MUl1i5/Wf6X0ms62mi7j/T6wfRR8MYFZZaXWFgYNCmiSWkGZoFcsx8BgaGBNL0UV316/+MDBGDK81Q3Y8UGAgPGbmlNsb/WP++ADVyKDCPJK1yS2y1WNn+/Lobdhxc+MFaevUMDAwNDAwMVx9EH9MhyUQyFSuvslT5+5vxNrhtBW3QjTauQKExVGptRIN8tA082jtAKgaISsAD34kbTN3bQdXxB0XlYBgSAQBVv1HZQYwH1wAAAABJRU5ErkJggg==");
background-size: 14px;
}
.icon.safe {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADAElEQVRYR8VWS1LbQBTs51Sogo3NCTKcAC+xN5gTxCyDSGFOgHOCJCeIOQGmgpIl5gSYjcTSOQGTE8TeOJSp6KVmRvJHGlljXAWzorDmdc/rfh/CKx96ZXw4ERDf9xoolfbBXAFQ1aSJZn8DAzAP48cMQDQEcV8ehXdFD8wlEIOegNEEQYGlDv8GION/CoDeZT/BEIQeouhSfrzv28hkCAi/XgX4GiBhLmigHgh9MEnpBYNlr9L3iQUYDQDNGTGWAB2m71sI1PoAqXRfgqhTBFiUYk2IuQ2iE4DvpBcqYtOTS0B6gZM/iggkvwu/zisQQFV6oUV3V7jsdysQsDN9PrS5Kfya8tCuPA62CyRYn4D4uSfw+DiUp4OkNA0B0H5aWlsVWLVyzYAxHW5BuJNe0Jx54AUIzIFXQHwoj8LeixFYAEd0Kr377nzW1pZAXFQr85ouBp+mvQIL+NSEz/WA8Os9MPZBOEg3pqKXL0qQLW97I0qVi/hRa4LpGqx7+5SEK7jJwEqNKFsuwt9rAaWLhIQZE9rtuWlPyeTaCevKue8xGW+nNV8goaK7gl9UK9jY+gPgZr40TYjUEX79C4DPiKID2widktD3sm639Yt4tN8C+Cq9QMVfNoySVPMneRx2cgOqZSBnxmcedVVT0/CbjXA2A6qNRqUHW7pcu6Elq0bWUrQjP9wnS4z+zDpyhV+TYCrjabyTV/uuZFT/wNutBxCPpBfGS84SCeKSMT4AutILTl3BrHJd1bp6GWG7pPk74VV9AMKuq9Gs4LPS/SWPA7PMpk4+Ae0FGgBUBrgtvfB8lUyIqfF4hBJX09onsZauXfGCquZ4Gcx9PP09LPKE0XzzGkQNgEcANZbtlYV7nw64sdkzi6puxR1MxueZJmWazRkY7XiNv8Fk3CoiXEggSZVpQNQx2cAQ4C7esJHlH50B1DLA6tVKssVxnCefMwFdHeaVbQVgvDF/dLpVdjpFr17aCV2NFk/Ilukm3J3fflxj5DaiVQKs++1KEqwLZrv/HyI/ujC8s0y6AAAAAElFTkSuQmCC");
}
.tips .text {
margin-left: 4px;
color: #20a53a;
}
.account .form_title {
height: 40px;
margin-bottom: 25px;
padding: 0 25px;
cursor: pointer;
overflow: hidden;
text-align: center;
font-size: 26px;
color: var(--login-text-color);
}
.account .form_item {
position: relative;
margin-bottom: 20px;
padding: 5px 0;
}
.account .error_tips {
position: relative;
top: -14px;
color: red;
}
.form_input {
width: 100%;
height: 42px;
padding: 5px 10px;
border: var(--login-input-border);
border-radius: var(--login-input-radius);
box-shadow: 0 3px 5px -4px rgb(0 0 0 / 40%) inset,
-1px 0 3px -2px rgb(0 0 0 / 10%) inset;
z-index: 1;
color: var(--login-input-color);
}
.form_input.validform_error {
border: 1px solid #e53451;
box-shadow: 0 0 2px #ea5d74;
}
.validform_checktip {
position: absolute;
top: 14px;
right: 10px;
height: 24px;
padding: 0 6px;
line-height: 24px;
overflow: hidden;
z-index: 1;
text-align: right;
font-size: 12px;
}
.validform_checktip.validform_wrong {
background: #e53451;
border-radius: 3px;
color: #fff;
}
.validform_checktip.validform_right {
padding: 0 10px;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAIaSURBVEiJvZY9i1NBFIafvYrEwg12fjTWcbbZYGEzjdNoBGs/wdrapFhMkRAk6bfeHxBshAWFkSzTLLgmohlT+xey+LHKaizmZPcy5t6YgHuawMyc5z3n3DNnsjKZTJhn2qoCsAasy9IAGDrjD+b5rmQJCLQOVIASMAb6sl0GisAI2AYaWWIzBbRV14EtYB9oA31n/OfozBURqgGrwGNn/G6ugLbqDNACngBNoOOM/zUzxWOfU0AVeAZsAhvO+J/T/dPR+RahJNec8Z/ywFOTAJ5rq14CXVl++lcGUpY3i8BnZHMV2ANuTMuVyEaBUPPmsnAA8W0CW8IMAoRu2Qc6y8JT1hFWPS1QAdrzPmiWaasuaKteaKvOC6MtTBJJpcRxjy8KvwjsAL8lcoRV0lYVEsINHcd9vgC8B3wE7k4rIKwxsJYQrn8/cjyrrYpbOIZfksg/APec8YfRkT6wnsSOYnVgR1t1LgfeA95nwI8sIQyucrTeItT0VSyirboskQ+A+zmNUQYGCTAEijJbAHDGfwFuAofAa23VagreI6T/IAsurCIwTGQKjuIsnPFfgVvADxEpSeTv8uCp6EfO+IPpN9gGajK4YpEK8F0yfQs8zIMLoybMo4vWIIzcauzgjP8G3AbuAI/+4TJWhdWAkxp2EukuYZ535eAy8C6wmX544su0Ib972qqlH5z0/sk+mRHg/z36GWJL/W35AyvRFdMiDyNOAAAAAElFTkSuQmCC");
background-repeat: no-repeat;
background-position: right center;
background-size: 16px;
}
.form_item.check_code {
display: flex;
align-items: center;
}
.form_item.check_code .form_input {
flex: 1;
width: auto;
}
.form_item.check_code .validform_checktip {
right: 127px;
}
.form_item.check_code .check_img {
width: 100px;
height: 40px;
margin-left: 16px;
border: 1px solid #ccc;
cursor: pointer;
}
.login_btn {
width: 100%;
height: 44px;
background: linear-gradient(#20a53a, #189d32);
border: 1px solid #20a53a;
border-radius: var(--login-btn-radius);
cursor: pointer;
text-align: center;
font-size: 16px;
color: #fff;
box-shadow: inset 0 1px 2px #30ad42;
text-shadow: #00851a 0 -1px 0;
}
.login_btn:hover {
background: linear-gradient(#10952a, #088d22);
border: 1px solid #10952a;
}
.account .forget_pwd {
position: absolute;
right: 40px;
bottom: 20px;
color: #20a53a;
}
.static_cdn {
position: absolute;
left: 0;
bottom: 0;
height: 40px;
opacity: 0.8;
}
.static_cdn .cont {
display: flex;
margin-left: 40px;
}
.static_cdn .name {
height: 22px;
padding: 0 5px;
line-height: 22px;
border: 1px solid #ddd;
background-color: #eee;
color: #777;
font-size: 12px;
}
.account select {
height: 24px;
line-height: 22px;
margin-left: -1px;
padding-left: 5px;
border: var(--login-select-border);
background-color: var(--login-select-bg);
color: #777;
font-size: 12px;
border-radius: var(--login-select-radius);
}
.scan_code {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
}
.scan_code .scan_title {
margin-bottom: 20px;
font-size: 23px;
color: var(--login-scan-title-color);
text-align: center;
}
.scan_code .qrcode {
width: 150px;
height: 150px;
}
.scan_code .scan_tip {
margin-top: 15px;
text-align: center;
}
.scan_tip .link {
font-size: 0;
}
.scan_tip .link a,
.scan_tip .link span {
font-size: 13px;
}
.scan_tip .desc {
display: flex;
align-items: center;
justify-content: center;
margin-top: 10px;
}
.scan_tip .desc .icon {
width: 25px;
height: 25px;
background-size: 23px;
}
.scan_tip .desc .text {
margin-left: 10px;
font-size: 18px;
font-weight: 600;
color: var(--login-scan-text-color);
}
.verification_view {
padding: 30px 40px;
}
.verification_view .v_title {
height: 40px;
margin-bottom: 15px;
overflow: hidden;
text-align: center;
font-size: 21px;
color: var(--login-text-color);
}
.verification_view .v_input {
margin-bottom: 15px;
}
.verification_view .v_input input {
width: 100%;
height: 40px;
padding: 4px 10px;
line-height: 30px;
outline: none;
border-radius: var(--login-input-radius);
box-sizing: border-box;
border: var(--login-input-border);
box-shadow: 0 3px 5px -4px rgb(0 0 0 / 40%) inset,
-1px 0 3px -2px rgb(0 0 0 / 10%) inset;
z-index: 1;
color: var(--login-input-color);
}
.verification_view .v_btn button {
width: 100%;
height: 40px;
border-radius: var(--login-btn-radius);
border: 1px solid #20a53a;
background: linear-gradient(#20a53a, #189d32);
text-shadow: #00851a 0 -1px 0;
box-shadow: inset 0 1px 2px #30ad42;
cursor: pointer;
text-align: center;
font-size: 15px;
color: #fff;
}
.verification_view .v_tips {
margin-top: 13px;
font-size: 13px;
color: #777;
}
.layui-layer-msg {
position: fixed;
min-width: 180px;
margin: 0;
padding: 0;
border-radius: 2px;
background-color: #fff;
border: 1px solid #d3d4d3;
box-shadow: none;
}
.layui-layer-msg .layui-layer-content {
position: relative;
padding: 20px 20px 20px 55px;
line-height: 24px;
word-break: break-all;
overflow: hidden;
overflow-x: hidden;
overflow-y: auto;
font-size: 14px;
text-align: left;
}
.layui-layer-msg .layui-layer-ico {
position: absolute;
top: 16px;
left: 15px;
display: inline-block;
width: 30px;
height: 30px;
vertical-align: top;
background-image: url("data:image/png;base64,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
background-repeat: no-repeat;
}
.layui-layer-msg .layui-layer-ico1 {
background-position: -30px 0;
}
.layui-layer-msg .layui-layer-ico2 {
background-position: -60px 0;
}
.layui-layer-msg .layui-layer-ico16 {
background-image: url("data:image/gif;base64,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");
}
.layui-layer-shade {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.layui-layer {
position: fixed;
border-radius: 2px;
background-color: var(--layui-layer-bg);
box-shadow: var(--layui-layer-shadow);
}
.layui-layer-content {
position: relative;
height: 100%;
overflow: auto;
}
.layui-layer-setwin {
position: absolute;
top: 15px;
right: 15px;
font-size: 0;
line-height: initial;
}
.layui-layer-setwin .layui-layer-close {
position: absolute;
top: -28px;
right: -28px;
display: inline-block;
vertical-align: top;
width: 30px;
height: 30px;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABZ0RVh0Q3JlYXRpb24gVGltZQAwMy8xNC8xNxpI5/gAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAEN0lEQVRIiaWXTUhjVxTH/+diAmNMDGpCSCBNtWFEIQ0MFAYGZlNt6aKbUhpxYeAZxY0MlGy7K67LLIraYA26sd2UblrUEYp0oIKIgviBaaqNlYRIJgkulDm3i+Q9XvJenjoeCLxz7j3nd9595957QlJKqEJEsBJmfg7gGYAgAB+AtwAKRPQ3gE0i2rQMoBcppfZrMR5l5llmzstbhJn/ZeaXzDxw5wRMgEFmnrkNZpHEN8zsaRXfdG2llB9LKX8iIrfeXigUsLe3h1KphGq1CiKCw+FAV1cXIpEIurq6muP8ByAmhPjjVjAzjxHRj3rb7u4u1tbWkM/nLVfJ7/djeHgY/f39zQl8LoT4tSWYmT8hot9UvVKpYHl5Gdls1hLYLOFwGCMjI2hvb9fDn+vfXAMz8/sA9ojIAQC5XA6Li4sol8v3gqrS3d0NRVG05ZdS/kNEHxLRGwAQurlTKrRcLj8ICgDFYhGpVApXV1cAACJ6D8CUOi7q2TwhoqRqXFpaehBUD19ZWdGbZpj5Az1Yy2RnZwenp6eGIH6/3xJit9vhdrsN9oODAxwdHelNUxqYiBTVur6+bnCORqOYnp5GIpGAzWYzjPt8PiSTSSSTSdjtdsP46uqq9qyyBDMPqcZsNotCoWBwPDk5QblcRl9fH+LxeAPc6/UikUjA6XQik8ng+vra4H92doaLiwtV7WTmjwRqZy8A4Pj42OAE1LbV7OysAe71ejE5OQmHw4FMJoN0Om3qbxL7mQDwWNXM3laVYrHYAFcUpQG6sLCAm5ublv5NsR8LIvKpWrVabemowufn51EulxEKhe4MNYntE60mthIiarg+hbh3iJqflFL76h0dHZaTPR6PVkjZbBaVSgWhUAiKophWu16aYl8IAIf6wFbQiYkJrXpTqRTm5uYa4GZbqUXsQwFA6xrC4bCpk9vtboCq37RQKDTAx8bGWi59U+xNQUSvVC0YDBruVAAIBAJwOp04OTkxFJIKVwuura3N1N/n02r4jRDiLwIAZv6TiJ4CwPb2dvP5CqB2UFjdxzabDY8ePTI94+PxuHZHSym/E0K8UNfla3VSNBpFIBAwON/WBNzc3JhCe3t7mxuD74H6WS2EeC2lfF1/RiwWa7jE31VcLhdisZimSym/FUIcauC6TEkpr4FaBSqKAqfT+c5Qt9uN8fFxuFwuFVpE/W0BY+vzBRH9rOqlUgnpdBrn5+f3goZCIYyOjjYkLqX8VAjxuym4Djc0e1tbW9jY2MDl5aUl0OPxYGhoCJFIpMEupfxKCNFQsabtLTN/BuAXImrYG7lcDvv7+6hUKsjn8xBCoKenB52dnRgcHNRvGRVYIqIviWjNMuMm+AAzv3xAQz8jpQzeGWiSwFNmTjPz1R14JWb+QUr55La41v/SjEkModY4+AAMENFbKeUhgByATSHEK8sAOvkfU5us3WE/neAAAAAASUVORK5CYII=");
background-repeat: no-repeat;
cursor: pointer;
transition: all 0.4s ease-in-out;
}
.layui-layer-setwin .layui-layer-close:hover {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABZ0RVh0Q3JlYXRpb24gVGltZQAwMy8xNC8xNxpI5/gAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAEXUlEQVRIiaWXf2iVZRTHv8957t3d3ruSja0mA82NLTMl7gZzjJH0A0RLCKIiskDTzFhmhFrLqKDAMtHMGvvRVn8lSFFS2i/s19rWmC2DVlKbiRtzc2Ngce1u95ynP+7e1/e97/2x6fnvnOf5ns95fr3P8yrMw0RkFYB6AIsAlABgABeUUmcAdCqlOueTL6MZYx5g4QEWZpPFWDjOwqdYeN3VAGtZuDsbLEMRJ1h4abr8Kg10pxjZQ4o87dOjo+CeXtDkFGR4GABAlRUwxUUI1K1EIJzvySNGBMB2TfqtrGAWbiVFmzzArh7EWzsQ/6k37Qwpy0LgztsR2LwBwfKy5AJe0aRfSAtm4UZS9KrjT0witvtlxL//IS3QZ8EchDY+guATj4GCQTd8m3vkDpiFbwXwrT29M4NDiDVsh5w9N3eoywL1dQgd2AttWTY4TorKlFLnAIBcfffaUJ6YQOzxbVcMBYB4ZxemdzTCxOMAAFIUANBqtxMAGGPWk6IaOxjb8TxkZOSKobbNfPMdplva3aHVLHyHAxYjzsLPfPFVyk1ES2/MCFGWBVpY4otPt7ZDxsbdodccMCmqtKOxg2/7xMG71iD/o8Ow2puhQiF/UZUVCB//BPmfH4WaXVPbTCyGWFPL5b6KqgCAWHiXHeT+XyFnzvoS88/9kAsTCNTWIK/poAdO5WUItzeDiosQ7+2DiUZ9+vixL2H+i9muYuENBGCt06G7xycCABk9j+jGLT44lZch/H4bVGEBuLcPlxqeTqk3//4D+W3AHbqHANzgAP4aSikEABkc8sCttiYPNLqlASYWS6vn30+73QoiRdc6yScn0gqT4bo6MmcoAJipKbdbQJ5WlozilKb1/DUASIxcdJyiosydlyyGNbuR+GS/M3KrrSnlbnebKihwu1ME4G8ncfmSzND32hLQ3j5EN231TLvV1uQ7Ssl6l/1JAI7ZXqCuNrVoYYkXOrumyWued2g/QOTTq1AIurrKHfqYSNF+29ORW0ClpT6hXnZT4pz29Po2kgMfG0egOgKVm+vTB+5eA5XrLIXRpDsSl4LwRVJ0DQDMfHocl3Y2+kddXgYZTH/cVCgEtWABZHzc2xDMQfjoEejFixKFGvlFk47Y8/KM02/taugVy32JM0GBxKfRBwWQ8/CDDnTWngO897EzahkbR/S+hyATmc91NgusrIHVcgiYfRCIkR816XrAex8/KiZxjun665D3zptZj1cm01UR5O3b44YaAE/Z7Q5Ykz4C4A3HX74M1ocfQFdF5g0N3n8vwh3NUIWes7tbkz5pO3N67M18fQLTze+CvR96P/C2Vch5cit00t0tRg5o0p4bJOXzloVfBPASqaQv6vAIuKsbPPDH5QR5eaAVN0PX1kAXFiYDDSl6Vin1esaKk+DrWPjUVTzou40xqb9IcyxgMwsPsmT9gzHGGGHh08aY9dnyppzqDEXsQuLhUAyglBSJGBkFcB7AZ5r0vrnm+h+4JqLbk005nAAAAABJRU5ErkJggg==");
transform: rotate(180deg);
}
.login-images img {
height: 85px;
}
.login-images {
width: 440px;
display: flex;
margin-bottom: 25px;
justify-content: center;
}
.login_lang {
display: flex;
align-items: center;
justify-content: center;
position: absolute;
left: 40px;
bottom: 20px;
}
.login_lang .lang_label {
margin-right: 8px;
}
.login_qrcode{
padding: 5px;
background-color: #fff;
}
input:focus,
select:focus {
border-color: var(--login-input-focus-border-color);
background-color: var(--login-input-focus-bg);
outline: none;
}
/* 主题变量 */
:root {
--page-bg: #444444;
--login-bg: #fff;
--layui-layer-bg: var(--login-bg);
--layui-layer-shadow: 1px 1px 50px rgb(0 0 0 / 30%);
--login-text-color: #444;
--login-body-color: #333;
--login-box-radius: 4px;
--login-box-shadow: none;
--login-input-border: 1px solid #d1d1d1;
--login-input-radius: 3px;
--login-input-color: #000000;
--login-input-focus-border-color: #000000;
--login-input-focus-bg: var(--login-bg);
--login-btn-radius: 3px;
--login-select-radius: none;
--login-select-border: 1px solid #ddd;
--login-select-bg: var(--login-bg);
--login-qr-code-img: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRTU3RDI1MzNENTQxMUU4QTNCN0M5NTNCQ0UxMDEzMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRTU3RDI1NDNENTQxMUU4QTNCN0M5NTNCQ0UxMDEzMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkVFNTdEMjUxM0Q1NDExRThBM0I3Qzk1M0JDRTEwMTMzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkVFNTdEMjUyM0Q1NDExRThBM0I3Qzk1M0JDRTEwMTMzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+qlaxTgAAN4hJREFUeNrsnQmcHNV9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
--login-scan-title-color: var(--login-text-color);
--login-scan-text-color: #555;
--login-tips-bg: #dff0d8;
}
/* 暗黑模式 */
[data-theme="dark"] {
--page-bg: #18191c;
--login-bg: linear-gradient(#202020, #18191c);
--layui-layer-bg: #202020;
--layui-layer-shadow: 0 0 3px 1px rgba(255, 255, 255, 0.4);
--login-text-color: #c5c5c5;
--login-body-color: #b3b3b3;
--login-box-radius: 16px;
--login-box-shadow: 0 0 3px 1px rgba(255, 255, 255, 0.4);
--login-input-border: 1px solid #434343;
--login-input-radius: 9px;
--login-input-color: var(--login-text-color);
--login-input-focus-border-color: var(--login-text-color);
--login-input-focus-bg: var(--page-bg);
--login-btn-radius: 9px;
--login-select-radius: 6px;
--login-select-border: var(--login-input-border);
--login-select-bg: #202020;
--login-qr-code-img: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGi2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuOWNjYzRkZSwgMjAyMi8wMy8xNC0xMToyNjoxOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI1LTA4LTI2VDE1OjAxOjQzKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNS0wOC0yNlQxNTowNzo1NiswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNS0wOC0yNlQxNTowNzo1NiswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OGUwNWYwYi1jOWY4LTg0NDYtYTQyNi0zNDNjMmRiZDk0NjIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RUU1N0QyNTQzRDU0MTFFOEEzQjdDOTUzQkNFMTAxMzMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFRTU3RDI1NDNENTQxMUU4QTNCN0M5NTNCQ0UxMDEzMyIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRTU3RDI1MTNENTQxMUU4QTNCN0M5NTNCQ0UxMDEzMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFRTU3RDI1MjNENTQxMUU4QTNCN0M5NTNCQ0UxMDEzMyIvPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpmYjJiZGYxMC03MjJiLWM0NDMtODg0MS01ZWJiN2EyZmQ4OGYiIHN0RXZ0OndoZW49IjIwMjUtMDgtMjZUMTU6MDY6MDMrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMy4zIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NThlMDVmMGItYzlmOC04NDQ2LWE0MjYtMzQzYzJkYmQ5NDYyIiBzdEV2dDp3aGVuPSIyMDI1LTA4LTI2VDE1OjA3OjU2KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjMuMyAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+NzTe7AAAOXtJREFUeJztnXmcXGWZ73/Pe2rt7ixs6SRADIRFNOkUyxXHZSZ3GEMQnVHWWVSuUUeFERNBEFTAqKCiBDOjKOhVRoeZYfQqVxyY/oyjd2bcQdookX1LgBAwCemllnPe97l/nHOqqrtrrzpV51Q933xOurqrquucrm/9znvelf75n//5n0488cQrAKQBDHlbAoAFgABoADaAAoAcgCyAGe923rvPAWDKNqxfv54hDAzj4+MKQAxAHEDivvvuu0m8EjqNuvzyy8/fsWPHp+GJBiAJV65hACPetsD7OoySfCnvsXG4oqqyDePj49TVIxHCBIlXQhAoANi0adO5u3bt+ghcsVLeVi7XgrJtBCKXUB2CeCUEhPJvbNy48ZxEIvEelOTy5Sk/Gy4AsBAil1Ad8jYA4pXQWVT5N+vWrTt/6dKlf4GSXGnMPxuOQOQSajPr/RavhE6h5v5gbGzs7OXLl78Jrlx+hanIJbSFeCV0gnmBBQCrV68+c9myZRswuxgvcgltIV4J7RKrdseaNWtO2759e3L37t0/hysGe4+3mnwNp+y2GR8fp2abptM3H/Msx2kx3KbtKDRrMxSG4KCg9pl/oAI+MX3lo0+UPyD9pWNOhcLnOUanQiELdpvtQw+BYAA1xbtmLn7k+GafHiav6LrDHWa2EA2nfAgAFNQ9BHqfvnLnz8rvVJ8+4kwwvmyMOdz7UaSOjYgKfMXTyWoPqBpYADA2Nvaa7du3x3fv3v2rssdXLJXVoS25OE4HcwyJSP3pFUCMFCwcDLd0MAtOUAKEYVYACOnu72CLeFXqbGFJq78iNF4xW55T0SuhERYCPM8bLvWFQ0SPLVHrzrqSjI2NnTo6OvoKzK57GML8Jukgi/EOGKX2p6hsJeZ/iAgMgun5Pra+tVUiDIlXUToFzoUBqrT/xU62EaXmvjd0Vlu7du3Jo6Ojp2B+03S35IqyWJXfAEa0j6oDH4oQeBV1om1QCzRcDF+7du3aJUuWnARXFJFL6AjildAMTdUbZDKZNUuWLMlA5BI6iHglNErTFZ2ZTGa1yCV0GvFKaIRWWmZELiEQxCuhHi0FFhBKuRjulCWO9zXYjaBb3M9Wjsvp4nGZXjaEh9CrXrUsB0/vWs1bpmY/rHpkMpnVExMT2LNnz0Sb+9FuJ0CGxguk8Ru48yq1HMR1cbsjEAyWs4XjYAXch8rgeXLwa7jHlUBQLUMEBqCgsQQxZDgO1as2qBB5BVJkyFL7EXRXAbebiMWah9iYFDjg+CKyKaYOkPs3arbTbpOvBYLhtHHMULu/qq3AAkIjlyaNXwHYBGAPggwsBQ2blXUAf2qG6SqzACsBBKnzPQA2A3gWbimi8zFCACww5WBZ+806fRB9neOUBgXyag0RCq8IoJjaC8afAHgOwZaBbGJaTIbeawy/g4kXBfZKBJBFvyTgPQCeRoWOzR1mgaXV2YbMte361HZgAaGQi+DOUPlM7h0PH2hzHxpi5JpVkxip2HGvc7hF6RwIe3MbH54EMBnky6VvPtZCDtMckhqfEHgFMBjAM+aync+3uQ91iV97ZB4ajlEBl3gAAFxgxrN8+a69Qb9S4hMrpsGgThxVx0oiIah7sOAPSQiYkY+sIliUQpAlOQBe737FyW4IDFi7jYKF4W68VqOEwCtCh07sdTGwQF16LYAA7opXzIgzdaYU19E/TlBnxCae152ygT8rebfo5kALCl
--login-scan-title-color: var(--login-text-color);
--login-scan-text-color: #b3b3b3;
--login-tips-bg: none;
}
</style>
<script>
var ie_version = (function () {
var userAgent = navigator.userAgent,
isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1,
isEdge = userAgent.indexOf('Edge') > -1 && !isLessIE11,
isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1;
if (isLessIE11) {
var IEReg = new RegExp('MSIE (\\d+\\.\\d+);');
IEReg.test(userAgent);
var IEVersionNum = parseFloat(RegExp['$1']);
if (IEVersionNum === 7) {
// IE7
return 7;
} else if (IEVersionNum === 8) {
// IE8
return 8;
} else if (IEVersionNum === 9) {
// IE9
return 9;
} else if (IEVersionNum === 10) {
// IE10
return 10;
} else {
return 6;
}
} else if (isEdge) {
// edge
return 'edge';
} else if (isIE11) {
// IE11
return 11;
} else {
// 不是ie浏览器
return -1;
}
})();
if (ie_version != -1 && ie_version < 9) {
window.location.href = '/tips';
}
</script>
</head>
<body>
<div class="main">
<div class="login-bg {% if g['panel_theme']['login']['is_show_bg'] %}active{% endif %}"></div>
<div class="login{% if session['code'] %} code{% endif %}">
<div class="account">
<div class="last_token" style="display: block" data="{{data['last_login_token']}}"></div>
<div class="public_key" style="display: block" data="{{data['public_key']}}"></div>
<form class="login_form" onsubmit="return false;">
<div class="form_title">{{g.title}}</div>
<div class="form_item">
<input type="text" class="form_input" id="username" data-i18n="Login.index_1" placeholder="" />
<div class="validform_checktip"></div>
</div>
<div class="form_item">
<input type="password" class="form_input" id="password" data-i18n="Login.index_2" placeholder="" />
<div class="validform_checktip"></div>
</div>
<div class="error_tips"></div>
<div class="form_item check_code{% if not session['code'] %} hide{% endif %}">
<input type="text" class="form_input" id="code" data-i18n="Login.index_8" placeholder="" />
<div class="validform_checktip"></div>
<img class="check_img" data-i18n="Login.index_9" title="" src="/code" onClick="this.src = this.src.split('?')[0] + '?' + new Date().getTime()" />
</div>
<!-- 登录按钮 -->
<button class="login_btn" data-i18n="Login.index_3"></button>
<!-- 语言切换 -->
<div class="login_lang">
<div class="lang_label" data-i18n="Login.index_5"></div>
<select id="lang_select"></select>
</div>
<!-- 忘记密码 -->
<a class="forget_pwd" href="https://www.yakpanel.com/forum/d/16-how-to-reset-password-for-yakpanel-linux-6-x" target="_blank" data-i18n="Login.index_4"></a>
{% if data['hosts'] != '[]' %}
<div class="static_cdn">
<div class="cont">
<div class="name" data-i18n="Login.index_20"></div>
<select id="static_cdn">
<option value="localhost" data-i18n="Login.index_21"></option>
</select>
</div>
</div>
{% endif %}
</form>
</div>
<div class="scan_code hide">
<div class="scan_title" data-i18n="Login.index_12"></div>
<div class="login_qrcode">
<div class="qrcode" id="qrcode"></div>
</div>
<div class="scan_tip">
<div class="link">
<span data-i18n="Login.index_13"></span>
<a href="https://www.yakpanel.com/forum/d/3527-yakpanel-mobile" target="_blank" class="bt_link" data-i18n="Login.index_14"></a>
</div>
<div class="desc">
<div class="icon scan"></div>
<div class="text" data-i18n="Login.index_15"></div>
</div>
</div>
</div>
<div class="entrance">
<div class="bg_img"></div>
<div class="tips">
<div class="icon scan"></div>
<div class="text" data-i18n="Login.index_10"></div>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="/static/js/md5.js"></script>
<script type="text/javascript" src="/static/js/qrcode.min.js"></script>
<script type="text/javascript" src="/static/js/jsencrypt.min.js"></script>
<script src="/static/js/i18next.min.js"></script>
<script>
var lang = '{{data.login_lang}}';
var langData = JSON.parse(atob('{{data.login_translations}}'));
console.log(langData);
for (var key in langData) {
langData[key] = {
translation: langData[key],
};
}
i18next.init(
{
lng: lang,
resources: langData,
},
function () {
updateContent();
}
);
// 切换语言
function changeLanguage(lang) {
i18next.changeLanguage(lang, function (err, t) {
updateContent();
});
}
// 更新带有 data-i18n 属性的元素内容
function updateContent() {
document.querySelectorAll('[data-i18n]').forEach(function (element) {
const key = element.getAttribute('data-i18n');
switch (element.tagName.toLocaleLowerCase()) {
case 'input':
element.setAttribute('placeholder', i18next.t(key));
break;
case 'img':
element.setAttribute('title', i18next.t(key));
break;
default:
element.innerHTML = i18next.t(key);
break;
}
});
}
// 左右清空空格
if (typeof String.prototype.trim === 'undefined') {
String.prototype.trim = function () {
return String(this).replace(/^\s+|\s+$/g, '');
};
}
window.onload = function () {
run();
};
function rsa_encrypt(text) {
var publicKey = document.querySelector('.public_key').attributes.data.value;
if (publicKey.length < 10) return text;
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
return encrypt.encrypt(text);
}
/**
* 加载完js后运行
*/
function run() {
// 请求
var request = new Request();
// 时间
var timer = null;
// 二维码
var qrcode = null;
// 弹框
var popup = new Popup();
// 登录框
var loginBox = document.querySelector('.login');
// 登录按钮
var loginBtn = document.querySelector('.login_btn');
// 用户名input框
var usernameInput = document.querySelector('#username');
// 密码input框
var passwordInput = document.querySelector('#password');
// 验证码input框
var codeInput = document.querySelector('#code');
// 静态cdn选择框框
var staticCdnSelect = document.querySelector('#static_cdn');
// 错误提示框
var errorTipsBox = document.querySelector('.error_tips');
// 验证码
var checkCodeBox = document.querySelector('.check_code');
// 验证码图片
var checkImg = document.querySelector('.check_img');
// 切换二维码
var entrance = document.querySelector('.entrance').querySelector('.bg_img');
/**
* 显示验证码
*/
function show_check_img() {
checkCodeBox.classList.remove('hide');
checkImg.click();
}
/**
* 判断是否为空
*/
function is_empty(val) {
return val === '' || val === undefined || val === null;
}
/**
* 单独验证
*/
function dom_validation(dom, tips, key) {
var val = dom.value;
var checktip = dom.parentNode.querySelector('.validform_checktip');
if (!checktip) return;
if (is_empty(val)) {
dom.classList.add('validform_error');
checktip.classList.add('validform_wrong');
checktip.classList.remove('validform_right');
checktip.innerText = tips;
checktip.setAttribute('data-i18n', key);
} else {
dom.classList.remove('validform_error');
checktip.classList.remove('validform_wrong');
checktip.classList.add('validform_right');
checktip.innerText = '';
checktip.removeAttribute('data-i18n');
}
}
/**
* 表单验证
*/
function form_validation(callback) {
var username = usernameInput.value.trim();
var password = passwordInput.value.trim();
if (is_empty(username) || is_empty(password)) {
popup.msg(i18next.t('Login.index_7'));
}
if (is_empty(username)) {
dom_validation(usernameInput, i18next.t('Login.index_6'), 'Login.index_6');
usernameInput.focus();
return;
}
if (is_empty(password)) {
dom_validation(passwordInput, i18next.t('Login.index_2'), 'Login.index_2');
passwordInput.focus();
return;
}
var code = codeInput.value.trim();
var isHide = checkCodeBox.classList.contains('hide');
if (!isHide && is_empty(code)) {
popup.msg(i18next.t('Login.index_23'));
dom_validation(codeInput, i18next.t('Login.index_8'), 'Login.index_8');
codeInput.focus();
return;
}
var last_token = document.querySelector('.last_token').attributes.data.value;
var data = {
username: rsa_encrypt(md5(md5(username + last_token))),
password: rsa_encrypt(md5(md5(password) + '' + '_capnis.com')),
code: code,
};
if (staticCdnSelect) {
var index = staticCdnSelect.selectedIndex;
data['cdn_url'] = staticCdnSelect.options[index].value;
}
if (callback) callback(data);
}
/**
* 设置每秒请求
*/
function set_control_time() {
timer = setInterval(function () {
request.post('/public?name=app&fun=is_scan_ok', {}, function (res) {
if (res.status) {
popup.msg(i18next.t('Login.index_24'), { time: 0, icon: 1 });
clear_control_time();
login_admin(res.msg);
}
});
}, 2000);
}
/**
* 清除设置请求
*/
function clear_control_time() {
if (timer) clearInterval(timer);
}
/**
* 登录
*/
function login_admin(key) {
request.post(
'/public?name=app&fun=set_login',
{
secret_key: key,
},
function (res) {
if (res.status) {
popup.msg(
i18next.t('Login.index_25'),
{
icon: 16,
time: 800,
shade: [0.4, '#fff'],
},
function () {
window.location.href = '/';
}
);
} else {
popup.msg(res.msg, { icon: 2 });
}
}
);
}
/**
* 生成验证码
*/
function generate_qrcode() {
if (qrcode) qrcode.clear();
request.post('/public?name=app&fun=login_qrcode', {}, function (res) {
var text = res.status ? res.msg : 'https://www.yakpanel.com/app.html';
if (qrcode) {
qrcode.makeCode(text);
} else {
qrcode = new QRCode('qrcode', {
width: 150,
height: 150,
colorLight: '#fefefe',
colorDark: '#333',
text: text,
});
}
});
}
// 用户名校验
usernameInput.onblur = function () {
dom_validation(this, i18next.t('Login.index_6'), 'Login.index_6');
};
// 密码校验
passwordInput.onblur = function () {
dom_validation(this, i18next.t('Login.index_2'), 'Login.index_2');
};
// 验证码校验
codeInput.onblur = function () {
dom_validation(this, i18next.t('Login.index_8'), 'Login.index_8');
};
// 登录
loginBtn.onclick = function () {
form_validation(function (data) {
popup.msg(i18next.t('Login.index_22'), {
time: 0,
icon: 16,
shade: [0.3, '#333'],
});
request.post('/login', data, function (res) {
popup.remove_msg();
if (res == '1') {
popup.open({
content:
'\
<div class="verification_view">\
<div class="v_title">' +
i18next.t('Login.index_16') +
'</div>\
<div class="v_input">\
<input type="text" class="v_code" placeholder="' +
i18next.t('Login.index_8') +
'" />\
</div>\
<div class="v_btn">\
<button id="auth_verif_btn">' +
i18next.t('Login.index_3') +
'</button>\
</div>\
<div class="v_tips">' +
i18next.t('Login.index_17') +
'<br><a class="bt_link" href="https://www.yakpanel.com/forum/d/357-how-to-use-google-authenticator-in-the-yakpanel" target="_blank">' +
i18next.t('Login.index_18') +
'</a>\
</div>\
</div>\
',
callback: function () {
var btn = document.querySelector('#auth_verif_btn');
var codeInput = document.querySelector('.v_code');
codeInput.onkeydown = function (e) {
if (e.keyCode == 13) btn.click();
};
btn.onclick = function () {
var code = codeInput.value.trim();
if (is_empty(code)) {
popup.msg(i18next.t('Login.index_19'));
return;
}
data['vcode'] = code;
popup.msg(i18next.t('Login.index_22'), {
icon: 16,
shade: [0.3, '#333'],
});
request.post('/login', data, function (rdata) {
popup.remove_msg();
if (!rdata.status) {
popup.msg(rdata.msg, { icon: 2 });
return false;
}
popup.msg(
rdata.msg,
{
icon: 16,
time: 800,
shade: [0.3, '#000'],
},
function () {
window.location.href = '/';
}
);
});
};
},
});
return;
}
var status = res.status;
if (!status) {
popup.msg(res.msg);
codeInput.value = '';
passwordInput.value = '';
errorTipsBox.innerHTML = res.msg;
loginBox.classList.add('code');
show_check_img();
return;
}
popup.msg(res.msg, { time: 0, icon: 16, shade: [0.3, '#333'] });
setTimeout(function () {
window.location.href = '/';
}, 1000);
});
});
};
// 切换登录方式
entrance.onclick = function () {
var tips = this.nextSibling.nextSibling;
var icon = tips.querySelector('.icon');
var text = tips.querySelector('.text');
var scanCode = document.querySelector('.scan_code');
var account = document.querySelector('.account');
if (this.classList.contains('pc')) {
this.classList.remove('pc');
icon.classList.add('scan');
icon.classList.remove('safe');
text.innerText = i18next.t('Login.index_10');
account.classList.remove('hide');
scanCode.classList.add('hide');
clear_control_time();
} else {
this.classList.add('pc');
icon.classList.add('safe');
icon.classList.remove('scan');
text.innerText = i18next.t('Login.index_11');
account.classList.add('hide');
scanCode.classList.remove('hide');
generate_qrcode();
set_control_time();
}
};
window.onresize = function () {
popup.set_msg_center();
popup.set_open_center();
};
if ("{{data['app_login']}}" == 'True') {
entrance.click();
}
// 获取语言列表
function getLangList() {
request.post('/userLang?action=get_language', {}, function (res) {
var langSelect = document.querySelector('#lang_select');
var langList = res.message.languages;
var lang = res.message.default;
for (var i = 0; i < langList.length; i++) {
var option = document.createElement('option');
option.value = langList[i].name;
option.innerText = langList[i].title;
if (lang == langList[i].name) {
option.selected = true;
}
langSelect.appendChild(option);
}
});
}
getLangList();
var langSelect = document.querySelector('#lang_select');
langSelect.onchange = function () {
var lang = this.value;
popup.msg(i18next.t('Login.index_22'), {
icon: 16,
shade: [0.3, '#333'],
});
request.post('/userLang?action=set_language', { name: lang }, function (res) {
popup.remove_msg();
if (res.status === 0) {
// popup.msg(res.message.result, { icon: 1 });
changeLanguage(lang);
}
});
};
}
/**
* 请求
*/
function Request() {
this.xhr = new XMLHttpRequest();
}
Request.prototype = {
post: function (url, data, callback) {
var option = {
method: 'POST',
url: url,
callback: callback,
};
var form = new FormData();
for (var key in data) {
if (data[key] !== '' && data[key] !== undefined && data[key] !== null) {
form.append(key, data[key]);
}
}
option.data = form;
this.http(option);
},
http: function (option) {
var xhr = this.xhr;
var toUrl = window.location.protocol + '//' + window.location.host + option.url;
var method = option.method || 'GET';
// 打开连接
xhr.open(method, toUrl, true);
// 发送请求
if (method == 'GET') {
xhr.send();
} else if (method == 'POST') {
xhr.send(option.data);
}
// 请求后的回调接口
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
var res = xhr.responseText;
res = res ? JSON.parse(res) : '';
if (option.callback) option.callback(res);
}
};
},
};
/**
* 弹框
*/
function Popup() {
this.zIndex = 200000;
}
Popup.prototype = {
/**
* 弹框
*/
open: function (option) {
var _this = this;
option = option || {};
this.set_open_option(option);
this.add_overlay(option);
var container = document.createElement('div');
container.classList.add('layui-layer');
var content = document.createElement('div');
content.classList.add('layui-layer-content');
var setwin = document.createElement('div');
setwin.classList.add('layui-layer-setwin');
var close = document.createElement('a');
close.classList.add('layui-layer-close');
if (option.area[0]) container.style.width = option.area[0];
if (option.area[1]) container.style.height = option.area[1];
content.innerHTML = option.content;
close.onclick = function () {
_this.remove_open();
};
container.style['z-index'] = this.zIndex;
this.zIndex++;
setwin.appendChild(close);
container.appendChild(content);
container.appendChild(setwin);
document.documentElement.appendChild(container);
this.set_open_center('layui-layer');
if (option.callback) option.callback();
},
/**
* 提示框
*/
msg: function (msg, option, callback) {
var _this = this;
option = option || {};
this.remove_msg();
this.add_overlay(option);
this.set_msg_option(option);
var container = document.createElement('div');
container.className = 'layui-layer-msg';
container.style['z-index'] = 200000;
var box = document.createElement('div');
box.className = 'layui-layer-content';
var icon = document.createElement('i');
icon.className = 'layui-layer-ico layui-layer-ico' + option.icon;
box.appendChild(icon);
box.innerHTML += msg;
container.style['z-index'] = this.zIndex;
this.zIndex++;
container.appendChild(box);
document.documentElement.appendChild(container);
this.set_msg_center();
if (option.time !== 0) {
setTimeout(function () {
_this.remove_msg();
if (callback) callback();
}, option.time);
}
},
/**
* 添加遮罩层
*/
add_overlay: function (option) {
if (option.hasOwnProperty('shade')) {
var shade = option.shade;
var overlay = document.createElement('div');
overlay.className = 'layui-layer-shade';
overlay.style.opacity = shade[0];
overlay.style['background-color'] = shade[1];
overlay.style['z-index'] = this.zIndex;
this.zIndex++;
document.documentElement.appendChild(overlay);
}
},
/**
* 弹框配置项
*/
set_open_option: function (option) {
var defaultOption = {
area: ['390px', '280px'],
shade: [0.3, '#000'],
content: '',
};
this.set_option(option, defaultOption);
},
/**
* msg配置项
*/
set_msg_option: function (option) {
var defaultOption = {
icon: 2,
time: 2000,
};
this.set_option(option, defaultOption);
},
/**
* 设置默认配置项
*/
set_option: function (option, defaultOption) {
for (var key in defaultOption) {
if (option[key] === undefined) {
option[key] = defaultOption[key];
}
}
},
/**
* 提示框设置居中
*/
set_msg_center: function () {
this.set_center('layui-layer-msg');
},
/**
* 弹框设置居中
*/
set_open_center: function () {
this.set_center('layui-layer');
},
/**
* 设置居中
*/
set_open_center: function () {
this.set_center('layui-layer');
},
/**
* 居中
*/
set_center: function (_class) {
var dom = document.querySelector('.' + _class);
if (!dom) return;
var bodyWidth = document.documentElement.clientWidth;
var bodyHeight = document.documentElement.clientHeight;
var domWidth = dom.clientWidth;
var domHeight = dom.clientHeight;
dom.style.left = (bodyWidth - domWidth) / 2 + 'px';
dom.style.top = (bodyHeight - domHeight) / 2 + 'px';
},
/**
* 删除提示框
*/
remove_msg: function () {
this.remove('layui-layer-msg');
},
/**
* 删除弹框
*/
remove_open: function () {
this.remove('layui-layer');
},
/**
* 删除
*/
remove: function (_class) {
var dom = document.querySelector('.' + _class);
if (!dom) return;
var overlay = dom.previousElementSibling;
if (overlay.classList.contains('layui-layer-shade')) {
document.documentElement.removeChild(overlay);
this.zIndex--;
}
document.documentElement.removeChild(dom);
this.zIndex--;
},
};
// 获取当前主题模式
const themMode = JSON.parse(localStorage.getItem('ThemeStore'));
const isDark = themMode && themMode.theme === 'dark';
document.documentElement.setAttribute('data-theme', isDark ? 'dark' : '');
</script>
</body>
</html>