Compare commits

..

8 Commits
1.0.1 ... main

Author SHA1 Message Date
ichynul 0ee279c079 调整模板路径 2023-12-04 22:03:40 +08:00
ichynul fa28755d96 update 2023-12-01 01:30:47 +08:00
ichynul 86f2d25114 修复webman中运行问题 2023-12-01 00:40:37 +08:00
ichynul 6ff5493a85 update readme 2023-11-30 22:04:27 +08:00
ichynul 4d374776ce 修复:登录页面验证码长度限制过短问题 2023-11-30 21:58:41 +08:00
ichynul 6c6ad1aafa 提升兼容性 2023-11-20 22:58:39 +08:00
ichynul d8a0eb661c 修复资源路径 2023-11-20 22:33:33 +08:00
ichynul 5f484c823c 卸载检测 2023-11-12 00:01:53 +08:00
11 changed files with 109 additions and 1013 deletions

View File

@ -1,5 +1,19 @@
## element-plus
# vue-next-admin
### 基于 [Vue-next-admin] 对 `tpextmyadmin`的UI替换方案
## 关于
### 部分样式和组件来源于 `vue-next-admin` : <https://gitee.com/lyt-top/vue-next-admin>
替换默认的:`/admin/index/index`主体页面样式和登录页面`/admin/index/login`样式
## 使用
1. 下载安装本扩展
2. 打开设置:在[平台设置]-[后台框架]
3. 点击`index主体页面风格`下拉框,选择`vue-next-admin样式`
4. 点击`登录页面风格`下拉框,选择`vue-next-admin样式` (可选,登录页面可不换)
5. [F5]刷新浏览器生效。
## 注意事项
卸载本扩展时,要先把使用中的模板修改为其他。
## 部分样式和组件来源于 `vue-next-admin` : <https://gitee.com/lyt-top/vue-next-admin>

View File

@ -7,7 +7,7 @@
<span>{$admin_logo|raw|default='admin'}</span>
</div>
<div class="layout-logo-size" v-else @click="onCollapseConfigChange">
<img src="/assets/elementplus/logo/logo-mini.svg" class="layout-logo-size-img" />
<img src="/assets/vuenextadmin/logo/logo-mini.svg" class="layout-logo-size-img" />
</div>
</template>
<el-scrollbar class="flex-auto" ref="layoutAsideScrollbarRef" @mouseenter="onAsideEnterLeave(true)"

View File

@ -33,7 +33,7 @@
</div>
<!--Breadcrumb end-->
<template v-if="getThemeConfig.layout=='transverse'">
{include file="$admin_horizontal" /}
{include file="components/horizontal" /}
</template>
<!--User-->
<div class="layout-navbars-breadcrumb-user pr15" :style="{ flex: layoutUserFlexNum }">

View File

@ -326,7 +326,7 @@
<div class="layout-tips-warp"
:class="{ 'layout-tips-warp-active': getThemeConfig.layout === 'defaults' }">
<div class="layout-tips-box">
<p class="layout-tips-txt">默认</p>
<p class="layout-tips-txt">传统</p>
</div>
</div>
</div>

View File

