Các tài li羽u mà em tham kh違q"8逢嬰c s穎 d映ng trong Lu壱n v... Xwgz"e p"8逢嬰e"zgo"pj逢"n "o瓜v"vj逢"xk羽p"f́pi"8吋 qu違n lý state cho các 泳ng d映ng c栄a Vue b茨ng cách s穎 d映ng store t壱p trung hóa và to
Trang 1A萎I H窺C QU渦C GIA TP.HCM VT姶云PI"A萎I H窺C BÁCH KHOA
Trang 2A萎K"J窺E"SW渦E"IKC"VR0JEO E浦PI"JñC"ZÊ"J浦K"EJ曳"PIJ C"XK烏V"PCO
VT姶云PI"A萎K"J窺E"DèEJ"MJQC
KHOA:KH & KT Máy tính PJK烏O"X影"NW一P"èP"V渦V"PIJK烏R
D浦"OðP<HTTT Ej¿"#<"Ukpj"xk‒p"rjVk"f p"vぜ"p {"x q"vtcpi"pjXv"eてc"dVp"vjw{xv"vt·pj
J窺"XÉ"VçP< Piw{宇p"Fw{"A衣q _ MSSV: 1510654 J窺"XÉ"VçP< _ MSSV: _ J窺"XÉ"VçP< _ MSSV: _
30"A亥w"8隠"nw壱p" p<
Rj v"vtk吋p"j羽"vj嘘pi"8 q"v衣q"j厩"vt嬰"vj詠e"v壱r"ukpj _
40"Pjk羽o"x映"*{‒w"e亥w"x隠"p瓜k"fwpi"x "u嘘"nk羽w"dcp"8亥w+<
絃 V·o"jk吋w"x "rj¤p"v ej"e e"j羽"vj嘘pi"jk羽p"e„0
絃 V·o"jk吋w"e e"e»pi"pij羽"jk羽p"8衣k"8吋"rj v"vtk吋p"j羽"vj嘘pi0
絃 Pj壱p"fk羽p"e e"d k"vq p"e„"nk‒p"swcp"x "8隠"zw医v"ik違k"rj r0
Trang 3VT姶云PI"A萎K"J窺E"DèEJ"MJQC E浦PI"JñC"ZÊ"J浦K"EJ曳"PIJ C"XK烏V"PCO
-UX"8«"v·o"jk吋w"x "rj¤p"v ej"pj英pi"v pj"p<pi"e亥p"e„"ejq"o瓜v"j羽"vj嘘pi"8 q"v衣q"j厩"vt嬰"vj詠e"v壱r"ukpj
- J羽"vj嘘pi"8逢嬰e"rj v"vtk吋p x噂k"e e"e»pi"pij羽"jk羽p"8衣k."e e"ej泳e"p<pi"j厩"vt嬰"ejq"pi逢運k"ik o"u v"v鰻"ej泳e"vj詠e"v壱r."x "vj詠e"v壱r"ukpj"vtqpi"sw "vt·pj"vj詠e"v壱r"v衣k"8挨p"x鵜
Trang 4L 運k"eco"8qcp
Em zkp"eco"8qcp"8ây là h羽 th嘘ng do chính em th詠c hi羽n Các tài li羽u mà em tham kh違q"8逢嬰c s穎 d映ng trong Lu壱n v<p"8隠w"8逢嬰c trích d磯n 荏 ph亥n tài li羽u tham kh違o N院u khôpi"8úng nh逢 8ã nêu trên, em xin hoàn toàn ch鵜u trách nhi羽m v隠 8隠 tài c栄a mình
Ukpj"xk‒p"vj詠e"jk羽p Piw{宇p"Fw{"A衣q
Trang 5L 運i c違o"挨p
L運k"8亥u tiên, Em xin g穎i l運i c違o"挨p"ej¤p"vj pj"t噂i các Th亥y cô c栄c"Vt逢運pi"A衣i h丑c Bách Khoa, các th亥y cô khoa Khoa h丑c và K悦 thu壱t máy tính c栄c"Vt逢運pi"8«"v壱n tình j逢噂ng d磯n và t衣q"8k隠u ki羽n cho em trong su嘘t quá trình h丑c t壱r"e pi"pj逢"vtqpi"xk羽c hoàn thành Lu壱p"x<p"v嘘t nghi羽p
A員c bi羽t em xin bày t臼 lòng bi院v"挨p"u¤w"u逸e"8院n th亥y giáo TS Phan Tr丑ng Nhân, pi逢運k"vj亥{"8«"v壱p"v·pj"j逢噂pi"f磯p."ej雨"d違q."ik¿r"8叡"go"vtqpi"uw嘘v"vj運k"ikcp"go"vj詠e"jk羽p"8隠"v k0"Vj亥{"e pi"n "pi逢運k ik¿r"go"8鵜pj"j逢噂ng, 8逢c"tc"pj英pi"i„r"#"sw#"d w"x "m鵜r"vj運k"8吋 go"e„"vj吋 hoàn thành t嘘t bài Lu壱p"x<p"v嘘t nghi羽p c栄a mình
Ew嘘k cùng, em xin e違o 挨p gia 8·pj d衣p bè, pi逢運k thân 8« luôn 荏 bên 8吋 8瓜pi viên
và là piw欝p e鰻 x n噂p lao, là 8瓜pi n詠e giúp em hoàn thành nw壱p x<p này
O員e dù 8« e嘘 i逸pi hoàn thành nw壱p x<p trong rj衣o vi và mj違 p<pi e„ vj吋0 Tuy nhiên
u胤 không tránh mj臼k pj英pi vjk院w u„v Em t医v mong pj壱p 8逢嬰e u詠 e違o thông và v壱p tình ej雨 d違q e栄c sw# vj亥{ cô Em e pi xin n逸pi nghe và vk院r thu pj英pi # mk院p e栄c giáo viên rj違p dk羽p 8吋 hoàn vjk羽p d鰻 sung pj英pi mk院p vj泳e còn vjk院w u„v e栄c mình
Em xin chân thành e違o 挨p#
Tp H欝 Ej "Okpj."vj pi"9"p<o"4243
Trang 6Tóm t 逸t lu壱p"x<p
Pi pj"e»pi"pij羽"vj»pi"vkp"jk羽p"pc{"8cpi"rj v"vtk吋p"t医v"pjcpj."nw»p"8 k"j臼k"piw欝p"pj¤p"n詠e"ej医v"n逢挨pi"ecq0"Pj逢pi"vj詠e"vt衣pi jk羽p"pc{."j亥w"j院v"e e"fqcpj"pijk羽r"ow嘘p"e„"8逢嬰e"pj¤p"u詠"8 r"泳pi"{‒w"e亥w"u胤"rj違k"8 q"v衣q"n衣k"vtqpi"o瓜v"vj運k"ikcp"pi逸p0"Ikck"8q衣p"
p {"n "vj運k"ikcp"vj詠e"v壱r."pj¤p"xk‒p"8cpi"vtqpi"ikck"8q衣p"p {"i丑k"n "vj詠e"v壱r"ukpj0"Jk羽p"v衣k"8c"u嘘"e e"e»pi"v{."fqcpj"pijk羽r"8cpi"8 q"v衣q"vj詠e"v壱r"ukpj"vjgq"rj逢挨pi"rj r"ikcq"ejq"o瓜v"pj¤p"xk‒p"ej pj"vj泳e"8«"e„"pjk隠w"mkpj"pijk羽o"8吋"sw違p"n#."8 q"v衣q0"Xk羽e"p {"v欝p"v衣k"pjk隠w"d医v"e壱r"pj逢"mj»pi"vjgq"f k"e映"vj吋"p<pi"n詠e"e栄c"vj詠e"v壱r"ukpj"vtqpi"sw "vt·pj"8 q"v衣q."mj»pi"8違o"d違q"8逢嬰e"ej医v"n逢嬰pi"8 q"v衣q"x "ej逢c"j羽"vj嘘pi"jq "sw "vt·pj"
8 q"v衣q"p {"o員e"f́"j亥w"j院v"e e"e»pi"v{"fqcpj"pijk羽r"vj逢運pi"zw{‒p"e„"e e"8嬰v"8 q"v衣q"vj詠e"v壱r"ukpj"pj逢"x壱{0"Pj逢"x壱{"ej¿pi"vc"e„"vj吋"vj医{"pjw"e亥w"z¤{"f詠pi"o瓜v"j羽"vj嘘pi"sw違p"n#"sw "vt·pj"8 q"v衣q"p {"n "t医v"e亥p"vjk院v ik¿r"e e"e»pi"v{"fqcpj"pijk羽r"e„"vj吋"j羽"vj嘘pi"jq "sw "vt·pj"8 q"v衣q."f宇"f pi"sw違p"n#"ej医v"n逢嬰pi"8 q"v衣q"e pi"pj逢"nw»p"p逸o"d逸v"8逢嬰e"vt·pj"8瓜"x "p<pi"n詠e"e栄c"e e"vj詠e"v壱r"ukpj0"V瑛"8„."go"8«"z¤{"f詠pi"n‒p"o瓜v"j羽"vj嘘pi"j厩"vt嬰"sw違p"n#"x "8 q"v衣q"vj詠e"v壱r"ukpj"f pj"ejq"e e"e»pi"v{"fqcpj"pijk羽r"ejw{‒p"x隠"e»pi"pij羽"vj»pi"vkp0
Go"vjco"mj違q"#"mk院p"v瑛"o瓜v"u嘘"e»pi"v{"fqcpj"pijk羽r"x "pj·p"pj壱p"v瑛"vj詠e"v院"vtqpi"vj運k"ikcp"vjco"ikc"vj詠e"v壱r."v瑛"8„"v鰻pi"m院v"x "z¤{"f詠pi"o瓜v"ygdukvg"j厩"vt嬰"8 q"v衣q"x "sw違p"n#"vj詠e"v壱r"ukpj"x噂k pj英pi"ej泳e"p<pi"e<p"d違p"pj逢"ucw: Z¤{"f詠pi"n瓜"vt·pj"j丑e"1"d k"j丑e ejq"vj詠e"v壱r"ukpj."v衣q"x "sw違p"n#"e e"ej雨"u嘘"ik¿r"ngcfgt"x "ogpvqt"e„"vj吋"sw違p"n#"ej医v"n逢嬰pi"8 q"v衣q."8c"f衣pi"jq "e e"d k"mk吋o"vtc"8吋"ogpvqt"e„"vj吋"8 pj"ik "vj詠e"v壱r"ukpj"荏"pjk隠w"mj c"e衣pj"j挨p."vj詠e"v壱r"ukpj"v衣q"d q"e q"j pi"pi {"x "n o"e e"d k"mk吋o"vtc"8吋"ogpvqt"e„"vj吋"vjgq"f k"x "j厩"vt嬰"mjk"e亥p"vjk院v."j羽"vj嘘pi"f詠c"vt‒p"e e"ej雨"u嘘"dcp"8亥w"x "i嬰k"#"ejq"fqcpj"pijk羽r"e e"vj詠e"v壱r"ukpj"e„"p<pi"n詠e"v嘘v"pj医v0
D q"e q"p {"u胤"vt·pj"d {"8亥{"8栄"e e"v pj"p<pi"8«"p‒w"vt‒p0
Trang 7M 影C L影C
EJ姶愛PI"3 1
IK閏K"VJK烏W"A陰"VÉK 1
1.1 T鰻pi"swcp"8隠 tài 1
304 O映e"vk‒w"x "rj衣o"xk"8隠"v k 1
1.3 E医w"vt¿e"nw壱p"x<p 4
EJ姶愛PI"4 3
E愛"U雲 N""VJW[蔭V"XÉ"EðPI"PIJ烏 3
403 Các công ngh羽 phía Client Side (Frontend) 3
40303 Single Page Application (SPA) 3
40304 Htcogyqtm"rj v"vtk吋p"Htqpvgpf"XwgLU 5
40305 O»"j·pj"OXXO"x "Eqorqpgpv 7
40306 Xwg"Tqwvgt 9
40307 Xwgz 9
40308 TypeScript 11
40309 V衣q"vt·pj"uq衣p"vj違q"x<p"d違p"x噂k"EMGfkvqt 34
404 Các công ngh羽 phía Server Side (Backend) 13
40403 Ki院p"vt¿e"TGUVhwn"CRK 13
40404 Ngôn ng穎 8吋 phát tri吋p"Dcemgpf"PqfgLU 14
40405 X穎 n#"Cwvjgpvkecvkqp"x噂k"LYV"*C"LUQP"Ygd"Vqmgp+ 16
40406 LQK"pro 17
40407 E挨"u荏 d英 li羽u MongoDB 18
EJ姶愛PI"5 42
DÉK"VQèP"XÉ"IK謂K"RJèR 42
3.1 Bài toán x穎 n#"xk羽c upload các t羽p 42
Trang 8504 Bài toán trình so衣n th違q"x<p"d違n 42
3.3 Bài toán b違o m壱t h羽 th嘘ng 43
3.3.1 B違o m壱t phía máy khách 43
50504 B違o m壱t phía máy ch栄 45
3.3.3 B違o m壱v"rj c"e挨"u荏 d英 li羽u 46
3.4 Bài toán v隠 s詠 linh ho衣t trong nhu c亥u s穎 d映ng 47
3.4.1 Bài toán v隠 s詠 linh ho衣t trong n瓜k"fwpi"8 q"v衣o 48
50604 Bài toán v隠 g嬰k"#"pj¤p"u詠 49
3.4.3 Bài toán v隠 s詠 linh ho衣v"vtqpi"rj逢挨pi"rj r"8 pj"ik 4;
EJ姶愛PI"6 30
RJåP"VëEJ"XÉ"VJK蔭T K蔭 H烏 TH渦PI 30
4.1 Phân tích yêu c亥u 30
4.1.1 [‒w"e亥w"pi逢運i dùng 30
60304 [‒w"e亥u h羽 th嘘ng 54
604 Thi院t k院 h羽 th嘘ng 54
60403 Thi院t k院 Wug"Ecug 33
60404 Thi院t k院 e挨"u荏 d英 li羽u 74
EJ姶愛PI"7 57
JK烏N TH衛C H烏 TH渦PI 57
5.1 Thi院t k院 h羽 th嘘ng 57
704 Qu違p"n#"o«"piw欝n 57
5.3 K院t qu違 hi羽n th詠c 58
5.3.1 Pj„o"ej泳e"p<pi"ejwpi 58
70504 Pj„o"ej泳e"p<pi"ejwpi"e栄c"pi逢運i qu違p"n#"*cfokp+"x "pi逢運k"j逢噂ng d磯n (mentor) 59
5.3.3 Pj„o"ej泳e"p<pi"pi逢運i qu違p"n#"*cfokp+ 61
Trang 95.3.4 Pj„o"ej泳e"p<pi"pi逢運k"j逢噂ng d磯n (mentor) 63
5.3.5 Pj„o"ej泳e"p<pi"vj詠c t壱p sinh (mentee) 64
EJ姶愛PI"8 68
T蔚PI"M蔭T 68
6.1 K院t qu違 8衣v"8逢嬰c 68
804 H衣n ch院 68
6.3 J逢噂ng phát tri吋p"v逢挨pi"nck 69
Trang 10FCPJ"UèEJ"JîPJ"X淫
J·pj"403: S詠 khác nhau v隠 lu欝pi"8k"e栄a 泳ng d映pi"Ygd"vtqpi"URC"x "ORC 4
J·pj"404<"XwgLU"]4_ 5
Hình 405<"Nkhge{eng"XwgLU"]5_ 6
J·pj"4.4: C医u trúc 泳ng d映ng t鰻 ch泳e"f逢噂i d衣ng cây component l欝ng nhau ]6_ 7
J·pj"407: C医u trúc Single File Component ]7_ 8
Hình 408: Code s穎 d映pi"Xwg-Tqwvgt"8吋 8鵜nh tuy院n trang Dashboard 9
J·pj"409<"U挨"8欝 ki院p"vt¿e"Xwgz"]8_ 10
Hình 40:: TypeScript ]:_ 11
J·pj"40;<"Ikcq"fk羽n CKEditor ];_ 34
J·pj"4032: Piw{‒p"n#"jq衣v"8瓜ng c栄c"TGUVhwn"CRK ]35_ 14
J·pj"4 11<"E挨"ej院 asynchronous event-ftkxgp"vtqpi"PqfgLU"]37_ 15
Hình 40"34<"U挨"8欝 h羽 th嘘ng s穎 d映pi"LYV ]39_ 16
Hình 3.1: Trình so衣n th違q"x<p"d違n s穎 d映ng CKEditor 43
J·pj"504: Activity Diagram c栄a l噂p b違o m壱v"8k隠u khi吋n truy c壱p trên router 44
Hình 3.3: Ki吋m th穎 d英 l羽w"rj c"o {"pi逢運i dùng 45
Hình 3.4: Các l噂p b違o m壱v"8«"jk羽n th詠c trong h羽 th嘘ng 47
Hình 3.5: C医u trúc c栄a m瓜t n瓜k"fwpi"8 q"v衣o t瑛 h羽 th嘘ng 49
Hình 3 6: Thông tin c栄a m瓜t h丑c viên v噂i ch雨 s嘘 g嬰k"#"*Tgeqoogpf"Tcvg) 4:
Hình 3 7: Hình 違nh v隠 b瓜 các ch雨 s嘘 8 pj"ik "e栄a h羽 th嘘ng 4;
Hình 4.1<"U挨"8欝 ki院n trúc h羽 th嘘ng 54
Hình 4 4<"Wug"Ecug"ejq"e e"8嘘k"v逢嬰ng trong h羽 th嘘ng 33
Hình 4 3<"Wug"ecug"ejq"pi逢運i qu違p"n#"*cfokp+ 34
Trang 11Hình 4 4<"Wug"ecug"ejq"pi逢運k"j逢噂ng d磯n (Mentor) 41
Hình 4 5<"Wug"ecug"ejq"vj詠c t壱p sinh (mentee) 47
Hình 4 6<"O»"j·pj"GTF"e栄a h羽 th嘘ng 74
Hình 5 1<"Ikcq"fk羽p"8<pi"pj壱p 58
J·pj"70"4: Ikcq"fk羽n quên m壱t kh育u 59
Hình 5 3<"Ikcq"fk羽n ch雨nh s穎a thông tin tài kho違n 59
Hình 5 4<"Ikcq"fk羽n dashboard 60
Hình 5 5: Qu違p"n#"pj„o"p瓜k"fwpi"8 q"v衣o 60
Hình 5 6: Ch泳e"p<pi"v衣o m噂k"pj„o"p瓜i dung môn h丑c 60
Hình 5 7: Ch泳e"p<pi"v衣o m噂i n瓜i dung môn h丑c 61
Hình 5 8: Ch泳e"p<pi"ej雨nh s穎a n瓜i dung môn h丑c 61
Hình 5 9: Ch泳e"p<pi"sw違p"n#"d瓜 ch雨 s嘘 8 pj"ik "p<pi"n詠c 84
Hình 5 10: Ch泳e"p<pi"v衣o tài kho違n 84
Hình 5 11: Ch泳e"p<pi"rj¤p"e»pi"pi逢運k"j逢噂ng d磯n và c医p quy隠n truy c壱p n瓜i dung 8 q"v衣o cho th詠c t壱p sinh 63
J·pj"70"34: Ch泳e"p<pi"ej医o"8k吋m bài ki吋m tra cho th詠c t壱p sinh 63
Hình 5 13: Ch泳e"p<pi"zgo"x "rj違n h欝i báo cáo c栄a th詠c t壱p sinh 64
Hình 5 14: Ch泳e"p<pi"zgo"ej雨 s嘘 p<pi"n詠c và nh逸c nh荏 công vi羽c hàng ngày 64
Hình 5 15: Ch泳e"p<pi"zgo"p瓜k"fwpi"8 q"v衣o 65
Hình 5 16: Ch泳e"p<pi"n o"d k"8 pj"ik "p<pi"n詠c 65
Hình 5 17: Ch泳e"p<pi"n o"d k"mk吋m tra 66
Hình 5 18<"<"Ikcq"fk羽n t衣q"d q"e q"ejq"pi逢運k"j逢噂ng d磯n 66
Hình 5 19<"Ikcq"fk羽n xem ph違n h欝i c栄c"pi逢運k"j逢噂ng d磯n 67
Trang 12B違ng 4 1<"Wug"ecug"- c壱p nh壱t thông tin cá nhân 35
B違pi"60"4<"Wug"ecug"– zgo"vj»pi"vkp"8 pj"ik "p<pi"n詠c c栄a các th詠c t壱p sinh 35
B違ng 4 3<"Wug"ecug"– Qu違p"n#"e e"pj„o"p瓜k"fwpi"8 q"v衣o (t衣o m噂i) 36
B違ng 4 4<"Wug"ecug"– Qu違p"n#"e e"pj„o"p瓜k"fwpi"8 q"v衣o (ch雨nh s穎a ho員c xoá) 37
B違ng 4 5<"Wug"ecug"– Qu違p"n#"p瓜k"fwpi"8 q"v衣o (t衣o m噂i) 37
B違ng 4 6<"Wug"ecug"– Qu違p"n#"p瓜k"fwpi"8 q"v衣o (ch雨nh s穎a) 38
B違ng 4 7<"Wug"ecug"– Qu違p"n#"p瓜k"fwpi"8 q"v衣o (xoá) 38
B違ng 4 8<"Wug"ecug"– Qu違p"n#"v k"mjq違n th詠c t壱r"ukpj"x "pi逢運k"j逢噂ng d磯n (t衣o m噂i) 39 B違ng 4 9<"Wug"Ease – Rj¤p"e»pi"pi逢運k"j逢噂ng d磯n và c医p quy隠n truy c壱p n瓜i dung h丑c cho th詠c t壱p sinh 39
B違ng 4 10<"Wug"ecug"– Qu違p"n#"d瓜 các ch雨 s嘘 8 pj"ik "vj詠c t壱p sinh (t衣o m噂i) 40
B違ng 4 11<"Wug"ecug"- Qu違p"n#"d瓜 các ch雨 s嘘 8 pj"ik "vj詠c t壱p sinh (ch雨nh s穎a) 40
B違pi"60"34<"Wug"ecug"- Qu違p"n#"d瓜 các ch雨 s嘘 8 pj"ik "vj詠c t壱p sinh (xoá) 40
B違ng 4 13<"Wug"ecug"– c壱p nh壱t thông tin cá nhân 64
B違ng 4 14<"Wug"ecug"– zgo"vj»pi"vkp"8 pj"ik "p<pi"n詠c c栄a các th詠c t壱p sinh 64
B違ng 4 15<"Wug"ecug"– Qu違p"n#"e e"pj„o"p瓜k"fwpi"8 q"v衣o (t衣o m噂i) 43
B違ng 4 16<"Wug"ecug"– Qu違p"n#"e e"pj„o"p瓜k"fwpi"8 q"v衣o (ch雨nh s穎a ho員c xoá) 43
B違ng 4 17<"Wug"ecug"– Qu違p"n#"p瓜k"fwpi"8 q"v衣o (t衣o m噂i) 44
B違ng 4 18<"Wug"ecug"– Qu違p"n#"p瓜k"fwpi"8 q"v衣o (ch雨nh s穎a) 44
B違ng 4 19<"Wug"ecug"– Qu違p"n#"p瓜k"fwpi"8 q"v衣o (xoá) 45
B違pi"60"42<"Wug"ecug"– Ph違n h欝i báo cáo (daily report) c栄a th詠c t壱p sinh 45
B違pi"60"43<"Wug"ecug"– Ch医o"8k吋o"ejq"d k"8 pj"ik "p<pi"n詠c c栄a th詠c t壱p sinh 46
B違pi"60"44<"Wug"ecug"– Ch医o"8k吋m cho bài ki吋m tra c栄a th詠c t壱p sinh 46
B違pi"60"45<"Wug"ecug"– c壱p nh壱t thông tin cá nhân 48
Trang 13B違pi"60"46<"Wug"ecug"– Xem thông tin v隠 các ch雨 s嘘 8 pj"ik "p<pi"n詠c 48
B違pi"60"47<"Wug"ecug"– Truy c壱p và h丑c các n瓜k"fwpi"8 q"v衣q"8«"8逢嬰c c医p quy隠n 49
B違pi"60"48<"Wug"ecug"– N o"d k"8 pj"ik "p<pi"n詠c (n院w"e„+ 49
B違pi"60"49<"Wug"ecug"– Làm bài ki吋m tra sau m厩i bài h丑c 50
B違pi"60"4:<"Wug"ecug"– T衣q"d q"e q"ejq"pi逢運k"j逢噂ng d磯n 50
B違pi"60"4;<"Wug"ecug"– T衣q"d q"e q"ejq"pi逢運i j逢噂ng d磯n 51
B違ng 4 30<"Wug"ecug"– A<pi"pj壱p 51
B違ng 4 31<"Wug"ecug"– L医y l衣i m壱t kh育u 74
B違pi"60"54<"Uejgoc"Tqng 53
B違ng 4 33<"Uejgoc"Wugt 53
B違ng 4 34<"Uejgoc"UwdKpfgz 53
B違ng 4 35: Schema Assign 54
B違ng 4 36: Schema Subject 54
B違ng 4 37: Schema Course 54
B違ng 4 38: Schema Days 55
B違ng 4 39: Schema Lessions 55
B違ng 4 40: Schema Questions 55
B違ng 4 41<"Uejgoc"Cpuygtu 56
B違pi"60"64<"Uejgoc"Tgrqtvu 56
B違ng 5 1: Công ngh羽 s穎 d映ng trong h羽 th嘘ng 57
Trang 14EJ姶愛PI"3
IK閏K"VJK烏W A陰"VÉK
1.1 T鰻pi"swcp 8隠 tài
Trong b嘘i c違nh h羽 th嘘ng các ch逢挨ng trìpj"8ào t衣o n瓜i b瓜 trong doanh nghi羽p còn khá
m噂i m飲, vi羽c tri吋p"mjck"8ào t衣o còn g員p khá nhi隠u nh英ng kh„ kh<n M厩i doanh nghi羽p,
t鰻 ch泳c c„ nét v<n h„c."8員c thù khác nhau nên các ch逢挨ng trình c ng c亥p"8逢嬰c xây d詠ng phù h嬰r0"A吋 c„ h逢噂pi"8k"8úpi"8逸n, doanh nghi羽p c亥n hi吋u ch逸c ch逸n v隠 8ào t衣o n瓜i b瓜
và các v医p"8隠 liên quan
Aào t衣o n瓜i b瓜 là quá trình các nhân viên trong doanh nghi羽r"8衣v"8逢嬰c các k悦 n<ng
c亥n thi院t trong trong công vi羽c thông qua các kh„a h丑c, ch逢挨ng trìpj"8ào t衣o do doanh nghi羽p t鰻 ch泳c, xây d詠pi0"Aây là quá trình n隠n t違ng cho s詠 thành công c栄a b医t k t鰻
ch泳c, doanh nghi羽p nào
Quá trìpj"8ào t衣o n瓜i b瓜 g逸n li隠n v噂i vi羽c duy trì nhân viên, nâng cao k悦 n<ng và các ki院n th泳c chuyên môn, nâng cao hi羽u su医t công vi羽c cho m厩i cá nhân trong doanh nghi羽p
ej pj"n "8 q"v衣q."sw違p"n#"ej医v"n逢嬰pi"1"p<pi"n詠e"x "vj嘘pi"m‒"e e"ej雨"u嘘"8 q"v衣q"pj茨o"8逢c"tc"e e"i嬰k"#"pj¤p"u詠"ejq"e»pi"v{."fqcpj"pijk羽r0"Xk羽e"z¤{"f詠pi"o瓜v"j羽"vj嘘pi"pj逢"vt‒p"8員v"tc o瓜v"u嘘"d k"vq p"pj逢<
Trang 15‚ Z¤{"f詠pi"j羽"vj嘘pi"e e"ej雨"u嘘"8 pj"ik "vj詠e"v壱r"ukpj"pj逢"vj院"p q"8吋"e„"vj吋"rj́"j嬰r"x噂k"e e"pjw"e亥w"mj ej"pjcw"e栄c"v瑛pi"fqcpj"pijk羽r"e pi"pj逢"e„"vj吋"vjc{"8鰻k"mjk"fqcpj"pijk羽r"vjc{"8鰻k"pjw e亥w."ej雨"vk‒w"o噂kA
1.3 E医w"vt¿e"nw壱p"x<p
Ph亥n còn l衣i c栄a b違n báo cáo lu壱p"x<p"u胤 8逢嬰c t鰻 ch泳e"pj逢"ucw<
‚ Ej逢挨pi"4<"E挨"u荏 n#"vjw{院t và công ngh羽
‚ Ej逢挨pi"5: Bài toán và gi違i pháp
‚ Ej逢挨pi"6: Phân tích và thi院t k院 h羽 th嘘ng
‚ Ej逢挨pi"7: Hi羽n th詠c h羽 th嘘ng
‚ Ej逢挨pi"8: T鰻ng k院t
Trang 16EJ姶愛PI 2
E愛"U雲 LÝ THUY蔭T VÀ CÔNG NGH烏
Trong quá trình làm lu壱n v<n, khi tìm h逢噂ng gi違i quy院t cho t瑛ng bài toán, em 8ã nghiên c泳u x "8逢c"tc"e e"ik違k"rj r c ng nh逢 nh英ng công ngh羽 giúp em gi違i quy院v"8逢嬰c nh英ng khúc m逸c g員p ph違k0"Ucw"8ây, em xin trình bày v隠 các c挨 s荏 l# thuy院t và công ngh羽 chính mà em 8ã s穎 d映ng
2.1 E e"e»pi"pij羽 rj c"Enkgpv"Ukfg"*Htqpvgpf+
Ygd"8«"e„"v瑛 r医v"n¤w"x "pi {"pc{"8«"n "o瓜t trong hai n隠n t違ng chính c栄a các ph亥n
m隠m, cùng v噂k"fk"8瓜pi0"Ygd"8«"rj v"vtk吋n liên t映c trong nhi隠w"p<o"x "ik運 8¤{"x噂i s詠 bùng n鰻 c栄c"8k羽n tho衣k"fk"8瓜pi."Rtqitguukxg"Ygd"Crr"8cpi"f亥n thay th院 cho các trang ygd"vtw{隠n th嘘ng vì nhi隠w"8員e"8k吋m ti羽n l嬰k"逢w"xk羽t c栄c"p„0"O瓜v"Rtqitguukxg"Ygd"Crr"
c亥n ph違i là m瓜v"Ukping"Rcig"Crrnkecvkqp"*URC+0"X噂i nhu c亥w"8„."t医t nhi隠w"htcogyqtm."vj逢"xk羽n hrontend m衣nh m胤 8«"tc"8運k"8吋 giúp l壱p trình viên xây d詠pi"8逢嬰c nh英ng trang ygd"URC"v逢挨pi"v e"ecq."hi羽u su医t t嘘t mà ít t嘘n công s泳c, th運i gian
2.1.1 Ukping"Rcig"Crrnkecvkqp"*URC+
Ygd"n "o瓜t 泳ng d映ng m衣pi"8«"v欝n t衣i t瑛 nh英pi"p<o"3;:;-1990, tr違i qua nhi隠u th運i
k khác nhau, t瑛 th運i mà m厩i khi nh医p chu瓜t vào m瓜v"o„p"j pi"vtqpi"o p"j·pj"fcpj"sách hàng, ng逢運i dùng ph違i ch運 8嬰i r医v"n¤w"8吋 trình duy羽t t違i nguyên m瓜t trang HTML
v隠 chi ti院v"o„p"j pi"v瑛 máy ch栄 v隠 8吋 hi吋n th鵜 ejq"pi逢運i dùng Trang HTML chi ti院t o„p"j pi"e„"ejwpi"Jgcfgt."Hqqvgt."Ukfgt"x噂k"vtcpi"JVON"fcpj"u ej"e e"o„p"j pi0"Th院 pj逢pi"p„"x磯n ph違i t違i l衣i t瑛 8亥w"x "8k隠w"8„"v医t nhiên không t嘘t v隠 m員t hi羽u su医t Chính vì th院 các k悦 u逢"8«"v嘘k"逢w"d茨ng cách t衣o ra các k悦 thu壱t giúp ch雨 t違i l衣i ph亥n d英 li羽u c亥n thi院t mà không c亥n ph違i t違i l衣i h院t toàn b瓜0"X "v瑛 8„"vjw壱t ng英 Single Page Application (SPA) ra 8運i
P„k"o瓜v"e ej"8挨p"ik違n, SPA là lo衣i 泳ng d映pi"Ygd"ej雨 bao g欝m 1 trang HTML duy nh医t M厩k"mjk"ej¿pi"vc"v逢挨pi"v e."8k隠w"j逢噂ng, phân trang ta ch雨 c亥n g丑k"CRK"8院n máy
Trang 17ch栄 8吋 l医y ph亥n d英 li羽u c亥n thi院t r欝k"ucw"8„"e壱p nh壱t l衣i trên màn hình Nh英ng thành
ph亥n chung gi英a các trang (Header, Sider, Footer ) v磯p"8逢嬰c gi英 nguyên SPA gi運 8¤{"8«"vt荏 vj pj"o»"j·pj"Ygd"vk‒w"ejw育p"x "e<p"d違n nh医t cho m丑k"vtcpi"ygd"e„"v pj"v逢挨pi"tác v噂k"pi逢運i dùng cao, và h羽 th嘘pi"o "pj„o"z¤{"f詠pi"e pi"mj»pi"piq衣i l羽
F逢噂k"8¤{"n m瓜t hình 違nh mô t違 s詠 khác bi羽t gi英a Single Page Application và Multiple Page Application
Hình 2.1: S ば khác nhau vz luげpi"8k"eてa とng dつng Web trong SPA và MPA
Trang 182.1.2 Htcogyqtm rj v"vtk吋p"Htqpvgpf XwgLU
XwgLU"n "o瓜t LcxcUetkrv"Htcogyqtm"f́pi"8吋 xây d詠ng giao di羽p"pi逢運i dùng (user kpvgthceg+0"Xwg"8逢嬰c thi院t k院 t瑛 8亥w"vjgq"j逢噂ng cho phép và khuy院n khích vi羽c phát tri吋n 泳ng d映ng theo t瑛pi"d逢噂e000"E„"vj吋 8 r"泳pi"8逢嬰c nhu c亥u v隠 SPA (Single-Page Crrnkecvkqpu+0"XwgLU"ej雨 t壱p trung vào ph亥n giao di羽p"pi逢運k"f́pi"p‒p"e„"vj吋 tích h嬰p
d宇 dàng vào project m瓜v"e ej"mj "8挨p"ik違n M丑i ho衣v"8瓜ng c栄c"Xwglu"8隠w"8逢嬰e"Tgpfgt"
và x穎 n#"d茨pi"Lcxcuetkrv0"Ej pj"x·"vj院 8k隠w"p {"n o"ejq"ygdukvg"vt荏 nên nh姻 j挨p."x "v嘘c 8瓜 e pi"vt荏 p‒p"pjcpj"j挨p0 ]3_
XwgLU"8逢嬰c phát tri吋n d詠c"vt‒p"e e"v pj"p<pi"x "e e"e ej"vj泳c thi院t k院 t嘘t nh医t t瑛 các htcogyqtm"8嘘i th栄 pj逢"TgcevLU."CpiwnctLU.000"E映 th吋:
‚ Nh臼 g丑n và linh ho衣v<"XwgLU"vj詠c s詠 r医t g丑n nh姻 và d宇 dàng s穎 d映pi"pj逢pi"p„"e pi"t医t hi羽u qu違, d宇 b違o trì, d宇 th詠c hi羽p"vguv0"Piq k"tc."XwgLU"e pi"8逢嬰c phát tri吋p"vjgq"j逢噂ng d宇 tích h嬰p
Hình 2.2: VueJS [2]
Trang 19
Hình 2.3 <"Nkhge{cle VueJS [3]
Trang 20‚ Single File Component: M厩i component s胤 là 1 file duy nh医t, tách 3 ph亥n riêng bi羽v"vgorncvg"JVON."LcxcUetkrv."EUU0"Ak隠u này giúp nâng cao tính tái s穎
d映ng
‚ VueJS không yêu c亥w"Ygdrcem<"Pi逢運i dùng có th吋 vi院t m瓜t 泳ng d映ng ES6,
x "vj‒o"vj逢"xk羽n nhanh chóng thông qua gói qu違n lý (package) ho員c CDN mà pi逢運i dùng mu嘘n s穎 d映ng
‚ Nh英ng plugin c亥n thi院v."8逢嬰c h厩 tr嬰 8亥{"8栄: VueJS cung c医p nh英ng plugin có
MVVM là vi院t t逸t c栄a Model-View-View Model Trong MVVM, Model ch雨 8挨p"ik違n
n "8衣i di羽n cho l噂p truy c壱p d英 li羽u c栄a 泳ng d映ng Nó ch泳a d英 li羽u s胤 8逢嬰c hi吋n th鵜 cho pi逢運k"f́pi"8吋 thao tác ho員e"v逢挨pi"v e0"O»"j·pj"p {"ej雨 có nhi羽m v映 n "z e"vj詠c d英 li羽u O»"j·pj"p {"e pi"mj»pi"e„"e ej"p q"8吋 truy c壱p API ph映 tr嬰 ho員c bên th泳 5"8吋 t衣o
ho員e"n逢w"f英 li羽u - nó ch雨 8挨p"ik違n là m瓜t b瓜 ch泳c"8吋 ch泳a d英 li羽u mà VM (View Model) l医y và s穎 d映ng
Hình 2.4: C Xu trúc とng dつng tご chとe"f⇔ずi dTng cây component lげng nhau [4]
Trang 21Component là m瓜v"vtqpi"e e"v pj"p<pi"o衣nh m胤 nh医t c栄c"Xwg0lu0"P„"ik¿r"ejq"chúng
ta gom nhóm các mã HTML, JavaScript, CSS l衣i thành m瓜t Single File Component 8吋 tái s穎 d映pi"ejq"e e"oqfwng"v逢挨pi"v詠 雲 m瓜t m泳e"8瓜 cao thì component là m瓜t thành ph亥p"8逢嬰e"Xwg0lu"dk‒p"f鵜ej"8吋 z穎 lý các hành vi Và trong m瓜v"x k"vt逢運ng h嬰p thì nó
e pi"có th吋 zw医t hi羽p"pj逢"o瓜t ph亥n t穎 HTML v噂k"e e"cvvtkdwvg"8員c bi羽t
Hình 2.5: C Xu trúc Single File Component [5]
Trang 222.1.4 Vue Router
Vue router là router chính th泳c cho VueJS Nó tích h嬰p sâu v噂i VueJS eqtg"8吋 giúp z¤{"f詠ng các SPA (Single Page Application) v噂i VueJS m瓜t cách d宇 dàng Các tính p<pi"e栄a Vue-Tqwvgt"dcq"i欝m:
‚ Pguvgf"tqwvg"*8鵜nh tuy院n l欝ng nhau)/view mapping
‚ C医u hình router d詠a trên thành ph亥n, mô-8wp0"
‚ A鵜nh tuy院n tham s嘘, truy v医n, ký t詠 8衣i di羽n
‚ Các hi羽u 泳ng chuy吋n ti院r"8逢嬰c cung c医p b荏i h羽 th嘘ng chuy吋n ti院p c栄a VueJS
‚ Ki吋m soát tính p<pi"Hkpg-grained navigation
‚ Liên k院t v噂i các active CSS class t詠 8瓜ng
‚ Ch院 8瓜 HTML5 history mode / hash mode, v噂k"v pj"p<pi"cwvq-fallback IE9
‚ Hành vi cu瓜n tùy ch雨nh
2.1.5 Vuex
Xwgz"8逢嬰c bi院v"8院p"pj逢"o瓜v"vj逢"xk羽n giúp b衣n qu違n lý tr衣ng thái các component vtqpi"XwgLU."8¤{"e pi"n "p挨k"n逢w"vt英 t壱p trung cho t医t c違 các component trong m瓜t 泳ng d映ng v噂i nguyên t逸c tr衣ng thái ch雨 có th吋 8逢嬰e"vjc{"8鰻i theo ki吋u có th吋 d詠 8q p0
Hình 2.6: Code s ぬ dつng Vue-Tqwvgt"8あ 8おnh tuyxn trang Dashboard
Trang 23Xwgz"e p"8逢嬰e"zgo"pj逢"n "o瓜v"vj逢"xk羽p"f́pi"8吋 qu違n lý state cho các 泳ng d映ng c栄a Vue b茨ng cách s穎 d映ng store t壱p trung hóa và toàn c映c cho t医t c違 component trong m瓜t 泳ng d映ng, mang l衣i nh英ng c壱p nh壱t nhanh t泳c th運i khi t壱n d映ng h羽 th嘘ng các ph違n 泳ng A逢嬰e" z¤{" f詠ng trên n隠n t違ng không th吋 vjc{" 8鰻i tr衣ng thái c栄a mình t瑛 b医t k eqorqpgpv"p q."Xwgz"uvqtg"ik¿r"8違m b違o r茨ng tr衣ng thái ch雨 có th吋 bi院p"8鰻i theo cách
có th吋 d詠 8q p"8逢嬰c Nh運 vào vi羽c m厩i y院u t嘘 d英 li羽u ch雨 8逢嬰e"rjfir"n逢w"o瓜t l亥n và ch雨 8逢嬰c quy隠p"8丑e"8吋 tránh các component c栄a 泳ng d映ng s胤 làm h臼ng các tr衣ng thái truy zw医t t瑛 các component khác giúp cho store c栄a b衣n tr荏 thành m瓜t ngu欝p"8 pi"vkp0"Uvcvg"
荏 8¤{"8逢嬰c hi吋u là tr衣ng thái c栄a 泳ng d映ng ví d映 pj逢"crr"u胤 e„"uvcvg"n "8«"nqikp"jc{"ej逢c0
Hình 2.7 <"U¬"8げ kixn trúc Vuex [6]
A嘘i v噂k"Xwgz."uvqtg"ej pj"n "p挨k"sw違n lý t壱p trung state c栄a các 泳ng d映ng bao g欝m 5
ph亥n chính: State, Getters, Mutation, Actions, ModulesState [7]:
‚ State: State là m瓜v"qdlgev"ej泳a toàn b瓜 state c栄a 泳ng d映ng
‚ Getter: Là m瓜t t壱r"e e"j o"f́pi"8吋 z穎 lý d英 li羽w"uvcvg"tc"8逢嬰e"qwvrwv"pj逢"oqpi"mu嘘n
Trang 24‚ Mutations: A¤{"n "p挨k"fw{"pj医v"ejq"rjfir"vjc{"8鰻i state M瓜v"8k隠u c亥p"n逢w"#"n "mutations là synchronous Synchronous giúp chúng ta ki吋m soát khi nhi隠u action cùng g丑i m瓜v"owvcvkqp"*cevkqp"p q"8«"vjc{"8鰻i state hay th泳 t詠 vjc{"8鰻k"uvcvg"pj逢"th院 nào)
‚ Actions: Cevkqpu"n "p挨k"vj吋 hi羽p"dwuukpguu"nqike0"A¤{"n "p挨k"i丑i API, save vào database, th詠c hi羽n các commit (g丑k"owvcvkqp+"8吋 vjc{"8鰻i state…
‚ Module: A逢嬰e"zgo"pj逢"n "uvqtg"vjw"pj臼."p„"e pi"dcq"i欝m: state, mutation và action Khi store phình quá to thì có th吋 chia nh臼 tc"vj pj"e e"oqfwng"8吋 d宇 qu違n n#"j挨p0
2.1.6 TypeScript
TypeScript là m瓜t phiên b違p"ecq"j挨p"e栄c"LcxcUetkrv."8逢嬰c thi院t k院 8吋 z¤{"f詠ng các 泳ng d映ng l噂n và ph泳c t衣r0"V{rgUetkrv"8逢嬰c Microsoft phát tri吋p"j挨p"5"p<o"pj茨m t衣o ra m瓜t ngôn ng英 8吋 m荏 r瓜ng JavaScript Giúp nó tr荏 nên phù h嬰r"j挨p"x噂i nh英ng 泳ng d映ng l噂p."pj逢pi"x磯n quen thu瓜c v噂i c医u trúc ngôn ng英 JavaScript hi羽n t衣k"8吋 m丑k"pi逢運i có
Hình 2.8: TypeScript [8]
Trang 25V{rgUetkrv"e p"j厩"vt嬰"j逢噂pi"8嘘k"v逢嬰pi"*Qdlgev"Qtkgpvgf"Rtqitcookpi."xk院v"v逸v"n "QQR+"t医v"o衣pj0 X "j亥w"j院v"e e"e¿"rj r"j逢噂pi"8嘘k"v逢嬰pi"8隠w"8逢嬰e"V{rgUetkrv"j厩"vt嬰"pj逢"m院"vj瑛c."8„pi"i„k."eqpuvtwevqt."cduvtcev."kpvgthceg."korngogpv."qxgttkfg.È"Cách t鰻 ch泳c eqfg"e pi"t "t pi"j挨p."j厩 tr嬰 e挨"ej院 giúp ki院n trúc h羽 th嘘pi"eqfg"j逢噂ng module Chính
vì v壱y mà T{rgUetkrv"8cpi"8逢嬰c s穎 d映ng 荏 các Framework Frontend ph鰻 bi院p"pj逢"VueJS, Angular,… hay c違 荏 Dcemgpf"pj逢"PqfgLU0
2.1.7 V衣q"vt·pj"uq衣p"vj違q"x<p"d違p"x噂k"EMGfkvqt
Trong h羽 th嘘pi"o "pj„o"z¤{"f詠ng, nh英pi"v pj"p<pi"pj逢"uq衣n bài gi違ng b茨pi"x<p"
b違n, t衣o câu h臼i trên di宇p"8 p."vt違 l運i câu h臼i, giáo viên t衣o thông báo cho h丑c viên ph違i c亥n m瓜t trình so衣n th違q"x<p"d違n th壱t s詠, ch泳 mj»pi"8挨p"ik違n ch雨 dùng các th飲 Vgzvctgc"jc{"Kprwv"JVON"e„"u印n B荏i bài gi違pi"x<p"d違n c亥n nh英pi"v pj"p<pi"kp"8壱m,
in nghiêng, chèn hình 違nh, liên k院t nh英ng th泳 o "Vgzvctgc"jc{"Kprwv"JVON"mj»pi"
8 r"泳pi"8逢嬰c Khi gi違i quy院v"d k"vq p"z¤{"f詠ng trình so衣n th違q"pj„o"8«"v·o"jk吋u r医t nhi隠u v隠 các gi違k"rj r."vtqpi"8„"e„"EMGfkvqt0
CKEditor là m瓜t trình so衣n th違q"x<p"d違n HTML s印n sàng cho s穎 d映pi"8逢嬰c thi院t k院 8吋 8挨p"ik違n hóa vi羽c t衣o ra n瓜k"fwpi"ygd0"A„"là m瓜t trình so衣n th違o WYSIWYG mang
l衣k"e e"v pj"p<pi"z穎 n#"x<p"d違n ph鰻 bi院n tr詠c ti院r"8院n trang web c栄a b衣n CKEditor là m瓜t 泳ng d映ng mã ngu欝n m荏."e„"pij c"n "d衣n có th吋 s穎c"8鰻i nó theo b医t k cách nào b衣n
Hình 2.9: Giao di うn CKEditor [9]
Trang 26mu嘘n L嬰i ích c栄c"p„"8院n t瑛 m瓜t c瓜pi"8欝pi"p<pi"8瓜ng không ng瑛ng phát tri吋n các 泳ng
d映ng v噂i các add-ons mi宇n phí và quá trình phát tri吋n minh b衣ch (transparent development process) [10]
2.2 Các công ngh 羽 rj c"Ugtxgt"Ukfg"*Dcemgpf+
M瓜t 泳ng d映ng t嘘t là m瓜t 泳ng d映ng ph違i có ph亥n máy ch栄 t嘘t, nhanh, ch鵜u t違i cao Nhi隠u công ngh羽 l壱p trình phía máy ch栄 8«"tc"8運i và m厩i th泳 8隠w"e„"逢w"8k吋m riêng M映c tiêu c栄a các công ngh羽 8„"mj»pi"ej雨 giúp cho server ch衣{"pjcpj"j挨p"o "e p"8go"n衣i tr違i nghi羽m t嘘v"j挨p"ejq"n壱p trình viên, giúp l壱p trình viên qu違n lý mã ngu欝n d宇 j挨p."debug d宇 j挨p."f宇 tích h嬰r"vj‒o"v pj"p<pi"o噂k"j挨p0"Vt逢噂c kia, PHP và Java là hai ngôn ng英 ej pj"8吋 z¤{"f詠ng máy ch栄 thì ngày nay là s詠 c衣nh tranh c栄a NodeJS và Golang
S穎 d映ng NodeJS s胤 giúp l壱r"vt·pj"xk‒p"8叡 v医t v違 vì không ph違i h丑c thêm ngôn ng英 m噂i,
c違 hai phía khách và máy ch栄 8隠w"f́pi"LcxcUetkrv0"Pj逢pi"vt‒p"j院t, NodeJS nhanh và ch鵜u t違i t嘘v."8k隠w"8„"ik¿r"ejq"p„"n "o瓜t trong nh英ng l詠a ch丑p"j pi"8亥w"8吋 phát tri吋n bên phía server V隠 rj c"e挨"u荏 d英 li羽u, vì nhi隠u lý do khác nhau mà nh英pi"e挨"u荏 d英 li羽u PqUSN"8cpi"8逢嬰c s穎 d映ng r瓜ng rãi, ph鰻 bi院n nh医t có th吋 k吋 8院p"OqpiqFD0"A嘘i v噂i m瓜t d詠 án phát tri吋n nhanh và có tính linh ho衣t cao, s穎 d映pi"PqfgLU"x "OqpiqFD"8吋 z¤{"f詠ng m瓜t h羽 th嘘ng là s詠 l詠a ch丑n thích h嬰p
lý nh医v"8鵜pj0"TGUV"u穎 d映pi"rj逢挨pi"vj泳e"JVVR"8挨p"ik違n làm giao ti院p gi英a client và server Thay vì s穎 d映ng m瓜v"WTN"ejq"xk羽e"z穎 lý m瓜t s嘘 vj»pi"vkp"pi逢運k"f́pi."TGUV"g穎i m瓜t yêu c亥u (giao th泳e+"JVVR"pj逢"IGV."RWV."RQUV."FGNGVG"8院n m瓜v"WTN"8吋
Trang 27z穎 lý d英 li羽u Ch泳e"p<pi"swcp"vt丑ng nh医t c栄c"TGUV n "sw{"8鵜nh cách s穎 d映ng các HTTP ogvjqf"*pj逢"IGV."RWV."RQUV."FGNGVG000+"x "e ej"8鵜nh d衣pi"e e"WTN"ejq"泳ng d映ng Ygd"8吋 qu違n lý các tài nguyên TGUVhwn"mj»pi"sw{"8鵜nh logic mã ngu欝n c栄a 泳ng d映ng
và không gi噂i h衣n b荏i ngôn ng英 l壱p trình 泳ng d映ng, b医t k ngôn ng英 ho員c framework
p q"e pi"e„"vj吋 s穎 d映pi"8吋 thi院t k院 m瓜v"TGUVhwn"CRK [11]
‚ TGUV"jq衣v"8瓜ng ch栄 y院u d詠a vào giao th泳c HTTP Tu thu瓜c vào tính ch医t c栄a ho衣v"8瓜ng mà s胤 dùng giao th泳c HTTP riêng [12]:
‚ GET (SELECT): Tr違 v隠 m瓜t tài nguyên ho員c m瓜t danh sách tài nguyên • POST
*ETGCVG+<"V衣o m噂i m瓜t tài nguyên
‚ PUT (UPDATE): C壱p nh壱t thông tin cho tài nguyên
‚ DELETE (DELETE): Xoá m瓜t tài nguyên H羽 th嘘ng mà nhóm phát tri吋p"e pi"
s胤 s穎 d映ng tiêu chu育p"TGUV"ejq"xk羽c t衣o API và giao ti院p gi英a máy khách và máy ch栄
2.2.2 Ngôn ng 穎 8吋 phát tri吋p"Dcemgpf"PqfgLU
NodeJS là m瓜t JavaScript runtime mã ngu欝n m荏."8c"p隠n t違pi"8逢嬰e"z¤{"f詠ng d詠a trên Google Chrome’s V8 Engine, cho phép vi院t mã JavaScript ch衣y bên ngoài trình duy羽t web Nó là m瓜v"LcxcUetkrv"twpvkog"j逢噂ng s詠 ki羽n b医v"8欝ng b瓜 (asynchronous event-driven)[14] Nó ch雨 có m瓜t thread duy nh医v"8吋 z穎 lý t医t c違 e e"tgswguv"8欝ng th運i Khác v噂k"e挨"ej院 thread-base networking s穎 d映pi"vtqpi"8c"u嘘 nh英ng ngôn ng英 phát tri吋n phía máy ch栄 khác
Hình 2.10: Nguyên lý ho Tv"8じng cてa RESTful API [13]
Trang 28V噂i c挨 ch院 thread-base, m厩i request s胤 8逢嬰e"z穎 lý b荏i riêng m瓜t thread N院u m瓜t request c亥n l医y d英 li羽u t瑛 database, máy ch栄 s胤 ti院n hàpj"vtw{"zw医t d英 li羽u và trong khi
nó 8cpi"vtw{"zw医t, thread c栄a request này s胤 không làm gì nh逢ng nh英ng request khác l衣i không th吋 dùpi"8逢嬰c thread này, chúng ch雨 dùpi"8逢嬰c khi request này k院t thúc và thread 8逢嬰c tr違 l衣k0"Ak隠u này là lãng phí và không hi羽u qu違 M員t khác, n院u có nhi隠u request 8欝ng th運i, ta c亥n ph違k"8áp 泳ng nhi隠u thread cùng lúc Vì th院, n院u 泳ng d映ng có hàng tr<m tri羽u ng逢運i dùng, truy c壱p liên t映c, ta ph違i t嘘n r医t nhi隠u chi phí cho vi羽c m荏 r瓜ng ph亥n c泳ng NodeJS thì ng逢嬰c l衣i, m瓜t thread duy nh医v" 8違m nhi羽m vi羽e" z穎 lý logic N院u tgswguv"C"8cpi"vtw{"zw医t database, thread s胤 ph映c v映 cho request B và mjk"C"vtw{"zw医t fcvcdcug"zqpi."v噂i l逢嬰v"D"vtw{"zw医t database, thread s胤 quay l衣i ph映c v映 A Cách làm này v瑛a hi羽u qu違 cho CPU v瑛a ti院t ki羽o"8逢嬰c chi phí ph亥n c泳ng L嬰i th院 c栄a NodeJS
so v噂i các ngôn ng英 l壱p trình phía máy ch栄 khác là d宇 h丑c, d宇 ti院p c壱n, nhanh và không
t嘘n th運k"ikcp"8吋 h丑c l衣i m瓜t ngôn ng英 cùng h羽 sinh thái c栄a nó0"PqfgLU"tc"8運i t瑛 n<m
2009 nên t噂i nay nó c pi"8ã có tính 鰻p"8鵜nh nh医v"8鵜nh M員t khác, NodeJS có c瓜pi"8欝ng
h厩 tr嬰 m衣nh m胤, và vì nó c ng là JavaScript, nên NodeJS th瑛a h逢荏ng r医t nhi隠u th逢 vi羽n Lcxcuetkrv"8逢嬰e"z¤{"f詠pi"u印p0"Vw{"e„"o瓜v"u嘘"pj逢嬰e"8k吋o"pj医v"8鵜pj."pj逢pi"pj„o"x磯p"sw{院v"8鵜pj"ej丑p"PqfgLU"n o"pi»0"Pi英"ej pj"8吋"z¤{"f詠pi"o {"ej栄"j羽"vj嘘pi0
Hình 2 11<"E¬"ejx asynchronous event-driven trong NodeJS [15]
Trang 29JSON Web Token (JWT) là m瓜t chu育n m荏 *THE"973;+"8鵜pj"pij c"o瓜t cách nh臼 g丑n
x "mjfir"m p"8吋 truy隠n thông tin m瓜t cách an toàn gi英c"e e"d‒p"f逢噂i d衣pi"8嘘k"v逢嬰ng JSON Token bao g欝m m瓜t header, m瓜t payload và m瓜t ch英 ký [16]
D詠c"x q"u挨"8欝 trên, ta có th吋 hình d映ng h羽 th嘘ng ho衣v"8瓜pi"pj逢"ucw [18]:
1 User th詠c hi羽n login b茨ng cách g穎i ID/Password hay s穎 d映ng các tài kho違n m衣ng z«"j瓜k"n‒p"rj c"Cwvjgpvkecvkqp"Ugtxgt"*Ugtxgt"z e"vj詠c)
Hình 2 12 <"U¬"8げ hう thぐng sぬ dつng JWT [17]
Trang 302 Authentication Server ti院p nh壱n các d英 li羽u mà User g穎k"n‒p"8吋 ph映c v映 cho vi羽c
z e"vj詠e"pi逢運i d́pi0"Vtqpi"vt逢運ng h嬰p thành công, Authentication Server s胤 t衣o m瓜t JWT và tr違 v隠 ejq"pi逢運i dùng m瓜t Access Token thông qua response
3 Phía server s穎 d映pi"Ceeguu"Vqmgp"8„"e栄c"pi逢運k"f́pi"8吋 c医p quy隠n truy c壱p các
v k"piw{‒p"o "pi逢運k"f́pi"8逢嬰c phép truy c壱p
2.2.4 LQK"pro
Trong quá trinh vi院t m瓜v"CRK"ej¿pi"vc"vj逢運ng nh壱p"tgswguv"ucw"8„"z穎 lý d英 li羽u luôn, n院w"e„"gzegrvkqp"vj·"vt違 v隠 response l厩k0"Ak隠u này th詠c không t嘘t M瓜t s嘘 lý do chúng ta p‒p"z e"vj詠e"*xgtkh{+"tgswguv"LUQP"vt逢噂e"mjk"z穎 lý các function chính:
‚ Verify nhanh và tr違 v隠 k院t qu違 mjk"luqp"kprwv"mj»pi"8¿pi"x噂i c医u trúc d英 li羽u c亥n có
‚ H衣n ch院 e "gzgrvkqp."vk‒w"dk吋u nh医v"n "pwnn"gzgrvkqp0"X "f映, chúng ta s穎 d映ng Uwdlgev0Eqwtug0fc{u"o "pi逢運i dùng truy隠n vào Course là null chúng ta không th吋 8員t câu l羽nh 8k隠u ki羽n (if – gnug+"vt逢噂c t医t c違 các properties mu嘘n l医y value
8吋 ki吋m tra giá tr鵜
‚ H衣n ch院 nh英pi"z穎 lý không c亥n thi院v"mjk"pi逢運i dùng input giá tr鵜 sai Thay vì
vi羽e"z穎 n#"e e"d逢噂e"ejq"8院n lúc g員p data b鵜 sai r欝k"tgurqpug"gzegrvkqp"vj·"mk吋m tra m瓜v"x pi"vt逢噂e"8吋 8違m b違q"fcvc"kprwv"8¿pi"vt逢噂e"mjk"z穎 lý
‚ A違m b違o s詠 toàn v姻n d英 li羽u, h衣n ch院 vi羽c rollback d英 li羽u 荏 database Ví d映 pj逢"荏 ví d映 vt逢噂c khi nh壱p"tgswguv"ej¿pi"vc"n逢w"Uwdlgev"x q"o瓜t b違ng trong Fcvcdcug."ucw"8„"n逢w"v医t c違 Course vào m瓜t b違ng kh e0"Vtqpi"vt逢運ng h嬰p chúng ta ti院p"j pj"n逢w"Uwdlgev"o "mj»pi"mk吋o"vtc"luqp"kprwv"vt逢噂c có th吋 data c栄a Course có th吋 sai d磯p"8院n vi羽c ph違i rollback data 荏 database
Tóm l衣k."ej¿pi"vc"p‒p"z e"vj詠c d英 li羽w"vt逢噂e"mjk"z穎 lý b医t k request nào t瑛 rj c"pi逢運i dùng g穎i lên server Trong d詠 án này, em ch丑n s穎 d映ng JOI vì th医y khá phù h嬰p v噂i ngôn ng英 l壱p trình 荏 Backend là NodeJS
Trang 312.2.5 E挨"u荏 f英 nk羽w"OqpiqFD
MongoDB là m瓜v"e挨"u荏 d英 li羽w"j逢噂ng tài li羽w"8c"p隠n t違ng, có th吋 8逢嬰c tích h嬰p v噂i b医t kì framework hay ngôn ng英 l壱p trình nào Nó là m瓜t lo衣k"EUFN"PqUSN"x "f英 li羽u 8逢嬰e"n逢w"f逢噂i d衣ng các JSON-like Document ch泳a trong các schema MongoDB ra m逸t
x q"p<o"422;"x "ik運 8¤{"p„"8«"n "e挨"u荏 d英 li羽u phi quan h羽 ph鰻 bi院n nh医t
v噂k"O{USN0"V衣i sao MongoDB có hi羽w"p<pi"ecq"pj逢"vj院?
- OqpiqFD"n逢w"f英 li羽u d衣ng JSON, khi b衣n chèn nhi隠w"8嘘k"v逢嬰ng thì nó s胤
- Khi th詠c hi羽n chèn, truy v医n MongoDB s胤 khóa các thao tác khác l衣i,
ví d映 khi nó th詠c hi羽n find(), trong quá trình find mà có thêm thao tác insert, update thì nó s胤 d瑛ng h院t l衣k"8吋 ch運 khi l羽nh find() k院t thúc
‚ D英 li羽u linh ho衣v<"OqpiqFD"n "e挨"u荏 d英 li羽u d衣ng tài li羽u, d英 li羽w"n逢w"f逢噂i d衣ng JSON, không b鵜 bó bu瓜c v隠 s嘘 n逢嬰ng field, ki吋u d英 li羽u b衣n có th吋 chèn tho違i mái d英 li羽u mà mình mu嘘n
‚ N "Tkej"Swgt{"Ncpiwcig<"OqpiqFD"n "o瓜t rich query language t泳c là nó có s印n
e e"rj逢挨pi"vj泳e"8吋 th詠c hi羽n t衣q."8丑c, s穎c."zq "f英 li羽u (CTWF+0
Pj逢嬰e"8k吋m c栄a MongoDB:
‚ MongoDB không có các tính ch医t ràng bu瓜e"pj逢"vtqpi"TFDOU."f磯p"8院n vi羽c d宇
b鵜 làm sai d英 li羽u
Trang 32‚ Không h厩 tr嬰 lqkp"ik嘘pi"pj逢"TFDOU"p‒p"mjk"xk院v"hwpevkqp"lqkp"vtqpi"eqfg"vc"ph違i làm b茨ng tay khi院n cho t嘘e"8瓜 truy v医n b鵜 gi違m
‚ S穎 d映ng nhi隠u b瓜 nh噂: do d英 li羽w"n逢w"f逢噂i d衣ng key-value, các collection ch雨 khác v隠 xcnwg"fq"8„"mg{"u胤 b鵜 l員p l衣i
Trong quá trình kh違o sát và l詠a ch丑p"e挨"u荏 d英 li羽u cho h羽 th嘘ng, em phân vân gi英a OqpiqFD"x "e e"e挨"u荏 d英 li羽u quan h羽 khác Tuy nhiên, sau khi zgo"zfiv"o瓜t s嘘 tính p<pi."em c違m th医y vi羽c dùng MongoDB là h嬰r"n#"j挨p"e違 Ví d映 mjk"jck"pi逢運i dùng A
và B nh逸n tin cho nhau Khi A nhìn th医y 50 tin nh逸n c栄a B, thì s胤 có m瓜t API g穎k"8院n server thông báo c壱p nh壱t 50 tin nh逸n thành tr衣pi"vj k"n "8«"zgo0"Mjk"医y, n院u c壱p nh壱t
50 item thì MongoDB s胤 pjcpj"j挨p"e挨"u荏 d英 li羽u quan h羽
Trang 33kh違o nhi隠u blog cá nhân, em quy院v"8鵜nh ch丑p"e ej"n o"pj逢"ucw<"Sw "vt·pj"wrnqcf"v羽p g欝o"4"d逢噂c:
‚ D逢噂c 1: Upload t羽r"f逢噂i d衣ng FormData lên máy ch栄 8吋 nh壱p"8逢運ng d磯p"WTN"
雲 d逢噂e"4."ucw"mjk"8«"pj壱p"8逢嬰e"8逢運ng d磯p"WTN."Ygd"Crr"u胤 g丑i m瓜v"CRK"v逢挨pi"泳pi"8吋 n逢w"8逢運ng d磯n 医{"x q"e挨"u荏 d英 li羽u Ví d映 n院w"v pj"p<pi"n "vjc{"8鰻i 違pj"8衣i di羽n, thì API th泳 2 s胤 là API c壱p nh壱t avatar nh壱p"WTN"x瑛a r欝i làm tham s嘘
3.2 D k"vq p"vt·pj"uq衣n th違q"x<p"d違n
Trong h羽 th嘘pi"o "go"z¤{"f詠ng, r医t nhi隠w"v pj"p<pi"e亥n t噂i b瓜 so衣n th違q"x<p"d違n pj逢"v pj"p<pi"uq衣n th違o bài h丑c, t衣q"e e"8隠u bài câu h臼i, t衣o các yêu c亥u nghiên c泳u theo ch栄 8隠,… Chính vì v壱{"go"8«"ej丑n s穎 CKEditor vì nó r医t d宇 s穎 d映ng và tính linh
Trang 34ho衣t có th吋 ch雨nh s穎a (config) theo nhu c亥u, m映e"8 ej"u穎 d映ng D‒p"f逢噂i là hình 違nh v隠
vi羽c s穎 d映ng CKEditor trong h羽 th嘘ng
3.3 D k"vq p"d違o m壱t h羽 th嘘ng
H亥u h院t các h羽 th嘘pi"8隠u không th吋 thi院w"e e"v pj"p<pi"d違o m壱v0"A„"n "v pj"p<pi"j院t s泳c quan tr丑ng và là tác nhân chính cho s詠 tin c壱y c栄c"pi逢運i s穎 d映ng vào h羽 th嘘ng B違o m壱t có r医t nhi隠u lo衣i, nhi隠u m泳c 8瓜 khác nhau H羽 th嘘ng mà em z¤{"f詠pi"e pi"vj詠c hi羽n b違o m壱t 荏 m瓜t m泳e"8瓜 p q"8„0"Mjk"o瓜t 泳ng d映ng có tính b違o m壱t càng cao, càng nhi隠u l噂p, hi羽u su医t s胤 càng gi違o"p‒p"go"8«"e¤p"pj逸c ch丑n l丑c các chi院p"n逢嬰c b違o m壱t
v瑛c"8栄, c亥n thi院v"8吋 làm sao cho h羽 th嘘ng mà em z¤{"f詠ng v瑛c"8 pi"vkp"e壱y, v瑛a có hi羽u su医t t嘘v0"Ucw"8¤{."go"zkp"vt·pj"d {"e e"ik違i pháp b違o m壱v"o "go"8隠 ra theo m泳e"8瓜
t瑛 vt‒p"zw嘘pi"f逢噂i (t瑛 o {"pi逢運k"f́pi"8院p"e挨"u荏 d英 li羽u)
3.3.1 D違o m壱v"rj c"o {"mj ej
Tuy b違o m壱v"rj c"o {"pi逢運k"f́pi"mj»pi"8違m b違o 8瓜 tin c壱{."pj逢pi"x磯n có th吋 gây mj„"mj<p"ejq"m飲 z医u và làm ch壱m t嘘e"8瓜 t医n công, ho員e"pi<p"ej員p"pi逢運i dùng vô tình mu嘘n truy c壱p trái phép
Ak隠w"mjk吋n truy c壱r"vt‒p"tqwvgt"*Ceeguu"Eqpvtqn"Nkuv"- CEN+
Hình 3.1: Trình so Tn thVq"x<p"dVn sぬ dつng CKEditor
Trang 35A¤{"n "o泳c b違o m壱v"8亥u tiên c栄a h羽 th嘘ng Ví d映 mjk"pi逢運i dùng c嘘 truy c壱p vào các trang c栄a h羽 th嘘ng, n院w"ej逢c"8<pi"pj壱r"vj·"pi逢運i dùng s胤 b鵜 8育y v隠 vtcpi"8<pi"pj壱p ngay l壱p t泳c T医t c違 các trang ngo衣i tr瑛 vtcpi"Nqikp"x "Hqtiqv"Rcuuyqtf"8隠w"8逢嬰c ch逸n b荏i l噂r"p {0"Mjk"8k"swc"CEN."p„"u胤 ki吋o"vtc"pi逢運k"f́pi"8«"8<pi"pj壱r"jc{"ej逢c."p院u r欝i ACL s胤 ejq"swc."pi逢嬰c l衣i nó s胤 zfiv"nk羽w"pi逢運k"f́pi"e„"LYV"8逢嬰e"n逢w"vtqpi"Nqecn"Storage hay không N院u có, nó s胤 g丑i m瓜v"CRK"8吋 l医{"vj»pi"vkp"pi逢運i dùng s穎 d映ng JWT
医y N院u l医y thành công, ACL s胤 cho qua N院u không thành công, nó s胤 chuy吋n sang
o p"j·pj"8<pi"pj壱p N院w"pi逢運k"f́pi"mj»pi"e„"LYV."CEN"e pi"u胤 chuy吋n sang màn j·pj"8<pi"pj壱p ngay t泳c kh逸e0"D‒p"f逢噂i là Activity Diagram v隠 nguyên lý ho衣v"8瓜ng
c栄a l噂p b違o m壱t này
Hình 3.2: Activity Diagram c てa lずp bVo mfv"8kzu khiあn truy cfp
trên router
Trang 36Xác nh 壱p"*xcnkfcvg+"f英 nk羽u phía pi逢運k"f́pi
Xác nh壱n (validate) d英 li羽u th詠c ch医t không ph違i là m瓜t lo衣i b違o m壱v."pj逢pi"p„"pi亥m pi<p"ej員n k飲 z医u có th吋 tiêm nh英pi"8q衣p"o«"8瓜c lên máy ch栄 Tuy nhiên, vi羽c validate vt‒p"o {"pi逢運i dùng ch雨 mang tính gi違o"8叡 ch泳 mj»pi"pi<p"ej員n hoàn toàn, ta c亥n ph違i
có m瓜t l噂p validate n英a bên phía máy ch栄0"D‒p"f逢噂i là m瓜t ví d映 hi羽n th詠e"v pj"p<pi"
z e"pj壱n d英 li羽u trong h羽 th嘘ng H羽 th嘘pi"pi<p"ej員n pi逢運k"j逢噂ng d磯n (mentor) 8k隠n tên khoá h丑c (Name Course) cho khoá h丑c n院w"Pcog"Eqwtug"8„"8«"v欝n t衣i r欝i Lý do là vi羽e"8„"e„"vj吋 gây nh亥m l磯n các khoá h丑c trong quá trình s穎 d映ng hay vô tình gây t嘘n n逢w"n逢嬰ng b瓜 nh噂 n院u khoá h丑e"8„"8«"e„"pj逢pi"pi逢運k"j逢噂ng d磯n không bi院v"8k隠w"8„0
3.3.2 D違o m壱t phía máy ch栄
B違o m壱t 荏 rj c"pi逢運i dùng không ph違i là m瓜t yêu c亥u b逸t bu瓜e"pj逢pi"rj c"o {"ej栄 thì pi逢嬰c l衣i 雲 phía client, k飲 z医u có th吋 vô hi羽u hoá JavaScript và d宇 f pi"x逢嬰t qua các l噂p b違o m壱t nêu 荏 ph亥n 3.3.10"Fq"8„."o {"ej栄 luôn ph違i t衣o m瓜t l噂p b違o m壱v"8吋 pi<p"ch員n s詠 t医n công t瑛 hacker
Xác th 詠e"pi逢運k"f́pi
Vì h羽 th嘘ng có nhi隠w"xck"vt "e映 th吋 n "pi逢運i qu違p"n#"*cfokp+."pi逢運k"j逢噂ng d磯n
*ogpvqt+"x "pi逢運i h丑c (mentee) Nh茨o"z e"vj詠e"t "xck"vt "vtqpi"x医p"8隠 phân quy隠n truy c壱p tài piw{‒p."go"8«"n逢w"vj»pi"vkp"x隠 xck"vt "vtqpi"LYV"i穎i v隠 pi逢運i dùng Ucw"8„"o丑i giao ti院p t瑛 rj c"pi逢運i dùng (Frontend) t噂i phía máy ch栄 (Backend) s胤 8隠w"vt ej"zw医t xck"vt "e栄c"pi逢運i dùng t瑛 vj»pi"vkp"pi逢運k"f́pi"vtqpi"LYV"x "zgo"zfiv"zgo"xck"vt "8„"e„"thu瓜c nhóm cho phép hay không N院u có thì request s胤 8逢嬰e"8k"swc."vj詠c hi羽n request
và response l衣k"ejq"pi逢運i dùng
Hình 3.3: Ki あm thぬ dの lうw"rj c"o {"pi⇔ぜi dùng
Trang 37Ki 吋m th穎 (validate) d英 li羽w"vt逢噂c khi x穎 lý d英 li羽u
雲 rj c"o {"mj ej."go"8«"jk羽n th詠c m瓜t l噂r"xcnkfcvg"f英 nk羽w."pj逢pi"8k隠w"8„"mj»pi"8違m b違o vì k飲 x医w"e„"vj吋 x»"jk羽u hoá b医t c泳 lúc nào Chính vì v壱y, phía máy ch栄, em
e pi"jk羽n th詠c thêm m瓜t l噂r"xcnkfcvg"f英 nk羽w"mj e0"Vtqpi"f詠 án này, em s穎 f映pi"LQK"pro"pj逢"8«"p‒w"vt‒p"rj亥n 2.2.4
Ucw"mjk"pi逢運k"f́pi"i穎k"tgswguv"n‒p server, server s胤 th詠e"jk羽p"xcnkfcvg"f英 nk羽w"pi逢運k"f́pi"i穎k"n‒p0"P院w"f英 nk羽u h嬰p l羽 thì s胤 8逢嬰c server x穎 n#"tgswguv"x "tgurqpug"ejq"pi逢運k"f́pi0"P院w"f英 nk羽w"mj»pi"j嬰p l羽 thì h羽 th嘘pi"u胤 tr違 v隠 l厩k"Kpxcnkf"Fcvc0
3.3.3 B 違o m壱v"rj c"e挨"u荏 d英 li羽u
Ki 吋m th穎 (validate) d英 li羽w"vt逢噂e"mjk"n逢w"x q"Fcvcdcug
Pj茨o"ikc"v<pi"mj違 p<pi"cp"vq p"ejq"f英 nk羽u, em s穎 f映pi"vj‒o"o瓜t l噂r"xcnkfcvg"
f英 nk羽w"vt逢噂e"mjk"p„"8逢嬰e"ijk"x q"e挨"u荏 f英 nk羽w0"OqpiqFD"mj»pi"j厩 tr嬰 s印n tính p<pi"p {"pj逢pi"8«"e„"o瓜v"vj逢"xk羽p"PqfgLU"e„"vj吋 8違o"pjk羽o"ik¿r"vc"8„"ej pj"n "Oqpiqqug0"A¤{"n "o瓜v"vj逢"xk羽p"PqfgLU"f́pi"8吋 thao tác v噂k"OqpiqFD."p„"ewpi"c医p r医v"pjk隠w"v pj"p<pi"v嘘v"pj逢"v衣q"Uejgoc."rqrwncvg."xcnkfcvg"f英 nk羽u nh英pi"e k"
o "OqpiqFD"vjw亥p"e p"vjk院u Em 8«"vk院n hành tích h嬰r"vj逢"xk羽p"p {"x "jk羽n
Cu嘘k"épi."8¤{"n "d違n v胤 v„o"v逸t l衣k"e e"n噂p b違o m壱t mà em 8«"jk羽n th詠c
Trang 38Hình 3.4: Các l ずp bVo mfv"8«"jkうn thばc trong hう thぐng
3.4 D k"vq p"x隠 u詠 nkpj"jq衣v"vtqpi"pjw"e亥w"u穎 d映pi
Pjw"e亥w"pj¤p"u詠 c栄a m厩k"e»pi"v{."fqcpj"pijk羽r"n "mj e"pjcw0"A吋 h羽 th嘘pi"e„"vj吋 rj́"j嬰p v噂k"e e"e»pi"v{."8 k"j臼k"e e"jq衣v"8瓜pi"e栄a h羽 th嘘pi"rj違k"nkpj"jq衣v."ocpi"v pj"
tu dk院n cao m噂k"e„"vj吋 8 r"泳pi"8逢嬰c các nhu c亥w"mj e"pjcw0"Pj逢pi"p院u tu dk院p"sw "pjk隠u th·" mj»pi" vj吋 jq p" vj pj" vtqpi" o瓜t th運k" ikcp" pi逸n th詠e" jk羽n Lu壱p" X<p" V嘘t
Trang 39Pijk羽p Chính vì v壱y sau mjk"v·o"jk吋w"x "rj¤p"v ej."go"zkp"8逢c"tc"jck ik違k"rj r"8吋 ikc"v<pi"v pj"nkpj"jq衣t c栄a h羽 th嘘pi"pj逢"f逢噂k"8¤{0
3.4.1 D k"vq p"x隠 u詠 nkpj"jq衣v"vtqpi"p瓜k"fwpi"8 q"v衣o
P瓜k"fwpi"8 q"v衣o ph映 thu瓜c r医v"pjk隠u vào nhu c亥w"pj¤p"n詠c c栄c"e»pi"v{."fqcpj"pijk羽p t衣k"vj運k"8k吋m s穎 f映pi0"Pjw"e亥w"pj¤p"n詠e"vjc{"8鰻k"vj·"p瓜k"fwpi"8 q"v衣q"e pi"u胤 ph違k"vjc{"8鰻k"8吋 8 r"泳pi"vjgq0"A吋 ik違k"sw{院v"d k"vq p"p {."j羽 th嘘pi"p瓜k"fwpi"8 q"v衣o s胤 8逢嬰e"z¤{ f詠pi"vjgq"j逢噂pi"oqfwng."ejkc"vjgq"v瑛pi"e医p b壱c: Khoá h丑c – pi {"j丑c – d k"j丑c – kho 8隠 mk吋m tra
‚ A嘘k"x噂k"mjq "j丑c s胤 tích h嬰r"pjk隠w"pi {"j丑c."8k隠w"p {"ik¿r"pi逢運k"j逢噂pi"f磯p"e„"
th吋 rj¤p"ejkc"x "iqo"pj„o"t "t pi"e e"p瓜k"fwpi"d k"j丑c tu vào m違pi"8 q"v衣o
‚ A嘘k"x噂k"d k"j丑c s胤 e„"e e"vk‒w"8隠 *vkvng+"8吋 pi逢運k"j逢噂pi"f磯n, th詠c t壱r"ukpj"e„"vj吋 pjcpj"ej„pi"p逸m b逸v"pi {"p q"u胤 h丑c v隠 nh英pi"p瓜k"fwpi"p q"x "d k"j丑c s胤 bao i欝m n瓜k"fwpi"d k"j丑e"8吋 th詠c t壱r"ukpj"j丑e"x "pijk‒p"e泳w"pj逢"j逢噂pi"f磯n c栄c"d k"h丑e"8„0 Ucw"8„"mjk"j丑e"zqpi"d k"j丑c, th詠c t壱r"ukpj"u胤 ph違k"vj詠e"jk羽p"d k"mk吋m tra 8吋 jq p"vj pj"pi {"j丑e"8„0
‚ V噂k"o厩k"d k"j丑c s胤 e„"o瓜v"mjq"8隠 mk吋m tra H羽 th嘘pi"u胤 t詠 8瓜pi"iqo"pj„o"e e"8隠 mk吋m tra b医t k 8吋 8逢c"tc"o瓜v"d k"mk吋m tra cho th詠c t壱r"ukpj."8k隠w"p {"e„"pij c"m厩k"vj詠c t壱r"ukpj"u胤 e„"o瓜v"d k"mk吋o"vtc"mj e"pjcw."p„"u胤 ik¿r"mj逸c ph映c tình
tr衣pi"ucq"ejfir"d k"n o"e栄a nhau T瑛 8„"8違m b違q"8逢嬰c ch医v"n逢嬰pi"8 q"v衣o
Trang 40V噂k"e医u trúc rj¤p"ejkc"pj逢"vt‒p."pi逢運k"j逢噂pi"f磯p"e„"vj吋 tu dk院n m泳e"8瓜 c栄a n瓜k"fwpi"8 q"v衣q"ucq"ejq"rj́"j嬰p v噂k"pjw"e亥u c栄c"e»pi"v{."fqcpj"pijk羽p
3.4.2 D k"vq p"x隠 i嬰k"#"pj¤p"u詠
Pjw"e亥u v隠 pj¤p"u詠 c栄c"e e"e»pi"v{."fqcpj"pijk羽r"nw»p"vjc{"8鰻k0"Mjk"vj·"e亥p"pj¤p"u詠 chuyên v隠 Htqpvgpf."Dcemgpf"pj逢pi"uqpi"uqpi"x噂k"8„"pj¤p"u詠 còn ph違k"ik臼k"vtqpi"ikcq"vk院r"vk院pi"cpj"jc{"e亥n kh違 p<pi"vjw{院t trình t嘘t, kh違 p<pi"v詠 pijk‒p"e泳u hay kh違 p<pi"v逢"fw{"nqike"v嘘t,… T医t c違 8隠u ph映 thu瓜e"x q"e»pi"v{"8cpi"e亥p"pj¤p"u詠 pj逢"vj院 p q0"P院u ch雨 f詠a v q"e e"8k吋m s嘘 vtqpi"e e"d k"mk吋m tra sau m厩k"d k"j丑e"pj逢"8«"p‒w"vtqpi"rj亥n 3.4.1 vj·"mj»pi"vj吋 8 pj"ik "8逢嬰c các k悦 p<pi"o隠o"o "e»pi"v{."fqcpj"pijk羽r"8cpi"e亥n
Hình 3.5: C Xu trúc cてa mじt nじk"fwpi"8 q"vTo tな hう
th ぐng