原始提交
This commit is contained in:
		
							
								
								
									
										86
									
								
								assets/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								assets/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
<!--
 | 
			
		||||
  ~ Copyright (C) 2022. Gardel <sunxinao@hotmail.com> and contributors
 | 
			
		||||
  ~
 | 
			
		||||
  ~ This program is free software: you can redistribute it and/or modify
 | 
			
		||||
  ~ it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
  ~ the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
  ~ (at your option) any later version.
 | 
			
		||||
  ~
 | 
			
		||||
  ~ This program is distributed in the hope that it will be useful,
 | 
			
		||||
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
  ~ GNU Affero General Public License for more details.
 | 
			
		||||
  ~
 | 
			
		||||
  ~ You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
  -->
 | 
			
		||||
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
  <meta charset="utf-8">
 | 
			
		||||
  <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
  <title>注册</title>
 | 
			
		||||
  <link rel="stylesheet" href="https://cdn.bootcss.com/normalize/8.0.0/normalize.min.css">
 | 
			
		||||
  <!-- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700"> -->
 | 
			
		||||
  <link href="https://cdn.bootcss.com/material-components-web/5.1.0/material-components-web.min.css" rel="stylesheet">
 | 
			
		||||
  <script src="https://cdn.bootcss.com/material-components-web/5.1.0/material-components-web.min.js"></script>
 | 
			
		||||
  <link rel="stylesheet" href="login.css">
 | 
			
		||||
</head>
 | 
			
		||||
