axios-utils-lts 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +1456 -0
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1,5 +1,1461 @@
1
1
  module.exports = `
2
+ *******************************************************
3
+ LARAVEL + REACT VIZSGA JEGYZET
2
4
 
5
+ LARAVEL SORREND
6
+
7
+ cd mappaNeveAhovaLetreAkaromHozni
8
+ composer create-project laravel/laravel backend
9
+ cd backend
10
+ php artisan install:api
11
+
12
+ .env file:
13
+ DB_CONNECTION=mysql
14
+ DB_HOST=127.0.0.1
15
+ DB_PORT=3306
16
+ DB_DATABASE=konyvtar
17
+ DB_USERNAME=root
18
+ DB_PASSWORD=
19
+
20
+ XAMPP elindít -> Admin megnyitása -> új adatbázis létrehozása név + megfelelő UTF-8 kolláció.
21
+
22
+ Alap sorrend:
23
+ migration -> migrate -> $fillable + kapcsolatok -> controller -> route -> API-teszt
24
+
25
+ Első tábla model + migration létrehozása:
26
+ php artisan make:model Kategoria -m
27
+
28
+ -m = model + migration
29
+ -a = model + migration + controller + factory + seeder
30
+
31
+ A létrejött migration fájl kidolgozása:
32
+ mezőnevek, adattípusok, kapcsolatok.
33
+
34
+ Példa kategoriak migration:
35
+ Schema::create('kategoriak', function (Blueprint $table) {
36
+ $table->id();
37
+ $table->string('nev');
38
+ $table->timestamps();
39
+ });
40
+
41
+ Következő tábla:
42
+ php artisan make:model Konyv -m
43
+
44
+ A létrejött migration fájl kidolgozása.
45
+
46
+ Példa konyvek migration:
47
+ Schema::create('konyvek', function (Blueprint $table) {
48
+ $table->id();
49
+ $table->string('cim');
50
+ $table->string('szerzo');
51
+ $table->foreignId('kategoria_id')->constrained('kategoriak');
52
+ $table->text('leiras');
53
+ $table->integer('kiadas_eve');
54
+ $table->string('kep_url');
55
+ $table->timestamps();
56
+ });
57
+
58
+ $table->foreignId('kategoria_id')->constrained('kategoriak');
59
+
60
+ Jelentése:
61
+ foreignId = létrehozza a foreign key mezőt.
62
+ constrained('kategoriak') = összekapcsolja a kategoriak táblával.
63
+
64
+ konyvek.kategoria_id -> kategoriak.id
65
+
66
+ A sorrend fontos, mert előbb kell léteznie a kategoriak táblának, és utána jöhet a konyvek tábla.
67
+
68
+ Migration futtatása:
69
+ php artisan migrate
70
+
71
+ Ha fejlesztés közben teljesen újra kell építeni az adatbázist:
72
+ php artisan migrate:fresh
73
+
74
+ Figyelem: a migrate:fresh törli az adatokat.
75
+
76
+ Ha seed is van:
77
+ php artisan migrate:fresh --seed
78
+
79
+ MODELLEK
80
+
81
+ app/Models/Kategoria.php
82
+
83
+ protected $table = 'kategoriak';
84
+
85
+ protected $fillable = [
86
+ 'nev'
87
+ ];
88
+
89
+ public function konyvek()
90
+ {
91
+ return $this->hasMany(Konyv::class, 'kategoria_id');
92
+ }
93
+
94
+ app/Models/Konyv.php
95
+
96
+ protected $table = 'konyvek';
97
+
98
+ protected $fillable = [
99
+ 'cim',
100
+ 'szerzo',
101
+ 'kategoria_id',
102
+ 'leiras',
103
+ 'kiadas_eve',
104
+ 'kep_url'
105
+ ];
106
+
107
+ public function kategoria()
108
+ {
109
+ return $this->belongsTo(Kategoria::class, 'kategoria_id');
110
+ }
111
+
112
+ Kapcsolat:
113
+ Kategoria -> hasMany(Konyv)
114
+ Konyv -> belongsTo(Kategoria)
115
+
116
+ Fontos: a with('kategoria') névnek egyeznie kell a Konyv modell kategoria() függvénynevével.
117
+
118
+ CONTROLLEREK
119
+
120
+ Controllerek létrehozása:
121
+ php artisan make:controller KategoriaController
122
+ php artisan make:controller KonyvController
123
+
124
+ KategoriaController.php
125
+
126
+ Import:
127
+ use App\Models\Kategoria;
128
+
129
+ Metódus:
130
+ public function index()
131
+ {
132
+ return Kategoria::all();
133
+ }
134
+
135
+ KonyvController.php
136
+
137
+ Importok:
138
+ use App\Models\Konyv;
139
+ use Illuminate\Http\Request;
140
+
141
+ Összes könyv kategória adataival:
142
+ public function index()
143
+ {
144
+ return Konyv::with('kategoria')->get();
145
+ }
146
+
147
+ Kategória szerinti szűrés:
148
+ public function szures($id)
149
+ {
150
+ return Konyv::with('kategoria')
151
+ ->where('kategoria_id', $id)
152
+ ->get();
153
+ }
154
+
155
+ Új könyv felvitele:
156
+ public function store(Request $request)
157
+ {
158
+ $adatok = $request->validate([
159
+ 'cim' => 'required|string',
160
+ 'szerzo' => 'required|string',
161
+ 'kategoria_id' => 'required|integer',
162
+ 'leiras' => 'required|string',
163
+ 'kiadas_eve' => 'required|integer',
164
+ 'kep_url' => 'required|string'
165
+ ]);
166
+
167
+ return Konyv::create($adatok);
168
+ }
169
+
170
+ Könyv törlése:
171
+ public function destroy($id)
172
+ {
173
+ Konyv::destroy($id);
174
+
175
+ return response()->json([
176
+ 'ok' => true
177
+ ]);
178
+ }
179
+
180
+ Könyv módosítása:
181
+ public function update(Request $request, $id)
182
+ {
183
+ $konyv = Konyv::findOrFail($id);
184
+
185
+ $adatok = $request->validate([
186
+ 'cim' => 'required|string',
187
+ 'szerzo' => 'required|string',
188
+ 'kategoria_id' => 'required|integer',
189
+ 'leiras' => 'required|string',
190
+ 'kiadas_eve' => 'required|integer',
191
+ 'kep_url' => 'required|string'
192
+ ]);
193
+
194
+ $konyv->update($adatok);
195
+
196
+ return $konyv;
197
+ }
198
+
199
+ ROUTE-OK
200
+
201
+ Ha friss Laravel projektben nincs routes/api.php:
202
+ php artisan install:api
203
+
204
+ routes/api.php importok:
205
+ use Illuminate\Support\Facades\Route;
206
+ use App\Http\Controllers\KategoriaController;
207
+ use App\Http\Controllers\KonyvController;
208
+
209
+ Route-ok:
210
+ Route::get('/kategoriak', [KategoriaController::class, 'index']);
211
+ Route::get('/konyvek', [KonyvController::class, 'index']);
212
+ Route::get('/konyvek/kategoria/{id}', [KonyvController::class, 'szures']);
213
+ Route::post('/konyvek', [KonyvController::class, 'store']);
214
+ Route::put('/konyvek/{id}', [KonyvController::class, 'update']);
215
+ Route::delete('/konyvek/{id}', [KonyvController::class, 'destroy']);
216
+
217
+ Ha az api.php kézzel lett létrehozva, bootstrap/app.php withRouting részében legyen:
218
+ api: __DIR__.'/../routes/api.php',
219
+
220
+ Route-ok ellenőrzése:
221
+ php artisan route:list
222
+
223
+ Elvárt végpontok:
224
+ GET /api/kategoriak
225
+ GET /api/konyvek
226
+ GET /api/konyvek/kategoria/{id}
227
+ POST /api/konyvek
228
+ PUT /api/konyvek/{id}
229
+ DELETE /api/konyvek/{id}
230
+
231
+ BACKEND INDÍTÁSA
232
+
233
+ php artisan serve
234
+
235
+ Tesztelés előtt a kapcsolódó adatokat létrehozási sorrendben töltsük fel.
236
+ Előbb kategória, utána könyv, mert a könyv kategoria_id mezője létező kategoriak.id értékre hivatkozik.
237
+
238
+ API TESZTELÉS
239
+
240
+ GET tesztek böngészőből:
241
+ http://127.0.0.1:8000/api/kategoriak
242
+ http://127.0.0.1:8000/api/konyvek
243
+ http://127.0.0.1:8000/api/konyvek/kategoria/1
244
+
245
+ JSON választ kell kapni.
246
+
247
+ POST Thunder Client:
248
+ POST
249
+ http://127.0.0.1:8000/api/konyvek
250
+
251
+ Body JSON:
252
+ {
253
+ "cim": "Próba könyv",
254
+ "szerzo": "Teszt Elek",
255
+ "kategoria_id": 1,
256
+ "leiras": "Ez egy próba könyv.",
257
+ "kiadas_eve": 2024,
258
+ "kep_url": "/kepek/proba.jpg"
259
+ }
260
+
261
+ Fontos: a kategoria_id értékének léteznie kell a kategoriak táblában.
262
+
263
+ DELETE Thunder Client:
264
+ DELETE
265
+ http://127.0.0.1:8000/api/konyvek/107
266
+
267
+ Sikeres válasz:
268
+ {
269
+ "ok": true
270
+ }
271
+
272
+ PUT Thunder Client:
273
+ PUT
274
+ http://127.0.0.1:8000/api/konyvek/106
275
+
276
+ Body JSON:
277
+ {
278
+ "cim": "Módosított könyvcím",
279
+ "szerzo": "Teszt Elek",
280
+ "kategoria_id": 1,
281
+ "leiras": "Ez már a módosított leírás.",
282
+ "kiadas_eve": 2025,
283
+ "kep_url": "/kepek/modositott.jpg"
284
+ }
285
+
286
+ Hibakeresési gyorslista:
287
+ - php artisan parancs csak a backend mappában működik, ahol az artisan fájl van.
288
+ - php artisan route:list megmutatja, tényleg regisztrálva van-e a route.
289
+ - Mentetlen api.php esetén az új route nem jelenik meg.
290
+ - $table->id() automatikusan növekvő elsődleges kulcsot készít.
291
+ - $fillable mezőneveknek pontosan egyezniük kell az adatbázis és a request mezőivel.
292
+ - Foreign key beszúrásnál a hivatkozott rekordnak már léteznie kell.
293
+ - migrate:fresh törli a kézzel felvitt tesztadatokat is.
294
+
295
+
296
+ REACT SORREND
297
+
298
+ 1. REACT PROJEKT
299
+
300
+ A backend melletti mappában:
301
+ npx create-react-app frontend
302
+ cd frontend
303
+ npm install axios
304
+ npm start
305
+
306
+ A Laravel külön terminálban fusson:
307
+ cd backend
308
+ php artisan serve
309
+
310
+ A React külön terminálban fusson:
311
+ cd frontend
312
+ npm start
313
+
314
+ Projektstruktúra példa:
315
+ web/
316
+ backend/
317
+ frontend/
318
+
319
+ 2. API KLIENS
320
+
321
+ Létrehoz:
322
+ frontend/src/services/api.js
323
+
324
+ Tartalom:
325
+ import axios from "axios";
326
+
327
+ const API_URL = "http://127.0.0.1:8000/api";
328
+
329
+ GET kategóriák:
330
+ export const getKategoriak = () => {
331
+ return axios.get(`${API_URL}/kategoriak`);
332
+ };
333
+
334
+ GET összes könyv:
335
+ export const getKonyvek = () => {
336
+ return axios.get(`${API_URL}/konyvek`);
337
+ };
338
+
339
+ GET kategória szerint:
340
+ export const getKonyvekKategoriaSzerint = (id) => {
341
+ return axios.get(`${API_URL}/konyvek/kategoria/${id}`);
342
+ };
343
+
344
+ POST:
345
+ export const ujKonyv = (adatok) => {
346
+ return axios.post(`${API_URL}/konyvek`, adatok);
347
+ };
348
+
349
+ PUT:
350
+ export const konyvModositas = (id, adatok) => {
351
+ return axios.put(`${API_URL}/konyvek/${id}`, adatok);
352
+ };
353
+
354
+ DELETE:
355
+ export const konyvTorles = (id) => {
356
+ return axios.delete(`${API_URL}/konyvek/${id}`);
357
+ };
358
+
359
+ Fejben:
360
+ axios.get = GET
361
+ axios.post = POST
362
+ axios.put = PUT
363
+ axios.delete = DELETE
364
+
365
+ 3. APP.JS IMPORTOK
366
+
367
+ import { useEffect, useState } from "react";
368
+
369
+ import {
370
+ getKategoriak,
371
+ getKonyvek,
372
+ getKonyvekKategoriaSzerint,
373
+ ujKonyv,
374
+ konyvModositas,
375
+ konyvTorles
376
+ } from "./services/api";
377
+
378
+ 4. STATE-EK
379
+
380
+ Az App komponensben:
381
+ const [kategoriak, setKategoriak] = useState([]);
382
+ const [konyvek, setKonyvek] = useState([]);
383
+ const [kivalasztottKonyv, setKivalasztottKonyv] = useState(null);
384
+ const [kivalasztottKategoria, setKivalasztottKategoria] = useState("");
385
+
386
+ Jelentés:
387
+ kategoriak = backendről érkező kategóriák
388
+ konyvek = backendről érkező könyvek
389
+ kivalasztottKonyv = amelyik könyvre kattintottunk
390
+ kivalasztottKategoria = select aktuális értéke
391
+
392
+ State változásakor React újrarenderel.
393
+
394
+ 5. ADATBETÖLTÉS INDULÁSKOR
395
+
396
+ useEffect(() => {
397
+ getKategoriak().then(response => {
398
+ setKategoriak(response.data);
399
+ });
400
+
401
+ getKonyvek().then(response => {
402
+ setKonyvek(response.data);
403
+ });
404
+ }, []);
405
+
406
+ A [] miatt induláskor fut le.
407
+
408
+ Gyors ellenőrzés:
409
+ console.log(kategoriak);
410
+ console.log(konyvek);
411
+
412
+ Böngésző:
413
+ F12 -> Console
414
+
415
+ 6. KATEGÓRIA LEGÖRDÜLŐ
416
+
417
+ <select
418
+ value={kivalasztottKategoria}
419
+ onChange={e => setKivalasztottKategoria(e.target.value)}
420
+ >
421
+ <option value="">Összes kategória</option>
422
+
423
+ {kategoriak.map(kategoria => (
424
+ <option key={kategoria.id} value={kategoria.id}>
425
+ {kategoria.nev}
426
+ </option>
427
+ ))}
428
+ </select>
429
+
430
+ Fontos:
431
+ A kategóriákat nem kézzel írjuk be az option elemekbe, hanem az API-ból érkező kategoriak tömbből map()-pel készítjük.
432
+
433
+ 7. SZŰRÉS KATEGÓRIA SZERINT
434
+
435
+ const szures = (id) => {
436
+ setKivalasztottKategoria(id);
437
+
438
+ if (id === "") {
439
+ getKonyvek().then(response => {
440
+ setKonyvek(response.data);
441
+ });
442
+ } else {
443
+ getKonyvekKategoriaSzerint(id).then(response => {
444
+ setKonyvek(response.data);
445
+ });
446
+ }
447
+ };
448
+
449
+ Select:
450
+ <select
451
+ value={kivalasztottKategoria}
452
+ onChange={e => szures(e.target.value)}
453
+ >
454
+
455
+ Logika:
456
+ Összes kategória -> GET /konyvek
457
+ Konkrét kategória -> GET /konyvek/kategoria/{id}
458
+
459
+ 8. KÖNYVEK TÁBLÁZATA
460
+
461
+ Létrehoz:
462
+ src/components/KonyvTabla.js
463
+
464
+ function KonyvTabla({ konyvek, onKivalaszt }) {
465
+ return (
466
+ <table>
467
+ <thead>
468
+ <tr>
469
+ <th>Cím</th>
470
+ <th>Szerző</th>
471
+ <th>Kategória</th>
472
+ </tr>
473
+ </thead>
474
+
475
+ <tbody>
476
+ {konyvek.map(konyv => (
477
+ <tr
478
+ key={konyv.id}
479
+ onClick={() => onKivalaszt(konyv)}
480
+ >
481
+ <td>{konyv.cim}</td>
482
+ <td>{konyv.szerzo}</td>
483
+ <td>{konyv.kategoria?.nev}</td>
484
+ </tr>
485
+ ))}
486
+ </tbody>
487
+ </table>
488
+ );
489
+ }
490
+
491
+ export default KonyvTabla;
492
+
493
+ Fontos:
494
+ map() = lista megjelenítése
495
+ key = egyedi azonosító
496
+ onClick = elem kiválasztása
497
+ props = adat átadása komponensnek
498
+
499
+ 9. KONYVTABLA HASZNÁLATA APP.JS-BEN
500
+
501
+ Import:
502
+ import KonyvTabla from "./components/KonyvTabla";
503
+
504
+ Használat:
505
+ <KonyvTabla
506
+ konyvek={konyvek}
507
+ onKivalaszt={setKivalasztottKonyv}
508
+ />
509
+
510
+ Logika:
511
+ kattintás egy könyvre
512
+ -> setKivalasztottKonyv(konyv)
513
+ -> state megváltozik
514
+ -> React újrarenderel
515
+
516
+ 10. KIVÁLASZTOTT KÖNYV RÉSZLETEI
517
+
518
+ Létrehoz:
519
+ src/components/KonyvReszlet.js
520
+
521
+ function KonyvReszlet({ konyv }) {
522
+ if (!konyv) {
523
+ return null;
524
+ }
525
+
526
+ return (
527
+ <div>
528
+ <h2>{konyv.cim}</h2>
529
+ <p>Szerző: {konyv.szerzo}</p>
530
+ <p>Kategória: {konyv.kategoria?.nev}</p>
531
+ <p>Kiadás éve: {konyv.kiadas_eve}</p>
532
+ <img src={konyv.kep_url} alt={konyv.cim} />
533
+ <p>{konyv.leiras}</p>
534
+ </div>
535
+ );
536
+ }
537
+
538
+ export default KonyvReszlet;
539
+
540
+ App.js import:
541
+ import KonyvReszlet from "./components/KonyvReszlet";
542
+
543
+ Használat:
544
+ <KonyvReszlet konyv={kivalasztottKonyv} />
545
+
546
+ 11. DELETE FRONTENDRŐL
547
+
548
+ const torles = (id) => {
549
+ konyvTorles(id).then(() => {
550
+ getKonyvek().then(response => {
551
+ setKonyvek(response.data);
552
+ });
553
+
554
+ setKivalasztottKonyv(null);
555
+ });
556
+ };
557
+
558
+ Gomb:
559
+ <button onClick={() => torles(kivalasztottKonyv.id)}>
560
+ Törlés
561
+ </button>
562
+
563
+ Logika:
564
+ kattintás
565
+ -> DELETE API
566
+ -> backend töröl
567
+ -> GET újra
568
+ -> setKonyvek
569
+ -> lista frissül
570
+
571
+ 12. POST FRONTENDRŐL
572
+
573
+ Form state:
574
+ const [ujAdat, setUjAdat] = useState({
575
+ cim: "",
576
+ szerzo: "",
577
+ kategoria_id: "",
578
+ leiras: "",
579
+ kiadas_eve: "",
580
+ kep_url: ""
581
+ });
582
+
583
+ Input példa:
584
+ <input
585
+ value={ujAdat.cim}
586
+ onChange={e =>
587
+ setUjAdat({
588
+ ...ujAdat,
589
+ cim: e.target.value
590
+ })
591
+ }
592
+ />
593
+
594
+ Mentés:
595
+ const ujKonyvMentese = () => {
596
+ ujKonyv(ujAdat).then(() => {
597
+ getKonyvek().then(response => {
598
+ setKonyvek(response.data);
599
+ });
600
+ });
601
+ };
602
+
603
+ 13. PUT FRONTENDRŐL
604
+
605
+ A módosítandó könyv:
606
+ kivalasztottKonyv
607
+
608
+ Módosítás:
609
+ const modositas = () => {
610
+ konyvModositas(
611
+ kivalasztottKonyv.id,
612
+ kivalasztottKonyv
613
+ ).then(() => {
614
+ getKonyvek().then(response => {
615
+ setKonyvek(response.data);
616
+ });
617
+ });
618
+ };
619
+
620
+ 14. CSS ÉS RESZPONZIVITÁS
621
+
622
+ App.css példa:
623
+ .container {
624
+ width: 90%;
625
+ max-width: 1000px;
626
+ margin: auto;
627
+ }
628
+
629
+ table {
630
+ width: 100%;
631
+ }
632
+
633
+ img {
634
+ max-width: 300px;
635
+ width: 100%;
636
+ }
637
+
638
+ @media (max-width: 600px) {
639
+ .container {
640
+ width: 95%;
641
+ }
642
+ }
643
+
644
+ Vizsgán fontos:
645
+ százalékos szélesség
646
+ max-width
647
+ kulturált táblázat/lista
648
+ mobil nézet
649
+ media query vagy megfelelő CSS keretrendszer
650
+
651
+ REACT VIZSGA-SORREND RÖVIDEN
652
+
653
+ React projekt
654
+ -> npm install axios
655
+ -> services/api.js
656
+ -> API_URL
657
+ -> GET/POST/PUT/DELETE függvények
658
+ -> App.js
659
+ -> useState
660
+ -> useEffect
661
+ -> kategóriák betöltése
662
+ -> könyvek betöltése
663
+ -> kategória select
664
+ -> szűrés
665
+ -> lista/táblázat komponens
666
+ -> map()
667
+ -> kattintás és kiválasztott elem
668
+ -> részlet komponens
669
+ -> POST/PUT/DELETE
670
+ -> CSS
671
+ -> mobil nézet
672
+
673
+ TELJES LARAVEL + REACT LOGIKA
674
+
675
+ LARAVEL:
676
+ adatbázis
677
+ -> migration
678
+ -> migrate
679
+ -> model
680
+ -> $fillable
681
+ -> relationship
682
+ -> controller
683
+ -> route
684
+ -> API teszt
685
+
686
+ REACT:
687
+ API kliens
688
+ -> useState
689
+ -> useEffect
690
+ -> lista
691
+ -> select
692
+ -> szűrés
693
+ -> kiválasztás
694
+ -> részletek
695
+ -> CRUD
696
+ -> CSS
697
+
698
+ Röviden:
699
+ adatbázis -> API -> lista -> szűrés -> kiválasztás -> megjelenítés
700
+
701
+ Memóriafogás:
702
+ Laravelben az adatot előállítjuk és JSON-ként odaadjuk.
703
+ Reactban az adatot lekérjük, state-be rakjuk és megjelenítjük.
704
+
705
+
706
+ ************************
707
+
708
+ JAVA VIZSGA JEGYZET - KONZOLOS + SWING GUI
709
+
710
+ JAVA SORREND
711
+
712
+ 1. Projekt indulas
713
+ 2. Csomagstruktura
714
+ 3. Entitas/modell osztaly
715
+ 4. Fajlbeolvasas
716
+ 5. Modellkezelo / uzleti logika
717
+ 6. Kollekciok es statisztikak
718
+ 7. Rendezes
719
+ 8. Konzolos nezet
720
+ 9. Swing GUI
721
+ 10. Esemenykezeles
722
+ 11. Program/main osszekotese
723
+ 12. Vegso teszteles
724
+
725
+ A tipikus csomagok:
726
+ app
727
+ modell
728
+ nezet
729
+
730
+ Pelda projektstruktura:
731
+ Source Packages
732
+ app
733
+ Program.java
734
+ modell
735
+ Termek.java
736
+ TermekKezelo.java
737
+ nezet
738
+ KonzolNezet.java
739
+ SwingNezet.java
740
+
741
+ A modell tartalmazza az adatokat es az uzleti logikat.
742
+ A nezet felel a konzolos vagy grafikus megjelenitesert.
743
+ Az app.Program inditja el a programot.
744
+
745
+
746
+ 1. PROJEKT LETREHOZASA NETBEANSBEN
747
+
748
+ Java with Ant projekt eseten:
749
+ File -> New Project
750
+ Java with Ant
751
+ Java Application
752
+ Next
753
+
754
+ Project Name: pl. TermekVizsga
755
+ Create Main Class: bepipalva
756
+ Main Class: app.Program
757
+ Finish
758
+
759
+ Ezutan hozzuk letre a csomagokat:
760
+ modell
761
+ nezet
762
+
763
+ A Program.java az app csomagban legyen.
764
+
765
+ Gyors ellenorzes:
766
+ package app;
767
+
768
+ public class Program {
769
+ public static void main(String[] args) {
770
+ System.out.println("Program indul");
771
+ }
772
+ }
773
+
774
+ Ha fut, jo a projekt.
775
+
776
+
777
+ 2. MODELL / ENTITAS OSZTALY
778
+
779
+ A bemeneti fajl oszlopai alapjan hozzuk letre a mezoket.
780
+
781
+ Pelda bemeneti adat:
782
+ NEV;AR
783
+ X;120
784
+ Y;80
785
+ X;140
786
+
787
+ modell/Termek.java:
788
+
789
+ package modell;
790
+
791
+ public class Termek {
792
+ private String nev;
793
+ private int ar;
794
+
795
+ public Termek(String nev, int ar) {
796
+ this.nev = nev;
797
+ this.ar = ar;
798
+ }
799
+
800
+ public Termek(String sor) {
801
+ String[] adatok = sor.split(";");
802
+ this.nev = adatok[0].trim();
803
+ this.ar = Integer.parseInt(adatok[1].trim());
804
+ }
805
+
806
+ public String getNev() {
807
+ return nev;
808
+ }
809
+
810
+ public int getAr() {
811
+ return ar;
812
+ }
813
+
814
+ @Override
815
+ public String toString() {
816
+ return "Termek{" + "nev='" + nev + "'" + ", ar=" + ar + '}';
817
+ }
818
+ }
819
+
820
+ Fontos gondolatok:
821
+ private mezok = adatrejtes / enkapszulacio
822
+ konstruktor = objektum inicializalasa
823
+ this = aktualis objektum
824
+ String sor konstruktor = a fajl egy sorabol objektumot keszit
825
+ split(";") = feldarabolja a sort
826
+ trim() = levagja a felesleges szokozoket
827
+ Integer.parseInt() = Stringbol int
828
+ getter = adat lekerese
829
+ @Override toString() = objektum szoveges megjelenitese
830
+
831
+ Ha a feladat kategoriat vagy tipust tartalmaz, szukseg lehet enumra.
832
+ Ha Set/Map es objektum-egyenloseg miatt szukseges, equals() es hashCode() is kellhet.
833
+
834
+
835
+ 3. FAJL HELYE ES FAJLOLAVASAS
836
+
837
+ Ant projekt eseten a bemeneti fajl a projekt gyokerkonyvtaraban lehet, hogy a kovetkezo eleres mukodjon:
838
+ Path.of("termekek.txt")
839
+
840
+ Pelda termekek.txt:
841
+ NEV;AR
842
+ X;120
843
+ Y;80
844
+ X;140
845
+ Z;200
846
+ Y;100
847
+
848
+ Fajlbeolvasas:
849
+ Files.readAllLines(Path.of("termekek.txt"));
850
+
851
+ Ehhez tipikus importok:
852
+ import java.io.IOException;
853
+ import java.nio.file.Files;
854
+ import java.nio.file.Path;
855
+ import java.util.ArrayList;
856
+ import java.util.List;
857
+
858
+ Az elso sor gyakran fejlec, ezert a ciklus 1-tol indul.
859
+
860
+
861
+ 4. MODELLKEZELO / UZLETI LOGIKA
862
+
863
+ modell/TermekKezelo.java:
864
+
865
+ package modell;
866
+
867
+ import java.io.IOException;
868
+ import java.nio.file.Files;
869
+ import java.nio.file.Path;
870
+ import java.util.ArrayList;
871
+ import java.util.List;
872
+
873
+ public class TermekKezelo {
874
+ private List<Termek> termekek;
875
+
876
+ public TermekKezelo() {
877
+ termekek = new ArrayList<>();
878
+ beolvas();
879
+ }
880
+
881
+ private void beolvas() {
882
+ try {
883
+ List<String> sorok = Files.readAllLines(Path.of("termekek.txt"));
884
+
885
+ for (int i = 1; i < sorok.size(); i++) {
886
+ termekek.add(new Termek(sorok.get(i)));
887
+ }
888
+ } catch (IOException e) {
889
+ throw new RuntimeException("Nem sikerult beolvasni a fajlt", e);
890
+ }
891
+ }
892
+ }
893
+
894
+ Logika:
895
+ fajl -> List<String> -> soronkent new Termek(...) -> List<Termek>
896
+
897
+ A beolvasast es a statisztikai logikat ne a main-be omleszd.
898
+
899
+
900
+ 5. LIST, SET, MAP
901
+
902
+ List:
903
+ List<Termek> termekek = new ArrayList<>();
904
+
905
+ List jellemzo:
906
+ sorrend van
907
+ ismetlodhetnek az elemek
908
+ index alapjan elerheto
909
+
910
+ Set:
911
+ Set<String> nevek = new HashSet<>();
912
+
913
+ Set jellemzo:
914
+ nincs ismetlodes
915
+
916
+ ABC rendezett halmaz:
917
+ Set<String> nevek = new TreeSet<>();
918
+
919
+ Map:
920
+ Map<String, Integer> statisztika = new HashMap<>();
921
+
922
+ Map:
923
+ kulcs-ertek parok
924
+ pl. termeknev -> darabszam
925
+
926
+ Kulcs szerint rendezett Map:
927
+ Map<String, Double> atlagok = new TreeMap<>();
928
+
929
+
930
+ 6. MAXIMUM / MINIMUM KERESES
931
+
932
+ Pelda legdragabb ar:
933
+
934
+ public int legdragabbAr() {
935
+ int max = termekek.get(0).getAr();
936
+
937
+ for (Termek termek : termekek) {
938
+ if (termek.getAr() > max) {
939
+ max = termek.getAr();
940
+ }
941
+ }
942
+
943
+ return max;
944
+ }
945
+
946
+ Minimum ugyanez forditott feltetellel:
947
+ if (termek.getAr() < min)
948
+
949
+
950
+ 7. KULONBOZO ELEMEK
951
+
952
+ Pelda kulonbozo termeknevek:
953
+
954
+ public Set<String> termekNevek() {
955
+ Set<String> nevek = new TreeSet<>();
956
+
957
+ for (Termek termek : termekek) {
958
+ nevek.add(termek.getNev());
959
+ }
960
+
961
+ return nevek;
962
+ }
963
+
964
+ A TreeSet kiszuri az ismetlodest es rendezett halmazt ad.
965
+
966
+
967
+ 8. MAP STATISZTIKA
968
+
969
+ Pelda darabszam kategoriankent vagy nevenkent:
970
+
971
+ Map<String, Integer> statisztika = new HashMap<>();
972
+
973
+ for (Termek termek : termekek) {
974
+ String kulcs = termek.getNev();
975
+
976
+ if (statisztika.containsKey(kulcs)) {
977
+ int ertek = statisztika.get(kulcs);
978
+ statisztika.put(kulcs, ertek + 1);
979
+ } else {
980
+ statisztika.put(kulcs, 1);
981
+ }
982
+ }
983
+
984
+ Bejaras:
985
+ for (Map.Entry<String, Integer> entry : statisztika.entrySet()) {
986
+ System.out.println(entry.getKey() + " -> " + entry.getValue());
987
+ }
988
+
989
+
990
+ 9. ATLAG SZAMITAS
991
+
992
+ Termekenkenti atlaghoz tipikusan osszeg es darabszam kell az adott nevhez.
993
+ Az eredmeny Map<String, Double> lehet.
994
+ Ha ABC sorrend kell, TreeMap hasznalhato.
995
+
996
+ Pelda elvart hasznalat:
997
+ for (var e : modell.atlagArak().entrySet()) {
998
+ System.out.printf("%s: %.2f%n", e.getKey(), e.getValue());
999
+ }
1000
+
1001
+
1002
+ 10. METODUS TULTERHELES
1003
+
1004
+ Ugyanaz a metodusnev eltero parameterlistaval.
1005
+
1006
+ Pelda:
1007
+ public void arNoveles(double szazalek) {
1008
+ // szazalekkal novel
1009
+ }
1010
+
1011
+ public void arNoveles() {
1012
+ arNoveles(10);
1013
+ }
1014
+
1015
+ Az egyik parameterrel mukodik, a masik az alapertelmezett 10 szazalekot hasznalja.
1016
+
1017
+
1018
+ 11. RENDEZES
1019
+
1020
+ Comparable:
1021
+ termeszetes rendezes
1022
+ pl. a modell sajat alap rendezese
1023
+
1024
+ Comparator:
1025
+ kulso / mas szempont szerinti rendezes
1026
+ pl. ar szerint
1027
+
1028
+ Collator:
1029
+ ekezetes szovegek helyes rendezesehez hasznalhato
1030
+
1031
+ TreeSet:
1032
+ rendezett egyedi elemek
1033
+
1034
+ TreeMap:
1035
+ kulcs szerint rendezett kulcs-ertek parok
1036
+
1037
+
1038
+ 12. KONZOLOS RESZ
1039
+
1040
+ A konzolos nezet kulon osztalyban lehet:
1041
+ nezet/KonzolNezet.java
1042
+
1043
+ Pelda szerkezet:
1044
+
1045
+ package nezet;
1046
+
1047
+ import modell.TermekKezelo;
1048
+
1049
+ public class KonzolNezet {
1050
+ private TermekKezelo modell;
1051
+
1052
+ public KonzolNezet(TermekKezelo modell) {
1053
+ this.modell = modell;
1054
+ }
1055
+
1056
+ public void megjelenit() {
1057
+ System.out.println("Legdragabb ar: " + modell.legdragabbAr());
1058
+
1059
+ System.out.println("Termeknevek:");
1060
+ for (String nev : modell.termekNevek()) {
1061
+ System.out.println(nev);
1062
+ }
1063
+
1064
+ System.out.println("Atlagarak:");
1065
+ for (var e : modell.atlagArak().entrySet()) {
1066
+ System.out.printf("%s: %.2f%n", e.getKey(), e.getValue());
1067
+ }
1068
+ }
1069
+ }
1070
+
1071
+ A konzolos kiirasnal a feladat altal kert pontos szovegeket hasznald.
1072
+
1073
+ ABC sorrendhez TreeSet / TreeMap vagy megfelelo rendezes hasznalhato.
1074
+
1075
+
1076
+ 13. PROGRAM.JAVA - KONZOLOS INDULAS
1077
+
1078
+ package app;
1079
+
1080
+ import modell.TermekKezelo;
1081
+ import nezet.KonzolNezet;
1082
+
1083
+ public class Program {
1084
+ public static void main(String[] args) {
1085
+ TermekKezelo modell = new TermekKezelo();
1086
+ KonzolNezet konzol = new KonzolNezet(modell);
1087
+ konzol.megjelenit();
1088
+ }
1089
+ }
1090
+
1091
+ Logika:
1092
+ Program -> letrehozza a modellt -> atadja a nezetnek -> nezet megjelenit
1093
+
1094
+
1095
+ 14. GUI LETREHOZASA NETBEANSBEN
1096
+
1097
+ nezet package
1098
+ New -> Swing GUI Forms -> JFrame Form
1099
+ Class name: SwingNezet
1100
+ Finish
1101
+
1102
+ Alap beallitasok az ablakon:
1103
+ title: Termekek
1104
+ defaultCloseOperation: EXIT_ON_CLOSE
1105
+ meret: pl. kb. 400 x 400
1106
+
1107
+ NetBeans GUI Builder eseten a GroupLayout maradhat.
1108
+ Kodbol keszitett Swing feluletnel hasznalhato peldaul:
1109
+ BorderLayout
1110
+ FlowLayout
1111
+ GridLayout
1112
+
1113
+ Tipikus Swing komponensek:
1114
+ JFrame
1115
+ JButton
1116
+ JLabel
1117
+ JTextField
1118
+ JTextArea
1119
+ JComboBox
1120
+ JList
1121
+ JScrollPane
1122
+ JOptionPane
1123
+
1124
+
1125
+ 15. GUI KOMPONENSEK A MINTAPROJEKTBEN
1126
+
1127
+ Felul:
1128
+ JLabel
1129
+ szoveg: Legdragabb ar:
1130
+ valtozonev: lblLegdragabb
1131
+
1132
+ Bal oldalon:
1133
+ JComboBox
1134
+ valtozonev: cmbTermekek
1135
+
1136
+ Kozepen:
1137
+ JScrollPane
1138
+ benne JTextArea
1139
+ editable = false
1140
+ valtozonev: txtAtlagok
1141
+
1142
+ Alul:
1143
+ JLabel
1144
+ szoveg: Kivalasztott termek:
1145
+ valtozonev: lblKivalasztott
1146
+
1147
+
1148
+ 16. GUI ES MODELL OSSZEKOTESE
1149
+
1150
+ SwingNezet osztalyban:
1151
+
1152
+ private TermekKezelo modell;
1153
+
1154
+ Konstruktor:
1155
+
1156
+ public SwingNezet(TermekKezelo modell) {
1157
+ this.modell = modell;
1158
+ initComponents();
1159
+ feltolt();
1160
+ }
1161
+
1162
+ Igy a GUI ugyanazt a modellt hasznalja, amely az adatokat es a logikat tartalmazza.
1163
+
1164
+
1165
+ 17. GUI FELTOLTESE
1166
+
1167
+ private void feltolt() {
1168
+ lblLegdragabb.setText("Legdragabb ar: " + modell.legdragabbAr());
1169
+
1170
+ cmbTermekek.removeAllItems();
1171
+ for (String nev : modell.termekNevek()) {
1172
+ cmbTermekek.addItem(nev);
1173
+ }
1174
+
1175
+ StringBuilder sb = new StringBuilder("Atlagarak:
1176
+ ");
1177
+
1178
+ for (var e : modell.atlagArak().entrySet()) {
1179
+ sb.append(e.getKey())
1180
+ .append(": ")
1181
+ .append(String.format("%.2f", e.getValue()))
1182
+ .append("
1183
+ ");
1184
+ }
1185
+
1186
+ txtAtlagok.setText(sb.toString());
1187
+ }
1188
+
1189
+ GUI logika:
1190
+ modell.legdragabbAr() -> JLabel
1191
+ modell.termekNevek() -> JComboBox
1192
+ modell.atlagArak() -> JTextArea
1193
+
1194
+
1195
+ 18. ESEMENYKEZELES
1196
+
1197
+ JComboBox esemeny NetBeans Designerben:
1198
+ jobb klikk a JComboBoxon
1199
+ Events -> Action -> actionPerformed
1200
+
1201
+ Pelda:
1202
+
1203
+ private void cmbTermekekActionPerformed(java.awt.event.ActionEvent evt) {
1204
+ String nev = (String) cmbTermekek.getSelectedItem();
1205
+ lblKivalasztott.setText("Kivalasztott termek: " + nev);
1206
+ }
1207
+
1208
+ Kodbol esemenykezeles:
1209
+
1210
+ cmbTermekek.addActionListener(e -> {
1211
+ String nev = (String) cmbTermekek.getSelectedItem();
1212
+ lblKivalasztott.setText("Kivalasztott termek: " + nev);
1213
+ });
1214
+
1215
+ Button eseten:
1216
+
1217
+ btnValami.addActionListener(e -> onKlikk());
1218
+
1219
+ Ezek az esemenyvezerelt programozas alapjai.
1220
+
1221
+
1222
+ 19. JOPTIONPANE
1223
+
1224
+ Uzenet:
1225
+ JOptionPane.showMessageDialog(this, "Muvelet kesz");
1226
+
1227
+ Megerősiteshez hasznalhato showConfirmDialog.
1228
+
1229
+ Ablak bezarasanal lehet:
1230
+ EXIT_ON_CLOSE
1231
+ DO_NOTHING_ON_CLOSE
1232
+ WindowAdapter
1233
+
1234
+
1235
+ 20. PROGRAM.JAVA - GUI INDULAS
1236
+
1237
+ package app;
1238
+
1239
+ import modell.TermekKezelo;
1240
+ import nezet.SwingNezet;
1241
+
1242
+ public class Program {
1243
+ public static void main(String[] args) {
1244
+ TermekKezelo modell = new TermekKezelo();
1245
+
1246
+ java.awt.EventQueue.invokeLater(() -> {
1247
+ new SwingNezet(modell).setVisible(true);
1248
+ });
1249
+ }
1250
+ }
1251
+
1252
+
1253
+ 21. KONZOL + GUI EGY PROGRAMBAN
1254
+
1255
+ Ha ugyanaz a projekt mindket megjelenitest keri:
1256
+
1257
+ public static void main(String[] args) {
1258
+ TermekKezelo modell = new TermekKezelo();
1259
+
1260
+ KonzolNezet konzol = new KonzolNezet(modell);
1261
+ konzol.megjelenit();
1262
+
1263
+ java.awt.EventQueue.invokeLater(() -> {
1264
+ new SwingNezet(modell).setVisible(true);
1265
+ });
1266
+ }
1267
+
1268
+ Ugyanaz a modell megy a konzolos es a grafikus nezetnek.
1269
+
1270
+
1271
+ 22. MVC GONDOLKODAS
1272
+
1273
+ MODEL:
1274
+ Termek
1275
+ TermekKezelo
1276
+ adatok
1277
+ fajlbeolvasas
1278
+ statisztikai logika
1279
+
1280
+ VIEW:
1281
+ KonzolNezet
1282
+ SwingNezet
1283
+ megjelenites
1284
+ GUI komponensek
1285
+
1286
+ APP / INDÍTÁS:
1287
+ Program.java
1288
+ modell es nezetek peldanyositasa
1289
+
1290
+ Ne keverd a fajlbeolvasast es a statisztikai logikat a SwingNezet osztalyba.
1291
+ Ne keverd a GUI komponenseket a modellbe.
1292
+
1293
+
1294
+ 23. OOP ALAPFOGALMAK
1295
+
1296
+ Osztaly:
1297
+ objektumok sablonja, adatokat es metodusokat ir le
1298
+
1299
+ Objektum:
1300
+ egy osztaly konkret peldanya
1301
+ new kulcsszoval peldanyosithato
1302
+
1303
+ Konstruktor:
1304
+ az objektum kezdoallapotanak beallitasa
1305
+ neve megegyezik az osztaly nevevel
1306
+ nincs visszateresi tipusa
1307
+
1308
+ this:
1309
+ az aktualis objektumra hivatkozik
1310
+
1311
+ Encapsulation / adatrejtes:
1312
+ mezok private-ok
1313
+ hozzaferes ellenorzott modon, pl. gettereken keresztul
1314
+
1315
+ Orokles:
1316
+ class Kutya extends Allat
1317
+
1318
+ a gyermekosztaly orokolheti a szulo tulajdonsagait es metodusait
1319
+
1320
+ Override:
1321
+ a gyermekosztaly vagy interface-t megvalosito osztaly sajat megvalositast ad egy metodusnak
1322
+
1323
+ Overload:
1324
+ ugyanaz a metodusnev eltero parameterlistaval
1325
+
1326
+ Absztrakt osztaly:
1327
+ nem peldanyosithato kozvetlenul
1328
+ kozos allapotot es viselkedest is adhat
1329
+
1330
+ Interface:
1331
+ viselkedesi szerzodes
1332
+ az implementalo osztaly megvalositja az eloirt metodusokat
1333
+
1334
+ Polimorfizmus:
1335
+ kozos tipuson keresztul kulonbozo konkret objektumok kezelese
1336
+
1337
+
1338
+ 24. KOLLEKCIOK GYORSLISTA
1339
+
1340
+ ArrayList:
1341
+ rendezett lista
1342
+ ismetlodhet
1343
+ elemek indexelhetok
1344
+
1345
+ HashSet:
1346
+ nincs ismetlodes
1347
+ nem ABC rendezett
1348
+
1349
+ TreeSet:
1350
+ nincs ismetlodes
1351
+ rendezett
1352
+
1353
+ HashMap:
1354
+ kulcs-ertek
1355
+ nem kulcs szerinti rendezett
1356
+
1357
+ TreeMap:
1358
+ kulcs-ertek
1359
+ kulcs szerint rendezett
1360
+
1361
+
1362
+ 25. BEJARAS
1363
+
1364
+ Klasszikus for:
1365
+ for (int i = 0; i < lista.size(); i++) {
1366
+ System.out.println(lista.get(i));
1367
+ }
1368
+
1369
+ foreach:
1370
+ for (Termek termek : termekek) {
1371
+ System.out.println(termek);
1372
+ }
1373
+
1374
+ Map foreach:
1375
+ for (Map.Entry<String, Integer> entry : map.entrySet()) {
1376
+ System.out.println(entry.getKey() + " -> " + entry.getValue());
1377
+ }
1378
+
1379
+ Iterator is hasznalhato.
1380
+ Sajat osztaly Iterable implementacioval bejarhatova teheto, ha a feladat ezt keri.
1381
+
1382
+
1383
+ 26. VIZSGA-SORREND ROVIDEN
1384
+
1385
+ Projekt
1386
+ -> app/modell/nezet package
1387
+ -> adatfajl
1388
+ -> entitas osztaly
1389
+ -> private mezok
1390
+ -> konstruktor String sorbol
1391
+ -> getterek
1392
+ -> toString
1393
+ -> modellkezelo
1394
+ -> Files.readAllLines
1395
+ -> fejlec kihagyasa
1396
+ -> List<Model>
1397
+ -> max/min
1398
+ -> Set
1399
+ -> Map
1400
+ -> atlag/statisztika
1401
+ -> rendezes
1402
+ -> konzolos nezet
1403
+ -> pontos kiiras
1404
+ -> SwingNezet
1405
+ -> GUI komponensek
1406
+ -> modell atadasa a GUI-nak
1407
+ -> GUI feltoltese
1408
+ -> ActionListener / lambda
1409
+ -> Program.java
1410
+ -> konzol + GUI futtatas
1411
+
1412
+
1413
+ 27. HIBAKERESESI GYORSLISTA
1414
+
1415
+ Ha FileNotFound / beolvasasi hiba:
1416
+ ellenorizd a fajl nevet es helyet
1417
+
1418
+ Ha NumberFormatException:
1419
+ ellenorizd a split utan kapott szoveget
1420
+ hasznalj trim()-et
1421
+ ellenorizd, hogy a fejlec ki van-e hagyva
1422
+
1423
+ Ha ArrayIndexOutOfBoundsException:
1424
+ ellenorizd a split eredmenyet es az input sor formatumat
1425
+
1426
+ Ha ures a lista:
1427
+ ellenorizd a Files.readAllLines eredmenyet
1428
+ ellenorizd a ciklus kezdőindexet
1429
+
1430
+ Ha a GUI ures:
1431
+ ellenorizd, hogy a modell at lett-e adva
1432
+ ellenorizd, hogy az initComponents() es a feltolt() lefut-e
1433
+
1434
+ Ha a JComboBox esemenynel null ertek jelenik meg:
1435
+ ellenorizd a getSelectedItem() eredmenyet, mert feltoltes kozben is lefuthat esemeny
1436
+
1437
+ Ha nem ABC a sorrend:
1438
+ TreeSet / TreeMap / Comparator / Collator szukseges lehet a konkret feladattol fuggoen
1439
+
1440
+
1441
+ 28. MEMORIAFOGAS
1442
+
1443
+ Java konzolos resz:
1444
+ fajl -> objektumok -> lista -> szamitas -> kiiras
1445
+
1446
+ Java GUI resz:
1447
+ modell -> GUI komponensek feltoltese -> esemeny -> GUI frissitese
1448
+
1449
+ Teljes logika:
1450
+ fajl -> modell -> uzleti logika -> konzol / Swing GUI
1451
+
1452
+ A Program indit.
1453
+ A modell dolgozik.
1454
+ A nezet megjelenit.
1455
+
1456
+
1457
+
1458
+ *******************************************************
3
1459
  path:
4
1460
  receptkonyv\frontend\src\components\KategoriaSelect.js
5
1461
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axios-utils-lts",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"