初始上传

This commit is contained in:
2026-04-04 17:27:12 +08:00
parent 4d80d28eb4
commit b7e11774ee
11191 changed files with 1588469 additions and 0 deletions

126
app/shop/view/system/addon.html Executable file
View File

@@ -0,0 +1,126 @@
<style>
.item-con { height: auto!important; }
.item-block-parent .item-block-wrap { align-items: center; }
.auth-mark{
display:inline-block;
margin-left:4px;
color:red;
font-size:12px;
}
</style>
{notempty name="$uninstall"}
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">未安装插件</span>
</div>
<div class="layui-card-body layui-field-box">
<div class="site_list item-block-parent item-five">
{foreach $uninstall as $list_k => $list_v}
<a class="item-block item-block-hover" href="javascript:;">
<div class="item-block-wrap">
<div class="item-pic">
{if isset($list_v['is_quick']) && $list_v['is_quick'] == 1}
<img src="https://www.niushop.com/{$list_v.icon}" />
{else/}
<img src="{:img($list_v.icon)}" />
{/if}
</div>
<div class="item-con">
<div class="item-content-title">
{$list_v.title}
{if $list_v.download == 1}
<div class="auth-mark">未下载</div>
{/if}
</div>
<p class="item-content-desc line-hiding" title="{$list_v.description}">{$list_v.description}</p>
</div>
</div>
<div class="item-float-wrap">
<div class="item-float">
<div class="item-float-con">
<i class="bg-color-red"></i>
<span>
{if $list_v.download == 1}未下载{else/}未安装{/if}
</span>
</div>
{if $list_v.download == 0}
<div class="item-float-con" onclick="manage('{$list_v.name}', 'install')">
<span>安装</span>
</div>
{/if}
</div>
</div>
</a>
{/foreach}
</div>
</div>
</div>
{/notempty}
{notempty name="$addons"}
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">已安装插件</span>
</div>
<div class="layui-card-body layui-field-box">
<div class="site_list item-block-parent item-five">
{foreach $addons as $list_k => $list_v}
<a class="item-block item-block-hover" href="javascript:;">
<div class="item-block-wrap">
<div class="item-pic">
<img src="{:img($list_v.icon)}" />
</div>
<div class="item-con">
<div class="item-content-title">{$list_v.title}
</div>
<p class="item-content-desc line-hiding" title="{$list_v.description}">{$list_v.description}</p>
</div>
</div>
<div class="item-float-wrap">
<div class="item-float">
<div class="item-float-con">
<i class="bg-color-blue"></i>
<span>已安装</span>
</div>
<div class="item-float-con" onclick="manage('{$list_v.name}', 'uninstall')">
<span>卸载</span>
</div>
</div>
</div>
</a>
{/foreach}
</div>
</div>
</div>
{/notempty}
<script>
var repeat_flag = false; //防重复标识
function manage(addon_name, tag) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/system/addon"),
data: {
addon_name,
tag
},
type: "POST",
dataType: "JSON",
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
location.reload();
}else{
repeat_flag = false;
}
}
});
}
//查看插件信息
function addonInfo(name){
location.hash = ns.hash('shop/upgrade/addonInfo', {name : name});
}
</script>

114
app/shop/view/system/cache.html Executable file
View File

