- Add Jeux - instantWin

This commit is contained in:
Vincent BRIDIER 2020-05-28 11:25:32 +02:00
parent cf3dcb0132
commit d68829921d
9 changed files with 238 additions and 18 deletions

View file

@ -0,0 +1,64 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class GamesController extends Controller
{
public function index(Request $request) {
return view('games.index');
}
public function instantWin(Request $request) {
return view('games.instant-win');
}
public function instantWinGenerate(Request $request) {
$start_date = $request->start_date;
$end_date = $request->end_date;
$lots = $request->lots;
$lots = json_decode($lots, true);
$begin = new \DateTime( $start_date );
$end = new \DateTime( $end_date );
$end = $end->modify( '+1 day' );
$interval = new \DateInterval('P1D');
$daterange = new \DatePeriod($begin, $interval ,$end);
$dateGlobal = [];
$lotsGlobal = [];
foreach ($lots as $k => $lot)
for ($i = 0; $i < $lot['qty']; $i++)
$lotsGlobal[] = ['id' => $lot['id'], 'name' => $lot['name'], 'hour' => str_pad(mt_rand(6, 22), 2, "0", STR_PAD_LEFT) . ":" . str_pad(mt_rand(0, 59), 2, "0", STR_PAD_LEFT) . ":00"];
shuffle($lotsGlobal);
foreach($daterange as $date)
array_push($dateGlobal, ['date' => $date->format("Y-m-d"), 'lots' => []]);
$res = $this->generate($lotsGlobal,$dateGlobal, 0);
return redirect()->route('games.instantwin')->with('generated', $res);
}
private function generate($lotsGlobal, $dateGlobal, $lotsDone){
$rKey = array_rand($dateGlobal, 1);
if ($lotsDone < count($dateGlobal)) {
if (count($dateGlobal[$rKey]['lots']) > 0) {
return $this->generate($lotsGlobal, $dateGlobal, $lotsDone);
}
}
array_push($dateGlobal[$rKey]['lots'], $lotsGlobal[$lotsDone++]);
if ($lotsDone < count($lotsGlobal)) {
return $this->generate($lotsGlobal, $dateGlobal, $lotsDone);
}
foreach ($dateGlobal as $k => $date)
usort($dateGlobal[$k]['lots'], [$this, 'sortFunction']);
return $dateGlobal;
}
private function sortFunction( $a, $b ) {
return strtotime($a["hour"]) - strtotime($b["hour"]);
}
}

2
public/js/app.js vendored

File diff suppressed because one or more lines are too long

1
resources/js/app.js vendored
View file

