feat(static): 同步 v8 前端静态资源

同步 v8 运行所需的公开静态资源与主题样式,保留目标仓库中需要跟踪的发布产物。

主要内容:

- 更新登录页、控制台主题、布局变量和短工具类样式。

- 同步 layui、ckeditor、editor、jquery area 等前端依赖文件。

- 移除 v6 admin/require 静态入口,改为 v8 static/system 资源组织。

- 保留测试依赖的 public/static/theme 编译结果,确保目标仓库可直接验证。
This commit is contained in:
Anyon 2026-05-08 15:30:57 +08:00
parent e634118a22
commit 27ad3ff7ce
34 changed files with 3089 additions and 1869 deletions

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
// +----------------------------------------------------------------------
// | 官方网站: https://thinkadmin.top
// +----------------------------------------------------------------------
// | 版权所有 2014~2024 ThinkAdmin [ thinkadmin.top ]
// | 版权所有 2014~2025 ThinkAdmin [ thinkadmin.top ]
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// | 免责声明 ( https://thinkadmin.top/disclaimer )
@ -11,7 +11,7 @@
// | gitee 代码仓库https://gitee.com/zoujingli/think-plugs-static
// | github 代码仓库https://github.com/zoujingli/think-plugs-static
// +----------------------------------------------------------------------
// | 自定义后台扩展脚本,需要在加载 admin.js 后载入
// | 自定义后台扩展脚本,需要在加载 system.js 后载入
// | 使用 composer require zoujingli/think-plugs-static 时不会更新此文件
// +----------------------------------------------------------------------
@ -23,18 +23,8 @@ $(function () {
// console.log('Event.reInit', $dom);
// });
/*! 追加 require 配置参数
/*! 加载的文件不能与主配置重复 */
// require.config({
// paths: {
// 'vue': ['plugs/vue/vue.min'],
// },
// shim: {
// 'vue': ['json']
// },
// });
// // 基于 Require 加载测试
// require(['vue', 'md5'], function (vue, md5) {
/*! 追加模块加载示例 */
// $.module.use(['vue', 'md5'], function (vue, md5) {
// console.log(vue)
// console.log(md5.hash('content'))
// });
@ -45,4 +35,12 @@ $(function () {
window.showTableImage = function (image, circle, size, title) {
return $.layTable.showImage(image, circle, size, title);
};
});
// 显示商品规格
window.showSpec = function (spec) {
let names = [];
return layui.each(spec.split(';;'), function (i, vv) {
names.push(vv.split('::').pop());
}), names.join(' ');
}
});

View File

