/** * 数据表管理:列表 / 可视化建表 / 查看结构 / 优化 / 删表 * * 与 database.js 同构:URL 只写动作名(当前页面目录即 /admin/datatable/), * 权限按钮用完整权限名,渲染后由 auth.filterDom() 移除无权限按钮。 */ layui.define(['table', 'layer', 'form', 'element', 'auth', 'http', 'jquery'], function (exports) { var table = layui.table, layer = layui.layer, form = layui.form, element = layui.element, auth = layui.auth, http = layui.http, $ = layui.jquery; var FUNC = { index: 'index', structure: 'structure', preview: 'preview', create: 'create', drop: 'drop', optimize: 'optimize', export: 'export' }; // 与后端 Datatable::TYPES 保持一致 var TYPES = [ 'tinyint', 'smallint', 'mediumint', 'int', 'bigint', 'decimal', 'float', 'double', 'char', 'varchar', 'text', 'mediumtext', 'longtext', 'date', 'datetime', 'timestamp', 'time', 'year', 'json', 'blob', 'longblob' ]; function parse(res) { return { code: res.code, msg: res.message, count: res.count || 0, data: res.data || [] }; } function post(url, data, okTip, done) { var loading = layer.load(2); http.post(url, data).then(function (res) { layer.close(loading); if (res && res.code === 0) { layer.msg(okTip || res.message || '操作成功', {icon: 1}); if (done) { done(res.data); } } else { layer.msg((res && res.message) || '操作失败', {icon: 2}); } }).catch(function (err) { layer.close(loading); layer.msg('请求失败:' + (err && err.message ? err.message : '网络异常'), {icon: 2}); }); } function checkedTables() { var rows = table.checkStatus('tableList').data || []; var names = []; for (var i = 0; i < rows.length; i++) { names.push(rows[i].name); } return names; } /* ====================== 建表弹窗 ====================== */ /** * 单行字段 */ function fieldRow(data) { data = data || {}; var opts = ''; for (var i = 0; i < TYPES.length; i++) { opts += ''; } return '' + '
' + d.command + '',
{title: '建表完成', btn: ['知道了']}
);
table.reload('tableList');
});
}
);
});
}
/* ====================== 结构弹窗 ====================== */
function openStructure(name) {
http.get(FUNC.structure, {table: name}).then(function (res) {
if (!res || res.code !== 0) {
return layer.msg((res && res.message) || '读取失败', {icon: 2});
}
var d = res.data;
var html = '';
for (var i = 0; i < d.columns.length; i++) {
var c = d.columns[i];
html += '' + it.short + '' + it.target + '' : '需人工指定') + '' + d.target + '' : '—';
}},
{field: 'rows', title: '行数', width: 110, sort: true},
{field: 'size_text', title: '大小', width: 110, sort: true},
{field: 'collation', title: '字符集', width: 160},
{title: '操作', width: 170, templet: '#tableAction', fixed: 'right'}
]],
page: true,
limit: 15,
limits: [15, 30, 50, 100],
response: {statusCode: 0},
parseData: parse,
done: function () {
var view = $('#tableList').next('.layui-table-view');
auth.filterDom(view);
auth.filterDom('.layui-btn[data-perm]');
}
});
},
events: function () {
table.on('toolbar(tableList)', function (o) {
if (o.event === 'create') {
openCreate();
} else if (o.event === 'reload') {
table.reload('tableList');
} else if (o.event === 'optimize') {
var names = checkedTables();
if (!names.length) {
return layer.msg('请先勾选要优化的表', {icon: 2});
}
post(FUNC.optimize, {tables: names}, '优化完成', function () {
table.reload('tableList');
});
} else if (o.event === 'export') {
openExport(checkedTables());
}
});
table.on('tool(tableList)', function (o) {
if (o.event === 'structure') {
openStructure(o.data.name);
} else if (o.event === 'optimizeRow') {
post(FUNC.optimize, {tables: [o.data.name]}, '优化完成', function () {
table.reload('tableList');
});
} else if (o.event === 'exportRow') {
openExport([o.data.name]);
} else if (o.event === 'drop') {
dropTable(o.data.name);
}
});
form.on('submit(data-search-btn)', function (o) {
table.reload('tableList', {
where: {keyword: o.field.keyword, unregistered: o.field.unregistered || '0'},
page: {curr: 1}
});
return false;
});
$('#btn-reset').on('click', function () {
setTimeout(function () {
table.reload('tableList', {where: {keyword: '', unregistered: '0'}, page: {curr: 1}});
}, 10);
});
}
};
form.render(null, 'search-form'); // 归档筛选下拉要 layui 渲染,否则是原生 select
obj.renderTable();
obj.events();
exports('datatable', obj);
});