ITI0205 2020 4 iseseisev töö

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti

ITI0205 4. iseseisev töö: NodeJS rakendus

Iseseisva töö eesmärk on täiendada Yahtzeed nii, et sellele ehitada NodeJS tagarakendus, nii et seda oleks võimalik mängida kahe mängija poolt üle võrgu. Soovituslik on kasutada ExpressJS raamistikku. Juhul kui kuulad kursust mõnest varasemast aastast ja punktid selle praktikumi eest kanti üle võid kasutada enda, rakenduse loogika jääb samaks.

Rakendus on vaja paigaldada turing.cs.ttu.ee serverisse aadressile http://turing.cs.ttu.ee/~uni-id/prax4 ja rakenduse lähtekood Gitlab.cs.ttu.ee kesskkonda.

Kaks mängijat peavad saama käia kumbki oma brauseris vaheldumisi ja kui mõlemad käinud, näidatakse kummalegi, kes võitis ja alustatakse uuesti. Sisselogimist ei ole vaja teha. Võimalik on korduvkasutada 2. praktikumitöö CSSi

Üks lihtne variant ehitamiseks on selline, kus veebileht end vastase käiku oodates kord sekundis refreshib ja seisu hoitakse lihtsalt failis ühe json-i formaadis:

  • server kuvab algul veebilehe, kus saad sisestada nimeväljale oma nime ja käikude arvu.
  • serveril on üks seisufail, kuhu ta kirjutab mängu seisu - käigu, kombinatsioonid ja punktisumma
  • kui server saab päringu a’la POST name=martin&turn=1&dice=1,4,1,1,1
    • seisufail on tühi: server loob uue seisufaili ja annab tagasi htmli, mis ütleb “oota” ja refreshib sekundi järel, saates serverile päringu a la ?state=waiting
    • seisufailis on juba valitud kohal käik, siis seisufaili ei kirjutata vaid kasutaja peab uuesti proovima ?turn=player2&state=retry
  • Siis kontrollitakse kas käik on läbi ja saab määrata punkte.
    • Kui punktid on antud antakse mäng edasi teisele mängijale turn=playe2&state=waiting
    • Kui kõik käigud on tehtud, siis see mängija kes sai rohkem punkte on võitja. Seda näidatakse mõlemale kasutajale.

Pane tähele, et see lihtne skeem võib minna rikki, kui peale eelmise mängu tulemuse saamist väga kiiresti uue käigu teed: võib juhtuda, et vastase leht ei jõua enne refreshida ja tulemust näidata, kui sinu käik juba seisu üle salvestab.

Sa võid ehitada oma rakenduse ka mingi hoopis teistsuguse skeemi järgi.

Punktide arvestus

  1. Mitme mängija toe lisamine on kohustuslik ja annab 8 punkti
  2. Lisaks mitmemängija toele on salvestatakse ka edetabel serverisse, s.t on nähtav kõigile rakenduse kasutajatele sõltumata sellest millisest arvutist nad seda vaatavad. See annab 4 punkti.
  3. Lisaks annab 3 punkti kui salvestad edetabeli mitte serveris olevasse faili vaid andmebaasi, serveris olemas MySQL, aga saad soovi korral kasutada kas SQLite või mõnda muud eraldiseisvat andmebaasimootorit. Turingu serveris töötab hästi MySQL2 nimeline teek: https://www.npmjs.com/package/mysql2. Kui SQL päringuid kirjutada ei taha, siis head tööriistad on Bookshelf.js https://bookshelfjs.org/ või Sequelize: https://sequelize.org/
  4. Kui ehitad RESTi asemel rakenduse Socket.io peale saad 1 lisapunkti

Lisaks:

  • HTML ja CSS peaksid olema eraldi. Nii on sul mugav seda hallata ja muuta.
  • Lehtede HTML peaks olema valideeruv ja javascripti kasutamisel ei tohi konsoolis olla veateateid.
  • Leht ei tohi välja näha väga jube. Vaata ka: [[1]]

Soovitusi

Arendamiseks piisab kahest eraldi tabist ühes brauseris - selleks ei ole vaja mitut reaalset inimest.

Millises järjekorras asju teha

1. Kõigepealt tõsta oma prax2 tehtud mäng prax4 kataloogi, sellega on algus tehtud.

2. Kui mitmemängija tuge veel realiseeritud ei ole tee see ära (vt. 2 praktikumitöö juhendit)

3. Vaata, millised on seal osad mis on jagatud kahe kasutaja vahel (mängu olek, käigud, edetabel). Nende hoidmine ja haldamine hakkaks edaspidi toimuma Node.js tagarakenduses. Et järge paremini hoida dokumenteeri see enda jaoks tekstifailis, kujul:

GET /games        List active games
GET /scoreboard   Get scoreboard data

Sellist minimalistlikku tekstifaili on hea väikese vaevaga hallata.

4. Esimese sammuna võiksid andmeobjektid tõsta staatilistesse JSON failidesse nt /prax4/api/ kataloogi ja proovida neid sealt lugeda kasutades fetch APIt. Sellega tekib esmane ülevaade milliseid andmeid on vaja lugeda (ja hiljem kirjutada), salvesta API endpoint mingusse muutujasse, nt const api_url = '/prax4/api/'

5. Nüüd tekita Nodejs rakendus mis oleks ehitatud nii et tagastaks päringule täpselt samu JSONi faile. Asenda 'api_url' muutja esirakenduses enda lokaalse NodeJS rakenduse aadressiga. Et hiljem sellele vähem mõelda võiksid juba praegu määrata Node rakenduse jooksma oma turingu-serveri pordile.

6. Nüüd realiseeri node rakenduses andmete kirjutamine ja dünaamiline andmete tagastamine.

Soovituslik arhitektuur

Rakenduse vaatamine ja paigaldamine serverisse

Selleks, et saaks kasutada NodeJS jaoks erinevaid porte, on nii et kõige mõistlikum kasutada SOCKS proxyt. Juhend SOCKS proxy tekitamiseks Turingu serveris on on siin .

Et veenduda et proxy/brauser on õigesti konfigureeritud mine aadressile http://turing.cs.ttu.ee:3030/. Peaksid seal nägema teadet "Olen tulemüüri taga :D"