<body >
 | 
			
		||||
  <noscript>You need to enable JavaScript to run this app.</noscript>
 | 
			
		||||
  <section class="header">
 | 
			
		||||
    <h1>简陋注册页</h1>
 | 
			
		||||
  </section>
 | 
			
		||||
 | 
			
		||||
  <form id="reg-form" action="#">
 | 
			
		||||
    <div class="mdc-text-field username">
 | 
			
		||||
      <input type="email" class="mdc-text-field__input" id="username-input" name="username" required>
 | 
			
		||||
      <label class="mdc-floating-label" for="username-input">邮箱</label>
 | 
			
		||||
      <div class="mdc-line-ripple"></div>
 | 
			
		||||
    </div>
 | 
			
		||||
	<div class="mdc-text-field profileName">
 | 
			
		||||
	  <input type="text" class="mdc-text-field__input" id="profileName-input" name="profileName" required minlength="2">
 | 
			
		||||
	  <label class="mdc-floating-label" for="profileName-input">角色名</label>
 | 
			
		||||
	  <div class="mdc-line-ripple"></div>
 | 
			
		||||
	</div>
 | 
			
		||||
    <div class="mdc-text-field-helper-line profileName-helper">
 | 
			
		||||
      <div class="mdc-text-field-helper-text" aria-hidden="true">字母,数字或下划线</div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="mdc-text-field password">
 | 
			
		||||
      <input type="password" class="mdc-text-field__input" id="password-input" name="password" required minlength="6">
 | 
			
		||||
      <label class="mdc-floating-label" for="password-input">密码</label>
 | 
			
		||||
      <div class="mdc-line-ripple"></div>
 | 
			
		||||
    </div>
 | 
			
		||||
	<div class="mdc-text-field-helper-line password-helper">
 | 
			
		||||
	  <div class="mdc-text-field-helper-text" aria-hidden="true">警告: 暂无重置密码接口,请妥善保管密码</div>
 | 
			
		||||
	</div>
 | 
			
		||||
    <div class="button-container">
 | 
			
		||||
      <button class="mdc-button mdc-button--raised login">
 | 
			
		||||
        <div class="mdc-button__ripple"></div>
 | 
			
		||||
        <span class="mdc-button__label">
 | 
			
		||||
          已有账号登录
 | 
			
		||||
        </span>
 | 
			
		||||
      </button>
 | 
			
		||||
      <button type="submit" class="mdc-button mdc-button--raised next">
 | 
			
		||||
        <div class="mdc-button__ripple"></div>
 | 
			
		||||
        <span class="mdc-button__label">
 | 
			
		||||
          下一步
 | 
			
		||||
        </span>
 | 
			
		||||
      </button>
 | 
			
		||||
    </div>
 | 
			
		||||
  </form>
 | 
			
		||||
  <div class="mdc-snackbar">
 | 
			
		||||
    <div class="mdc-snackbar__surface">
 | 
			
		||||
      <div class="mdc-snackbar__label"
 | 
			
		||||
           role="status"
 | 
			
		||||
           aria-live="polite">
 | 
			
		||||
        注册失败
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <script src="https://cdn.bootcss.com/jquery/3.5.0/jquery.min.js"></script>
 | 
			
		||||
  <script src="login.js" async></script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										51
									
								
								assets/login.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								assets/login.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2022. Gardel <sunxinao@hotmail.com> and contributors
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
html, body {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
  font-family: 'Roboto';
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  padding-top: 0.1px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.header {
 | 
			
		||||
  text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.username,
 | 
			
		||||
.profileName,
 | 
			
		||||
.password,
 | 
			
		||||
.profileName-helper,
 | 
			
		||||
.password-helper {
 | 
			
		||||
  display: block;
 | 
			
		||||
  width: 300px;
 | 
			
		||||
  margin: 20px auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button-container {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: flex-end;
 | 
			
		||||
  width: 300px;
 | 
			
		||||
  margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button-container button {
 | 
			
		||||
  margin: 3px;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										129
									
								
								assets/login.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								assets/login.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,129 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2022. Gardel <sunxinao@hotmail.com> and contributors
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const MDCSnackbar = mdc.snackbar.MDCSnackbar;
 | 
			
		||||
const MDCTextField = mdc.textField.MDCTextField;
 | 
			
		||||
const MDCRipple = mdc.ripple.MDCRipple;
 | 
			
		||||
 | 
			
		||||
const snackbar = new MDCSnackbar(document.querySelector(".mdc-snackbar"));
 | 
			
		||||
const username = new MDCTextField(document.querySelector(".username"));
 | 
			
		||||
const password = new MDCTextField(document.querySelector(".password"));
 | 
			
		||||
const profileName = new MDCTextField(document.querySelector(".profileName"));
 | 
			
		||||
 | 
			
		||||
new MDCRipple(document.querySelector(".next"));
 | 
			
		||||
 | 
			
		||||
snackbar.close();
 | 
			
		||||
 | 
			
		||||
var login = false;
 | 
			
		||||
 | 
			
		||||
$(".login").click(function (btn) {
 | 
			
		||||
    login = true;
 | 
			
		||||
    $(".profileName").hide();
 | 
			
		||||
    $("#profileName-input").removeAttr("required");
 | 
			
		||||
    $(".next").children(".mdc-button__label").text("登录");
 | 
			
		||||
    $(this).hide();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$("#reg-form").submit(function (e) {
 | 
			
		||||
    if (!login) {
 | 
			
		||||
        $.ajax({
 | 
			
		||||
            url: "/authserver/register",
 | 
			
		||||
            type: "POST",
 | 
			
		||||
            dataType: "JSON",
 | 
			
		||||
            contentType: "application/json",
 | 
			
		||||
            data: JSON.stringify({
 | 
			
		||||
                username: username.value,
 | 
			
		||||
                password: password.value,
 | 
			
		||||
                profileName: profileName.value
 | 
			
		||||
            }),
 | 
			
		||||
            success: function (data) {
 | 
			
		||||
                if (!data.id) {
 | 
			
		||||
                    if (data.errorMessage) snackbar.labelText = data.errorMessage;
 | 
			
		||||
                    snackbar.open();
 | 
			
		||||
                } else {
 | 
			
		||||
                    login = true;
 | 
			
		||||
                    $(".profileName").hide();
 | 
			
		||||
                    $(".login").hide();
 | 
			
		||||
                    $(".next").children(".mdc-button__label").text("登录");
 | 
			
		||||
                    snackbar.timeoutMs = 10000;
 | 
			
		||||
                    snackbar.labelText = "注册成功,uid:" + data.id;
 | 
			
		||||
                    snackbar.open();
 | 
			
		||||
                    localStorage.uuid = data.id;
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            error: function (e) {
 | 
			
		||||
                let response = JSON.parse(e.responseText);
 | 
			
		||||
                if (response.errorMessage === "profileName exist") {
 | 
			
		||||
                    snackbar.labelText = "注册失败: 角色名已存在";
 | 
			
		||||
                } else if (response.errorMessage === "profileName duplicate") {
 | 
			
		||||
                    snackbar.labelText = "注册失败: 角色名与正版用户冲突";
 | 
			
		||||
                } else {
 | 
			
		||||
                    snackbar.labelText = "注册失败: " + response.errorMessage;
 | 
			
		||||
                }
 | 
			
		||||
                snackbar.open();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    } else {
 | 
			
		||||
        $.ajax({
 | 
			
		||||
            url: "/authserver/authenticate",
 | 
			
		||||
            type: "POST",
 | 
			
		||||
            dataType: "JSON",
 | 
			
		||||
            contentType: "application/json",
 | 
			
		||||
            data: JSON.stringify({
 | 
			
		||||
                username: username.value,
 | 
			
		||||
                password: password.value
 | 
			
		||||
            }),
 | 
			
		||||
            success: function (data) {
 | 
			
		||||
                if (!data.accessToken) {
 | 
			
		||||
                    snackbar.labelText = "登录失败:";
 | 
			
		||||
                    if (data.errorMessage) snackbar.labelText += data.errorMessage;
 | 
			
		||||
                    snackbar.open();
 | 
			
		||||
                } else {
 | 
			
		||||
                    snackbar.timeoutMs = 5000;
 | 
			
		||||
                    snackbar.labelText = "登录成功,accessToken:" + data.accessToken;
 | 
			
		||||
                    snackbar.open();
 | 
			
		||||
                    localStorage.accessToken = data.accessToken;
 | 
			
		||||
                    localStorage.loginTime = new Date().getTime();
 | 
			
		||||
                    localStorage.profileName = data.selectedProfile.name;
 | 
			
		||||
                    if (data.selectedProfile) {
 | 
			
		||||
                        localStorage.profileName = data.selectedProfile.name;
 | 
			
		||||
                        localStorage.uuid = data.selectedProfile.id;
 | 
			
		||||
                    }
 | 
			
		||||
                    // localStorage.username = username.value;
 | 
			
		||||
                    // localStorage.password = password.value;
 | 
			
		||||
                    setTimeout(function () {
 | 
			
		||||
                        window.location = "user.html";
 | 
			
		||||
                    }, 3000);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            error: function (e) {
 | 
			
		||||
                let response = JSON.parse(e.responseText);
 | 
			
		||||
                snackbar.labelText = "登录失败: " + response.errorMessage;
 | 
			
		||||
                snackbar.open();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$(document).ready(function () {
 | 
			
		||||
    if (!localStorage.accessToken && localStorage.loginTime !== undefined &&
 | 
			
		||||
        (new Date().getTime() - localStorage.loginTime) < 30 * 86400 * 1000) {
 | 
			
		||||
        window.location = "user.html";
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										48
									
								
								assets/user.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								assets/user.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2022. Gardel <sunxinao@hotmail.com> and contributors
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.header {
 | 
			
		||||
  text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.model,
 | 
			
		||||
.textureType,
 | 
			
		||||
.url,
 | 
			
		||||
.changeTo {
 | 
			
		||||
  display: block;
 | 
			
		||||
  width: 300px;
 | 
			
		||||
  margin: 20px auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.file {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    width: 300px;
 | 
			
		||||
    margin: 20px auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button-container {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: flex-end;
 | 
			
		||||
  width: 300px;
 | 
			
		||||
  margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button-container button {
 | 
			
		||||
  margin: 3px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										154
									
								
								assets/user.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								assets/user.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,154 @@
 | 
			
		||||
<!--
 | 
			
		||||
  ~ Copyright (C) 2022. Gardel <sunxinao@hotmail.com> and contributors
 | 
			
		||||
  ~
 | 
			
		||||
  ~ This program is free software: you can redistribute it and/or modify
 | 
			
		||||
  ~ it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
  ~ the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
  ~ (at your option) any later version.
 | 
			
		||||
  ~
 | 
			
		||||
  ~ This program is distributed in the hope that it will be useful,
 | 
			
		||||
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
  ~ GNU Affero General Public License for more details.
 | 
			
		||||
  ~
 | 
			
		||||
  ~ You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
  -->
 | 
			
		||||
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
    <title>角色信息</title>
 | 
			
		||||
    <link rel="stylesheet" href="https://cdn.bootcss.com/normalize/8.0.0/normalize.min.css">
 | 
			
		||||
    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
 | 
			
		||||
    <link href="https://cdn.bootcss.com/material-components-web/5.1.0/material-components-web.min.css" rel="stylesheet">
 | 
			
		||||
    <script src="https://cdn.bootcss.com/material-components-web/5.1.0/material-components-web.min.js"></script>
 | 
			
		||||
    <link rel="stylesheet" href="user.css">
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<noscript>You need to enable JavaScript to run this app.</noscript>
 | 
			
		||||
<section class="header">
 | 
			
		||||
    <h1>简陋信息页</h1>
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
<section class="header">
 | 
			
		||||
    <h3>上传材质</h3>
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
<form id="upload-form" action="#" enctype="multipart/form-data">
 | 
			
		||||
    <div class="mdc-form-field textureType">
 | 
			
		||||
        <label>材质类别: </label>
 | 
			
		||||
        <div id="radio-skin" class="mdc-radio">
 | 
			
		||||
            <input class="mdc-radio__native-control" type="radio" id="radio-3" name="type" value="skin" checked>
 | 
			
		||||
            <div class="mdc-radio__background">
 | 
			
		||||
                <div class="mdc-radio__outer-circle"></div>
 | 
			
		||||
                <div class="mdc-radio__inner-circle"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="mdc-radio__ripple"></div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <label for="radio-3">皮肤</label>
 | 
			
		||||
        <div id="radio-cape" class="mdc-radio">
 | 
			
		||||
            <input class="mdc-radio__native-control" type="radio" id="radio-4" name="type" value="cape">
 | 
			
		||||
            <div class="mdc-radio__background">
 | 
			
		||||
                <div class="mdc-radio__outer-circle"></div>
 | 
			
		||||
                <div class="mdc-radio__inner-circle"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="mdc-radio__ripple"></div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <label for="radio-3">披风</label>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="mdc-form-field model">
 | 
			
		||||
        <label>材质模型: </label>
 | 
			
		||||
        <div id="radio-steve" class="mdc-radio">
 | 
			
		||||
            <input class="mdc-radio__native-control" type="radio" id="radio-1" name="model" value="default" checked>
 | 
			
		||||
            <div class="mdc-radio__background">
 | 
			
		||||
                <div class="mdc-radio__outer-circle"></div>
 | 
			
		||||
                <div class="mdc-radio__inner-circle"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="mdc-radio__ripple"></div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <label for="radio-1">Steve</label>
 | 
			
		||||
        <div id="radio-alex" class="mdc-radio">
 | 
			
		||||
            <input class="mdc-radio__native-control" type="radio" id="radio-2" name="model" value="slim">
 | 
			
		||||
            <div class="mdc-radio__background">
 | 
			
		||||
                <div class="mdc-radio__outer-circle"></div>
 | 
			
		||||
                <div class="mdc-radio__inner-circle"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="mdc-radio__ripple"></div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <label for="radio-2">Alex</label>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="mdc-text-field url">
 | 
			
		||||
        <input type="url" class="mdc-text-field__input" id="url-input" name="url">
 | 
			
		||||
        <label class="mdc-floating-label" for="url-input">材质url</label>
 | 
			
		||||
        <div class="mdc-line-ripple"></div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <label class="mdc-text-field mdc-text-field--outlined mdc-text-field--with-trailing-icon file">
 | 
			
		||||
        <input type="file" style="display: none;" accept="image/*" class="mdc-text-field__input" id="file-input"
 | 
			
		||||
               name="file" aria-label="Label">
 | 
			
		||||
 | 
			
		||||
        <i class="material-icons mdc-text-field__icon mdc-text-field__icon--trailing" tabindex="0" role="button"
 | 
			
		||||
           onclick="$('#file-input').val('').change();">delete</i>
 | 
			
		||||
        <div class="mdc-notched-outline">
 | 
			
		||||
            <div class="mdc-notched-outline__leading"></div>
 | 
			
		||||
            <div class="mdc-notched-outline__notch">
 | 
			
		||||
                <label id="file-path" for="file-input" class="mdc-floating-label">或者选择一个图片</label>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="mdc-notched-outline__trailing"></div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </label>
 | 
			
		||||
    <div class="button-container">
 | 
			
		||||
        <button type="submit" class="mdc-button mdc-button--raised upload">
 | 
			
		||||
            <div class="mdc-button__ripple"></div>
 | 
			
		||||
            <span class="mdc-button__label">
 | 
			
		||||
          上传
 | 
			
		||||
        </span>
 | 
			
		||||
        </button>
 | 
			
		||||
        <button type="button" id="delete-btn" class="mdc-button mdc-button--raised upload">
 | 
			
		||||
            <div class="mdc-button__ripple"></div>
 | 
			
		||||
            <span class="mdc-button__label">
 | 
			
		||||
          重置为默认
 | 
			
		||||
        </span>
 | 
			
		||||
        </button>
 | 
			
		||||
    </div>
 | 
			
		||||
</form>
 | 
			
		||||
 | 
			
		||||
<section class="header">
 | 
			
		||||
    <h3>更改游戏标签</h3>
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
<form id="change-form" action="#">
 | 
			
		||||
    <div class="mdc-text-field changeTo">
 | 
			
		||||
        <input type="text" class="mdc-text-field__input" id="changeTo-input" name="changeTo" required minlength="2"
 | 
			
		||||
               maxlength="16">
 | 
			
		||||
        <script>
 | 
			
		||||
            if (localStorage.profileName) document.getElementById("changeTo-input").value = localStorage.profileName;
 | 
			
		||||
        </script>
 | 
			
		||||
        <label class="mdc-floating-label" for="changeTo-input">游戏标签</label>
 | 
			
		||||
        <div class="mdc-line-ripple"></div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="button-container">
 | 
			
		||||
        <button type="submit" class="mdc-button mdc-button--raised submit">
 | 
			
		||||
            <div class="mdc-button__ripple"></div>
 | 
			
		||||
            <span class="mdc-button__label">
 | 
			
		||||
            更改
 | 
			
		||||
          </span>
 | 
			
		||||
        </button>
 | 
			
		||||
    </div>
 | 
			
		||||
</form>
 | 
			
		||||
<div class="mdc-snackbar">
 | 
			
		||||
    <div class="mdc-snackbar__surface">
 | 
			
		||||
        <div class="mdc-snackbar__label"
 | 
			
		||||
             role="status"
 | 
			
		||||
             aria-live="polite">
 | 
			
		||||
            上传失败
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<script src="https://cdn.bootcss.com/jquery/3.5.0/jquery.min.js"></script>
 | 
			
		||||
<script src="user.js" async></script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										242
									
								
								assets/user.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								assets/user.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,242 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2022. Gardel <sunxinao@hotmail.com> and contributors
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const MDCSnackbar = mdc.snackbar.MDCSnackbar;
 | 
			
		||||
const MDCTextField = mdc.textField.MDCTextField;
 | 
			
		||||
const MDCFormField = mdc.formField.MDCFormField;
 | 
			
		||||
const MDCRadio = mdc.radio.MDCRadio;
 | 
			
		||||
//const MDCRipple = mdc.ripple.MDCRipple;
 | 
			
		||||
 | 
			
		||||
const snackbar = new MDCSnackbar(document.querySelector('.mdc-snackbar'));
 | 
			
		||||
const modelField = new MDCFormField(document.querySelector('.model'));
 | 
			
		||||
const radio1 = new MDCRadio(document.querySelector('#radio-steve'));
 | 
			
		||||
const radio2 = new MDCRadio(document.querySelector('#radio-alex'));
 | 
			
		||||
const radio3 = new MDCRadio(document.querySelector('#radio-skin'));
 | 
			
		||||
const radio4 = new MDCRadio(document.querySelector('#radio-cape'));
 | 
			
		||||
modelField.input = {radio1, radio2};
 | 
			
		||||
const url = new MDCTextField(document.querySelector('.url'));
 | 
			
		||||
const file = new MDCTextField(document.querySelector('.file'));
 | 
			
		||||
const changeTo = new MDCTextField(document.querySelector('.changeTo'));
 | 
			
		||||
 | 
			
		||||
const modelTypeForm = document.querySelector('.mdc-form-field.model');
 | 
			
		||||
 | 
			
		||||
snackbar.close()
 | 
			
		||||
 | 
			
		||||
$("#file-input").change(function() {
 | 
			
		||||
    const path = this.value;
 | 
			
		||||
    if (!path) {
 | 
			
		||||
        $("#file-path").text("或选择一张图片");
 | 
			
		||||
        $(".url").show();
 | 
			
		||||
    } else {
 | 
			
		||||
        $("#file-path").text(path);
 | 
			
		||||
        url.value = '';
 | 
			
		||||
        $(".url").hide();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const modelTypeChange = function () {
 | 
			
		||||
    if (radio3.checked) {
 | 
			
		||||
        $(modelTypeForm).show();
 | 
			
		||||
    } else {
 | 
			
		||||
        $(modelTypeForm).hide();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
$("#radio-3").change(modelTypeChange)
 | 
			
		||||
$("#radio-4").change(modelTypeChange)
 | 
			
		||||
 | 
			
		||||
$("#url-input").on("input", function() {
 | 
			
		||||
    const url = this.value;
 | 
			
		||||
    if (!url) {
 | 
			
		||||
        $(".file").show();
 | 
			
		||||
    } else {
 | 
			
		||||
        file.value = '';
 | 
			
		||||
        $(".file").hide();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$(document).ready(function() {
 | 
			
		||||
    if (!localStorage.accessToken) {
 | 
			
		||||
        localStorage.loginTime = 1;
 | 
			
		||||
        window.location = "index.html";
 | 
			
		||||
    }
 | 
			
		||||
    $.ajax({
 | 
			
		||||
        url: '/authserver/validate',
 | 
			
		||||
        type: 'POST',
 | 
			
		||||
        dataType: "JSON",
 | 
			
		||||
        contentType: "application/json",
 | 
			
		||||
        data: JSON.stringify({
 | 
			
		||||
            accessToken: localStorage.accessToken,
 | 
			
		||||
        }),
 | 
			
		||||
        success: function(data) {
 | 
			
		||||
            //有效,啥也不整
 | 
			
		||||
        },
 | 
			
		||||
        error: function(e) {
 | 
			
		||||
            if (e.status == 403) {
 | 
			
		||||
                // 持续套娃
 | 
			
		||||
                $.ajax({
 | 
			
		||||
                    url: '/authserver/refresh',
 | 
			
		||||
                    type: 'POST',
 | 
			
		||||
                    dataType: "JSON",
 | 
			
		||||
                    contentType: "application/json",
 | 
			
		||||
                    data: JSON.stringify({
 | 
			
		||||
                        accessToken: localStorage.accessToken,
 | 
			
		||||
                    }),
 | 
			
		||||
                    success: function(data) {
 | 
			
		||||
                        if (!data.accessToken) {
 | 
			
		||||
                            localStorage.loginTime = 1;
 | 
			
		||||
                            window.location = "index.html";
 | 
			
		||||
                        } else {
 | 
			
		||||
                            snackbar.timeoutMs = 5000;
 | 
			
		||||
                            snackbar.labelText = "刷新token成功,accessToken:" + data.accessToken;
 | 
			
		||||
                            snackbar.open();
 | 
			
		||||
                            localStorage.accessToken = data.accessToken;
 | 
			
		||||
                            localStorage.loginTime = new Date().getTime();
 | 
			
		||||
                            if(data.selectedProfile) {
 | 
			
		||||
                                localStorage.profileName = data.selectedProfile.name;
 | 
			
		||||
                                localStorage.uuid = data.selectedProfile.id;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    error: function(e) {
 | 
			
		||||
                        if (e.status == 403) {
 | 
			
		||||
                            localStorage.loginTime = 1;
 | 
			
		||||
                            window.location = "index.html";
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$("#upload-form").submit(function(e) {
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
    if (!url.value && !$("#file-input").val()) {
 | 
			
		||||
        snackbar.timeoutMs = 5000;
 | 
			
		||||
        snackbar.labelText = "没填信息";
 | 
			
		||||
        snackbar.open();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    let textureType = 'skin'
 | 
			
		||||
    if (radio3.checked) {
 | 
			
		||||
        textureType = 'skin'
 | 
			
		||||
    } else if (radio4.checked) {
 | 
			
		||||
        textureType = 'cape'
 | 
			
		||||
    }
 | 
			
		||||
    if (!url.value) {
 | 
			
		||||
        const formData = new FormData();
 | 
			
		||||
        formData.append("model", radio1.checked ? radio1.value : radio2.value);
 | 
			
		||||
        formData.append("file", $("#file-input")[0].files[0]);
 | 
			
		||||
        //formData.contentType = "multipart/form-data";
 | 
			
		||||
        $.ajax({
 | 
			
		||||
            url: `/api/user/profile/${localStorage.uuid}/${textureType}`,
 | 
			
		||||
            type: 'PUT',
 | 
			
		||||
            processData: false,
 | 
			
		||||
            contentType: false,
 | 
			
		||||
            headers: {'Authorization':'Bearer ' + localStorage.accessToken},
 | 
			
		||||
            data: formData,
 | 
			
		||||
            success: function(data) {
 | 
			
		||||
                snackbar.timeoutMs = 5000;
 | 
			
		||||
                snackbar.labelText = "材质上传成功";
 | 
			
		||||
                snackbar.open();
 | 
			
		||||
            },
 | 
			
		||||
            error: function(e) {
 | 
			
		||||
                snackbar.timeoutMs = 5000;
 | 
			
		||||
                snackbar.labelText = "材质上传失败";
 | 
			
		||||
                snackbar.open();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    } else if (url.value) {
 | 
			
		||||
        $.ajax({
 | 
			
		||||
            url: `/api/user/profile/${localStorage.uuid}/${textureType}`,
 | 
			
		||||
            type: 'POST',
 | 
			
		||||
            dataType: "JSON",
 | 
			
		||||
            contentType: "application/json",
 | 
			
		||||
            headers: {'Authorization':'Bearer ' + localStorage.accessToken},
 | 
			
		||||
            data: JSON.stringify({
 | 
			
		||||
                model: radio1.checked ? radio1.value : radio2.value,
 | 
			
		||||
                url: url.value
 | 
			
		||||
            }),
 | 
			
		||||
            success: function(data) {
 | 
			
		||||
                snackbar.timeoutMs = 5000;
 | 
			
		||||
                snackbar.labelText = "材质上传成功";
 | 
			
		||||
                snackbar.open();
 | 
			
		||||
            },
 | 
			
		||||
            error: function(e) {
 | 
			
		||||
                snackbar.timeoutMs = 5000;
 | 
			
		||||
                snackbar.labelText = "材质上传失败";
 | 
			
		||||
                snackbar.open();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$("#change-form").submit(function(e) {
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
    if (changeTo.value.length <= 1) {
 | 
			
		||||
        snackbar.timeoutMs = 5000;
 | 
			
		||||
        snackbar.labelText = "更改失败, 角色名格式不正确";
 | 
			
		||||
        snackbar.open();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    $.ajax({
 | 
			
		||||
        url: '/authserver/change',
 | 
			
		||||
        type: 'POST',
 | 
			
		||||
        dataType: "JSON",
 | 
			
		||||
        contentType: "application/json",
 | 
			
		||||
        data: JSON.stringify({
 | 
			
		||||
            accessToken: localStorage.accessToken,
 | 
			
		||||
            changeTo: changeTo.value
 | 
			
		||||
        }),
 | 
			
		||||
        success: function(data) {
 | 
			
		||||
            snackbar.timeoutMs = 5000;
 | 
			
		||||
            snackbar.labelText = "更改成功";
 | 
			
		||||
            snackbar.open();
 | 
			
		||||
            localStorage.profileName = changeTo.value;
 | 
			
		||||
        },
 | 
			
		||||
        error: function(e) {
 | 
			
		||||
            snackbar.timeoutMs = 5000;
 | 
			
		||||
            snackbar.labelText = "更改失败, 可能是角色名已存在";
 | 
			
		||||
            snackbar.open();
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$('#delete-btn').click(function () {
 | 
			
		||||
    let textureType = 'skin'
 | 
			
		||||
    if (radio3.checked) {
 | 
			
		||||
        textureType = 'skin'
 | 
			
		||||
    } else if (radio4.checked) {
 | 
			
		||||
        textureType = 'cape'
 | 
			
		||||
    }
 | 
			
		||||
    $.ajax({
 | 
			
		||||
        url: `/api/user/profile/${localStorage.uuid}/${textureType}`,
 | 
			
		||||
        type: 'DELETE',
 | 
			
		||||
        headers: {'Authorization':'Bearer ' + localStorage.accessToken},
 | 
			
		||||
        success: function(data) {
 | 
			
		||||
            snackbar.timeoutMs = 5000;
 | 
			
		||||
            snackbar.labelText = "恢复成功";
 | 
			
		||||
            snackbar.open();
 | 
			
		||||
            localStorage.profileName = changeTo.value;
 | 
			
		||||
        },
 | 
			
		||||
        error: function(e) {
 | 
			
		||||
            snackbar.timeoutMs = 5000;
 | 
			
		||||
            snackbar.labelText = "重置失败";
 | 
			
		||||
            snackbar.open();
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
})
 | 
			
		||||
		Reference in New Issue
	
	Block a user