tableName); // 获取列表数据 $columns = MakeBuilder::getListColumns($this->tableName); // 获取搜索数据 $search = MakeBuilder::getListSearch($this->tableName); // 搜索 if (Request::param('getList') == 1) { $where = MakeBuilder::getListWhere($this->tableName); $orderByColumn = Request::param('orderByColumn') ?? $pk; $isAsc = Request::param('isAsc') ?? 'desc'; $model = '\app\common\model\\' . $this->modelName; return $model::getList($where, $this->pageSize, [$orderByColumn => $isAsc]); } // 构建页面 return TableBuilder::getInstance() ->setUniqueId($pk) // 设置主键 ->addColumns($columns) // 添加列表字段数据 ->setSearch($search) // 添加头部搜索 ->addColumn('right_button', '操作', 'btn') // 启用右侧操作列 ->addRightButtons(['edit', 'delete']) // 设置右侧操作列 ->addTopButtons(['add', 'edit', 'del', 'export', 'build']) // 设置顶部按钮组 ->addTopButton( 'default', [ 'title' => '生成菜单规则', 'icon' => 'fa fa-bars', 'class' => 'btn btn-danger single disabled', 'href' => '', 'onclick' => '$.operate.makeRule(\'' . url('makeRule') . '\')' ] ) // 自定义按钮 ->fetch(); } // 添加 public function add() { // 获取字段信息 $columns = MakeBuilder::getAddColumns($this->tableName); // 提示信息 $pageTips = '1、没有表时会创建表和字段并插入至字段管理中;
2、已有表时会检测必要字段后插入至字段管理中;
3、已有表需包含的字段:主键、create_time、update_time、[sort 勾选排序字段时]、[status 勾选状态字段时]、[cate_id, hits, keywords, description, template, url 表类型为CMS时];'; // 构建页面 return FormBuilder::getInstance() ->addFormItems($columns) ->setPageTips($pageTips, 'warning') // 提示信息 ->setExtraJs($this->getAddExtraJs()) // 设置额外JS ->fetch(); } // 添加保存 public function addPost() { if (Request::isPost()) { $data = MakeBuilder::changeFormData(Request::except(['file'], 'post'), $this->tableName); $result = $this->validate($data, $this->validate); if (true !== $result) { // 验证失败 输出错误信息 $this->error($result); } else { $model = '\app\common\model\\' . $this->modelName; // 唯一判断 $count = $model::where('table_name', $data['table_name'])->count(); if ($count) { $this->error('表名称 [' . $data['table_name'] . '] 已存在'); } $result = $model::addPost($data); if ($result['error']) { $this->error($result['msg']); } else { $makeTable = \app\common\model\Module::makeTable($data['table_name']); if ($makeTable === true) { $this->success($result['msg'], 'index'); } else { // 删除刚插入的数据 $model::where('table_name', $data['table_name'])->delete(); $this->error($makeTable); } } } } } // 修改 public function edit(string $id) { $model = '\app\common\model\\' . $this->modelName; $info = $model::edit($id)->toArray(); // 获取字段信息 $columns = MakeBuilder::getAddColumns($this->tableName, $info); // 提示信息 $pageTips = '1、主键发生变动时会更改数据库中的表结构,字段管理中的主键字段也会相应改变;
2、表名称发生变动时会更改数据库中的表名称,需要重新进行代码生成和菜单生成;'; // 构建页面 return FormBuilder::getInstance() ->addFormItems($columns) ->setPageTips($pageTips, 'warning') // 提示信息 ->setExtraJs($this->getEditExtraJs()) // 设置额外JS ->fetch(); } // 修改保存 public function editPost() { if (Request::isPost()) { $data = MakeBuilder::changeFormData(Request::except(['file'], 'post'), $this->tableName); $result = $this->validate($data, $this->validate); if (true !== $result) { // 验证失败 输出错误信息 $this->error($result); } else { // 尝试修改表名称和主键 $result = \app\common\model\Module::changeTable($data); if ($result !== true) { $this->error($result); } // 修改表记录信息 $model = '\app\common\model\\' . $this->modelName; $result = $model::editPost($data); if ($result['error']) { $this->error($result['msg']); } else { $this->success($result['msg'], 'index'); } } } } // 删除 public function del(string $id) { if (Request::isPost()) { // 当有栏目使用该模块时不可删除 if ($this->checkCate($id) == false) { return ['error' => 1, 'msg' => '删除失败,请先删除已使用该模块的栏目']; } // 模块删除的同时删除字段管理中对应的数据 $this->delModuleField($id); // 是否清空表[不删除] // 是否删除模型、控制器、验证器文件[不删除] if (strpos($id, ',') !== false) { return $this->selectDel($id); } $model = '\app\common\model\\' . $this->modelName; return $model::del($id); } } // 批量删除 public function selectDel(string $id) { if (Request::isPost()) { $model = '\app\common\model\\' . $this->modelName; return $model::selectDel($id); } } // ========================== // 检查表信息 public function checkTale(string $table_name = '') { if ($table_name) { try { // 获取模型名称 $modelName = ''; $tableNameArr = explode('_', $table_name); foreach ($tableNameArr as $v) { $modelName .= ucfirst($v); } // 获取完整表名称 $tableName = \think\facade\Config::get('database.connections.mysql.prefix') . $table_name; // 获取表全部字段 $fields = Db::getTableFields($tableName); // 从数据库中获取表字段信息 $sql = "SELECT * FROM `information_schema`.`columns` WHERE TABLE_SCHEMA = :table_schema AND table_name = :table_name " . "ORDER BY ORDINAL_POSITION"; $columnList = Db::query($sql, ['table_schema' => \think\facade\Config::get('database.connections.mysql.database'), 'table_name' => $tableName]); $priKey = ''; foreach ($columnList as $v) { if ($v['COLUMN_KEY'] == 'PRI') { $priKey = $v['COLUMN_NAME']; break; } } if (!$priKey) { return json(['error' => 1, 'msg' => '请设置 [' . $tableName . '] 表的主键']); } // 获取表基础信息 $tableInfo = Db::query("SHOW TABLE STATUS LIKE '{$tableName}'"); $tableInfo = $tableInfo[0]; // 获取表类型 $tableType = '2'; if (in_array('cate_id', $fields) && in_array('hits', $fields) && in_array('keywords', $fields) && in_array('description', $fields) && in_array('template', $fields) && in_array('url', $fields)) { $tableType = '1'; } // 自动时间戳 if (in_array('create_time', $fields) && in_array('update_time', $fields)) { $autoTimestamp = '1'; } // 返回信息 $data = [ 'module_name' => $tableInfo['Comment'] ?: $table_name, // 模块名称 'model_name' => $modelName, // 模型名称 'table_comment' => $tableInfo['Comment'], // 表注释 'pk' => $priKey, // 主键 'table_type' => $tableType, // 表类型 'is_sort' => in_array('sort', $fields) ? '1' : '0', // 排序字段 'is_status' => in_array('status', $fields) ? '1' : '0', // 状态字段 'remark' => $tableInfo['Comment'], // 备注 'auto_timestamp' => $autoTimestamp ?? '0', // 自动写入时间戳 'add_param' => $addParam ?? '', // 添加参数 ]; return json(['error' => 0, 'msg' => '数据表已存在,系统已自动补全其他字段', 'data' => $data]); } catch (\Exception $e) { return json(['error' => 2, 'msg' => $e->getMessage()]); } } } // 生成代码 public function build(string $id, string $file = '') { return MakeBuilder::makeModule($id, $file); } // 生成菜单 public function makeRule(string $id) { return MakeBuilder::makeRule($id); } /** * 删除模块时判断是否已有栏目在应用[兼容多选和单选] * @param $id 模块id * @return bool false 不可删除,true 可删除 */ private function checkCate(string $id) { strpos($id, ',') !== false ? $op = 'in' : $op = '='; $count = \app\common\model\Cate::where('module_id', $op, $id)->count(); if ($count) { return false; } return true; } /** * 删除模型时删除当前模型的所有字段数据[兼容多选和单选] * @param string $id * @return bool * @throws \Exception */ private function delModuleField(string $id) { strpos($id, ',') !== false ? $op = 'in' : $op = '='; return \app\common\model\Field::where('module_id', $op, $id)->delete(); } // 添加页额外JS private function getAddExtraJs() { $js = ''; return $js; } // 编辑页额外JS private function getEditExtraJs() { $js = ''; return $js; } }