easyswoole快速实现一个网站的api接口程序

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: easyswoole快速实现一个网站的api接口程序

目前,easyswoole已经成为了最知名的swoole框架之一,本人也用easyswoole开发过很多个项目了,现在就来讲一讲如何用easyswoole快速实现一个网站的curd功能的接口。

安装easyswoole和相关组件

环境方面本人不多做说明,可以去官方文档查看。

新增composer.json文件

{
    "require": {
        "easyswoole/easyswoole": "^3.2",
        "easyswoole/mysqli": "^1.2",
        "tioncico/curd-automatic-generation": "^1.0"
    },
    "autoload": {
        "psr-4": {
            "App\\\": "Application/"
        }
    }
}

然后输入以下命令进行引入,安装组件库:

composer up
mkdir -p Application/HttpController
php ./vendor/easyswoole/easyswoole/bin/easyswoole install

设计数据表

假设我们需要做一个简单的文章管理系统,需要用户,文章,评论,置顶,分类,这5个表:

新增文件 test.php

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 19-7-27
 * Time: 上午11:40
 */
include "./vendor/autoload.php";
//会员列表
$result = \\EasySwoole\\Mysqli\\DDLBuilder\\DDLBuilder::table('user_list', function (\\EasySwoole\\Mysqli\\DDLBuilder\\Blueprints\\TableBlueprint $blueprint) {
    $blueprint->colInt('id', '11')->setColumnComment('主键id')->setIsPrimaryKey()->setIsAutoIncrement();
    $blueprint->colVarChar('userAccount', '32')->setColumnComment('会员账号');
    $blueprint->colVarChar('userName', '32')->setColumnComment('会员昵称');
    $blueprint->colVarChar('userPassword', '32')->setColumnComment('会员密码');
    $blueprint->colDateTime('addTime')->setColumnComment('新增时间');
    $blueprint->colTinyInt('isAdmin', 1)->setColumnComment('是否会管理员')->setDefaultValue(0);
    $blueprint->setTableComment('会员列表');
    $blueprint->setTableEngine(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Engines::INNODB);
    $blueprint->setTableCharset(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Character::UTF8\_GENERAL\_CI);
    $blueprint->indexNormal('userAccount', \['userAccount'\]);
});
echo $result;
//文章分类列表
$result = \\EasySwoole\\Mysqli\\DDLBuilder\\DDLBuilder::table('article_list', function (\\EasySwoole\\Mysqli\\DDLBuilder\\Blueprints\\TableBlueprint $blueprint) {
    $blueprint->colInt('id', '11')->setColumnComment('主键id')->setIsPrimaryKey()->setIsAutoIncrement();
    $blueprint->colInt('pid', 11)->setColumnComment('上级id');
    $blueprint->colVarChar('categoryName', '64')->setColumnComment('分类名称');
    $blueprint->setTableComment('分类列表');
    $blueprint->setTableEngine(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Engines::INNODB);
    $blueprint->setTableCharset(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Character::UTF8\_GENERAL\_CI);
});
echo $result;
//文章列表
$result = \\EasySwoole\\Mysqli\\DDLBuilder\\DDLBuilder::table('article_list', function (\\EasySwoole\\Mysqli\\DDLBuilder\\Blueprints\\TableBlueprint $blueprint) {
    $blueprint->colInt('id', '11')->setColumnComment('主键id')->setIsPrimaryKey()->setIsAutoIncrement();
    $blueprint->colInt('categoryId', 11)->setColumnComment('分类id');
    $blueprint->colVarChar('title', '64')->setColumnComment('标题');
    $blueprint->colVarChar('keyword', '64')->setColumnComment('关键字');
    $blueprint->colVarChar('description', '255')->setColumnComment('简介');
    $blueprint->colVarChar('author', '32')->setColumnComment('作者');
    $blueprint->colText('content')->setColumnComment('内容');
    $blueprint->colDateTime('addTime')->setColumnComment('新增时间');
    $blueprint->colTinyInt('isOriginal', 1)->setColumnComment('是否原创')->setDefaultValue(1);
    $blueprint->setTableComment('文章列表');
    $blueprint->setTableEngine(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Engines::INNODB);
    $blueprint->setTableCharset(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Character::UTF8\_GENERAL\_CI);
    $blueprint->indexNormal('title', \['title'\]);
});
echo $result;
//评论列表
$result = \\EasySwoole\\Mysqli\\DDLBuilder\\DDLBuilder::table('comment_list', function (\\EasySwoole\\Mysqli\\DDLBuilder\\Blueprints\\TableBlueprint $blueprint) {
    $blueprint->colInt('id', '11')->setColumnComment('主键id')->setIsPrimaryKey()->setIsAutoIncrement();
    $blueprint->colInt('articleId', 11)->setColumnComment('文章id');
    $blueprint->colInt('commentPid', 11)->setColumnComment('评论父id')->setDefaultValue(0);
    $blueprint->colInt('userId', 11)->setColumnComment('评论会员id');
    $blueprint->colVarChar('userName', '64')->setColumnComment('评论会员名');
    $blueprint->colVarChar('content', '255')->setColumnComment('评论内容');
    $blueprint->colDateTime('addTime')->setColumnComment('评论时间');
    $blueprint->setTableComment('文章评论列表');
    $blueprint->setTableEngine(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Engines::INNODB);
    $blueprint->setTableCharset(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Character::UTF8\_GENERAL\_CI);
    $blueprint->indexNormal('articleId', \['articleId'\]);
    $blueprint->indexNormal('commentPid', \['commentPid'\]);
    $blueprint->indexNormal('userId', \['userId'\]);
});
echo $result;
//评论列表
$result = \\EasySwoole\\Mysqli\\DDLBuilder\\DDLBuilder::table('top_list', function (\\EasySwoole\\Mysqli\\DDLBuilder\\Blueprints\\TableBlueprint $blueprint) {
    $blueprint->colInt('id', '11')->setColumnComment('主键id')->setIsPrimaryKey()->setIsAutoIncrement();
    $blueprint->colInt('articleId', 11)->setColumnComment('文章id');
    $blueprint->setTableComment('文章置顶列表');
    $blueprint->setTableEngine(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Engines::INNODB);
    $blueprint->setTableCharset(\\EasySwoole\\Mysqli\\DDLBuilder\\Enum\\Character::UTF8\_GENERAL\_CI);
    $blueprint->indexNormal('articleId', \['articleId'\]);
});
echo $result;

