CURD可视化操作
This commit is contained in:
92
app/admin/controller/system/CurdGenerate.php
Normal file
92
app/admin/controller/system/CurdGenerate.php
Normal file
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\admin\service\curd\BuildCurd;
|
||||
use app\admin\service\curd\exceptions\TableException;
|
||||
use app\common\controller\AdminController;
|
||||
use app\admin\service\annotation\ControllerAnnotation;
|
||||
use app\admin\service\annotation\NodeAnnotation;
|
||||
use app\Request;
|
||||
use think\db\exception\PDOException;
|
||||
use think\exception\FileException;
|
||||
use think\facade\Db;
|
||||
use think\response\Json;
|
||||
|
||||
/**
|
||||
* @ControllerAnnotation(title="CURD可视化管理")
|
||||
* Class Auth
|
||||
* @package app\admin\controller\system
|
||||
*/
|
||||
class CurdGenerate extends AdminController
|
||||
{
|
||||
/**
|
||||
* @NodeAnnotation(title="列表")
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* @NodeAnnotation(title="操作")
|
||||
* @throws TableException
|
||||
*/
|
||||
public function save(Request $request, string $type = ''): ?Json
|
||||
{
|
||||
if (!$request->isAjax()) return $this->error();
|
||||
$tb_prefix = $request->post('tb_prefix/s', '');
|
||||
$tb_name = $request->post('tb_name/s', '');
|
||||
if (empty($tb_name) || empty($tb_prefix)) return $this->error('参数错误');
|
||||
switch ($type) {
|
||||
case "search":
|
||||
try {
|
||||
$list = Db::query("SHOW FULL COLUMNS FROM {$tb_prefix}{$tb_name}");
|
||||
$data = [];
|
||||
foreach ($list as $value) {
|
||||
$data[] = [
|
||||
'name' => $value['Field'],
|
||||
'type' => $value['Type'],
|
||||
'key' => $value['Key'],
|
||||
'extra' => $value['Extra'],
|
||||
'null' => $value['Null'],
|
||||
'desc' => $value['Comment'],
|
||||
];
|
||||
}
|
||||
return $this->success('查询成功', compact('data', 'list'));
|
||||
} catch (PDOException $exception) {
|
||||
return $this->error($exception->getMessage());
|
||||
}
|
||||
break;
|
||||
case "add":
|
||||
$force = $request->post('force/d', 0);
|
||||
try {
|
||||
$build = (new BuildCurd())->setTablePrefix($tb_prefix)->setTable($tb_name);
|
||||
$build->setForce($force); // 强制覆盖
|
||||
$build = $build->render();
|
||||
$fileList = $build->getFileList();
|
||||
if (empty($fileList)) return $this->error('这里什么都没有');
|
||||
$result = $build->create();
|
||||
return $this->success('生成成功', compact('result'));
|
||||
} catch (FileException $exception) {
|
||||
return json(['code' => -1, 'msg' => $exception->getMessage()]);
|
||||
}
|
||||
break;
|
||||
case "delete":
|
||||
try {
|
||||
$build = (new BuildCurd())->setTablePrefix($tb_prefix)->setTable($tb_name);
|
||||
$build = $build->render();
|
||||
$fileList = $build->getFileList();
|
||||
if (empty($fileList)) return $this->error('这里什么都没有');
|
||||
$result = $build->delete();
|
||||
return $this->success('删除自动生成CURD文件成功', compact('result'));
|
||||
} catch (FileException $exception) {
|
||||
return json(['code' => -1, 'msg' => $exception->getMessage()]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return $this->error('参数错误');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -239,6 +239,12 @@ class BuildCurd
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setTablePrefix($prefix): static
|
||||
{
|
||||
$this->tablePrefix = $prefix;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置主表
|
||||
* @param $table
|
||||
@@ -1059,12 +1065,12 @@ class BuildCurd
|
||||
array_pop($extendNamespaceArray);
|
||||
$extendNamespace = '\\' . implode('\\', $extendNamespaceArray);
|
||||
}
|
||||
|
||||
$modelValue = CommonTool::replaceTemplate(
|
||||
$this->getTemplate("model{$this->DS}model"),
|
||||
[
|
||||
'modelName' => $this->modelName,
|
||||
'modelNamespace' => "app\admin\model{$extendNamespace}",
|
||||
'prefix_table' => $this->tablePrefix == config('database.connections.mysql.prefix') ? "" : $this->tablePrefix . $this->table,
|
||||
'table' => $this->table,
|
||||
'deleteTime' => $this->delete ? '"delete_time"' : 'false',
|
||||
'relationList' => $relationList,
|
||||
|
||||
@@ -9,6 +9,8 @@ class {{modelName}} extends TimeModel
|
||||
|
||||
protected $name = "{{table}}";
|
||||
|
||||
protected $table = "{{prefix_table}}";
|
||||
|
||||
protected $deleteTime = {{deleteTime}};
|
||||
|
||||
{{relationList}}
|
||||
|
||||
46
app/admin/view/system/curd_generate/index.html
Normal file
46
app/admin/view/system/curd_generate/index.html
Normal file
@@ -0,0 +1,46 @@
|
||||
<div class="layuimini-container">
|
||||
<div class="layuimini-main" id="app">
|
||||
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
|
||||
|
||||
<form id="app-form" class="layui-form layuimini-form">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">数据库表前缀</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="tb_prefix" class="layui-input" lay-verify="required" placeholder="请输入" value="{:env('DATABASE.PREFIX','')}">
|
||||
</div>
|
||||
<tip></tip>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">数据库表名字</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="tb_name" class="layui-input" lay-verify="required" placeholder="请输入:例如 test_goods" value="">
|
||||
<tip>数据库表名字 不包含数据库表前缀。</tip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hr-line"></div>
|
||||
<div class="layui-form-item text-center">
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" lay-filter="search" lay-submit="system.CurdGenerate/save?type=search" data-refresh="false">查询</button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="tableShow layui-hide">
|
||||
<blockquote class="layui-elem-quote layui-quote-nm">
|
||||
数据表:<span class="table-text"></span>
|
||||
</blockquote>
|
||||
<div class="layui-btn-container">
|
||||
<form class="layui-form layuimini-form">
|
||||
<button type="button" class="layui-btn layui-bg-cyan" lay-filter="add" lay-submit="system.CurdGenerate/save?type=add">自动生成CURD</button>
|
||||
<button type="button" class="layui-btn layui-bg-red" lay-filter="delete" lay-submit="system.CurdGenerate/save?type=delete">删除CURD对应的文件</button>
|
||||
</form>
|
||||
<div class="file-list layui-elem-quote">还未生成任何文件</div>
|
||||
</div>
|
||||
<table id="currentTable" class="layui-table" lay-filter="currentTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -13,7 +13,8 @@ File Encoding : 65001
|
||||
Date: 2020-05-17 23:24:06
|
||||
*/
|
||||
|
||||
SET FOREIGN_KEY_CHECKS=0;
|
||||
SET
|
||||
FOREIGN_KEY_CHECKS=0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for ea_mall_cate
|
||||
@@ -323,6 +324,8 @@ INSERT INTO `ea_system_menu`
|
||||
VALUES ('252', '228', '快捷入口', 'fa fa-list', 'system.quick/index', '', '_self', '0', '1', '', '1589623683', '1589623683', null);
|
||||
INSERT INTO `ea_system_menu`
|
||||
VALUES ('253', '228', '日志管理', 'fa fa-connectdevelop', 'system.log/index', '', '_self', '0', '1', '', '1589623684', '1589623684', null);
|
||||
INSERT INTO `ea_system_menu`
|
||||
VALUES ('254', '228', 'CURD可视化', 'fa fa fa-shower', 'system.curd_generate/index', '', '_self', '0', '1', '', '1589623684', '1589623684', null);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for ea_system_node
|
||||
@@ -480,6 +483,12 @@ INSERT INTO `ea_system_node`
|
||||
VALUES ('67', 'system.log', '操作日志管理', '1', '1', '1589623188', '1589623188');
|
||||
INSERT INTO `ea_system_node`
|
||||
VALUES ('68', 'system.log/index', '列表', '2', '1', '1589623188', '1589623188');
|
||||
INSERT INTO `ea_system_node`
|
||||
VALUES ('69', 'system.curd_generate', 'CURD可视化管理', '1', '1', '1589623188', '1589623188');
|
||||
INSERT INTO `ea_system_node`
|
||||
VALUES ('70', 'system.curd_generate/index', '列表', '2', '1', '1589623188', '1589623188');
|
||||
INSERT INTO `ea_system_node`
|
||||
VALUES ('71', 'system.curd_generate/save', '操作', '2', '1', '1589623188', '1589623188');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for ea_system_quick
|
||||
|
||||
110
public/static/admin/js/system/curd_generate.js
Normal file
110
public/static/admin/js/system/curd_generate.js
Normal file
@@ -0,0 +1,110 @@
|
||||
define(["jquery", "easy-admin"], function ($, ea, Vue) {
|
||||
|
||||
var form = layui.form;
|
||||
var table = layui.table;
|
||||
|
||||
var init = {
|
||||
save_url: 'system.curd_generate/save',
|
||||
};
|
||||
|
||||
var Controller = {
|
||||
index: function () {
|
||||
|
||||
let tb_prefix
|
||||
let tb_name
|
||||
form.on('submit(search)', function (data) {
|
||||
let field = data.field
|
||||
tb_prefix = field.tb_prefix
|
||||
tb_name = field.tb_name
|
||||
ea.request.post({url: $(this).attr('lay-submit'), prefix: true, data: field}, function (res) {
|
||||
let code = res.code || '0'
|
||||
if (code != '1') {
|
||||
ea.msg.error(res.msg)
|
||||
return
|
||||
}
|
||||
$('.tableShow').removeClass('layui-hide')
|
||||
$('.table-text').text(field.tb_prefix + field.tb_name)
|
||||
let _data = res.data
|
||||
table.render({
|
||||
elem: '#currentTable', cols: [
|
||||
[
|
||||
{field: 'name', title: '字段', minWidth: 80},
|
||||
{field: 'type', title: '类型', minWidth: 80},
|
||||
{field: 'key', title: '键', minWidth: 80},
|
||||
{field: 'extra', title: '是否自增', minWidth: 80},
|
||||
{field: 'null', title: '是否为空', minWidth: 80},
|
||||
{field: 'desc', title: '描述', minWidth: 80},
|
||||
]
|
||||
],
|
||||
data: _data.data,
|
||||
page: false,
|
||||
});
|
||||
|
||||
})
|
||||
form.on('submit(add)', function (data) {
|
||||
let table = $('.table-text').text()
|
||||
if (!table) {
|
||||
ea.msg.error('请先查询数据')
|
||||
return
|
||||
}
|
||||
let url = $(this).attr('lay-submit')
|
||||
let options = {url: url, prefix: true, data: {tb_prefix: tb_prefix, tb_name: tb_name}}
|
||||
layer.confirm('确定要自动生成【' + table + '】对应的CURD?', function (index) {
|
||||
ea.request.post(options, function (res) {
|
||||
ea.msg.success(res.msg)
|
||||
let html = ''
|
||||
$.each(res['data']['result'], function (idx, item) {
|
||||
html += '<li class="layui-form-item">' + item + '</li>'
|
||||
})
|
||||
$('.file-list').html(html)
|
||||
}, function (error) {
|
||||
let code = error.code
|
||||
if (code != '1') {
|
||||
if (code < 0) {
|
||||
layer.confirm(error.msg, {
|
||||
btn: ['确定强制覆盖生成'], title: '提示', icon: 0,
|
||||
yes: function () {
|
||||
options.prefix = false
|
||||
options.data.force = 1
|
||||
ea.request.post(options, function (rs) {
|
||||
ea.msg.success(rs.msg)
|
||||
$('.file-list').empty()
|
||||
let html = ''
|
||||
$.each(rs['data']['result'], function (idx, item) {
|
||||
html += '<li class="layui-form-item">' + item + '</li>'
|
||||
})
|
||||
$('.file-list').html(html)
|
||||
})
|
||||
}
|
||||
});
|
||||
return
|
||||
}
|
||||
ea.msg.error(error.msg)
|
||||
return
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
form.on('submit(delete)', function (data) {
|
||||
let table = $('.table-text').text()
|
||||
if (!table) {
|
||||
ea.msg.error('请先查询数据')
|
||||
return
|
||||
}
|
||||
let url = $(this).attr('lay-submit')
|
||||
let options = {url: url, prefix: true, data: {tb_prefix: tb_prefix, tb_name: tb_name}}
|
||||
layer.confirm('确定要删除【' + table + '】对应CURD的文件?<br>确定清楚自己在做什么!', function (index) {
|
||||
ea.request.post(options, function (res) {
|
||||
ea.msg.success(res.msg)
|
||||
$('.table-text').text('')
|
||||
$('.file-list').empty()
|
||||
})
|
||||
})
|
||||
})
|
||||
return
|
||||
})
|
||||
}
|
||||
};
|
||||
return Controller;
|
||||
});
|
||||
Reference in New Issue
Block a user