Cum să construiți un manager de muzică cu Nuxt.js și Express.js

Publicat: 2022-03-10
Rezumat rapid ↬ Acest articol prezintă modul în care Multer simplifică procesul de gestionare a încărcărilor de fișiere. De asemenea, prezintă modul de utilizare a Mongoose pentru a interacționa cu baza noastră de date prin construirea unei aplicații de gestionare a muzicii folosind Express.js împreună cu Multer pentru încărcarea muzicii și Nuxt.js (cadru Vista) pentru frontend-ul nostru.

Gestionarea activelor media digitale, cum ar fi audio și video în aplicația dvs., poate fi dificilă din cauza considerentelor care trebuie făcute la nivelul serverului (de exemplu, rețeaua, stocarea și natura asincronă a gestionării încărcărilor de fișiere). Cu toate acestea, putem folosi biblioteci precum Multer și Express.js pentru a ne simplifica fluxul de lucru pe backend în timp ce folosim Nuxt.js (cadru Vue) pentru a construi interacțiunile front-end.

Ori de câte ori un client web încarcă un fișier pe un server, acesta este, în general, trimis printr-un formular și codificat ca multipart/form-data . Multer este un middleware pentru Express.js și Node.js care facilitează gestionarea acestor așa-numite multipart/form-data ori de câte ori utilizatorii dvs. încarcă fișiere. În acest tutorial, voi explica cum puteți crea o aplicație de manager de muzică folosind Express.js cu Multer pentru a încărca muzică și Nuxt.js (cadru Vista) pentru frontend-ul nostru.

Cerințe preliminare

  • Familiaritate cu HTML, CSS și JavaScript (ES6+);
  • Node.js, npm și MongoDB instalate pe mașina dvs. de dezvoltare;
  • Cod VS sau orice editor de cod la alegere;
  • Cunoștințe de bază despre Express.js.
Mai multe după săritură! Continuați să citiți mai jos ↓

Construirea Serviciului Back-End

Să începem prin a crea un director pentru proiectul nostru navigând în director și lansând npm init -y pe terminalul tău pentru a crea un fișier package.json care gestionează toate dependențele pentru aplicația noastră.

 mkdir serverside && cd serverside npm init -y

Apoi, instalați multer , express și celelalte dependențe necesare pentru a porni o aplicație Express.js.

 npm install express multer nodemon mongoose cors morgan body-parser --save

Apoi, creați un fișier index.js :

 touch index.js

Apoi, în fișierul index.js , vom inițializa toate modulele, vom crea o aplicație Express.js și vom crea un server pentru conectarea la browsere:

 const express = require("express"); const PORT = process.env.PORT || 4000; const morgan = require("morgan"); const cors = require("cors"); const bodyParser = require("body-parser"); const mongoose = require("mongoose"); const config = require("./config/db"); const app = express(); //configure database and mongoose mongoose.set("useCreateIndex", true); mongoose .connect(config.database, { useNewUrlParser: true }) .then(() => { console.log("Database is connected"); }) .catch(err => { console.log({ database_error: err }); }); // db configuaration ends here //registering cors app.use(cors()); //configure body parser app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); //configure body-parser ends here app.use(morgan("dev")); // configire morgan // define first route app.get("/", (req, res) => { res.json("Hola MEVN devs...Assemble"); }); app.listen(PORT, () => { console.log(`App is running on ${PORT}`); });

În primul rând, introducem Express.js în proiect și apoi definim un port pe care va rula aplicația noastră. În continuare, aducem dependențele body-parser , morgan , mongoose și cors .

Apoi salvăm instanța expres într-o variabilă numită app . Putem folosi instanța app pentru a configura middleware în aplicația noastră la fel cum am configurat middleware-ul cors . De asemenea, folosim instanța app pentru a configura ruta rădăcină care va rula în portul pe care l-am definit.

Să creăm acum un folder /config pentru configurația bazei de date și multer config :

 mkdir config and cd config touch multer.js && touch db.js

Apoi deschideți config/db.js și adăugați următorul cod pentru a configura baza noastră de date:

 module.exports = { database: "mongodb://localhost:27017/", secret: "password" };

(Acesta este de fapt un obiect care deține adresa URL a bazei de date și secretul bazei de date.)

Rularea nodemon și navigarea la localhost:4000 pe browser ar trebui să vă ofere acest mesaj:

 "Hola MEVN devs...Assemble"

De asemenea, așa ar trebui să arate acum terminalul tău:

