693 lines
29 KiB
PHP
Raw 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.

{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}