Commit 3167990b by haojie

1

parent ac087581
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* 三个状态 * 三个状态
* 未开始1 * 未开始1
* 进行中2 * 进行中2
* 已结束3 * 已结束3-已开奖
*/ */
class BlindBoxRecordController extends AdminController class BlindBoxRecordController extends AdminController
{ {
...@@ -56,6 +56,7 @@ protected function grid() ...@@ -56,6 +56,7 @@ protected function grid()
$end_time = ToTimestamp($this->end_time); $end_time = ToTimestamp($this->end_time);
# 获取当前时间 # 获取当前时间
$cur_time = ToTimestamp("now"); $cur_time = ToTimestamp("now");
$buy_num = json_decode($this->purchased);
if ($start_time < $cur_time && $end_time > $cur_time) { if ($start_time < $cur_time && $end_time > $cur_time) {
# 进行中 # 进行中
return "<div style='background: rgba(18, 185, 129, 0.1);color:#12B981;height:25px;display:flex;justify-content:center;align-items:center;border-radius: 15px;line-height: 25px; return "<div style='background: rgba(18, 185, 129, 0.1);color:#12B981;height:25px;display:flex;justify-content:center;align-items:center;border-radius: 15px;line-height: 25px;
...@@ -63,6 +64,12 @@ protected function grid() ...@@ -63,6 +64,12 @@ protected function grid()
font-size: 13px;'> font-size: 13px;'>
进行中 进行中
</div>"; </div>";
} else if ($cur_time > $end_time && count($buy_num ?? []) < $this->min_participants_num) {
return "<div style='background: rgba(126, 126, 126, 0.1);color: #7E7E7E;height:25px;display:flex;justify-content:center;align-items:center;border-radius: 15px;line-height: 25px;
font-weight: 600;
font-size: 13px;'>
未完成
</div>";
} else if ($cur_time > $end_time) { } else if ($cur_time > $end_time) {
# 已完成 # 已完成
return "<div style='background: rgba(22, 93, 255, 0.1);color:#165DFF;height:25px;display:flex;justify-content:center;align-items:center;border-radius: 15px;line-height: 25px; return "<div style='background: rgba(22, 93, 255, 0.1);color:#165DFF;height:25px;display:flex;justify-content:center;align-items:center;border-radius: 15px;line-height: 25px;
...@@ -71,11 +78,26 @@ protected function grid() ...@@ -71,11 +78,26 @@ protected function grid()
已完成 已完成
</div>"; </div>";
} }
return "<div style='background: rgba(240, 84, 81, 0.1);color:#F05451;height:25px;display:flex;justify-content:center;align-items:center;border-radius: 15px;line-height: 25px; });
font-weight: 600; # 参与钱包
font-size: 13px;'> $grid->column('purchased', '参与钱包')->display(function () {
未开始 $json = json_decode($this->purchased);
</div>"; if (!is_array($json)) {
return '暂无';
}
return '点击展开';
})->expand(function () {
// 返回显示的详情
$json = json_decode($this->purchased);
# 是数组
$div = '';
if (is_array($json)) {
foreach ($json as $value) {
$div = $div . "<div>$value</div>";
}
}
return "<div style='padding:10px 10px 0'>$div</div>";
}); });
# winner_list-中奖钱包 # winner_list-中奖钱包
$grid->column('winner_list', '中奖钱包')->display(function ($item) { $grid->column('winner_list', '中奖钱包')->display(function ($item) {
......
<?php
namespace App\Admin\Controllers;
use App\Admin\Repositories\UseUser;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
class UseUserController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new UseUser(), function (Grid $grid) {
$grid->column('id')->sortable();
$grid->column('user_address');
$grid->column('invitation_code');
$grid->column('created_at');
$grid->column('updated_at')->sortable();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new UseUser(), function (Show $show) {
$show->field('id');
$show->field('user_address');
$show->field('invitation_code');
$show->field('created_at');
$show->field('updated_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new UseUser(), function (Form $form) {
$form->display('id');
$form->text('user_address');
$form->text('invitation_code');
$form->display('created_at');
$form->display('updated_at');
});
}
}
<?php
namespace App\Admin\Repositories;
use App\Models\UseUser as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class UseUser extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
use Illuminate\Console\Command; use Illuminate\Console\Command;
use App\Models\BlindBoxList; use App\Models\BlindBoxList;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use App\Http\Controllers\API\BlindBox\OpenPrizeController;
class BlindBoxStatus extends Command class BlindBoxStatus extends Command
{ {
...@@ -31,17 +32,21 @@ public function handle() ...@@ -31,17 +32,21 @@ public function handle()
{ {
try { try {
$list = BlindBoxList::query()->where('status', '!=', 3)->get(); $list = BlindBoxList::query()->where('status', '!=', 3)->get();
Log::info($list); Log::error($list);
foreach ($list as $value) { foreach ($list as $value) {
$start_time = ToTimestamp($value->start_time); $start_time = ToTimestamp($value->start_time);
$end_time = ToTimestamp($value->end_time); $end_time = ToTimestamp($value->end_time);
$status = getBlindBoxStatus($start_time, $end_time); $status = getBlindBoxStatus($start_time, $end_time);
if ($status == 3) {
# 开奖
app(OpenPrizeController::class)->useOpenPrize();
}
if ($status != $value->id) { if ($status != $value->id) {
BlindBoxList::query()->where('id', $value->id)->update(['status' => $status]); BlindBoxList::query()->where('id', $value->id)->update(['status' => $status]);
} }
} }
} catch (\Exception $e) { } catch (\Exception $e) {
Log::info($e); Log::error($e);
} }
return Command::SUCCESS; return Command::SUCCESS;
......
...@@ -3,8 +3,9 @@ ...@@ -3,8 +3,9 @@
namespace App\Http\Controllers\API\BlindBox; namespace App\Http\Controllers\API\BlindBox;
use function PHPUnit\Framework\isEmpty;
use App\Models\BlindBoxList; use App\Models\BlindBoxList;
use App\Models\UserWallet;
use Illuminate\Pagination\LengthAwarePaginator;
class BlindBoxController class BlindBoxController
{ {
...@@ -40,4 +41,70 @@ public function getProgressBoxList() ...@@ -40,4 +41,70 @@ public function getProgressBoxList()
return $list; return $list;
} }
/**
* 用户订单
* status
* 1-未完成-购买人数不够
* 2-进行中-购买人数已达到指定数,未到开奖时间的
* 3-已完成--已开奖
*/
public function getUserPayBlindBox($address, $status, $page, $limit, $request)
{
# 获取用户购买成功的订单id
$ID_LIST = UserWallet::query()->where('user_address', $address)->whereIn('status', [1])->get(['blind_box_id']);
if (count($ID_LIST)) {
# 存在购买的订单-前往盲盒列表查询
$list = [];
foreach ($ID_LIST as $value) {
if ($status == 3) {
# 获取已完成的订单--要加个状态-是否中奖
$obj = BlindBoxList::query()->where('id', $value->blind_box_id)->whereIn('status', [3])->get()->first();
if ($obj) {
$buy_num = count(json_decode($obj->purchased));
if ($buy_num >= $obj->min_participants_num) {
# 购买人数已达到指定数
$obj->buy_num = $buy_num;
unset($obj->purchased);
array_push($list, $obj);
}
}
} else if ($status == 2) {
# 进行中 --["0xcc88e86aa0e589e18ff03fb9b0449468a1ef1f4b"]
$obj = BlindBoxList::query()->where('id', $value->blind_box_id)->whereIn('status', [2])->get()->first();
if ($obj) {
$buy_num = count(json_decode($obj->purchased));
if ($buy_num >= $obj->min_participants_num) {
# 购买人数已达到指定数
$obj->buy_num = $buy_num;
unset($obj->purchased);
array_push($list, $obj);
}
}
} else if ($status == 1) {
# 未完成
$obj = BlindBoxList::query()->where('id', $value->blind_box_id)->whereIn('status', [2])->get()->first();
if ($obj) {
$buy_num = count(json_decode($obj->purchased));
if ($buy_num < $obj->min_participants_num) {
# 未到达指定人数
$obj->buy_num = $buy_num;
unset($obj->purchased);
array_push($list, $obj);
}
}
}
}
# 处理分页
$total = count($list); //总数
$item = array_slice($list, ($page - 1) * $limit, $limit);
return new LengthAwarePaginator($item, $total, $limit, $page, [
'path' => $request->url(), // 当前页面的url
'pageName' => 'page', //参数名
]);
# return $list;
} else {
return [];
}
}
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
use App\Models\BlindBoxList; use App\Models\BlindBoxList;
use App\Models\UserWallet; use App\Models\UserWallet;
use Illuminate\Support\Facades\Log;
class BuyBlindBoxController class BuyBlindBoxController
...@@ -15,21 +16,48 @@ class BuyBlindBoxController ...@@ -15,21 +16,48 @@ class BuyBlindBoxController
public function toBuy($address, $hash, $id, $price) public function toBuy($address, $hash, $id, $price)
{ {
# 需要hash--address--盲盒id # 需要hash--address--盲盒id
$user = UserWallet::query()->where('user_address', '=', $address)->get(); # 创建订单
$obj = (object)[]; UserWallet::query()->create(['user_address' => $address, 'status' => 0, 'price' => $price, 'blind_box_id' => $id, 'hash' => $hash]);
$obj->hash = $hash; }
$obj->id = $id;
$obj->price = $price; /**
$obj->status = 0; * 向redis发送请求
if (!count($user)) { */
# 创建用户 public function IntervalCheck()
UserWallet::query()->create(['user_address' => $address, 'buy_list' => json_encode([$obj])]); {
return '';
}
/**
* python检查回调
*/
public function CheckCallback($hash, $status)
{
# 更新订单状态
UserWallet::query()->where('hash', $hash)->update(['status' => $status]);
# 获取当前hash的购买地址-和盲盒id
$item = UserWallet::query()->where('hash', $hash)->first(['user_address', 'blind_box_id']);
#获取已购买列表
$purchased = BlindBoxList::query()->where('id', $item->blind_box_id)->first(['purchased']);
#更新盲盒购买状态
$pur_list = json_decode($purchased->purchased);
if (!empty($pur_list) && is_array($pur_list)) {
# 先判断是否存在地址了
foreach ($pur_list as $values) {
if ($values == $item->user_address) {
return '已存在';
}
}
# 往数组添加
array_push($pur_list, $item->user_address);
# 更新当前盲盒购买人数
BlindBoxList::query()->where('id', $item->blind_box_id)->update(['purchased' => json_encode($pur_list)]);
} else { } else {
# 已有账户 $list = [];
$item = UserWallet::query()->where('user_address', $address)->first(); Log::error($item->user_address);
$list = json_decode($item->buy_list); array_push($list, $item->user_address);
array_push($list, $obj); BlindBoxList::query()->where('id', $item->blind_box_id)->update(['purchased' => json_encode($list)]);
UserWallet::query()->where('user_address', $address)->update(['buy_list' => json_encode($list)]);
} }
return '';
} }
} }
<?php
namespace App\Http\Controllers\API\BlindBox;
use App\Models\BlindBoxList;
use App\Models\UserWallet;
use Illuminate\Support\Facades\Log;
class OpenPrizeController
{
/**
* 盲盒开奖
*/
public function useOpenPrize()
{
return '';
}
}
...@@ -8,11 +8,30 @@ ...@@ -8,11 +8,30 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\API\BlindBox\BlindBoxController; use App\Http\Controllers\API\BlindBox\BlindBoxController;
use App\Http\Controllers\API\BlindBox\BuyBlindBoxController; use App\Http\Controllers\API\BlindBox\BuyBlindBoxController;
use function PHPUnit\Framework\isEmpty; use Illuminate\Support\Facades\Redis;
use App\Models\UserWallet;
use App\Http\Controllers\API\User\CreateUser;
class IndexController extends Controller class IndexController extends Controller
{ {
/** /**
* 获取用户信息
*
* @param Request $request
* @return mixed
*/
public function getUserInfo(Request $request)
{
$address = $request->input('address', null);
if (empty($address)) {
return $this->success('success', '');
}
# 创建用户
$result = app(CreateUser::class)->useCreateAccount($address);
return $this->success('success', $result);
}
/**
* 获取盲盒列表 * 获取盲盒列表
* *
* @param Request $request * @param Request $request
...@@ -25,6 +44,23 @@ public function getList(Request $request) ...@@ -25,6 +44,23 @@ public function getList(Request $request)
} }
/** /**
* 用户订单
* status:1-进行中,2-未完成,3-已完成
*/
public function useUserOrder(Request $request)
{
$address = $request->input('address', null);
$status = $request->input('status', null);
$page = $request->input('page', 1);
$limit = $request->input('limit', 10);
if (empty($address) || empty($status)) {
return $this->error('缺少数据', 400, 400);
}
$result = app(BlindBoxController::class)->getUserPayBlindBox($address, $status, $page, $limit, $request);
return $this->success('success', $result);
}
/**
* 购买盲盒 * 购买盲盒
*/ */
public function useBuy(Request $request) public function useBuy(Request $request)
...@@ -39,4 +75,60 @@ public function useBuy(Request $request) ...@@ -39,4 +75,60 @@ public function useBuy(Request $request)
$result = app(BuyBlindBoxController::class)->toBuy($address, $hash, $id, $price); $result = app(BuyBlindBoxController::class)->toBuy($address, $hash, $id, $price);
return $this->success('success', $result); return $this->success('success', $result);
} }
/**
* 用户购买轮询
* 'hash': '0xb38850234001aa9e8533f3662f31a3039ed58d103caed5009122ac2be66082b7',
* 'notify_url': 'http://127.0.0.1:8000/api/BlindBox/buy/check',
* 'retry': 1,
* 'amount': 1,
* 'form': '0x2c329b92f1d0b2f2c0b28fd1bf9a2f96989a9a4f',
* 'to': '0xe6df05ce8c8301223373cf5b969afcb1498c5528',
*/
public function usePayCheck(Request $request)
{
# 提交redis
$hash = $request->input('hash', null);
$amount = $request->input('price', null);
$form = $request->input('form', null);
# 先写死
$to = '0x51eF357cf7204DB2a6e31750817F709a10c86f37';
if (empty($hash) || empty($amount) || empty($form)) {
return $this->error('缺少数据', 400, 400);
}
# 获取交易
$obj = (object)[];
$obj->hash = $hash;
$obj->notify_url = 'http://127.0.0.1:8000/api/BlindBox/buy/CheckCallback';
$obj->retry = 1;
$obj->amount = $amount;
$obj->form = $form;
$obj->to = $to;
#清空队列
Redis::rpush('pay_notify', json_encode($obj));
# 获取状态
$item = UserWallet::query()->where('hash', $hash)->first(['status']);
if ($item->status == 1) {
return $this->success('success', true);
} else {
# 未到账
return $this->success('success', false);
}
}
/**
* python 查询hash回调
*/
public function useCheckCallback(Request $request)
{
$hash = $request->input('hash', null);
$status = $request->input('status', null);
# 测试
$status = 1;
if (empty($hash) || empty($status) || $status == 0) {
return false;
}
$result = app(BuyBlindBoxController::class)->CheckCallback($hash, $status);
return $this->success('success', $result);
}
} }
<?php
namespace App\Http\Controllers\API\User;
use App\Models\UseUser;
class CreateUser
{
public function useCreateAccount($address)
{
# 前端连接钱包成功后,判断是否创建用户
$user = UseUser::query()->where('user_address', $address)->first();
if (!$user) {
#用户不存在
# 生成邀请码的位数
$count = 6;
#循环判断是否存在
# 生成邀请码
$invitation_code = self::getRandomStr($count);
# 判断表中是否存在相同邀请码
$item = UseUser::query()->where('invitation_code', $invitation_code)->first();
if (!$item) {
# 不存在-创建账户
UseUser::query()->create(['user_address' => $address, 'invitation_code' => $invitation_code]);
} else {
# 存在相同的邀请码
}
}
}
/**
*生成随机字符串
*/
private function getRandomStr($count)
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$code = '';
# 随机取值
for ($i = 0, $lc = strlen($chars) - 1; $i < $lc; $i++) {
$num = mt_rand(0, $lc);
$code .= $chars[$num];
if (strlen($code) >= $count) {
break;
}
}
return $code;
}
}
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;
class UseUser extends Model
{
use HasDateTimeFormatter;
protected $fillable = [
'user_address',
'invitation_code'
];
protected $table = 'use_user';
}
...@@ -12,7 +12,10 @@ class UserWallet extends Model ...@@ -12,7 +12,10 @@ class UserWallet extends Model
protected $fillable = [ protected $fillable = [
'user_address', 'user_address',
'buy_list' 'status',
'price',
'blind_box_id',
'hash'
]; ];
protected $table = 'user_wallet'; protected $table = 'user_wallet';
......
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUseUserTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('use_user', function (Blueprint $table) {
$table->increments('id');
$table->string('user_address')->default('')->comment('用户地址是唯一的');
$table->string('invitation_code')->default('');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('use_user');
}
}
...@@ -62,8 +62,10 @@ ...@@ -62,8 +62,10 @@
* @property Grid\Column|Collection last_used_at * @property Grid\Column|Collection last_used_at
* @property Grid\Column|Collection tokenable_id * @property Grid\Column|Collection tokenable_id
* @property Grid\Column|Collection tokenable_type * @property Grid\Column|Collection tokenable_type
* @property Grid\Column|Collection buy_list * @property Grid\Column|Collection invitation_code
* @property Grid\Column|Collection user_address * @property Grid\Column|Collection user_address
* @property Grid\Column|Collection blind_box_id
* @property Grid\Column|Collection hash
* @property Grid\Column|Collection email_verified_at * @property Grid\Column|Collection email_verified_at
* *
* @method Grid\Column|Collection created_at(string $label = null) * @method Grid\Column|Collection created_at(string $label = null)
...@@ -117,8 +119,10 @@ ...@@ -117,8 +119,10 @@
* @method Grid\Column|Collection last_used_at(string $label = null) * @method Grid\Column|Collection last_used_at(string $label = null)
* @method Grid\Column|Collection tokenable_id(string $label = null) * @method Grid\Column|Collection tokenable_id(string $label = null)
* @method Grid\Column|Collection tokenable_type(string $label = null) * @method Grid\Column|Collection tokenable_type(string $label = null)
* @method Grid\Column|Collection buy_list(string $label = null) * @method Grid\Column|Collection invitation_code(string $label = null)
* @method Grid\Column|Collection user_address(string $label = null) * @method Grid\Column|Collection user_address(string $label = null)
* @method Grid\Column|Collection blind_box_id(string $label = null)
* @method Grid\Column|Collection hash(string $label = null)
* @method Grid\Column|Collection email_verified_at(string $label = null) * @method Grid\Column|Collection email_verified_at(string $label = null)
*/ */
class Grid {} class Grid {}
...@@ -177,8 +181,10 @@ class MiniGrid extends Grid {} ...@@ -177,8 +181,10 @@ class MiniGrid extends Grid {}
* @property Show\Field|Collection last_used_at * @property Show\Field|Collection last_used_at
* @property Show\Field|Collection tokenable_id * @property Show\Field|Collection tokenable_id
* @property Show\Field|Collection tokenable_type * @property Show\Field|Collection tokenable_type
* @property Show\Field|Collection buy_list * @property Show\Field|Collection invitation_code
* @property Show\Field|Collection user_address * @property Show\Field|Collection user_address
* @property Show\Field|Collection blind_box_id
* @property Show\Field|Collection hash
* @property Show\Field|Collection email_verified_at * @property Show\Field|Collection email_verified_at
* *
* @method Show\Field|Collection created_at(string $label = null) * @method Show\Field|Collection created_at(string $label = null)
...@@ -232,8 +238,10 @@ class MiniGrid extends Grid {} ...@@ -232,8 +238,10 @@ class MiniGrid extends Grid {}
* @method Show\Field|Collection last_used_at(string $label = null) * @method Show\Field|Collection last_used_at(string $label = null)
* @method Show\Field|Collection tokenable_id(string $label = null) * @method Show\Field|Collection tokenable_id(string $label = null)
* @method Show\Field|Collection tokenable_type(string $label = null) * @method Show\Field|Collection tokenable_type(string $label = null)
* @method Show\Field|Collection buy_list(string $label = null) * @method Show\Field|Collection invitation_code(string $label = null)
* @method Show\Field|Collection user_address(string $label = null) * @method Show\Field|Collection user_address(string $label = null)
* @method Show\Field|Collection blind_box_id(string $label = null)
* @method Show\Field|Collection hash(string $label = null)
* @method Show\Field|Collection email_verified_at(string $label = null) * @method Show\Field|Collection email_verified_at(string $label = null)
*/ */
class Show {} class Show {}
......
<?php
return [
'labels' => [
'UseUser' => 'UseUser',
'use-user' => 'UseUser',
],
'fields' => [
'user_address' => '用户地址',
'invitation_code' => '邀请码',
],
'options' => [
],
];
...@@ -25,4 +25,15 @@ ...@@ -25,4 +25,15 @@
Route::get('/BlindBoxList', 'IndexController@getList'); Route::get('/BlindBoxList', 'IndexController@getList');
# 购买盲盒 # 购买盲盒
Route::post('/BlindBox/buy', 'IndexController@useBuy'); Route::post('/BlindBox/buy', 'IndexController@useBuy');
# 检查交易
Route::post('/BlindBox/buy/check', 'IndexController@usePayCheck');
# python检查回调
Route::post('/BlindBox/buy/CheckCallback', 'IndexController@useCheckCallback');
# 用户订单查询
Route::get('/order', 'IndexController@useUserOrder');
// ---------
# 获取用户信息
Route::get('/user/info', 'IndexController@getUserInfo');
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment