Browse Source

Merge branch 'coupon_rebate' of http://120.24.33.109:11081/hyzjshwo/lanzu_api_hyperf into coupon_rebate

# Conflicts:
#	config/routes.php
master
parent
commit
bf281fafcb
  1. 5
      app/Constants/ErrorCode.php
  2. 19
      app/Constants/LogLabel.php
  3. 19
      app/Constants/SsdbKeysPrefix.php
  4. 27
      app/Controller/AdController.php
  5. 22
      app/Controller/ParamsTokenController.php
  6. 14
      app/Exception/Handler/SsdbExceptionHandler.php
  7. 35
      app/Exception/Handler/ValidationExceptionHandler.php
  8. 113
      app/Listener/ValidatorFactoryResolvedListener.php
  9. 70
      app/Model/Ad.php
  10. 20
      app/Service/AdService.php
  11. 11
      app/Service/AdServiceInterface.php
  12. 13
      app/Service/ParamsTokenServiceInterface.php
  13. 41
      app/Service/ParamsTokenSsdbService.php
  14. 1
      config/autoload/dependencies.php
  15. 1
      config/autoload/exceptions.php
  16. 1
      config/autoload/listeners.php
  17. 1
      config/autoload/middlewares.php
  18. 1
      config/routes.php

5
app/Constants/ErrorCode.php

@ -24,6 +24,11 @@ class ErrorCode extends AbstractConstants
*/
const SERVER_ERROR = 500;
/**
* @Message("Params Invalid!")
*/
const PARAMS_INVALID = 900;
/**
* @Message("Ssdb Error!")
*/

19
app/Constants/LogLabel.php

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
namespace App\Constants;
use Hyperf\Constants\AbstractConstants;
use Hyperf\Constants\Annotation\Constants;
/**
* @Constants
*/
class LogLabel extends AbstractConstants
{
/**
* @Message("Ssdb Log Label")
*/
const SSDB_LOG = 'ssdb_log';
}

19
app/Constants/SsdbKeysPrefix.php

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
namespace App\Constants;
use Hyperf\Constants\AbstractConstants;
use Hyperf\Constants\Annotation\Constants;
/**
* @Constants
*/
class SsdbKeysPrefix extends AbstractConstants
{
/**
* @Message("Params Token Key Prefix")
*/
const PARAMS_TOKEN = 'params_token_';
}

27
app/Controller/AdController.php

@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
namespace App\Controller;
use App\Service\AdServiceInterface;
use Hyperf\Di\Annotation\Inject;
/**
* 系统AD广告/宣传图控制器
* Class AdController
* @package App\Controller
*/
class AdController extends BaseController
{
/**
* @Inject
* @var AdServiceInterface
*/
protected $adService;
public function banners()
{
return $this->success($this->adService->banners());
}
}

22
app/Controller/ParamsTokenController.php

@ -1,11 +1,15 @@
<?php
namespace App\Controller;
use App\Service\ParamsTokenServiceInterface;
use Hyperf\Di\Annotation\Inject;
/**
* 参数token控制器
* Class ParamsTokenController
* @package App\Controller
*/
class ParamsTokenController extends BaseController
{
/**
@ -14,15 +18,23 @@ class ParamsTokenController extends BaseController
*/
protected $paramsTokenService;
/**
* 生成token存储对应参数数据
* @return \Psr\Http\Message\ResponseInterface
*/
public function generate()
{
$res = $this->paramsTokenService->generate($this->request->all());
return $this->success(['token' => $res]);
$token = $this->paramsTokenService->generate($this->request->all());
return $this->success(['token' => $token]);
}
/**
* 解析token获取对应参数数据
* @return \Psr\Http\Message\ResponseInterface
*/
public function analyze()
{
$res = $this->paramsTokenService->analyze($this->request->input('token'));
return $this->success($res);
$params = $this->paramsTokenService->analyze($this->request->input('token'));
return $this->success($params);
}
}

14
app/Exception/Handler/SsdbExceptionHandler.php

@ -16,18 +16,14 @@ class SsdbExceptionHandler extends ExceptionHandler
{
$this->stopPropagation();
$content = json_encode(
[
$content = json_encode([
"status" => 'error',
"code" => ErrorCode::SSDB_ERROR,
"code" => $throwable->getCode(),
"result" => [],
"message" => $throwable->getMessage() ?: ErrorCode::getMessage(ErrorCode::SSDB_ERROR)
]
);
"message" => $throwable->getMessage()
]);
return $response->withHeader('Content-Type', 'application/json')
->withStatus($throwable->status)
->withBody(new SwooleStream($content));
return $response->withHeader('Content-Type', 'application/json')->withBody(new SwooleStream($content));
}
public function isValid(Throwable $throwable): bool

35
app/Exception/Handler/ValidationExceptionHandler.php

