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.
- package/index.js +1456 -0
- 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
|
|