feat(server): 添加服务器列表接口和用户进入游戏功能
- 在登录模块中添加服务器列表获取接口 /api/server/list - 实现用户进入游戏功能,记录登录时间和IP地址 - 添加时间工具函数用于格式化时间戳 - 配置Koa代理支持 - 更新白名单路由配置 - 添加MD5加密、Cookie操作和通用工具函数库
@@ -4,6 +4,7 @@ import * as log4js from "../log4js.js";
|
||||
const whiteList = [
|
||||
'/',
|
||||
'/api/login',
|
||||
"/api/server/list"
|
||||
]
|
||||
|
||||
async function auth(ctx, next) {
|
||||
|
||||
@@ -18,6 +18,7 @@ router.get('/', (ctx) => {
|
||||
router.get('/api/config', (ctx) => {
|
||||
ctx.body = {data: config}
|
||||
})
|
||||
app.proxy = true;
|
||||
app.use(auth)
|
||||
app.use(router.routes());
|
||||
app.use(registry)
|
||||
|
||||
@@ -2,6 +2,7 @@ import Router from 'koa-router';
|
||||
import mysql from "../mysql/index.js";
|
||||
import jwt from "jsonwebtoken";
|
||||
import * as log4js from "../log4js.js";
|
||||
import {time} from "../utils.js";
|
||||
|
||||
const router = new Router()
|
||||
|
||||
@@ -18,7 +19,16 @@ router.post("/api/login", async (ctx) => {
|
||||
})
|
||||
|
||||
router.post("/api/enter_game", async (ctx) => {
|
||||
|
||||
const {srvId, account} = ctx.request.body
|
||||
if (!srvId || !account) return ctx.body = {code: 1, message: "参数错误"}
|
||||
log4js.koa.info("用户进入游戏", account, ctx.ip)
|
||||
await mysql.query("UPDATE mir_web.player_game SET login_time = ?,login_ip = ? WHERE username = ?", [time(), ctx.ip, account])
|
||||
return ctx.body = {code: 0, message: "进入游戏成功"}
|
||||
})
|
||||
|
||||
router.get("/api/server/list", async (ctx) => {
|
||||
const [rows] = await mysql.query("SELECT * FROM mir_web.server WHERE status >= 1 ORDER BY server_id ASC limit 1000")
|
||||
return ctx.body = {code: 0, message: "获取服务器列表成功", data: rows}
|
||||
})
|
||||
|
||||
export default router.routes()
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"dev": "nodemon --exec \"node --env-file=.env\" index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"dayjs": "^1.11.19",
|
||||
"jsonwebtoken": "^9.0.3",
|
||||
"koa": "^2.15.0",
|
||||
"koa-router": "^12.0.0",
|
||||
|
||||
5
module/server/utils.js
Normal file
@@ -0,0 +1,5 @@
|
||||
import dayjs from "dayjs";
|
||||
|
||||
export function time(date){
|
||||
return dayjs(date).format('YYYY-MM-DD HH:mm:ss')
|
||||
}
|
||||
@@ -1,23 +1,25 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.ico">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport"
|
||||
content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"/>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes"/>
|
||||
<meta name="full-screen" content="true"/>
|
||||
<meta name="screen-orientation" content="portrait"/>
|
||||
<meta name="x5-fullscreen" content="true"/>
|
||||
<meta name="360-fullscreen" content="true"/>
|
||||
<script src="/static/js/md5.js"></script>
|
||||
<script src="/static/js/common.js?v=1"></script>
|
||||
<title>神临苍月</title>
|
||||
<meta charset="UTF-8"/>
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.ico">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport"
|
||||
content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"/>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes"/>
|
||||
<meta name="full-screen" content="true"/>
|
||||
<meta name="screen-orientation" content="portrait"/>
|
||||
<meta name="x5-fullscreen" content="true"/>
|
||||
<meta name="360-fullscreen" content="true"/>
|
||||
<script src="/static/js/md5.js"></script>
|
||||
<script src="/static/js/common.js?v=1"></script>
|
||||
<title>神临苍月</title>
|
||||
</head>
|
||||
<body oncontextmenu="return false" ondragstart="return false">
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/module/web/src/main.js"></script>
|
||||
<div id="app">
|
||||
|
||||
</div>
|
||||
<script type="module" src="src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
BIN
module/web/public/favicon.ico
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
module/web/public/img/close_btn.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
module/web/public/img/enter_game.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
module/web/public/img/linuxdo_logo.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
module/web/public/img/login_bg.jpg
Normal file
|
After Width: | Height: | Size: 200 KiB |
BIN
module/web/public/img/logo.png
Normal file
|
After Width: | Height: | Size: 478 KiB |
138
module/web/public/js/common.js
Normal file
@@ -0,0 +1,138 @@
|
||||
/**
|
||||
* 冰雪传奇H5
|
||||
* 2022 XX信息科技有限公司
|
||||
*
|
||||
* @author 123456
|
||||
* @wx 123456
|
||||
* @qq 123456
|
||||
*/
|
||||
|
||||
function getQueryString(name) {
|
||||
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
|
||||
var r = window.location.search.substr(1).match(reg);
|
||||
if (r != null) return unescape(r[2]);
|
||||
return null;
|
||||
}
|
||||
|
||||
function getHttp() {
|
||||
return location.protocol.indexOf('https:') != -1 ? 'https://' : 'http://';
|
||||
}
|
||||
|
||||
function isMobile() {
|
||||
var userAgentInfo = navigator.userAgent;
|
||||
var mobileAgents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod'];
|
||||
var mobile_flag = false;
|
||||
//根据userAgent判断是否是手机
|
||||
for (var v = 0; v < mobileAgents.length; v++) {
|
||||
if (userAgentInfo.indexOf(mobileAgents[v]) > 0) {
|
||||
mobile_flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
var screen_width = window.screen.width;
|
||||
var screen_height = window.screen.height;
|
||||
//根据屏幕分辨率判断是否是手机
|
||||
if(screen_width < 500 && screen_height < 800) {
|
||||
mobile_flag = true;
|
||||
}
|
||||
return mobile_flag;
|
||||
}
|
||||
|
||||
function isWeiXin() {
|
||||
var ua = window.navigator.userAgent.toLowerCase();
|
||||
if (ua.match(/MicroMessenger/i) == 'micromessenger') {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function randomRange(t, e) {
|
||||
t = Math.min(t, e),
|
||||
e = Math.max(t, e);
|
||||
var i = e - t;
|
||||
return Math.round(t + Math.random() * i);
|
||||
}
|
||||
|
||||
// 写cookies
|
||||
function setCookie(name, value, day) {
|
||||
day = day || 30;
|
||||
var exp = new Date();
|
||||
exp.setTime(exp.getTime() + day * 24 * 60 * 60 * 1000);
|
||||
document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
|
||||
//console.log('setCookie name=' + name + ', value=' + value + ', day=' + day + ', getCookie=' + getCookie(name));
|
||||
}
|
||||
|
||||
// 读取cookies
|
||||
function getCookie(name) {
|
||||
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
|
||||
|
||||
if (arr = document.cookie.match(reg)) {
|
||||
//console.log('getCookie=' + unescape(arr[2]));
|
||||
return unescape(arr[2]);
|
||||
} else {
|
||||
//console.log('getCookie is null');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 删除cookies
|
||||
function delCookie(name) {
|
||||
var exp = new Date();
|
||||
exp.setTime(exp.getTime() - 1);
|
||||
var cval = getCookie(name);
|
||||
if (cval != null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
|
||||
}
|
||||
|
||||
function filterHTML(str) {
|
||||
return str.replace(/(<([^>]+)>)/ig, '');
|
||||
}
|
||||
|
||||
function checkAccountLength(str, type) {
|
||||
if('admin' == str && 'string' == typeof type) return true;
|
||||
var t = 'string' == typeof type ? type : (!type ? '账号' : '密码');
|
||||
if ('' == str) {
|
||||
return '请输入您的' + t + '!';
|
||||
} else if (6 > str.length || 16 < str.length) {
|
||||
return t + '长度为6-16个字符!';
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function funcChina(str, name) {
|
||||
if (/.*[\u4e00-\u9fa5]+.*$/.test(str)) {
|
||||
return (name || '账号') + '不能包含中文!';
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function checkAccount(str, name) {
|
||||
if (!/^[A-Za-z0-9_]+$/.test(str)) {
|
||||
return (name || '账号') + '只能由字母/数字/下划线构成,必须以字母开头!';
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function checkPassword(str, name) {
|
||||
var ret = checkAccountLength(str, true);
|
||||
if(true != ret) {
|
||||
return ret;
|
||||
}
|
||||
if(new RegExp('(^ )|( $)').test(str)) {
|
||||
return (name || '密码') + '不能包含空格!';
|
||||
}
|
||||
ret = funcChina(str, name)
|
||||
if(true !== ret) {
|
||||
return ret;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function checkEmail(str) {
|
||||
if('' == str) return '请输入邮箱地址!';
|
||||
var RegEx = /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/;
|
||||
if(!RegEx.test(str)) {
|
||||
return '邮箱地址格式错误!';
|
||||
}
|
||||
return true;
|
||||
}
|
||||
19
module/web/public/js/cookie.js
Normal file
@@ -0,0 +1,19 @@
|
||||
function setCookie(name,value,expiredays){
|
||||
var exp = new Date();
|
||||
exp.setDate(exp.getDate() + expiredays);
|
||||
document.cookie = name + "="+ escape (value) + ((expiredays == null) ? "" : ";expires=" + exp.toGMTString());
|
||||
}
|
||||
function getCookie(name){
|
||||
var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
|
||||
if(arr != null){
|
||||
return (arr[2]);
|
||||
}else{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
function delCookie(name){
|
||||
var exp = new Date();
|
||||
exp.setTime(exp.getTime() - 1);
|
||||
var cval=getCookie(name);
|
||||
if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString();
|
||||
}
|
||||
4
module/web/public/js/jquery.js
vendored
Normal file
683
module/web/public/js/md5.js
Normal file
@@ -0,0 +1,683 @@
|
||||
/**
|
||||
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||
*
|
||||
* @namespace md5
|
||||
* @version 0.7.3
|
||||
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||
* @copyright Chen, Yi-Cyuan 2014-2017
|
||||
* @license MIT
|
||||
*/
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
var ERROR = 'input is invalid type';
|
||||
var WINDOW = typeof window === 'object';
|
||||
var root = WINDOW ? window : {};
|
||||
if (root.JS_MD5_NO_WINDOW) {
|
||||
WINDOW = false;
|
||||
}
|
||||
var WEB_WORKER = !WINDOW && typeof self === 'object';
|
||||
var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
||||
if (NODE_JS) {
|
||||
root = global;
|
||||
} else if (WEB_WORKER) {
|
||||
root = self;
|
||||
}
|
||||
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||
var AMD = typeof define === 'function' && define.amd;
|
||||
var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
|
||||
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||
var SHIFT = [0, 8, 16, 24];
|
||||
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64'];
|
||||
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
|
||||
|
||||
var blocks = [], buffer8;
|
||||
if (ARRAY_BUFFER) {
|
||||
var buffer = new ArrayBuffer(68);
|
||||
buffer8 = new Uint8Array(buffer);
|
||||
blocks = new Uint32Array(buffer);
|
||||
}
|
||||
|
||||
if (root.JS_MD5_NO_NODE_JS || !Array.isArray) {
|
||||
Array.isArray = function (obj) {
|
||||
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||
};
|
||||
}
|
||||
|
||||
if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
|
||||
ArrayBuffer.isView = function (obj) {
|
||||
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @method hex
|
||||
* @memberof md5
|
||||
* @description Output hash as hex string
|
||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||
* @returns {String} Hex string
|
||||
* @example
|
||||
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||
* // equal to
|
||||
* md5('The quick brown fox jumps over the lazy dog');
|
||||
*/
|
||||
/**
|
||||
* @method digest
|
||||
* @memberof md5
|
||||
* @description Output hash as bytes array
|
||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||
* @returns {Array} Bytes array
|
||||
* @example
|
||||
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||
*/
|
||||
/**
|
||||
* @method array
|
||||
* @memberof md5
|
||||
* @description Output hash as bytes array
|
||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||
* @returns {Array} Bytes array
|
||||
* @example
|
||||
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||
*/
|
||||
/**
|
||||
* @method arrayBuffer
|
||||
* @memberof md5
|
||||
* @description Output hash as ArrayBuffer
|
||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||
* @returns {ArrayBuffer} ArrayBuffer
|
||||
* @example
|
||||
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||
*/
|
||||
/**
|
||||
* @method buffer
|
||||
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||
* @memberof md5
|
||||
* @description Output hash as ArrayBuffer
|
||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||
* @returns {ArrayBuffer} ArrayBuffer
|
||||
* @example
|
||||
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||
*/
|
||||
/**
|
||||
* @method base64
|
||||
* @memberof md5
|
||||
* @description Output hash as base64 string
|
||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||
* @returns {String} base64 string
|
||||
* @example
|
||||
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||
*/
|
||||
var createOutputMethod = function (outputType) {
|
||||
return function (message) {
|
||||
return new Md5(true).update(message)[outputType]();
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* @method create
|
||||
* @memberof md5
|
||||
* @description Create Md5 object
|
||||
* @returns {Md5} Md5 object.
|
||||
* @example
|
||||
* var hash = md5.create();
|
||||
*/
|
||||
/**
|
||||
* @method update
|
||||
* @memberof md5
|
||||
* @description Create and update Md5 object
|
||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||
* @returns {Md5} Md5 object.
|
||||
* @example
|
||||
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||
* // equal to
|
||||
* var hash = md5.create();
|
||||
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||
*/
|
||||
var createMethod = function () {
|
||||
var method = createOutputMethod('hex');
|
||||
if (NODE_JS) {
|
||||
method = nodeWrap(method);
|
||||
}
|
||||
method.create = function () {
|
||||
return new Md5();
|
||||
};
|
||||
method.update = function (message) {
|
||||
return method.create().update(message);
|
||||
};
|
||||
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
||||
var type = OUTPUT_TYPES[i];
|
||||
method[type] = createOutputMethod(type);
|
||||
}
|
||||
return method;
|
||||
};
|
||||
|
||||
var nodeWrap = function (method) {
|
||||
var crypto = eval("require('crypto')");
|
||||
var Buffer = eval("require('buffer').Buffer");
|
||||
var nodeMethod = function (message) {
|
||||
if (typeof message === 'string') {
|
||||
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
||||
} else {
|
||||
if (message === null || message === undefined) {
|
||||
throw ERROR;
|
||||
} else if (message.constructor === ArrayBuffer) {
|
||||
message = new Uint8Array(message);
|
||||
}
|
||||
}
|
||||
if (Array.isArray(message) || ArrayBuffer.isView(message) ||
|
||||
message.constructor === Buffer) {
|
||||
return crypto.createHash('md5').update(new Buffer(message)).digest('hex');
|
||||
} else {
|
||||
return method(message);
|
||||
}
|
||||
};
|
||||
return nodeMethod;
|
||||
};
|
||||
|
||||
/**
|
||||
* Md5 class
|
||||
* @class Md5
|
||||
* @description This is internal class.
|
||||
* @see {@link md5.create}
|
||||
*/
|
||||
function Md5(sharedMemory) {
|
||||
if (sharedMemory) {
|
||||
blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
||||
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
||||
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||
this.blocks = blocks;
|
||||
this.buffer8 = buffer8;
|
||||
} else {
|
||||
if (ARRAY_BUFFER) {
|
||||
var buffer = new ArrayBuffer(68);
|
||||
this.buffer8 = new Uint8Array(buffer);
|
||||
this.blocks = new Uint32Array(buffer);
|
||||
} else {
|
||||
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
}
|
||||
}
|
||||
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||
this.finalized = this.hashed = false;
|
||||
this.first = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @method update
|
||||
* @memberof Md5
|
||||
* @instance
|
||||
* @description Update hash
|
||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||
* @returns {Md5} Md5 object.
|
||||
* @see {@link md5.update}
|
||||
*/
|
||||
Md5.prototype.update = function (message) {
|
||||
if (this.finalized) {
|
||||
return;
|
||||
}
|
||||
|
||||
var notString, type = typeof message;
|
||||
if (type !== 'string') {
|
||||
if (type === 'object') {
|
||||
if (message === null) {
|
||||
throw ERROR;
|
||||
} else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
||||
message = new Uint8Array(message);
|
||||
} else if (!Array.isArray(message)) {
|
||||
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
|
||||
throw ERROR;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
throw ERROR;
|
||||
}
|
||||
notString = true;
|
||||
}
|
||||
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||
var buffer8 = this.buffer8;
|
||||
|
||||
while (index < length) {
|
||||
if (this.hashed) {
|
||||
this.hashed = false;
|
||||
blocks[0] = blocks[16];
|
||||
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
||||
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
||||
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||
}
|
||||
|
||||
if (notString) {
|
||||
if (ARRAY_BUFFER) {
|
||||
for (i = this.start; index < length && i < 64; ++index) {
|
||||
buffer8[i++] = message[index];
|
||||
}
|
||||
} else {
|
||||
for (i = this.start; index < length && i < 64; ++index) {
|
||||
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ARRAY_BUFFER) {
|
||||
for (i = this.start; index < length && i < 64; ++index) {
|
||||
code = message.charCodeAt(index);
|
||||
if (code < 0x80) {
|
||||
buffer8[i++] = code;
|
||||
} else if (code < 0x800) {
|
||||
buffer8[i++] = 0xc0 | (code >> 6);
|
||||
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||
} else if (code < 0xd800 || code >= 0xe000) {
|
||||
buffer8[i++] = 0xe0 | (code >> 12);
|
||||
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
||||
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||
} else {
|
||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||
buffer8[i++] = 0xf0 | (code >> 18);
|
||||
buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);
|
||||
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
||||
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (i = this.start; index < length && i < 64; ++index) {
|
||||
code = message.charCodeAt(index);
|
||||
if (code < 0x80) {
|
||||
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
||||
} else if (code < 0x800) {
|
||||
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||
} else if (code < 0xd800 || code >= 0xe000) {
|
||||
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||
} else {
|
||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.lastByteIndex = i;
|
||||
this.bytes += i - this.start;
|
||||
if (i >= 64) {
|
||||
this.start = i - 64;
|
||||
this.hash();
|
||||
this.hashed = true;
|
||||
} else {
|
||||
this.start = i;
|
||||
}
|
||||
}
|
||||
if (this.bytes > 4294967295) {
|
||||
this.hBytes += this.bytes / 4294967296 << 0;
|
||||
this.bytes = this.bytes % 4294967296;
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
Md5.prototype.finalize = function () {
|
||||
if (this.finalized) {
|
||||
return;
|
||||
}
|
||||
this.finalized = true;
|
||||
var blocks = this.blocks, i = this.lastByteIndex;
|
||||
blocks[i >> 2] |= EXTRA[i & 3];
|
||||
if (i >= 56) {
|
||||
if (!this.hashed) {
|
||||
this.hash();
|
||||
}
|
||||
blocks[0] = blocks[16];
|
||||
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
||||
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
||||
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||
}
|
||||
blocks[14] = this.bytes << 3;
|
||||
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||
this.hash();
|
||||
};
|
||||
|
||||
Md5.prototype.hash = function () {
|
||||
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||
|
||||
if (this.first) {
|
||||
a = blocks[0] - 680876937;
|
||||
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||
d = (d << 12 | d >>> 20) + a << 0;
|
||||
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||
c = (c << 17 | c >>> 15) + d << 0;
|
||||
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||
b = (b << 22 | b >>> 10) + c << 0;
|
||||
} else {
|
||||
a = this.h0;
|
||||
b = this.h1;
|
||||
c = this.h2;
|
||||
d = this.h3;
|
||||
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||
a = (a << 7 | a >>> 25) + b << 0;
|
||||
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||
d = (d << 12 | d >>> 20) + a << 0;
|
||||
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||
c = (c << 17 | c >>> 15) + d << 0;
|
||||
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||
b = (b << 22 | b >>> 10) + c << 0;
|
||||
}
|
||||
|
||||
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||
a = (a << 7 | a >>> 25) + b << 0;
|
||||
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||
d = (d << 12 | d >>> 20) + a << 0;
|
||||
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||
c = (c << 17 | c >>> 15) + d << 0;
|
||||
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||
b = (b << 22 | b >>> 10) + c << 0;
|
||||
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||
a = (a << 7 | a >>> 25) + b << 0;
|
||||
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||
d = (d << 12 | d >>> 20) + a << 0;
|
||||
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||
c = (c << 17 | c >>> 15) + d << 0;
|
||||
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||
b = (b << 22 | b >>> 10) + c << 0;
|
||||
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||
a = (a << 7 | a >>> 25) + b << 0;
|
||||
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||
d = (d << 12 | d >>> 20) + a << 0;
|
||||
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||
c = (c << 17 | c >>> 15) + d << 0;
|
||||
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||
b = (b << 22 | b >>> 10) + c << 0;
|
||||
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||
a = (a << 5 | a >>> 27) + b << 0;
|
||||
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||
d = (d << 9 | d >>> 23) + a << 0;
|
||||
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||
c = (c << 14 | c >>> 18) + d << 0;
|
||||
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||
b = (b << 20 | b >>> 12) + c << 0;
|
||||
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||
a = (a << 5 | a >>> 27) + b << 0;
|
||||
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||
d = (d << 9 | d >>> 23) + a << 0;
|
||||
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||
c = (c << 14 | c >>> 18) + d << 0;
|
||||
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||
b = (b << 20 | b >>> 12) + c << 0;
|
||||
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||
a = (a << 5 | a >>> 27) + b << 0;
|
||||
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||
d = (d << 9 | d >>> 23) + a << 0;
|
||||
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||
c = (c << 14 | c >>> 18) + d << 0;
|
||||
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||
b = (b << 20 | b >>> 12) + c << 0;
|
||||
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||
a = (a << 5 | a >>> 27) + b << 0;
|
||||
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||
d = (d << 9 | d >>> 23) + a << 0;
|
||||
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||
c = (c << 14 | c >>> 18) + d << 0;
|
||||
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||
b = (b << 20 | b >>> 12) + c << 0;
|
||||
bc = b ^ c;
|
||||
a += (bc ^ d) + blocks[5] - 378558;
|
||||
a = (a << 4 | a >>> 28) + b << 0;
|
||||
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||
d = (d << 11 | d >>> 21) + a << 0;
|
||||
da = d ^ a;
|
||||
c += (da ^ b) + blocks[11] + 1839030562;
|
||||
c = (c << 16 | c >>> 16) + d << 0;
|
||||
b += (da ^ c) + blocks[14] - 35309556;
|
||||
b = (b << 23 | b >>> 9) + c << 0;
|
||||
bc = b ^ c;
|
||||
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||
a = (a << 4 | a >>> 28) + b << 0;
|
||||
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||
d = (d << 11 | d >>> 21) + a << 0;
|
||||
da = d ^ a;
|
||||
c += (da ^ b) + blocks[7] - 155497632;
|
||||
c = (c << 16 | c >>> 16) + d << 0;
|
||||
b += (da ^ c) + blocks[10] - 1094730640;
|
||||
b = (b << 23 | b >>> 9) + c << 0;
|
||||
bc = b ^ c;
|
||||
a += (bc ^ d) + blocks[13] + 681279174;
|
||||
a = (a << 4 | a >>> 28) + b << 0;
|
||||
d += (bc ^ a) + blocks[0] - 358537222;
|
||||
d = (d << 11 | d >>> 21) + a << 0;
|
||||
da = d ^ a;
|
||||
c += (da ^ b) + blocks[3] - 722521979;
|
||||
c = (c << 16 | c >>> 16) + d << 0;
|
||||
b += (da ^ c) + blocks[6] + 76029189;
|
||||
b = (b << 23 | b >>> 9) + c << 0;
|
||||
bc = b ^ c;
|
||||
a += (bc ^ d) + blocks[9] - 640364487;
|
||||
a = (a << 4 | a >>> 28) + b << 0;
|
||||
d += (bc ^ a) + blocks[12] - 421815835;
|
||||
d = (d << 11 | d >>> 21) + a << 0;
|
||||
da = d ^ a;
|
||||
c += (da ^ b) + blocks[15] + 530742520;
|
||||
c = (c << 16 | c >>> 16) + d << 0;
|
||||
b += (da ^ c) + blocks[2] - 995338651;
|
||||
b = (b << 23 | b >>> 9) + c << 0;
|
||||
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||
a = (a << 6 | a >>> 26) + b << 0;
|
||||
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||
d = (d << 10 | d >>> 22) + a << 0;
|
||||
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||
c = (c << 15 | c >>> 17) + d << 0;
|
||||
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||
b = (b << 21 | b >>> 11) + c << 0;
|
||||
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||
a = (a << 6 | a >>> 26) + b << 0;
|
||||
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||
d = (d << 10 | d >>> 22) + a << 0;
|
||||
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||
c = (c << 15 | c >>> 17) + d << 0;
|
||||
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||
b = (b << 21 | b >>> 11) + c << 0;
|
||||
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||
a = (a << 6 | a >>> 26) + b << 0;
|
||||
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||
d = (d << 10 | d >>> 22) + a << 0;
|
||||
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||
c = (c << 15 | c >>> 17) + d << 0;
|
||||
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||
b = (b << 21 | b >>> 11) + c << 0;
|
||||
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||
a = (a << 6 | a >>> 26) + b << 0;
|
||||
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||
d = (d << 10 | d >>> 22) + a << 0;
|
||||
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||
c = (c << 15 | c >>> 17) + d << 0;
|
||||
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||
b = (b << 21 | b >>> 11) + c << 0;
|
||||
|
||||
if (this.first) {
|
||||
this.h0 = a + 1732584193 << 0;
|
||||
this.h1 = b - 271733879 << 0;
|
||||
this.h2 = c - 1732584194 << 0;
|
||||
this.h3 = d + 271733878 << 0;
|
||||
this.first = false;
|
||||
} else {
|
||||
this.h0 = this.h0 + a << 0;
|
||||
this.h1 = this.h1 + b << 0;
|
||||
this.h2 = this.h2 + c << 0;
|
||||
this.h3 = this.h3 + d << 0;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @method hex
|
||||
* @memberof Md5
|
||||
* @instance
|
||||
* @description Output hash as hex string
|
||||
* @returns {String} Hex string
|
||||
* @see {@link md5.hex}
|
||||
* @example
|
||||
* hash.hex();
|
||||
*/
|
||||
Md5.prototype.hex = function () {
|
||||
this.finalize();
|
||||
|
||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||
|
||||
return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||
HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
|
||||
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
|
||||
HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
|
||||
HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||
HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
|
||||
HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
|
||||
HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
|
||||
HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||
HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
|
||||
HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
|
||||
HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
|
||||
HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||
HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
|
||||
HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
|
||||
HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F];
|
||||
};
|
||||
|
||||
/**
|
||||
* @method toString
|
||||
* @memberof Md5
|
||||
* @instance
|
||||
* @description Output hash as hex string
|
||||
* @returns {String} Hex string
|
||||
* @see {@link md5.hex}
|
||||
* @example
|
||||
* hash.toString();
|
||||
*/
|
||||
Md5.prototype.toString = Md5.prototype.hex;
|
||||
|
||||
/**
|
||||
* @method digest
|
||||
* @memberof Md5
|
||||
* @instance
|
||||
* @description Output hash as bytes array
|
||||
* @returns {Array} Bytes array
|
||||
* @see {@link md5.digest}
|
||||
* @example
|
||||
* hash.digest();
|
||||
*/
|
||||
Md5.prototype.digest = function () {
|
||||
this.finalize();
|
||||
|
||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||
return [
|
||||
h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF,
|
||||
h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF,
|
||||
h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF,
|
||||
h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF
|
||||
];
|
||||
};
|
||||
|
||||
/**
|
||||
* @method array
|
||||
* @memberof Md5
|
||||
* @instance
|
||||
* @description Output hash as bytes array
|
||||
* @returns {Array} Bytes array
|
||||
* @see {@link md5.array}
|
||||
* @example
|
||||
* hash.array();
|
||||
*/
|
||||
Md5.prototype.array = Md5.prototype.digest;
|
||||
|
||||
/**
|
||||
* @method arrayBuffer
|
||||
* @memberof Md5
|
||||
* @instance
|
||||
* @description Output hash as ArrayBuffer
|
||||
* @returns {ArrayBuffer} ArrayBuffer
|
||||
* @see {@link md5.arrayBuffer}
|
||||
* @example
|
||||
* hash.arrayBuffer();
|
||||
*/
|
||||
Md5.prototype.arrayBuffer = function () {
|
||||
this.finalize();
|
||||
|
||||
var buffer = new ArrayBuffer(16);
|
||||
var blocks = new Uint32Array(buffer);
|
||||
blocks[0] = this.h0;
|
||||
blocks[1] = this.h1;
|
||||
blocks[2] = this.h2;
|
||||
blocks[3] = this.h3;
|
||||
return buffer;
|
||||
};
|
||||
|
||||
/**
|
||||
* @method buffer
|
||||
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||
* @memberof Md5
|
||||
* @instance
|
||||
* @description Output hash as ArrayBuffer
|
||||
* @returns {ArrayBuffer} ArrayBuffer
|
||||
* @see {@link md5.buffer}
|
||||
* @example
|
||||
* hash.buffer();
|
||||
*/
|
||||
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
||||
|
||||
/**
|
||||
* @method base64
|
||||
* @memberof Md5
|
||||
* @instance
|
||||
* @description Output hash as base64 string
|
||||
* @returns {String} base64 string
|
||||
* @see {@link md5.base64}
|
||||
* @example
|
||||
* hash.base64();
|
||||
*/
|
||||
Md5.prototype.base64 = function () {
|
||||
var v1, v2, v3, base64Str = '', bytes = this.array();
|
||||
for (var i = 0; i < 15;) {
|
||||
v1 = bytes[i++];
|
||||
v2 = bytes[i++];
|
||||
v3 = bytes[i++];
|
||||
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
||||
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
||||
BASE64_ENCODE_CHAR[v3 & 63];
|
||||
}
|
||||
v1 = bytes[i];
|
||||
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
||||
'==';
|
||||
return base64Str;
|
||||
};
|
||||
|
||||
var exports = createMethod();
|
||||
|
||||
if (COMMON_JS) {
|
||||
module.exports = exports;
|
||||
} else {
|
||||
/**
|
||||
* @method md5
|
||||
* @description Md5 hash function, export to global in browsers.
|
||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||
* @returns {String} md5 hashes
|
||||
* @example
|
||||
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||
*
|
||||
* // It also supports UTF-8 encoding
|
||||
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||
*
|
||||
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||
*/
|
||||
root.md5 = exports;
|
||||
if (AMD) {
|
||||
define(function () {
|
||||
return exports;
|
||||
});
|
||||
}
|
||||
}
|
||||
})();
|
||||
BIN
module/web/public/login/LOGO.png
Normal file
|
After Width: | Height: | Size: 478 KiB |
BIN
module/web/public/login/LOGO10.png
Normal file
|
After Width: | Height: | Size: 163 KiB |
BIN
module/web/public/login/LOGO11.png
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
module/web/public/login/LOGO12.png
Normal file
|
After Width: | Height: | Size: 382 KiB |
BIN
module/web/public/login/LOGO13.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
module/web/public/login/LOGO2.png
Normal file
|
After Width: | Height: | Size: 370 KiB |
BIN
module/web/public/login/LOGO3.png
Normal file
|
After Width: | Height: | Size: 285 KiB |
BIN
module/web/public/login/LOGO4.png
Normal file
|
After Width: | Height: | Size: 257 KiB |
BIN
module/web/public/login/LOGO5.png
Normal file
|
After Width: | Height: | Size: 198 KiB |
BIN
module/web/public/login/LOGO6.png
Normal file
|
After Width: | Height: | Size: 461 KiB |
BIN
module/web/public/login/LOGO7.png
Normal file
|
After Width: | Height: | Size: 162 KiB |
BIN
module/web/public/login/LOGO8.png
Normal file
|
After Width: | Height: | Size: 167 KiB |
BIN
module/web/public/login/LOGO9.png
Normal file
|
After Width: | Height: | Size: 154 KiB |
9
module/web/public/login/Login.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{"file":"Login.png","frames":{
|
||||
"login_wenzi2":{"x":1280,"y":1,"w":504,"h":24,"offX":0,"offY":0,"sourceW":504,"sourceH":24},
|
||||
"login_jdt_k":{"x":1,"y":1,"w":1277,"h":32,"offX":0,"offY":0,"sourceW":1277,"sourceH":32},
|
||||
"Login_guanbi":{"x":1835,"y":31,"w":26,"h":26,"offX":0,"offY":0,"sourceW":26,"sourceH":26},
|
||||
"login_wenzi1":{"x":1661,"y":31,"w":172,"h":18,"offX":0,"offY":0,"sourceW":172,"sourceH":18},
|
||||
"login_wenzi3":{"x":1,"y":35,"w":828,"h":41,"offX":0,"offY":0,"sourceW":828,"sourceH":41},
|
||||
"login_jdt_t":{"x":1,"y":78,"w":1266,"h":18,"offX":0,"offY":0,"sourceW":1266,"sourceH":18},
|
||||
"login_wenzi5":{"x":831,"y":35,"w":828,"h":41,"offX":0,"offY":0,"sourceW":828,"sourceH":41},
|
||||
"login_wenzi4":{"x":1786,"y":1,"w":244,"h":28,"offX":0,"offY":0,"sourceW":244,"sourceH":28}}}
|
||||
BIN
module/web/public/login/Login.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
14
module/web/public/login/SelectServer.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{"file":"SelectServer.png","frames":{
|
||||
"login_jinru1":{"x":237,"y":526,"w":234,"h":105,"offX":0,"offY":0,"sourceW":234,"sourceH":105},
|
||||
"login_qfbg":{"x":822,"y":187,"w":174,"h":48,"offX":0,"offY":0,"sourceW":174,"sourceH":48},
|
||||
"login_xzqf":{"x":822,"y":237,"w":132,"h":36,"offX":0,"offY":0,"sourceW":132,"sourceH":36},
|
||||
"login_xzqf1":{"x":822,"y":275,"w":130,"h":34,"offX":1,"offY":1,"sourceW":132,"sourceH":36},
|
||||
"login_yeqian_1":{"x":822,"y":65,"w":180,"h":59,"offX":0,"offY":0,"sourceW":180,"sourceH":59},
|
||||
"login_yeqian_2":{"x":822,"y":1,"w":179,"h":62,"offX":0,"offY":0,"sourceW":179,"sourceH":62},
|
||||
"login_bg3":{"x":1,"y":1,"w":819,"h":523,"offX":0,"offY":0,"sourceW":819,"sourceH":533},
|
||||
"login_bt_1":{"x":822,"y":126,"w":155,"h":59,"offX":0,"offY":0,"sourceW":155,"sourceH":59},
|
||||
"login_bt_2":{"x":473,"y":526,"w":228,"h":61,"offX":0,"offY":1,"sourceW":228,"sourceH":62},
|
||||
"login_dian_1":{"x":979,"y":152,"w":22,"h":24,"offX":0,"offY":0,"sourceW":22,"sourceH":24},
|
||||
"login_dian_2":{"x":998,"y":178,"w":22,"h":24,"offX":0,"offY":0,"sourceW":22,"sourceH":24},
|
||||
"login_dian_3":{"x":979,"y":126,"w":24,"h":24,"offX":0,"offY":0,"sourceW":24,"sourceH":24},
|
||||
"login_jinru":{"x":1,"y":526,"w":234,"h":108,"offX":0,"offY":0,"sourceW":234,"sourceH":108}}}
|
||||
BIN
module/web/public/login/SelectServer.png
Normal file
|
After Width: | Height: | Size: 721 KiB |
BIN
module/web/public/login/ageButton.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
module/web/public/login/enter_game.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
module/web/public/login/lOG_Honghu.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
module/web/public/login/loding.jpg
Normal file
|
After Width: | Height: | Size: 246 KiB |
BIN
module/web/public/login/loding.png
Normal file
|
After Width: | Height: | Size: 679 KiB |
BIN
module/web/public/login/loding_kf.jpg
Normal file
|
After Width: | Height: | Size: 248 KiB |
BIN
module/web/public/login/login_bg.jpg
Normal file
|
After Width: | Height: | Size: 381 KiB |
BIN
module/web/public/login/logoGameCat.png
Normal file
|
After Width: | Height: | Size: 478 KiB |
BIN
module/web/public/login/main_gonggaoBtn.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
module/web/public/login/mp_login_btn2.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
module/web/public/login/txt_kf.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
module/web/public/login/zjt1.png
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
BIN
module/web/public/login/zjt10.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
module/web/public/login/zjt11#.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
module/web/public/login/zjt2.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
module/web/public/login/zjt3.png
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
module/web/public/login/zjt4.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
module/web/public/login/zjt5.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
module/web/public/login/zjt8#.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
@@ -1,7 +1,7 @@
|
||||
<script setup>
|
||||
import {RouterView} from 'vue-router'
|
||||
import Loading from "./components/loading.vue";
|
||||
import {onMounted, reactive} from "vue";
|
||||
import {isMobile} from "@/utils";
|
||||
|
||||
const mainDiv = reactive({
|
||||
dataOrientation: "auto",
|
||||
@@ -10,74 +10,9 @@ const mainDiv = reactive({
|
||||
dataContentWidth: 1920,
|
||||
dataContentHeight: 1280,
|
||||
})
|
||||
let loadBar1Width = 0, loadBar2Width = 0, setIntervalId = 0;
|
||||
const loadBar2MaxWidth = 200;
|
||||
let loadError = false;
|
||||
|
||||
onMounted(() => {
|
||||
const loadBox = document.getElementById('loadBox'),
|
||||
logoImg = document.getElementById('logoImg'),
|
||||
loadBar1 = document.getElementById('loadBar1'),
|
||||
loadBar2 = document.getElementById('loadBar2');
|
||||
|
||||
function updateLoadBar() {
|
||||
if (loadError) {
|
||||
return;
|
||||
}
|
||||
const screenWidth = document.documentElement.scrollWidth || document.body.scrollWidth,
|
||||
screenHeight = document.documentElement.scrollHeight || document.body.scrollHeight,
|
||||
smallScreen = screenWidth <= 0,
|
||||
isHorizontal = isMobile() && screenHeight <= 590;
|
||||
if (loadBox) loadBox.style.paddingTop = (!isHorizontal ? (screenHeight / 4) : 50) + 'px';
|
||||
if (logoImg) logoImg.width = isHorizontal || smallScreen ? 300 : 500;
|
||||
if (loadBar1) {
|
||||
loadBar1Width += 20;
|
||||
if (loadBar1Width > 100) loadBar1Width = 0;
|
||||
loadBar1.style.width = loadBar1Width + '%';
|
||||
}
|
||||
if (loadBar2) {
|
||||
loadBar2Width += 3;
|
||||
if ((loadBar2Width / loadBar2MaxWidth * 100) > 100) {
|
||||
loadBarFull();
|
||||
} else {
|
||||
loadBar2.style.width = loadBar2Width + 'px';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function startLoadBar() {
|
||||
setIntervalId = self.setInterval(updateLoadBar, 100);
|
||||
}
|
||||
|
||||
window.loadBarFull = function () {
|
||||
if (loadBar2) loadBar2.style.width = loadBar2MaxWidth + 'px';
|
||||
}
|
||||
window.onload = function () {
|
||||
startLoadBar();
|
||||
if ((typeof (Worker) !== 'undefined')) {
|
||||
const s = document.createElement('script');
|
||||
s.type = 'text/javascript';
|
||||
s.async = false;
|
||||
s.addEventListener('load', function (e) {
|
||||
s.parentNode.removeChild(s);
|
||||
s.removeEventListener('load', e, false);
|
||||
}, false);
|
||||
s.src = 'js/index.js?v=' + Math.random();
|
||||
document.body.appendChild(s);
|
||||
} else {
|
||||
loadError = true;
|
||||
const errorMsg = `抱歉!您的浏览器不支持本游戏,请更换浏览器或前往官网 <span class="font_small"><a href="${getHttp() + location.host}" target="_blank" class="link_color">下载${isMobile() ? 'APP' : '微端'}</a></span> 进行游戏!`,
|
||||
label = document.getElementById('label');
|
||||
if (label) {
|
||||
label.innerHTML = errorMsg;
|
||||
} else {
|
||||
alert(filterHTML(errorMsg));
|
||||
}
|
||||
}
|
||||
}
|
||||
window.loadBarClear = function () {
|
||||
window.clearInterval(setIntervalId);
|
||||
}
|
||||
if (isMobile()) {
|
||||
mainDiv.dataOrientation = "landscape";
|
||||
mainDiv.dataScaleMode = "fixedHeight";
|
||||
@@ -98,11 +33,5 @@ onMounted(() => {
|
||||
<style scoped>
|
||||
#mainDiv {
|
||||
height: 100%;
|
||||
|
||||
#logDiv {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -1,42 +1,94 @@
|
||||
<script setup>
|
||||
import logoGameCat from "/resource_Publish/assets/login/logoGameCat.png"
|
||||
import {onMounted} from "vue";
|
||||
let loadBar1Width = 0, loadBar2Width = 0, setIntervalId = 0;
|
||||
const loadBar2MaxWidth = 200;
|
||||
let loadError = false;
|
||||
onMounted(()=>{
|
||||
const loadBox = document.getElementById('loadBox'),
|
||||
logoImg = document.getElementById('logoImg'),
|
||||
loadBar1 = document.getElementById('loadBar1'),
|
||||
loadBar2 = document.getElementById('loadBar2');
|
||||
|
||||
function updateLoadBar() {
|
||||
if (loadError) {
|
||||
return;
|
||||
}
|
||||
const screenWidth = document.documentElement.scrollWidth || document.body.scrollWidth,
|
||||
screenHeight = document.documentElement.scrollHeight || document.body.scrollHeight,
|
||||
smallScreen = screenWidth <= 0,
|
||||
isHorizontal = isMobile() && screenHeight <= 590;
|
||||
if (loadBox) loadBox.style.paddingTop = (!isHorizontal ? (screenHeight / 4) : 50) + 'px';
|
||||
if (logoImg) logoImg.width = isHorizontal || smallScreen ? 300 : 500;
|
||||
if (loadBar1) {
|
||||
loadBar1Width += 20;
|
||||
if (loadBar1Width > 100) loadBar1Width = 0;
|
||||
loadBar1.style.width = loadBar1Width + '%';
|
||||
}
|
||||
if (loadBar2) {
|
||||
loadBar2Width += 3;
|
||||
if ((loadBar2Width / loadBar2MaxWidth * 100) > 100) {
|
||||
loadBarFull();
|
||||
} else {
|
||||
loadBar2.style.width = loadBar2Width + 'px';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function startLoadBar() {
|
||||
setIntervalId = self.setInterval(updateLoadBar, 100);
|
||||
}
|
||||
|
||||
window.loadBarFull = function () {
|
||||
if (loadBar2) loadBar2.style.width = loadBar2MaxWidth + 'px';
|
||||
}
|
||||
window.onload = function () {
|
||||
startLoadBar();
|
||||
if ((typeof (Worker) !== 'undefined')) {
|
||||
const s = document.createElement('script');
|
||||
s.type = 'text/javascript';
|
||||
s.async = false;
|
||||
s.addEventListener('load', function (e) {
|
||||
s.parentNode.removeChild(s);
|
||||
s.removeEventListener('load', e, false);
|
||||
}, false);
|
||||
s.src = 'js/index.js?v=' + Math.random();
|
||||
document.body.appendChild(s);
|
||||
} else {
|
||||
loadError = true;
|
||||
const errorMsg = `抱歉!您的浏览器不支持本游戏,请更换浏览器或前往官网 <span class="font_small"><a href="${getHttp() + location.host}" target="_blank" class="link_color">下载${isMobile() ? 'APP' : '微端'}</a></span> 进行游戏!`,
|
||||
label = document.getElementById('label');
|
||||
if (label) {
|
||||
label.innerHTML = errorMsg;
|
||||
} else {
|
||||
alert(filterHTML(errorMsg));
|
||||
}
|
||||
}
|
||||
}
|
||||
window.loadBarClear = function () {
|
||||
window.clearInterval(setIntervalId);
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="logDiv" style="position:absolute; width: 100%; height: 100%;">
|
||||
<table align="center" id="loadBox" style="color: #b4792e; font-size: 20px; padding-top: 25px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<img id="logoImg" align="center" width="380" :src="logoGameCat"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="label" style="padding: 25px 35px 10px; text-align: center;">
|
||||
首次加载时间较长……请耐心等待,如长时间无响应 <span class="font_small"><a onClick="window.location.reload()" class="link_color">请点此刷新</a> / <a onClick="window.history.back()" class="link_color">点击返回</a></span>
|
||||
<br/>
|
||||
加载完成送:大量银两、超值礼包、白卡特权
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<div style="width: 200px; height: 6px; background-color: #ffffff;">
|
||||
<div id="loadBar1" style="width: 30px; height: 6px; background-color: #8E44AD; float: left"></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<div align="center" style="width: 200px; height: 6px; background-color: #ffffff;">
|
||||
<div id="loadBar2" style="width: 70px; height: 6px; background-color: #ff7700; float: left"></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div id="logDiv" style="position:absolute; top: 31%; left: 50%;transform: translate(-50%,-50%)">
|
||||
<div style="display: flex;flex-direction: column; align-items: center;gap: 4px;justify-content: center">
|
||||
<img id="logoImg" align="center" width="380" src="/login/logo.png" class="mb-20"/>
|
||||
<div id="label" style="color: #b4792e; font-size: 20px;">
|
||||
首次加载时间较长……请耐心等待,如长时间无响应 <span class="font_small">
|
||||
<a onClick="window.location.reload()" class="link_color">请点此刷新</a> /
|
||||
<a onClick="window.history.back()" class="link_color">点击返回</a></span>
|
||||
</div>
|
||||
<div align="center" style="width: 200px; height: 6px; background-color: #ffffff;">
|
||||
<div id="loadBar1" style="width: 30px; height: 6px; background-color: #8E44AD; float: left"></div>
|
||||
</div>
|
||||
<div align="center" style="width: 200px; height: 6px; background-color: #ffffff;">
|
||||
<div id="loadBar2" style="width: 70px; height: 6px; background-color: #ff7700; float: left"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -3,7 +3,6 @@ import './style.css'
|
||||
import App from './App.vue'
|
||||
import router from './router/index.js'
|
||||
|
||||
// window.external?.OpenGameWindowNew(window.location.href, '', '', '', false);
|
||||
document.onkeydown = document.onkeyup = document.onkeypress = function (e) {
|
||||
if (e && e.keyCode == 123) {
|
||||
e.returnValue = false;
|
||||
@@ -12,10 +11,5 @@ document.onkeydown = document.onkeyup = document.onkeypress = function (e) {
|
||||
}
|
||||
const app = createApp(App)
|
||||
|
||||
fetch("/api/config", {method: "GET"}).then(res => res.json()).then(res => {
|
||||
console.log(res)
|
||||
app.config.globalProperties.$gameName = res.data.gameName || "神临苍月";
|
||||
app.config.globalProperties.$_CONFIG = res.data;
|
||||
app.use(router)
|
||||
app.mount('#app')
|
||||
})
|
||||
app.use(router)
|
||||
app.mount('#app')
|
||||
|
||||
@@ -6,7 +6,8 @@ const routes = [
|
||||
{
|
||||
path: '/',
|
||||
name: 'Home',
|
||||
component: Index
|
||||
component: Index,
|
||||
redirect: '/login'
|
||||
},
|
||||
{
|
||||
path: '/login', name: 'Login',
|
||||
|
||||
10
module/web/src/utils/request.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import axios from "axios";
|
||||
|
||||
const ins = axios.create({
|
||||
baseURL: '/',
|
||||
timeout: 10000,
|
||||
})
|
||||
ins.interceptors.request.use(config => {
|
||||
return config
|
||||
})
|
||||
export default ins
|
||||
@@ -1,5 +1,6 @@
|
||||
<script setup>
|
||||
import {defineOptions} from "vue";
|
||||
import {defineOptions, onMounted, ref} from "vue";
|
||||
import request from "@/utils/request";
|
||||
|
||||
defineOptions({name: 'Login'});
|
||||
|
||||
@@ -11,12 +12,20 @@ function handleLogin() {
|
||||
|
||||
}
|
||||
|
||||
async function getServers() {
|
||||
const {data} = await request.get('/api/server/list')
|
||||
servers.value = data.data
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getServers()
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="wrapper pagebg">
|
||||
<div class="dialog account" id="account-login">
|
||||
<h2 class="title">{{ $gameName }}</h2>
|
||||
<h2 class="title">神临苍月</h2>
|
||||
<input type="text" id="account" v-model="account" placeholder="请输入账号" @keyup="v=>account=v.replace(/[\W]/g, '')" autocomplete="off"/>
|
||||
<input type="password" id="password" v-model="password" placeholder="请输入密码"/>
|
||||
<select id="serverId" style="border: none; display: none; margin-bottom: 10px;">
|
||||
@@ -24,8 +33,8 @@ function handleLogin() {
|
||||
<option v-for="item in servers" :value="item.id">{{ item.name }}区</option>
|
||||
</select>
|
||||
<div id="agree" class="agree">
|
||||
<span><img data-v-427e1e01=""
|
||||
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAVFBMVEWeICicICedISidISibIiadISeeISiOOTmdISeeISj///+aGSGcHiT68vOYFByhKjHRmZzqz9CzVlvx4OG4YWXJh4qpPUPkw8WkMjjdsrS/cXatR00P5JiiAAAACnRSTlPuTT//Gq+6A9iEOAr7KAAAAbBJREFUSMeVlte2gyAQRTHYcBBQiu3///OOMdZALvCUrHX2mYYAqao8Y2VN/l11ybK8qkiVv1hR04hVF+yVVwT1NaFRi9RIkIzVNHrVLCOsIPEAKRgpEwJgiJIk6ZEgUQlxAP5JKhLgnCYAHOg4ygQAwBnjEIsDAEDOSvUgooHRTHowkQCseqWbLh546wPA2e6r/4T6xp8SP/t9+M9vfQCQEtt9MnDqfSlxLpfe9OMVcLveB6x2StllG9D6n5/6dvqeg4BFaT3M46eQm76zywPgHAMMTaOVkQAf/6Hd9QpTvW8N4LJf+41ETwEbzJ296uVzewtwtnsLMDoVgi53PcADAGmmTdAO1gnxpb9H4HtCW0dmF/A/AOz4ocAyJqv8/geALbXdrm9a3Wm//xlh7Xl7EvvPp/+1hgWndCIB/+ukpTOXMgL+90nLxd6CePyvEfDjoc6orv3l//ge8Hjo7aB/+D8BgWnN2wD9/l+HAO65cU2rDfh7ANy1WHs3+P19x8y6sWdrzejz9wOCusWN1OcfOMg4B786CGC7QgRJv7KSL8Xkazf5Yk9+OiQ/TlKfP3/iYTk/HuYxLgAAAABJRU5ErkJggg=="></span>
|
||||
<span><img
|
||||
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAVFBMVEWeICicICedISidISibIiadISeeISiOOTmdISeeISj///+aGSGcHiT68vOYFByhKjHRmZzqz9CzVlvx4OG4YWXJh4qpPUPkw8WkMjjdsrS/cXatR00P5JiiAAAACnRSTlPuTT//Gq+6A9iEOAr7KAAAAbBJREFUSMeVlte2gyAQRTHYcBBQiu3///OOMdZALvCUrHX2mYYAqao8Y2VN/l11ybK8qkiVv1hR04hVF+yVVwT1NaFRi9RIkIzVNHrVLCOsIPEAKRgpEwJgiJIk6ZEgUQlxAP5JKhLgnCYAHOg4ygQAwBnjEIsDAEDOSvUgooHRTHowkQCseqWbLh546wPA2e6r/4T6xp8SP/t9+M9vfQCQEtt9MnDqfSlxLpfe9OMVcLveB6x2StllG9D6n5/6dvqeg4BFaT3M46eQm76zywPgHAMMTaOVkQAf/6Hd9QpTvW8N4LJf+41ETwEbzJ296uVzewtwtnsLMDoVgi53PcADAGmmTdAO1gnxpb9H4HtCW0dmF/A/AOz4ocAyJqv8/geALbXdrm9a3Wm//xlh7Xl7EvvPp/+1hgWndCIB/+ukpTOXMgL+90nLxd6CePyvEfDjoc6orv3l//ge8Hjo7aB/+D8BgWnN2wD9/l+HAO65cU2rDfh7ANy1WHs3+P19x8y6sWdrzejz9wOCusWN1OcfOMg4B786CGC7QgRJv7KSL8Xkazf5Yk9+OiQ/TlKfP3/iYTk/HuYxLgAAAABJRU5ErkJggg=="></span>
|
||||
我已阅读并同意 <a href="javascript:void(0);" id="agree_btn">用户协议及隐私协议</a>
|
||||
</div>
|
||||
<a id="submitButton" class="button fit" @click="handleLogin">登 录</a>
|
||||
@@ -46,7 +55,7 @@ function handleLogin() {
|
||||
|
||||
<style scoped>
|
||||
.gamebg {
|
||||
background-image: url("/img/login_bg.jpg");
|
||||
background-image: url("/login/login_bg.jpg");
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -2,7 +2,6 @@ import { defineConfig } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
import * as path from "node:path";
|
||||
|
||||
// https://vite.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [vue()],
|
||||
resolve: {
|
||||
|
||||