Rularea Nodemon folosind Terminalul
Previzualizare terminal (previzualizare mare)

Configurarea modelului, rutelor și controlerelor

Să setăm o structură de fișiere tastând următoarele:

 mkdir api && cd api mkdir model && cd model && touch Music.js cd .. mkdir controller && cd controller && touch musicController.js cd .. mkdir routes && cd routes && touch music.js

În terminalul nostru, folosim mkdir pentru a crea un director nou și apoi cd pentru a muta într-un director. Așa că începem prin a crea un director numit api și apoi trecem în directorul api .

Comanda touch este folosită pentru a crea un fișier nou în interiorul unui director folosind terminalul, în timp ce comanda cd este folosită pentru a muta dintr-un director.

Acum să trecem la fișierul nostru api/model/Music.js pentru a crea o schemă muzicală. Un model este o clasă cu care construim documente. În acest caz, fiecare document va fi o piesă muzicală cu proprietăți și comportamente așa cum sunt declarate în schema noastră:

 let mongoose = require("mongoose"); let musicSchema = mongoose.Schema({ title: { type: String, required: true }, music: { type: Object, required: true }, artist: { type: String, required: true }, created: { type: Date, default: Date.now() } }); let Music = mongoose.model("Music", musicSchema); module.exports = Music;

Să trecem la config/multer pentru a configura Multer:

 let multer = require("multer"); const path = require("path"); const storage = multer.diskStorage({ destination: (req, res, cb) => { cb(null, "./uploads"); }, filename: (req, file, cb) => { cb(null, new Date().toISOString() + file.originalname); } }); const fileFilter = (req, file, cb) => { if ( file.mimetype === "audio/mpeg" || file.mimetype === "audio/wave" || file.mimetype === "audio/wav" || file.mimetype === "audio/mp3" ) { cb(null, true); } else { cb(null, false); } }; exports.upload = multer({ storage: storage, limits: { fileSize: 1024 * 1024 * 5 }, fileFilter: fileFilter });

În fișierul multer.js , începem prin a configura un folder în care vor fi încărcate toate fișierele muzicale încărcate. Trebuie să facem acest fișier static, definindu-l în fișierul index.js :

 app.use('/uploads', express.static('uploads'));

După aceea, scriem un validator simplu care va verifica tipul mime al fișierului înainte de încărcare. multer apoi instanța mai multe adăugând locația de stocare, limitele fiecărui fișier și validatorul pe care l-am creat.

Creați rutele necesare

Acum să ne creăm rutele. Mai jos este lista de puncte finale pe care le vom crea.

HTTP POST /music Adăugați muzică nouă
HTTP GET /music Obțineți toată muzica
HTTP DELETE /music/:blogId Șterge o muzică

Să începem prin a crea traseul blogului. Mergeți la api/routes/music.js și scrieți următorul cod:

 const express = require("express"); const router = express.Router(); const musicController = require("../controller/musicController"); const upload = require("../../config/multer"); router.get("/", musicController.getAllMusics); router.post("/", upload.upload.single("music"), musicController.addNewMusic); router.delete("/:musicId", musicController.deleteMusic); module.exports = router;

Notă : Acum, ori de câte ori facem o solicitare de obținere la get /music . ruta apelează funcția getAllMusic care se află în fișierul „controllers”.

Să trecem la api/controllers/musicController pentru a defini controlerele. Începem prin a scrie o funcție pentru a obține toată muzica din baza noastră de date folosind metoda mongoose db.collection.find care va returna toate elementele din acea colecție.

După ce facem asta, scriem o altă funcție care va crea o bucată de muzică nouă în baza de date. Trebuie să creăm o nouă instanță muzicală folosind cuvântul cheie new și apoi să definim obiectul muzical. După ce facem acest lucru, vom folosi metoda de save a mangusta pentru a adăuga muzică nouă în baza de date.

Pentru a șterge o piesă muzicală, trebuie să folosim metoda de remove a mangustei prin simpla trecere a ID-ului muzicii ca parametru în instanța de remove . Astfel, mangusta caută colecția de muzică care are acel ID și apoi o elimină din acea colecție.

 let mongoose = require("mongoose"); const Music = require("../model/Music"); exports.getAllMusics = async (req, res) => { try { let music = await Music.find(); res.status(200).json(music); } catch (err) { res.status(500).json(err); } }; exports.addNewMusic = async (req, res) => { try { const music = new Music({ title:req.body.title, artist:req.body.artist, music:req.file }); let newMusic = await music.save(); res.status(200).json({ data: newMusic }); } catch (err) { res.status(500).json({ error: err }); } }; exports.deleteMusic = async (req, res) => { try { const id = req.params.musicId; let result = await Music.remove({ _id: id }); res.status(200).json(result); } catch (err) { res.status(500).json(err); } };

