Compare commits
	
		
			No commits in common. "master" and "feature-rating" have entirely different histories.
		
	
	
		
			master
			...
			feature-ra
		
	
		
|  | @ -1,44 +0,0 @@ | |||
| name: Deploy Wishlist | ||||
| on: | ||||
|   push: | ||||
|     branches: [ master ] | ||||
|      | ||||
| env: | ||||
|   DEPLOY_DIR: ${{ secrets.DEPLOY_DIR }} | ||||
| 
 | ||||
| jobs: | ||||
|   deploy: | ||||
|     runs-on: ubuntu | ||||
|     steps: | ||||
|       - name: Checkout code | ||||
|         uses: actions/checkout@v3 | ||||
|          | ||||
|       - name: Create .env file from secrets | ||||
|         run: |  | ||||
|           echo "$ENV_PROD" > .env | ||||
|           if [ ! -s .env ]; then | ||||
|             echo "Error: .env file is empty!" | ||||
|             exit 1 | ||||
|           fi | ||||
|         env: | ||||
|           ENV_PROD: ${{ secrets.ENV_PROD }} | ||||
| 
 | ||||
|       - name: Install PHP dependencies | ||||
|         run: composer install | ||||
| 
 | ||||
|       - name: Install Node.js dependencies | ||||
|         run: npm i | ||||
| 
 | ||||
|       - name: Build assets | ||||
|         run: npm run build | ||||
|          | ||||
|       - name: Copy files to deployment directory | ||||
|         run: |  | ||||
|           chmod -R 777 ./ | ||||
|           sudo rsync -av ./ ${DEPLOY_DIR}/ | ||||
| 
 | ||||
|       - name: Restart PHP service | ||||
|         run: sudo systemctl restart php8.2-fpm | ||||
| 
 | ||||
|       - name: Restart Nginx | ||||
|         run: sudo systemctl restart nginx | ||||
|  | @ -17,5 +17,3 @@ yarn-error.log | |||
| /.fleet | ||||
| /.idea | ||||
| /.vscode | ||||
| composer.lock | ||||
| package-lock.json | ||||
|  |  | |||
|  | @ -1,15 +0,0 @@ | |||
| <?php | ||||
| 
 | ||||
| namespace App\Http\Controllers; | ||||
| 
 | ||||
| use App\Models\ServicesLink; | ||||
| use Illuminate\Http\Request; | ||||
| 
 | ||||
| class ServiceLinksController extends Controller | ||||
| { | ||||
|     public function index() | ||||
|     { | ||||
|         $links = new ServicesLink(); | ||||
|         return $links->all(); | ||||
|     } | ||||
| } | ||||
|  | @ -1,11 +0,0 @@ | |||
| <?php | ||||
| 
 | ||||
| namespace App\Models; | ||||
| 
 | ||||
| use Illuminate\Database\Eloquent\Factories\HasFactory; | ||||
| use Illuminate\Database\Eloquent\Model; | ||||
| 
 | ||||
| class ServicesLink extends Model | ||||
| { | ||||
|     use HasFactory; | ||||
| } | ||||
|  | @ -1,29 +0,0 @@ | |||
| <?php | ||||
| 
 | ||||
| use Illuminate\Database\Migrations\Migration; | ||||
| use Illuminate\Database\Schema\Blueprint; | ||||
| use Illuminate\Support\Facades\Schema; | ||||
| 
 | ||||
