ĐỒ án môn học lập TRÌNH TRÊN THIẾT bị DI ĐỘNG xây DỰNG CHỨC NĂNG ANDROID ĐĂNG NHẬP GOOGLE 2

46 15 0
ĐỒ án môn học lập TRÌNH TRÊN THIẾT bị DI ĐỘNG xây DỰNG CHỨC NĂNG ANDROID ĐĂNG NHẬP GOOGLE 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH KHOA CÔNG NGHỆ THÔNG TIN • _ NGƯYEN TAT THANH ĐỒ ÁN MƠN HỌC LẬP TRÌNH TRÊN THIẾT BỊ DI ĐỘNG XÂY DỰNG CHỨC NĂNG ANDROID ĐĂNG NHẬP GOOGLE Tp.HCM, tháng 01/2022 Giảng viên giảng dạy Sinh viên thực Mã số sinh viên Chuyên ngành Khóa : ThS Bùi Tiến Đức : Võ Minh Thành :1900009252 : Kỹ thuật phần mềm : 2019 BM-ChTTRƯỜNG ĐẠI HỌC NGUYỄNKỲ TẤTTHI THÀNH KẾT THÚC HỌC PHẦN TRUNG TÂM KHẢO THÍ HỌC KỲ III NĂM HỌC 2020 - 2021 PHIẾU CHẤM THI TIỂU LUẬN/BÁO CÁO Mơn thi: Lập trình thiết bị di động Lớp học phần: 19DTH1A Sinh viên thực hiện: Võ Minh Thành MSSV: 1900009252 Đề tài tiểu luận/báo cáo sinh viên: Chức đăng nhập google Phần đánh giá giảng viên (căn thang rubrics môn học): Tiêu chí (theo CĐR Đánh giá GV HP) Điểm tối đa Cấu trúc báo cáo Nội dung - Các nội dung thành phần 4,5 - Lập luận - Kết luận 0,5 Trình bày TỔNG ĐIỂM 10 Điểm đạt Giảng viên chấm thi (ký, ghi rõ họ tên) Giảng viên chấm thi Điểm: Nhận xét: Giảng viên chấm thi Điểm: Nhận xét: CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự - Hạnh phúc TRƯỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH KHOA CÔNG NGHỆ THÔNG TIN ^^^ NHIỆM VỤ ĐỒ ÁN MƠN HỌC (Sinh viên phải đóng tờ vào báo cáo) Họ tên: VÕ MINH THÀNH MSSV: 1900009252 Chuyên ngành: Kỹ thuật phần mềm Lớp: 19DTH2A Email: minhthanhvo058@gmail.com SĐT: 0793408809 Tên đề tài: XÂY DỰNG CHỨC NĂNG ANDROID ĐĂNG NHẬP GOOGLE Giảng viên giảng dạy: ThS Bùi Tiến Đức Thời gian thực hiện: 20/12/2021 đến 1/1/2022 Nhiệm vụ: Thiết kế xây dựng chức đăng nhập google Nội dung: Tìm hiểu ngơn ngữ java Tìm hiểu đề tài chức đăng nhập google Xây dựng giao diện Lập trình xử lý kiện Phương pháp: sử dụng ngôn ngữ java để thực đề tài chức đăng nhập google Nội dung yêu cầu thông qua Bộ môn Tp.HCM, ngày tháng năm 2021 GIẢNG VIÊN GIẢNG DẠY TRƯỞNG BỘ MÔN (Ký ghi rõ họ tên) (Ký ghi rõ họ tên) ThS.Phạm Văn Đăng ThS Bùi Tiến Đức LỜI CẢM ƠN Em xin gửi lời cám ơn đến cha mẹ anh chị em gia trình động viên tinh thần chia sẻ khó khăn năm qua Em chân thành cám ơn Giảng viên hướng dẫn Bùi Tiến Đức, người hướng dẫn tận tình, đóng góp ý kiến chun mơn đồ án môn học Thầy động viên tinh thần em cố gắng hoàn thành nghiên cứu đặt Thầy cung cấp số tài liệu liên quan đến đồ án môn học mà em nghiên cứu ân cần nhắc nhở em đến tiến độ thực đồ án môn học Em chân thành gửi lời cám ơn đến Thầy Cô khoa Công nghệ thông tin trường Đại học Nguyễn Tất Thành giảng dạy, hướng dẫn, trang bị kiến thức cho em từ kiến thức đến vấn đề chuyên sâu Em xin gửi lời cám ơn đến anh, chị, bạn bè, đồng nghiệp nhiều hình thức khác giúp đỡ em trình học tập trường thời gian hoàn thành đồ án môn học Em xin chân thành cảm ơn! Sinh viên thực (Ký tên) Võ Minh Thành LỜI MỞ ĐẦU Hiện nay,điện thoại thông minh trở nên phổ biến khơng thể thiếu đời sống nay,và việc ngày có nhiều phần mềm thiết bị di động giúp giải công việc khác cách nhanh gọn lẹ,tiết kiệm thời gian độ xác.Mỗi ứng dụng,chức tạo với nhiệm vụ khác giải trí,học tập,tra cứu thơng tin, Bên cạnh với phát triển công nghệ thông tin, nhu cầu ứng dụng công nghệ ngày phát triển mạnh đem lại nhiều lợi ích Vì cần phải xây dựng chức đăng nhập để đảm bảo an toàn quản lý người sử dụng,ở android,còn tảng IOS Và số tảng khác Từ yêu cầu với góp ý giảng viên bạn bè, em định chọn đề tài “XÂY DỰNG CHỨC NĂNG ANDROID ĐĂNG NHẬP GOOGLE” NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN TP Hồ Chí Minh, ngày tháng năm 2021 GIẢNG VIÊN HƯỚNG DẪN (Ký tên) MỤC LỤC DANH MỤC CÁC BẢNG BIỂU DANH MỤC CÁC BẢNG HÌNH 10 DANH MỤC CÁC TỪ VIẾT TẮT 12 CHƯƠNG I: TỔNG QUAN ĐỀ TÀI 13 1.1 Giới thiệu đề tài: 13 1.2 Lý chọn đề tài 13 1.3 Mục tiêu đề tài 13 1.4 Các công cụ hỗ trợ .13 CHƯƠNG II: CƠ SỞ LÝ THUYẾT 14 2.1 Giới thiệu android 14 2.2 Lịch sử phát triển .15 2.2.1 Điểm khởi đầu android 16 2.3 Android Studio 16 2.3.1 Giới thiệu Android studio .16 2.3.2 Các thành phần 18 2.3.3 Firebase realtimedatabase 21 2.3.4 Lợi ích sử dụng Firebase 22 2.3 Môi trường phát triển ứng dụng .22 2.4 Ứng dụng ngôn ngữ Java 23 2.5 Các thành phần ứng dụng android 24 2.6 Alert Dialog (Hộp thoại cảnh báo) 26 2.6 Các kiểu lập trình android 26 CHƯƠNG III:PHÂN TÍCH PHẦN MỀM 27 3.1 Lựa chọn ngôn ngữ, môi trường ứng dụng: 27 3.2.1 Giao diện đăng nhập: .27 CHƯƠNG IV: KẾT LUẬN VÀ NHẬN XÉT .28 4.1 Kết đạt được: 28 4.2 Hướng phát triển đề tài: 28 CHƯƠNG V:TÀI LIỆU THAM KHẢO 30 DANH MỤC CÁC BẢNG BIỂU Bảng Biến kiểu liệu C# 15 Bảng Toán tử gán 17 Bảng Toán tử quan hệ .17 Bảng Toán tử Logic 18 Bảng Toán tử điều kiện .18 Hình 29: Giao diện LinearLayout theo hàng Theo hàng: Hình 30: Giao diện LinearLayout theo cột - RelativeLayout Layout cho phép ta xếp control theo vị trí tqơng đối control khác kể control chứa Khi gặp layout có độ phức tạp cao, có nhiều giao diện nhỏ sử dụng RelativeLayout lựa chọn tốt Một vài ý sử dụng layout này: • Các control có id riêng, việc đặt tên id phải rõ rang dễ hiểu • Các control đqợc xếp dựa vào id control khác • Các control có ràng buộc tqơng tác với nên thay đổi control làm thay đổi vị trí control khác Vì khó việc bảo trì giao diện phức tạp Ta tham khảo đoạn XML demo sau để hình dung dễ hơn: Hình 31: Giao diện RelativeLayout b Giới thiệu số android View - TextView: view sử dụng để hiển thị text hình TextView đqợc định nghĩa thẻ xml - EditText: view dùng để lấy giá trị từ ngqời dùng nhập vào EditText đqợc định nghĩa thẻ trong xml - ImageView: view sử dụng nhiều ứng dụng android, ImageView sử dụng để hiển thị hình ảnh - Button: view đqợc sử dụng nhiều android, hầu nhq sử dụng nơi với EditText, TextView Button có chức làm nhiệm vụ mà ngqời dùng click phqơng thức onClick - ListView: đqợc tạo từ danh sách Listltem Listltem dòng (row) riêng lẻ listview nơi mà liệu đqợc hiển thị Bất kỳ liệu listview đqợc hiển thị thơng qua listltem Có thể coi listview nhq nhóm cuộn Listltem c Bắt xử lý kiện giao diện Sự kiện cách hữu ích để thu thập liệu tqơng tác ngqời dùng với thành phần tqơng tác ứng dụng Giống nhq bấm vào nút chạm vào hình cảm ứng, vv Ta nắm bắt kiện chqơng trình có xử lý thích hợp theo u cầu Có hai khái niệm liên quan đến quản lý kiện Android: -Event Listeners interface Event Listeners đqợc sử dụng để đăng ký kiện cho thành phần UI (Đăng ký kiện) Trong giao tiếp event listener có phqơng thức sau đây: • onClick(): Thuộc View.OnClickListener Nó đqợc gọi ngqời dùng chạm vào item (khi chế độ cảm ứng), lựa chọn vào item với phím điều hqớng nhấn nút "enter" phù hợp • onLongClick(): Thuộc View.OnLongClickListener Nó đqợc gọi ngqời dùng chạm giữ item (khi chế độ cảm ứng), lựa chọn vào item với phím điều hqớng sau nhấn giữ phím "enter" • onFocusChange(): Thuộc View.OnFocusChangeListener Nó đqợc gọi ngqời dùng điều hqớng khỏi item, cách sử dụng phím điều hqớng • onKey(): Thuộc View.OnKeyListener Nó đqợc gọi ngqời dùng lựa chọn nhấn lên item • onTouch(): Thuộc View.OnTouchListener Nó đqợc gọi ngqời dùng thực hành động xác định đủ điều kiện nhq kiện cảm ứng, bao gồm việc nhấn, thoát ra, cử chuyển động vẽ hình (bên phạm vi item) • onCreateContextMenu(): Thuộc View.OnCreateContextMenuListener Nó đqợc gọi menu ngữ cảnh (Context Menu) đqợc xây dựng (là kết "long click") Xem thêm thông tin context menus hqớng dẫn phát triển Menus Ví dụ cho thấy làm để đăng ký bắt kiện nhấp chuột vào Button // Create an anonymous implementation of OnClickListener private OnClickListener mCorkyListener = new OnClickListenerO { pubỉic void onClick(View v) { //do something when the button is clicked } }; protected void onCreate(Bundle savedValues) { // Capture our button trom layout Button button = (Button)findViewById(R.id.corky); // Register the onClick ỉistener with the implementation above button.setOnClickListener(mCorkyListener); } Ta tìm thấy cách thuận tiện để bổ sung OnClickListener nhq phần Activity Ví dụ: public class ExampleActivity extends Activity implements OnClickListener { protected void onCreate(Bundle savedValues) { Button button = (Button)findViewById(R.id.corky); button.setOnClickListener(this); } // Implement the OnCỉỉckListener callback public void onClỉck(View v) { // something when the button is clicked } } Chú ý lời gọi onClick() ví dụ khơng trả giá trị, nhqng phqơng thức nghe kiện khác phải trả lại biến kiểu boolean Lý phụ thuộc vào kiện Đây vài lý do: • onLongClick() - Trả giá trị kiểu boolean biết ta dùng kiện khơng cần thực "long click") thêm Trả giá trị TRUE để ta xử lý kiện nên dừng lại đây; trả FALSE ta khơng xử lý / kiện nên chuyển tới nghe kiện on-click khác • onKey() - Trả giá trị kiểu boolean biết ta dùng kiện khơng cần đqợc thực thêm Trả giá trị TRUE để ta xử lý kiện nên dừng lại đây; trả FALSE ta không xử lý / kiện nên chuyển tới nghe kiện on-key khác • onTouch() - Trả giá trị kiểu boolean biết: liệu nghe ta dùng kiện hay chqa Điều quan trọng kiện có nhiều hành động nối tiếp Vì vậy, trả FALSE, ta biết ta không sử dụng không quan tâm đến hành động từ kiện Nhq vậy, ta không đqợc gọi tới thao tác khác bên kiện - Event Handlers - Là phqơng thức xử lý phát sinh kiện (Xử lý kiện) Nếu ta xây dựng thành phần tùy chỉnh từ View, ta phải định nghĩa số phqơng thức sử dụng nhq xử lý kiện mặc định Trong tàiliệu Custom Components, ta tìm hiểu số callbacks thqờng đqợc sử dụng để xử lý kiện, bao gồm: • onKeyDown(int, KeyEvent) - Đqợc gọi kiện nhấn phìm xảy • onKeyUp(int, KeyEvent) - Đqợc gọi mọt kiện thả phím xảy • onTrackballEvent(MotionEvent) - Đqợc gọi kiện chuyển • động trackball xảy • onTouchEvent(MotionEvent) - Được gọi kiện chuyển động hình cảm ứng xảy • onFocusChanged(boolean, int, Rect) - Đqợc gọi view chọn (focus) bỏ chọn Có số phqơng thức khác mà ta nên biết, chúng phần lớp View, nhqng trực tiếp tác động đến cách bạn xử lý kiện Vì vậy, quản lý kiện phức tạp bên layout, ta nên xem xét phqơng pháp sau: • Activity.dispatchTouchEvent(MotionEvent) Điều cho phép Activity bắt tất kiện chạm hình trqớc chúng đqợc gửi đến cửa sổ • ViewGroup.onInterceptTouchEvent(MotionEvent) - Điều cho phép ViewGroup xem kiện nhờ chúng gửi đến View • ViewParent.requestDisallowInterceptTouchEvent(boolean) - Gọi điều View cha để xác định khơng nên bắt kiện chạm hình với onInterceptTouchEvent(MotionEvent) 2.3.4 Firebase realtimedatabase Giới thiệu: Có nhiều cách hiểu Firebase đứng quan điểm khác nhau, sau định nghĩa • Firebase tảng di động, website giúp bạn nhanh chóng phát triển ứng dụng chất lượng cao, phát triển ứng dụng cho người dùng quy mơ lớn • Firebase dịch vụ hệ thống backend Google cung cấp sẵn tảng Android , IOS, website 2.3.5 Lợi ích sử dụng Firebase Xây dựng ứng dụng nhanh chóng mà khơng tốn thời gian, nhân lực đê quản Xây dựng ứng dụng nhanh chóng mà không tốn thời gian, nhân lực đê quản lý hệ thống sơ sở hạ tầng phía sau: Firebase cung cấp cho bạn chức phân tích, sở liệu, báo cáo hoạt động báo cáo cố lỗi đê bạn có thê dễ dàng phát triên, định hướng ứng dụng vào người sử dụng nhằm đem lại trải nghiệm tốt cho họ 2.4 Môi trường phát triển ứng dụng Smartphone: hệ điều hành phổ biến nay:Android,IOS,Windows Phone,Blackberry OS, Firefox OS Android Ưu điểm: + Có mã nguồn mở, khả tuỳ biến cao, có thê tùy ý chỉnh sửa mà khơng có can thiệp từ Google + Kho ứng dụng Google Play Store đồ sộ + Khả đa nhiệm, chạy lúc nhiều ứng dụng cao Nhược điểm: + Dễ nhiễm phần mềm độc hại virus + Kho ứng dụng nhiều dẫn đến khó kiêm soát chất lượng => thiếu ứng dụng thật tốt + Sự phân mảnh lớn + Cập nhật không tự động với tất thiết bị IOS Ưu điểm: + Nền tảng ổn định + Ứng dụng IOS hoạt động mượt mà + Độ tin cậy tính bảo mật cao Nhược điểm: + Trao đổi liệu cần phải qua iTunes nên dễ gây bất tiện, tốn thời gian + Khả tuỳ chỉnh hạn chế + iOS hoạt động thiết bị công nghệ độc quyền Apple + Windows Phone Ưu điểm: ❖ ❖ + Giao diện quen thuộc, dễ sử dụng + Khả đồng danh bạ, email tốt + Có phần mềm đồ Here Maps tốt, xem offline Nhược điểm: + Windows Phone không cho phép thay đổi giao diện, chủ đề (themes) nên dễ gây chán + Kho ứng dụng nghèo nàn, ứng dụng miễn phí + Khơng thể đổi DNS (hay IP) để vào số web bị chặn + Blackberry OS Ưu điểm: + Hoạt động ổn định, giao diện đơn giản + hỗ trợ Push Mail, xử lý cơng việc tốt tính bảo mật cao + Bàn phím QWERTY giúp soạn thảo nhanh xác + Blackberry OS cho khả nén liệu xuống cịn nửa kích thước ban đầu, giúp tiết kiệm chi phí băng thơng + Tính bảo mật cao Nhược điểm: - BlackBerry OS không thân thiện khó sử dụng người khơng am hiểu công nghệ Firefox OS Ưu điểm: + Giao diện dễ sử dụng, trông giống kết hợp hài hòa Android iOS + Firefox OS có thư mục thơng minh, tự thu thập ứng dụng, game theo thể loại khác nhau, tính chất cơng việc riêng biệt mà thân phát triển — Nhược điểm: + Giao diện Firefox OS vay mượn nhiều từ iOS, thường gặp nhiều bất cập phụ thuộc nhiều vào nút Home (màn hình chủ) 2.5 Ứng dụng ngôn ngữ Java - Các ứng dụng cho hệ điều hành Android Các ứng dụng bảo mật cao: Java ngơn ngữ lập trình có tính bảo mật cao nên thường sử dụng vào dịch vụ tài chính, ngân hàng Các ứng dụng web Java: Lập trình Java khơng sử dụng thiết bị di động mà biết đến tảng của ứng dụng website Các công cụ phần mềm: Hiện có nhiều cơng cụ phát triển phần mềm hữu ích viết Java, ví dụ: Eclipse, InetelliJ Idea Netbans IDE Khái niệm lập trình hướng đối tượng java: Lập trình hướng đối tượng (Object Oriented Programing - OOP) phương pháp để thiết kế chương trình sử dụng lớp đối tượng - - Java ngơn ngữ lập trình hướng đối tượng hỗ trợ đặc tính lập trình hướng đối tượng: Đa hình (Polymorphism) Thừa kế (Inheritance) Đóng gói (Encapsulation) Trừu tượng (Abstraction) Đối tượng thực thể có trạng thái hành vi Nó mang tính vật lý logic Lớp (Class) xem lớp khn mẫu (template) đối tượng (Object) Package: package (gói) java nhóm kiểu tương tự lớp, giao diện package Package java phân loại theo hai hình thức, package dựng sẵn package người dùng định nghĩa Có nhiều package dựng sẵn java, lang, net, io, util, sql, Package người dùng tự định nghĩa Constructor: constructor java dạng đặc biệt phương thức sử dụng để khởi tạo đối tượng Java Constructor gọi thời điểm tạo đối tượng Nó khởi tạo giá trị để cung cấp liệu cho đối tượng Khai báo Constructor giống với khải báo method (phương thức) Nó phải có tên với class (lớp) khơng có giá trị trả Có kiểu constructor: Constructor mặc định (khơng có tham số truyền vào - default constructors) Constructor tham số (parameterized constructors) Phạm vi truy cập (Access modiíier) Có hai loại modiíier java: access modiíiers non-access modifiers Có kiểu java access modiíiers: private (Mặc định) protected public Các non-access modiíiers: static, abstract, synchronized, native, volatile, transient, v.v 2.6 Các thành phần ứng dụng android 2.6.1 Activity: Activity thành phần quan trọng ứng dụng Android gồm: Activity, Service, Content Provider, Broadcast receivers - Activity gì? Mỗi Activity thường hoạt động độc lập với tương tác truyển liệu qua thơng qua Intent Chính Activity hoạt động độc lập nên có vịng đời riêng từ lúc khởi tạo lúc huỷ onCreate(): Được gọi OS activity tạo(chỉ gọi lần) Dùng để khởi tạo giao diện liệu để dùng cho sau onStart(): Ngay trước activity chạy tương tác với người dùng hàm gọi Thông thường, hàm khởi tạo animation cho UI( có), Audio, hay đối tượng cần thiết để activity hiển thị cho người dùng onResume(): Hàm gọi activity chuẩn bị chạy activity kích hoạt trở lại từ trạng thái stop onPause(): Hàm gọi ứng dụng chuyển sang chạy onStop(): Hàm sau onPause(), activity khơng cịn tương tác với người dùng onRestart(): Được gọi sau activity bị tạm dừng kích hoạt trở lại onDestroy(): Đây hàm cuối vòng đời activity Có cách để hàm gọi: bạn gọi hàm finish() để chủ động tắt activity, hai gọi tự động OS tài nguyên cạn kiệt để tránh bị lỗi Memory Leak 2.6.2 Toast Notiíication Toast message, có dạng popup, xuất hình khoảng thời gian ngắn tự biến sau Toast tạo hiển thị Activity Servive Không cho phép người sử dụng tương tác Khi hiển thị sau khoảng thời gian tự đóng lại Có giá trị mặc định: số Toast.LENGTH_SHORT hiển thị giây Toast.LENGTH_LONG hiển thị 3.5 giây Sử dụng: import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedlnstanceState) { super.onCreate(savedlnstanceState); setContentView(R.layout.activity_main); //Displaying Toast with Hello tavatpoint message Toast.makeText(getApplicationContextO,"Hello Javatpoint”,Toast.LENGTH_SHORT).showO; } 2.7 Alert Dialog (Hộp thoại cảnh báo) Khi yêu cầu người dùng lựa chọn định yes no để phản action cụ thể Sử dụng Alert Dialog Cú pháp : AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); Phương thức setIcon(Drawable icon) setCancelable(boolean cancel able) setMessage(CharSequence message) setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListene setOnCancelListener(DialogInterface.OnC r ancelListener onCancelListener) setTitle(CharSequence title) Mô tả Phương thức thiết lập icon Alert Dialog Phương thức thiết lập thuộc tính mà Dialog bị cancel không Phương thức thiết lập thông điệp để hiển thị Alert Dialog Phương thức thiết lập danh sách item để hiển thị Dialog Tùy chọn thông báo Listener Phương thức thiết lập hàm callback gọi Dialog bị cancel Phương thức thiết lập Title xuất Dialog 2.8 Các kiểu lập trình android Xử lý kiện (Event Handling) Android tương tác người dùng với thành phần tương tác ứng dụng Event Listeners - Interface lớp View chứa phương thức callback Các phương thức gọi AndroidFramework Listener đăng ký kích hoạt tương tác người dùng với item giao diện UI Event Listeners Registration - tiến trình mà Event Handler đăng ký với Event Listener Handler gọi Event Listener kích hoạt kiện Event Handlers - Khi Event xảy ra, đăng ký Event Listener cho kiện, Event Listener gọi Event Handler, phương thức thực xử lý kiện CHƯƠNG III:PHÂN TÍCH PHẦN MỀM 3.1 Lựa chọn ngơn ngữ, mơi trường ứng dụng: Ngôn ngữ lựa chọn: Java Môi trường hỗ trợ làm việc: Android Studio 3.2.1 Giao diện đăng nhập: Hình 32: Giao diện đăng nhập Đăng nhập Google Khi ấn vào biểu tượng Google: Hình 33: Đăng nhập Google Khi đăng nhập thành công: MainAct'»i';,'.iava Ị'.Ụ_Ai;:iii

Ngày đăng: 07/03/2022, 14:06

Tài liệu cùng người dùng

Tài liệu liên quan