【easyswoole代码自动生成crud】我写了一个控制器用来生成增删改查

news2024/11/19 19:39:32

easyswoole代码自动生成crud

    • 根据表生成模型和控制器
    • 根据表生成模型
    • 根据表生成控制器
    • 控制器模板
    • 核心控制器代码curd.php

根据表生成模型和控制器

会在 App/Model目录下生成驼峰方式命名的模型文件
会在App/HttpController/Api 目录下生成驼峰方式命名的控制文件

curl http:localhost:9501/Curd/t?table_name=xxx

根据表生成模型

会在 App/Model目录下生成驼峰方式命名的模型文件

curl http://localhost:9501/curd/m?table_name=xxx

根据表生成控制器

会在App/HttpController/Api 目录下生成驼峰方式命名的控制文件

curl http://localhost:9501/curd/c?table_name=xxx

控制器模板

控制器模板目录

核心控制器代码curd.php

<?php
/*************************************************************************
 * File Name: Curd.php
 * Author: wangxd@yisa.com
 * Created Time: 2022/9/9 15:39
 * Description: 代码生成控制器
 *
 *************************************************************************/

namespace App\HttpController;

use EasySwoole\FastCache\Cache;
use EasySwoole\EasySwoole\Config;
use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\Mysqli\QueryBuilder;
use EasySwoole\ORM\DbManager;

class Curd extends Controller {


    /**
     *
     * 根据表自动生成模型和控制器
     * @Param(name="table_name", alias="表名")
     * @throws \EasySwoole\ORM\Exception\Exception
     * @throws \Throwable
     */
    public function t()
    {
        $params = $this->request()->getQueryParams();
        $table_name=$params['table_name'];
        $this->create_model($table_name);
        $this->create_cotroller($table_name);

        $this->writeJson(200, [], "success");
    }

    /**
     *
     * 根据表自动生成模型
     * @Param(name="table_name", alias="表名")
     * @throws \EasySwoole\ORM\Exception\Exception
     * @throws \Throwable
     */
    public function m(){
        $params = $this->request()->getQueryParams();
        $table_name=$params['table_name'];
        $model_name =$this->camelize($table_name);
        $this->create_model($table_name,$model_name);
        $this->writeJson(200, [], "success");
    }

    /**
     *
     * 根据表自动生成控制器
     * @Param(name="table_name", alias="表名")
     * @throws \EasySwoole\ORM\Exception\Exception
     * @throws \Throwable
     */
    public function c(){
        $params = $this->request()->getQueryParams();
        $table_name=$params['table_name'];
        $model_name =$this->camelize($table_name);
        $this->create_cotroller($table_name);
        $this->writeJson(200, [], "success");
    }

    /**
     * 创建模型
     * @table_name 表名
     * @model_name  模型名
     */
    public function create_model($table_name){
        $model_name =$this->camelize($table_name).'Model';
        $created_time=date("Y/m/d H:i");
        $model_code=<<<EOF
<?php
/*************************************************************************
 * Author: gerenator@yisa.com
 * Created Time: $created_time
 * Description: 模型
 *************************************************************************/

namespace App\Model;
use EasySwoole\ORM\DbManager;

class $model_name extends \EasySwoole\ORM\AbstractModel {
    protected \$connectionName = 'default';
    protected \$tableName = '$table_name';
}
EOF;
        $model_file_name='App/Model/'.$model_name.'.php';
        if (!file_exists($model_file_name)){
            file_put_contents($model_file_name,$model_code);
        }

    }