| return new class extends Migration | ||||
| { | ||||
|     /** | ||||
|      * Run the migrations. | ||||
|      */ | ||||
|     public function up(): void | ||||
|     { | ||||
|         Schema::create('services_links', function (Blueprint $table) { | ||||
|             $table->id(); | ||||
|             $table->string('name', 255); | ||||
|             $table->string('link', 255); | ||||
|             $table->timestamps(); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Reverse the migrations. | ||||
|      */ | ||||
|     public function down(): void | ||||
|     { | ||||
|         Schema::dropIfExists('services_links'); | ||||
|     } | ||||
| }; | ||||
|  | @ -8,32 +8,3 @@ .box-gradient { | |||
|         #F6D242) border-box; | ||||
|     border-radius: 14px; | ||||
| } | ||||
| 
 | ||||
| .neon-text { | ||||
|     color: #fff!important; | ||||
|     text-shadow: | ||||
|         0 0 3px #fff, | ||||
|         0 0 5px #fff, | ||||
|         0 0 11px #fff, | ||||
|         0 0 16px #bc13fe, | ||||
|         0 0 20px #bc13fe, | ||||
|         0 0 26px #bc13fe, | ||||
|         0 0 30px #bc13fe, | ||||
|         0 0 34px #bc13fe !important; | ||||
| } | ||||
| 
 | ||||
| .neon-border { | ||||
|     border: 0.2rem solid #fff !important; | ||||
|     border-radius: 2rem !important; | ||||
|     box-shadow: 0 0 .2rem #fff, | ||||
|     0 0 .2rem #fff, | ||||
|     0 0 2rem #bc13fe, | ||||
|     0 0 0.8rem #bc13fe, | ||||
|     0 0 2.8rem #bc13fe, | ||||
|     inset 0 0 1.3rem #bc13fe !important; | ||||
|     animation: pulsate 1.5s infinite alternate !important; | ||||
| } | ||||
| 
 | ||||
| .white-text { | ||||
|     color: white!important; | ||||
| } | ||||
|  |  | |||
|  | @ -1,18 +0,0 @@ | |||
| import './js/bootstrap'; | ||||
| import { createApp } from 'vue' | ||||
| import { createPinia } from 'pinia' | ||||
| import App from './views/ServiceLinks/ServicesLinks.vue' | ||||
| import { createVuetify } from 'vuetify' | ||||
| import 'vuetify/styles' | ||||
| import * as components from 'vuetify/components' | ||||
| import * as directives from 'vuetify/directives' | ||||
| import '@mdi/font/css/materialdesignicons.css' | ||||
| 
 | ||||
| const pinia = createPinia(); | ||||
| 
 | ||||
| const vuetify = createVuetify({ | ||||
|     components, | ||||
|     directives | ||||
| }); | ||||
| 
 | ||||
| createApp(App).use(vuetify).use(pinia).mount("#app"); | ||||
|  | @ -1,21 +0,0 @@ | |||
| import {defineStore} from "pinia"; | ||||
| import axios from "axios"; | ||||
| 
 | ||||
| export const useServicesList = defineStore('services_list', { | ||||
|     state: () => ({ | ||||
|         links: Object | ||||
|     }), | ||||
|     getters: { | ||||
| 
 | ||||
|     }, | ||||
|     actions: { | ||||
|         async getList(){ | ||||
|             await axios | ||||
|                 .get('/api/v1/services_list') | ||||
|                 .then((response) => { | ||||
|                     this.links = response.data; | ||||
|                 }); | ||||
|         } | ||||
| 
 | ||||
|     }, | ||||
| }) | ||||
|  | @ -1,10 +1,10 @@ | |||
| <template> | ||||
|     <v-sheet class="bg-grey-darken-3 mt-5 mb-5 rounded-lg w-75 pl-3"> | ||||
|         <p class="neon-text text-xl-h3 text-lg-h3 text-md-h4 text-sm-h4 text-h5 ma-5">Расписание стримов</p> | ||||
|         <v-skeleton-loader v-if="fetching" type="text" class="bg-grey-darken-3"/> | ||||
|         <p v-else class="neon-text ma-5 text-xl-h3 text-lg-h3 text-md-h4 text-sm-h4 text-h5"> {{ parseDate(dates[0].current_date) }} - {{ parseDate(dates[1].current_date) }}</p> | ||||
|     <v-sheet class="mt-5 mb-5 rounded-lg w-75"> | ||||
|         <p class="text-xl-h3 text-lg-h3 text-md-h4 text-sm-h4 text-h5 ma-5">Расписание стримов</p> | ||||
|         <v-skeleton-loader v-if="fetching" type="text" /> | ||||
|         <p v-else class="ma-5 text-xl-h3 text-lg-h3 text-md-h4 text-sm-h4 text-h5"> {{ parseDate(dates[0].current_date) }} - {{ parseDate(dates[1].current_date) }}</p> | ||||
|         <ScheduleTable :is-wide="isWide"/> | ||||
|         <p class="neon-text text-xl-h3 text-lg-h3 text-md-h4 text-sm-h4 text-h5 ma-5">Ссылочки</p> | ||||
|         <p class="text-xl-h3 text-lg-h3 text-md-h4 text-sm-h4 text-h5 ma-5">Ссылочки</p> | ||||
|         <Links :is-wide="isWide"/> | ||||
|         <AdditionalButtons :is-wide="isWide"/> | ||||
|     </v-sheet> | ||||
|  |  | |||
|  | @ -52,39 +52,39 @@ export default { | |||
| <template> | ||||
|     <div class="w-100 d-flex justify-space-evenly" :class="isWide ? '' : 'flex-column'"> | ||||
|         <v-btn | ||||
|             class="bg-grey-darken-3 neon-border pt-3 pb-3 pl-3 pr-3 mt-7 mb-7 mr-5 ml-5 h-auto" | ||||
|             class="box-gradient pt-2 pb-2 ma-5 h-auto" | ||||
|             text="Кинуть копеечку" | ||||
|             href="https://www.donationalerts.com/r/dhaverd" | ||||
|             target="_blank" | ||||
|         /> | ||||
|         <v-btn | ||||
|             class="bg-grey-darken-3 neon-border pt-3 pb-3 pl-3 pr-3 mt-7 mb-7 mr-5 ml-5 h-auto" | ||||
|             class="box-gradient pt-2 pb-2 ma-5 h-auto" | ||||
|             text="Оставить отзыв" | ||||
|             @click="onShowModal" | ||||
|         /> | ||||
|     </div> | ||||
|     <v-dialog v-model="showModal" class="align-center" :class="isWide ? 'w-50' : 'w-100 h-100'"> | ||||
|         <v-sheet class="mt-5 mb-5 pa-5 h-auto rounded-lg bg-grey-darken-3 neon-border d-flex flex-column"> | ||||
|             <div class="w-100 d-flex justify-end bg-grey-darken-3"> | ||||
|                 <v-btn class="bg-grey-darken-3" icon="mdi-window-close" elevation="0" @click="onShowModal"/> | ||||
|         <v-sheet class="mt-5 mb-5 pa-5 h-auto rounded-lg d-flex flex-column"> | ||||
|             <div class="w-100 d-flex justify-end"> | ||||
|                 <v-btn icon="mdi-window-close" elevation="0" @click="onShowModal"/> | ||||
|             </div> | ||||
|             <v-label class="text-xl-h6 white-text ">Оцените канал:</v-label> | ||||
|             <v-rating v-model="rating" active-color="purple-darken-1"> | ||||
|             <v-label class="text-xl-h6">Оцените канал:</v-label> | ||||
|             <v-rating v-model="rating" active-color="orange-lighten-1"> | ||||
|                 sss | ||||
|             </v-rating> | ||||
|             <v-label class="text-xl-h6 mb-2 white-text ">Оставьте отзыв:</v-label> | ||||
|             <v-label class="text-xl-h6 mb-2">Оставьте отзыв:</v-label> | ||||
|             <v-textarea v-model="comment" clearable variant="outlined" label="Что можно улучшить?"/> | ||||
|             <div class="d-flex justify-center"> | ||||
|                 <v-btn class="bg-grey-darken-3 neon-border pt-3 pb-3 pl-3 pr-3 w-auto h-auto" @click="sendRating">Отправить</v-btn> | ||||
|                 <v-btn class="box-gradient pt-2 pb-2 w-auto h-auto" @click="sendRating">Отправить</v-btn> | ||||
|             </div> | ||||
|         </v-sheet> | ||||
|     </v-dialog> | ||||
|     <v-dialog v-model="afterModal" class="align-center" :class="isWide ? 'w-50' : 'w-100 h-100'"> | ||||
|         <v-sheet class="mt-5 mb-5 pa-5 h-auto rounded-lg bg-grey-darken-3 neon-border d-flex flex-column"> | ||||
|             <div class="w-100 d-flex justify-end bg-grey-darken-3"> | ||||
|                 <v-btn class="bg-grey-darken-3" icon="mdi-window-close" elevation="0" @click="onShowAfterModal"/> | ||||
|         <v-sheet class="mt-5 mb-5 pa-5 h-auto rounded-lg d-flex flex-column"> | ||||
|             <div class="w-100 d-flex justify-end"> | ||||
|                 <v-btn icon="mdi-window-close" elevation="0" @click="onShowAfterModal"/> | ||||
|             </div> | ||||
|             <v-label class="text-xl-h6 white-text justify-center">{{afterModalText}}</v-label> | ||||
|             <v-label class="text-xl-h6">{{afterModalText}}</v-label> | ||||
|         </v-sheet> | ||||
|     </v-dialog> | ||||
| </template> | ||||
|  |  | |||
|  | @ -23,11 +23,11 @@ | |||
| 
 | ||||
| <template> | ||||
|     <div class="w-100 d-flex justify-center"> | ||||
|         <v-list class="bg-grey-darken-3" :class="isWide ? 'w-66' : 'w-100'"> | ||||
|             <v-skeleton-loader v-if="fetching" type="list-item" class="bg-grey-darken-3 ml-1 mr-3"/> | ||||
|             <v-list-item v-else class="bg-grey-darken-3 neon-border mt-6 mb-7 ml-7 mr-7" elevation="0" v-for="link in links" :href="link.link"> <!-- style="background-color: #E57373; color: #FFFFFF" --> | ||||
|         <v-list :class="isWide ? 'w-66' : 'w-100'"> | ||||
|             <v-skeleton-loader v-if="fetching" type="list-item"/> | ||||
|             <v-list-item v-else class="ma-5 box-gradient" elevation="6" v-for="link in links" :href="link.link"> <!-- style="background-color: #E57373; color: #FFFFFF" --> | ||||
|                 <template v-slot:prepend> | ||||
|                     <v-avatar class="mt-1 mb-1 ml-5" :image="link.image" rounded="0"></v-avatar> | ||||
|                     <v-avatar :image="link.image" rounded="0"></v-avatar> | ||||
|                 </template> | ||||
|                 <v-list-item-title>{{ link.link_name }}</v-list-item-title> | ||||
|             </v-list-item> | ||||
|  |  | |||
|  | @ -28,9 +28,9 @@ | |||
| </script> | ||||
| 
 | ||||
| <template> | ||||
|     <div class="w-100 d-flex justify-center mt-6 mb-6"> | ||||
|         <v-skeleton-loader v-if="fetching" type="table" class="bg-grey-darken-3 mr-3 ml-1"/> | ||||
|         <v-table v-else class="bg-grey-darken-3 neon-border pa-3 ml-1 mr-3 text-xl-h5 text-lg-h5 text-md-h5 text-sm-h5 text-body-2" :class="isWide ? 'w-66' : 'w-100'"> | ||||
|     <div class="w-100 d-flex justify-center"> | ||||
|         <v-skeleton-loader v-if="fetching" type="table"/> | ||||
|         <v-table v-else class="text-xl-h5 text-lg-h5 text-md-h5 text-sm-h5  text-body-2" :class="isWide ? 'w-66' : 'w-100'"> | ||||
|             <tbody> | ||||
|             <tr v-for="schedule in schedules"> | ||||
|                 <td>{{ parseDate(schedule.current_date) }} {{ schedule.weekday_name }} {{ schedule.stream_time }}</td> | ||||
|  |  | |||
|  | @ -1,86 +0,0 @@ | |||
| <script> | ||||
| 
 | ||||
| import {ref} from "vue"; | ||||
| import {useServicesList} from "../../stores/services_list.js"; | ||||
| 
 | ||||
| export default { | ||||
|     name: "ServicesLinks", | ||||
|     data: () => ({ | ||||
|         links: ref([]), | ||||
|         servicesListStore: useServicesList(), | ||||
|         fetching: true, | ||||
|         windowHeight: document.documentElement.clientHeight, | ||||
|         windowWidth: document.documentElement.clientWidth, | ||||
|         isWide: window.innerWidth >= 654 | ||||
|     }), | ||||
|     mounted() { | ||||
|         this.fetching = true; | ||||
|         this.servicesListStore.getList().then(()=>{ | ||||
|             this.links = this.servicesListStore.links; | ||||
|             this.fetching = false; | ||||
|         }); | ||||
|         this.myEventHandler(); | ||||
|         window.addEventListener("resize", this.myEventHandler, { passive: true }); | ||||
|     }, | ||||
|     methods: { | ||||
|         myEventHandler(e) { | ||||
|             this.windowHeight = document.documentElement.clientHeight; | ||||
|             this.windowWidth = document.documentElement.clientWidth; | ||||
|             this.isWide = this.windowWidth >= 654; | ||||
|         } | ||||
|     }, | ||||
|     created() { | ||||
|         window.addEventListener("resize", this.myEventHandler); | ||||
|     }, | ||||
| } | ||||
| </script> | ||||
| 
 | ||||
| <template> | ||||
|     <v-app> | ||||
|         <v-sheet class="bg-gradient h-100 w-100 d-flex justify-center"> | ||||
|             <v-sheet class="bg-grey-darken-3 mt-5 mb-5 rounded-lg w-75 pl-3 pr-3"> | ||||
|                 <p class="text-xl-h3 text-lg-h3 text-md-h4 text-sm-h4 text-h5 text-center pt-3">Список сервисов и страниц</p> | ||||
|                 <v-skeleton-loader v-if="fetching" class="bg-grey-darken-3" type="card"/> | ||||
|                 <div class="pt-5 h-100" v-else> | ||||
|                     <v-row class="ma-0" v-for="n in Math.ceil(links.length / 3)" v-if="isWide"> | ||||
|                         <v-col class="d-flex justify-center align-center w-33" v-for="j in 3"> | ||||
|                             <v-btn v-if="links[(n - 1) * 3 + j - 1]" class="w-100 h-100 pa-5 text-white mt-5 mb-5 bg-btn text-center" :href="links[(n - 1) * 3 + j - 1].link" target="_blank"> | ||||
|                                 <template v-slot:default> | ||||
|                                     <span class="txt-wrap">{{ links[(n - 1) * 3 + j - 1].name }}</span> | ||||
|                                 </template> | ||||
|                             </v-btn> | ||||
|                         </v-col> | ||||
|                     </v-row> | ||||
|                     <div v-else class="ma-0"> | ||||
|                         <v-btn class="w-100 h-100 pa-5 text-white mt-5 mb-5 bg-btn text-center" v-for="link in links" :href="link.link" target="_blank"> | ||||
|                             <template v-slot:default> | ||||
|                                 <span class="txt-wrap">{{ link.name }}</span> | ||||
|                             </template> | ||||
|                         </v-btn> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </v-sheet> | ||||
|         </v-sheet> | ||||
|     </v-app> | ||||
| </template> | ||||
| 
 | ||||
| <style scoped> | ||||
| .bg-gradient { | ||||
|     --s: 50px; /* control the size */ | ||||
| 
 | ||||
|     --c: #E08E79 0 25%,#774F38 0 50%,#0000 0; | ||||
|     background: | ||||
|         conic-gradient(from 180deg,var(--c)) | ||||
|         0/var(--s) var(--s), | ||||
|         repeating-conic-gradient(from 90deg,var(--c)) | ||||
|         0/calc(3*var(--s)) calc(3*var(--s)) | ||||
| } | ||||
| 
 | ||||
| .bg-btn { | ||||
|     background-color: #E08E79 | ||||
| } | ||||
| 
 | ||||
| .txt-wrap { | ||||
|     white-space: wrap!important; | ||||
| } | ||||
| </style> | ||||
|  | @ -1,13 +0,0 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> | ||||
|     <head> | ||||
|         <meta charset="utf-8"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|         <title>Services Links</title> | ||||
|         @vite('resources/service_links.js') | ||||
|         @vite('resources/css/app.css') | ||||
|     </head> | ||||
|     <body class="antialiased"> | ||||
|         <div id="app"></div> | ||||
|     </body> | ||||
| </html> | ||||
|  | @ -6,22 +6,6 @@ | |||
|         <title>Резюме</title> | ||||
|         @vite('resources/app.js') | ||||
|         @vite('resources/css/app.css') | ||||
|         <!-- Yandex.Metrika counter --> | ||||
|         <script type="text/javascript" > | ||||
|             (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; | ||||
|                 m[i].l=1*new Date(); | ||||
|                 for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} | ||||
|                 k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) | ||||
|             (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); | ||||
| 
 | ||||
|             ym(97497664, "init", { | ||||
|                 clickmap:true, | ||||
|                 trackLinks:true, | ||||
|                 accurateTrackBounce:true | ||||
|             }); | ||||
|         </script> | ||||
|         <noscript><div><img src="https://mc.yandex.ru/watch/97497664" style="position:absolute; left:-9999px;" alt="" /></div></noscript> | ||||
|         <!-- /Yandex.Metrika counter --> | ||||
|     </head> | ||||
|     <body class="antialiased"> | ||||
|         <div id="app"></div> | ||||
|  |  | |||
|  | @ -6,22 +6,6 @@ | |||
|     <title>Информация о трансляциях</title> | ||||
|     @vite('resources/welcome.js') | ||||
|     @vite('resources/css/app.css') | ||||
|     <!-- Yandex.Metrika counter --> | ||||
|     <script type="text/javascript" > | ||||
|         (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; | ||||
|             m[i].l=1*new Date(); | ||||
|             for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} | ||||
|             k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) | ||||
|         (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); | ||||
| 
 | ||||
|         ym(97497583, "init", { | ||||
|             clickmap:true, | ||||
|             trackLinks:true, | ||||
|             accurateTrackBounce:true | ||||
|         }); | ||||
|     </script> | ||||
|     <noscript><div><img src="https://mc.yandex.ru/watch/97497583" style="position:absolute; left:-9999px;" alt="" /></div></noscript> | ||||
|     <!-- /Yandex.Metrika counter --> | ||||
| </head> | ||||
| <body class="antialiased"> | ||||
| <div id="app"></div> | ||||
|  |  | |||
|  | @ -20,4 +20,3 @@ | |||
| Route::get('/dates', 'App\Http\Controllers\SchedulesController@mmDate')->name('dates'); | ||||
| Route::get('/phrases', 'App\Http\Controllers\BasyaPhrasesController@index')->name('phrases'); | ||||
| Route::post('/rating', 'App\Http\Controllers\RatingController@index')->name('rating'); | ||||
| Route::get('/services_list', 'App\Http\Controllers\ServiceLinksController@index')->name('services_list'); | ||||
|  |  | |||
|  | @ -14,10 +14,6 @@ | |||
| */ | ||||
| 
 | ||||
| Route::get('/', function () { | ||||
|     return view('ServiceLinks/links'); | ||||
| }); | ||||
| 
 | ||||
| Route::get('/schedule', function () { | ||||
|     return view('welcome'); | ||||
| }); | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,8 +12,7 @@ export default defineConfig({ | |||
|                 'resources/welcome.js', | ||||
|                 'resources/caesar.js', | ||||
|                 'resources/basya.js', | ||||
|                 'resources/friday.js', | ||||
|                 'resources/service_links.js' | ||||
|                 'resources/friday.js' | ||||
|             ], | ||||
|             refresh: true, | ||||
|         }), | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue