diff --git a/app/Admin/Controllers/ActivityController.php b/app/Admin/Controllers/ActivityController.php
index fd4adee..f4cc0a9 100644
--- a/app/Admin/Controllers/ActivityController.php
+++ b/app/Admin/Controllers/ActivityController.php
@@ -13,6 +13,8 @@ use App\Services\Admin\ActivityService;
use App\Traits\CustomActionTrait;
use App\Admin\Components;
use App\Enums\Score;
+use App\Models\Activity;
+use Illuminate\Http\Request;
class ActivityController extends AdminController
{
@@ -38,17 +40,42 @@ class ActivityController extends AdminController
->columns([
amis()->TableColumn('id', __('admin.id'))->width('50px')->sortable(),
amis()->TableColumn('name', __('admin.activities.name')),
- amis()->TableColumn('state', __('admin.activities.state')),
+ amis()->TableColumn('state', __('admin.activities.state'))->type('mapping')->map([
+ "0"=>"未发布",
+ "1"=>"进行中",
+ "2"=>"已结束",
+ "*"=> '其他:${gender}'
+ ]),
+ amis()->TableColumn('user_count', __('admin.activities.user_count')),
amis()->TableColumn('start_at', __('admin.activities.start_at')),
amis()->TableColumn('end_at', __('admin.activities.end_at')),
amis()->TableColumn('created_at', __('admin.created_at'))->type('datetime')->sortable(true),
Operation::make()->label(__('admin.actions'))->buttons([
- //发布活动-todo
- //结算活动(参与时间结束后,且最后一场竞猜结束,点击结算则发送奖品)-todo
- $this->rowShowTypeButton('drawer', 'xl'),//活动详情-todo-//竞猜赛程//活动奖品
+ //发布活动
+ amisMake()->AjaxAction()->label('发布')->icon('fa-regular fa-arrow-alt-circle-up')->level('link')
+ ->actionType('ajax')
+ ->confirmText('是否发布该场活动,一旦发布无法删除。')
+ ->api([
+ 'method' => 'put',
+ 'url' => admin_url('activities/${id}'),
+ 'data' => [
+ 'id' => '${id}',
+ 'state' => 1
+ ]
+ ])->visibleOn('${state == 0}'),
+
+ $this->rowShowTypeButton('drawer', 'xl'),//活动详情
$this->rowEditTypeButton('drawer', 'lg'),
$this->rowDeleteButton()->visibleOn('${state === 0}'),
+ //结算活动(参与时间结束后,且最后一场竞猜结束,点击结算则发送奖品)
+ amisMake()->AjaxAction()->label('结算')->icon('fa-regular fa-hand-point-up')->level('link')
+ ->actionType('ajax')
+ ->confirmText('是否结算该场活动,一旦结算则根据当前排名发送奖品。')
+ ->api([
+ 'method' => 'post',
+ 'url' => admin_url('activities/${id}/finish'),
+ ])->visibleOn('${state == 1}'),
])
]);
@@ -87,7 +114,7 @@ class ActivityController extends AdminController
amis()->FieldSetControl()->title('竞猜场次')->body([
amisMake()->CRUDTable()->affixHeader(false)->perPage(10)->loadDataOnce(true)
->headerToolbar([
- DialogAction::make()->className('absolute top-3 right-4')->label(__('admin.create'))->dialog(
+ DialogAction::make()->className('absolute top-3 right-4')->label(__('admin.create'))->icon('fa fa-add')->level('primary')->dialog(
Dialog::make()->title('新增竞猜场次')->body([
amisMake()->form()->title('')
->api([
@@ -109,11 +136,11 @@ class ActivityController extends AdminController
amis()->TextControl('game_name', __('admin.activity_games.name'))->required(true),
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl('home_field', __('admin.activity_games.home_field'))->required(),
- Components::make()->cropImageControl('home_logo', __('admin.activity_games.home_logo'))->required(true),
+ Components::make()->cropImageControl('home_logo', __('admin.activity_games.home_logo')),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl('away', __('admin.activity_games.away'))->required(),
- Components::make()->cropImageControl('away_logo', __('admin.activity_games.away_logo'))->required(true),
+ Components::make()->cropImageControl('away_logo', __('admin.activity_games.away_logo')),
]),
amis()->DateTimeControl('game_at', __('admin.activity_games.game_at'))->format('YYYY-MM-DD HH:mm:ss')->required(true),
Components::make()->sortControl('mark', __('admin.activity_games.mark'))->required(true),
@@ -122,9 +149,15 @@ class ActivityController extends AdminController
)
])
->title('')
- ->api(admin_url('activity_games?_action=getData&state=1&activity_id=${id}'))
+ ->api(admin_url('activity_games?_action=getData&activity_id=${id}'))
->columns([
amis()->TableColumn('name', __('admin.activity_games.name')),
+ amis()->TableColumn('state', __('admin.activity_games.state'))->type('mapping')->map([
+ "0"=>"未发布",
+ "1"=>"进行中",
+ "2"=>"已结束",
+ "*"=> '其他:${gender}'
+ ]),
amis()->TableColumn('home_field', __('admin.activity_games.home_field')),
amis()->TableColumn('home_logo', __('admin.activity_games.home_logo'))->type('image')->height('30px')->width('30px'),
amis()->TableColumn('away', __('admin.activity_games.away')),
@@ -133,32 +166,112 @@ class ActivityController extends AdminController
amis()->TableColumn('mark', __('admin.activity_games.mark')),
amis()->TableColumn('score', __('admin.activity_games.score')),
amisMake()->Operation()->label(__('admin.actions'))->buttons([
- // amisMake()->AjaxAction()->label('发布')->level('link')
- // ->actionType('ajax')
- // ->confirmText(__('admin.confirm_delete'))
- // ->api([
- // 'method' => 'delete',
- // 'url' => admin_url('activity_games/${id}')
- // ])
+ amisMake()->DialogAction()->label('编辑')
+ ->level('link')
+ ->dialog(Dialog::make()->title('编辑竞猜场次')->body([
+ amisMake()->form()->title('')
+ ->api('put:'. admin_url('activity_games/${id}'))
+ ->body([
+ amis()->TextControl('id', '场次ID')->hidden(true)->value('${id}'),
+ amis()->TextControl('name', __('admin.activity_games.name'))->required(true),
+ amis()->GroupControl()->mode('horizontal')->body([
+ amis()->TextControl('home_field', __('admin.activity_games.home_field'))->required(),
+ Components::make()->cropImageControl('home_logo', __('admin.activity_games.home_logo')),
+ ]),
+ amis()->GroupControl()->mode('horizontal')->body([
+ amis()->TextControl('away', __('admin.activity_games.away'))->required(),
+ Components::make()->cropImageControl('away_logo', __('admin.activity_games.away_logo')),
+ ]),
+ amis()->DateTimeControl('game_at', __('admin.activity_games.game_at'))->format('YYYY-MM-DD HH:mm:ss')->required(true),
+ Components::make()->sortControl('mark', __('admin.activity_games.mark'))->required(true),
+ ])
+ ])->size('lg'))
+ ->hiddenOn('${state == 2}'),
+ amisMake()->AjaxAction()->label('发布')->level('link')
+ ->actionType('ajax')
+ ->confirmText('是否发布该场竞猜')
+ ->api([
+ 'method' => 'put',
+ 'url' => admin_url('activity_games/${id}'),
+ 'data' => [
+ 'id' => '${id}',
+ 'state' => 1
+ ]
+ ])->visibleOn('${state == 0}'),
amisMake()->AjaxAction()->label('删除')->level('link')
->actionType('ajax')
->confirmText(__('admin.confirm_delete'))
->api([
'method' => 'delete',
'url' => admin_url('activity_games/${id}')
- ])->visibleOn('${state} == 0'),
+ ])->visibleOn('${state == 0}'),
amisMake()->DialogAction()->label('结果')
->level('link')
->dialog(Dialog::make()->title('比赛结果')->body([
amisMake()->form()->title('')
- ->api('put:'.admin_url('/activity_games/${id}'))
+ ->api('post:' .admin_url('activity_games/${id}/finish'))
->body([
- amis()->TextControl('id', '场次ID')->hidden(true)->value('${id}'),
- amis()->TextControl('state', '状态')->hidden(true)->value(2),
amis()->SelectControl('score', __('admin.activity_games.score'))
- ->options(Score::options()),
+ ->options(Score::options())->required(),
])
- ]))->visibleOn('${state} == 1'),
+ ]))->visibleOn('${state == 1}'),
+ ]),
+ ])
+ ]),
+ amis()->FieldSetControl()->title('活动奖品')->className('mt-10')->body([
+ amisMake()->CRUDTable()->affixHeader(false)->perPage(10)->loadDataOnce(true)
+ ->headerToolbar([
+ DialogAction::make()->className('absolute top-3 right-4')->label(__('admin.create'))->icon('fa fa-add')->level('primary')->dialog(
+ Dialog::make()->title('新增活动奖品')->body([
+ amisMake()->form()->title('')
+ ->api([
+ 'method'=>'post',
+ 'url'=>admin_url('activity_gifts'),
+ "data" => [
+ 'activity_id'=>'${activity_id}',
+ 'name'=>'${gift_name}',
+ 'logo'=>'${logo}',
+ 'rank'=>'${rank}',
+ 'explain'=>'${explain}',
+ ],
+ ])
+ ->body([
+ amis()->TextControl('activity_id', '活动ID')->hidden(true)->value('${id}'),
+ amis()->TextControl('gift_name', __('admin.activity_gifts.name'))->required(true),
+ Components::make()->cropImageControl('logo', __('admin.activity_gifts.logo')),
+ Components::make()->sortControl('rank', __('admin.activity_gifts.rank'))->required(true),
+ amis()->TextareaControl('explain', __('admin.activity_gifts.explain'))
+ ])
+ ])->size('lg')
+ )
+ ])
+ ->title('')
+ ->api(admin_url('activity_gifts?_action=getData&activity_id=${id}'))
+ ->columns([
+ amis()->TableColumn('name', __('admin.activity_gifts.name')),
+ amis()->TableColumn('logo', __('admin.activity_gifts.logo'))->type('image')->height('30px')->width('30px'),
+ amis()->TableColumn('rank', __('admin.activity_gifts.rank')),
+ amisMake()->Operation()->label(__('admin.actions'))->buttons([
+ amisMake()->DialogAction()->label('编辑')
+ ->level('link')
+ ->dialog(Dialog::make()->title('编辑活动奖品')->body([
+ amisMake()->form()->title('')
+ ->api('put:'. admin_url('activity_gifts/${id}'))
+ ->body([
+ amis()->TextControl('id', '奖品ID')->hidden(true)->value('${id}'),
+ amis()->TextControl('name', __('admin.activity_gifts.name'))->required(true),
+ Components::make()->cropImageControl('logo', __('admin.activity_gifts.logo')),
+ Components::make()->sortControl('rank', __('admin.activity_gifts.rank'))->required(true),
+ amis()->TextareaControl('explain', __('admin.activity_gifts.explain'))
+ ])
+ ])->size('lg')),
+ amisMake()->AjaxAction()->label('删除')->level('link')
+ ->actionType('ajax')
+ ->confirmText(__('admin.confirm_delete'))
+ ->api([
+ 'method' => 'delete',
+ 'url' => admin_url('activity_gifts/${id}')
+ ]),
]),
])
]),
@@ -174,4 +287,17 @@ class ActivityController extends AdminController
amis()->Button()->actionType('cancel')->label(__('admin.back'))->primary()
];
}
+
+ /**
+ * 结算活动,并发送奖品
+ */
+ public function finish(Activity $activity)
+ {
+ //若存在未公布结果的比赛场次,无法结算;
+ if($activity->games()->where('state', '<>', 2)->exists()){
+ return $this->response()->fail('该活动存在未公布结果的竞猜场次,请先公布结果');
+ }
+ $res = $this->service->finishActivity($activity);
+ return $this->autoResponse($res, '结算');
+ }
}
\ No newline at end of file
diff --git a/app/Admin/Controllers/ActivityGameController.php b/app/Admin/Controllers/ActivityGameController.php
new file mode 100644
index 0000000..901dff9
--- /dev/null
+++ b/app/Admin/Controllers/ActivityGameController.php
@@ -0,0 +1,73 @@
+baseCRUD()->tableLayout('fixed')
+ ->headerToolbar([
+
+ ])
+ ->filter($this->baseFilter()->labelWidth('80px')->body([
+ ]))
+ ->columns([
+
+ ]);
+
+ return $this->baseList($crud);
+ }
+
+ public function form($isEdit = false): Form
+ {
+ return $this->baseForm()->body([
+
+ ]);
+ }
+
+ public function detail()
+ {
+ $form = amisMake()->form()->title('')->panelClassName('border-r border-t-0 border-b-0 border-l-0')->mode('horizontal')
+ ->static(true)->actions([])
+ ->body([
+
+ ]);
+
+ return amisMake()->Grid()->columns([
+ amis()->Column()->body($form)->md(4),
+ amis()->Column()->body([
+ ])->md(8),
+ ]);
+ }
+
+ public function detailActions()
+ {
+ return [
+ //返回
+ amis()->Button()->actionType('cancel')->label(__('admin.back'))->primary()
+ ];
+ }
+
+ /**
+ * 公布结果,并添加成绩
+ */
+ public function finish(ActivityGame $activityGame, Request $request)
+ {
+ $res = $this->service->finishGame($activityGame, $request->input('score'));
+
+ return $this->autoResponse($res, '操作');
+ }
+}
\ No newline at end of file
diff --git a/app/Admin/Controllers/ActivityGiftController.php b/app/Admin/Controllers/ActivityGiftController.php
new file mode 100644
index 0000000..8f57af2
--- /dev/null
+++ b/app/Admin/Controllers/ActivityGiftController.php
@@ -0,0 +1,61 @@
+baseCRUD()->tableLayout('fixed')
+ ->headerToolbar([
+
+ ])
+ ->filter($this->baseFilter()->labelWidth('80px')->body([
+ ]))
+ ->columns([
+
+ ]);
+
+ return $this->baseList($crud);
+ }
+
+ public function form($isEdit = false): Form
+ {
+ return $this->baseForm()->body([
+
+ ]);
+ }
+
+ public function detail()
+ {
+ $form = amisMake()->form()->title('')->panelClassName('border-r border-t-0 border-b-0 border-l-0')->mode('horizontal')
+ ->static(true)->actions([])
+ ->body([
+
+ ]);
+
+ return amisMake()->Grid()->columns([
+ amis()->Column()->body($form)->md(4),
+ amis()->Column()->body([
+ ])->md(8),
+ ]);
+ }
+
+ public function detailActions()
+ {
+ return [
+ //返回
+ amis()->Button()->actionType('cancel')->label(__('admin.back'))->primary()
+ ];
+ }
+}
\ No newline at end of file
diff --git a/app/Admin/routes.php b/app/Admin/routes.php
index 69c979c..3763979 100644
--- a/app/Admin/routes.php
+++ b/app/Admin/routes.php
@@ -34,10 +34,14 @@ Route::group([
$router->resource('users', \App\Admin\Controllers\UserController::class)->only(['index', 'show']);
+ $router->post('activities/{activity}/finish', [\App\Admin\Controllers\ActivityController::class, 'finish']);
$router->resource('activities', \App\Admin\Controllers\ActivityController::class);
+ $router->post('activity_games/{activity_game}/finish', [\App\Admin\Controllers\ActivityGameController::class, 'finish']);
$router->resource('activity_games', \App\Admin\Controllers\ActivityGameController::class);
+ $router->resource('activity_gifts', \App\Admin\Controllers\ActivityGiftController::class);
+
//修改上传
$router->post('upload_file', [\App\Admin\Controllers\IndexController::class, 'uploadFile']);
$router->post('upload_image', [\App\Admin\Controllers\IndexController::class, 'uploadImage']);
diff --git a/app/Models/Activity.php b/app/Models/Activity.php
index 2537b82..02597e7 100644
--- a/app/Models/Activity.php
+++ b/app/Models/Activity.php
@@ -16,4 +16,14 @@ class Activity extends Model
->orderBy('end_at', 'desc')
->orderBy('created_at', 'desc');
}
+
+ public function gifts()
+ {
+ return $this->hasMany(ActivityGift::class, 'activity_id');
+ }
+
+ public function logs()
+ {
+ return $this->hasMany(UserActivity::class, 'activity_id');
+ }
}
diff --git a/app/Models/ActivityGame.php b/app/Models/ActivityGame.php
index 8dd4ed7..b33b477 100644
--- a/app/Models/ActivityGame.php
+++ b/app/Models/ActivityGame.php
@@ -10,8 +10,22 @@ class ActivityGame extends Model
{
use HasFactory,Filterable;
+ protected $fillable = [
+ 'state', 'score',
+ ];
+
public function scopeSort($q)
{
-
+ $q->orderBy('game_at', 'desc');
+ }
+
+ public function logs()
+ {
+ return $this->hasMany(UserGame::class, 'game_id');
+ }
+
+ public function activity()
+ {
+ return $this->belongsTo(Activity::class, 'activity_id');
}
}
diff --git a/app/Models/ActivityGift.php b/app/Models/ActivityGift.php
index 667ed52..ebfff84 100644
--- a/app/Models/ActivityGift.php
+++ b/app/Models/ActivityGift.php
@@ -4,8 +4,14 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
+use EloquentFilter\Filterable;
class ActivityGift extends Model
{
- use HasFactory;
+ use HasFactory,Filterable;
+
+ public function scopeSort($q)
+ {
+ $q->orderBy('rank', 'asc');
+ }
}
diff --git a/app/Models/Filters/ActivityGameFilter.php b/app/Models/Filters/ActivityGameFilter.php
new file mode 100644
index 0000000..f8a1615
--- /dev/null
+++ b/app/Models/Filters/ActivityGameFilter.php
@@ -0,0 +1,17 @@
+where('id', $id);
+ }
+}
diff --git a/app/Models/Filters/ActivityGiftFilter.php b/app/Models/Filters/ActivityGiftFilter.php
new file mode 100644
index 0000000..7f250c7
--- /dev/null
+++ b/app/Models/Filters/ActivityGiftFilter.php
@@ -0,0 +1,17 @@
+where('id', $id);
+ }
+}
diff --git a/app/Models/UserActivity.php b/app/Models/UserActivity.php
index dd162d7..85434f7 100644
--- a/app/Models/UserActivity.php
+++ b/app/Models/UserActivity.php
@@ -8,4 +8,15 @@ use Illuminate\Database\Eloquent\Model;
class UserActivity extends Model
{
use HasFactory;
+
+ protected $fillable = [
+ 'mark','has_gift'
+ ];
+
+ public function scopeSort($q)
+ {
+ $q->orderBy('mark', 'desc')
+ ->orderBy('right_time', 'desc')
+ ->orderBy('last_join_at', 'asc');
+ }
}
diff --git a/app/Models/UserGame.php b/app/Models/UserGame.php
index 348edf3..b5185bf 100644
--- a/app/Models/UserGame.php
+++ b/app/Models/UserGame.php
@@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model;
class UserGame extends Model
{
use HasFactory;
+
+ protected $fillable = [
+ 'is_right'
+ ];
}
diff --git a/app/Services/Admin/ActivityGameService.php b/app/Services/Admin/ActivityGameService.php
new file mode 100644
index 0000000..6f11815
--- /dev/null
+++ b/app/Services/Admin/ActivityGameService.php
@@ -0,0 +1,106 @@
+getTableColumns();
+ $model = $this->getModel();
+
+ $data['home_logo'] = $this->saveImage('home_logo', 'activity_games/home_logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
+ $data['away_logo'] = $this->saveImage('away_logo', 'activity_games/away_logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
+
+ foreach ($data as $k => $v) {
+ if (!in_array($k, $columns)) {
+ continue;
+ }
+
+ $model->setAttribute($k, $v);
+ }
+
+ return $model->save();
+ }
+
+ public function update($primaryKey, $data): bool
+ {
+ $columns = $this->getTableColumns();
+ $model = $this->query()->whereKey($primaryKey)->first();
+
+ if(array_key_exists('home_logo', $data)){
+ $data['home_logo'] = $this->saveImage('home_logo', 'activity_games/home_logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
+ }
+ if(array_key_exists('away_logo', $data)){
+ $data['away_logo'] = $this->saveImage('away_logo', 'activity_games/away_logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
+ }
+
+ foreach ($data as $k => $v) {
+ if (!in_array($k, $columns)) {
+ continue;
+ }
+
+ $model->setAttribute($k, $v);
+ }
+
+ return $model->save();
+ }
+
+
+ public function delete(string $ids): mixed
+ {
+ $ids = explode(',', $ids);
+ //判断活动未发布,才可删除
+ if($this->query()->whereIn('id', $ids)->where('state', '<>', 0)->exists()){
+ $this->setError('已发布竞猜不能删除');
+ }
+ return $this->query()->whereIn('id', $ids)->delete();
+ }
+
+ public function finishGame(ActivityGame $activityGame, $score)
+ {
+ try{
+ DB::beginTransaction();
+ //更新状态,结果
+ $activityGame->update([
+ 'state' => 2,
+ 'score' => $score
+ ]);
+ $activityGame->logs()->where('score', $score)->update(['is_right'=>1]);
+ $activityGame->activity->logs()->whereIn('user_id',
+ $activityGame->logs()->where('score', $score)->get()->pluck('user_id')->toArray()
+ )
+ ->incrementEach([
+ 'mark'=> $activityGame->mark,
+ 'right_time'=> 1
+ ]);
+
+ DB::commit();
+ }catch(Throwable $th){
+ DB::rollBack();
+ report($th);
+ return $this->setError('系统错误,请刷新后重试');
+ }
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/app/Services/Admin/ActivityGiftService.php b/app/Services/Admin/ActivityGiftService.php
new file mode 100644
index 0000000..ea77338
--- /dev/null
+++ b/app/Services/Admin/ActivityGiftService.php
@@ -0,0 +1,61 @@
+getTableColumns();
+ $model = $this->getModel();
+
+ $data['logo'] = $this->saveImage('logo', 'activity_gifts/logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
+
+ foreach ($data as $k => $v) {
+ if (!in_array($k, $columns)) {
+ continue;
+ }
+
+ $model->setAttribute($k, $v);
+ }
+
+ return $model->save();
+ }
+
+ public function update($primaryKey, $data): bool
+ {
+ $columns = $this->getTableColumns();
+ $model = $this->query()->whereKey($primaryKey)->first();
+
+ if(array_key_exists('logo', $data)){
+ $data['logo'] = $this->saveImage('logo', 'activity_gifts/logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
+ }
+
+ foreach ($data as $k => $v) {
+ if (!in_array($k, $columns)) {
+ continue;
+ }
+
+ $model->setAttribute($k, $v);
+ }
+
+ return $model->save();
+ }
+
+}
\ No newline at end of file
diff --git a/app/Services/Admin/ActivityService.php b/app/Services/Admin/ActivityService.php
index fe6a3c8..c16f457 100644
--- a/app/Services/Admin/ActivityService.php
+++ b/app/Services/Admin/ActivityService.php
@@ -69,4 +69,45 @@ class ActivityService extends BaseService
}
return $this->query()->whereIn('id', $ids)->delete();
}
+
+ public function finishActivity(Activity $activity)
+ {
+ try{
+ DB::beginTransaction();
+ //更新活动状态;
+ $activity->update(['state' => 2]);
+ //获取活动奖品;
+ $activityGifts = $activity->gifts()->sort()->get();
+ //获取当前排名;
+ $activityRanklist = $activity->logs()->sort()->get();
+ //组装获奖名单,并批量插入;
+ $userGifts = $userIds = [];
+ foreach($activityGifts as $gift){
+ $_userGift = [
+ 'user_id' => $activityRanklist->get($gift->rank -1)?->user_id ?? 0,
+ 'activity_id' => $activity->id,
+ 'gift_id' => $gift->id,
+ ];
+ if($_userGift['user_id']){
+ $userGifts[] = $_userGift;
+ $userIds[] = $_userGift['user_id'];
+ }
+ }
+ if(count($userGifts) > 0){
+ DB::table('user_gifts')->insert($userGifts);
+ }
+ //更新活动记录;
+ $activity->logs()->whereIn('user_id', $userIds)->update([
+ 'has_gift' => 1
+ ]);
+
+ DB::commit();
+ }catch(Throwable $th){
+ DB::rollBack();
+ report($th);
+ return $this->setError('系统错误,请刷新后重试');
+ }
+
+ return true;
+ }
}
\ No newline at end of file
diff --git a/database/migrations/2024_05_16_153926_create_user_activities_table.php b/database/migrations/2024_05_16_153926_create_user_activities_table.php
index 94b0821..367fdad 100644
--- a/database/migrations/2024_05_16_153926_create_user_activities_table.php
+++ b/database/migrations/2024_05_16_153926_create_user_activities_table.php
@@ -21,6 +21,8 @@ return new class extends Migration
$table->timestamp('last_join_at')->comment('最后一次竞猜时间');
$table->unsignedTinyInteger('has_gift')->default(0)->comment('是否获奖');
$table->timestamps();
+
+ $table->unique(['user_id', 'activity_id']);
});
}
diff --git a/database/migrations/2024_05_16_154821_create_user_games_table.php b/database/migrations/2024_05_16_154821_create_user_games_table.php
index b2a0c50..d241150 100644
--- a/database/migrations/2024_05_16_154821_create_user_games_table.php
+++ b/database/migrations/2024_05_16_154821_create_user_games_table.php
@@ -20,6 +20,8 @@ return new class extends Migration
$table->enum('score', Score::options())->nullable()->comment('竞猜结果');
$table->unsignedTinyInteger('is_right')->default(0)->comment('是否答对');
$table->timestamps();
+
+ $table->unique(['user_id', 'game_id']);
});
}
diff --git a/lang/zh_CN/admin.php b/lang/zh_CN/admin.php
index d749229..5caa4ac 100644
--- a/lang/zh_CN/admin.php
+++ b/lang/zh_CN/admin.php
@@ -321,7 +321,8 @@ return [
'start_at' => '开始时间',
'end_at' => '结束时间',
'rules' => '规则内容',
- 'cover' => '活动封面'
+ 'cover' => '活动封面',
+ 'user_count' => '参与人数'
],
'activity_games' => [
'name' => '场次名称',
@@ -330,7 +331,13 @@ return [
'away' => '客场',
'away_logo' => '客场logo',
'game_at' => '比赛时间',
- 'mark' => '分数',
- 'score' => '比赛结果'
- ]
+ 'mark' => '奖励',
+ 'score' => '比分'
+ ],
+ 'activity_gifts' => [
+ 'name' => '奖品名称',
+ 'logo' => '奖品图片',
+ 'rank' => '奖励名次',
+ 'explain' => '领奖说明',
+ ],
];
diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore
index d6b7ef3..221ee11 100755
--- a/storage/app/public/.gitignore
+++ b/storage/app/public/.gitignore
@@ -1,2 +1,4 @@
*
+!images/
+!images/default-gamelogo.png
!.gitignore
diff --git a/storage/app/public/images/default-gamelogo.png b/storage/app/public/images/default-gamelogo.png
new file mode 100644
index 0000000..2c0baf1
Binary files /dev/null and b/storage/app/public/images/default-gamelogo.png differ