693 lines
29 KiB
PHP
Raw Normal View History

{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<script>
//收起左侧菜单,留出更大空间
if (!$('body').hasClass('sidebar-collapse')) {
$('body').addClass('sidebar-collapse');
}
</script>
<section class="content">
<style scoped>
#dataBody th, #dataBody td {
min-width: 60px;
}
td label {
font-weight: normal;
}
.box-header .select2 {
min-width: 130px;
}
.form-type-th {
min-width: 150px;
}
.form-validate-th {
min-width: 200px;
}
.form-validate-label, .form-validate-select, .form-type-label, .form-type-select {
width: 100%;
}
#create_menu_list {
min-width: 400px;
}
#controller_action_list {
min-width: 400px;
}
.form-inline .form-group {
margin-right: 20px;
}
.extend-div {
display: none;
position: absolute;
z-index: 2;
}
#model_relation .form-group {
margin-bottom: 10px;
}
.more-setting .extend-div {
width: 700px;
margin-right: 0;
margin-left: -630px;
}
.more-setting .more-from {
margin-bottom: 20px;
}
.modelRelationDiv .form-group .form-control {
margin-right: 20px;
}
.validateScene {
min-width: 450px;
width: 550px;
}
</style>
<form id="dataForm" class="dataForm" action="create" method="post">
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">代码自动生成</h3>
</div>
<!-- 表和菜单 -->
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="table_name">选择表</label>
<select data-id="table_name" name="table_name" class="select2 form-control input-sm"
id="table_name" data-placeholder="请选择表">
<option value=""></option>
{foreach name='table' id='item'}
<option value="{$item}">{$item}</option>
{/foreach}
</select>
<button onclick="refreshTable()" type="button" class="btn btn-flat btn-success"
data-toggle="tooltip" title="刷新表数据">
<i class="fa fa-refresh"></i>
</button>
</div>
<div class="form-group">
<label for="cn_name">中文名</label>
<input name="cn_name" id="cn_name" class="form-control input-sm" placeholder="请填写中文名"
title="表及功能的中文名字,例如用户表,就填写[用户]" data-toggle="tooltip">
</div>
<div class="form-group">
<label for="module_name_suffix">模块名称后缀</label>
<input name="module_name_suffix" id="module_name_suffix" class="form-control input-sm"
placeholder="模块名称后缀,可空"
title="默认为[管理],例如前面的中文名叫[用户],这里填写的是[管理],那生成的菜单名称就叫[用户管理]" value="管理"
data-toggle="tooltip">
</div>
<div class="form-group">
<div class="input-group iconpicker-container">
<span class="input-group-addon"><i class="fa fa-pencil"></i></span>
<input maxlength="50" id="module_icon" name="module_icon"
value="fa-list" class="form-control "
placeholder="请输入图标class"
title="模块图标,比如用户模块,可以选择[fa-user]作为图标,默认为[fa-list]"
data-toggle="tooltip">
</div>
</div>
<script>
$('#module_icon').iconpicker({placement: 'bottomLeft'});
</script>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" id="auto_class_name"
name="auto_class_name"
title="自动生成控制器|模型|验证器类名" data-toggle="tooltip">自动生成类名</label>
</div>
</div>
</div>
<!-- 控制器 -->
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_menu"> </label>
<select data-id="create_menu" name="create_menu" class="select2 form-control input-sm"
id="create_menu" data-placeholder="不选择为不生成菜单">
<option value="-1">不生成</option>
<option value="0">顶级菜单</option>
{$menus|raw}
</select>
<button onclick="refreshMenu()" type="button" class="btn btn-flat btn-success"
data-toggle="tooltip" title="刷新菜单">
<i class="fa fa-refresh"></i>
</button>
</div>
<div class="form-group">
<label for="create_menu_list">菜单选择</label>
<select name="create_menu_list[]" class="select2 form-control input-sm"
id="create_menu_list" multiple="multiple" data-placeholder="默认生成增删改菜单">
<option value="1" disabled selected>列表</option>
<option value="2" selected>添加</option>
<option value="3" selected>修改</option>
<option value="4" selected>删除</option>
<option value="5">启用/禁用</option>
</select>
</div>
</div>
</div>
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_controller">控制器</label>
<select data-id="create_controller" name="create_controller"
class="select2 form-control input-sm"
id="create_controller" data-placeholder="默认生成">
<option value="1">生成</option>
<option value="0">不生成</option>
</select>
</div>
<div class="form-group">
<label for="controller_name">控制器名</label>
<input name="controller_name" id="controller_name"
class="form-control input-sm" title="默认会根据表名自动生成" placeholder="请填写控制器名"
data-toggle="tooltip">
</div>
<div class="form-group">
<label for="controller_action_list">控制器方法</label>
<select name="controller_action_list[]" class="select2 form-control input-sm"
id="controller_action_list" multiple="multiple" data-placeholder="默认生成增删改方法">
<option value="1" selected>列表</option>
<option value="2" selected>添加</option>
<option value="3" selected>修改</option>
<option value="4" selected>删除</option>
<option value="5">启用/禁用</option>
</select>
</div>
</div>
</div>
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_model"> </label>
<select data-id="create_model" name="create_model" class="select2 form-control input-sm"
id="create_model" data-placeholder="默认生成">
<option value="1">生成</option>
<option value="0">不生成</option>
</select>
</div>
<div class="form-group">
<label for="model_name">模型名</label>
<input name="model_name" id="model_name" class="form-control input-sm"
placeholder="模型名" title="默认会根据表名自动生成" data-toggle="tooltip">
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" name="auto_timestamp"
title="自动添加create_time和update_time字段" data-toggle="tooltip">自动时间戳</label>
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" name="soft_delete"
title="自动添加delete_time字段默认为0" data-toggle="tooltip">软删除</label>
</div>
</div>
</div>
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_validate">验证器</label>
<select data-id="create_validate" name="create_validate"
class="select2 form-control input-sm"
id="create_validate" data-placeholder="默认生成">
<option value="1">生成</option>
<option value="0">不生成</option>
</select>
</div>
<div class="form-group">
<label for="validate_name">验证器名</label>
<input name="validate_name" id="validate_name" class="form-control input-sm"
placeholder="验证器名" title="默认会根据表名自动生成" data-toggle="tooltip">
</div>
</div>
</div>
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_view_index">列表视图</label>
<select data-id="create_view_index" name="create_view_index"
class="select2 form-control input-sm"
id="create_view_index" data-placeholder="默认生成">
<option value="1">生成</option>
<option value="0">不生成</option>
</select>
</div>
<div class="form-group">
<label for="index_operation_button">操作按钮形式</label>
<select data-id="index_operation_button" name="index_operation_button"
class="select2 form-control input-sm"
id="index_operation_button" data-placeholder="默认纯图标">
<option value="1">图标</option>
<option value="2">文字</option>
<option value="3">图标+文字</option>
</select>
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" id="list_delete"
name="list_delete"
title="列表删除功能" data-toggle="tooltip">列表删除</label>
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" id="list_create"
name="list_create"
title="列表添加功能" data-toggle="tooltip">列表添加</label>
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" id="list_refresh"
name="list_refresh"
title="列表刷新功能" data-toggle="tooltip">列表刷新</label>
</div>
<div class="form-group checkbox">
<label><input type="checkbox" value="1" id="list_export"
name="list_export"
title="列表导出功能" data-toggle="tooltip">列表导出</label>
</div>
<div class="form-group checkbox">
<label><input type="checkbox" value="1" id="list_enable"
name="list_enable"
title="列表启用/禁用功能" data-toggle="tooltip">列表启用/禁用</label>
</div>
</div>
</div>
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_view_add">表单视图</label>
<select data-id="create_view_add" name="create_view_add"
class="select2 form-control input-sm"
id="create_view_add" data-placeholder="默认生成">
<option value="1">生成</option>
<option value="0">不生成</option>
</select>
</div>
</div>
</div>
<div class="box-body table-responsive">
<table id="dataList" class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr class="input-type">
<th>操作</th>
<th title="字段名为小写下划线形式">字段</th>
<th title="字段类型例如varchar(255),int(10),decimal(12,2)">类型</th>
<th title="中文名称例如username为用户名">名称</th>
<th title="是否在列表页显示">列表</th>
<th title="是否为添加/修改页字段">表单</th>
<th class="form-type-th" title="表单类型">表单类型</th>
<th class="form-validate-th" title="表单验证">表单验证</th>
<th title="字段更多设置">更多</th>
</tr>
</thead>
<tbody id="dataBody">
</tbody>
</table>
</div>
<div class="box-footer">
<a class="btn btn-primary btn-sm btn-success" onclick="addNewField(null,2)">添加一行</a>
<button class="btn btn-primary btn-sm pull-right" type="submit">提交</button>
</div>
</div>
</div>
</div>
</form>
{include file='generate/template' /}
<div style="height: 360px;">
<!--此div是为了撑开最下面防止更多设置高度太高导致页面闪跳-->
</div>
</section>
<script>
//刷新数据库表
function refreshTable() {
$.post('{:url("admin/generate/getTable")}', function (result) {
let html = '<option value=""></option>';
$.each(result.data, function (index, item) {
html += '<option value="' + item + '">' + item + '</option>';
});
$('#table_name').html(html).select2();
});
}
//表单索引
var formIndex = 0;
$(function () {
//获取表信息和字段等,进行页面填充
$("#table_name").on('change', function () {
getField($(this).val());
});
//列表启用/禁止关联菜单和控制器
$('#list_enable').change(function () {
console.log('启用/禁止选项');
let checked = $(this).is(':checked');
let $menu_list = $('#create_menu_list');
let $action_list = $('#controller_action_list');
$menu_list.find("option[value='5']").attr("selected", checked);
$action_list.find("option[value='5']").attr("selected", checked);
$menu_list.select2();
$action_list.select2();
});
//默认添加一行空的字段
addNewField(null, 1);
});
//添加新的字段
function addNewField(obj, type) {
formIndex++;
let template = $("#data-template").html().replace(/FORM_INDEX/g, '[' + formIndex + ']').replace(/INDEX_ID/g, formIndex);
if (obj == null) {
$("#dataBody").append(template);
} else {
if (type === 1) {
$(obj).parent().parent().before(template);
} else {
$(obj).parent().parent().after(template);
}
}
//刷新 dataBody DOM后的操作
dataBodyRefreshed();
}
//删除当前字段
function delThisField(obj) {
layer.confirm('您确认删除本行吗?', {title: '删除确认', closeBtn: 1, icon: 3}, function () {
$(obj).parent().parent().remove();
layer.closeAll();
});
}
//提交验证
$("#dataForm").validate({
rules: {
table_name: {
required: true,
},
cn_name: {
required: true,
},
},
messages: {
table_name: {
required: "表名不能为空",
},
cn_name: {
required: "中文名不能为空",
},
},
});
//选择表
$('#table_name').select2();
//生成菜单列表
$('#create_menu_list').select2();
//是否生成控制器
$('#create_controller').select2();
//是否生成模型
$('#create_model').select2();
//是否生成验证器
$('#create_validate').select2();
//是否生成列表视图
$('#create_view_index').select2();
//是否生成表单视图
$('#create_view_add').select2();
//控制器方法表
$('#controller_action_list').select2();
//选择父级菜单
$('#create_menu').select2();
//列表视图操作按钮形式
initIndexOperationButton();
//初始化列表操作按钮形式
function initIndexOperationButton() {
let $button = $('#index_operation_button');
//列表操作形式
let selected = 1;
let cookie_button = Cookies.get(cookiePrefix + 'index_operation_button');
if (cookie_button) {
selected = cookie_button;
}
$button.val(selected);
$button.select2();
}
$(function () {
$('#index_operation_button').on('change', function (e) {
let $this = this;
Cookies(cookiePrefix + 'index_operation_button', $('#index_operation_button').val(), {expires: 30});
});
});
//获取表信息
function getField(name) {
$.post('getField', {name: name}, function (result) {
if (result.code === 1) {
let $dataBody = $("#dataBody");
if (adminDebug) {
console.time('表信息与相关DOM操作耗时');
}
let controller = result.data.controller;
let model = result.data.model;
let validate = result.data.validate;
let field = result.data.field;
if (adminDebug) {
console.log('字段数量:' + field.length);
}
let table = result.data.table;
//中文名
$('#cn_name').val(table.cn_name);
//如果是自动生成类名
if ($('#auto_class_name').is(':checked')) {
$("#controller_name").val(controller.name);
$("#model_name").val(model.name);
$("#validate_name").val(validate.name);
}
$dataBody.html('');
//字段名
let field_name = "#data-template input[name='field_nameFORM_INDEX[]']";
//字段类型
let field_type = "#data-template input[name='field_typeFORM_INDEX[]']";
//是否为列表字段
let field_list = "#data-template [name='is_listFORM_INDEX[]']";
//是否为表单字段
let field_form = "#data-template [name='is_formFORM_INDEX[]']";
//中文名称
let form_name = "#data-template [name='form_nameFORM_INDEX[]']";
//表单类型
let form_type = "#data-template [name='form_typeFORM_INDEX[]']";
//表单验证
let form_validate = "#data-template [name='form_validateFORM_INDEX[]']";
//字段默认值
let field_form_default = "#data-template [name='field_defaultFORM_INDEX[]']";
//获取器/修改器
let getter_setter = "#data-template [name='getter_setterFORM_INDEX[]']";
//列表排序
let list_sort = "#data-template [name='list_sortFORM_INDEX[]']";
//
let listHtml = '';
$.each(field, function (index, item) {
//字段名
$(field_name).attr('value', item.name);
//字段类型
$(field_type).attr('value', item.field_type);
//中文名称
$(form_name).attr('value', item.cn_name);
//默认值
$(field_form_default).attr('value', item.default);
//表单类型
$(form_type).val(item.form_type);
//是否为列表字段
if (item.is_list === 1) {
$(field_list).attr('checked', true);
} else {
$(field_list).attr('checked', false);
}
//是否为表单字段
if (item.is_form === 1) {
$(field_form).attr('checked', true);
} else {
$(field_form).attr('checked', false);
}
//表单类型
$(form_type).find("option[value='" + item.form_type + "']").attr("selected", true);
//表单验证内容
$(form_validate).html(item.validate_html);
//表单选项
$(form_validate).find("option[value='required']").attr("selected", true);
//获取器/修改器
if (item.getter_setter !== false) {
$(getter_setter).find("option[value='" + item.getter_setter + "']").attr("selected", true);
}
//优化生成DOM慢的问题
formIndex++;
listHtml += $("#data-template").html().replace(/FORM_INDEX/g, '[' + formIndex + ']').replace(/INDEX_ID/g, formIndex);
if (getter_setter !== false) {
$(getter_setter).find("option[value='" + item.getter_setter + "']").attr("selected", false);
}
$(form_type).find("option[value='" + item.form_type + "']").attr("selected", false);
$(field_name).attr('value', '');
$(field_type).attr('value', '');
$(form_validate).empty();
});
$dataBody.append(listHtml);
dataBodyRefreshed();
if (adminDebug) {
console.timeEnd('表信息与相关DOM操作耗时');
}
}
});
}
//表单元素类型改变
function selectField(field) {
let $field = $(field);
let form_type = $field.val();
console.log(form_type);
let $validate_select = $field.parent().parent().next().find('.form-validate-select');
$.post('getValidateSelect', {form_type: form_type}, function (result) {
if (1 === result.code) {
$validate_select.html(result.data);
$validate_select.select2();
} else {
layer.msg(result.msg);
}
});
}
//刷新菜单
function refreshMenu() {
$.post('{:url("admin/generate/getMenu")}', function (result) {
let html = '<option value="-1">不生成</option><option value="0">顶级菜单</option>';
html += result.data;
$('#create_menu').html(html).select2();
});
}
//字段更多设置
$("#pjax-container").off('click').on('click', '.setting-more', function () {
let $dom = $('#field_setting_div_' + $(this).data('id'));
$dom.is(":hidden") ? $dom.show() : $dom.hide();
});
//选择关联类型防呆设计
function selectRelation(obj) {
let $obj = $(obj);
let relation_type = parseInt($obj.val());
let relation_show = $obj.data('relationShow');
let relation_table = $obj.data('relationTable');
if (relation_type === 1) {
$('input[name="' + relation_table + '"]').attr('readonly', 'readonly');
$('input[name="' + relation_show + '"]').removeAttr('readonly');
} else if (relation_type === 2) {
$('input[name="' + relation_show + '"]').attr('readonly', 'readonly');
$('input[name="' + relation_table + '"]').removeAttr('readonly');
} else {
$('input[name="' + relation_table + '"]').attr('readonly', 'readonly');
$('input[name="' + relation_show + '"]').attr('readonly', 'readonly');
}
}
//列表刷新后的操作
function dataBodyRefreshed() {
$('[data-toggle="tooltip"]').tooltip();
$('#dataBody .select2').select2();
}
</script>
{/block}