Commit 3167990b by haojie

1

parent ac087581
......@@ -13,7 +13,7 @@
* 三个状态
* 未开始1
* 进行中2
* 已结束3
* 已结束3-已开奖
*/
class BlindBoxRecordController extends AdminController
{
......@@ -56,6 +56,7 @@ protected function grid()
$end_time = ToTimestamp($this->end_time);
# 获取当前时间
$cur_time = ToTimestamp("now");
$buy_num = json_decode($this->purchased);
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;
......@@ -63,6 +64,12 @@ protected function grid()
font-size: 13px;'>
进行中
</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) {
# 已完成
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()
已完成
</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;'>
未开始
</div>";
});
# 参与钱包
$grid->column('purchased', '参与钱包')->display(function () {
$json = json_decode($this->purchased);
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-中奖钱包
$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 @@
use Illuminate\Console\Command;
use App\Models\BlindBoxList;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\API\BlindBox\OpenPrizeController;
class BlindBoxStatus extends Command
{
......@@ -31,17 +32,21 @@ public function handle()
{
try {
$list = BlindBoxList::query()->where('status', '!=', 3)->get();
Log::info($list);
Log::error($list);
foreach ($list as $value) {
$start_time = ToTimestamp($value->start_time);
$end_time = ToTimestamp($value->end_time);
$status = getBlindBoxStatus($start_time, $end_time);
if ($status == 3) {
# 开奖
app(OpenPrizeController::class)->useOpenPrize();
}
if ($status != $value->id) {
BlindBoxList::query()->where('id', $value->id)->update(['status' => $status]);
}
}
} catch (\Exception $e) {
Log::info($e);
Log::error($e);
}
return Command::SUCCESS;
......
......@@ -3,8 +3,9 @@
namespace App\Http\Controllers\API\BlindBox;
use function PHPUnit\Framework\isEmpty;
use App\Models\BlindBoxList;
use App\Models\UserWallet;
use Illuminate\Pagination\LengthAwarePaginator;
class BlindBoxController
{
......@@ -40,4 +41,70 @@ public function getProgressBoxList()
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 @@
use App\Models\BlindBoxList;
use App\Models\UserWallet;
use Illuminate\Support\Facades\Log;
class BuyBlindBoxController
......@@ -15,21 +16,48 @@ class BuyBlindBoxController
public function toBuy($address, $hash, $id, $price)
{
# 需要hash--address--盲盒id
$user = UserWallet::query()->where('user_address', '=', $address)->get();
$obj = (object)[];
$obj->hash = $hash;
$obj->id = $id;
$obj->price = $price;
$obj->status = 0;
if (!count($user)) {
# 创建用户
UserWallet::query()->create(['user_address' => $address, 'buy_list' => json_encode([$obj])]);
# 创建订单
UserWallet::query()->create(['user_address' => $address, 'status' => 0, 'price' => $price, 'blind_box_id' => $id, 'hash' => $hash]);
}
/**
* 向redis发送请求
*/
public function IntervalCheck()
{
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 {
# 已有账户
$item = UserWallet::query()->where('user_address', $address)->first();
$list = json_decode($item->buy_list);
array_push($list, $obj);
UserWallet::query()->where('user_address', $address)->update(['buy_list' => json_encode($list)]);
$list = [];
Log::error($item->user_address);
array_push($list, $item->user_address);
BlindBoxList::query()->where('id', $item->blind_box_id)->update(['purchased' => 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 @@
use Illuminate\Http\Request;
use App\Http\Controllers\API\BlindBox\BlindBoxController;
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
{
/**
* 获取用户信息
*
* @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
......@@ -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)
......@@ -39,4 +75,60 @@ public function useBuy(Request $request)
$result = app(BuyBlindBoxController::class)->toBuy($address, $hash, $id, $price);
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
protected $fillable = [
'user_address',
'buy_list'
'status',
'price',
'blind_box_id',
'hash'
];
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 @@
* @property Grid\Column|Collection last_used_at
* @property Grid\Column|Collection tokenable_id
* @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 blind_box_id
* @property Grid\Column|Collection hash
* @property Grid\Column|Collection email_verified_at
*
* @method Grid\Column|Collection created_at(string $label = null)
......@@ -117,8 +119,10 @@
* @method Grid\Column|Collection last_used_at(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 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 blind_box_id(string $label = null)
* @method Grid\Column|Collection hash(string $label = null)
* @method Grid\Column|Collection email_verified_at(string $label = null)
*/
class Grid {}
......@@ -177,8 +181,10 @@ class MiniGrid extends Grid {}
* @property Show\Field|Collection last_used_at
* @property Show\Field|Collection tokenable_id
* @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 blind_box_id
* @property Show\Field|Collection hash
* @property Show\Field|Collection email_verified_at
*
* @method Show\Field|Collection created_at(string $label = null)
......@@ -232,8 +238,10 @@ class MiniGrid extends Grid {}
* @method Show\Field|Collection last_used_at(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 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 blind_box_id(string $label = null)
* @method Show\Field|Collection hash(string $label = null)
* @method Show\Field|Collection email_verified_at(string $label = null)
*/
class Show {}
......
<?php
return [
'labels' => [
'UseUser' => 'UseUser',
'use-user' => 'UseUser',
],
'fields' => [
'user_address' => '用户地址',
'invitation_code' => '邀请码',
],
'options' => [
],
];
......@@ -25,4 +25,15 @@
Route::get('/BlindBoxList', 'IndexController@getList');
# 购买盲盒
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