手把手教你开发easyswoole 接口网站
基础开发示例
demo地址
基础开发示例已经开源,地址:https://github.com/easy-swoole/demo/tree/3.x
安装
框架安装
- 我们先安装好swooole拓展,执行
php --ri swoole
确保可以看到swoole拓展最版本为4.4.3 - 建立一个目录,名为
Test
,执行composer require easyswoole/easyswoole=3.x
引入easyswoole - 执行
php vendor/bin/easyswoole install
进行安装
命名空间注册
编辑Test
根目录下的 composer.json 文件,加入"App\\": "App/"
,大体结构如下:
{
"autoload": {
"psr-4": {
"App\\": "App/"
}
},
"require": {
"easyswoole/easyswoole": "3.x"
}}
复制
安装后目录结构
Test 项目部署目录
├─App 应用目录
│ ├─HttpController 控制器目录(需要自己创建)
├─Log 日志文件目录(启动后创建)
├─Temp 临时文件目录(启动后创建)
├─vendor 第三方类库目录
├─composer.json Composer架构
├─composer.lock Composer锁定
├─EasySwooleEvent.php 框架全局事件
├─easyswoole 框架管理脚本
├─easyswoole.install 框架安装锁定文件
├─dev.php 开发配置文件
├─produce.php 生产配置文件
复制
执行以下命令进行名称空间的更新:
composer dumpautoload
复制
连接池实现
配置项
我们在dev.php 配置文件中,加入以下配置信息,注意:请跟进自己的mysql服务器信息填写账户密码。
'MYSQL' => [
'host' => '',
'port' => 3300,
'user' => '',
'password' => '',
'database' => '',
'timeout' => 5,
'charset' => 'utf8mb4',
]
复制
引入Mysqli库
执行以下命令用于实现Mysqli库的引入
composer require easyswoole/mysqli
复制
再引入mysqli-pool库
composer require easyswoole/mysqli-pool
复制
事件注册
我们编辑根目录下的EasySwooleEvent.php
文件,在mainServerCreate
事件中进行连接池的注册,大体结构如下:
<?php/**
* Created by PhpStorm.
* User: yf
* Date: 2018/5/28
* Time: 下午6:33
*/namespace EasySwoole\EasySwoole;use EasySwoole\Component\Timer;use EasySwoole\EasySwoole\Swoole\EventRegister;use EasySwoole\EasySwoole\AbstractInterface\Event;use EasySwoole\Http\Request;use EasySwoole\Http\Response;class EasySwooleEvent implements Event{
public static function initialize()
{
// TODO: Implement initialize() method.
date_default_timezone_set('Asia/Shanghai');
$configData = Config::getInstance()->getConf('MYSQL');
$config = new \EasySwoole\Mysqli\Config($configData);
$poolConf = \EasySwoole\MysqliPool\Mysql::getInstance()->register('mysql', $config);
$poolConf->setMaxObjectNum(20);
}
public static function mainServerCreate(EventRegister $register)
{
}
public static function onRequest(Request $request, Response $response): bool {
// TODO: Implement onRequest() method.
return true;
}
public static function afterRequest(Request $request, Response $response): void {
// TODO: Implement afterAction() method.
}}
复制
模型定义
基础模型定义
新建App/Model/BaseModel.php
文件:
<?phpnamespace App\Model;use EasySwoole\Mysqli\Mysqli;class BaseModel{
protected $db;
protected $table;
function __construct(Mysqli $connection)
{
$this->db = $connection;
}
function getDbConnection():Mysqli {
return $this->db;
}
/**
* @return mixed
*/
public function getTable()
{
return $this->table;
}}
复制
管理员模型
新增管理员用户表:
CREATE TABLE `admin_list` (
`adminId` int(11) NOT NULL AUTO_INCREMENT,
`adminName` varchar(15) DEFAULT NULL,
`adminAccount` varchar(18) DEFAULT NULL,
`adminPassword` varchar(32) DEFAULT NULL,
`adminSession` varchar(32) DEFAULT NULL,
`adminLastLoginTime` int(11) DEFAULT NULL,
`adminLastLoginIp` varchar(20) DEFAULT NULL,
PRIMARY KEY (`adminId`),
UNIQUE KEY `adminAccount` (`adminAccount`),
KEY `adminSession` (`adminSession`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `admin_list` VALUES ('1', '仙士可', 'xsk', 'e10adc3949ba59abbe56e057f20f883e', '', '1566279458', '192.168.159.1');
复制
新增bean文件
新增 App/Model/Admin/AdminBean.php
文件:
<?phpnamespace App\Model\Admin;/**
* Class AdminBean
* Create With Automatic Generator
* @property int adminId |
* @property string adminName |
* @property string adminAccount |
* @property string adminPassword |
* @property string adminSession |
* @property int adminLastLoginTime |
* @property string adminLastLoginIp |
*/class AdminBean extends \EasySwoole\Spl\SplBean{
protected $adminId;
protected $adminName;
protected $adminAccount;
protected $adminPassword;
protected $adminSession;
protected $adminLastLoginTime;
protected $adminLastLoginIp;
public function setAdminId($adminId)
{
$this->adminId = $adminId;
}
public function getAdminId()
{
return $this->adminId;
}
public function setAdminName($adminName)
{
$this->adminName = $adminName;
}
public function getAdminName()
{
return $this->adminName;
}
public function setAdminAccount($adminAccount)
{
$this->adminAccount = $adminAccount;
}
public function getAdminAccount()
{
return $this->adminAccount;
}
public function setAdminPassword($adminPassword)
{
$this->adminPassword = $adminPassword;
}
public function getAdminPassword()
{
return $this->adminPassword;
}
public function setAdminSession($adminSession)
{
$this->adminSession = $adminSession;
}
public function getAdminSession()
{
return $this->adminSession;
}
public function setAdminLastLoginTime($adminLastLoginTime)
{
$this->adminLastLoginTime = $adminLastLoginTime;
}
public function getAdminLastLoginTime()
{
return $this->adminLastLoginTime;
}
public function setAdminLastLoginIp($adminLastLoginIp)
{
$this->adminLastLoginIp = $adminLastLoginIp;
}
public function getAdminLastLoginIp()
{
return $this->adminLastLoginIp;
}}
复制
新增model文件
新增 App/Model/Admin/AdminModel.php
文件:
<?phpnamespace App\Model\Admin;/**
* Class AdminModel
* Create With Automatic Generator
*/class AdminModel extends \App\Model\BaseModel{
protected $table = 'admin_list';
protected $primaryKey = 'adminId';
/**
* @getAll
* @keyword adminName
* @param int page 1
* @param string keyword
* @param int pageSize 10
* @return array[total,list]
*/
public function getAll(int $page = 1, string $keyword = null, int $pageSize = 10): array
{
if (!empty($keyword)) {
$this->getDbConnection()->where('adminAccount', '%' . $keyword . '%', 'like');
}
$list = $this->getDbConnection()
->withTotalCount()
->orderBy($this->primaryKey, 'DESC')
->get($this->table, [$pageSize * ($page - 1), $pageSize]);
$total = $this->getDbConnection()->getTotalCount();
return ['total' => $total, 'list' => $list];
}
/**
* 默认根据主键(adminId)进行搜索
* @getOne
* @param AdminBean $bean
* @return AdminBean
*/
public function getOne(AdminBean $bean): ?AdminBean {
$info = $this->getDbConnection()->where($this->primaryKey, $bean->getAdminId())->getOne($this->table);
if (empty($info)) {
return null;
}
return new AdminBean($info);
}
/**
* 默认根据bean数据进行插入数据
* @add
* @param AdminBean $bean
* @return bool
*/
public function add(AdminBean $bean): bool {
return $this->getDbConnection()->insert($this->table, $bean->toArray(null, $bean::FILTER_NOT_NULL));
}
/**
* 默认根据主键(adminId)进行删除
* @delete
* @param AdminBean $bean
* @return bool
*/
public function delete(AdminBean $bean): bool {
return $this->getDbConnection()->where($this->primaryKey, $bean->getAdminId())->delete($this->table);
}
/**
* 默认根据主键(adminId)进行更新
* @delete
* @param AdminBean $bean
* @param array $data
* @return bool
*/
public function update(AdminBean $bean, array $data): bool {
if (empty($data)) {
return false;
}
return $this->getDbConnection()->where($this->primaryKey, $bean->getAdminId())->update($this->table, $data);
}
/*
* 登录成功后请返回更新后的bean
*/
function login(AdminBean $userBean): ?AdminBean {
$user = $this->getDbConnection()
->where('adminAccount', $userBean->getAdminAccount())
->where('adminPassword', $userBean->getAdminPassword())
->getOne($this->table);
if (empty($user)) {
return null;
}
return new AdminBean($user);
}
/*
* 以account进行查询
*/
function accountExist(AdminBean $userBean): ?AdminBean {
$user = $this->getDbConnection()
->where('adminAccount', $userBean->getAdminAccount())
->getOne($this->table);
if (empty($user)) {
return null;
}
return new AdminBean($user);
}
function getOneBySession($session)
{
$user = $this->getDbConnection()
->where('adminSession', $session)
->getOne($this->table);
if (empty($user)) {
return null;
}
return new AdminBean($user);
}
function logout(AdminBean $bean){
$update = [
'adminSession'=>'',
];
return $this->getDbConnection()->where($this->primaryKey, $bean->getAdminId())->update($this->table, $update);
}}
复制
普通用户模型
普通用户模型和管理员模型同理
建表
CREATE TABLE `user_list` (
`userId` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(32) NOT NULL,
`userAccount` varchar(18) NOT NULL,
`userPassword` varchar(32) NOT NULL,
`phone` varchar(18) NOT NULL,
`addTime` int(11) DEFAULT NULL,
`lastLoginIp` varchar(20) DEFAULT NULL,
`lastLoginTime` int(10) DEFAULT NULL,
`userSession` varchar(32) DEFAULT NULL,
`state` tinyint(2) DEFAULT NULL,
`money` int(10) NOT NULL DEFAULT '0' COMMENT '用户余额',
`frozenMoney` int(10) NOT NULL DEFAULT '0' COMMENT '冻结余额',
PRIMARY KEY (`userId`),
UNIQUE KEY `pk_userAccount` (`userAccount`),
KEY `userSession` (`userSession`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制
新增bean文件
在 App/Model/User/UserBean.php
文件:
<?phpnamespace App\Model\User;/**
* Class UserBean
* Create With Automatic Generator
* @property int userId |
* @property string userName |
* @property string userAccount |
* @property string userPassword |
* @property string phone |
* @property string money |
* @property int addTime |
* @property string lastLoginIp |
* @property int lastLoginTime |
* @property string userSession |
* @property int state |
*/class UserBean extends \EasySwoole\Spl\SplBean{
protected $userId;
protected $userName;
protected $userAccount;
protected $userPassword;
protected $userAvatar;
protected $phone;
protected $money;
protected $frozenMoney;
protected $addTime;
protected $lastLoginIp;
protected $lastLoginTime;
protected $userSession;
protected $state;
const STATE_PROHIBIT = 0;//禁用状态
const STATE_NORMAL = 1;//正常状态
public function setUserId($userId)
{
$this->userId = $userId;
}
public function getUserId()
{
return $this->userId;
}
public function setUserName($userName)
{
$this->userName = $userName;
}
public function getUserName()
{
return $this->userName;
}
public function setUserAccount($userAccount)
{
$this->userAccount = $userAccount;
}
public function getUserAccount()
{
return $this->userAccount;
}
/**
* @return mixed
*/
public function getUserAvatar()
{
return $this->userAvatar;
}
/**
* @param mixed $userAvatar
*/
public function setUserAvatar($userAvatar): void {
$this->userAvatar = $userAvatar;
}
public function setUserPassword($userPassword)
{
$this->userPassword = $userPassword;
}
public function getUserPassword()
{
return $this->userPassword;
}
public function setPhone($phone)
{
$this->phone = $phone;
}
public function getPhone()
{
return $this->phone;
}
public function setMoney($money)
{
$this->money = $money;
}
public function getMoney()
{
return $this->money;
}
public function setAddTime($addTime)
{
$this->addTime = $addTime;
}
public function getAddTime()
{
return $this->addTime;
}
public function setLastLoginIp($lastLoginIp)
{
$this->lastLoginIp = $lastLoginIp;
}
public function getLastLoginIp()
{
return $this->lastLoginIp;
}
public function setLastLoginTime($lastLoginTime)
{
$this->lastLoginTime = $lastLoginTime;
}
public function getLastLoginTime()
{
return $this->lastLoginTime;
}
public function setUserSession($userSession)
{
$this->userSession = $userSession;
}
public function getUserSession()
{
return $this->userSession;
}
public function setState($state)
{
$this->state = $state;
}
public function getState()
{
return $this->state;
}
/**
* @return mixed
*/
public function getFrozenMoney()
{
return $this->frozenMoney;
}
/**
* @param mixed $frozenMoney
*/
public function setFrozenMoney($frozenMoney)
{
$this->frozenMoney = $frozenMoney;
}}
复制
新增model文件
新增 App/Model/User/UserModel.php
文件:
<?phpnamespace App\Model\User;/**
* Class UserModel
* Create With Automatic Generator
*/class UserModel extends \App\Model\BaseModel{
protected $table = 'user_list';
protected $primaryKey = 'userId';
/**
* @getAll
* @keyword userName
* @param int page 1
* @param string keyword
* @param int pageSize 10
* @return array[total,list]
*/
public function getAll(int $page = 1, string $keyword = null, int $pageSize = 10): array
{
if (!empty($keyword)) {
$this->getDbConnection()->where('userAccount', '%' . $keyword . '%', 'like');
}
$list = $this->getDbConnection()
->withTotalCount()
->orderBy($this->primaryKey, 'DESC')
->get($this->table, [$pageSize * ($page - 1), $pageSize]);
$total = $this->getDbConnection()->getTotalCount();
return ['total' => $total, 'list' => $list];
}
/**
* 默认根据主键(userId)进行搜索
* @getOne
* @param UserBean $bean
* @return UserBean
*/
public function getOne(UserBean $bean,$field='*'): ?UserBean {
$info = $this->getDbConnection()->where($this->primaryKey, $bean->getUserId())->getOne($this->table,$field);
if (empty($info)) {
return null;
}
return new UserBean($info);
}
public function getOneByPhone($phone,$field='*'): ?UserBean {
$info = $this->getDbConnection()->where('phone', $phone)->getOne($this->table,$field);
if (empty($info)) {
return null;
}
return new UserBean($info);
}
/**
* 默认根据bean数据进行插入数据
* @add
* @param UserBean $bean
* @return bool
*/
public function add(UserBean $bean): bool {
return $this->getDbConnection()->insert($this->table, $bean->toArray(null, $bean::FILTER_NOT_NULL));
}
/**
* 默认根据主键(userId)进行删除
* @delete
* @param UserBean $bean
* @return bool
*/
public function delete(UserBean $bean): bool {
return $this->getDbConnection()->where($this->primaryKey, $bean->getUserId())->delete($this->table);
}
/**
* 默认根据主键(userId)进行更新
* @delete
* @param UserBean $bean
* @param array $data
* @return bool
*/
public function update(UserBean $bean, array $data): bool {
if (empty($data)){
return false;
}
return $this->getDbConnection()->where($this->primaryKey, $bean->getUserId())->update($this->table, $data);
}
/*
* 登录成功后请返回更新后的bean
*/
function login(UserBean $userBean): ?UserBean {
$user = $this->getDbConnection()
->where('userAccount', $userBean->getUserAccount())
->where('userPassword', $userBean->getUserPassword())
->getOne($this->table);
if (empty($user)) {
return null;
}
return new UserBean($user);
}
function getOneBySession($session)
{
$user = $this->getDbConnection()
->where('userSession', $session)
->getOne($this->table);
if (empty($user)) {
return null;
}
return new UserBean($user);
}
function logout(UserBean $bean){
$update = [
'userSession'=>'',
];
return $this->getDbConnection()->where($this->primaryKey, $bean->getUserId())->update($this->table, $update);
}}
复制
banner模型
建表
CREATE TABLE `banner_list` (
`bannerId` int(11) NOT NULL AUTO_INCREMENT,
`bannerName` varchar(32) DEFAULT NULL,
`bannerImg` varchar(255) NOT NULL COMMENT 'banner图片',
`bannerDescription` varchar(255) DEFAULT NULL,
`bannerUrl` varchar(255) DEFAULT NULL COMMENT '跳转地址',
`state` tinyint(3) DEFAULT NULL COMMENT '状态0隐藏 1正常',
PRIMARY KEY (`bannerId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制
新增bean文件
新增 App/Model/Admin/BannerBean.php
文件:
<?phpnamespace App\Model\Admin;/**
* Class BannerBean
* Create With Automatic Generator
* @property int bannerId |
* @property string bannerImg | banner图片
* @property string bannerUrl | 跳转地址
* @property int state | 状态0隐藏 1正常
*/class BannerBean extends \EasySwoole\Spl\SplBean{
protected $bannerId;
protected $bannerImg;
protected $bannerUrl;
protected $bannerName;
protected $bannerDescription;
protected $state;
public function setBannerId($bannerId)
{
$this->bannerId = $bannerId;
}
public function getBannerId()
{
return $this->bannerId;
}
public function setBannerImg($bannerImg)
{
$this->bannerImg = $bannerImg;
}
public function getBannerImg()
{
return $this->bannerImg;
}
public function setBannerUrl($bannerUrl)
{
$this->bannerUrl = $bannerUrl;
}
public function getBannerUrl()
{
return $this->bannerUrl;
}
public function setState($state)
{
$this->state = $state;
}
public function getState()
{
return $this->state;
}
/**
* @return mixed
*/
public function getBannerName()
{
return $this->bannerName;
}
/**
* @param mixed $bannerName
*/
public function setBannerName($bannerName): void {
$this->bannerName = $bannerName;
}
/**
* @return mixed
*/
public function getBannerDescription()
{
return $this->bannerDescription;
}
/**
* @param mixed $bannerDescription
*/
public function setBannerDescription($bannerDescription): void {
$this->bannerDescription = $bannerDescription;
}}
复制
新增model文件
新增 App/Model/Admin/BannerModel.php
文件:
<?phpnamespace App\Model\Admin;/**
* Class BannerModel
* Create With Automatic Generator
*/class BannerModel extends \App\Model\BaseModel{
protected $table = 'banner_list';
protected $primaryKey = 'bannerId';
/**
* @getAll
* @keyword bannerUrl
* @param int page 1
* @param string keyword
* @param int pageSize 10
* @return array[total,list]
*/
public function getAll(int $page = 1, string $keyword = null, int $pageSize = 10): array
{
if (!empty($keyword)) {
$this->getDbConnection()->where('bannerUrl', '%' . $keyword . '%', 'like');
}
$list = $this->getDbConnection()
->withTotalCount()
->orderBy($this->primaryKey, 'DESC')
->get($this->table, [$pageSize * ($page - 1), $pageSize]);
$total = $this->getDbConnection()->getTotalCount();
return ['total' => $total, 'list' => $list];
}
/**
* getAllByState
* @param int $page
* @param int|null $state
* @param string|null $keyword
* @param int $pageSize
* @return array
* @throws \EasySwoole\Mysqli\Exceptions\ConnectFail
* @throws \EasySwoole\Mysqli\Exceptions\Option
* @throws \EasySwoole\Mysqli\Exceptions\OrderByFail
* @throws \EasySwoole\Mysqli\Exceptions\PrepareQueryFail
* @author Tioncico
* Time: 15:13
*/
public function getAllByState(int $page = 1, ?int $state = null, string $keyword = null, int $pageSize = 10): array
{
if (!empty($keyword)) {
$this->getDbConnection()->where('bannerUrl', '%' . $keyword . '%', 'like');
}
if ($state!==null) {
$this->getDbConnection()->where('state', $state);
}
$list = $this->getDbConnection()
->withTotalCount()
->orderBy($this->primaryKey, 'DESC')
->get($this->table, [$pageSize * ($page - 1), $pageSize]);
$total = $this->getDbConnection()->getTotalCount();
return ['total' => $total, 'list' => $list];
}
/**
* 默认根据主键(bannerId)进行搜索
* @getOne
* @param BannerBean $bean
* @return BannerBean
*/
public function getOne(BannerBean $bean): ?BannerBean {
$info = $this->getDbConnection()->where($this->primaryKey, $bean->getBannerId())->getOne($this->table);
if (empty($info)) {
return null;
}
return new BannerBean($info);
}
/**
* 默认根据bean数据进行插入数据
* @add
* @param BannerBean $bean
* @return bool
*/
public function add(BannerBean $bean): bool {
return $this->getDbConnection()->insert($this->table, $bean->toArray(null, $bean::FILTER_NOT_NULL));
}
/**
* 默认根据主键(bannerId)进行删除
* @delete
* @param BannerBean $bean
* @return bool
*/
public function delete(BannerBean $bean): bool {
return $this->getDbConnection()->where($this->primaryKey, $bean->getBannerId())->delete($this->table);
}
/**
* 默认根据主键(bannerId)进行更新
* @delete
* @param BannerBean $bean
* @param array $data
* @return bool
*/
public function update(BannerBean $bean, array $data): bool {
if (empty($data)){
return false;
}
return $this->getDbConnection()->where($this->primaryKey, $bean->getBannerId())->update($this->table, $data);
}}
复制
控制器定义
全局基础控制器定义
新增 App/Httpcontroller/Api/ApiBase.php
文件:
<?phpnamespace App\HttpController\Api;use EasySwoole\EasySwoole\Core;use EasySwoole\EasySwoole\ServerManager;use EasySwoole\EasySwoole\Trigger;use EasySwoole\Http\AbstractInterface\Controller;use EasySwoole\Http\Message\Status;use EasySwoole\Validate\Validate;abstract class ApiBase extends Controller{
function index()
{
// TODO: Implement index() method.
$this->actionNotFound('index');
}
protected function actionNotFound(?string $action): void {
$this->writeJson(Status::CODE_NOT_FOUND);
}
function onRequest(?string $action): ?bool {
if (!parent::onRequest($action)) {
return false;
};
/*
* 各个action的参数校验
*/
$v = $this->getValidateRule($action);
if ($v && !$this->validate($v)) {
$this->writeJson(Status::CODE_BAD_REQUEST, ['errorCode' => 1, 'data' => []], $v->getError()->__toString());
return false;
}
return true;
}
abstract protected function getValidateRule(?string $action): ?Validate;
protected function onException(\Throwable $throwable): void {
Trigger::getInstance()->throwable($throwable);
$this->writeJson(Status::CODE_INTERNAL_SERVER_ERROR, null, $throwable->getMessage() . " at file {$throwable->getFile()} line {$throwable->getLine()}");
}
/**
* 获取用户的get/post的一个值,可设定默认值
* input
* @param $key
* @param null $default
* @return array|mixed|null
* @author Tioncico
* Time: 17:27
*/
protected function input($key, $default = null)
{
$value = $this->request()->getRequestParam($key);
return $value ?? $default;
}
/**
* 获取用户的真实IP
* @param string $headerName 代理服务器传递的标头名称
* @return string
*/
protected function clientRealIP($headerName = 'x-real-ip')
{
$server = ServerManager::getInstance()->getSwooleServer();
$client = $server->getClientInfo($this->request()->getSwooleRequest()->fd);
$clientAddress = $client['remote_ip'];
$xri = $this->request()->getHeader($headerName);
$xff = $this->request()->getHeader('x-forwarded-for');
if ($clientAddress === '127.0.0.1') {
if (!empty($xri)) { // 如果有xri 则判定为前端有NGINX等代理
$clientAddress = $xri[0];
} elseif (!empty($xff)) { // 如果不存在xri 则继续判断xff
$list = explode(',', $xff[0]);
if (isset($list[0])) $clientAddress = $list[0];
}
}
return $clientAddress;
}}
复制
新增基础控制器,里面的方法用于获取用户ip,以及获取api参数
公共基础控制器定义
新增 App/Httpcontroller/Api/Common/CommonBase.php
文件:
<?phpnamespace App\HttpController\Api\Common;use App\HttpController\Api\ApiBase;use EasySwoole\Validate\Validate;class CommonBase extends ApiBase{
function onRequest(?string $action): ?bool {
if (parent::onRequest($action)) {
return true;
}
return false;
}
protected function getValidateRule(?string $action): ?Validate {
return null;
// TODO: Implement getValidateRule() method.
}}
复制
公共控制器
公共控制器放不需要登陆即可查看的控制器,例如banner列表查看:
新增 App/HttpController/Api/Common/Banner.php
文件:
<?phpnamespace App\HttpController\Api\Common;use App\Model\Admin\BannerBean;use App\Model\Admin\BannerModel;use EasySwoole\Http\Message\Status;use EasySwoole\MysqliPool\Mysql;use EasySwoole\Validate\Validate;class Banner extends CommonBase{
public function getOne()
{
$db = Mysql::defer('mysql');
$param = $this->request()->getRequestParam();
$model = new BannerModel($db);
$bean = $model->getOne(new BannerBean(['bannerId' => $param['bannerId']]));
if ($bean) {
$this->writeJson(Status::CODE_OK, $bean, "success");
} else {
$this->writeJson(Status::CODE_BAD_REQUEST, [], 'fail');
}
}
public function getAll()
{
$db = Mysql::defer('mysql');
$param = $this->request()->getRequestParam();
$page = $param['page']??1;
$limit = $param['limit']??20;
$model = new BannerModel($db);
$data = $model->getAllByState($page, 1,$param['keyword']??null, $limit);
$this->writeJson(Status::CODE_OK, $data, 'success');
}
function getValidateRule(?string $action): ?Validate {
$validate = null;
switch ($action) {
case 'getAll':
$validate = new Validate();
$validate->addColumn('page', '页数')->optional();
$validate->addColumn('limit', 'limit')->optional();
$validate->addColumn('keyword', '关键词')->optional();
break;
case 'getOne':
$validate = new Validate();
$validate->addColumn('bannerId', '主键id')->required()->lengthMax(11);
break;
}
return $validate;
}}
复制
测试链接:127.0.0.1:9501/api/common/banner/getAll 需要有数据才能看到具体输出
管理员基础控制器定义
新增 App/HttpController/Api/Admin/AdminBase.php
文件:
<?phpnamespace App\HttpController\Api\Admin;use App\HttpController\Api\ApiBase;use App\Model\Admin\AdminBean;use App\Model\Admin\AdminModel;use EasySwoole\Http\Message\Status;use EasySwoole\MysqliPool\Mysql;use EasySwoole\Validate\Validate;class AdminBase extends ApiBase{
protected $who;
//session的cookie头
protected $sessionKey = 'adminSession';
//白名单
protected $whiteList = ['login'];
function onRequest(?string $action): ?bool {
if (parent::onRequest($action)) {
//白名单判断
if (in_array($action, $this->whiteList)) {
return true;
}
//获取登入信息
if (!$this->getWho()) {
$this->writeJson(Status::CODE_UNAUTHORIZED, '', '登入已过期');
return false;
}
return true;
}
return false;
}
function getWho(): ?AdminBean {
if ($this->who instanceof AdminBean) {
return $this->who;
}
$sessionKey = $this->request()->getRequestParam($this->sessionKey);
if (empty($sessionKey)) {
$sessionKey = $this->request()->getCookieParams($this->sessionKey);
}
if (empty($sessionKey)) {
return null;
}
$db = Mysql::defer('mysql');
$adminModel = new AdminModel($db);
$this->who = $adminModel->getOneBySession($sessionKey);
return $this->who;
}
protected function getValidateRule(?string $action): ?Validate {
return null;
// TODO: Implement getValidateRule() method.
}}
复制
管理员登录控制器
新增 App/HttpController/Api/Admin/Auth.php
文件:
<?phpnamespace App\HttpController\Api\Admin;use App\Model\Admin\AdminBean;use App\Model\Admin\AdminModel;use EasySwoole\Http\Message\Status;use EasySwoole\MysqliPool\Mysql;use EasySwoole\Spl\SplBean;use EasySwoole\Validate\Validate;class Auth extends AdminBase{
protected $whiteList=['login'];
function login()
{
$param = $this->request()->getRequestParam();
$db = Mysql::defer('mysql');
$model = new AdminModel($db);
$bean = new AdminBean();
$bean->setAdminAccount($param['account']);
$bean->setAdminPassword(md5($param['password']));
if ($rs = $model->login($bean)) {
$bean->restore(['adminId' => $rs->getAdminId()]);
$sessionHash = md5(time() . $rs->getAdminId());
$model->update($bean, [
'adminLastLoginTime' => time(),
'adminLastLoginIp' => $this->clientRealIP(),
'adminSession' => $sessionHash
]);
$rs = $rs->toArray(null, SplBean::FILTER_NOT_NULL);
unset($rs['adminPassword']);
$rs['adminSession'] = $sessionHash;
$this->response()->setCookie('adminSession', $sessionHash, time() + 3600, '/');
$this->writeJson(Status::CODE_OK, $rs);
} else {
$this->writeJson(Status::CODE_BAD_REQUEST, '', '密码错误');
}
}
function logout()
{
$sessionKey = $this->request()->getRequestParam($this->sessionKey);
if (empty($sessionKey)) {
$sessionKey = $this->request()->getCookieParams('adminSession');
}
if (empty($sessionKey)) {
$this->writeJson(Status::CODE_UNAUTHORIZED, '', '尚未登入');
return false;
}
$db = Mysql::defer('mysql');
$adminModel = new AdminModel($db);
$result = $adminModel->logout($this->getWho());
if ($result) {
$this->writeJson(Status::CODE_OK, '', "登出成功");
} else {
$this->writeJson(Status::CODE_UNAUTHORIZED, '', 'fail');
}
}
function getInfo()
{
$this->writeJson(200, $this->getWho(), 'success');
}
protected function getValidateRule(?string $action): ?Validate {
$validate = null;
switch ($action) {
case 'login':
$validate = new Validate();
$validate->addColumn('account')->required()->lengthMax(32);
$validate->addColumn('password')->required()->lengthMax(32);
break;
case 'logout':
break;
}
return $validate;
}}
复制
请求127.0.0.1:9501/Api/Admin/Auth/login?account=xsk&password=123456 即可返回: { "code": 200, "result": { "adminId": 1, "adminName": "仙士可", "adminAccount": "xsk", "adminSession": "d45de0cd6dd91122db4bd7e976c7deb8", "adminLastLoginTime": 1566279458, "adminLastLoginIp": "192.168.159.1" }, "msg": null }
管理员用户管理控制器
新增 App/httpController/Api/Admin/User.php
文件:
<?phpnamespace App\HttpController\Api\Admin;use App\Model\User\UserBean;use App\Model\User\UserModel;use EasySwoole\Http\Message\Status;use EasySwoole\MysqliPool\Mysql;use EasySwoole\Validate\Validate;class User extends AdminBase{
function getAll()
{
$db = Mysql::defer('mysql');
$page = (int)$this->input('page', 1);
$limit = (int)$this->input('limit', 20);
$model = new UserModel($db);
$data = $model->getAll($page, $this->input('keyword'), $limit);
$this->writeJson(Status::CODE_OK, $data, 'success');
}
function getOne()
{
$db = Mysql::defer('mysql');
$param = $this->request()->getRequestParam();
$data['userId'] = intval($param['userId']);
$model = new UserModel($db);
$rs = $model->getOne(new UserBean($data));
if ($rs) {
$this->writeJson(Status::CODE_OK, $rs, "success");
} else {
$this->writeJson(Status::CODE_BAD_REQUEST, [], 'fail');
}
}
function add()
{
$db = Mysql::defer('mysql');
$param = $this->request()->getRequestParam();
$model = new UserModel($db);
$bean = new UserBean($param);
$bean->setUserPassword(md5($param['userPassword']));
$bean->setState($this->input('state',1));
$bean->setMoney(0);
$bean->setAddTime(time());
$rs = $model->add($bean);
if ($rs) {
$this->writeJson(Status::CODE_OK, $rs, "success");
} else {
$this->writeJson(Status::CODE_BAD_REQUEST, [], $db->getLastError());
}
}
function update()
{
$db = Mysql::defer('mysql');
$model = new UserModel($db);
$userInfo = $model->getOne( new UserBean(['userId' => $this->input('userId')]));
if (!$userInfo){
$this->writeJson(Status::CODE_BAD_REQUEST, [], '未找到该会员');
}
$password = $this->input('userPassword');
$updateBean = new UserBean();
$updateBean->setUserName($this->input('userName',$userInfo->getUserName()));
$updateBean->setUserPassword($password?md5($password):$userInfo->getUserPassword());
$updateBean->setState($this->input('state',$userInfo->getState()));
$updateBean->setPhone($this->input('phone',$userInfo->getPhone()));
$rs = $model->update($userInfo, $updateBean->toArray([], $updateBean::FILTER_NOT_EMPTY));
if ($rs) {
$this->writeJson(Status::CODE_OK, $rs, "success");
} else {
$this->writeJson(Status::CODE_BAD_REQUEST, [], $db->getLastError());
}
}
function delete()
{
$db = Mysql::defer('mysql');
$param = $this->request()->getRequestParam();
$model = new UserModel($db);
$bean = new UserBean(['userId' => intval($param['userId'])]);
$rs = $model->delete($bean);
if ($rs) {
$this->writeJson(Status::CODE_OK, $rs, "success");
} else {
$this->writeJson(Status::CODE_BAD_REQUEST, [], '删除失败');
}
}
function getValidateRule(?string $action): ?Validate {
$validate = null;
switch ($action) {
case 'getAll':
$validate = new Validate();
$validate->addColumn('page','页数')->optional();
$validate->addColumn('limit','limit')->optional();
$validate->addColumn('keyword','关键词')->optional();
break;
case 'getOne':
$validate = new Validate();
$validate->addColumn('userId', '会员id')->required()->lengthMax(11);
break;
case 'add':
$validate = new Validate();
$validate->addColumn('userName', '会员名')->required()->lengthMax(18);
$validate->addColumn('userAccount', '会员账号')->required()->lengthMax(32);
$validate->addColumn('userPassword', '会员密码')->required()->lengthMax(18);
$validate->addColumn('phone', '手机号')->optional()->lengthMax(18);
$validate->addColumn('state', '状态')->optional()->inArray([0,1]);
break;
case 'update':
$validate = new Validate();
$validate->addColumn('userId', '会员id')->required()->lengthMax(11);
$validate->addColumn('userName', '会员名')->optional()->lengthMax(18);
$validate->addColumn('userPassword', '会员密码')->optional()->lengthMax(18);
$validate->addColumn('phone', '手机号')->optional()->lengthMax(18);
$validate->addColumn('state', '状态')->optional()->inArray([0,1]);
break;
case 'delete':
$validate = new Validate();
$validate->addColumn('userId', '会员id')->required()->lengthMax(11);
break;
}
return $validate;
}}
复制
后台管理员登陆之后,可通过此文件的接口,去进行curd会员 请求地址为: 127.0.0.1:9501/Api/Admin/User/getAll(等方法)
普通用户基础控制器定义
新增 App/HttpController/Api/User/UserBase.php
文件:
<?phpnamespace App\HttpController\Api\User;use App\HttpController\Api\ApiBase;use App\Model\User\UserBean;use App\Model\User\UserModel;use App\Utility\Pool\MysqlPool;use App\Utility\Pool\RedisPool;use EasySwoole\Http\Message\Status;use EasySwoole\MysqliPool\Mysql;use EasySwoole\Spl\SplBean;use EasySwoole\Validate\Validate;class UserBase extends ApiBase{
protected $who;
//session的cookie头
protected $sessionKey = 'userSession';
//白名单
protected $whiteList = ['login', 'register'];
function onRequest(?string $action): ?bool {
if (parent::onRequest($action)) {
//白名单判断
if (in_array($action, $this->whiteList)) {
return true;
}
//获取登入信息
if (!$data = $this->getWho()) {
$this->writeJson(Status::CODE_UNAUTHORIZED, '', '登入已过期');
return false;
}
//刷新cookie存活
$this->response()->setCookie($this->sessionKey, $data->getUserSession(), time() + 3600, '/');
return true;
}
return false;
}
function getWho(): ?UserBean {
if ($this->who instanceof UserBean) {
return $this->who;
}
$sessionKey = $this->request()->getRequestParam($this->sessionKey);
if (empty($sessionKey)) {
$sessionKey = $this->request()->getCookieParams($this->sessionKey);
}
if (empty($sessionKey)) {
return null;
}
$db = Mysql::defer('mysql');
$userModel = new UserModel($db);
$this->who = $userModel->getOneBySession($sessionKey);
return $this->who;
}
protected function getValidateRule(?string $action): ?Validate {
return null;
// TODO: Implement getValidateRule() method.
}}
复制
普通用户登录控制器
新增 App/HttpController/Api/User/Auth.php
文件:
<?phpnamespace App\HttpController\Api\User;use App\HttpController\Api\ApiBase;use App\Model\User\UserBean;use App\Model\User\UserModel;use App\Utility\Pool\MysqlPool;use App\Utility\Pool\RedisPool;use EasySwoole\Http\Message\Status;use EasySwoole\MysqliPool\Mysql;use EasySwoole\Spl\SplBean;use EasySwoole\Validate\Validate;class UserBase extends ApiBase{
protected $who;
//session的cookie头
protected $sessionKey = 'userSession';
//白名单
protected $whiteList = ['login', 'register'];
function onRequest(?string $action): ?bool {
if (parent::onRequest($action)) {
//白名单判断
if (in_array($action, $this->whiteList)) {
return true;
}
//获取登入信息
if (!$data = $this->getWho()) {
$this->writeJson(Status::CODE_UNAUTHORIZED, '', '登入已过期');
return false;
}
//刷新cookie存活
$this->response()->setCookie($this->sessionKey, $data->getUserSession(), time() + 3600, '/');
return true;
}
return false;
}
function getWho(): ?UserBean {
if ($this->who instanceof UserBean) {
return $this->who;
}
$sessionKey = $this->request()->getRequestParam($this->sessionKey);
if (empty($sessionKey)) {
$sessionKey = $this->request()->getCookieParams($this->sessionKey);
}
if (empty($sessionKey)) {
return null;
}
$db = Mysql::defer('mysql');
$userModel = new UserModel($db);
$this->who = $userModel->getOneBySession($sessionKey);
return $this->who;
}
protected function getValidateRule(?string $action): ?Validate {
return null;
// TODO: Implement getValidateRule() method.
}}
复制
访问 127.0.0.1:9501/Api/User/Auth/login?userAccount=xsk&userPassword=123456 即可登陆成功
- 点赞
- 收藏
- 关注作者
评论(0)