Files
2026-04-04 17:27:12 +08:00

316 lines
7.5 KiB
HTML
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<style>
.js-migrate-list {
display: none;
}
.progress-bar-wrap .layui-input-block {
padding-top: 11px;
min-height: initial;
}
.progress-bar {
height: 10px;
background: #e8e8e8;
width: 60%;
border-radius: 4px;
position: relative;
}
.progress-bar .curr {
content: '';
background: var(--base-color);
display: block;
width: 0;
height: 10px;
border-radius: 4px;
}
.progress-bar .value {
position: absolute;
right: -70px;
top: -3px;
line-height: initial;
}
.js-save[disabled] {
background: #d2d2d2 !important;
cursor: not-allowed;
}
.laytable-cell-1-0-3 {
text-align: right;
}
</style>
<div class="layui-collapse tips-wrap">
<div class="layui-colla-item">
<h2 class="layui-colla-title">操作提示</h2>
<ul class="layui-colla-content layui-show">
<li>在迁移数据前,首先会备份原数据SQL文件存放在upload/backup文件夹下</li>
<li>迁移数据开始后,请不要关闭当前页面,以免造成未知错误</li>
<li>文档参考:<a href="https://www.kancloud.cn/niucloud/niushop_b2c_v4/1852551" target="_blank" class="text-color">v3Tov4迁移数据说明文档</a>
</li>
</ul>
</div>
</div>
<div class="layui-form form-wrap">
<table lay-filter="migrate_list" lay-skin="line" class="js-migrate-list">
<thead>
<tr>
<th lay-data="{checkbox:true,field:'key', width:'5%'}"></th>
<th lay-data="{field:'name',width:'20%'}">迁移模块</th>
<th lay-data="{field:'introduction',width:'65%'}">描述</th>
<th lay-data="{field:'action',width:'10%'}" >迁移说明</th>
</tr>
</thead>
<tbody>
{foreach name="$task_class" item="vo" key="k"}
{if $vo['is_show']}
<tr>
<td>{$k}</td>
<td>{$vo['name']}</td>
<td>{$vo['introduction']}</td>
<td>
<div class="table-btn">
<a class="layui-btn js-select-desc" data-desc='{$vo["desc"]}'>详情</a>
</div>
</td>
</tr>
{/if}
{/foreach}
</tbody>
</table>
{foreach name="$task_class" item="vo" key="k"}
<input type="hidden" name="migrate_data" title="{$vo['name']}" value="{$k}" lay-skin="primary">
{/foreach}
<div class="layui-form-item progress-bar-wrap">
<label class="layui-form-label mid">迁移进度:</label>
<div class="layui-input-block">
<div class="progress-bar">
<span class="curr"></span>
<span class="value">0%</span>
</div>
</div>
</div>
<div class="form-row mid">
<button class="layui-btn js-save" lay-submit lay-filter="save">迁移</button>
</div>
</div>
<script type="text/javascript">
var form, table;
var index = -1;// 当前页
var migrate_data = [];// 已选迁移模块
var total = 0;// 总页数
var page_size = 0;//每页数量
var last_table = "";
var backup_index = 0;
var series = 0;
var is_backup_end = 0;// 是否备份完成
var repeat_flag = false; //防重复标识
layui.use(['form', 'table'], function () {
form = layui.form;
table = layui.table;
table.init('migrate_list');
table.on('checkbox(migrate_list)', function (obj) {
if (obj.type == "all") {
migrate_data = [];
if (obj.checked) {
$("input[name='migrate_data']").each(function () {
migrate_data.push($(this).val());
});
}
} else {
if (obj.checked) {
migrate_data.push(obj.data.key);
} else {
for (var i in migrate_data) {
if (migrate_data[i] == obj.data.key) migrate_data.splice(i, 1);
}
}
}
});
$("body").off("click", ".js-select-desc").on("click", ".js-select-desc", function () {
var desc = $(this).attr("data-desc");
layer.open({
title: '迁移说明',
area: ['900px', '600px'],
content: '<pre>' + desc + '</pre>'
});
});
form.on("submit(save)", function (data) {
if (!migrate_data.length) {
layer.msg("请选择要迁移的数据");
return false;
}
if (repeat_flag) return false;
repeat_flag = true;
checkModuleIsUpgrade(function () {
execute();
});
})
});
function execute() {
if (is_backup_end) {
migrate();
} else {
$(".js-save").text("数据备份中...").attr("disabled", true);
backupSql(function (res) {
if (res.code >= 0) {
$(".js-save").text("数据迁移中...").attr("disabled", true);
migrate();
}
});
}
}
/**
* 迁移数据
*/
function migrate() {
$.ajax({
url: ns.url("v3tov4://shop/upgrade/index"),
dataType: 'JSON',
type: 'POST',
data: {index: index, 'class': migrate_data.toString()},
success: function (res) {
if (res.code >= 0) {
var data = res.data;
index = parseInt(data.index);
total = parseInt(data.total);
page_size = parseInt(data.page_size);
var progress = 0;
if (index > -1) {
// 进度计算公式:(当前页 * 每页数量) / 总数量(每页数量 * 总页数) * 100
progress = parseFloat(((index + 1) * page_size) / (page_size * total) * 100).toFixed(2);
}
$(".progress-bar .curr").css("width", progress + "%");
$(".progress-bar .value").text(progress + "%");
if ((parseInt(index) + 1) < total) {
index++;
execute();
} else {
updateLogStatus();
$(".js-save").text("迁移完成").removeAttr("disabled");
layer.msg("迁移完成");
}
} else {
layer.msg(res.message);
}
}
});
}
/**
* 数据备份
* @param callback
*/
function backupSql(callback) {
$.ajax({
type: 'post',
url: ns.url("v3tov4://shop/upgrade/backupSql"),
dataType: 'json',
data: {
last_table: last_table,
index: backup_index,
series: series
},
success: function (res) {
if (res.code >= 0) {
var data = res.data;
//判断是否备份完成
if (data.is_backup_end) {
is_backup_end = data.is_backup_end;
if (callback) callback(res);
} else {
last_table = data.last_table;
series = data.series;
backup_index = data.index;
backupSql(callback);
}
} else {
if (callback) callback(res);
is_backup_end = 0;
layer.msg("备份发生错误:", res.message);
}
}
});
}
/**
* 获取最新的模块迁移状态,防止重复迁移
* @param callback
*/
function checkModuleIsUpgrade(callback) {
$.ajax({
type: 'post',
url: ns.url("v3tov4://shop/upgrade/checkModuleIsUpgrade"),
dataType: 'json',
data: {
module: migrate_data.toString()
},
success: function (res) {
var data = res.data;
var module = [];
var message = '';
for (var i = 0; i < data.length; i++) {
if (data[i].count) {
module.push(data[i].title);
}
}
if (module.length) {
message = "[ " + module.join("") + ' ] 数据已迁移成功,确定要重新迁移吗?';
var index = layer.confirm(message, {
title: '操作提示',
// btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function () {
if (callback) callback();
layer.close(index);
}, btn2: function () {
repeat_flag = false;
layer.close(index);
}
})
} else {
if (callback) callback();
}
}
});
}
/**
* 更新迁移日志状态
*/
function updateLogStatus() {
$.ajax({
type: 'post',
url: ns.url("v3tov4://shop/upgrade/updateLogStatus"),
dataType: 'json',
data: {
module: migrate_data.toString()
},
success: function (res) {
}
});
}
</script>