@ -9,7 +9,7 @@
<title>首页 - {$admin_page_title|default=''}</title>
<link rel="icon" href="{$admin_favicon|default=''}" type="image/ico">
<meta name="description" content="{$admin_page_description|default=''}">
<link rel="stylesheet" href="/assets/elementplus/theme/index.css?v={$admin_assets_ver|default='1.0'}" />
<link rel="stylesheet" href="/assets/vuenextadmin/theme/index.css?v={$admin_assets_ver|default='1.0'}" />
<link rel="stylesheet"
href="/assets/lightyearadmin/css/materialdesignicons.min.css?v={$admin_assets_ver|default='1.0'}">
</head>
@ -23,15 +23,15 @@
:element-loading-background="getThemeConfig.isIsDark ? 'rgba(0, 0, 0, 0.7)' : 'rgba(0, 0, 0, 0.4)'"
class="layout-container">
<!--LayoutAside-->
{include file="$admin_aside" /}
{include file="components/aside" /}
<!--LayoutAside end-->
<el-container class="layout-container-view h100">
<el-scrollbar ref="layoutScrollbarRef" class="layout-backtop">
<!--LayoutHeader-->
{include file="$admin_header" /}
{include file="components/header" /}
<!--LayoutHeader end-->
<!--LayoutMain-->
{include file="$admin_main" /}
{include file="components/main" /}
<!--LayoutMain end-->
</el-scrollbar>
</el-container>
@ -45,18 +45,18 @@
:element-loading-background="getThemeConfig.isIsDark ? 'rgba(0, 0, 0, 0.7)' : 'rgba(0, 0, 0, 0.4)'"
class="layout-container">
<!--ColumnsAside-->
{include file="$admin_columns_aside" /}
{include file="components/columns-aside" /}
<!--ColumnsAside end-->
<el-container class="layout-columns-warp layout-container-view h100">
<!--LayoutAside-->
{include file="$admin_aside" /}
{include file="components/aside" /}
<!--LayoutAside end-->
<el-scrollbar ref="layoutScrollbarRef" class="layout-backtop">
<!--LayoutHeader-->
{include file="$admin_header" /}
{include file="components/header" /}
<!--LayoutHeader end-->
<!--LayoutMain-->
{include file="$admin_main" /}
{include file="components/main" /}
<!--LayoutMain end-->
</el-scrollbar>
</el-container>
@ -70,17 +70,17 @@
:element-loading-background="getThemeConfig.isIsDark ? 'rgba(0, 0, 0, 0.7)' : 'rgba(0, 0, 0, 0.4)'"
class="layout-container flex-center layout-backtop">
<!--LayoutHeader-->
{include file="$admin_header" /}
{include file="components/header" /}
<!--LayoutHeader end-->
<!--LayoutMain-->
{include file="$admin_main" /}
{include file="components/main" /}
<!--LayoutMain end-->
</el-container>
</template>
<!--layout-transverse end-->
<!--Settings-->
{include file="$admin_setting" /}
{include file="components/setting" /}
<!--Settings end-->
</el-config-provider>
</div>
@ -88,37 +88,37 @@
charset="utf-8"></script>
<script type="text/javascript" src="/assets/tpextbuilder/js/layer/layer.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/vue.global.prod.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/vue.global.prod.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/index.full.min.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/index.full.min.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/icons.min.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/icons.min.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/axios.min.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/axios.min.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/vue-demi.iife.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/vue-demi.iife.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/mitt.umd.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/mitt.umd.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/pinia.iife.prod.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/pinia.iife.prod.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/Sortable.min.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/Sortable.min.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/locale/zh-cn.min.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/locale/zh-cn.min.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/js/index.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/js/index.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/utils/storage.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/utils/storage.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/utils/watermark.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/utils/watermark.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/utils/mitt.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/utils/mitt.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/utils/theme.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/utils/theme.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/stores/themeConfig.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/stores/themeConfig.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/stores/tagsViewRoutes.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/stores/tagsViewRoutes.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript">
const { createApp, computed, ref, reactive, onBeforeMount, onMounted, onUnmounted, nextTick, watch } = Vue;
@ -958,7 +958,7 @@
const setColumnsAsideMove = (k) => {
if (k === undefined) return false;
state.liIndex = k;
if (columnsAsideActiveRef.value) {
if (columnsAsideActiveRef.value && columnsAsideOffsetTopRefs.value[k]) {
columnsAsideActiveRef.value.style.top = `${columnsAsideOffsetTopRefs.value[k].offsetTop + state.difference}px`;
}
};
@ -1023,7 +1023,7 @@
document.getElementById('app').className = '';
initSortable();
let wartermark_text = '{$wartermark_text}';
let wartermark_text = "{$wartermark_text|default=''}";
if (wartermark_text) {
watermark.set(wartermark_text + " - {$admin_user.username|default=''}");
}

View File

@ -9,8 +9,8 @@
<title>登录 - {$admin_page_title|default=''}</title>
<link rel="icon" href="{$admin_favicon|default=''}" type="image/ico">
<meta name="description" content="{$admin_page_description|default=''}">
<link rel="stylesheet" href="/assets/elementplus/theme/login.css?v={$admin_assets_ver|default='1.0'}" />
<link rel="stylesheet" href="/assets/elementplus/lib/index.css?v={$admin_assets_ver|default='1.0'}" />
<link rel="stylesheet" href="/assets/vuenextadmin/theme/login.css?v={$admin_assets_ver|default='1.0'}" />
<link rel="stylesheet" href="/assets/vuenextadmin/lib/index.css?v={$admin_assets_ver|default='1.0'}" />
<script>
if ('{$login_in_top}' == '1' && window != top) {
top.location.replace("{:url('/admin/index/login')}");
@ -44,7 +44,7 @@
<div class="login-left-img">
<img src="{$admin_login_background_img}" />
</div>
<img src="/assets/elementplus/logo/login-bg.svg" class="login-left-waves" />
<img src="/assets/vuenextadmin/logo/login-bg.svg" class="login-left-waves" />
</div>
<div class="login-right flex">
<div class="login-right-warp flex-margin">
@ -57,7 +57,7 @@
<el-form size="large" class="login-content-form" :model="state.ruleForm"
:rules="state.rules" ref="formRef">
<el-form-item class="login-animation1" prop="username">
<el-input text placeholder="账号" v-model="state.ruleForm.username" clearable
<el-input type="text" placeholder="账号" v-model="state.ruleForm.username" :clearable="true"
autocomplete="off">
<template #prefix>
<el-icon class="el-input__icon">
@ -92,8 +92,8 @@
</el-form-item>
<el-form-item class="login-animation3" prop="captcha">
<el-col :span="15">
<el-input text maxlength="4" placeholder="验证码"
v-model="state.ruleForm.captcha" clearable autocomplete="off">
<el-input type="text" maxlength="6" placeholder="验证码"
v-model="state.ruleForm.captcha" :clearable="true" autocomplete="off">
<template #prefix>
<el-icon class="el-input__icon">
<ele-position></ele-position>
@ -124,15 +124,15 @@
</div>
</div>
</div>
<script type="text/javascript" src="/assets/elementplus/lib/vue.global.prod.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/vue.global.prod.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/index.full.min.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/index.full.min.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/icons.min.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/icons.min.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/axios.min.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/axios.min.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript" src="/assets/elementplus/lib/locale/zh-cn.min.js?v={$admin_assets_ver|default='1.0'}"
<script type="text/javascript" src="/assets/vuenextadmin/lib/locale/zh-cn.min.js?v={$admin_assets_ver|default='1.0'}"
charset="utf-8"></script>
<script type="text/javascript">
const state = Vue.reactive({

View File

@ -1,43 +0,0 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no" />
<title>{$admin_page_position|default='后台'} - {$admin_page_title|default=''}</title>
<link rel="icon" href="{$admin_favicon|default=''}" type="image/ico">
<meta name="description" content="{$admin_page_description|default=''}">
{notempty name="$admin_css"}
{volist name="admin_css" id="item"}
<link href="{$item}" rel="stylesheet">
{/volist}
{/notempty}
{block name="style"}
<!--stylesheets-->
{/block}
</head>
<body>
<!--页面主要内容-->
<div class="layout-container">
<div class="layout-padding w100">
<div class="layout-padding-view">
{block name="content"}{/block}
</div>
</div>
</div>
<!--End 页面主要内容-->
{notempty name="$admin_js"}
{volist name="admin_js" id="item"}
<script type="text/javascript" src="{$item}" charset="utf-8"></script>
{/volist}
{/notempty}
<script>
window.__token__ = "{$__token__|default=''}";
</script>
{block name="script"}
<!--scripts-->
{/block}
</body>
</html>

View File

@ -1,50 +0,0 @@
.el-form .el-form-item.tpext-form-item {
margin-bottom: 6px;
padding-right: 14px;
padding-left: 14px;
}
.el-form.search-form .el-form-item.tpext-form-item {
margin-bottom: 4px;
padding-right: 0;
padding-left: 0;
}
.el-form .el-form-item.tpext-form-item .el-form-item__content {
padding-left: 12px;
padding-right: 12px;
}
.el-form-item.tpext-form-item .el-form-item__content.fields-div {
padding-left: 0;
padding-right: 0;
}
.el-form-item__content.fields-div .el-form-item.tpext-form-item {
padding-left: 0;
padding-right: 0;
}
.el-form--label-left.no-margin-bottom .el-form-item__label {
margin-bottom: 0;
}
.el-row {
padding-left: 12px;
padding-right: 12px;
}
a.el-button {
text-decoration: none;
}
.el-form .el-form-item--mini.el-form-item,
.el-form .el-form-item--small.el-form-item {
margin-bottom: 12px
}
.el-form.search-form .el-form-item--mini.el-form-item,
.el-form.search-form .el-form-item--small.el-form-item {
margin-bottom: 3px
}

View File

@ -1,856 +0,0 @@
(function (w) {
var tpextbuilder = function () { };
tpextbuilder.autoPost = function (classname, url, refresh) {
$('body').on('change', '.' + classname + ' :checkbox', function () {
if ($(this).hasClass('switch-box')) {
var text = $(this).parent('label').prev('input[type="hidden"]');
var name = text.attr('name');
var val = $(this).is(':checked') ? $(this).data('on') : $(this).data('off');
name = name.split('-')[0];
var dataid = $(this).parents('tr.table-row-id').data('id');
tpextbuilder.autoSendData({
id: dataid,
name: name,
value: val
}, url, refresh);
}
else {
var name = $(this).attr('name');
var values = [];
$('.' + classname + " input[name='" + name + "']:checked").each(function (i, e) {
values.push($(e).val());
});
var val = values.join(',');
name = name.split('-')[0];
var dataid = $(this).parents('tr.table-row-id').data('id');
tpextbuilder.autoSendData({
id: dataid,
name: name,
value: val
}, url, refresh);
}
});
$('body').on('change', '.' + classname + ' :radio', function () {
var name = $(this).attr('name');
var val = $('.' + classname + " input[name='" + name + "']:checked").val();
name = name.split('-')[0];
var dataid = $(this).parents('tr.table-row-id').data('id');
tpextbuilder.autoSendData({
id: dataid,
name: name,
value: val
}, url, refresh);
});
var timer = null;
$('body').on('change', '.' + classname + ' input[type="text"]', function () {
clearTimeout(timer);
var that = this;
timer = setTimeout(function () {
var name = $(that).attr('name');
var val = $(that).val();
name = name.split('-')[0];
var dataid = $(that).parents('tr.table-row-id').data('id');
tpextbuilder.autoSendData({
id: dataid,
name: name,
value: val
}, url, refresh);
}, 200);
});
$('body').on('change', '.' + classname + ' textarea', function () {
clearTimeout(timer);
var that = this;
timer = setTimeout(function () {
var name = $(that).attr('name');
var val = $(that).val();
name = name.split('-')[0];
var dataid = $(that).parents('tr.table-row-id').data('id');
tpextbuilder.autoSendData({
id: dataid,
name: name,
value: val
}, url, refresh);
}, 200);
});
$('body').on('change', '.' + classname + ' select', function () {
var name = $(this).attr('name');
var val = $(this).val();
name = name.split('-')[0];
var dataid = $(this).parents('tr.table-row-id').data('id');
tpextbuilder.autoSendData({
id: dataid,
name: name,
value: val
}, url, refresh);
});
};
tpextbuilder.postChecked = function (id, url, confirm) {
var obj = $('#' + id);
if (!obj.size()) {
return;
}
$('body').on('click', '#' + id, function () {
var val = '';
var values = [];
$("input.table-row:checked").each(function (i, e) {
values.push($(e).val());
});
if (values.length == 0) {
lightyear.notify('未选中任何数据', 'warning');
return false;
}
val = values.join(',');
if (confirm && confirm != '0' && confirm != 'false') {
if (confirm == '1') {
var text = $('#' + id).text().trim() || $(this).attr('title');
confirm = '确定要执行批量<strong>' + text + '</strong>操作吗?';
}
$.alert({
title: '操作提示',
content: confirm,
type: 'orange',
buttons: {
confirm: {
text: '确认',
btnClass: 'btn-primary',
action: function () {
tpextbuilder.autoSendData({
ids: val
}, url, 1);
}
},
cancel: {
text: '取消',
action: function () {
}
}
}
});
} else {
tpextbuilder.autoSendData({
ids: val
}, url, 1);
}
});
if ($("input.table-row:checked").size() == 0) {
$('#' + id).addClass('disabled');
} else {
$('#' + id).removeClass('disabled');
}
$('body').on('change', 'input.table-row', function () {
if ($("input.table-row:checked").size() == 0) {
$('#' + id).addClass('disabled');
} else {
$('#' + id).removeClass('disabled');
}
});
$('body').on('change', 'input.table-row-checkall', function () {
if ($("input.table-row:checked").is(':checked')) {
$('#' + id).removeClass('disabled');
} else {
$('#' + id).addClass('disabled');
}
});
};
tpextbuilder.openChecked = function (id, url) {
var obj = $('#' + id);
if (!obj.size()) {
return;
}
$('body').on('click', '#' + id, function () {
var val = '';
var values = [];
$("input.table-row:checked").each(function (i, e) {
values.push($(e).val());
});
if (values.length == 0) {
lightyear.notify('未选中任何数据', 'warning');
return false;
}
val = values.join(',');
var size = $(this).data('layer-size');
size = size ? size.split(',') : null;
w.layerOpen(this, size, url + (/.+\?.*/.test(url) ? '&ids=' : '?ids=') + val);
return false;
});
if ($("input.table-row:checked").size() == 0) {
$('#' + id).addClass('disabled');
} else {
$('#' + id).removeClass('disabled');
}
$('body').on('change', 'input.table-row', function () {
if ($("input.table-row:checked").size() == 0) {
$('#' + id).addClass('disabled');
} else {
$('#' + id).removeClass('disabled');
}
});
$('body').on('change', 'input.table-row-checkall', function () {
if ($("input.table-row:checked").is(':checked')) {
$('#' + id).removeClass('disabled');
} else {
$('#' + id).addClass('disabled');
}
});
};
tpextbuilder.postActionsChecked = function (id, confirms) {
var obj = $('#' + id);
if (!obj.size()) {
return;
}
$('body').on('click', '#' + id + '-div .dropdown-menu li a', function () {
var url = $(this).data('url');
var confirm = confirms[url];
var val = '';
var values = [];
$("input.table-row:checked").each(function (i, e) {
values.push($(e).val());
});
if (values.length == 0) {
lightyear.notify('未选中任何数据', 'warning');
return false;
}
val = values.join(',');
if (confirm && confirm != '0' && confirm != 'false') {
if (confirm == '1') {
var text = $(this).text().trim();
confirm = '确定要执行批量<strong>' + text + '</strong>操作吗?';
}
$.alert({
title: '操作提示',
content: confirm,
type: 'orange',
buttons: {
confirm: {
text: '确认',
btnClass: 'btn-primary',
action: function () {
tpextbuilder.autoSendData({
ids: val
}, url, 1);
}
},
cancel: {
text: '取消',
action: function () {
}
}
}
});
} else {
tpextbuilder.autoSendData({
ids: val
}, url, 1);
}
});
if ($("input.table-row:checked").size() == 0) {
$('#' + id).addClass('disabled');
} else {
$('#' + id).removeClass('disabled');
}
$('body').on('change', 'input.table-row', function () {
if ($("input.table-row:checked").size() == 0) {
$('#' + id).addClass('disabled');
} else {
$('#' + id).removeClass('disabled');
}
});
$('body').on('change', 'input.table-row-checkall', function () {
if ($("input.table-row:checked").is(':checked')) {
$('#' + id).removeClass('disabled');
} else {
$('#' + id).addClass('disabled');
}
});
};
tpextbuilder.postRowid = function (classname, url, confirm) {
$('body').on('click', '.row-__action__ .' + classname, function () {
var val = $(this).data('id');
if (confirm && confirm != '0' && confirm != 'false') {
if (confirm == '1') {
var text = $(this).text().trim() || $(this).attr('title') || '此';
confirm = '确定要执行<strong>' + text + '</strong>操作吗?';
}
$.alert({
title: '操作提示',
content: confirm,
type: 'orange',
buttons: {
confirm: {
text: '确认',
btnClass: 'btn-primary',
action: function () {
tpextbuilder.autoSendData({
ids: val
}, url, 1);
}
},
cancel: {
text: '取消',
action: function () {
}
}
}
});
} else {
tpextbuilder.autoSendData({
ids: val
}, url, 1);
}
});
};
tpextbuilder.postActionsRowid = function (classname, confirms) {
$('body').on('click', '.row-__action__ .' + classname + ' .dropdown-menu li a', function () {
var url = $(this).data('url');
var confirm = confirms[url];
var val = $('.row-__action__ .' + classname).data('id');
if (confirm && confirm != '0' && confirm != 'false') {
if (confirm == '1') {
var text = $(this).text().trim() || $(this).attr('title') || '此';
confirm = '确定要执行<strong>' + text + '</strong>操作吗?';
}
else if (confirm == '2') {
var size = $('.' + classname).find('.btn-actions').data('layer-size');
size = size ? size.split(',') : null;
w.layerOpen(this, size);
return false;
}
$.alert({
title: '操作提示',
content: confirm,
type: 'orange',
buttons: {
confirm: {
text: '确认',
btnClass: 'btn-primary',
action: function () {
tpextbuilder.autoSendData({
ids: val
}, url, 1);
}
},
cancel: {
text: '取消',
action: function () {
}
}
}
});
} else {
tpextbuilder.autoSendData({
ids: val
}, url, 1);
}
});
};
tpextbuilder.autoSendData = function (data, url, refresh, del) {
data.__token__ = w.__token__;
data._method = /.+?\/(?:destroy|delete|remove|del)(?:\.\w+)?$/.test(url) ? "delete" : "patch";
lightyear.loading('show');
$.ajax({
url: url,
data: data,
type: "POST",
dataType: "json",
success: function (data) {
lightyear.loading('hide');
if (data.__token__) {
w.__token__ = data.__token__;
}
if (data.status || data.code) {
lightyear.notify(data.msg || data.message || '操作成功!', 'success');
if (refresh) {
$('.search-refresh').trigger('click');
}
} else {
lightyear.notify(data.msg || data.message || '操作失败', 'warning');
}
if (data.script || (data.data && data.data.script)) {
var script = data.script || data.data.script;
if ($('#script-div').size()) {
$('#script-div').html(script);
} else {
$('body').append(
'<div class="hidden" id="script-div">' + data.script + '</div>');
}
}
},
error: function () {
lightyear.loading('hide');
lightyear.notify('网络错误', 'danger');
}
});
};
w.tpextbuilder = tpextbuilder;
w.layerOpen = function (obj, size, url) {
var href = url || $(obj).data('url') || $(obj).attr('url') || $(obj).attr('href');
var text = $(obj).data('title') || $(obj).attr('title') || $(obj).text();
if ($(obj).data('layer-size')) {
size = $(obj).data('layer-size').split(',');
}
var winheight = $(window).height() - 14;
layer.open({
type: 2,
title: text,
shadeClose: false,
scrollbar: false,
maxmin: true,
anim: 5, //渐显
shade: 0.3,
maxHeight: winheight,
area: size || ['90%', '400'],
offset: '7px',
content: href,
success: function (layero, index) {
if (!size || size[1] == 'auto' || size[1] == '' || size[1] == '0') {
var iframe = layero.find('iframe').get(0);
var mainheight = $(iframe.contentWindow.document.body).find('.panel-default.content').height() + 10;
if (mainheight < 400) {
mainheight = 400;
}
if (mainheight > winheight - 43) {
mainheight = winheight - 43;
}
$(iframe).height(mainheight);
//layero.css('top', ((winheight - mainheight - 43) / 2) + 'px');
layer.iframeAuto(index);
}
$(':focus').blur();
this.enterEsc = function (event) {
if (event.keyCode === 13) {
return false; //阻止系统默认回车事件
}
if (event.keyCode === 0x1B) {
var index2 = layer.msg('关闭当前弹窗?', {
time: 2000,
btn: ['确定', '取消'],
yes: function (params) {
layer.close(index);
layer.close(index2);
}
});
return false; //阻止系统默认esc事件
}
};
$(document).on('keydown', this.enterEsc); //监听键盘事件,关闭层
},
end: function () {
$(document).off('keydown', this.enterEsc); //解除键盘关闭事件
}
});
return false;
};
})(window);
window.renderFiles = function (elid) {
/*
* 示例上传成功采用返回ID的形式即上传成功以附件表形式存储返回给前端ID值
* 成功返回示例{"status":200,"info":"成功","class":"success","id":1,"picurl":".\/upload\/images\/lyear_5ddfc00174bbb.jpg"}
* 这里设定单图上传为js-upload-image多图上传为js-upload-images
* 存放预览图的div元素命名file_list_*后面的上传按钮的命名filePicker_*这里的*跟隐藏的input的name对应方便单页面中存在有多个上传时区分以及使用
* input上保存上传后的图片ID以及设置上传时的一些参数
*/
elid = elid ? elid : '';
// 通用绑定,
$(elid + '.js-upload-files').each(function () {
var $input_file = $(this).find('input.file-url-input'),
$input_file_name = $(this).data('name');
var jsOptions = window.uploadConfigs[$input_file_name];
var $multiple = jsOptions.multiple, // 是否选择多个文件
$ext = jsOptions.ext.join(','), // 支持的文件后缀
$size = jsOptions.fileSingleSizeLimit; // 支持最大的文件大小
var $file_list = $('#file_list_' + $input_file_name);
var $file_list_upli = $('#file_list_' + $input_file_name + '_upli');
var ratio = window.devicePixelRatio || 1;
var thumbnailWidth = (jsOptions.thumbnailWidth || 165) * ratio;
var thumbnailHeight = (jsOptions.thumbnailHeight || 110) * ratio;
$file_list.find('li.pic-item').each(function (ii, ee) {
var $li = $(ee);
var $btn = $li.find('a.btn-link-pic');
if ($btn && $btn.attr('href')) {
var href = $btn.attr('href');
$img = $li.find('img.preview-img');
if (!jsOptions.isImage && !/.+\.(png|jpg|jpeg|gif|bmp|wbmp|webpg|ico)(\?.*)?$/i.test(href)) {
$btn.removeClass('btn-link-pic');
$btn.attr('target', '_blank');
$img.attr('src', '/index.php/tpextbuilder/index/file/extimg/type/' + href.replace(/.+?\.(\w+)$/, '$1'));
}
else {
$img.attr('src', href);
}
$img.css({
'display': 'block',
'max-width': thumbnailWidth + 'px',
'margin': '0 auto'
}).parent('div').css({
'height': thumbnailHeight + 'px',
'width': thumbnailWidth + 'px',
});
}
});
if (jsOptions.canUpload || !jsOptions.istable) {
$file_list_upli.css({
'height': thumbnailHeight + 'px',
'width': thumbnailWidth + 'px',
'padding-left': '10px',
'display': 'block',
});
var uploader = WebUploader.create({
auto: true,
chunked: true,
prepareNextFile: true,
duplicate: jsOptions.duplicate ? true : false,
resize: jsOptions.resize ? true : false,
swf: jsOptions.swf_url,
server: jsOptions.upload_url,
pick: {
id: '#picker_' + $input_file_name,
multiple: $multiple
},
fileSingleSizeLimit: $size,
fileNumLimit: 99,
fileSizeLimit: jsOptions.fileSizeLimit,
accept: {
title: '文件',
extensions: $ext,
mimeTypes: jsOptions.mimeTypes || '*/*'
},
thumb: {
// 图片质量只有type为`image/jpeg`的时候才有效。
quality: 70,
// 是否允许放大如果想要生成小图的时候不失真此选项应该设置为false.
allowMagnify: false,
// 是否允许裁剪。
crop: true,
// 为空的话则保留原有图片格式。
// 否则强制转换成指定的类型。
type: 'image/jpeg'
}
});
uploader.on('beforeFileQueued', function (file) {
if (jsOptions.fileNumLimit > 1 && $file_list.find('li.pic-item').size() >= jsOptions.fileNumLimit) {
lightyear.notify('最多允许上传' + jsOptions.fileNumLimit + '个文件', 'danger');
return false;
}
});
uploader.on('fileQueued', function (file) {
var $li = $('<li class="pic-item" id="' + file.id + '">' +
' <figure>' +
'<div>' +
' <img>' +
'</div>' +
' <figcaption>' +
' <a class="btn btn-xs btn-round btn-square btn-primary btn-link-pic" href="javascript:;"><i class="mdi mdi-eye"></i></a>' +
' <a class="btn btn-xs btn-round btn-square btn-danger btn-remove-pic" href="javascript:;"><i class="mdi mdi-delete"></i></a>' +
' </figcaption>' +
' </figure>' +
'</li>'),
$img = $li.find('img');
if (jsOptions.fileNumLimit <= 1) {
$file_list.find('li.pic-item').remove();
}
$file_list.append($li);
uploader.makeThumb(file, function (error, src) {
if (!jsOptions.isImage && !/(png|jpg|jpeg|gif|bmp|wbmp|webpg|ico)$/i.test(file.ext) && error) {
src = '/index.php/tpextbuilder/index/file/extimg/type/' + file.ext;
$img.addClass('cantpreview');
}
else {
$img.addClass('imgpreview');
}
$img.attr('src', src);
$img.css({
'display': 'block',
'max-width': thumbnailWidth + 'px',
'margin': '0 auto'
}).parent('div').css({
'height': thumbnailHeight + 'px',
'width': thumbnailWidth + 'px',
});
}, thumbnailWidth, thumbnailHeight);
$('<div class="progress progress-xs"><div class="progress-bar progress-bar-primary progress-bar-striped" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div></div>').appendTo($li);
});
uploader.on('uploadProgress', function (file, percentage) {
var $percent = $('#' + file.id).find('.progress-bar');
$percent.css('width', percentage * 100 + '%');
});
uploader.on('uploadSuccess', function (file, response) {
var $li = $('#' + file.id);
if (response.status == 200) { // 返回200成功
if (jsOptions.fileNumLimit > 1) {
if ($input_file.val()) {
$input_file.val($input_file.val() + ',' + response.picurl).trigger('change');
} else {
$input_file.val(response.picurl).trigger('change');
}
$li.find('.btn-remove-pic').attr('data-id', response.id).attr('data-url', response.picurl);
} else {
$input_file.val(response.picurl).trigger('change');
}
}
$('<div class="' + response.class + ' upload-result"></div>').text(response.info + '(' + $file_list.find('li.pic-item').size() + '/' + jsOptions.fileNumLimit + ')').appendTo($li.find('figure'));
if ($li.find('.cantpreview').size() > 0) {
$li.find('a.btn-link-pic').attr('href', response.picurl).removeClass('btn-link-pic').attr('target', '_blank');
} else {
$li.find('.imgpreview').attr('src', response.picurl);
$li.find('a.btn-link-pic').attr('href', response.picurl);
}
setTimeout(function () {
$li.find('.upload-result').remove();
}, 3000);
});
uploader.on('uploadError', function (file) {
var $li = $('#' + file.id);
$('<div class="error upload-result">上传失败</div>').appendTo($li).find('figure');
setTimeout(function () {
$li.remove();
}, 3000);
});
uploader.on('error', function (type) {
switch (type) {
case 'Q_TYPE_DENIED':
lightyear.notify('文件类型不正确,只允许上传后缀名为:' + $ext + ',请重新上传!', 'danger');
break;
case 'F_EXCEED_SIZE':
lightyear.notify('文件不得超过' + ($size / 1024) + 'kb请重新上传', 'danger');
break;
}
});
uploader.on('uploadComplete', function (file) {
setTimeout(function () {
$('#' + file.id).find('.progress').remove();
}, 500);
});
// 删除操作
$file_list.delegate('.btn-remove-pic', 'click', function () {
var url = $(this).data('url');
var that = $(this);
$.alert({
title: '提示',
content: '确认要删除此文件吗?',
buttons: {
confirm: {
text: '确认',
btnClass: 'btn-primary',
action: function () {
if (jsOptions.fileNumLimit > 1) {
var ids = $input_file.val().split(',');
if (url) {
for (var i = 0; i < ids.length; i++) {
if (ids[i] == url) {
ids.splice(i, 1);
break;
}
}
$input_file.val(ids.join(',')).trigger('change');
}
} else {
$input_file.val('').trigger('change');
}
that.closest('.pic-item').remove();
}
},
cancel: {
text: '取消',
action: function () {
}
}
}
});
});
}
// 接入图片查看插件
$(this).magnificPopup({
delegate: 'a.btn-link-pic',
type: 'image',
gallery: {
enabled: true
}
});
});
};
window.chooseFile = function (id, $input_file_name) {
var jsOptions = window.uploadConfigs[$input_file_name];
var $file_list = $('#file_list_' + $input_file_name);
var chooseUrl = jsOptions.chooseUrl || '/admin/attachment/index?';
if (jsOptions.fileNumLimit > 1 && $file_list.find('li.pic-item').size() >= jsOptions.fileNumLimit) {
lightyear.notify('最多允许上传' + jsOptions.fileNumLimit + '个文件', 'danger');
return false;
}
var obj = $('#' + id);
var size = ['98%', '98%'];
if (obj.data('layer-size')) {
size = obj.data('layer-size').split(',');
}
layer.open({
type: 2,
title: '文件选择',
shadeClose: false,
scrollbar: false,
shade: 0.3,
anim: 2, //从最底部往上滑入
area: size,
content: chooseUrl + 'choose=1&id=' + id + '&limit=' + jsOptions.fileNumLimit + '&ext=' + jsOptions.ext.join(','),
success: function (layero, index) {
$(':focus').blur();
this.enterEsc = function (event) {
if (event.keyCode === 13) {
return false; //阻止系统默认回车事件
}
if (event.keyCode === 0x1B) {
var index2 = layer.msg('关闭当前弹窗?', {
time: 2000,
btn: ['确定', '取消'],
yes: function (params) {
layer.close(index);
layer.close(index2);
}
});
return false; //阻止系统默认esc事件
}
};
$(document).on('keydown', this.enterEsc); //监听键盘事件,关闭层
},
end: function () {
$(document).off('keydown', this.enterEsc); //解除键盘关闭事件
window.refreshFiles(jsOptions, $file_list, obj);
}
});
};
window.refreshFiles = function (jsOptions, $file_list, $input_file) {
var ratio = window.devicePixelRatio || 1;
var thumbnailWidth = (jsOptions.thumbnailWidth || 165) * ratio;
var thumbnailHeight = (jsOptions.thumbnailHeight || 110) * ratio;
$file_list.find('li.pic-item').remove();
if ($input_file.val().trim() == '') {
return;
}
var filesArr = $input_file.val().split(',');
for (var i in filesArr) {
var src = filesArr[i];
var $li = $('<li class="pic-item" id="fild' + i + '">' +
' <figure>' +
'<div style="width:' + thumbnailWidth + 'px;height:' + thumbnailHeight + 'px">' +
' <img class="preview-img" />' +
'</div>' +
' <figcaption>' +
' <a class="btn btn-xs btn-round btn-square btn-primary btn-link-pic" href="' + src + '"><i class="mdi mdi-eye"></i></a>' +
' <a class="btn btn-xs btn-round btn-square btn-danger btn-remove-pic" href="javascript:;"><i class="mdi mdi-delete"></i></a>' +
' </figcaption>' +
' </figure>' +
'</li>');
var $img = $li.find('img');
var $btn = $li.find('a.btn-link-pic');
$li.find('.btn-remove-pic').attr('data-id', i).attr('data-url', src);
$file_list.append($li);
if (!jsOptions.isImage && !/.+\.(png|jpg|jpeg|gif|bmp|wbmp|webpg|ico)$/i.test(src)) {
src = '/index.php/tpextbuilder/index/file/extimg/type/' + src.replace(/.+?\.(\w+)$/, '$1');
$img.addClass('cantpreview');
$btn.removeClass('btn-link-pic');
$btn.attr('target', '_blank');
}
$img.attr('src', src);
$img.css({
'display': 'block',
'max-width': thumbnailWidth + 'px',
'margin': '0 auto'
}).parent('div').css({
'height': thumbnailHeight + 'px',
'width': thumbnailWidth + 'px',
});
}
}
$(function () {
//动态选择框,上下级选中状态变化
window.renderFiles();
});

View File

@ -36,11 +36,11 @@ window.useThemeConfig = Pinia.defineStore('themeConfig', {
* 菜单设置
*/
// 默认菜单导航背景颜色
menuBar: '#545c64',
menuBar: '#3a3e42',
// 默认菜单导航字体颜色
menuBarColor: '#eaeaea',
// 默认菜单高亮背景色
menuBarActiveColor: 'rgba(0, 0, 0, 0.2)',
menuBarActiveColor: 'rgba(115, 145, 183, 0.2)',
// 是否开启菜单背景颜色渐变
isMenuBarColorGradual: false,
@ -48,7 +48,7 @@ window.useThemeConfig = Pinia.defineStore('themeConfig', {
* 分栏设置
*/
// 默认分栏菜单背景颜色
columnsMenuBar: '#545c64',
columnsMenuBar: '#3a3e42',
// 默认分栏菜单字体颜色
columnsMenuBarColor: '#e6e6e6',
// 是否开启分栏菜单背景颜色渐变
@ -126,8 +126,8 @@ window.useThemeConfig = Pinia.defineStore('themeConfig', {
* 注意为了演示切换布局时颜色会被还原成默认代码位置/@/layout/navBars/topBar/setings.vue
* 中的 `initSetLayoutChange(设置布局切换,重置主题样式)` 方法
*/
// 布局切换:可选值"<defaults|classic|transverse|columns>",默认 defaults
layout: 'defaults',
// 布局切换:可选值"<defaults|classic|transverse|columns>",默认 columns
layout: 'columns',
/**
* 后端控制路由

View File

@ -2,13 +2,15 @@
namespace vuenextadmin\common;
use tpext\think\App;
use tpext\think\View;
use tpext\common\ExtLoader;
use tpext\common\Resource as baseResource;
use tpext\myadmin\common\Module as adminModule;
use tpext\think\View;
class Resource extends baseResource
{
protected $version = '1.0.1';
protected $version = '1.0.4';
protected $name = 'vue.next.admin';
@ -28,24 +30,53 @@ class Resource extends baseResource
adminModule::getInstance()->addIndexView($indexView, 'vue-next-admin样式');
adminModule::getInstance()->addLoginView($loginView, 'vue-next-admin样式');
$adminConfig = adminModule::getInstance()->getConfig();
$this->shareVars();
if (ExtLoader::isWebman()) {
//webman 每次请求结束后清除View::clearShareVars(),需要监听请求开始事件重新共享
ExtLoader::watch('tpext_webman_run', function () {
$this->shareVars();
});
}
}
public function shareVars()
{
$indexView = $this->getRoot() . implode(DIRECTORY_SEPARATOR, ['admin', 'view', 'index', 'index.html']);
$adminConfig = adminModule::getInstance()->getConfig();
$adminIndexView = $adminConfig['index_page_style'] ?? '';
if ($adminIndexView == str_replace(app()->getRootPath(), '__WWW__', $indexView)) { //本扩展提供的index主页样式正在被使用
$admin_components_path = $this->getRoot() . implode(DIRECTORY_SEPARATOR, ['admin', 'view', 'components']);
if ($adminIndexView == str_replace(App::getRootPath(), '__WWW__', $indexView)) { //本扩展提供的index主页样式正在被使用
$config = $this->getConfig();
View::share([
'admin_aside' => $admin_components_path . DIRECTORY_SEPARATOR . 'aside.html',
'admin_setting' => $admin_components_path . DIRECTORY_SEPARATOR . 'setting.html',
'admin_header' => $admin_components_path . DIRECTORY_SEPARATOR . 'header.html',
'admin_main' => $admin_components_path . DIRECTORY_SEPARATOR . 'main.html',
'admin_columns_aside' => $admin_components_path . DIRECTORY_SEPARATOR . 'columns-aside.html',
'admin_horizontal' => $admin_components_path . DIRECTORY_SEPARATOR . 'horizontal.html',
'wartermark_text' => $config['wartermark_text'],
]);
}
}
public function uninstall($runSql = true)
{
$indexView = $this->getRoot() . implode(DIRECTORY_SEPARATOR, ['admin', 'view', 'index', 'index.html']);
$loginView = $this->getRoot() . implode(DIRECTORY_SEPARATOR, ['admin', 'view', 'index', 'login.html']);
$adminConfig = adminModule::getInstance()->getConfig();
$adminIndexView = $adminConfig['index_page_style'] ?? '';
$adminLoginxView = $adminConfig['login_page_style'] ?? '';
if (
$adminIndexView == str_replace(App::getRootPath(), '__WWW__', $indexView)
|| $adminLoginxView == str_replace(App::getRootPath(), '__WWW__', $loginView)
) { //本扩展提供的index主页或登录样式正在被使用
$this->errors[] = new \Exception('本扩展的index模板或login模板正被使用请修改[后台框架]配置中修改模板为其他,后再卸载');
return false;
}
return parent::uninstall($runSql);
}
public function enabled($state)
{
return false;
}
}