Nu în ultimul rând, pentru a testa rutele, trebuie să înregistrăm rutele muzicale în fișierul nostru index.js :

 const userRoutes = require("./api/user/route/user"); //bring in our user routes app.use("/user", userRoutes);

Testarea punctelor finale

Pentru a testa punctele noastre finale, vom folosi POSTMAN.

Adăugarea muzicii noi

Pentru a testa funcționalitatea Add Music , setați metoda solicitării făcând clic pe meniul drop-down cu metode. După ce faceți acest lucru, introduceți adresa URL a punctului final și apoi faceți clic pe fila Corp pentru a selecta modul în care doriți să trimiteți datele. (În cazul nostru, vom folosi metoda formular-date.)

Așadar, faceți clic pe datele-form și configurați cheia modelului. Pe măsură ce îl configurați, acordați cheilor o valoare, așa cum se arată în imaginea de mai jos:

Testare Adăugarea unui nou API pentru muzică folosind Postman
Testare Adăugarea unui nou API pentru muzică în tabloul de bord Postman (previzualizare mare)

După ce ați făcut acest lucru, faceți clic pe „Trimite” pentru a face cererea.

Listarea tuturor muzicii

Pentru a lista toată muzica din baza noastră de date, trebuie să introducem adresa URL a punctului final în secțiunea URL furnizată. După ce ați făcut acest lucru, faceți clic pe butonul „Trimite” pentru a face cererea.

Testarea API-ului Listing folosind Postman
Testarea API-ului Listing în tabloul de bord Postman (previzualizare mare)

Ștergerea muzicii

Pentru a șterge o piesă muzicală, trebuie să trecem music id ca parametru.

Testarea Delete API folosind Postman
Testare Delete API Postman tablou de bord (previzualizare mare)

Asta e!

Construirea Frontend-ului

Pentru frontend-ul nostru, vom folosi un framework Vue: Nuxt.js.

„Nuxt este un cadru progresiv bazat pe Vue.js pentru a crea aplicații web moderne. Se bazează pe bibliotecile oficiale Vue.js (vue, vue-router și vuex) și instrumente puternice de dezvoltare (webpack, Babel și PostCSS).”

— Ghidul NuxtJS

Pentru a crea o nouă aplicație Nuxt.js, deschideți terminalul și tastați următoarele (cu musicapp drept nume al aplicației pe care o vom construi):

 $ npx create-nuxt-app musicapp

În timpul procesului de instalare, ni se vor pune câteva întrebări referitoare la configurarea proiectului:

Project name aplicația muzicală
project description O aplicație simplă de gestionare a muzicii
Author name <numele tău>
Package manager npm
UI framework Vedere bootstrap
custom ui framework nici unul
Nuxt modules Axios,pwa (utilizați bara de spațiu de pe tastatură pentru a selecta elemente)
Linting tool Mai frumos
test framework Nici unul
Rendering Mode Universal (SSR)
development tool Jsonconfig.json

După ce am selectat toate acestea, trebuie să așteptăm puțin pentru ca proiectul să fie configurat. Odată ce este gata, treceți în folderul /project și serviți proiectul după cum urmează:

 cd musicapp && npm run dev

Deschideți proiectul în orice editor de cod la alegere și apoi deschideți proiectul în browser accesând localhost:3000 .

Previzualizare a proiectului Nuxt.js
Previzualizare proiect Nuxt.js (previzualizare mare)

Configurarea Axios

Vom folosi axios pentru a face o cerere HTTP către serverul nostru back-end. Axios este deja instalat în proiectul nostru, așa că trebuie doar să configuram baseURL -ul de bază - pe serverul nostru backend.

Pentru a face acest lucru, deschideți fișierul nuxt.config.js în directorul root și adăugați baseURL -ul de bază în obiectul axios .

 axios: { baseURL:'https://localhost:4000' },

Construirea Managerului Muzicii

Configurarea interfeței de utilizare

Să începem prin a curăța interfața de utilizare. Deschideți fișierul pages/index.vue și eliminați tot codul de acolo cu următoarele:

 <template> <div>Hello</div> </template>

După ce faceți acest lucru, ar trebui să puteți vedea doar „Bună ziua” în browser.

