model = new ModelManageModel; $this->fieldsModel = new ModelFields; } /** * @title: 创建统一查询条件 * @desc: 描述 * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-12 10:54:48 */ private function createWhere() { $data = array_intersect_key($this->request->only(['status', 'keyword']), array_flip(['status', 'keyword'])); return array_filter([ !empty($data['status']) ? ['status', '=', $data['status']] : null, !empty($data['keyword']) ? ['name|title', 'LIKE', "%{$data['keyword']}%"] : null ]); } /** * @title: 获取模型列表 * @desc: 描述 * @param {int} {pageNo} {0} {页码} * @param {int} {pageSize} {10} {每页数量} * @param {int} {status} {} {模型状态,1=启用,2=停用} * @param {string} {keyword} {10} {搜索关键词,可搜索模型名称,数据表名} * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-12 10:58:30 */ public function getList(int $pageNo = 0,int $pageSize = 10) { $where = $this->createWhere(); if(!empty($pageNo)){ $res = $this->model->where($where)->paginate(['page'=>$pageNo,'list_rows'=>$pageSize]); return pageRes(1,"获取成功",$res->total(),$res->items()); }else{ $list = $this->model->where($where)->select(); return res(1,"获取成功",$list); } } /** * @title: 新增/修改模型 * @desc: 描述 * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-12 10:59:29 */ public function doEdit() { $data = $this->request->param(); $name = $data['name']; $title = $data['title']; $isExists = ModelManageModel::checkTable($name); if(strpos($name,'system_')===0){ return res(2,"表名不能以system_开头"); } try{ Db::startTrans(); if(empty($data['id'])){ if($isExists){ return res(2,"表名已存在"); } $this->model->replace()->save($data); $id = $this->model->id; ModelManageModel::createTable($id);//创建表 }else{ $oldname = $this->model->where('id',$data['id'])->value('name'); $this->model->replace()->save($data); $id = $this->model->id; if($name!=$oldname){ if($isExists){ Db::rollback(); return res(2,"新表名已存在"); }else{ $this->fieldsModel->where('model_name',$oldname)->update(['model_name'=>$name,'model_title'=>$title]); } } ModelManageModel::updateTable($id,$oldname);//修改表 } Db::commit(); return res(1,"编辑成功"); }catch(\Exception $e){ Db::rollback(); return res(2,"编辑失败",$e->getMessage(),$e->getTrace()); } } /** * @title: 删除模型 * @desc: 描述 * @param {int} {id} {} {模型ID} * @param {array} {deleteList} {} {待删除的内容} * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-12 10:59:44 */ public function doDelete(int $id=0,array $deleteList = []) { if(!$id){ return res(2,"参数错误"); } if(empty($deleteList)){ return res(2,"请选择待删除内容"); } try{ Db::startTrans(); // 数据表 if(in_array('table',$deleteList)){ ModelManageModel::deleteTable($id); } //菜单及菜单请求 if(in_array('menu',$deleteList)){ VueServer::deleteMenu($id); } // Model文件 if(in_array('model',$deleteList)){ ModelServer::deleteFile($id); } // controller文件 if(in_array('controller',$deleteList)){ ControllerServer::deleteFile($id); } // validate文件 if(in_array('validate',$deleteList)){ ValidateServer::deleteFile($id); } // vue列表页 if(in_array('vue',$deleteList)){ VueIndexServer::deleteIndex($id); } // vue编辑/新增页 if(in_array('edit',$deleteList)){ VueEditServer::deleteEdit($id); } // api接口文件 if(in_array('api',$deleteList)){ VueServer::deleteAPI($id); } // 选择器组件 if(in_array('selector',$deleteList)){ VueServer::deleteSelector($id); } // 模型及模型字段 if(in_array('modelinfo',$deleteList)){ $info = ModelManageModel::find($id); ModelFields::destroy(function($query)use($info){ $query->where('model_name',$info->name); }); $info->delete(); } Db::commit(); return res(1,"删除成功"); }catch(\Exception $e){ Db::rollback(); return res(2,"删除失败",$e->getMessage(),$e->getTrace()); } } /** * @title: 获取模型管理可选项 * @desc: 描述 * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-12 10:59:54 */ public function getOptions() { $data = [ 'statusList' => ModelManageModel::statusList(), 'engineList' => ModelManageModel::engineList(), ]; return res(1,"获取成功",$data); } /** * @title: 启用禁用模型 * @desc: 描述 * @param {int} {id} {} {模型ID} * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-12 11:23:47 */ public function changeStatus(int $id=0) { $info = ModelManageModel::find($id); if(!$info){ return res(2,"记录不存在"); } $info->status = abs(3 * $info->status - 5); $info->save(); return res(1,"操作成功"); } /** * @title: 生成相关代码 * @desc: 含Model,Controller,View * @param {int} {id} {} {模型ID} * @param {array} {createList} {} {需要生成代码的模块,可选:model,controller,validate,vue,api,edit,menu} * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-18 10:27:00 */ public function createCode(int $id = 0,array $createList=[]) { try{ // 模型文件 if(in_array('model',$createList)){ ModelServer::createModelFile($id); } // 控制器文件 if(in_array('controller',$createList)){ ControllerServer::createControllerFile($id,$this->userinfo['name'],$createList); } // 验证器文件 if(in_array('validate',$createList)){ ValidateServer::createValidateFile($id); } // Vue列表文件 if(in_array('vue',$createList)){ VueIndexServer::createIndexFile($id); } // API接口文件 if(in_array('api',$createList)){ VueServer::createApiJS($id); } //编辑弹窗文件 if(in_array('edit',$createList)){ VueEditServer::createEditFile($id); } // 菜单及菜单请求 if(in_array('menu',$createList)){ $res = VueServer::createMenu($id); if(!$res){ return res(2,"生成失败",$res); } } // 生成选择器 if(in_array('selector',$createList)){ $res = VueServer::createSelector($id); if(!$res){ return res(2,"生成失败",$res); } } return res(1,"文件生成成功"); }catch(\Exception $e){ $msg = $e->getMessage(); if(false!==strpos($msg,'mkdir(): Permission denied')){ return res(2,"创建文件夹时没有权限"); } return res(2,"生成失败",$e->getMessage(),$e->getTrace()); } } /** * @title: 复制模型 * @desc: 描述 * @param {int} {id} {} {模型ID} * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-25 11:29:21 */ public function doCopy(int $id) { $info = $this->model->find($id); if(!$info){ return res(2,"未找到模型"); } $model_name = $info->name; $newModelName = $model_name.'_copy'; $fieldList = ModelFields::where('model_name',$model_name)->select()->toArray(); $modelData = $info->toArray(); unset($modelData['id']); $modelData['name'] = $newModelName; $modelData['title'] .= '副本'; $fieldData = []; foreach($fieldList as $item){ unset($item['field_id']); $item['model_name'] = $newModelName; $item['model_title'] = $modelData['title'].'副本'; $fieldData[] = $item; } try{ Db::startTrans(); $this->model->replace()->save($modelData); (new ModelFields)->replace()->saveAll($fieldData); ModelManageModel::copyTable($id);//复制表 Db::commit(); return res(1,"复制成功,请生成代码"); }catch(\Exception $e){ Db::rollback(); return res(2,"复制失败",$e->getMessage(),$e->getTrace()); } } /** * @title: 获取未生成模型的数据表列表 * @desc: 获取未生成模型的数据表列表,不包含system_开头的表及已生成模型的表 * @return {*} * @author: Rock * @method: POST * @Date: 2023-07-24 09:54:22 */ public function getTableList() { $sql = "SHOW TABLE STATUS"; $res = Db::query($sql); $list = []; $hasList = $this->model->column('name'); foreach($res as $item){ $table = $item['Name']; // 排除系统表及已生成模型的表 if(strpos($table,'system_')!==0 && !in_array($table,$hasList)){ $list[] = $item; } } return res(1,'获取成功',$list); } /** * @title: 获取数据表字段 * @desc: 描述 * @param {string} {table} {} {数据表名} * @return {*} * @author: Rock * @method: POST * @Date: 2023-07-24 10:50:29 */ public function getTableFields(string $table='') { if(empty($table)){ return res(2,"请选择数据表"); } // 获取表注释 $sql = "SELECT TABLE_COMMENT FROM information_schema.TABLES WHERE table_name = '$table'"; $res = Db::query($sql); $tableTitle = $res?$res[0]['TABLE_COMMENT']:''; // 获取表字段 $sql = "SHOW FULL COLUMNS FROM `$table`"; $res = Db::query($sql); $list = []; foreach($res as $index=>$item){ // 处理成模型字段需要的数据 $field = $item['Field']; // 排除创建、更新、删除时间及主键 if(in_array($field,['create_at','update_at','delete_at']) || 'PRI'==$item['Key']){ continue; } $fl = strpos($item['Type'],'('); $el = strpos($item['Type'],')'); $db_type = $fl!==false?substr($item['Type'],0,$fl):$item['Type']; $len = $fl!==false&&$el!==false?intval(substr($item['Type'],$fl+1,$el-$fl-1)):0; $list[] = [ 'model_name'=>$table,//模型名称 'model_title'=>$tableTitle,//模型标题 'title'=>$item['Comment'],//字段标题 'field'=>$item['Field'],//字段名称 'field_type'=>'string',//字段类型,默认都是string,页面上修改 'db_type'=>$db_type,//数据类型 'len'=>$len,//数据长度 'show_in_table'=>1,//是否显示到表格中,默认显示 'search_type'=>'keyword',//搜索类型,默认关键字搜索 'status'=>1,//字段状态,默认可用 'weigh'=>$index+1,//字段排序,默认为序号 'rule'=>"require|chsAlphaNum|length:2,255",//验证规则,默认必填 'content'=>[],//可选项,默认为空 'content_txt'=>'',//可选项,默认为空 'default_value'=>$item['Default'],//默认值 'extra_rule'=>[],//组件属性 'extra_rule_txt'=>"placeholder|请输入文本\nclearable|false",//组件属性文本 'is_relation'=>2,//是否关联,默认不关联 'relation_model'=>'',//关联模型 'relation_field'=>'',//关联字段 'relation_show'=>'',//关联显示字段 'relation_dic_group'=>'',//关联字典分组 'fieldList'=>[],//可供选择的关联字段 ]; } return res(1,"获取成功",$list,$res); } /** * @title: 保存从数据表导入的模型 * @desc: 描述 * @return {*} * @author: Rock * @method: POST * @Date: 2023-07-25 15:40:29 */ public function saveFromDb() { $data = $this->request->param(); try{ $this->model->startTrans(); $modelInfo = $data['modelInfo']; $modelFields = $data['fieldList']; $this->model->replace()->save($modelInfo); (new ModelFields)->replace()->saveAll($modelFields); $this->model->commit(); return res(1,"保存成功,请前往模型列表生成代码",$data); }catch(\Exception $e){ $this->model->rollback(); return res(2,"保存失败:".$e->getMessage(),$e->getTrace()); } } public function __call($name,$arguments) { return res(2,"方法{$name}不存在"); } }