该文件作用是直接通过easyswoole的mysqli建表工具生成建表sql,运行sql直接建表

配置数据库

在dev.php文件中新增以下配置:

'MYSQL'       => \[
    'host'            => '127.0.0.1',
    'port'            => 3306,
    'user'            => 'root',
    'password'        => 'test',
    'database'        => 'article',
    'timeout'         => 30,
    'charset'         => 'utf8mb4',
    'connect_timeout' => '5',//连接超时时间
\],

注册数据库连接池:

在easyswooleEvent.php的initialize方法中,注册数据库连接池:

public static function initialize()
{
    // TODO: Implement initialize() method.
    date\_default\_timezone_set('Asia/Shanghai');
    $mysqlConfig = new \\EasySwoole\\Mysqli\\Config(\\EasySwoole\\EasySwoole\\Config::getInstance()->getConf('MYSQL'));
    \\EasySwoole\\MysqliPool\\Mysql::getInstance()->register('mysql',$mysqlConfig);
}

初始化basemodel和basecontroller:

新增init.php文件:

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 19-7-27
 * Time: 上午11:59
 */
include "./vendor/autoload.php";
\\EasySwoole\\EasySwoole\\Core::getInstance()->initialize();
$init = new \\AutomaticGeneration\\Init();
$init->initBaseModel();
$init->initBaseController();

该脚本可在App目录中生成基础的baseModel和baseController

新增AdminBase,IndexBase,UserBase控制器,用于控制登录权限

分别在//Application/HttpController/Api/Admin,/Api/User,/Api/Index中新增Base.php文件:

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 19-7-27
 * Time: 下午12:14
 */
namespace App\\HttpController\\Api\\Admin;
use App\\Model\\UserBean;
use EasySwoole\\Http\\Message\\Status;
class Base extends \\App\\HttpController\\Base
{
    protected $who;
    //session的cookie头
    protected $tokenName = 'adminSession';
    //白名单,用于用户请求login方法时,不会因为没有登录而拒绝访问
    protected $whiteList = \['login'\];
    /**
     * onRequest
     * @param null|string $action
     * @return bool|null
     * @throws \\Throwable
     * @author yangzhenyu
     * Time: 13:49
     */
    function onRequest(?string $action): ?bool
    {
        if (parent::onRequest($action)) {
            //白名单判断
            if (in_array($action, $this->whiteList)) {
                return true;
            }
            //获取登入信息,如果没有登录,则不让访问,只有Admin和User需要
            if (!$this->getWho()) {
                $this->writeJson(Status::CODE_UNAUTHORIZED, '', '登入已过期');
                return false;
            }
            return true;
        }
        return false;
    }
    /**
     * getWho
     * @return bool
     * @author yangzhenyu
     * Time: 13:51
     */
    function getWho(): ?UserBean
    {
        if ($this->who instanceof UserBean) {
            return $this->who;
        }
        $sessionKey = $this->request()->getRequestParam($this->tokenName);
        if (empty($sessionKey)) {
            $sessionKey = $this->request()->getCookieParams($this->tokenName);
        }
        if (empty($sessionKey)) {
            return null;
        }
        //这里需要自己实现,通过用户传来的token,去获取用户信息,如果获取失败,则代表没有登录
        return $this->who;
    }
    protected function getValidateRule(?string $action): ?\\EasySwoole\\Validate\\Validate
    {
        // TODO: Implement getValidateRule() method.
    }
}