    /**
     * 创建模型
     * @table_name 表名
     * @model_name  模型名
     */
    public function create_cotroller($table_name){
        $controller_name =$this->camelize($table_name);
        $model_name =$this->camelize($table_name).'Model';
        $created_time=date("Y/m/d H:i");

        $cotroller_file_name='App/HttpController/Api/'.$controller_name.'.php';
        //从数据库中获取表字段信息
        $sql = "desc " .$table_name;
        //加载主表的列
        $queryBuild = new QueryBuilder();
// 支持参数绑定 第二个参数非必传
        $queryBuild->raw($sql);
// $queryBuild->raw("select * from test where name = 'siam'");

// 第二个参数 raw  指定true,表示执行原生sql
// 第三个参数 connectionName 指定使用的连接名,默认 default
        $data = DbManager::getInstance()->query($queryBuild, true, 'default');
        $feld_data=$data->getResult();

        $param_to_str='';
        $conditionQueryStr='';
        $param_to_updateData_str='';
        foreach ($feld_data as $k=>  $fda){
            if ($fda['Field'] !='id' ){
                $param_to_str.= "        \$data['{$fda['Field']}']  = \$param['{$fda['Field']}'];".PHP_EOL;
                $conditionQueryStr.="        Tool::conditionQuery(\$where,\$param, '{$fda['Field']}', '{$fda['Field']}', '=');".PHP_EOL ;
                $param_to_updateData_str.="        if (!empty( \$param['{$fda['Field']}'])) \$updateData['{$fda['Field']}'] = \$param['{$fda['Field']}'];".PHP_EOL ;
            }
        }


        if (!file_exists($cotroller_file_name)){
            $controller_code=file_get_contents('generator/Template/CurdController.stub');
            $controller_code=str_replace('{%model_name%}',$model_name,$controller_code);
            $controller_code=str_replace('{%controller_name%}',$controller_name,$controller_code);
            $controller_code=str_replace('{%param_to_data%}',$param_to_str,$controller_code);
            $controller_code=str_replace('{%conditionQuery%}',$conditionQueryStr,$controller_code);
            $controller_code=str_replace('{%param_to_updateData%}',$param_to_updateData_str,$controller_code);
            file_put_contents($cotroller_file_name,$controller_code);
        }



    }


    /**
     * 下划线转驼峰 首字母大写
     * 思路:
     * step1.原字符串转小写,原字符串中的分隔符用空格替换,在字符串开头加上分隔符
     * step2.将字符串中每个单词的首字母转换为大写,再去空格,去字符串首部附加的分隔符.
     */
    public function camelize($uncamelized_words,$separator='_')
    {
        $uncamelized_words = $separator. str_replace($separator, " ", strtolower($uncamelized_words));
        return ucfirst( ltrim(str_replace(" ", "", ucwords($uncamelized_words)), $separator ));
    }

    /**
     * 驼峰命名转下划线命名
     * 思路:
     * 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
     */
    public function uncamelize($camelCaps,$separator='_')
    {
        return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
    }




}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React V6分环境打包

功能背景 例如想要在react也要实现不同环境使用不同的api接口地址这样的想法&#xff0c;那么就需要根据命令自动区分环境了。 代码实现 比如我这又三种环境&#xff0c;那么创建三个文件&#xff0c;如图&#xff1a; 分别是dev:开发环境&#xff0c;formal&#xff1a;UAT环境…

【力扣】DP:1186. 删除一次得到子数组最大和

【力扣】DP&#xff1a;1186. 删除一次得到子数组最大和 文章目录 【力扣】DP&#xff1a;1186. 删除一次得到子数组最大和1. 题目描述2. 题解2.1 不可行2.2 DP 参考 1. 题目描述 给你一个整数数组&#xff0c;返回它的某个非空子数组&#xff08;连续元素&#xff09;在执行一…

画一个足球场,尺寸已标注好

画一个有标注的足球场 上面是一个带有标注的足球场俯视图&#xff0c;下面是实现代码。 import matplotlib.pyplot as plt from matplotlib.patches import Arc, Circle, Rectangle# 创建一个灰色背景的子图 fig, ax plt.subplots(facecolorgrey)# 设置x轴和y轴的范围 ax.set…

基于PaddleOCR的工件字符识别

目录 1.工业工件字符识别 1.2 难点 1.3 基于深度学习的OCR技术 2.基于Paddleocr的字符识别 &#x1f31f; 特性 2.1 PP-OCRv3介绍 3.本文工件字符识别数据集介绍 4.PaddleOCR工件字符 4.1 字符检测 1.工业工件字符识别 在复杂的工业制造环境中&#xff0c;为了更好的追踪…

SAP-MM未清PO调取

SAP未清PO调取 SAP查询open PO(未清采购清单)可以通过ME2M(PO per material),ME2L(PO per vendor),ME2N(PO per document number)进行查询。 未清订单一般指未完成收货或者已收货未完成发票校验的订单,在输入以上任一事务代码之后,在选择参数Selection Parameters…

十二、项目总结

项目总结 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布&#xff0c;并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步&#xff01;&#xff01;&#xff01; 文章目录 项目总结1…

在 Jetpack Compose 中创建 Drawer

Jetpack Compose 是一个现代的构建 Android UI 的工具集&#xff0c;它使得构建 UI 变得更加简单快速。在本篇博客中&#xff0c;我们将讨论如何在 Jetpack Compose 中创建 Drawer&#xff0c;也就是我们常见的侧边抽屉。 什么是 Drawer&#xff1f; Drawer 是一个提供导航选项…