În directorul root , creați un folder /partials . În folderul /partials partials, creați un fișier navbar.vue și adăugați următorul cod:

 <template> <header> <nav class="navbar navbar-expand-lg navbar-light bg-info"> <div class="container"> <a class="navbar-brand" href="#">Music App</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation" > <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse justify-content-end"> <ul class="navbar-nav"> <li class="nav-item active"> <a class="nav-link" href="#">Player</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Manager</a> </li> </ul> </div> </div> </nav> </header> </template> <style scoped> .nav-link, .navbar-brand { color: #ffff !important; } </style>

Notă : Vom folosi componenta pentru a naviga prin paginile din aplicația noastră. Aceasta va fi doar o componentă simplă formată din bara de navigare Bootstrap navbar Consultați documentația oficială Bootstrap pentru mai multe referințe.

În continuare, să definim un aspect personalizat pentru aplicație. Deschideți folderul /layouts , înlocuiți codul din fișierul default.vue cu codul de mai jos.

 <template> <div> <navbar /> <nuxt /> </div> </template> <script> import navbar from '@/partial/navbar' export default { components: { navbar } } </script>

Importăm navbar în acest aspect, ceea ce înseamnă că toate paginile din aplicația noastră vor avea acea componentă navbar în ea. (Acesta va fi componenta pe care toate celelalte componente din aplicația noastră vor fi montate.)

După aceasta, ar trebui să puteți vedea acest lucru în browser:

Componenta Nuxt.js Navbar după modificare
Componenta Nuxt.js Navbar (previzualizare mare)

Acum să setăm interfața de utilizare pentru managerul nostru. Pentru a face acest lucru, trebuie să creăm un folder /manager în folderul componente și apoi să adăugăm un fișier în folderul numit manager.vue .

În acest fișier, adăugați următorul cod:

 <template> <section class="mt-5"> <div class="container mb-4"> <div class="row"> <div class="col-md-12"> <div class="card"> <div class="card-body"> <div class="card-title mb-4"> <h4>Add Music</h4> </div> <form> <div class="form-group"> <label for="title">Title</label> <input type="text" class="form-control" /> </div> <div class="form-group"> <label for="artist">Artist</label> <input type="text" class="form-control" /> </div> <div class="form-group"> <label for="artist">Music</label> <div class="custom-file"> <input type="file" class="custom-file-input" /> <label class="custom-file-label" for="customFile">Choose file</label> </div> </div> <div class="form-group"> <button class="btn btn-primary">Submit</button> </div> </form> </div> </div> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="card bg-light p-1 showdow-sm"> <div class="card-title"> <button class="btn btn-info m-3">Add Music</button> </div> <div class="card-body"> <table class="table"> <thead> <tr> <th scope="col">#</th> <th scope="col">Title</th> <th scope="col">Artist</th> <th scope="col">Date created</th> <th scope="col">Action</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Demo Title</td> <td>Wisdom.vue</td> <td>12/23/13</td> <td> <button class="btn btn-info">Delete</button> </td> </tr> </tbody> </table> </div> </div> </div> </div> </div> </section> </template>

Notă : Acesta este doar un șablon Bootstrap simplu pentru adăugarea de muzică în aplicația noastră. Formularul va defini un șablon de tabel care va lista toată muzica care poate fi găsită în baza noastră de date.

După definirea acestei componente, trebuie să o înregistrăm în folderul /pages pentru a iniția rutarea.

Nuxt.js nu are un fișier „router.js” precum Vue.js. Folosește folderul de pagini pentru rutare. Pentru mai multe detalii, vizitați site-ul web Nuxt.js.

Pentru a înregistra componenta, creați un folder /manager în folderul /pages și creați un fișier index.vue . Apoi, plasați următorul cod în interiorul fișierului:

 <template> <div> <manager /> </div> </template> <script> import manager from '@/components/manager/manager' export default { components: { manager } } </script>

Aceasta este componenta care se va reda în ruta pages noastre.

După ce ați făcut acest lucru, mergeți la browser și navigați la /manager - ar trebui să vedeți acest lucru:

Interfața de utilizare a managerului de muzică
Interfața de utilizare a managerului de muzică (previzualizare mare)

Listarea tuturor muzicii

Să continuăm prin a crea o funcție care va prelua toată muzica. Această funcție va fi înregistrată în hook-ul ciclului de viață creat, astfel încât de fiecare dată când componenta este creată, funcția va fi apelată.

Să începem prin a crea o variabilă în instanța vue care va deține toată muzica:

 allmusic = []; musicLoading: false,

Apoi, definiți o funcție getAllMusics și adăugați următorul cod:

 async getAllMusics() { this.musicLoading = true try { let data = await this.$axios.$get('/music') this.allmusic = data this.musicLoading = false } catch (err) { this.musicLoading = false swal('Error', 'Error Fetting Musics', 'error') } }

Apoi, înregistrați-vă în cârligul ciclului de viață creat:

 created() { this.getAllMusics() }

Ieșirea Datelor

Acum este timpul să scoatem toate melodiile pe masa pe care le-am creat mai devreme:

 <table class="table"> <thead> <tr> <th scope="col">#</th> <th scope="col">Title</th> <th scope="col">Artist</th> <th scope="col">Date created</th> <th scope="col">Action</th> </tr> </thead> <div v-if="musicLoading" class="spinner-border" role="status" > <span class="sr-only">Loading...</span> </div> <tbody v-else> <tr v-for="(music, index) in allmusic" :key="index"> <td>{{ index + 1 }}</td> <td>{{ music.title }}</td> <td>{{ music.artist }}</td> <td>{{ music.created }}</td> <td> <button class="btn btn-info" @click="deleteMusic(music._id)">Delete</button> </td> </tr> </tbody> </table>

Îți amintești tabelul pe care l-am creat mai devreme? Ei bine, va trebui să parcurgem răspunsul pe care îl primim de la backend-ul nostru pentru a lista toată muzica primită din baza de date.

Adăugarea muzicii

Pentru a adăuga o nouă piesă muzicală, trebuie să facem o solicitare HTTP către serverul back-end cu detaliile muzicii. Pentru a face acest lucru, să începem prin a modifica forma și gestionarea fișierelor încărcate.

Pe formular, trebuie să adăugăm un ascultător de event care va asculta formularul atunci când este trimis. Pe câmpul de input , adăugăm un model v- pentru a lega valoarea la câmpul de intrare.

 <form @submit.prevent="addNewMusic"> <div class="form-group"> <label for="title">Title</label> <input type="text" v-model="musicDetails.title" class="form-control" /> </div> <div class="form-group"> <label for="artist">Artist</label> <input type="text" v-model="musicDetails.artist" class="form-control" /> </div> <div class="form-group"> <label for="artist">Music</label> <div class="custom-file"> <input type="file" ref="file" v-on:change="handleFileUpload()" class="custom-file-input" /> <label class="custom-file-label" for="customFile">Choose file</label> </div> </div> <div class="form-group"> <button class="btn btn-primary" :disabled="isDisabled"> <span class="spinner-border spinner-border-sm" v-if="addLoading" role="status" aria-hidden="true" ></span>Submit </button> </div> </form>

Și secțiunea de script ar trebui să arate așa:

 <script> export default { data() { return { musicDetails: { title: '', artist: '', music: '' }, allmusic = [], musicLoading: false, isValid: false; addLoading: false, } }, computed: { isDisabled: function() { if ( this.musicDetails.title === '' || this.musicDetails.artist === '' || this.musicDetails.music === '' ) { return !this.isValid } } }, methods: { handleFileUpload() { this.musicDetails.music = this.$refs.file.files[0] console.log(this.musicDetails.music.type) }, addNewMusic() { let types = /(\.|\/)(mp3|mp4)$/i if ( types.test(this.musicDetails.music.type) || types.test(this.musicDetails.music.name) ) { console.log('erjkb') } else { alert('Invalid file type') return !this.isValid } } } } </script>

Vom defini o funcție care va trimite o solicitare către serviciul nostru back-end pentru a crea orice muzică nouă care a fost adăugată în listă. De asemenea. trebuie să scriem o funcție simplă de validare care va verifica tipul de fișier, astfel încât utilizatorii să poată încărca numai fișiere cu o extensie de .mp3 și .mp4 .

Este important să definiți o proprietate calculată pentru a vă asigura că câmpul nostru de intrare nu este gol. De asemenea, trebuie să adăugăm un validator simplu care se va asigura că fișierul pe care încercăm să îl încărcăm este de fapt un fișier muzical.

Să continuăm prin editarea funcției addMusic pentru a face o solicitare către serviciul nostru back-end. Dar înainte de a face acest lucru, să instalăm mai întâi sweetalert , care ne va oferi o fereastră modală frumoasă. Pentru a face acest lucru, deschideți terminalul și tastați următoarele:

 npm i sweetalert

După instalarea pachetului, creați un fișier sweetalert.js în folderul /plugins și adăugați acesta:

 import Vue from 'vue'; import swal from 'sweetalert'; Vue.prototype.$swal = swal;

Apoi, înregistrați pluginul în fișierul nuxt.config.js din instanța pluginului astfel:

 plugins: [ { src: '~/plugins/sweetalert' } ],

Acum am configurat cu succes sweetalert în aplicația noastră, astfel încât să putem continua și să edităm funcția addmusic la aceasta:

 addNewMusic() { let types = /(\.|\/)(mp3|mp4)$/i if ( types.test(this.musicDetails.music.type) || types.test(this.musicDetails.music.name) ) { let formData = new FormData() formData.append('title', this.musicDetails.title) formData.append('artist', this.musicDetails.artist) formData.append('music', this.musicDetails.music) this.addLoading = true this.$axios .$post('/music', formData) .then(response => { console.log(response) this.addLoading = false this.musicDetails = {} this.getAllMusics() // we will create this function later swal('Success', 'New Music Added', 'success') }) .catch(err => { this.addLoading = false swal('Error', 'Something Went wrong', 'error') console.log(err) }) } else { swal('Error', 'Invalid file type', 'error') return !this.isValid } },

Să scriem un script simplu care va comuta formularul, adică ar trebui să se afișeze numai atunci când dorim să adăugăm muzică nouă.

Putem face acest lucru editând butonul „Adăugați muzică” din tabelul care afișează toată muzica care poate fi găsită:

 <button class="btn btn-info m-3" @click="initForm"> {{addState?"Cancel":"Add New Music"}} </button>

Apoi, adăugați o stare care va păstra starea formularului în proprietatea data :

 addState: false

După ce facem acest lucru, să definim funcția initForm :

 initForm() { this.addState = !this.addState },

Și apoi adăugați v-if="addState" la div -ul care conține forma:

 <div class="card" v-if="addState">

Ștergerea muzicii

Pentru a șterge muzica, trebuie să apelăm punctul final de delete și să transmitem music id ca parametru. Să adăugăm un eveniment de click la butonul „Ștergere” care va declanșa funcția pentru a șterge o funcție:

 <button class="btn btn-info" @click="deleteMusic(music._id)">Delete</button>

Funcția de delete va face o solicitare HTTP către serviciul nostru de back-end. După ce obținem ID-ul muzicii din parametrul funcției deleteMusic , vom adăuga ID-ul în adresa URL pe care o folosim pentru a trimite cererea. Aceasta specifică piesa exactă de muzică care ar trebui să fie eliminată din baza de date.

 deleteMusic(id) { swal({ title: 'Are you sure?', text: 'Once deleted, you will not be able to recover this Music!', icon: 'warning', buttons: true, dangerMode: true }).then(willDelete => { if (willDelete) { this.$axios .$delete('/music/' + id) .then(response => { this.getAllMusics() swal('Poof! Your Music file has been deleted!', { icon: 'success' }) }) .catch(err => { swal('Error', 'Somethimg went wrong', 'error') }) } else { swal('Your Music file is safe!') } }) }

Cu toate acestea, tocmai ne-am construit managerul muzical. Acum este timpul să construim playerul muzical.

Să începem prin a crea un folder nou în folderul de componente numit /player . Apoi, creați un fișier player.vue în acest folder și adăugați acesta:

 <template> <section> <div class="container"> <div class="row"> <div class="col-md-12"> <h3 class="text-center">Player</h3> </div> </div> </div> </section> </template> <script> export default { data() { return {} } } </script> <style scoped> </style>

Apoi, să importăm această componentă în fișierul index.vue din folderul /pages . Înlocuiți codul din fișierul index.vue cu acesta:

 <template> <div> <player /> </div> </template> <script> import player from '@/components/player/player' export default { components: { player } } </script>

Să configuram rutarea în componenta noastră navbar pentru a permite rutarea între paginile noastre.

Pentru a ruta într-o aplicație Nuxt.js, nuxt-link este folosit după care ați specificat pagina pentru ruta respectivă către o anumită instanță. Deci, să edităm codul din componenta partials/navbar la aceasta:

 <template> <header> <nav class="navbar navbar-expand-lg navbar-light bg-info"> <div class="container"> <nuxt-link to="/" class="navbar-brand">Music App</nuxt-link> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation" > <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse justify-content-end"> <ul class="navbar-nav"> <li class="nav-item active"> <nuxt-link to="/" class="nav-link">Player</nuxt-link> </li> <li class="nav-item"> <nuxt-link to="/manager" class="nav-link">Manager</nuxt-link> </li> </ul> </div> </div> </nav> </header> </template> <style scoped> .nav-link, .navbar-brand { color: #ffff !important; } </style>

Cu aceasta, putem naviga prin paginile noastre utilizând bara de navigare.

Construirea Jucătorului

Înainte de a începe, trebuie să extindem Webpack pentru a încărca fișiere audio. Fișierele audio ar trebui să fie procesate de file-loader . Acest încărcător este deja inclus în configurația implicită Webpack, dar nu este configurat pentru a gestiona fișiere audio.

Pentru a face acest lucru, accesați fișierul nuxt.config.js și modificați obiectul de build la acesta:

 build: { extend(config, ctx) { config.module.rules.push({ test: /\.(ogg|mp3|mp4|wav|mpe?g)$/i, loader: 'file-loader', options: { name: '\[path\][name].[ext]' } }) } }

Apoi, să scriem o funcție care va obține toate melodiile și apoi să folosim constructorul Audio pentru a reda prima melodie din matricea allMusic .

Pentru început, să modificăm fișierul player.vue astfel:

 <template> <section v-if="allMusic"> <div class="container"> <div class="row"> <div class="col-md-12"> <h3 class="text-center">Player</h3> </div> </div> <div class="row"> <div class="col-md-6"> <span>{{this.current.title}} - {{this.current.artist}}</span> </div> </div> </div> </section> </template> <script> export default { data() { return { current: { title: '', artist: '' }, song: true, isplaying: false, allMusic: null, index: 0, player: '' } }, methods: { async initPlayer() { if (this.allMusic !== []) { this.current = await this.allMusic[this.index] this.player.src = `https://localhost:4000/${this.current.music.path}` } else { this.song = true } }, async getAllSongs() { try { let response = await this.$axios.$get('/music') console.log(response) if (response === []) { this.song = true this.current = null } else { this.song = false this.allMusic = response } await this.initPlayer() } catch (err) { this.current = null console.log(err) } } }, created() { if (process.client) { this.player = new Audio() } this.getAllSongs() } } </script> <style scoped> </style>

Odată ce fișierul este servit, muzica va fi redată în fundal și apoi ar trebui să puteți vedea acest lucru în browser:

Interfața de utilizare a playerului muzical
Interfața de utilizare a playerului muzical (previzualizare mare)

Pentru a opri muzica, tot ce trebuie să faceți este să comentați await player.play() în funcția initPlayer .

Crearea interfeței de utilizare a playerului

Să definim acum interfața de utilizare a playerului muzical, înlocuind șablonul din fișierul player.vue cu următoarele:

 <template> <section v-if="allMusic"> <div class="container"> <div class="row mb-5"> <div class="col-md-12"> <h3 class="text-center">Player</h3> </div> </div> <div class="row mt-5"> <div class="col-md-6"> <img src="https://images.pexels.com/photos/3624281/pexels-photo-3624281.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500" class="image" /> <div class="card player_card"> <div class="card-body"> <h6 class="card-title"> <b>{{this.current.title}} - {{this.current.artist}}</b> </h6> <div> <i class="fas fa-backward control mr-4"></i> <i class="fas fa-play play"></i> <i class="fas fa-pause play"></i> <i class="fas fa-forward control ml-4"></i> </div> </div> </div> </div> <div class="col-md-6"> <div class="card shadow"> <table class="table"> <thead> <tr> <th scope="col">#</th> <th scope="col">Title</th> <th scope="col">Artist</th> <th scope="col">Action</th> </tr> </thead> <tbody> <tr> <th scope="row">1</th> <td>Mark</td> <td>Otto</td> <td> <button class="btn btn-primary">Play</button> </td> </tr> </tbody> </table> </div> </div> </div> </div> </section> </template>

Apoi, adăugați următorul stil în secțiunea de style :

 <style scoped> .image { border-radius: 5px !important; position: relative; height: 300px; width: 100%; } .player_card { text-align: center; bottom: 20px; margin: 0px 40px; } .text-muted { font-size: 15px; } .play { font-size: 40px; } .control { font-size: 25px; } </style>

După modificarea, playerul ar trebui să arate astfel:

Interfața de utilizare finală a playerului muzical
Interfața de utilizare finală a playerului muzical (previzualizare mare)

Adăugarea funcției de redare

Vom continua afișând descrierea muzicii pe tabel. Pentru a face acest lucru, înlocuiți tabelul cu codul de mai jos:

 <table class="table"> <thead> <tr> <th scope="col">#</th> <th scope="col">Title</th> <th scope="col">Artist</th> <th scope="col">Action</th> </tr> </thead> <tbody> <tr v-for="(music,index) in allMusic" :key="index"> <th scope="row">{{index+1}}</th> <td>{{music.title}}</td> <td>{{music.artist}}</td> <td> <button class="btn btn-primary">Play</button> </td> </tr> </tbody> </table>

Nu dorim să afișăm pictogramele „Redare” și „Pauză” în același timp. În schimb, dorim o situație în care atunci când melodia este redată, să fie afișată pictograma „Pauză”. De asemenea, atunci când melodia este întreruptă, ar trebui să fie afișată pictograma de redare.

Pentru a realiza acest lucru, trebuie să setăm o stare isPlaying la instanța false și apoi să folosim această instanță pentru a comuta pictogramele. După aceea, vom adăuga o funcție la pictograma noastră „Play”.

 isplaying:false

După ce faceți acest lucru, modificați pictograma „Redare” și „Pauză” la aceasta:

 <i class="fas fa-play play" v-if="!isplaying" @click="play"></i> <i class="fas fa-pause play" v-else></i>

Cu toate acestea, să definim metoda de play :

 play(song) { console.log(song) if (song) { this.current = song this.player.src = `https://localhost:4000/${this.current.music.path}` } this.player.play() this.isplaying = true },

În primul rând, obținem melodia curentă și o trecem în parametrul function . Definim apoi instanța JavaScript Audio() . Apoi, verificăm dacă melodia este nulă: dacă nu este, setăm this.current la melodia pe care am trecut-o în parametru și apoi apelăm instanța Audio player. (De asemenea, nu uitați că trebuie să setăm starea isPlaying la true când se redă muzica.)

Adăugarea funcției de pauză

Pentru a întrerupe o melodie, vom folosi metoda de pauză Audio . Trebuie să adăugăm un eveniment de click pe pictograma de pauză:

 <i class="fas fa-pause play" @click="pause" v-else></i>

Și apoi definiți funcția în instanța methods :

pause() { this.player.pause() this.isplaying = false },

Redarea unui cântec din lista de muzică

Acest lucru este destul de simplu de implementat. Tot ce trebuie să facem este să adăugăm un eveniment de click care va schimba parametrul song din metoda de play melodiei pe care tocmai l-am creat.

Pur și simplu modificați butonul de play de pe tabelul listei de muzică astfel:

 <button class="btn btn-primary" @click="play(music)">Play</button>

Și iată-l!

Adăugarea funcției următoare

Pentru a adăuga următoarea funcție, trebuie să creștem indexul cu unul. Pentru a face acest lucru, adăugați un eveniment de click la următoarea pictogramă:

 @click="next"

Și apoi definiți funcția prev în instanța methods :

 next() { this.index++ if (this.index > this.allMusic.length - 1) { this.index = 0 } this.current = this.allMusic[this.index] this.play(this.current) },

Această condițională este responsabilă pentru redarea tuturor melodiilor ori de câte ori a fost redată ultima melodie din listă.

Adăugarea funcției previous

Acesta este de fapt opusul funcției următoare, așa că haideți să adăugăm un eveniment de click la funcția anterioară:

 @click="prev"

În continuare, definim funcția anterioară:

 prev() { this.index-- if (this.index < 0) { this.index = this.allMusic.length - 1 } this.current = this.allMusic[this.index] this.play(this.current) },

Aplicația noastră de redare muzicală este acum completă!

Concluzie

În acest articol, am analizat cum putem construi un manager de muzică cu Nuxt.js și Express.js. Pe parcurs, am văzut cum Multer simplifică procesul de gestionare a încărcărilor de fișiere și cum să folosești Mongoose pentru a interacționa fără o bază de date. În cele din urmă, am folosit Nuxt.js pentru a construi aplicația client, care îi oferă o senzație rapidă și rapidă.

Spre deosebire de alte cadre, construirea unei aplicații cu Nuxt.js și Express.js este destul de ușoară și rapidă. Partea tare despre Nuxt.js este modul în care vă gestionează rutele și vă face să vă structurați mai bine aplicațiile.

  • Puteți accesa mai multe informații despre Nuxt.js aici.
  • Puteți accesa codul sursă pe Github aici