批量新增curd控制器,表操作model

新增createTable.php文件:

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 19-7-27
 * Time: 上午11:59
 */
include "./vendor/autoload.php";
\\EasySwoole\\EasySwoole\\Core::getInstance()->initialize();
go(function () {
    $db = \\EasySwoole\\MysqliPool\\Mysql::defer('mysql');
    $result = $db->rawQuery("show tables;");
    $tableList = array\_column($result,'Tables\_in_article');
    var_dump($tableList);
    //生成所有的bean,model
    foreach ($tableList as $tableName){
        var_dump($tableName);
        $mysqlTable = new \\AutomaticGeneration\\MysqlTable($db, \\EasySwoole\\EasySwoole\\Config::getInstance()->getConf('MYSQL.database'));
        $tableColumns = $mysqlTable->getColumnList($tableName);
        $tableComment = $mysqlTable->getComment($tableName);
        $path = '';
        $beanConfig = new \\AutomaticGeneration\\Config\\BeanConfig();
        $beanConfig->setBaseNamespace("App\\\Model".$path);
        $beanConfig->setTablePre('');
        $beanConfig->setTableName($tableName);
        $beanConfig->setTableComment($tableComment);
        $beanConfig->setTableColumns($tableColumns);
        $beanBuilder = new \\AutomaticGeneration\\BeanBuilder($beanConfig);
        $result = $beanBuilder->generateBean();
        var_dump($result);
        $path = '';
        $modelConfig = new \\AutomaticGeneration\\Config\\ModelConfig();
        $modelConfig->setBaseNamespace("App\\\Model".$path);
        $modelConfig->setTablePre("");
        $modelConfig->setExtendClass(\\App\\Model\\BaseModel::class);
        $modelConfig->setTableName("user_list");
        $modelConfig->setTableComment($tableComment);
        $modelConfig->setTableColumns($tableColumns);
        $modelBuilder = new \\AutomaticGeneration\\ModelBuilder($modelConfig);
        $result = $modelBuilder->generateModel();
        var_dump($result);
        $path='\\\Api\\\Admin';
        $controllerConfig = new \\AutomaticGeneration\\Config\\ControllerConfig();
        $controllerConfig->setBaseNamespace("App\\\HttpController".$path);
        $controllerConfig->setTablePre('');
        $controllerConfig->setTableName($tableName);
        $controllerConfig->setTableComment($tableComment);
        $controllerConfig->setTableColumns($tableColumns);
        $controllerConfig->setExtendClass("App\\\HttpController".$path."\\\Base");
        $controllerConfig->setModelClass($modelBuilder->getClassName());
        $controllerConfig->setBeanClass($beanBuilder->getClassName());
        $controllerConfig->setMysqlPoolClass(EasySwoole\\MysqliPool\\Mysql::class);
        $controllerConfig->setMysqlPoolName('mysql');
        $controllerBuilder = new \\AutomaticGeneration\\ControllerBuilder($controllerConfig);
        $result = $controllerBuilder->generateController();
        var_dump($result);
        $path='\\\Api\\\Index';
        $controllerConfig = new \\AutomaticGeneration\\Config\\ControllerConfig();
        $controllerConfig->setBaseNamespace("App\\\HttpController".$path);
        $controllerConfig->setTablePre('');
        $controllerConfig->setTableName($tableName);
        $controllerConfig->setTableComment($tableComment);
        $controllerConfig->setTableColumns($tableColumns);
        $controllerConfig->setExtendClass("App\\\HttpController".$path."\\\Base");
        $controllerConfig->setModelClass($modelBuilder->getClassName());
        $controllerConfig->setBeanClass($beanBuilder->getClassName());
        $controllerConfig->setMysqlPoolClass(EasySwoole\\MysqliPool\\Mysql::class);
        $controllerConfig->setMysqlPoolName('mysql');
        $controllerBuilder = new \\AutomaticGeneration\\ControllerBuilder($controllerConfig);
        $result = $controllerBuilder->generateController();
        var_dump($result);
        $path='\\\Api\\\User';
        $controllerConfig = new \\AutomaticGeneration\\Config\\ControllerConfig();
        $controllerConfig->setBaseNamespace("App\\\HttpController".$path);
        $controllerConfig->setTablePre('');
        $controllerConfig->setTableName($tableName);
        $controllerConfig->setTableComment($tableComment);
        $controllerConfig->setTableColumns($tableColumns);
        $controllerConfig->setExtendClass("App\\\HttpController".$path."\\\Base");
        $controllerConfig->setModelClass($modelBuilder->getClassName());
        $controllerConfig->setBeanClass($beanBuilder->getClassName());
        $controllerConfig->setMysqlPoolClass(EasySwoole\\MysqliPool\\Mysql::class);
        $controllerConfig->setMysqlPoolName('mysql');
        $controllerBuilder = new \\AutomaticGeneration\\ControllerBuilder($controllerConfig);
        $result = $controllerBuilder->generateController();
        var_dump($result);
    }
    exit;
});