@ -22,6 +22,7 @@ window.Vue = require('vue');
Vue.component('otp-form', require('./components/OTPFormComponent.vue').default);
Vue.component('login-id', require('./components/LoginIDComponent.vue').default);
Vue.component('wp-auto-login', require('./components/WPAutoLoginComponent.vue').default);
Vue.component('instant-win', require('./components/InstantWinComponent.vue').default);
/**
* Next, we will create a fresh Vue application instance and attach it to

View file

@ -0,0 +1,77 @@
<template>
<div>
<form :action="route" method="POST">
<input type="hidden" name="_token" :value="csrf">
<div class="row">
<div class="col-md-6">
<label>Début du jeu :</label>
<input type="date" v-model="start_date" name="start_date" class="form-control" required>
</div>
<div class="col-md-6">
<label>Fin du jeu :</label>
<input type="date" v-model="end_date" name="end_date" class="form-control" required>
</div>
</div>
<div class="row"style="margin-top: 10px;">
<div v-if="datas.length > 0" class="col-md-12">
<div class="row" v-for="(item, index) in datas">
<div class="col-md-2">
<div class="form-group">
<input v-model="item.id" type="text" placeholder="ID du lot" class="form-control" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<input v-model="item.name" type="text" placeholder="Libelle du lot" class="form-control" required>
</div>
</div>
<div class="col-md-2">
<div class="form-group">
<input v-model="item.qty" type="number" step="1" placeholder="Qté" class="form-control" required>
</div>
</div>
<div class="col-md-2">
<a @click="removeItem(index)" href="#" class="btn btn-danger"><i class="fas fa-times"></i></a>
</div>
</div>
</div>
<div class="col-md-12 text-center">
<button @click="newItem" class="btn btn-primary" type="button"><i class="fas fa-plus"></i></button>
<input type="hidden" name="lots" :value="JSON.stringify(datas)" required>
</div>
</div>
<div v-if="datas.length > 0" class="row" style="margin-top: 10px;">
<div class="col-md-12 text-center">
<button class="btn btn-success" type="submit"><i class="fas fa-cog"></i> Générer</button>
</div>
</div>
</form>
</div>
</template>
<script>
export default {
mounted() {
console.log('Instant Win Component mounted.');
},
props: [
'csrf',
'route'
],
data() {
return {
datas: [],
start_date: '',
end_date: '',
}
},
methods: {
newItem() {
this.datas.push({id: '', name: '', qty: ''});
},
removeItem(index) {
this.datas.splice(index, 1);
}
}
}
</script>

View file

@ -0,0 +1,29 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Jeux</div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
<div class="row">
<div class="col-md-12 d-flex justify-content-around">
<a href="{{route('games.instantwin')}}" class="btn btn-lg btn-primary">
<i class="far fa-list-alt"></i><br>
Instants Gagnants
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View file

@ -0,0 +1,42 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12">
<div class="card">
<div class="card-header">Jeux - Instants Gagnants</div>
<div class="card-body">
@if (!session('generated'))
<div class="row">
<div class="col-md-12 d-flex justify-content-around">
<instant-win route="{{route('games.instantwin-generate')}}" csrf="{{ csrf_token() }}"></instant-win>
</div>
</div>
@endif
@if (session('generated'))
<div class="row">
<div class="col-md-4">
@foreach(session('generated') as $date)
@foreach($date['lots'] as $lot)
Le {{ date('d/m/Y', strtotime($date['date'])) }} à {{$lot['hour']}} : {{$lot['name']}} <br>
@endforeach
@endforeach
</div>
<div class="col-md-8">
@foreach(session('generated') as $date)
@foreach($date['lots'] as $lot)
INSERT INTO ldcjeux_instantgagnant VALUES (0, {{$lot['id']}}, '{{$date['date']}} {{$lot['hour']}}', 0, 0);
<br>
@endforeach
@endforeach
</div>
</div>
@endif
</div>
</div>
</div>
</div>
</div>
@endsection

View file

@ -47,6 +47,10 @@
<i class="fas fa-network-wired"></i><br>
Réseau LDC
</a>
<a href="{{route('games.index')}}" class="btn btn-lg btn-primary">
<i class="fas fa-dice"></i><br>
Jeux
</a>
</div>
</div>
</div>

View file

@ -43,27 +43,26 @@
<li class="nav-item">
<a href="/" class="nav-link">Dashboard</a>
</li>
<li class="nav-item">
<a href="/projects" class="nav-link">EDL Web</a>
</li>
<li class="nav-item">
<a href="/servers" class="nav-link">Serveurs</a>
</li>
<li class="nav-item">
<a href="/dpccs" class="nav-link">Datastores PCC</a>
</li>
<li class="nav-item">
<a href="/domain-names" class="nav-link">Noms de domaine</a>
</li>
<li class="nav-item">
<a href="{{route('email-addresses.index')}}" class="nav-link">Adresses email</a>
</li>
<li class="nav-item">
<a href="{{route('ldc-networks.index')}}" class="nav-link">Réseau LDC</a>
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
Infra<span class="caret"></span>
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="/projects" class="nav-link">EDL Web</a>
<a class="dropdown-item" href="/servers" class="nav-link">Serveurs</a>
<a class="dropdown-item" href="/dpccs" class="nav-link">Datastores PCC</a>
<a class="dropdown-item" href="/domain-names" class="nav-link">Noms de domaine</a>
<a class="dropdown-item" href="{{route('email-addresses.index')}}" class="nav-link">Adresses email</a>
<a class="dropdown-item" href="{{route('ldc-networks.index')}}" class="nav-link">Réseau LDC</a>
</div>
</li>
<li class="nav-item">
<a href="/status-checker" class="nav-link">Status Checker</a>
</li>
<li class="nav-item">
<a href="/games" class="nav-link">Jeux</a>
</li>
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
{{ Auth::user()->firstname }} {{ Auth::user()->lastname }}<span class="caret"></span>

View file

@ -69,4 +69,8 @@ Route::group(['middleware' => ['auth']], function () {
Route::post('/ldc-networks/{id}/update', 'LDCNetworkController@update')->name('ldc-networks.update');
Route::get('/ldc-networks/{id}/delete', 'LDCNetworkController@delete')->name('ldc-networks.delete');
Route::post('/ldc-networks/{id}/force-delete', 'LDCNetworkController@forceDelete')->name('ldc-networks.force-delete');
/* JEUX */
Route::get('/games', 'GamesController@index')->name('games.index');
Route::get('/games/instant-win', 'GamesController@instantWin')->name('games.instantwin');
Route::post('/games/instant-win/generate', 'GamesController@instantWinGenerate')->name('games.instantwin-generate');
});