123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- <?php
- namespace app\admin\controller\base\models;
- /**
- * @title : 模型管理控制器
- * @desc :
- * @Author : Rock
- * @Date : 2023-04-11 20:14:01
- */
- use app\admin\controller\Base;
- use app\common\model\base\models\ModelManage as ModelManageModel;
- use app\common\model\base\models\ModelFields;
- use app\common\model\base\models\ModelServer;
- use app\common\model\base\models\ControllerServer;
- use app\common\model\base\models\ValidateServer;
- use app\common\model\base\models\VueIndexServer;
- use app\common\model\base\models\VueEditServer;
- use app\common\model\base\models\VueServer;
- use think\facade\Db;
- class ModelManage extends Base
- {
- protected $model = null;
- protected $fieldModel = null;
- protected $noNeedLogin = ['getTableList','getTableFields'];
- public function initialize()
- {
- parent::initialize();
- $this->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}不存在");
- }
- }
|