运行,根据提示去输入需要在getAll时查询的关键字字段,不填也行:

image.png

当前台传入keyword=“测试”,那么sql语句将会生成 title like "%测试%"

完善接口

当这个文件运行完之后,一个文章管理系统的基本api已经是生成好了,大概是这样:

image.png

我们下一步要做的是:

1:完善用户登录接口

2:把User里面所有控制器的update,add等方法删除(普通用户没权限管理文章,文章分类等等,当然评论有权限)

3:每个方法都需要去修改下,毕竟自动生成工具不是那么智能,只能自己继续完善了,但是,已经是很好了,不是吗?

4:每个控制器的getValidateRule方法需要自己完善,这个是用于验证用户传入的基础参数是否正确的方法

给你们看看curd的各种方法自动生成后的截图:





image.png

image.png

image.png

image.png

image.png

这些都是自动生成的哦!

其他:

建表工具文档:https://www.easyswoole.com/Cn/Components/Mysqli/createTable.html

自动生成curd控制器组件地址:https://github.com/tioncico/curdAutomaticGeneration

easyswoole mysql-pool组件:https://www.easyswoole.com/Cn/Components/mysqlPool.html

easyswoole官方文档:https://www.easyswoole.com/Cn/Introduction/environment.html

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。
|
10天前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应
|
19天前
|
编解码 监控 API
直播源怎么调用api接口
调用直播源的API接口涉及开通服务、添加域名、获取API密钥、调用API接口、生成推流和拉流地址、配置直播源、开始直播、监控管理及停止直播等步骤。不同云服务平台的具体操作略有差异,但整体流程简单易懂。
|
1月前
|
人工智能 自然语言处理 PyTorch
Text2Video Huggingface Pipeline 文生视频接口和文生视频论文API
文生视频是AI领域热点,很多文生视频的大模型都是基于 Huggingface的 diffusers的text to video的pipeline来开发。国内外也有非常多的优秀产品如Runway AI、Pika AI 、可灵King AI、通义千问、智谱的文生视频模型等等。为了方便调用,这篇博客也尝试了使用 PyPI的text2video的python库的Wrapper类进行调用,下面会给大家介绍一下Huggingface Text to Video Pipeline的调用方式以及使用通用的text2video的python库调用方式。
|
9天前
|
JSON 前端开发 JavaScript
API接口商品详情接口数据解析
商品详情接口通常用于提供特定商品的详细信息,这些信息比商品列表接口中的信息更加详细和全面。以下是一个示例的JSON数据格式,用于表示一个商品详情API接口的响应。这个示例假定API返回一个包含商品详细信息的对象。
|
1月前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
15天前
|
JSON API 开发者
1688API商品详情接口如何获取
获取 1688 API 商品详情接口的步骤包括:1. 注册开发者账号;2. 了解接口规范和政策;3. 申请 API 权限;4. 获取 API 密钥;5. 实现接口调用(选择开发语言、发送 HTTP 请求);6. 处理响应数据。通过这些步骤,可以顺利调用 1688 的商品详情 API。
|
2月前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
104 6
|
29天前
|
监控 API 开发工具
深入理解API设计:构建高效的接口
【10月更文挑战第6天】深入理解API设计:构建高效的接口
76 0
|
1月前
|
API 数据安全/隐私保护 开发者
淘宝 API:关键词搜商品列表接口,助力商家按价格销量排序分析数据
此接口用于通过关键词搜索淘宝商品列表。首先需在淘宝开放平台注册并创建应用获取API权限,之后利用应用密钥和访问令牌调用接口。请求参数包括关键词、页码、每页数量、排序方式及价格区间等。返回结果含总商品数量及具体商品详情。使用时需注意签名验证及官方文档更新。

热门文章

最新文章