From 005d066087e795e84504fe6d602adb10bcd287db Mon Sep 17 00:00:00 2001 From: liangyuyan <1103300295@qq.com> Date: Fri, 7 Aug 2020 11:35:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0SSDB=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BC=98=E6=83=A0=E5=88=B8=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Admin/Controllers/CouponController.php | 99 +++ .../Controllers/LanzuMmInfoController.php | 6 +- .../Controllers/LanzuMmWithdrawController.php | 6 +- app/Admin/Extensions/CouponTieEdit.php | 34 + app/Admin/Forms/CouponTieForm.php | 49 ++ app/Admin/Repositories/Coupon.php | 45 ++ app/Admin/routes.php | 4 +- app/Libs/SSDB.php | 618 ++++++++++++++++++ app/Libs/SsdbClient.php | 0 composer.json | 3 +- 10 files changed, 857 insertions(+), 7 deletions(-) create mode 100644 app/Admin/Controllers/CouponController.php create mode 100644 app/Admin/Extensions/CouponTieEdit.php create mode 100644 app/Admin/Forms/CouponTieForm.php create mode 100644 app/Admin/Repositories/Coupon.php create mode 100644 app/Libs/SSDB.php create mode 100644 app/Libs/SsdbClient.php diff --git a/app/Admin/Controllers/CouponController.php b/app/Admin/Controllers/CouponController.php new file mode 100644 index 0000000..23c9dde --- /dev/null +++ b/app/Admin/Controllers/CouponController.php @@ -0,0 +1,99 @@ +activity->sortable(); + $grid->forward->sortable(); + $grid->repay->sortable(); + }); + } + + public function CouponList(Content $content){ + $grid = Grid::make(new Coupon(), function (Grid $grid) { + $grid->id; + $grid->activity->sortable(); + $grid->forward->sortable(); + $grid->repay->sortable(); + + $grid->disableViewButton(); + $grid->disableEditButton(); + $grid->disableDeleteButton(); + + $grid->actions(new CouponTieEdit()); + }); + return $content + ->title('活动绑定') + ->body(new Card($grid)); + } + + + public function CouponTieForm(Content $content){ + + return $content + ->title('活动绑定') + ->body(new Card(new CouponTieForm()), function(Form $form){ + $form->submitted(function (Form $form) { + // 获取用户提交参数 + $activity = $form->activity; + + // 中断后续逻辑 + return $this->error('服务器出错了~'); + }); + }); + } + + /** + * Make a show builder. + * + * @param mixed $id + * + * @return Show + */ + // protected function detail($id) + // { + // return Show::make($id, new ImsCjdcMarket(), function (Show $show) { + + // }); + // } + + // /** + // * Make a form builder. + // * + // * @return Form + // */ + protected function form(Content $content) + { + return $content + ->title('活动绑定') + ->body(new Card(new CouponTieForm())); + } + + // /** + // * 服务商信息 + // * @return \Illuminate\Http\JsonResponse + // */ + // protected function getMpInfo() + // { + + // } +} diff --git a/app/Admin/Controllers/LanzuMmInfoController.php b/app/Admin/Controllers/LanzuMmInfoController.php index 08577ad..edc3558 100644 --- a/app/Admin/Controllers/LanzuMmInfoController.php +++ b/app/Admin/Controllers/LanzuMmInfoController.php @@ -7,6 +7,7 @@ use App\Models\AdminUsers; use \App\Models\AdminRoles; use \App\Models\AdminRoleUsers; use App\Models\ImsCjdcMarket; +use App\Models\LanzuMpInfo; use App\Models\LanzuMpInfo as mpInfo; use Dcat\Admin\Form; use Dcat\Admin\Grid; @@ -27,7 +28,6 @@ class LanzuMmInfoController extends AdminController */ protected function grid() { - return Grid::make(new LanzuMmInfo(), function (Grid $grid) { $user = Admin::user(); @@ -163,7 +163,9 @@ class LanzuMmInfoController extends AdminController */ protected function getMarket() { - $markets = ImsCjdcMarket::all(); + $user = Admin::user(); + $mp = LanzuMpInfo::where('admin_user_id',$user->id)->first(); + $markets = ImsCjdcMarket::where('mp_id',$mp->id)->get(); $data = []; foreach ($markets as $market){ $item = []; diff --git a/app/Admin/Controllers/LanzuMmWithdrawController.php b/app/Admin/Controllers/LanzuMmWithdrawController.php index c226941..c839338 100644 --- a/app/Admin/Controllers/LanzuMmWithdrawController.php +++ b/app/Admin/Controllers/LanzuMmWithdrawController.php @@ -19,12 +19,10 @@ class LanzuMmWithdrawController extends AdminController { /** * Make a grid builder. - * * @return Grid */ protected function grid() { - $user = Admin::user(); $mp_info = mpInfo::where('admin_user_id',$user->id)->first(); $mk = ImsCjdcMarket::where('mp_id',$mp_info->id)->get()->pluck('id'); @@ -45,7 +43,9 @@ class LanzuMmWithdrawController extends AdminController $grid->money; $grid->status('提现状态')->using([-1=>'拒绝',0=>'审核中',1=>'通过']) ->label([-1=>'danger',0=>'default',1=>'success']); - $grid->created_at('提现时间'); + $grid->created_at('提现时间')->display(function ($time){ + return date('Y-m-d H:i',$time); + }); $grid->filter(function (Grid\Filter $filter) { $filter->equal('id'); diff --git a/app/Admin/Extensions/CouponTieEdit.php b/app/Admin/Extensions/CouponTieEdit.php new file mode 100644 index 0000000..029834a --- /dev/null +++ b/app/Admin/Extensions/CouponTieEdit.php @@ -0,0 +1,34 @@ +setHtmlAttribute(['class' => 'coupon-edit-row']); + return parent::html(); + } + +} \ No newline at end of file diff --git a/app/Admin/Forms/CouponTieForm.php b/app/Admin/Forms/CouponTieForm.php new file mode 100644 index 0000000..c4b3242 --- /dev/null +++ b/app/Admin/Forms/CouponTieForm.php @@ -0,0 +1,49 @@ +error('Your error message.'); + + return $this->success('Processed successfully.', '/'); + } + + /** + * Build a form here. + */ + public function form() + { + $this->text('activity')->required(); + $this->text('name')->required(); + $this->text('repay')->required(); + } + + /** + * The data of the form. + * + * @return array + */ + public function default() + { + return [ + 'activity' => '0', + 'forward' => '', + 'repay' => '', + ]; + } +} diff --git a/app/Admin/Repositories/Coupon.php b/app/Admin/Repositories/Coupon.php new file mode 100644 index 0000000..dbdb9b0 --- /dev/null +++ b/app/Admin/Repositories/Coupon.php @@ -0,0 +1,45 @@ +auth(env('SSDB_AUTH')); + }catch(\Exception $e){ + dd($e); + } + + $activity = $ssdb->get('coupon_rebate_activity'); + $forward = $ssdb->hgetall('coupon_rebate_forward_'.$activity); + $forward = is_array($forward) ? implode(' , ',$forward) : $forward ; + $repay = $ssdb->get('coupon_rebate_repay_'.$activity); + + return $model->makePaginator( + 1, + [ + [ + 'id'=>1, + 'activity'=>$activity, + 'forward'=>$forward, + 'repay' => $repay + ], + ], + ); + } + +} \ No newline at end of file diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 6b72497..15d46d5 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -23,8 +23,10 @@ Route::group([ $router->any('/api/getMarket', 'LanzuMmInfoController@getMarket'); $router->any('/api/getMpInfo', 'ImsCjdcMarketController@getMpInfo'); - $router->get('/mp_form', 'LanzuMpWithdrawController@mpForm'); + $router->get('/coupon/TieForm', 'CouponController@CouponTieForm'); + $router->get('/coupon', 'CouponController@CouponList'); + }); diff --git a/app/Libs/SSDB.php b/app/Libs/SSDB.php new file mode 100644 index 0000000..1a1dc12 --- /dev/null +++ b/app/Libs/SSDB.php @@ -0,0 +1,618 @@ +easy(); + } +} + +class SSDB_Response +{ + public $cmd; + public $code; + public $data = null; + public $message; + + function __construct($code='ok', $data_or_message=null){ + $this->code = $code; + if($code == 'ok'){ + $this->data = $data_or_message; + }else{ + $this->message = $data_or_message; + } + } + + function __toString(){ + if($this->code == 'ok'){ + $s = $this->data === null? '' : json_encode($this->data); + }else{ + $s = $this->message; + } + return sprintf('%-13s %12s %s', $this->cmd, $this->code, $s); + } + + function ok(){ + return $this->code == 'ok'; + } + + function not_found(){ + return $this->code == 'not_found'; + } +} + +// Depricated, use SimpleSSDB instead! +class SSDB +{ + private $debug = false; + public $sock = null; + private $_closed = false; + private $recv_buf = ''; + private $_easy = false; + public $last_resp = null; + + function __construct($host, $port, $timeout_ms=2000){ + $timeout_f = (float)$timeout_ms/1000; + $this->sock = @stream_socket_client("[$host]:$port", $errno, $errstr, $timeout_f); + if(!$this->sock){ + throw new SSDBException("$errno: $errstr"); + } + $timeout_sec = intval($timeout_ms/1000); + $timeout_usec = ($timeout_ms - $timeout_sec * 1000) * 1000; + @stream_set_timeout($this->sock, $timeout_sec, $timeout_usec); + if(function_exists('stream_set_chunk_size')){ + @stream_set_chunk_size($this->sock, 1024 * 1024); + } + } + + function set_timeout($timeout_ms){ + $timeout_sec = intval($timeout_ms/1000); + $timeout_usec = ($timeout_ms - $timeout_sec * 1000) * 1000; + @stream_set_timeout($this->sock, $timeout_sec, $timeout_usec); + } + + /** + * After this method invoked with yesno=true, all requesting methods + * will not return a SSDB_Response object. + * And some certain methods like get/zget will return false + * when response is not ok(not_found, etc) + */ + function easy(){ + $this->_easy = true; + } + + function close(){ + if(!$this->_closed){ + @fclose($this->sock); + $this->_closed = true; + $this->sock = null; + } + } + + function closed(){ + return $this->_closed; + } + + private $batch_mode = false; + private $batch_cmds = array(); + + function batch(){ + $this->batch_mode = true; + $this->batch_cmds = array(); + return $this; + } + + function multi(){ + return $this->batch(); + } + + function exec(){ + $ret = array(); + foreach($this->batch_cmds as $op){ + list($cmd, $params) = $op; + $this->send_req($cmd, $params); + } + foreach($this->batch_cmds as $op){ + list($cmd, $params) = $op; + $resp = $this->recv_resp($cmd, $params); + $resp = $this->check_easy_resp($cmd, $resp); + $ret[] = $resp; + } + $this->batch_mode = false; + $this->batch_cmds = array(); + return $ret; + } + + function request(){ + $args = func_get_args(); + $cmd = array_shift($args); + return $this->__call($cmd, $args); + } + + private $async_auth_password = null; + + function auth($password){ + $this->async_auth_password = $password; + return null; + } + + function __call($cmd, $params=array()){ + $cmd = strtolower($cmd); + if($this->async_auth_password !== null){ + $pass = $this->async_auth_password; + $this->async_auth_password = null; + $auth = $this->__call('auth', array($pass)); + if($auth !== true){ + throw new Exception("Authentication failed"); + } + } + + if($this->batch_mode){ + $this->batch_cmds[] = array($cmd, $params); + return $this; + } + + try{ + if($this->send_req($cmd, $params) === false){ + $resp = new SSDB_Response('error', 'send error'); + }else{ + $resp = $this->recv_resp($cmd, $params); + } + }catch(SSDBException $e){ + if($this->_easy){ + throw $e; + }else{ + $resp = new SSDB_Response('error', $e->getMessage()); + } + } + + if($resp->code == 'noauth'){ + $msg = $resp->message; + throw new Exception($msg); + } + + $resp = $this->check_easy_resp($cmd, $resp); + return $resp; + } + + private function check_easy_resp($cmd, $resp){ + $this->last_resp = $resp; + if($this->_easy){ + if($resp->not_found()){ + return NULL; + }else if(!$resp->ok() && !is_array($resp->data)){ + return false; + }else{ + return $resp->data; + } + }else{ + $resp->cmd = $cmd; + return $resp; + } + } + + function multi_set($kvs=array()){ + $args = array(); + foreach($kvs as $k=>$v){ + $args[] = $k; + $args[] = $v; + } + return $this->__call(__FUNCTION__, $args); + } + + function multi_hset($name, $kvs=array()){ + $args = array($name); + foreach($kvs as $k=>$v){ + $args[] = $k; + $args[] = $v; + } + return $this->__call(__FUNCTION__, $args); + } + + function multi_zset($name, $kvs=array()){ + $args = array($name); + foreach($kvs as $k=>$v){ + $args[] = $k; + $args[] = $v; + } + return $this->__call(__FUNCTION__, $args); + } + + function incr($key, $val=1){ + $args = func_get_args(); + return $this->__call(__FUNCTION__, $args); + } + + function decr($key, $val=1){ + $args = func_get_args(); + return $this->__call(__FUNCTION__, $args); + } + + function zincr($name, $key, $score=1){ + $args = func_get_args(); + return $this->__call(__FUNCTION__, $args); + } + + function zdecr($name, $key, $score=1){ + $args = func_get_args(); + return $this->__call(__FUNCTION__, $args); + } + + function zadd($key, $score, $value){ + $args = array($key, $value, $score); + return $this->__call('zset', $args); + } + + function zRevRank($name, $key){ + $args = func_get_args(); + return $this->__call("zrrank", $args); + } + + function zRevRange($name, $offset, $limit){ + $args = func_get_args(); + return $this->__call("zrrange", $args); + } + + function hincr($name, $key, $val=1){ + $args = func_get_args(); + return $this->__call(__FUNCTION__, $args); + } + + function hdecr($name, $key, $val=1){ + $args = func_get_args(); + return $this->__call(__FUNCTION__, $args); + } + + private function send_req($cmd, $params){ + $req = array($cmd); + foreach($params as $p){ + if(is_array($p)){ + $req = array_merge($req, $p); + }else{ + $req[] = $p; + } + } + return $this->send($req); + } + + private function recv_resp($cmd, $params){ + $resp = $this->recv(); + if($resp === false){ + return new SSDB_Response('error', 'Unknown error'); + }else if(!$resp){ + return new SSDB_Response('disconnected', 'Connection closed'); + } + if($resp[0] == 'noauth'){ + $errmsg = isset($resp[1])? $resp[1] : ''; + return new SSDB_Response($resp[0], $errmsg); + } + switch($cmd){ + case 'dbsize': + case 'ping': + case 'qset': + case 'getbit': + case 'setbit': + case 'countbit': + case 'strlen': + case 'set': + case 'setx': + case 'setnx': + case 'zset': + case 'hset': + case 'qpush': + case 'qpush_front': + case 'qpush_back': + case 'qtrim_front': + case 'qtrim_back': + case 'del': + case 'zdel': + case 'hdel': + case 'hsize': + case 'zsize': + case 'qsize': + case 'hclear': + case 'zclear': + case 'qclear': + case 'multi_set': + case 'multi_del': + case 'multi_hset': + case 'multi_hdel': + case 'multi_zset': + case 'multi_zdel': + case 'incr': + case 'decr': + case 'zincr': + case 'zdecr': + case 'hincr': + case 'hdecr': + case 'zget': + case 'zrank': + case 'zrrank': + case 'zcount': + case 'zsum': + case 'zremrangebyrank': + case 'zremrangebyscore': + case 'ttl': + case 'expire': + if($resp[0] == 'ok'){ + $val = isset($resp[1])? intval($resp[1]) : 0; + return new SSDB_Response($resp[0], $val); + }else{ + $errmsg = isset($resp[1])? $resp[1] : ''; + return new SSDB_Response($resp[0], $errmsg); + } + case 'zavg': + if($resp[0] == 'ok'){ + $val = isset($resp[1])? floatval($resp[1]) : (float)0; + return new SSDB_Response($resp[0], $val); + }else{ + $errmsg = isset($resp[1])? $resp[1] : ''; + return new SSDB_Response($resp[0], $errmsg); + } + case 'get': + case 'substr': + case 'getset': + case 'hget': + case 'qget': + case 'qfront': + case 'qback': + if($resp[0] == 'ok'){ + if(count($resp) == 2){ + return new SSDB_Response('ok', $resp[1]); + }else{ + return new SSDB_Response('server_error', 'Invalid response'); + } + }else{ + $errmsg = isset($resp[1])? $resp[1] : ''; + return new SSDB_Response($resp[0], $errmsg); + } + break; + case 'qpop': + case 'qpop_front': + case 'qpop_back': + if($resp[0] == 'ok'){ + $size = 1; + if(isset($params[1])){ + $size = intval($params[1]); + } + if($size <= 1){ + if(count($resp) == 2){ + return new SSDB_Response('ok', $resp[1]); + }else{ + return new SSDB_Response('server_error', 'Invalid response'); + } + }else{ + $data = array_slice($resp, 1); + return new SSDB_Response('ok', $data); + } + }else{ + $errmsg = isset($resp[1])? $resp[1] : ''; + return new SSDB_Response($resp[0], $errmsg); + } + break; + case 'keys': + case 'zkeys': + case 'hkeys': + case 'hlist': + case 'zlist': + case 'qslice': + if($resp[0] == 'ok'){ + $data = array(); + if($resp[0] == 'ok'){ + $data = array_slice($resp, 1); + } + return new SSDB_Response($resp[0], $data); + }else{ + $errmsg = isset($resp[1])? $resp[1] : ''; + return new SSDB_Response($resp[0], $errmsg); + } + case 'auth': + case 'exists': + case 'hexists': + case 'zexists': + if($resp[0] == 'ok'){ + if(count($resp) == 2){ + return new SSDB_Response('ok', (bool)$resp[1]); + }else{ + return new SSDB_Response('server_error', 'Invalid response'); + } + }else{ + $errmsg = isset($resp[1])? $resp[1] : ''; + return new SSDB_Response($resp[0], $errmsg); + } + break; + case 'multi_exists': + case 'multi_hexists': + case 'multi_zexists': + if($resp[0] == 'ok'){ + if(count($resp) % 2 == 1){ + $data = array(); + for($i=1; $idebug){ + echo '> ' . str_replace(array("\r", "\n"), array('\r', '\n'), $s) . "\n"; + } + try{ + while(true){ + $ret = @fwrite($this->sock, $s); + if($ret === false || $ret === 0){ + $this->close(); + throw new SSDBException('Connection lost'); + } + $s = substr($s, $ret); + if(strlen($s) == 0){ + break; + } + @fflush($this->sock); + } + }catch(Exception $e){ + $this->close(); + throw new SSDBException($e->getMessage()); + } + return $ret; + } + + function recv(){ + $this->step = self::STEP_SIZE; + while(true){ + $ret = $this->parse(); + if($ret === null){ + try{ + $data = @fread($this->sock, 1024 * 1024); + if($this->debug){ + echo '< ' . str_replace(array("\r", "\n"), array('\r', '\n'), $data) . "\n"; + } + }catch(Exception $e){ + $data = ''; + } + if($data === false || $data === ''){ + if(feof($this->sock)){ + $this->close(); + throw new SSDBException('Connection lost'); + }else{ + throw new SSDBTimeoutException('Connection timeout'); + } + } + $this->recv_buf .= $data; + # echo "read " . strlen($data) . " total: " . strlen($this->recv_buf) . "\n"; + }else{ + return $ret; + } + } + } + + const STEP_SIZE = 0; + const STEP_DATA = 1; + public $resp = array(); + public $step; + public $block_size; + + private function parse(){ + $spos = 0; + $epos = 0; + $buf_size = strlen($this->recv_buf); + // performance issue for large reponse + //$this->recv_buf = ltrim($this->recv_buf); + while(true){ + $spos = $epos; + if($this->step === self::STEP_SIZE){ + $epos = strpos($this->recv_buf, "\n", $spos); + if($epos === false){ + break; + } + $epos += 1; + $line = substr($this->recv_buf, $spos, $epos - $spos); + $spos = $epos; + + $line = trim($line); + if(strlen($line) == 0){ // head end + $this->recv_buf = substr($this->recv_buf, $spos); + $ret = $this->resp; + $this->resp = array(); + return $ret; + } + $this->block_size = intval($line); + $this->step = self::STEP_DATA; + } + if($this->step === self::STEP_DATA){ + $epos = $spos + $this->block_size; + if($epos <= $buf_size){ + $n = strpos($this->recv_buf, "\n", $epos); + if($n !== false){ + $data = substr($this->recv_buf, $spos, $epos - $spos); + $this->resp[] = $data; + $epos = $n + 1; + $this->step = self::STEP_SIZE; + continue; + } + } + break; + } + } + + // packet not ready + if($spos > 0){ + $this->recv_buf = substr($this->recv_buf, $spos); + } + return null; + } +} \ No newline at end of file diff --git a/app/Libs/SsdbClient.php b/app/Libs/SsdbClient.php new file mode 100644 index 0000000..e69de29 diff --git a/composer.json b/composer.json index c2f57ec..a918050 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,8 @@ }, "classmap": [ "database/seeds", - "database/factories" + "database/factories", + "app/Libs" ] }, "autoload-dev": {