@ -3,7 +3,7 @@
/* +----------------------------------------------------------------------
/* | 官方网站: https://thinkadmin.top
/* +----------------------------------------------------------------------
/* | 版权所有 2014~2024 ThinkAdmin [ thinkadmin.top ]
/* | 版权所有 2014~2025 ThinkAdmin [ thinkadmin.top ]
/* +----------------------------------------------------------------------
/* | 开源协议 ( https://mit-license.org )
/* | 免责声明 ( https://thinkadmin.top/disclaimer )

View File

@ -1,8 +1,25 @@
// +----------------------------------------------------------------------
// | Static Plugin for ThinkAdmin
// +----------------------------------------------------------------------
// | 版权所有 2014~2024 ThinkAdmin [ thinkadmin.top ]
// +----------------------------------------------------------------------
// | 官方网站: https://thinkadmin.top
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// | 免责声明 ( https://thinkadmin.top/disclaimer )
// +----------------------------------------------------------------------
// | gitee 代码仓库https://gitee.com/zoujingli/think-plugs-static
// | github 代码仓库https://github.com/zoujingli/think-plugs-static
// +----------------------------------------------------------------------
$(function () {
window.$body = $('body');
let loginI18n = window.taLoginI18n || {};
function t(key, fallback) {
return typeof loginI18n[key] === 'string' && loginI18n[key].length > 0 ? loginI18n[key] : fallback;
}
/*! 登录界面背景切换 */
$('[data-bg-transition]').each(function (i, el) {
@ -21,43 +38,316 @@ $(function () {
});
});
/*! 后台加密登录处理 */
let ambientFrame = 0, ambientPoint = {
x: Math.round(window.innerWidth * 0.78),
y: Math.round(window.innerHeight * 0.22)
};
function paintAmbient() {
ambientFrame = 0;
$('.login-container').css({
'--cursor-x': ambientPoint.x + 'px',
'--cursor-y': ambientPoint.y + 'px'
});
}
function queueAmbient(x, y) {
ambientPoint.x = x;
ambientPoint.y = y;
if (ambientFrame) return;
ambientFrame = (window.requestAnimationFrame || window.setTimeout)(paintAmbient, 16);
}
queueAmbient(ambientPoint.x, ambientPoint.y);
$(document).on('mousemove touchmove', function (event) {
let point = event.touches && event.touches[0] ? event.touches[0] : event;
queueAmbient(point.clientX, point.clientY);
});
$(window).on('resize', function () {
queueAmbient(Math.round(window.innerWidth * 0.78), Math.round(window.innerHeight * 0.22));
});
function decodeBase64ToArrayBuffer(value) {
let binary = atob(value), bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
return bytes.buffer;
}
function encodeArrayBufferToBase64(buffer) {
let bytes = new Uint8Array(buffer), binary = '';
for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);
return btoa(binary);
}
async function encryptPassword(form, password) {
let publicKey = form.dataset.loginPasswordKey || '';
if (!publicKey || !window.crypto || !window.crypto.subtle || typeof TextEncoder === 'undefined' || window.isSecureContext === false) {
return {mode: 'plain', value: password};
}
try {
// PHP openssl_private_decrypt with OAEP padding only interoperates with the SHA-1 variant here.
let key = await window.crypto.subtle.importKey(
'spki',
decodeBase64ToArrayBuffer(publicKey),
{name: 'RSA-OAEP', hash: 'SHA-1'},
false,
['encrypt']
);
let result = await window.crypto.subtle.encrypt({name: 'RSA-OAEP'}, key, new TextEncoder().encode(password));
return {mode: 'rsa', value: encodeArrayBufferToBase64(result)};
} catch (e) {
return {mode: 'plain', value: password};
}
}
function reloadLoginPage() {
try {
let url = new URL(location.href);
url.hash = '';
url.searchParams.set('_login_reload', String(Date.now()));
location.replace(url.toString());
} catch (e) {
location.href = location.pathname + '?_login_reload=' + Date.now();
}
}
function createLoginSlider(form) {
let $form = $(form), $container = $form.closest('.login-container');
let $popup = $container.find('[data-login-slider-popup]');
let $panel = $popup.find('[data-login-slider-panel]');
if ($panel.length < 1) {
return {
syncError: $.noop,
ensureVerified: function () {
return true;
}
};
}
let $bg = $panel.find('[data-slider-bg]');
let $piece = $panel.find('[data-slider-piece]');
let $stage = $panel.find('.slider-stage');
let $track = $panel.find('[data-slider-track]');
let $message = $panel.find('[data-slider-message]');
let $status = $panel.find('[data-slider-status]');
let $handle = $panel.find('[data-slider-handle]');
let $refresh = $panel.find('[data-slider-refresh]');
let $uniqid = $form.find('[name="uniqid"]');
let $verify = $form.find('[name="verify"]');
let $mode = $form.find('[name="password_mode"]');
let request = form.dataset.loginSlider || '';
let check = form.dataset.loginCheck || '';
let state = {
bgWidth: 0,
currentLeft: 0,
dragging: false,
loaded: false,
maxLeft: 0,
originX: 0,
pieceWidth: 100,
required: false,
sourceWidth: 600,
startLeft: 0,
verified: false,
working: false,
};
function setStatus(text, type) {
$panel.removeClass('is-error is-success');
type && $panel.addClass(type);
$message.text(text);
$status.text(text);
}
function setPosition(left) {
state.currentLeft = Math.max(0, Math.min(left, state.maxLeft));
$handle.css('left', state.currentLeft + 'px');
$track.css('width', (state.currentLeft + $handle.outerWidth()) + 'px');
$piece.css('left', state.currentLeft + 'px');
}
function recalculate() {
state.bgWidth = $stage.innerWidth();
state.maxLeft = Math.max(state.bgWidth - $handle.outerWidth(), 0);
$piece.css('width', (state.pieceWidth / state.sourceWidth * 100) + '%');
setPosition(state.currentLeft);
}
function resetChallenge() {
state.verified = false;
state.working = false;
$uniqid.val('');
$verify.val('');
$panel.removeClass('is-error is-success');
setPosition(0);
setStatus(t('dragToVerify', '请按住滑块,拖动完成验证'));
}
function hideChallenge() {
$popup.removeClass('is-visible');
$body.removeClass('login-verify-active');
window.setTimeout(function () {
if (!$popup.hasClass('is-visible')) {
$popup.addClass('layui-hide');
}
}, 220);
}
function loadChallenge() {
if (request.length < 5) return $.msg.tips(t('sliderApiMissing', '请设置滑块验证接口'));
resetChallenge();
let handleChallenge = function (ret) {
if (parseInt(ret.code, 10) !== 200) {
ret.data && ret.data.reload && reloadLoginPage();
return false;
}
state.sourceWidth = parseInt(ret.data.width || 600);
state.pieceWidth = parseInt(ret.data.piece_width || 100);
state.loaded = true;
$uniqid.val(ret.data.uniqid || '');
$bg.attr('src', ret.data.bgimg || '');
$piece.attr('src', ret.data.water || '');
(window.requestAnimationFrame || window.setTimeout)(recalculate, 0);
setStatus(t('dragToVerify', '请按住滑块,拖动完成验证'));
return false;
};
handleChallenge.allowHttpError = true;
$.form.load(request, {token: form.dataset.loginToken || ''}, 'post', handleChallenge, false);
}
function showChallenge(refresh) {
state.required = true;
$popup.removeClass('layui-hide');
$body.addClass('login-verify-active');
(window.requestAnimationFrame || window.setTimeout)(function () {
$popup.addClass('is-visible');
recalculate();
}, 0);
if (refresh || !$uniqid.val()) loadChallenge();
}
function verifyCurrentPosition() {
if (state.working || !$uniqid.val() || check.length < 5) return;
state.working = true;
setStatus(t('verifying', '正在校验...'));
$.form.load(check, {
uniqid: $uniqid.val(),
verify: Math.round(state.currentLeft * state.sourceWidth / Math.max(state.bgWidth, 1))
}, 'post', function (ret) {
state.working = false;
let value = Math.round(state.currentLeft * state.sourceWidth / Math.max(state.bgWidth, 1));
let result = parseInt(ret.data && ret.data.state || -1);
if (result === 1) {
state.verified = true;
state.required = false;
$verify.val(String(value));
$panel.removeClass('is-error').addClass('is-success');
$message.text(t('verifyPassedContinue', '验证通过,请继续登录'));
$status.text(t('sliderVerified', '滑块验证通过'));
window.setTimeout(hideChallenge, 260);
} else if (result === 0) {
state.verified = false;
state.required = true;
$verify.val('');
$panel.removeClass('is-success').addClass('is-error');
$message.text(t('wrongPositionRetry', '位置不正确,请重试'));
$status.text(t('wrongPositionRetry', '位置不正确,请重试'));
window.setTimeout(function () {
if (!state.verified) {
$panel.removeClass('is-error');
setPosition(0);
setStatus(t('dragToVerify', '请按住滑块,拖动完成验证'));
}
}, 500);
} else {
loadChallenge();
}
return false;
}, false);
}
function getPoint(event) {
return event.touches && event.touches[0] ? event.touches[0] : event;
}
function startDrag(event) {
if (state.working || state.verified || !$uniqid.val()) return;
let point = getPoint(event);
state.dragging = true;
state.originX = point.clientX;
state.startLeft = state.currentLeft;
$handle.addClass('is-active');
event.preventDefault();
}
function moveDrag(event) {
if (!state.dragging) return;
let point = getPoint(event);
setPosition(state.startLeft + point.clientX - state.originX);
event.preventDefault();
}
function endDrag() {
if (!state.dragging) return;
state.dragging = false;
$handle.removeClass('is-active');
verifyCurrentPosition();
}
$bg.on('load', recalculate);
$(window).on('resize', recalculate);
$handle.on('mousedown touchstart', startDrag);
$(document).on('mousemove touchmove', moveDrag);
$(document).on('mouseup touchend touchcancel', endDrag);
$refresh.on('click', function () {
showChallenge(true);
});
return {
syncError: function (data) {
if (data && data.need_verify) {
state.verified = false;
state.required = true;
showChallenge(!!data.refresh_verify);
}
},
ensureVerified: function () {
if (state.required && !state.verified) {
showChallenge(false);
$.msg.tips(t('needVerifyFirst', '请先完成滑块验证'));
return false;
}
$mode.val('plain');
return true;
},
setPasswordMode: function (mode) {
$mode.val(mode);
}
};
}
/*! 后台登录提交处理 */
$body.find('form[data-login-form]').each(function (idx, form) {
require(['md5'], function (md5) {
$(form).vali(function (data) {
data['password'] = md5.hash(md5.hash(data['password']) + data['uniqid']);
$.form.load(location.href, data, "post", function (ret) {
if (parseInt(ret.code) !== 1) {
$(form).find('[data-captcha]').trigger('click');
$(form).find('.verify.layui-hide').removeClass('layui-hide');
let slider = createLoginSlider(form);
$(form).vali(function (data) {
if (!slider.ensureVerified()) return false;
encryptPassword(form, data.password || '').then(function (cipher) {
let payload = $.extend({}, data, {password: cipher.value, password_mode: cipher.mode});
slider.setPasswordMode(cipher.mode);
let handleSubmit = function (ret) {
if (parseInt(ret.code, 10) !== 200) {
if (ret.data && ret.data.reload) {
reloadLoginPage();
return false;
}
slider.syncError(ret.data || {});
return false;
}
}, null, null, 'false');
};
handleSubmit.allowHttpError = true;
$.form.load(location.href, payload, "post", handleSubmit, null, null, 'false');
});
});
});
/*! 登录图形验证码刷新 */
$body.on('click', '[data-captcha]', function () {
let $that = $(this), $form = $that.parents('form');
let action = this.dataset.captcha || location.href;
if (action.length < 5) return $.msg.tips('请设置验证码请求及验证地址');
let type = this.dataset.captchaType || 'captcha-type', token = this.dataset.captchaToken || 'captcha-token';
let uniqid = this.dataset.fieldUniqid || 'captcha-uniqid', verify = this.dataset.fieldVerify || 'captcha-verify';
$.form.load(action, {type: type, token: token}, 'post', function (ret) {
if (ret.code) {
// 每六分钟自动刷新验证码
$that.attr('timer') && clearTimeout($that.attr('timer'));
$that.attr('timer', setTimeout(() => $that.trigger('click'), 350000));
$that.html('<img alt="img" src="' + ret.data.image + '"><input type="hidden">').find('input').attr('name', uniqid).val(ret.data.uniqid || '');
$form.find('[name="' + verify + '"]').attr('value', ret.data.code || '').val(ret.data.code || '');
return (ret.data.code || $form.find('.verify.layui-hide').removeClass('layui-hide')), false;
}
}, false);
});
/*! 初始化登录图形 */
$('[data-captcha]').map(function () {
$(this).trigger('click');
});
});
});

View File

@ -1,207 +0,0 @@
// +----------------------------------------------------------------------
define(function () {
/*! 定义构造函数 */
function Excel(data, name) {
if (data && name) this.export(data, name);
}
/*! 默认导出配置 */
Excel.prototype.options = {writeOpt: {bookSST: false}};
/*! 导出 Excel 文件 */
Excel.prototype.export = function (data, name, options) {
name = name || '数据导出_' + layui.util.toDateString(Date.now(), '_yyyyMMdd_HHmmss');
if (name.substring(0, -5).toLowerCase() !== '.xlsx') name += '.xlsx';
layui.excel.exportExcel(data, name, 'xlsx', $.extend(options || {}, this.options));
};
/*! 绑定导出的事件 */
// <a data-form-export>通用导出</a>
// <a data-form-export="URL链接">指定链接导出</a>
// <!-- 自定义导出 Excel 文件 -->
// <a id="EXPORT1" data-excel="URL链接">自定义导出1</a>
// <a id="EXPORT2" data-excel="URL链接">自定义导出2</a>
// <script>
// Excel.bind(DONE1,FILENAME1,'#EXPORT1')
// Excel.bind(DONE2,FILENAME2,'#EXPORT2')
// </script>
Excel.prototype.bind = function (done, filename, selector, options) {
let that = this;
this.options = $.extend(this.options, options || {});
this.bindLoadDone(function (data, button) {
that.export(done.call(that, data, []), button.dataset.filename || filename);
}, selector);
};
/*! 加载所有数据 */
Excel.prototype.bindLoadDone = function (done, selector) {
let that = this;
$('body').off('click', selector || '[data-form-export]').on('click', selector || '[data-form-export]', function () {
let button = this, form = $(this).parents('form');
let method = this.dataset.method || form.attr('method') || 'get';
let location = this.dataset.excel || this.dataset.formExport || form.attr('action') || '';
let sortType = $(this).attr('data-sort-type') || '', sortField = $(this).attr('data-sort-field') || '';
if (sortField.length > 0 && sortType.length > 0) {
location += (location.indexOf('?') > -1 ? '&' : '?') + '_order_=' + sortType + '&_field_=' + sortField;
}
that.load(location, form.serialize(), method).then((data) => done.call(that, data, button)).fail(function (ret) {
$.msg.tips(ret || '数据加载失败');
});
});
}
/*! 加载导出的文档 */
Excel.prototype.load = function (url, data, method) {
return (function (defer, lists, loaded) {
loaded = $.msg.loading('正在加载 <span data-upload-count>0.00</span>%');
return (lists = []), LoadNextPage(1, 1), defer;
function LoadNextPage(curPage, maxPage, urlParams) {
let proc = (curPage / maxPage * 100).toFixed(2);
$('[data-upload-count]').html(proc > 100 ? '100.00' : proc);
if (curPage > maxPage) return $.msg.close(loaded), defer.resolve(lists);
urlParams = (url.indexOf('?') > -1 ? '&' : '?') + 'output=json&not_cache_limit=1&limit=100&page=' + curPage;
$.form.load(url + urlParams, data, method, function (ret) {
if (ret.code) {
lists = lists.concat(ret.data.list);
if (ret.data.page) LoadNextPage((ret.data.page.current || 1) + 1, ret.data.page.pages || 1);
} else {
defer.reject('数据加载异常');
}
return false;
}, false);
}
})($.Deferred());
};
/*! 设置表格导出样式 */
// this.withStyle(data, {A: 60, B: 80, C: 99, E: 120, G: 120}, 99, 28)
Excel.prototype.withStyle = function (data, colsWidth, defaultWidth, defaultHeight) {
// 自动计算列序
let idx, colN = 0, defaC = {}, lastCol;
for (idx in data[0]) defaC[lastCol = layui.excel.numToTitle(++colN)] = defaultWidth || 99;
defaC[lastCol] = 160;
// 设置表头样式
layui.excel.setExportCellStyle(data, 'A1:' + lastCol + '1', {
s: {
font: {sz: 12, bold: true, color: {rgb: "FFFFFF"}, name: '微软雅黑', shadow: true},
fill: {bgColor: {indexed: 64}, fgColor: {rgb: '5FB878'}},
alignment: {vertical: 'center', horizontal: 'center'}
}
});
// 设置内容样式
(function (style1, style2) {
layui.excel.setExportCellStyle(data, 'A2:' + lastCol + data.length, {s: style1}, function (rawCell, newCell, row, config, curRow) {
typeof rawCell !== 'object' && (rawCell = {v: rawCell});
rawCell.s = Object.assign({}, style2, rawCell.s || {});
return (curRow % 2 === 0) ? newCell : rawCell;
});
})({
font: {sz: 10, shadow: true, name: '微软雅黑'},
fill: {bgColor: {indexed: 64}, fgColor: {rgb: "EAEAEA"}},
alignment: {vertical: 'center', horizontal: 'center'}
}, {
font: {sz: 10, shadow: true, name: '微软雅黑'},
fill: {bgColor: {indexed: 64}, fgColor: {rgb: "FFFFFF"}},
alignment: {vertical: 'center', horizontal: 'center'}
});
// 设置表格行宽高,需要设置最后的行或列宽高,否则部分不生效
let rowsC = {1: 33}, colsC = Object.assign({}, defaC, {A: 60}, colsWidth || {});
rowsC[data.length] = defaultHeight || 28, this.options.extend = Object.assign({}, {
'!cols': layui.excel.makeColConfig(colsC, defaultWidth || 99),
'!rows': layui.excel.makeRowConfig(rowsC, defaultHeight || 28),
}, this.options.extend || {});
return data;
}
/*! 直接推送表格内容 */
// url 记录推送地址
// sheet 表格 Sheet 名称
// cols { _: 1, 表头名1: 字段名1, 表头名2: 字段名2 },其中字段 _ 配置起始行
// filter 数据过滤处理,如果返回 false 不上传记录
// Excel.push(ACTION, '用户信息', {_:1, username: "用户名称", phone: "联系手机"})
Excel.prototype.push = function (url, sheet, cols, filter) {
let loaded, $input;
$input = $('<input class="layui-hide" type="file" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">');
$input.appendTo($('body')).click().on('change', function (event) {
if (!event.target.files || event.target.files.length < 1) return $.msg.tips('没有可操作文件');
loaded = $.msg.loading('<span data-load-name>读取</span> <span data-load-count>0.00%</span>');
try {
// 导入Excel数据并逐行上传处理
layui.excel.importExcel(event.target.files, {}, function (data) {
if (!data[0][sheet]) return $.msg.tips('未读取到表[' + sheet + ']的数据');
let _cols = {}, _data = data[0][sheet], items = [], row, col, key, item;
for (row in _data) if (parseInt(row) + 1 === parseInt(cols._ || '1')) {
for (col in _data[row]) for (key in cols) if (_data[row][col] === cols[key]) _cols[key] = col;
} else if (parseInt(row) + 1 > cols._ || 1) {
item = {};
for (key in _cols) item[key] = CellToValue(_data[row][_cols[key]]);
items.push(item);
}
PushQueue(items, items.length, 0, 0, 1);
});
} catch (e) {
$.msg.error('读取 Excel 文件失败!')
}
});
/*! 单项推送数据 */
function PushQueue(items, total, ers, oks, idx) {
if ((total = items.length) < 1) return CleanAll(), $.msg.tips('未读取到有效数据');
return (ers = 0, oks = 0, idx = 0), $('[data-load-name]').html('更新'), DoPostItem(idx, items[idx]);
/*! 执行导入的数据 */
function DoPostItem(idx, item, data) {
if (idx >= total) {
return CleanAll(), $.msg.success('共处理' + total + '条记录( 成功 ' + oks + ' 条, 失败 ' + ers + ' 条 ', 3, function () {
$.form.reload();
});
} else {
let proc = (idx * 100 / total).toFixed(2);
$('[data-load-count]').html((proc > 100 ? '100.00' : proc) + '% 成功 ' + oks + ' 条, 失败 ' + ers + ' 条 ');
/*! 单元数据过滤 */
data = item;
if (filter && (data = filter(item)) === false) {
return (ers++), DoPostItem(idx + 1, items[idx + 1]);
}
/*! 提交单个数据 */
DoUpdate(url, data).then(function (ret) {
(ret.code ? oks++ : ers++), DoPostItem(idx + 1, items[idx + 1]);
});
}
}
}
/*! 清理文件选择器 */
function CleanAll() {
$input.remove();
if (loaded) $.msg.close(loaded);
}
/*! 表格单元内容转换 */
function CellToValue(v) {
if (typeof v !== 'undefined' && /^\d+\.\d{12}$/.test(v)) {
return LAY_EXCEL.dateCodeFormat(v, 'YYYY-MM-DD HH:ii:ss');
} else {
return typeof v !== 'undefined' ? v : '';
}
}
/*! 队列方式上传数据 */
function DoUpdate(url, item) {
return (function (defer) {
return $.form.load(url, item, 'post', function (ret) {
return defer.resolve(ret), false;
}, false), defer.promise();
})($.Deferred());
}
}
/*! 返回对象实例 */
return new Excel;
});

View File

@ -1,89 +0,0 @@
// +----------------------------------------------------------------------
define(function () {
let template = '<div class="padding-30 padding-bottom-0" data-queue-load="{{d.code}}"><div class="layui-elip notselect nowrap" data-message-title><b class="color-desc">...</b></div><div class="margin-top-15 layui-progress layui-progress-big" lay-showPercent="yes"><div class="layui-progress-bar transition" lay-percent="0.00%"></div></div>' + '<div class="margin-top-15"><code class="layui-textarea layui-bg-black border-0" style="resize:none;overflow:hidden;height:190px"></code></div></div>';
return Queue;
function Queue(code, doScript, element) {
let queue = this;
(this.doAjax = true) && (this.doReload = false) || layer.open({
type: 1, title: false, area: ['560px', '318px'], anim: 2, shadeClose: false, end: function () {
queue.doAjax = queue.doReload && doScript && $.layTable.reload(((element || {}).dataset || {}).tableId || true) && false;
}, content: laytpl(template).render({code: code}), success: function ($elem) {
new Progress($elem, code, queue, doScript);
}
});
}
function Progress($elem, code, queue, doScript) {
let that = this;
this.$box = $elem.find('[data-queue-load=' + code + ']');
if (queue.doAjax === false || this.$box.length < 1) return false;
this.$code = this.$box.find('code');
this.$title = this.$box.find('[data-message-title]');
this.$percent = this.$box.find('.layui-progress div');
// 设置数据缓存
this.SetCache = function (code, index, value) {
let ckey = code + '_' + index, ctype = 'admin-queue-script';
return value !== undefined ? layui.data(ctype, {key: ckey, value: value}) : layui.data(ctype)[ckey] || 0;
};
// 更新任务显示状态
this.SetState = function (status, message) {
if (message.indexOf('javascript:') === -1) if (status === 1) {
that.$title.html('<b class="color-text">' + message + '</b>').addClass('text-center');
that.$percent.addClass('layui-bg-blue').removeClass('layui-bg-green layui-bg-red');
} else if (status === 2) {
if (message.indexOf('>>>') > -1) {
that.$title.html('<b class="color-blue">' + message + '</b>').addClass('text-center');
} else {
that.$title.html('<b class="color-blue">正在处理:</b>' + message).removeClass('text-center');
}
that.$percent.addClass('layui-bg-blue').removeClass('layui-bg-green layui-bg-red');
} else if (status === 3) {
queue.doReload = true;
that.$title.html('<b class="color-green">' + message + '</b>').addClass('text-center');
that.$percent.addClass('layui-bg-green').removeClass('layui-bg-blue layui-bg-red');
} else if (status === 4) {
that.$title.html('<b class="color-red">' + message + '</b>').addClass('text-center');
that.$percent.addClass('layui-bg-red').removeClass('layui-bg-blue layui-bg-green');
}
};
// 读取任务进度信息
this.LoadProgress = function () {
if (queue.doAjax === false || that.$box.length < 1) return false;
$.form.load(tapiRoot + '/api.queue/progress', {code: code}, 'post', function (ret) {
if (ret.code) {
let lines = [];
for (let idx in ret.data.history) {
let line = ret.data.history[idx], percent = '[ ' + line.progress + '% ] ';
if (line.message.indexOf('javascript:') === -1) {
lines.push(line.message.indexOf('>>>') > -1 ? line.message : percent + line.message);
} else if (!that.SetCache(code, idx) && doScript !== false) {
that.SetCache(code, idx, 1)
$.form.goto(line.message);
}
}
if (ret.data.status > 0) {
that.SetState(parseInt(ret.data.status), ret.data.message);
that.$percent.attr('lay-percent', (parseFloat(ret.data.progress || '0.00').toFixed(2)) + '%') && layui.element.render();
that.$code.html('<p class="layui-elip">' + lines.join('</p><p class="layui-elip">') + '</p>').animate({scrollTop: that.$code[0].scrollHeight + 'px'}, 200);
parseInt(ret.data.status) === 3 || parseInt(ret.data.status) === 4 || setTimeout(that.LoadProgress, Math.floor(Math.random() * 200));
} else {
setTimeout(that.LoadProgress, Math.floor(Math.random() * 500) + 200);
}
return false;
}
}, false);
};
// 首页加载进度信息
this.LoadProgress();
}
});

View File

@ -1,114 +0,0 @@
// +----------------------------------------------------------------------
define(function () {
return Validate;
function Validate(form) {
let that = this;
// 绑定表单元素
this.form = $(form);
// 绑定元素事件
this.evts = 'blur change';
// 检测表单元素
this.tags = 'input,textarea';
// 验证成功回调
this.dones = [];
// 预设检测规则
this.patterns = {
qq: '^[1-9][0-9]{4,11}$',
ip: '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$',
url: '^https?://([a-zA-Z0-9-]+\\.)+[-_a-zA-Z0-9-]+',
phone: '^1[3-9][0-9]{9}$',
mobile: '^1[3-9][0-9]{9}$',
email: '^([a-zA-Z0-9_\\.-])+@(([a-zA-Z0-9-])+\\.)+([a-zA-Z0-9]{2,4})+$',
wechat: '^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$',
cardid: '^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$',
userame: '^[a-zA-Z0-9_-]{4,16}$',
};
// 设置完成回调
this.addDoneEvent = function (done) {
if (typeof done === 'function') this.dones.push(done);
};
this.isRegex = function (el, value, pattern) {
pattern = pattern || el.getAttribute('pattern');
if ((value = value || $.trim($(el).val())) === '') return true;
if (!(pattern = this.patterns[pattern] || pattern)) return true;
return new RegExp(pattern, 'i').test(value);
};
this.hasProp = function (el, prop) {
let attrProp = el.getAttribute(prop);
return typeof attrProp !== 'undefined' && attrProp !== null && attrProp !== false;
};
this.hasCheck = function (el, type) {
if (this.hasProp(el, 'data-auto-none')) return false;
type = (el.getAttribute('type') || '').replace(/\W+/, '').toLowerCase();
return $.inArray(type, ['file', 'reset', 'image', 'radio', 'checkbox', 'submit', 'hidden']) < 0;
};
this.checkAllInput = function () {
let status = true;
return this.form.find(this.tags).each(function () {
!that.checkInput(this) && status && (status = !$(this).focus());
}) && status;
};
this.checkInput = function (el) {
if (!this.hasCheck(el = typeof el === 'string' ? form[el] : el)) return true;
if (this.hasProp(el, 'required') && $.trim($(el).val()) === '') return this.remind(el, 'required');
return this.isRegex(el) ? !!this.hideError(el) : this.remind(el, 'pattern');
};
this.remind = function (el, type, tips) {
return $(el).is(':visible') ? this.showError(el, tips || el.getAttribute(type + '-error') || function (name, tips) {
return name ? name + (type === 'required' ? '不能为空' : "格式错误") : (tips || el.getAttribute('placeholder') || '输入格式错误');
}(el.getAttribute('vali-name') || el.getAttribute('data-vali-name'), el.getAttribute('title'))) && false : true;
};
this.showError = function (el, tip) {
return this.insertError($(el).addClass('validate-error')).addClass('layui-anim-fadein').css({width: 'auto'}).html(tip);
};
this.hideError = function (el) {
return this.insertError($(el).removeClass('validate-error')).removeClass('layui-anim-fadein').css({width: '30px'}).html('');
};
this.insertError = function ($el) {
return (function ($icon) {
return $el.data('vali-tags').css({
top: $el.position().top + 'px', right: (($icon.length > 0 ? $icon.width() + parseFloat($icon.css('right') || 0) : 0) + 10) + 'px',
paddingTop: $el.css('marginTop'), lineHeight: ($el.get(0).nodeName || '') === 'TEXTAREA' ? '32px' : $el.css('height'),
});
})($el.nextAll('.input-right-icon'), $el.data('vali-tags') || function () {
let css = 'display:block;position:absolute;text-align:center;color:#c44;font-size:12px;z-index:2;right:8px';
$el.data('vali-tags', $('<span class="layui-anim notselect" style="' + css + '"></span>').insertAfter($el));
}());
};
/*! 预埋异常标签*/
this.form.find(this.tags).each(function (i, el) {
that.hasCheck(this) && that.hideError(el, '');
});
/*! 表单元素验证 */
this.form.attr({onsubmit: 'return false', novalidate: 'novalidate', autocomplete: 'off'}).on('keydown', this.tags, function () {
that.hideError(this)
}).off(this.evts, this.tags).on(this.evts, this.tags, function () {
that.checkInput(this);
}).data('validate', this).bind('submit', function (evt) {
evt.preventDefault();
/* 检查所有表单元素是否通过H5的规则验证 */
if (that.checkAllInput() && that.dones.length > 0) {
if (typeof CKEDITOR === 'object' && typeof CKEDITOR.instances === 'object') {
for (let i in CKEDITOR.instances) CKEDITOR.instances[i].updateElement();
}
/* 触发表单提交后,锁定三秒不能再次提交表单 */
if (that.form.attr('submit-locked')) return false;
evt.submit = that.form.find('button[type=submit],button:not([type=button])');
$.base.onConfirm(evt.submit.attr('data-confirm'), function () {
that.form.attr('submit-locked', 1) && evt.submit.addClass('submit-button-loading');
setTimeout(function () {
that.form.removeAttr('submit-locked') && evt.submit.removeClass('submit-button-loading');
}, 3000) && that.dones.forEach(function (done) {
done.call(form, that.form.formToJson(), []);
});
});
}
}).find('[data-form-loaded]').map(function () {
$(this).html(this.dataset.formLoaded || this.innerHTML);
$(this).removeAttr('data-form-loaded').removeClass('layui-disabled');
});
}
});

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
define(['_weditor', 'upload'], function (editor) {
window.wangEditor = editor;
(function () {
let editor = window.wangEditor;
window.createEditor = function (ele, option) {
if ($(ele).data('editorLayout')) return;
const $layout = $('<div style="border:1px solid #ccc;z-index:1001;"><div style="border-bottom:1px solid #ccc;"></div><div style="height:400px;"></div></div>');
@ -13,8 +13,8 @@ define(['_weditor', 'upload'], function (editor) {
MENU_CONF: {
uploadImage: {
async customUpload(file, insertFn) {
if (window.AdminUploadAdapter) {
new window.AdminUploadAdapter().upload([file], url => insertFn(url, file.name))
if (window.SystemUploadAdapter) {
new window.SystemUploadAdapter().upload([file], url => insertFn(url, file.name))
} else {
let reader = new window.FileReader();
reader.addEventListener('load', () => insertFn(reader.result, file.name));
@ -24,8 +24,8 @@ define(['_weditor', 'upload'], function (editor) {
},
uploadVideo: {
async customUpload(file, insertFn) {
if (window.AdminUploadAdapter) {
new window.AdminUploadAdapter().upload([file], url => insertFn(url, file.name))
if (window.SystemUploadAdapter) {
new window.SystemUploadAdapter().upload([file], url => insertFn(url, file.name))
} else {
let reader = new window.FileReader();
reader.addEventListener('load', () => insertFn(reader.result, file.name));
@ -63,4 +63,4 @@ define(['_weditor', 'upload'], function (editor) {
return _editor;
}
})
})();

View File

@ -14,7 +14,6 @@ new class() {
/**
* 初始化百度地址行政数据
* @return void
*/
protected function initBd(): array
{
@ -59,7 +58,7 @@ new class() {
foreach ($data as $item) {
[$k1, $k2, $k3] = str_split($item['code'], 2);
// 整合省份数据
if ($k2 + $k3 == 0) {
if ((intval($k2) + intval($k3)) == 0) {
$this->tree[$k1] = $item;
}
// 整合城市
@ -207,4 +206,4 @@ EOL
// 写入区域文件
return file_put_contents($scriptFile, $scriptContent) && file_put_contents($jsonFile, $jsonContent);
}
};
};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
define(function(){if("undefined"==typeof window)return{load:function(e,t,n){n()}};var e=document.getElementsByTagName("head")[0],t=window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/)||0,n=!1,r=!0;t[1]||t[7]?n=parseInt(t[1])<6||parseInt(t[7])<=9:t[2]||t[8]?r=!1:t[4]&&(n=parseInt(t[4])<18);var o={};o.pluginBuilder="./css-builder";var a,i,s,l=function(){a=document.createElement("style"),e.appendChild(a),i=a.styleSheet||a.sheet},u=0,d=[],c=function(e){u++,32==u&&(l(),u=0),i.addImport(e),a.onload=function(){f()}},f=function(){s();var e=d.shift();return e?(s=e[1],void c(e[0])):void(s=null)},h=function(e,t){if(i&&i.addImport||l(),i&&i.addImport)s?d.push([e,t]):(c(e),s=t);else{a.textContent='@import "'+e+'";';var n=setInterval(function(){try{a.sheet.cssRules,clearInterval(n),t()}catch(e){}},10)}},p=function(t,n){var o=document.createElement("link");if(o.type="text/css",o.rel="stylesheet",r)o.onload=function(){o.onload=function(){},setTimeout(n,7)};else var a=setInterval(function(){for(var e=0;e<document.styleSheets.length;e++){var t=document.styleSheets[e];if(t.href==o.href)return clearInterval(a),n()}},10);o.href=t,e.appendChild(o)};return o.normalize=function(e,t){return".css"==e.substr(e.length-4,4)&&(e=e.substr(0,e.length-4)),t(e)},o.load=function(e,t,r){(n?h:p)(t.toUrl(e+".css"),r)},o});

File diff suppressed because one or more lines are too long

View File

@ -57,6 +57,32 @@
// 窗口页面背景颜色
@BodyMainBackColor: #EFEFEF;
// 鍚庡彴涓婚璁捐 token
#themePalette(
@accent: #009688,
@bodyBg: #F4F7FB,
@surface: #FFFFFF,
@surfaceSoft: #F8FAFC,
@border: #E2E8F0,
@text: #1F2937,
@muted: #64748B,
@shadowTint: rgba(15, 23, 42, 0.10)
) {
--ta-accent: @accent;
--ta-accent-soft: rgba(red(@accent), green(@accent), blue(@accent), 0.12);
--ta-accent-deep: rgba(red(@accent), green(@accent), blue(@accent), 0.22);
--ta-body-bg: @bodyBg;
--ta-surface: @surface;
--ta-surface-soft: @surfaceSoft;
--ta-border-color: @border;
--ta-text-color: @text;
--ta-text-muted: @muted;
--ta-radius-sm: 6px;
--ta-radius-md: 10px;
--ta-shadow-xs: 0 8px 20px @shadowTint;
--ta-shadow-sm: 0 14px 36px @shadowTint;
}
// 最小滚动样式
#defaScrollbar() {
height: 100%;
@ -91,7 +117,7 @@
box-shadow: @ShadowOuterMax;
> .layui-card-body {
padding: 40px 40px 10px 40px;
padding: 24px 24px 8px 24px;
}
}
}
@ -161,4 +187,4 @@
-ms-flex-direction: @type;
-webkit-flex-direction: @type;
flex-direction: @type;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -357,7 +357,7 @@ form.layui-form fieldset {
box-shadow: none !important;
> .layui-card-body {
padding: 20px 40px 0 0;
padding: 0;
}
}
}
@ -443,4 +443,4 @@ form.layui-form fieldset {
.layui-form-checkbox.layui-form-checked i {
border-color: #5FB878;
}
}

View File

@ -13,6 +13,7 @@
position: absolute;
box-sizing: content-box;
background: @TopHeaderBackColor !important;
border-bottom: 1px solid var(--ta-border-color, rgba(0, 0, 0, 0.08));
#notSelect();
> ul.layui-nav {
@ -133,7 +134,8 @@
z-index: 333;
position: fixed;
overflow: hidden;
box-shadow: @ShadowBodyLeft;
box-shadow: none;
border-right: 1px solid var(--ta-border-color, rgba(0, 0, 0, 0.08));
background-color: @LeftMainBackColor;
#notSelect();
@ -147,7 +149,7 @@
text-align: center;
box-shadow: none !important;
line-height: @LayoutHeadTopHeight;
border-bottom: @BoxBottomLine;
border-bottom: 1px solid var(--ta-border-color, rgba(0, 0, 0, 0.08));
.headimg {
margin: 0 10px 0 0;
@ -286,7 +288,7 @@
left: @LayoutLeftDefaSize;
padding: 0;
z-index: 111;
background: @BodyMainBackColor;
background: var(--ta-body-bg, @BodyMainBackColor);
> .think-page-loader {
left: @LayoutLeftDefaSize
@ -307,7 +309,7 @@
box-sizing: border-box;
> .layui-card-html {
padding: 15px;
padding: 12px;
min-width: 100%;
position: absolute;
box-sizing: border-box;
@ -315,14 +317,15 @@
}
> .layui-card-table {
padding: 15px;
padding: 12px;
box-sizing: border-box;
#bodyLayout();
}
> div > .layui-tab.layui-tab-card {
border: none;
box-shadow: @ShadowOuterMax;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: var(--ta-radius-md, @BoxBorderRadius);
box-shadow: none;
& > .layui-tab-content.think-box-shadow {
box-shadow: none;
@ -336,24 +339,26 @@
right: 0;
z-index: 3;
position: absolute;
box-shadow: @ShadowBodyTop;
border-top: 1px solid var(--ta-border-color, rgba(0, 0, 0, 0.08));
box-shadow: none;
}
> .layui-card-header {
top: @LayoutHeadTopHeight;
left: @LayoutLeftDefaSize;
box-sizing: border-box;
border-top: @BoxBottomLine;
border-bottom: 1px solid #fff !important;
border-top: 1px solid var(--ta-border-color, rgba(0, 0, 0, 0.10));
border-bottom: 1px solid var(--ta-border-color, #fff) !important;
#notSelect();
right: 0;
height: @LayoutBodyHeadHeight;
z-index: 4;
padding: 0 15px;
padding: 0 12px;
position: fixed;
background: #FFF;
background: var(--ta-surface, #FFF);
line-height: @LayoutBodyHeadHeight;
text-align: left;
> div {
margin-top: -1px
@ -477,4 +482,4 @@
[data-target-menu-type] {
display: none !important;
}
}
}

View File

@ -85,16 +85,18 @@
}
.layui-btn-group {
border-color: @mainActiveBack;
background-color: @mainActiveBack;
border-color: fade(@mainAccent, 20%);
background-color: var(--ta-surface, #fff);
.layui-btn {
&:hover:not(.layui-btn-active) {
color: @mainActiveBack;
background-color: fade(@mainAccent, 10%);
}
&.layui-btn-active {
color: #fff;
background-color: @mainActiveBack
}
}
}
}

View File

@ -4,7 +4,8 @@
// +----------------------------------------------------------------------
.layui-layout-theme-black-1 {
@mainActiveBack: #393D49 !important;
@mainAccent: #393D49;
@mainActiveBack: @mainAccent !important;
@mainNormalBack: rgba(0, 0, 0, 0.1) !important;
@mainActionText: #FFFFFF !important;
@ -23,5 +24,7 @@
@leftNormalBackColor: @mainNormalBack;
@leftActiveBackColor: #098 !important;
#themePalette(@mainAccent, #F5F7FA, #FFFFFF, #F8FAFC, #DCE3EB, #111827, #667085, rgba(57, 61, 73, 0.12));
@import (multiple)"_layout_1.less";
}

View File

@ -4,7 +4,8 @@
// +----------------------------------------------------------------------
.layui-layout-theme-blue-1 {
@mainActiveBack: #3963bc !important;
@mainAccent: #3963BC;
@mainActiveBack: @mainAccent !important;
@mainNormalBack: rgba(0, 0, 0, 0.1) !important;
@mainActionText: #FFFFFF !important;
@ -23,5 +24,7 @@
@leftNormalBackColor: @mainNormalBack;
@leftActiveBackColor: @mainActiveBack;
#themePalette(@mainAccent, #F4F7FF, #FFFFFF, #EEF4FF, #D8E2F7, #172554, #52607A, rgba(57, 99, 188, 0.12));
@import (multiple)"_layout_1.less";
}

View File

@ -4,7 +4,8 @@
// +----------------------------------------------------------------------
.layui-layout-theme-green-1 {
@mainActiveBack: #098 !important;
@mainAccent: #009688;
@mainActiveBack: @mainAccent !important;
@mainNormalBack: rgba(0, 0, 0, 0.1) !important;
@mainActionText: #FFFFFF !important;
@ -23,5 +24,7 @@
@leftNormalBackColor: @mainNormalBack;
@leftActiveBackColor: @mainActiveBack;
#themePalette(@mainAccent, #F1FBFA, #FFFFFF, #F4FDFB, #D4ECE7, #134E4A, #54706D, rgba(0, 150, 136, 0.12));
@import (multiple)"_layout_1.less";
}

View File

@ -4,7 +4,8 @@
// +----------------------------------------------------------------------
.layui-layout-theme-red-1 {
@mainActiveBack: #AA3130 !important;
@mainAccent: #AA3130;
@mainActiveBack: @mainAccent !important;
@mainNormalBack: rgba(0, 0, 0, 0.1) !important;
@mainActionText: #FFFFFF !important;
@ -23,5 +24,7 @@
@leftNormalBackColor: @mainNormalBack;
@leftActiveBackColor: @mainActiveBack;
#themePalette(@mainAccent, #FFF5F5, #FFFDFD, #FFF1F1, #F2D7D7, #3A1818, #865454, rgba(170, 49, 48, 0.12));
@import (multiple)"_layout_1.less";
}

View File

@ -206,16 +206,18 @@
}
.layui-btn-group {
border-color: @mainColor;
background-color: @mainColor;
border-color: fade(@mainColor, 20%);
background-color: var(--ta-surface, #fff);
.layui-btn {
&:hover:not(.layui-btn-active) {
color: @mainColor;
background-color: fade(@mainColor, 10%);
}
&.layui-btn-active {
color: #fff;
background-color: @mainColor
}
}
}
}

View File

@ -4,10 +4,14 @@
// +----------------------------------------------------------------------
.layui-layout-theme-black-2 {
@mainAccent: #393D49;
@themeAccent: #009988;
@iconWidth: 100px !important;
@mainColor: #393D49 !important;
@textColor: #009988 !important;
@mainColor: @mainAccent !important;
@textColor: @themeAccent !important;
#themePalette(@mainAccent, #F5F7FA, #FFFFFF, #F8FAFC, #DCE3EB, #111827, #667085, rgba(57, 61, 73, 0.12));
@import (multiple)"_layout_2.less";
}

View File

@ -4,10 +4,13 @@
// +----------------------------------------------------------------------
.layui-layout-theme-blue-2 {
@mainAccent: #3963BC;
@iconWidth: 100px !important;
@mainColor: #3963bc !important;
@textColor: @mainColor;
@mainColor: @mainAccent !important;
@textColor: @mainAccent;
#themePalette(@mainAccent, #F4F7FF, #FFFFFF, #EEF4FF, #D8E2F7, #172554, #52607A, rgba(57, 99, 188, 0.12));
@import (multiple)"_layout_2.less";
}

View File

@ -4,10 +4,13 @@
// +----------------------------------------------------------------------
.layui-layout-theme-green-2 {
@mainAccent: #009688;
@iconWidth: 100px !important;
@mainColor: #098 !important;
@textColor: #098 !important;
@mainColor: @mainAccent !important;
@textColor: @mainAccent;
#themePalette(@mainAccent, #F1FBFA, #FFFFFF, #F4FDFB, #D4ECE7, #134E4A, #54706D, rgba(0, 150, 136, 0.12));
@import (multiple)"_layout_2.less";
}

View File

@ -4,10 +4,13 @@
// +----------------------------------------------------------------------
.layui-layout-theme-red-2 {
@mainAccent: #AA3130;
@iconWidth: 100px !important;
@mainColor: #AA3130 !important;
@textColor: #AA3130 !important;
@mainColor: @mainAccent !important;
@textColor: @mainAccent;
#themePalette(@mainAccent, #FFF5F5, #FFFFFF, #FFF1F1, #F2D7D7, #3A1818, #865454, rgba(170, 49, 48, 0.12));
@import (multiple)"_layout_2.less";
}

View File

@ -3,6 +3,12 @@
// +----------------------------------------------------------------------
@accentColor: #16A34A;
.layui-layout-theme-white {
#themePalette(@accentColor, #F8FAFC, #FFFFFF, #F8FAFC, #E2E8F0, #0F172A, #64748B, rgba(15, 23, 42, 0.08));
}
.layui-layout-theme-white > .layui-layout-admin {
> .layui-side {
box-shadow: none;
@ -42,7 +48,7 @@
background: #fff;
.layui-icon {
color: #090 !important;
color: @accentColor !important;
}
}
}
@ -60,13 +66,13 @@
border-bottom: none !important;
&:hover {
color: #090 !important;
color: @accentColor !important;
}
}
.layui-this, &.layui-this {
> a {
color: #090 !important;
color: @accentColor !important;
background: none !important;
font-weight: bold !important;
@ -86,17 +92,11 @@
> .layui-body > .think-page-body > .layui-card {
&:before {
top: 0;
left: 0;
bottom: 0;
z-index: 4;
content: '';
position: absolute;
box-shadow: @ShadowBodyRight;
display: none;
}
> .layui-card-header {
border-left: @BoxBottomLine;
border-left: none;
}
}
@ -105,7 +105,7 @@
.layui-nav-item {
&.layui-this > a {
color: #090 !important;
color: @accentColor !important;
font-weight: bold;
background: none !important;
}
@ -114,7 +114,7 @@
color: #333 !important;
&:hover {
color: #090 !important;
color: @accentColor !important;
background: none !important;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -52,6 +52,32 @@ body {
}
}
.layui-layout-body {
#themePalette(
#009688,
#F4F7FB,
#FFFFFF,
#F7FBFB,
#DCE8E5,
#1F2937,
#64748B,
rgba(15, 23, 42, 0.10)
);
}
.layui-layout-theme-default {
#themePalette(
#009688,
#F4F7FB,
#FFFFFF,
#F7FBFB,
#DCE8E5,
#1F2937,
#64748B,
rgba(15, 23, 42, 0.10)
);
}
@import '_custom.less';
@import '_display.less';
@import '_layout.less';
@ -60,10 +86,24 @@ body {
@import '_layout_1_blue.less';
@import '_layout_1_black.less';
@import '_layout_1_green.less';
@import '_layout_1_navy.less';
@import '_layout_1_amber.less';
@import '_layout_1_violet.less';
@import '_layout_1_rose.less';
@import '_layout_1_lime.less';
@import '_layout_1_indigo.less';
@import '_layout_1_glacier.less';
@import '_layout_2_red.less';
@import '_layout_2_blue.less';
@import '_layout_2_black.less';
@import '_layout_2_green.less';
@import '_layout_2_slate.less';
@import '_layout_2_ocean.less';
@import '_layout_2_sunset.less';
@import '_layout_2_rose.less';
@import '_layout_2_lime.less';
@import '_layout_2_indigo.less';
@import '_layout_2_glacier.less';
@import '_layout_white.less';
@import '_layout_white.less';

View File

@ -1 +1,460 @@
@charset "UTF-8";body,html{height:100%;display:block}.login-container,body{vertical-align:middle;background-size:cover;background-repeat:no-repeat;background-position:center center;transition:background-image 1s linear;-o-transition:background-image 1s linear;-moz-transition:background-image 1s linear;-webkit-transition:background-image 1s linear}.login-container{height:100%}.login-container .header{top:0;left:0;width:100%;height:48px;position:absolute;text-shadow:#000 .1em .1em .1em}.login-container .header .title{color:#fff;float:left;font-size:18px;line-height:48px;text-indent:40px;letter-spacing:1px}.login-container .header .title span{font-size:10px;padding-left:5px}.login-container .header a,.login-container .header a:focus,.login-container .header a:hover{color:#fff;letter-spacing:1px;text-decoration:none}.login-container .header ul{float:right}.login-container .header ul li{float:left;line-height:47px;margin-left:10px}.login-container form{top:50%;left:50%;width:300px;position:absolute;margin-top:-250px;margin-left:-150px}.login-container form h2{color:#fff;padding:20px 0;font-size:25px;text-align:center;font-weight:700;letter-spacing:3px;text-shadow:#000 .05em .05em .05em}.login-container form ul li{margin-top:20px;text-shadow:#000 .1em .1em .1em}.login-container form ul li.verify label{width:200px}.login-container form ul li.verify input.layui-input{text-transform:uppercase}.login-container form ul li.verify img{width:95px;height:44px;cursor:pointer;position:absolute;margin-left:5px;border-radius:3px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.login-container form ul li i.layui-icon{color:#fff;font-size:18px;position:absolute;padding:8px 15px 8px 20px}.login-container form ul li input{color:#fff;height:45px;padding:0 15px;font-size:14px;line-height:1em;text-indent:35px;border:#ddd!important;border-radius:3px;letter-spacing:2px;background:rgba(0,0,0,.12);text-shadow:#000 .1em .1em .1em;-webkit-text-fill-color:#fff!important;box-shadow:0 2px 3px 0 rgba(0,0,0,.3) inset!important}.login-container form ul li input:-webkit-autofill,.login-container form ul li input:-webkit-autofill:active,.login-container form ul li input:-webkit-autofill:focus,.login-container form ul li input:-webkit-autofill:hover,.login-container form ul li input:active,.login-container form ul li input:focus,.login-container form ul li input:hover{border:#ddd!important;text-shadow:#000 .1em .1em .1em;box-shadow:0 2px 4px 0 rgba(0,0,0,.4) inset!important;-webkit-text-fill-color:#fff!important;-webkit-transition-delay:9999s!important;-webkit-transition:color 9999s ease-out,background-color 9999s ease-out!important}.login-container form ul li span{letter-spacing:1px;color:#ff0!important}.login-container form ul li button{color:#333!important;height:45px!important;border:none!important;background:#fff!important;border-radius:3px!important;letter-spacing:1px!important;box-shadow:0 15px 30px 0 hsla(0,0%,100%,.25) inset,0 2px 7px 0 rgba(0,0,0,.2)}.login-container form ul li button:hover{opacity:1}.login-container .footer{left:0;bottom:0;color:#fff;width:100%;position:absolute;text-align:center;line-height:30px;padding-bottom:10px;text-shadow:#000 .1em .1em .1em}.login-container .footer a,.login-container .footer span{color:#fff}.login-container .footer a:hover{color:#ccc}/*# sourceMappingURL=login.css.map */
@charset "UTF-8";
body,
html {
height: 100%;
min-height: 100%;
display: block;
}
body {
color: #e2e8f0;
background-color: #08101d;
}
body.login-verify-active {
overflow: hidden;
}
body,
.login-container {
vertical-align: middle;
background-size: cover;
background-repeat: no-repeat;
background-position: center center;
transition: background-image 1s linear;
-o-transition: background-image 1s linear;
-moz-transition: background-image 1s linear;
-webkit-transition: background-image 1s linear;
}
.login-container {
height: 100%;
overflow: hidden;
position: relative;
isolation: isolate;
--cursor-x: 78%;
--cursor-y: 22%;
}
.login-container:before {
top: 0;
left: 0;
right: 0;
bottom: 0;
content: '';
z-index: 0;
position: absolute;
pointer-events: none;
background: radial-gradient(circle at var(--cursor-x) var(--cursor-y), rgba(96, 165, 250, 0.2), transparent 30%), radial-gradient(circle at 18% 18%, rgba(45, 212, 191, 0.14), transparent 26%), linear-gradient(135deg, rgba(8, 16, 29, 0.8) 0%, rgba(8, 18, 34, 0.52) 48%, rgba(15, 23, 42, 0.82) 100%);
}
.login-container:after {
top: 0;
left: 0;
right: 0;
bottom: 0;
content: '';
z-index: 0;
position: absolute;
pointer-events: none;
background-image: linear-gradient(rgba(148, 163, 184, 0.08) 1px, transparent 1px), linear-gradient(90deg, rgba(148, 163, 184, 0.08) 1px, transparent 1px);
background-size: 38px 38px;
mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.7), transparent 90%);
opacity: 0.22;
}
.login-container .header {
top: 0;
left: 0;
width: 100%;
height: 48px;
position: absolute;
z-index: 2;
display: flex;
padding: 0 32px;
align-items: center;
justify-content: space-between;
}
.login-container .header:before {
left: 32px;
right: 32px;
bottom: 0;
height: 1px;
content: '';
position: absolute;
background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.24), rgba(255, 255, 255, 0));
}
.login-container .header .title {
color: #fff;
font-size: 18px;
line-height: 48px;
font-weight: 600;
text-indent: 0;
letter-spacing: 0.08em;
text-shadow: 0 8px 24px rgba(15, 23, 42, 0.28);
}
.login-container .header .title span {
opacity: 0.72;
font-size: 11px;
padding-left: 8px;
}
.login-container .header a,
.login-container .header a:focus,
.login-container .header a:hover {
color: #fff;
letter-spacing: 0.08em;
text-decoration: none;
}
.login-container form {
top: 50%;
left: 50%;
z-index: 2;
position: absolute;
width: min(420px, calc(100% - 40px));
padding: 28px 28px 30px;
margin: 0;
overflow: hidden;
transform: translate(-50%, -50%);
border: 1px solid rgba(255, 255, 255, 0.18);
border-radius: 20px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.88) 0%, rgba(248, 250, 252, 0.82) 100%);
backdrop-filter: blur(20px);
box-shadow: 0 28px 100px rgba(2, 6, 23, 0.42), inset 0 1px 0 rgba(255, 255, 255, 0.45);
}
.login-container form:before {
top: 0;
left: 0;
right: 0;
height: 4px;
content: '';
position: absolute;
background: linear-gradient(90deg, #14b8a6 0%, #60a5fa 58%, #a78bfa 100%);
}
.login-container form:after {
inset: 0;
content: '';
position: absolute;
pointer-events: none;
background: radial-gradient(circle at 0 0, rgba(45, 212, 191, 0.12), transparent 30%), radial-gradient(circle at 100% 18%, rgba(59, 130, 246, 0.12), transparent 32%);
}
.login-container form > * {
z-index: 1;
position: relative;
}
.login-container form .login-meta {
gap: 8px;
color: #334155;
display: inline-flex;
font-size: 12px;
margin-bottom: 18px;
align-items: center;
padding: 7px 12px 7px 10px;
border: 1px solid rgba(148, 163, 184, 0.18);
border-radius: 999px;
letter-spacing: 0.08em;
background: rgba(255, 255, 255, 0.62);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45);
}
.login-container form .login-meta .dot {
width: 8px;
height: 8px;
display: block;
border-radius: 50%;
background: linear-gradient(135deg, #14b8a6 0%, #3b82f6 100%);
box-shadow: 0 0 0 4px rgba(45, 212, 191, 0.12);
}
.login-container form .login-meta em {
color: #64748b;
font-style: normal;
}
.login-container form h2 {
color: #0f172a;
padding: 0 0 18px;
font-size: 30px;
text-align: left;
font-weight: 700;
letter-spacing: 0.02em;
}
.login-container form ul li {
margin-top: 16px;
}
.login-container form ul li label {
display: block;
position: relative;
}
.login-container form ul li i.layui-icon {
color: #64748b;
font-size: 18px;
position: absolute;
top: 50%;
left: 18px;
padding: 0;
transform: translateY(-50%);
transition: color 0.2s ease;
}
.login-container form ul li input {
color: #1f2937;
height: 52px;
padding: 0 56px 0 52px;
font-size: 14px;
line-height: 1em;
text-indent: 0;
border: 1px solid rgba(148, 163, 184, 0.24) !important;
border-radius: 14px;
letter-spacing: 0;
background: rgba(255, 255, 255, 0.78);
text-shadow: none;
-webkit-text-fill-color: #1f2937 !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.48) !important;
transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease, transform 0.2s ease;
}
.login-container form ul li input:hover,
.login-container form ul li input:focus,
.login-container form ul li input:active,
.login-container form ul li input:-webkit-autofill,
.login-container form ul li input:-webkit-autofill:hover,
.login-container form ul li input:-webkit-autofill:focus,
.login-container form ul li input:-webkit-autofill:active {
border: 1px solid rgba(37, 99, 235, 0.4) !important;
background: rgba(255, 255, 255, 0.92);
transform: translateY(-1px);
text-shadow: none;
box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.1), 0 14px 30px rgba(15, 23, 42, 0.08) !important;
-webkit-text-fill-color: #1f2937 !important;
-webkit-transition-delay: 9999s !important;
-webkit-transition: color 9999s ease-out, background-color 9999s ease-out !important;
}
.login-container form ul li label:focus-within i.layui-icon {
color: #2563eb;
}
.login-container form ul li span {
letter-spacing: 1px;
color: #dc2626 !important;
}
.login-container form ul li button {
color: #fff !important;
height: 52px !important;
border: none !important;
background: linear-gradient(135deg, #0f766e 0%, #2563eb 100%) !important;
border-radius: 14px !important;
letter-spacing: 0.16em !important;
box-shadow: 0 16px 36px rgba(37, 99, 235, 0.22), inset 0 1px 0 rgba(255, 255, 255, 0.28);
transition: transform 0.2s ease, box-shadow 0.2s ease, filter 0.2s ease;
}
.login-container form ul li button:hover {
opacity: 1;
filter: brightness(1.03);
transform: translateY(-1px);
box-shadow: 0 20px 42px rgba(37, 99, 235, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.28);
}
.login-container form ul li button.layui-disabled {
opacity: 0.78;
box-shadow: 0 10px 20px rgba(37, 99, 235, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.24);
}
.login-container .login-verify-popup {
inset: 0;
z-index: 4;
position: absolute;
}
.login-container .login-verify-popup .login-verify-mask {
inset: 0;
position: absolute;
background: rgba(8, 15, 28, 0.48);
backdrop-filter: blur(10px);
}
.login-container .login-verify-popup .login-verify-dialog {
top: 50%;
left: 50%;
z-index: 1;
width: min(440px, calc(100% - 32px));
position: absolute;
padding: 22px;
transform: translate(-50%, -46%) scale(0.96);
border: 1px solid rgba(255, 255, 255, 0.18);
border-radius: 24px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.94) 0%, rgba(248, 250, 252, 0.88) 100%);
box-shadow: 0 28px 90px rgba(2, 6, 23, 0.42), inset 0 1px 0 rgba(255, 255, 255, 0.52);
opacity: 0;
transition: opacity 0.22s ease, transform 0.22s ease;
}
.login-container .login-verify-popup.is-visible .login-verify-dialog {
opacity: 1;
transform: translate(-50%, -50%) scale(1);
}
.login-container .login-verify-popup .slider-title {
color: #0f172a;
font-size: 14px;
line-height: 1.7em;
margin-bottom: 12px;
font-weight: 600;
letter-spacing: 0.02em;
}
.login-container .login-verify-popup .slider-panel {
padding: 12px;
border: 1px solid rgba(148, 163, 184, 0.18);
border-radius: 18px;
background: rgba(248, 250, 252, 0.72);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45);
}
.login-container .login-verify-popup .slider-stage {
height: 164px;
overflow: hidden;
position: relative;
border: 1px solid rgba(148, 163, 184, 0.12);
border-radius: 16px;
background: #e2e8f0;
}
.login-container .login-verify-popup .slider-bg,
.login-container .login-verify-popup .slider-piece {
top: 0;
left: 0;
height: 100%;
position: absolute;
}
.login-container .login-verify-popup .slider-bg {
width: 100%;
display: block;
object-fit: cover;
}
.login-container .login-verify-popup .slider-piece {
width: 16.6667%;
pointer-events: none;
box-shadow: 0 8px 18px rgba(15, 23, 42, 0.18);
}
.login-container .login-verify-popup .slider-bar {
height: 48px;
margin-top: 10px;
overflow: hidden;
position: relative;
border: 1px solid rgba(148, 163, 184, 0.18);
border-radius: 14px;
background: rgba(255, 255, 255, 0.86);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5);
}
.login-container .login-verify-popup .slider-bar-track {
top: 0;
left: 0;
width: 54px;
height: 48px;
position: absolute;
background: linear-gradient(90deg, rgba(20, 184, 166, 0.28) 0%, rgba(59, 130, 246, 0.24) 100%);
}
.login-container .login-verify-popup .slider-bar-text {
top: 0;
left: 0;
right: 0;
z-index: 1;
color: #64748b;
font-size: 13px;
line-height: 48px;
position: absolute;
text-align: center;
letter-spacing: 0;
}
.login-container .login-verify-popup .slider-handle {
top: 0;
left: 0;
z-index: 2;
width: 54px;
height: 48px;
color: #0f172a;
display: flex;
cursor: grab;
position: absolute;
align-items: center;
justify-content: center;
border: 1px solid rgba(148, 163, 184, 0.18);
border-radius: 14px;
background: linear-gradient(180deg, #fff 0%, #f8fafc 100%);
box-shadow: 0 10px 24px rgba(15, 23, 42, 0.12);
}
.login-container .login-verify-popup .slider-handle.is-active {
cursor: grabbing;
box-shadow: 0 12px 28px rgba(37, 99, 235, 0.16);
}
.login-container .login-verify-popup .slider-handle i {
color: #0f766e;
padding: 0;
font-size: 18px;
position: static;
}
.login-container .login-verify-popup .slider-actions {
display: flex;
font-size: 12px;
margin-top: 8px;
align-items: center;
justify-content: space-between;
color: #64748b;
letter-spacing: 0;
}
.login-container .login-verify-popup .slider-actions a {
color: #0f766e;
text-decoration: none;
}
.login-container .login-verify-popup .slider-panel.is-success .slider-bar-track {
background: linear-gradient(90deg, rgba(22, 163, 74, 0.26) 0%, rgba(45, 212, 191, 0.28) 100%);
}
.login-container .login-verify-popup .slider-panel.is-success .slider-bar-text {
color: #0f766e;
}
.login-container .login-verify-popup .slider-panel.is-error .slider-bar-track {
background: linear-gradient(90deg, rgba(239, 68, 68, 0.24) 0%, rgba(251, 113, 133, 0.28) 100%);
}
.login-container .login-verify-popup .slider-panel.is-error .slider-bar-text {
color: #dc2626;
}
.login-container .footer {
left: 0;
bottom: 0;
z-index: 2;
color: rgba(255, 255, 255, 0.78);
width: 100%;
position: absolute;
text-align: center;
line-height: 30px;
padding: 0 24px 14px;
text-shadow: 0 6px 18px rgba(15, 23, 42, 0.18);
letter-spacing: 0.04em;
}
.login-container .footer a,
.login-container .footer span {
color: rgba(255, 255, 255, 0.78);
}
.login-container .footer a:hover {
color: #fff;
}
@media (max-width: 768px) {
.login-container:after {
opacity: 0.14;
}
.login-container form {
padding: 24px 20px 24px;
border-radius: 18px;
}
.login-container form h2 {
font-size: 26px;
}
.login-container .login-verify-popup .login-verify-dialog {
padding: 18px;
}
.login-container .footer {
line-height: 1.8em;
padding: 0 18px 12px;
}
}
@media (max-width: 480px) {
.login-container .header {
padding: 0 16px;
}
.login-container .header:before {
left: 16px;
right: 16px;
}
.login-container .header .title {
font-size: 16px;
}
.login-container form {
width: calc(100% - 28px);
padding: 22px 18px 22px;
}
.login-container .login-verify-popup .login-verify-dialog {
width: calc(100% - 20px);
padding: 16px;
}
.login-container .login-verify-popup .slider-stage {
height: 148px;
}
}

View File

@ -1 +1 @@
{"version":3,"sources":["$stdin"],"names":[],"mappings":"iBACA,KACA,KACE,OAAQ,KACR,QAAS,MAGX,iBADA,KAEE,eAAgB,OAChB,gBAAiB,MACjB,kBAAmB,UACnB,oBAAqB,OAAO,OAC5B,WAAY,iBAAiB,GAAG,OAChC,cAAe,iBAAiB,GAAG,OACnC,gBAAiB,iBAAiB,GAAG,OACrC,mBAAoB,iBAAiB,GAAG,OAE1C,iBACE,OAAQ,KAEV,yBACE,IAAK,EACL,KAAM,EACN,MAAO,KACP,OAAQ,KACR,SAAU,SACV,YAAa,KAAK,KAAM,KAAM,KAEhC,gCACE,MAAO,KACP,MAAO,KACP,UAAW,KACX,YAAa,KACb,YAAa,KACb,eAAgB,IAElB,qCACE,UAAW,KACX,aAAc,IAEhB,2BACA,iCACA,iCACE,MAAO,KACP,eAAgB,IAChB,gBAAiB,KAEnB,4BACE,MAAO,MAET,+BACE,MAAO,KACP,YAAa,KACb,YAAa,KAEf,sBACE,IAAK,IACL,KAAM,IACN,MAAO,MACP,SAAU,SACV,WAAY,OACZ,YAAa,OAEf,yBACE,MAAO,KACP,QAAS,KAAK,EACd,UAAW,KACX,WAAY,OACZ,YAAa,IACb,eAAgB,IAChB,YAAa,KAAK,MAAO,MAAO,MAElC,4BACE,WAAY,KACZ,YAAa,KAAK,KAAM,KAAM,KAEhC,yCACE,MAAO,MAET,qDACE,eAAgB,UAElB,uCACE,MAAO,KACP,OAAQ,KACR,OAAQ,QACR,SAAU,SACV,YAAa,IACb,cAAe,IACf,WAAY,EAAE,IAAI,IAAI,EAAE,eAE1B,yCACE,MAAO,KACP,UAAW,KACX,SAAU,SACV,QAAS,IAAI,KAAK,IAAI,KAExB,kCACE,MAAO,KACP,OAAQ,KACR,QAAS,EAAE,KACX,UAAW,KACX,YAAa,IACb,YAAa,KACb,OAAQ,eACR,cAAe,IACf,eAAgB,IAChB,WAAY,gBACZ,YAAa,KAAK,KAAM,KAAM,KAC9B,wBAAyB,eACzB,WAAY,EAAE,IAAI,IAAI,EAAE,eAAmB,gBAK7C,mDAGA,0DADA,yDADA,yDAFA,yCADA,wCADA,wCAOE,OAAQ,eACR,YAAa,KAAK,KAAM,KAAM,KAC9B,WAAY,EAAE,IAAI,IAAI,EAAE,eAAmB,gBAC3C,wBAAyB,eACzB,yBAA0B,gBAC1B,mBAAoB,MAAM,MAAM,QAAQ,CAAE,iBAAiB,MAAM,mBAEnE,iCACE,eAAgB,IAChB,MAAO,eAET,mCACE,MAAO,eACP,OAAQ,eACR,OAAQ,eACR,WAAY,eACZ,cAAe,cACf,eAAgB,cAChB,WAAY,EAAE,KAAK,KAAK,EAAE,oBAAwB,KAAK,CAAE,EAAE,IAAI,IAAI,EAAE,eAEvE,yCACE,QAAS,EAEX,yBACE,KAAM,EACN,OAAQ,EACR,MAAO,KACP,MAAO,KACP,SAAU,SACV,WAAY,OACZ,YAAa,KACb,eAAgB,KAChB,YAAa,KAAK,KAAM,KAAM,KAEhC,2BACA,8BACE,MAAO,KAET,iCACE,MAAO"}
{"version":3,"sources":["$stdin"],"names":[],"mappings":"iBACA,KACA,KACE,OAAQ,KACR,QAAS,MAGX,iBADA,KAEE,eAAgB,OAChB,gBAAiB,MACjB,kBAAmB,UACnB,oBAAqB,OAAO,OAC5B,WAAY,iBAAiB,GAAG,OAChC,cAAe,iBAAiB,GAAG,OACnC,gBAAiB,iBAAiB,GAAG,OACrC,mBAAoB,iBAAiB,GAAG,OAE1C,iBACE,OAAQ,KAEV,yBACE,IAAK,EACL,KAAM,EACN,MAAO,KACP,OAAQ,KACR,SAAU,SAEZ,gCACE,MAAO,KACP,MAAO,KACP,UAAW,KACX,YAAa,KACb,YAAa,KACb,eAAgB,IAElB,qCACE,UAAW,KACX,aAAc,IAEhB,2BACA,iCACA,iCACE,MAAO,KACP,eAAgB,IAChB,gBAAiB,KAEnB,4BACE,MAAO,MAET,+BACE,MAAO,KACP,YAAa,KACb,YAAa,KAEf,sBACE,IAAK,IACL,KAAM,IACN,MAAO,MACP,SAAU,SACV,QAAS,KAAK,KAAK,KACnB,WAAY,OACZ,YAAa,OACb,OAAQ,IAAI,MAAM,sBAClB,cAAe,IACf,WAAY,qBACZ,WAAY,KAEd,yBACE,MAAO,QACP,QAAS,EAAE,EAAE,KACb,UAAW,KACX,WAAY,OACZ,YAAa,IACb,eAAgB,IAElB,4BACE,WAAY,KAEd,iDACE,MAAO,QACP,UAAW,KACX,YAAa,MACb,cAAe,IACf,eAAgB,EAElB,iDACE,QAAS,KACT,OAAQ,IAAI,MAAM,QAClB,cAAe,IACf,WAAY,KACZ,WAAY,KAEd,iDACE,OAAQ,MACR,SAAU,OACV,SAAU,SACV,cAAe,IACf,WAAY,QAEd,8CACA,iDACE,IAAK,EACL,KAAM,EACN,OAAQ,KACR,SAAU,SAEZ,8CACE,MAAO,KACP,QAAS,MACT,WAAY,MAEd,iDACE,MAAO,SACP,eAAgB,KAChB,WAAY,KAEd,+CACE,OAAQ,KACR,WAAY,KACZ,SAAU,OACV,SAAU,SACV,OAAQ,IAAI,MAAM,QAClB,cAAe,IACf,WAAY,QACZ,WAAY,KAEd,qDACE,IAAK,EACL,KAAM,EACN,MAAO,KACP,OAAQ,KACR,SAAU,SACV,WAAY,qBAEd,oDACE,IAAK,EACL,KAAM,EACN,MAAO,EACP,QAAS,EACT,MAAO,QACP,UAAW,KACX,YAAa,KACb,SAAU,SACV,WAAY,OACZ,eAAgB,EAElB,kDACE,IAAK,EACL,KAAM,EACN,QAAS,EACT,MAAO,KACP,OAAQ,KACR,MAAO,KACP,QAAS,KACT,OAAQ,KACR,SAAU,SACV,YAAa,OACb,gBAAiB,OACjB,OAAQ,IAAI,MAAM,QAClB,cAAe,IACf,WAAY,KACZ,WAAY,KAEd,4DACE,OAAQ,SAEV,oDACE,MAAO,KACP,QAAS,EACT,UAAW,KACX,SAAU,OAEZ,mDACE,QAAS,KACT,UAAW,KACX,WAAY,IACZ,YAAa,OACb,gBAAiB,cACjB,MAAO,QACP,eAAgB,EAElB,qDACE,MAAO,QACP,gBAAiB,KAEnB,8EACE,WAAY,oBAEd,6EACE,MAAO,QAET,4EACE,WAAY,sBAEd,2EACE,MAAO,QAET,yCACE,MAAO,QACP,UAAW,KACX,SAAU,SACV,QAAS,IAAI,KAAK,IAAI,KAExB,kCACE,MAAO,QACP,OAAQ,KACR,QAAS,EAAE,KACX,UAAW,KACX,YAAa,IACb,YAAa,KACb,OAAQ,IAAI,MAAM,kBAClB,cAAe,IACf,eAAgB,EAChB,WAAY,KACZ,YAAa,KACb,wBAAyB,kBACzB,WAAY,eAKd,mDAGA,0DADA,yDADA,yDAFA,yCADA,wCADA,wCAOE,OAAQ,IAAI,MAAM,kBAClB,YAAa,KACb,WAAY,eACZ,wBAAyB,kBACzB,yBAA0B,gBAC1B,mBAAoB,MAAM,MAAM,QAAQ,CAAE,iBAAiB,MAAM,mBAEnE,iCACE,eAAgB,IAChB,MAAO,eAET,mCACE,MAAO,eACP,OAAQ,eACR,OAAQ,eACR,WAAY,kBACZ,cAAe,cACf,eAAgB,cAChB,WAAY,KAEd,yCACE,QAAS,EAEX,yBACE,KAAM,EACN,OAAQ,EACR,MAAO,KACP,MAAO,KACP,SAAU,SACV,WAAY,OACZ,YAAa,KACb,eAAgB,KAChB,YAAa,KAEf,2BACA,8BACE,MAAO,KAET,iCACE,MAAO"}

View File

@ -25,7 +25,6 @@ body, .login-container {
width: 100%;
height: 48px;
position: absolute;
text-shadow: #000 .1em .1em .1em;
.title {
color: #fff;
@ -63,74 +62,199 @@ body, .login-container {
form {
top: 50%;
left: 50%;
width: 300px;
width: 340px;
position: absolute;
margin-top: -250px;
margin-left: -150px;
padding: 22px 24px 24px;
margin-top: -230px;
margin-left: -170px;
border: 1px solid rgba(255, 255, 255, .38);
border-radius: 8px;
background: rgba(255, 255, 255, .9);
box-shadow: none;
h2 {
color: #fff;
padding: 20px 0;
font-size: 25px;
color: #1f2937;
padding: 0 0 18px;
font-size: 22px;
text-align: center;
font-weight: 700;
letter-spacing: 3px;
text-shadow: #000 .05em .05em .05em;
font-weight: 600;
letter-spacing: 1px;
}
ul li {
margin-top: 20px;
text-shadow: #000 .1em .1em .1em;
margin-top: 14px;
&.verify {
label {
width: 200px;
.slider-title {
color: #64748b;
font-size: 12px;
line-height: 1.6em;
margin-bottom: 8px;
letter-spacing: 0;
}
input.layui-input {
text-transform: uppercase
.slider-panel {
padding: 10px;
border: 1px solid #e2e8f0;
border-radius: 6px;
background: #fff;
box-shadow: none;
}
img {
width: 95px;
height: 44px;
cursor: pointer;
.slider-stage {
height: 150px;
overflow: hidden;
position: relative;
border-radius: 6px;
background: #f8fafc;
}
.slider-bg, .slider-piece {
top: 0;
left: 0;
height: 100%;
position: absolute;
margin-left: 5px;
border-radius: @BoxBorderRadius;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .1);
}
.slider-bg {
width: 100%;
display: block;
object-fit: cover;
}
.slider-piece {
width: 16.6667%;
pointer-events: none;
box-shadow: none;
}
.slider-bar {
height: 44px;
margin-top: 10px;
overflow: hidden;
position: relative;
border: 1px solid #e2e8f0;
border-radius: 6px;
background: #f8fafc;
box-shadow: none;
}
.slider-bar-track {
top: 0;
left: 0;
width: 48px;
height: 44px;
position: absolute;
background: rgba(36, 161, 255, .26);
}
.slider-bar-text {
top: 0;
left: 0;
right: 0;
z-index: 1;
color: #64748b;
font-size: 13px;
line-height: 44px;
position: absolute;
text-align: center;
letter-spacing: 0;
}
.slider-handle {
top: 0;
left: 0;
z-index: 2;
width: 48px;
height: 44px;
color: #333;
display: flex;
cursor: grab;
position: absolute;
align-items: center;
justify-content: center;
border: 1px solid #dbe5ef;
border-radius: 6px;
background: #fff;
box-shadow: none;
&.is-active {
cursor: grabbing;
}
i {
color: #333;
padding: 0;
font-size: 18px;
position: static;
}
}
.slider-actions {
display: flex;
font-size: 12px;
margin-top: 8px;
align-items: center;
justify-content: space-between;
color: #64748b;
letter-spacing: 0;
a {
color: #0f766e;
text-decoration: none;
}
}
.slider-panel.is-success {
.slider-bar-track {
background: rgba(88, 201, 108, .3);
}
.slider-bar-text {
color: #d7ffd6;
}
}
.slider-panel.is-error {
.slider-bar-track {
background: rgba(255, 107, 107, .28);
}
.slider-bar-text {
color: #ffd7d7;
}
}
}
i.layui-icon {
color: #fff;
color: #64748b;
font-size: 18px;
position: absolute;
padding: 8px 15px 8px 20px;
}
input {
color: #fff;
color: #1f2937;
height: 45px;
padding: 0 15px;
font-size: 14px;
line-height: 1em;
text-indent: 35px;
border: #DDD !important;
border-radius: @BoxBorderRadius;
letter-spacing: 2px;
background: rgba(0, 0, 0, .12);
text-shadow: #000 .1em .1em .1em;
-webkit-text-fill-color: #fff !important;
box-shadow: 0 2px 3px 0 rgba(0, 0, 0, .3) inset !important;
border: 1px solid #dbe5ef !important;
border-radius: 6px;
letter-spacing: 0;
background: #fff;
text-shadow: none;
-webkit-text-fill-color: #1f2937 !important;
box-shadow: none !important;
&:hover, &:focus, &:active,
&:-webkit-autofill, &:-webkit-autofill:hover,
&:-webkit-autofill:focus, &:-webkit-autofill:active {
border: #DDD !important;
text-shadow: #000 .1em .1em .1em;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .4) inset !important;
-webkit-text-fill-color: #fff !important;
border: 1px solid #b7c6d8 !important;
text-shadow: none;
box-shadow: none !important;
-webkit-text-fill-color: #1f2937 !important;
-webkit-transition-delay: 9999s !important;
-webkit-transition: color 9999s ease-out, background-color 9999s ease-out !important;
}
@ -142,13 +266,13 @@ body, .login-container {
}
button {
color: #333 !important;
color: #fff !important;
height: 45px !important;
border: none !important;
background: #fff !important;
border-radius: @BoxBorderRadius !important;
background: #0f766e !important;
border-radius: 6px !important;
letter-spacing: 1px !important;
box-shadow: 0 15px 30px 0 hsla(0, 0%, 100%, .25) inset, 0 2px 7px 0 rgba(0, 0, 0, .2);
box-shadow: none;
&:hover {
opacity: 1;
@ -166,7 +290,7 @@ body, .login-container {
text-align: center;
line-height: 30px;
padding-bottom: 10px;
text-shadow: #000 .1em .1em .1em;
text-shadow: none;
a, span {
color: #fff;
@ -176,4 +300,4 @@ body, .login-container {
color: #ccc
}
}
}
}