@@ -0,0 +1,114 @@
<style>
.cache-item {display: flex;justify-content: space-between;width: 800px;padding: 20px 0;margin-left: 20px; border-bottom: 1px solid#E6E6E6;}
.cache-item .item-content .item-content-title {display: flex;align-items: center;font-size: 14px;}
.cache-item .item-content .item-content-title input {margin-right: 10px;width: 16px;height: 16px;}
.cache-item .item-content .item-content-desc {margin-left: 25px;font-size: 14px;margin-top: 5px; color: #888;}
.cache-all-btn {width: 820px;display: flex;justify-content: space-between;margin-top: 45px;}
.all-check{margin:10px 20px 20px;}
</style>
<div class="layui-card card-common card-brief layui-form">
<div class="layui-card-header">
<span class="card-title">缓存管理</span>
</div>
<div class="layui-card-body">
<div class="all-check" onclick="all_checked()">
<input type="checkbox" name="all_checked" value="" lay-skin="primary" title="全选" class="all_checked"/>
</div>
{foreach $cache_list as $k => $val}
<div class="cache-item">
<div class="item-content">
<div class="item-content-title" onclick="checked_item()">
<input type="checkbox" name="cache_checked" title="{$val.name}" lay-filter="cache_checked" value="{$val.key}" lay-skin="primary">
</div>
<p class="item-content-desc over-hide-second">{$val.desc}</p>
</div>
<button type="button" class="layui-btn" onclick="clear_cache('{$val.key}')">{$val.btn}</button>
</div>
{/foreach}
<div class="cache-all-btn">
<div class="clear"></div>
<div>
<!--<button type="button" class="layui-btn text-color">取消</button>-->
<button type="button" class="layui-btn" onclick="clear_cache('multi')">一键清理刷新</button>
</div>
</div>
</div>
</div>
<script>
var laytpl, form, element,repeat_flag = false; //防重复标识
layui.use(['form'], function() {
form = layui.form;
form.render();
});
function clear_cache(key) {
if (key == 'multi') {
var checked_arr = [];
$("input[name='cache_checked']").each(function (val, index) {
if ($(this).siblings("div").hasClass('layui-form-checked')) {
checked_arr.push($(this).val());
}
});
if (checked_arr.length == 0) {
layer.msg('请勾选需要刷新的数据');
return;
}
checked_arr.push('all');
key = checked_arr.toString();
}
if (repeat_flag) return;
repeat_flag = true;
var index = layer.load(2);
$.ajax({
url: ns.url("shop/system/cache"),
data: {
key
},
type: "POST",
dataType: "JSON",
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
layer.close(index);
if (key.indexOf('menu_cache') != -1 || key.indexOf('diy_view') != -1) {
location.reload();
}
}
});
}
function checked_item(){
var num = 0;
$('input[name=cache_checked]').each(function(){
if($(this).siblings("div").hasClass('layui-form-checked')){
num++;
}
});
if(num<$('input[name=cache_checked]').length){
$('input[name=all_checked]').siblings("div").removeClass('layui-form-checked')
}else{
$('input[name=all_checked]').siblings("div").addClass('layui-form-checked')
}
}
function all_checked(){
var num = 0;
$('input[name=cache_checked]').each(function(){
if($(this).siblings("div").hasClass('layui-form-checked')){
num++;
}
});
if(num<$('input[name=cache_checked]').length){
$('input[name=all_checked]').siblings("div").addClass('layui-form-checked');
$('input[name=cache_checked]').each(function(){
$(this).siblings("div").addClass('layui-form-checked')
});
}else{
$('input[name=all_checked]').siblings("div").removeClass('layui-form-checked');
$('input[name=cache_checked]').each(function(){
$(this).siblings("div").removeClass('layui-form-checked')
});
}
}
</script>

View File

@@ -0,0 +1,228 @@
<link rel="stylesheet" type="text/css" href="__STATIC__/loading/msgbox.css">
<style>
.data-table{border-width: 0 !important;}
.data-table[lay-size=lg] th,.data-table[lay-size=lg] td{padding: 15px 15px;}
.data-table[lay-size=lg] th{border: 0;}
.data-table[lay-size=lg] .check-box{padding-left: 0;padding-right: 0;}
.check-box .layui-form{text-align: center;}
.layui-form-checkbox[lay-skin=primary]{padding-left: 0;}
.layui-table tr .toolbar a{display: inline-block;height: 23px;line-height: 23px;border-radius: 50px;background-color: #F3F3F3;font-size: 13px;color: #5A5A5A;text-align: center;padding: 2px 8px;margin: 5px;}
.layui-table tr .toolbar a:hover{color: #fff !important;background-color: var(--base-color);}
</style>
<!-- 搜索框 -->
<div class="single-filter-box">
<button type="button" class="layui-btn" lay-filter="backups" lay-submit>备份</button>
<!-- <button type="button" class="layui-btn" lay-filter="datarepair" lay-submit>恢复</button>-->
</div>
<table class="layui-table data-table mt-auto" lay-skin="line" lay-size="lg">
<colgroup>
<col width="3%">
<col width="30%">
<col width="21%">
<col width="21%">
<col width="25%">
<!-- <col width="10%"> -->
</colgroup>
<thead>
<tr>
<th class="check-box">
<div class="layui-form">
<input type="checkbox" class="selectAll" name="" lay-filter="selectAll" lay-skin="primary">
</div>
</th>
<th>表名</th>
<th>数据量</th>
<th>数据大小</th>
<th>创建时间</th>
<!-- <th class="toolbar">操作</th> -->
</tr>
</thead>
<tbody>
{foreach name=$list as $list_k => $list_v}
<tr>
<td class="check-box">
<div class="layui-form">
<input type="checkbox" name="" lay-filter="select{$list_k}" lay-skin="primary">
</div>
</td>
<td class="data-table-name">{$list_v.Name}</td>
<td class="data-table-num">{$list_v.Rows}</td>
<td class="data-length">
<input type="hidden" value="{$list_v.Data_length / 1024}" />
</td>
<td>{$list_v.Create_time}</td>
<!-- <td class="toolbar">
<a class="default" lay-filter="tablerepair" lay-submit>恢复</a>
</td> -->
</tr>
{/foreach}
</tbody>
</table>
<script type="text/javascript" src="__STATIC__/loading/msgbox.js"></script>
<script>
layui.use('form', function() {
var form = layui.form,
repeat_flag = false;
form.render();
$(".data-length").each(function(i) {
var data = $(this).find("input").val();
var dataNew = Math.round(data * 100) / 100;
$(this).text(dataNew + "KB");
});
/**
* 监听全选按钮
*/
form.on('checkbox(selectAll)', function(data) {
if (data.elem.checked) {
$("tr .check-box input:checkbox").each(function() {
$(this).prop("checked", true);
});
} else {
$("tr .check-box input:checkbox").each(function() {
$(this).prop("checked", false);
});
}
form.render();
});
/**
* 监听每一行的多选按钮
*/
var len = $("tbody tr").length;
for (var i = 0; i < len; i++) {
form.on('checkbox(select' + i + ')', function(data) {
if ($("tbody tr input:checked").length == len) {
$("input[lay-filter='selectAll']").prop("checked", true);
} else {
$("input[lay-filter='selectAll']").prop("checked", false);
}
form.render();
});
}
/**
* 监听备份
*/
form.on('submit(backups)', function() {
var _selected = [];
$("tbody tr input:checked").each(function() {
_selected.push($(this).parents("td").siblings(".data-table-name").text());
});
if (_selected.length == 0) {
layer.msg('请选择需要备份的数据表!');
return;
}
layer.confirm('是否备份?', function(index){
$.ajax({
url: ns.url("shop/system/backup"),
data: {
"tables": _selected
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.close(index);
if (res.status == 1 && res.message == "初始化成功") {
backup(res.tab);
ZENG.msgbox.show(res.message, 4, 3000);
return;
} else {
ZENG.msgbox.show(res.message, 5);
}
}
});
});
});
//备份数据库
function backup(tab, status) {
$.ajax({
url: ns.url("shop/system/backup"),
data: {
"id": tab.id,
"start": tab.start
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
ZENG.msgbox.show("正在备份数据库,请不要关闭窗口", 6);
if (res.status == 1) {
if (!$.isPlainObject(res.tab)) {
ZENG.msgbox.show(res.message, 5);
return;
}else{
ZENG.msgbox.show("正在处理"+ res.tab.table +' ...', 6);
}
backup(res.tab, res.id != res.tab.id);
} else {
if(res.status == -1){
ZENG.msgbox.show(res.message, 5);
}else{
ZENG.msgbox.show("备份完成", 4, 3000);
}
}
}
});
}
/**
* 监听数据表恢复
*/
form.on('submit(tablerepair)', function() {
var table_name = $(this).parents("tr").find(".data-table-name").text();
repair(table_name);
});
/**
* 批量操作
*/
form.on('submit(datarepair)', function() {
var tables = [];
$("tbody tr input:checked").each(function() {
tables.push($(this).parents("td").siblings(".data-table-name").text());
});
if (tables.length == 0) {
layer.msg('请选择需要恢复的数据表!');
return;
}
repair(tables.toString());
});
function repair(tables) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要恢复改数据表吗?', function(index) {
layer.close(index);
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("shop/system/tablerepair"),
data: {
"tables": tables
},
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
})
</script>

View File

@@ -0,0 +1,109 @@
<link rel="stylesheet" type="text/css" href="__STATIC__/loading/msgbox.css" />
<script type="text/javascript" src="__STATIC__/loading/msgbox.js"></script>
<style>
.data-table{border-width: 0 !important;}
.data-table[lay-size=lg] th,.data-table[lay-size=lg] td{padding: 15px 15px;}
.data-table[lay-size=lg] .check-box{padding-left: 0;padding-right: 0;}
.check-box .layui-form{text-align: center;}
.layui-form-checkbox[lay-skin=primary]{padding-left: 0;}
.data-empty{text-align: center;}
</style>
<table class="layui-table data-table" lay-skin="line" lay-size="lg">
<colgroup>
<col width="40%">
<col width="20%">
<col width="25%">
<col width="15%">
</colgroup>
<thead>
<tr>
<th>文件名称</th>
<th>文件大小</th>
<th>备份时间</th>
<th class="toolbar" style="text-align:right">操作</th>
</tr>
</thead>
<tbody>
{if condition="$list"}
{foreach name=$list as $list_k => $list_v}
<tr>
<td>{$list_v.name}</td>
<td>{$list_v.size}</td>
<td>{:time_to_date($list_v.time)}</td>
<td class="toolbar">
<div class="table-btn">
<a class="layui-btn" onclick="isSureImport({$list_v.time}, null, null)">还原</a>
<a class="layui-btn" onclick="deleteDataBase({$list_v.time})">删除</a>
</div>
</td>
</tr>
{/foreach}
{else/}
<tr>
<td colspan="4" class="data-empty">无数据</td>
</tr>
{/if}
</tbody>
</table>
<script>
function isSureImport(time, part, start) {
layer.confirm('是否恢复此备份文件?', function(index){
layer.close(index);
replay(time, part, start);
});
}
function replay(time, part, start) {
ZENG.msgbox.show("正在读取文件", 6);
$.ajax({
url: ns.url("shop/system/importData"),
data: {
"time": time,
"part": part,
"start": start
},
dataType: 'JSON',
type: 'POST',
success: function(data) {
if (data.code == 1) {
ZENG.msgbox.show(data.message, 6, 100000);
if (data.data.part) {
replay(time, data.data.part, data.data.start);
ZENG.msgbox.show("正在还原...", 6, 100000);
} else {
ZENG.msgbox.show(data.message, 4, 3000);
}
} else {
ZENG.msgbox.show(data.message, 4, 3000);
}
}
});
}
/**
* 删除备份文件
*/
function deleteDataBase(time){
layer.confirm('是否删除此备份文件?', function(index){
layer.close(index);
ZENG.msgbox.show("正在删除文件", 6, 100000);
$.ajax({
url : ns.url("shop/system/deleteData"),
dataType: 'JSON',
type: 'POST',
data : {"time": time},
success : function(data) {
if (data.code){
ZENG.msgbox.show(data.message, 4, 3000);
listenerHash(); // 刷新页面
} else {
ZENG.msgbox.show(data.message, 5);
}
}
})
});
}
</script>