@ -0,0 +1,35 @@
<?php
namespace App\Exception\Handler;
use App\Constants\ErrorCode;
use Hyperf\ExceptionHandler\ExceptionHandler;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\Validation\ValidationException;
use Psr\Http\Message\ResponseInterface;
use Throwable;
class ValidationExceptionHandler extends ExceptionHandler
{
public function handle(Throwable $throwable, ResponseInterface $response)
{
$this->stopPropagation();
$content = json_encode([
"status" => 'error',
"code" => ErrorCode::PARAMS_INVALID,
"result" => [],
"message" => $throwable->validator->errors()->first()
]);
return $response->withHeader('Content-Type', 'application/json')
->withStatus($throwable->status)
->withBody(new SwooleStream($content));
}
public function isValid(Throwable $throwable): bool
{
return $throwable instanceof ValidationException;
}
}

113
app/Listener/ValidatorFactoryResolvedListener.php

@ -0,0 +1,113 @@
<?php
namespace App\Listener;
use Hyperf\DbConnection\Db;
use Hyperf\Event\Contract\ListenerInterface;
use Hyperf\Validation\Contract\ValidatorFactoryInterface;
use Hyperf\Validation\Event\ValidatorFactoryResolved;
class ValidatorFactoryResolvedListener implements ListenerInterface
{
public function listen(): array
{
return [
ValidatorFactoryResolved::class,
];
}
public function process(object $event)
{
/**
* @var ValidatorFactoryInterface $validatorFactory
*/
$validatorFactory = $event->validatorFactory;
// 注册了 nonempty 验证器规则
$validatorFactory->extend('nonempty', function ($attribute, $value, $parameters, $validator) {
return isset($value)
&& $value
&& !empty($value)
&& !is_null($value)
&& $value != 'undefined'
&& $value != 'unknown'
&& $value != 'null'
&& $value != 'false';
});
// 注册了 strlen 验证器规则,参数是min,max,最小长度和最大长度
$validatorFactory->extend('strlen', function ($attribute, $value, $parameters, $validator) {
return mb_strlen($value)>=$parameters[0] && mb_strlen($value)<=$parameters[1];
});
$validatorFactory->replacer('strlen', function ($message, $attribute, $rule, $parameters) {
$message = str_replace(':min', $parameters[0], $message);
$message = str_replace(':max', $parameters[1], $message);
return $message;
});
// 注册了 base64 验证器规则
$validatorFactory->extend('base64', function ($attribute, $value, $parameters, $validator) {
preg_match('/^(data:\s*image\/(\w+);base64,)/', $value, $result);
if (empty($result)) {
return false;
}
if (
in_array('image', $parameters)
&& !in_array($result[2], ['jpg','jpeg','png','gif','svg','bmp'])
) {
return false;
}
return true;
});
// 注册了 ext_not_in 验证器规则
$validatorFactory->extend('ext_not_in', function ($attribute, $value, $parameters, $validator) {
if (empty($parameters)) {
$parameters = ['', 'php', 'exe', 'sql', 'sh', 'bat', 'py', 'go', 'c', 'cpp'];
}
return !in_array($value->getExtension(), $parameters);
});
// 注册了 exists_enable 验证器规则,参数是table,field,where1,where2...
$validatorFactory->extend('exists_enable', function ($attribute, $value, $parameters, $validator) {
// 查询
$builder = Db::table($parameters[0])->where($parameters[1], '=', $value);
$whereArr = array_slice($parameters,2);
if (!empty($whereArr)) {
foreach ($whereArr as $key => $where) {
$builder->whereRaw($where);
}
}
return $builder->exists();
});
// 注册了 not_equal 验证器规则,参数是anotherfield,table,primary_field,foreign_field
// 要排除对比的字段请求参数名、表名、本参数对应表id、比较字段
$validatorFactory->extend('not_equal', function ($attribute, $value, $parameters, $validator) {
// 获取比较字段参数值
$foreignValue = $validator->getData()[$parameters[0]];
// 查询
$builder = Db::table($parameters[1])
->where($parameters[2], '=', $value)
->where($parameters[3], '!=', $foreignValue)
;
return $builder->exists();
});
}
}

70
app/Model/Ad.php

@ -0,0 +1,70 @@
<?php
declare (strict_types=1);
namespace App\Model;
use Hyperf\DbConnection\Model\Model;
/**
*/
class Ad extends Model
{
/**
* 跳转类型及说明
*/
const ITEM = [
1 => 'page',
2 => 'webview',
3 => 'applet',
];
/**
* 类型 1 = 首页banners
*/
const TYPE_BANNER = 1;
/**
* 启用状态
*/
const STATUS_YES = 1;
const STATUS_NO = 2;
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'ims_cjdc_ad';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [];
protected $appends = [
'item_text',
'redirect_url'
];
/**
* 获取跳转说明
*/
public function getItemTextAttribute()
{
return self::ITEM[$this->item];
}
/**
* 获取跳转连接
*/
public function getRedirectUrlAttribute()
{
return $this->src ?: $this->src2;
}
}

20
app/Service/AdService.php

@ -0,0 +1,20 @@
<?php
namespace App\Service;
use App\Model\Ad;
class AdService implements AdServiceInterface
{
/**
* 跳转类型、跳转连接、标题、图片地址
*/
public function banners()
{
return Ad::query()->select(['id','title','logo','item','src','src2'])
->where([
'type' => Ad::TYPE_BANNER,
'status' => Ad::STATUS_YES
])->get();
}
}

