buildadmin中接口封装适用uniapp前言一、使用crud创建数据库二、封装前台crud基类三、控制器使用记住前言适用于自己使用phpuniapp全栈开发项目的码农一、使用crud创建数据库创建数据表的时候勾选公共模型放到common目录二、封装前台crud基类新建 app/api/controller/FrontendCrudBase.php?phpnamespaceapp\api\controller;useThrowable;usethink\Model;useapp\common\controller\Frontend;usethink\Validate;abstractclassFrontendCrudBaseextendsFrontend{// 列表和详情默认公开如需登录可在子类重写protectedarray$noNeedLogin[index,read];// uniapp 常用场景只校验登录不走 user_rule 节点权限protectedarray$noNeedPermission[*];// 子类必须赋值protectedModel$model;// 子类可重写protectedarray$systemFields[id,create_time,update_time,delete_time];protectedstring$defaultOrderid desc;// 子类可返回验证器实例不需要验证可返回 nullprotectedfunctiongetValidator():?Validate{returnnull;}publicfunctionindex():void{$limit$this-request-get(limit/d,10);$page$this-request-get(page/d,1);$keywordtrim($this-request-get(keyword/s,));$order$this-request-get(order/s,$this-defaultOrder);$fields$this-getTableFields();$query$this-model-order($order);if($keyword!){$searchFieldsarray_values(array_filter($fields,function($field){return!in_array($field,[id,create_time,update_time,delete_time],true);}));if($searchFields){$query-where(function($subQuery)use($searchFields,$keyword){foreach($searchFieldsas$field){$subQuery-whereOr($field,like,%.$keyword.%);}});}}$result$query-paginate([list_rows$limit,page$page,]);$this-success(,[list$result-items(),total$result-total(),page$page,limit$limit,editableFields$this-getEditableFields(),]);}publicfunctionread():void{$id$this-request-get(id/d,0);$row$this-model-find($id);if(!$row){$this-error(__(Record not found));}$this-success(,[row$row,editableFields$this-getEditableFields(),]);}publicfunctionadd():void{if(!$this-request-isPost()){$this-error(__(Parameter error));}$data$this-getWriteData();if(!$data){$this-error(__(Parameter %s can not be empty,[]));}$this-model-startTrans();try{$validate$this-getValidator();if($validate){$validate-scene(add)-check($data);}$this-beforeAdd($data);$this-model-save($data);$this-afterAdd($this-model);$this-model-commit();}catch(Throwable$e){$this-model-rollback();$this-error($e-getMessage());}$this-success(__(Added successfully),[id$this-model-id,]);}publicfunctionedit():void{if(!$this-request-isPost()){$this-error(__(Parameter error));}$id$this-request-post(id/d,0);$row$this-model-find($id);if(!$row){$this-error(__(Record not found));}$data$this-getWriteData();if(!$data){$this-error(__(No rows updated));}$this-model-startTrans();try{$validate$this-getValidator();if($validate){$validate-scene(edit)-check(array_merge($data,[id$id]));}$this-beforeEdit($row,$data);$row-save($data);$this-afterEdit($row);$this-model-commit();}catch(Throwable$e){$this-model-rollback();$this-error($e-getMessage());}$this-success(__(Update successful));}publicfunctiondel():void{if(!$this-request-isPost()){$this-error(__(Parameter error));}$ids$this-request-post(ids/a,[]);if(!$ids){$id$this-request-post(id/d,0);if($id){$ids[$id];}}if(!$ids){$this-error(__(Parameter error));}$rows$this-model-whereIn($this-model-getPk(),$ids)-select();if($rows-isEmpty()){$this-error(__(Record not found));}$count0;$this-model-startTrans();try{foreach($rowsas$row){$this-beforeDelete($row);$count$row-delete();$this-afterDelete($row);}$this-model-commit();}catch(Throwable$e){$this-model-rollback();$this-error($e-getMessage());}if(!$count){$this-error(__(No rows were deleted));}$this-success(__(Deleted successfully));}protectedfunctiongetTableFields():array{return$this-model-db()-getTableFields();}protectedfunctiongetEditableFields():array{returnarray_values(array_diff($this-getTableFields(),$this-systemFields));}protectedfunctiongetWriteData():array{$params$this-request-post();$data[];foreach($this-getEditableFields()as$field){if(array_key_exists($field,$params)){$data[$field]$params[$field];}}return$data;}// 扩展钩子子类按需重写protectedfunctionbeforeAdd(array$data):void{}protectedfunctionafterAdd(Model$row):void{}protectedfunctionbeforeEdit(Model$row,array$data):void{}protectedfunctionafterEdit(Model$row):void{}protectedfunctionbeforeDelete(Model$row):void{}protectedfunctionafterDelete(Model$row):void{}}三、控制器使用?phpnamespaceapp\api\controller;classTestextendsFrontendCrudBase{// 无需登录的方法,同时也可以在表中设置哪些方法需要登录protectedarray$noNeedLogin[index,read];// 或者 [] 全部要求登录publicfunctioninitialize():void{parent::initialize();$this-modelnew\app\common\model\Test();}protectedfunctiongetValidator():?\think\Validate{returnnew\app\common\validate\Test();}}例如test表创建一个test的控制器继承刚才封装的基类然后在uniapp中就可以使用接口GET /api/test/indexGET /api/test/read?id1POST /api/test/addPOST /api/test/editPOST /api/test/del记住不要忘了前端接口调用时需要在header中添加server和ba-user-tokenba-user-token是api应用调用的前台ba-token是admin应用调用的后台