【C++学习】STL容器——string

一、STL简介 1.1 什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 1.2 STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室…

java的final变量

Java在声明一个变量时&#xff0c;如果声明为final的&#xff0c;那么这个变量只能被赋值一次&#xff0c;赋值以后变量的值不能改变。 如果final变量指向一个对象的引用&#xff0c;对象的状态可以改变&#xff0c;但final变量始终指向同一对象的引用。 这个也规则也适用于数组…

第十八章 MobileViT网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

代码随想录算法训练营第五十一天

第一题、买卖股票的最佳时机含冷冻期 力扣题目链接 class Solution { public:int maxProfit(vector<int>& prices) {if(prices.size() 0) return 0;vector<vector<int>> dp(prices.size(), vector<int>(4, 0));dp[0][0] -prices[0];dp[0][1] d…

JVM GC ROOT分析与垃圾收集器原理分析(四)

目录 一、GC ROOT 1、虚拟机栈中的本地变量 2、static 成员 3、常量引用 4、本地方法栈中的变量 5、类加载器 6、线程 二、回收算法 1、标记和清除 2、复制算法 3、标记整理 三、垃圾收集器 1、新生代-复制算法 2、老年代-标记清除/整理 3、垃圾收集器分类 1、…

频数分析拟合优度卡方检验

一、案例介绍 某医学美容院对某年425位顾客抱怨原因进行了分析&#xff0c;结果见下表&#xff0c;现在想知道这四种抱怨原因的构成比是否有差异&#xff1f; 二、问题分析 本案例的分析目的是研究四种抱怨原因的构成比是否存在差异&#xff0c;抱怨原因为定类数据&#xff0…

Spring Boot 中的 EhCacheCacheManager 是什么,原理,如何使用

Spring Boot 中的 EhCacheCacheManager 是什么&#xff0c;原理&#xff0c;如何使用 前言 在现代化的应用程序中&#xff0c;缓存是提高性能的关键所在。缓存可以降低数据库的负载&#xff0c;提高响应速度&#xff0c;减少资源消耗。Spring Boot提供了多种缓存管理器&#…

结合GPS的SAT图道路识别

文章目录 2019 Leveraging Crowdsourced GPS Data for Road Extraction from Aerial Imagery基本介绍对GPS的使用关于怎么证明GPS信息有效How to render gps to imageGPS信息简介GPS点状特征GPS其他特征挖掘 可借鉴的点 2020 Convolutional Recurrent Network for Road Boundar…

《黑马头条》SpringBoot+SpringCloud+ Nacos等企业级微服务架构项目

环境搭建、SpringCloud微服务(注册发现、服务调用、网关) 1)课程对比 2)项目概述 2.1)能让你收获什么 2.2)项目课程大纲 2.3)项目概述 随着智能手机的普及&#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快&#xff0c;很多人只能利用碎片时间来获取信息&#x…

红帽认证考试流程详解,让你少走弯路

参加红帽认证考试涉及以下三个流程 账号和证件的准备 1 RHN 账号注册 考试前需要您提前注册红帽帐号(RHN) 注册地址&#xff1a;https://www.redhat.com/wapps/ugc/register.html 注册时以下条目请重点注意&#xff1a; ▸ 账户类型选择 Personal ▸ 红帽账户登录名…

onnx修改模型节点【改变input的shape】

因为转onnx后模型的输入无法转rknn&#xff0c;所以要对onnx进行节点修改成左边 import onnx import onnx.helper as helper from onnx.helper import TensorProto import numpy as npmodel onnx.load(demo.change.onnx) #自己创建新的节点 ###############################…

【LeetCode热题100】打卡第29天:二叉树的层序遍历二叉树的最大深度

文章目录 【LeetCode热题100】打卡第29天&#xff1a;二叉树的层序遍历&二叉树的最大深度⛅前言 二叉树的层序遍历&#x1f512;题目&#x1f511;题解 二叉树的最大深度&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第29天&#xff1a;二叉树的层序遍历&am…

Stage模型HarmonyOS服务卡片开发ArkTS卡片相关模块

图1 ArkTS卡片相关模块 FormExtensionAbility&#xff1a;卡片扩展模块&#xff0c;提供卡片创建、销毁、刷新等生命周期回调。 FormExtensionContext&#xff1a;FormExtensionAbility的上下文环境&#xff0c;提供FormExtensionAbility具有的接口和能力。 formProvider&…