11
app/Service/AdServiceInterface.php

@ -0,0 +1,11 @@
<?php
namespace App\Service;
interface AdServiceInterface
{
/**
* 获取首页banners
*/
public function banners();
}

13
app/Service/ParamsTokenServiceInterface.php

@ -1,11 +1,20 @@
<?php
namespace App\Service;
interface ParamsTokenServiceInterface
{
/**
* 生成并存储token
* @param $params
* @return mixed
*/
public function generate($params);
/**
* 通过token解析返回参数
* @param $token
* @return mixed
*/
public function analyze($token);
}

41
app/Service/ParamsTokenSsdbService.php

@ -3,14 +3,27 @@
namespace App\Service;
use App\Constants\ErrorCode;
use App\Constants\LogLabel;
use App\Constants\SsdbKeysPrefix;
use App\Exception\SsdbException;
use Hyperf\Utils\ApplicationContext;
use App\TaskWorker\SSDBTask;
use Hyperf\Di\Annotation\Inject;
use App\Commons\Log;
class ParamsTokenSsdbService implements ParamsTokenServiceInterface
{
const HASH_PREFIX = 'params_token_';
/**
* @Inject
* @var Log
*/
protected $log;
/**
* 生成token并存储对应数据
* @param $params
*/
public function generate($params)
{
$token = md5(json_encode($params));
@ -23,23 +36,45 @@ class ParamsTokenSsdbService implements ParamsTokenServiceInterface
$kvs[] = $value;
}
if(false === $ssdb->exec('multi_hset', self::HASH_PREFIX.$token, $kvs)) {
if(false === $ssdb->exec('multi_hset', SsdbKeysPrefix::PARAMS_TOKEN.$token, $kvs)) {
$this->log->event(
LogLabel::SSDB_LOG,
['method' => 'multi_hset', 'key' => SsdbKeysPrefix::PARAMS_TOKEN.$token, 'kvs' => $kvs]
);
throw new SsdbException(ErrorCode::SSDB_ERROR, 'token生成失败');
}
return $token;
}
/**
* 解析token获取对应数据参数
* @param $token
*/
public function analyze($token)
{
$ssdb = ApplicationContext::getContainer()->get(SSDBTask::class);
$params = $ssdb->exec('hgetall', self::HASH_PREFIX.$token);
$params = $ssdb->exec('hgetall', SsdbKeysPrefix::PARAMS_TOKEN.$token);
if (false === $params) {
$this->log->event(
LogLabel::SSDB_LOG,
['method' => 'hgetall', 'key' => SsdbKeysPrefix::PARAMS_TOKEN.$token, 'params' => $params]
);
throw new SsdbException(ErrorCode::SSDB_ERROR, 'token解析失败');
}
if (empty($params)) {
$this->log->event(
LogLabel::SSDB_LOG,
['method' => 'hgetall', 'key' => SsdbKeysPrefix::PARAMS_TOKEN.$token, 'params' => $params]
);
throw new SsdbException(ErrorCode::SSDB_ERROR, 'token不存在');
}

1
config/autoload/dependencies.php

@ -13,6 +13,7 @@ return [
\App\Service\ServiceEvaluateServiceInterface::class => \App\Service\ServiceEvaluateService::class,
\App\Service\AttachmentServiceInterface::class => \App\Service\AttachmentService::class,
\App\Service\ParamsTokenServiceInterface::class => \App\Service\ParamsTokenSsdbService::class,
\App\Service\AdServiceInterface::class => \App\Service\AdService::class,
\App\Commons\Log::class => \App\Commons\Log::class,
\App\CouponRebate\CouponRebateInterface::class => \App\CouponRebate\CouponRebate::class,
];

1
config/autoload/exceptions.php

@ -14,6 +14,7 @@ return [
'http' => [
Hyperf\HttpServer\Exception\Handler\HttpExceptionHandler::class,
App\Exception\Handler\AppExceptionHandler::class,
App\Exception\Handler\ValidationExceptionHandler::class,
App\Exception\Handler\SsdbExceptionHandler::class,
],
],

1
config/autoload/listeners.php

@ -10,4 +10,5 @@ declare(strict_types=1);
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
return [
\App\Listener\ValidatorFactoryResolvedListener::class,
];

1
config/autoload/middlewares.php

@ -12,6 +12,7 @@ declare(strict_types=1);
return [
'http' => [
\App\Middleware\Auth\ApiMiddleware::class,
\Hyperf\Validation\Middleware\ValidationMiddleware::class,
\App\Middleware\CorsMiddleware::class,
],
];

1
config/routes.php

@ -25,5 +25,6 @@ Router::addGroup('/v1/',function (){
Router::get('test/index1', 'App\Controller\TestController@index1');
Router::post('ParamsToken/generate', 'App\Controller\ParamsTokenController@generate');
Router::post('ParamsToken/analyze', 'App\Controller\ParamsTokenController@analyze');
Router::post('Ad/banners', 'App\Controller\AdController@banners');
Router::post('CouponRebate/isCouponRebate', 'App\Controller\CouponRebateController@isCouponRebate');
});
Loading…
Cancel
Save