Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 73 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
73
Dung lượng
4,11 MB
Nội dung
TRƯỜNG ĐẠI HỌC BÀ RỊA – VŨNG TÀU KHOA CÔNG NGHỆ KỸ THUẬT – NÔNG NGHIỆP CÔNG NGHỆ CAO ĐỀ TÀI ĐỒ ÁN TỐT NGHIỆP Đề tài: Hệ thống quản lý quan hệ khách hàng (CRM) Trình độ đào tạo : Đại học Ngành : Công nghệ thông tin Chuyên ngành : Lập trình ứng dụng di động game Khóa học : 2018 – 2021 Giảng viên hướng dẫn : TS Phan Ngọc Hoàng Sinh viên thực : Bùi Văn Huân Mã số sinh viên: 18033941 Lớp: DH18LT Bà Rịa – Vũng Tàu, Năm 2021 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu LỜI CẢM ƠN Trước tiên, để hồn thành chương trình học Trường Đại học Bà Rịa – Vũng Tàu thời gian 3,5 năm Mẹ Dân Chị Hường Em Huấn người quan trọng đời Con chẳng thể có ngày hơm khơng có cơng lao sinh thành dưỡng dục Mẹ Chị Gái Mẹ Chị người truyền đam mê cảm hứng sống Cảm ơn Mẹ Dân Chị Hường chèo lái thuyền mơ ước đồng hành Cảm ơn Mẹ Chị tất Trong suốt thời gian học tập rèn luyện Trường Đại học Bà Rịa – Vũng Tàu nhiều quan tâm, giúp đỡ quý Thầy, Cô bạn bè Với lòng biết ơn sâu sắc chân thành nhất, xin gửi đến quý Thầy, Cô Khoa Công nghệ kỹ thuật - Nông nghiệp công nghệ cao, Trường Đại học Bà Rịa – Vũng Tàu, với tri thức tâm huyết để truyền đạt vốn kiến thức quý báu suốt thời gian học tập trường Và đặc biệt, học thời gian học tập trường, Khoa tổ chức nhiều chương trình học tiếp cận với môn học liên quan đến ngành CNTT hữu ích sinh viên ngành CNTT tất sinh viên thuộc khối Công nghệ kỹ thuật khác Xin chân thành cảm ơn TS Phan Ngọc Hồng, ThS Nguyễn Văn Trì, TS Bùi Thị Thu Trang, ThS Nguyễn Thị Hà, ThS Nguyễn Thị Minh Nương, ThS Nguyễn Thị Vĩnh Thanh Thầy, Cô Bộ môn CNTT Trường Đại học Bà Rịa – Vũng Tàu tận tâm hướng dẫn qua buổi học lớp buổi nói chuyện, thảo luận lập trình ứng dụng web Chân thành cảm ơn bạn học Nguyễn Anh Tuấn người giỏi tài lớp DH18LT hỗ trợ lựa chọn modular trình thực đề tài Với điều kiện thời gian kinh nghiệm cịn hạn chế, đề tài đồ án khơng thể tránh thiếu sót Rất mong nhận bảo, đóng góp ý kiến quý Thầy , Cơ để có điều kiện bổ sung, nâng cao ý thức mình, phục vụ tốt cơng tác thực tế sau Xin chân thành cảm ơn! SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu LỜI CAM ĐOAN Tôi xin cam đoan kết đạt đề tài công trình nghiên cứu thân Trong tồn nội dung đề tài, điều trình bày cá nhân phần có sử dụng tài liệu tham khảo có đề tài liệt kê nêu rõ phần tài liệu tham khảo Nếu sai xin chịu hoàn toàn trách nhiệm chịu tất kỷ luật Khoa nhà trường đề Vũng Tàu, ngày … tháng … năm …… Sinh viên thực Bùi Văn Huân SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu NHẬN XÉT CỦA GIẢNG VIÊN PHẢN BIỆN SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu MỤC LỤC CHƯƠNG I: TỔNG QUAN VỀ ĐỀ TÀI 13 Lý chọn đề tài 13 Mục tiêu đề tài 13 CHƯƠNG II: CƠ SỞ LÝ THUYẾT 14 Cấu trúc hệ thống 14 1.1 Hệ thống quản lý quan hệ khách hàng (CRM) gì? 14 1.2 Cấu trúc hệ thống 14 Các công nghệ sử dụng 15 2.1 BackEnd 16 2.1.1 Ngôn ngữ Python 16 2.1.2 Flask Python 16 2.1.2.1 Thư viện sử dụng hệ thống BackEnd 17 2.2 Nền tảng đám mây Heroku 17 2.3 FrontEnd 17 2.3.1 Ngôn ngữ HTML 17 2.3.1.1 Thư viện sử dụng lập trình giao diện website 17 2.4 IDE (Mơi trường phát triển tích hợp) Pycharm 18 CHƯƠNG III: PHÂN TÍCH THIẾT KẾ HỆ THỐNG 19 Khảo sát sơ 19 Mô tả yêu cầu 19 Phân tích hệ thống quản lý quan hệ khách hàng 20 Xác định Actor 20 Xác định Use Case 20 5.1 Quản lý dự án 20 5.2 Quản lý khách hàng 21 5.3 Quản lý báo giá 22 5.4 Configuration (Thiết lập) 23 5.5 Sign-In (Đăng nhập vào hệ thống) 24 Đặc tả Use Case 25 6.1 Mơ tả q trình đăng nhập 25 6.2 Mơ tả q trình quản lý 26 6.3 Mơ tả q trình dự án 27 Thiết kế hệ thống 30 7.1 Sơ đồ sở liệu 30 7.2 Chi tiết sở liệu 32 CHƯƠNG IV: XÂY DỰNG HỆ THỐNG WEBSITE 39 Giao diện chức trang chủ 39 1.1 Phần chào mừng 39 1.2 Phần giới thiệu icon chức 39 1.3 Phần thông tin bảng giá 39 1.4 Phần thông tin liên hệ 40 SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu 1.5 Phần chân trang 40 Giao diện chức admin 41 2.1 Đăng nhập 41 2.1.1 Giao diện đăng nhập vào hệ thống 41 2.1.2 Đăng nhập sai tài khoản mật 41 2.1.3 Đăng nhập thành công 41 2.2 Tạo tài khoản 42 2.3 Trang quản trị 43 2.4 Quản lý thông tin khách hàng 43 2.4.1 Xem danh sách khách hàng 43 2.4.2 Xem thông tin chi tiết khách hàng 44 2.4.3 Tạo thông tin khách hàng 44 2.4.4 Chỉnh sửa thông tin khách hàng 45 2.4.5 Xóa thơng tin khách hàng 46 2.5 Quản lý thông tin liên hệ 46 2.5.1 Xem danh sách liên hệ 46 2.5.2 Xem thông tin chi tiết liên hệ 46 2.5.3 Tạo thông tin liên hệ 47 2.5.4 Chỉnh sửa thông tin liên hệ 47 2.5.5 Xóa thơng tin liên hệ 48 2.6 Quản lý dự án 48 2.6.1 Xem danh sách dự án 48 2.6.2 Xem thông tin chi tiết dự án 48 2.6.3 Tạo thông tin dự án 49 2.6.4 Chỉnh sửa thông tin dự án 49 2.6.5 Xóa thơng tin dự án 50 2.7 Quản lý nhiệm vụ 50 2.7.1 Xem danh sách nhiệm vụ 50 2.7.2 Chỉnh sửa nhiệm vụ 50 2.7.3 Xóa nhiệm vụ 50 2.8 Quản lý công việc 50 2.8.1 Xem danh sách công việc 50 2.8.2 Xem thông tin chi tiết công việc 51 2.8.3 Tạo thông tin công việc 51 2.8.4 Chỉnh sửa thông tin công việc 52 2.8.5 Xóa thơng tin công việc 52 2.9 Quản lý sản phẩm 52 2.9.1 Xem danh sách sản phẩm 52 2.9.2 Xem thông tin sản phẩm 53 2.9.2 Tạo thông tin sản phẩm 53 2.9.3 Chỉnh sửa thông tin sản phẩm 54 2.9.5 Xóa thơng tin sản phẩm 54 2.10 Quản lý danh mục sản phẩm 55 2.10.1 Xem danh sách danh mục sản phẩm 55 SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu 2.10.2 Tạo danh mục sản phẩm 55 2.10.3 Chỉnh sửa danh mục sản phẩm 55 2.10.4 Xóa danh mục sản phẩm 55 2.11 Quản lý thương hiệu sản phẩm 55 2.11.1 Xem danh sách thương hiệu sản phẩm 55 2.11.2 Thêm thương hiệu sản phẩm 56 2.11.3 Chỉnh sửa thương hiệu sản phẩm 56 2.11.4 Xóa thương hiệu sản phẩm 56 2.12 Điểm bán hàng 56 2.12.1 Giao diện điểm bán hàng 56 2.12.2 Thêm sản phẩm vào giỏ hàng 57 2.12.3 Xóa sản phẩm khỏi giỏ hàng 57 2.12.4 Thanh toán đơn hàng sản phẩm 58 CHƯƠNG V: KẾT LUẬN 59 Kết đạt 59 Hướng phát triển 59 TÀI LIỆU THAM KHẢO 61 PHỤ LỤC 62 Cấu trúc thư mục dự án 62 1.1 Chi tiết cấu trúc thư mục dự án 62 1.2 Blueprint 62 Code xử lý 63 2.1 Xem danh sách thông tin khách hàng 64 2.1.1 Client Model - Tạo class để quản lý Client Controller 64 2.1.2 Client Controller – Định tuyến chức Client 66 2.1.3 Đăng ký Blueprint 70 2.1.4 Form thông tin khách hàng 70 2.1.5 Khởi tạo Blueprint 70 2.1.6 Khai báo định tuyến định nghĩa bên Blueprint 70 2.1.6.1 Main/ init .py 71 2.1.6.2 Src/ init .py 72 SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu DANH MỤC BẢNG NỘI DUNG Bảng 1: Quản lý User 33 Bảng 2: Quản lý Role 33 Bảng 3: Quản lý User Role 33 Bảng 4: Quản lý Tag 33 Bảng 5: Quản lý Project 33 Bảng 6: Quản lý Project Status 34 Bảng 7: Quản lý Project Tag 34 Bảng 8: Quản lý Task 34 Bảng 9: Quản lý Task Status 34 Bảng 10: Quản lý Task Tag 34 Bảng 11: Quản lý Task Tag 35 Bảng 12: Quản lý Task checklist-items 35 Bảng 13: Quản lý Task Checklist Status 35 Bảng 14: Quản lý Client 35 Bảng 15: Quản lý Client Status 36 Bảng 16: Quản lý chuỗi đơn hàng Json 36 Bảng 17: Quản lý Client Order 36 Bảng 18: Quản lý Client Order History 36 Bảng 19: Quản lý Contact 37 Bảng 20: Quản lý Gender 37 Bảng 21: Quản lý Product 37 Bảng 22: Quản lý Product Brand 38 Bảng 23: Quản lý Product Category 38 SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu DANH MỤC SƠ ĐỒ NỘI DUNG Hình 1: Chức hệ thống - WCRM 14 Hình 2: Sơ đồ - Cơ cấu tổ chức tệp 15 Hình 3: Sơ đồ - Cơng nghệ áp dụng đề tài 16 Hình 4: Sơ đồ tổng quát - Các Usecase tác động trực tiếp vào hệ thống 20 Hình 5: Xác định Use Case – Quản lý dự án 21 Hình 6: Xác định Use Case – Quản lý khách hàng 22 Hình 7: Xác định Use Case – Quản lý báo giá 23 Hình 8: Xác định Use Case – Quản lý thiết lập 24 Hình 9: Xác định Use Case – Quản lý thiết lập 24 Hình 10: Xác định Use Case – Quản lý đăng nhập 25 Hình 11: Sơ đồ - Q trình đăng nhập thành cơng 26 Hình 12: Quá trình đăng nhập tài khoản mật sai 26 Hình 13: Sơ đồ - Quá trình quản lý 27 Hình 14: Sơ đồ - Xem danh sách dự án 27 Hình 15: Sơ đồ - Thêm dự án 28 Hình 16: Sơ đồ - Cập nhật thông tin dự án 29 Hình 17: Sơ đồ - Xóa thơng tin dự án 30 Hình 18: Sơ đồ sở liệu 31 Hình 19: Sơ đồ sở liệu 32 Hình 20: Phần menu, giới thiệu trang chủ 39 Hình 21: Phần hiển thị tính hệ thống website 39 Hình 22: Bảng giá gói tính hệ thống website 40 Hình 23: Phần thông tin liên hệ tư vấn 40 Hình 24: Chân trang cung cấp thơng tin liên quan 40 Hình 25: Trang đăng nhập vào hệ thống website 41 Hình 26: Thông báo đăng nhập sai tài khoản mật 41 Hình 27: Trang quản trị sau đăng nhập thành công 42 Hình 28: Trang đăng ký tài khoản dùng thử tính hệ thống website 42 Hình 29: Thơng báo thông tin đăng ký chưa 42 Hình 30: Thanh menu top & chức 43 Hình 31: Thanh menu left & Chức 43 Hình 32: Quản lý thơng tin khách hàng 43 Hình 33: Quản lý thơng tin khách hàng - Thông tin chi tiết 44 Hình 34: Quản lý thông tin khách hàng - Thêm thông tin 44 Hình 35: Quản lý thông tin khách hàng - Thêm thông tin 45 Hình 36: Quản lý thông tin khách hàng - Sửa thông tin 45 Hình 37: Quản lý thông tin khách hàng - Sửa thông tin 46 Hình 38: Quản lý thơng tin khách hàng - Thơng tin liên hệ 46 Hình 39: Quản lý thơng tin khách hàng – Chi tiết thông tin liên hệ 46 Hình 40: Quản lý thơng tin khách hàng – Thêm thông tin liên hệ 47 SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 10 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu CHƯƠNG V: KẾT LUẬN Kết đạt Trong trình thực đề tài với hỗ trợ từ quý Thầy, Cô vận dụng kiến thức ngôn ngữ Python, website, phân tích, thiết kế, CSDL chương trình học Trường Đại học Bà Rịa – Vũng Tàu vào dự án thực tế Thêm vào ứng dụng kiến thức Python để thực hành, nghiên cứu sâu vào framework Flask nhằm nâng cao hiểu biết thân kỹ làm việc trao đổi, thu thập thơng tin Thơng qua nắm quy trình quản lý dự án, chăm sóc, lưu trữ thơng tin khách hàng phân tích, thiết kế hệ thống “Quản lý quan hệ khách hàng” cho doanh nghiệp nhỏ góp phần hồn thiện chi tiết áp dụng cơng nghệ trình quản lý doanh nghiệp bán hàng, sản phẩm, xây dựng website giới thiệu dịch vụ chuyên nghiệp, đại, đầy đủ thông tin, dễ thao tác khách hàng truy cập cách dễ dàng Đồng thời trình nghiên cứu thực hiện, xây dựng đề tài có trau dồi thêm kỹ năng, kiến thức góp phần chuẩn hóa liệu đảm bảo tính tồn vẹn liệu, giao diện quản lý dễ nhìn, thuận tiện thao tác, rõ ràng dễ sử dụng cập nhật thơng tin liệu nâng cấp tính hệ thống website Hướng phát triển Trước tiên, số tính cần phải lập trình thêm tính rà sốt lỗi cịn lại chưa phát tính như: - Quản lý thông tin khách hàng; Quản lý sản phẩm; Quản lý dự án; Điểm bán hàng; Tính cần phát triển thêm: - Báo cáo thống kê; Mở rộng CSDL, quản lý thông tin chi tiết nhằm đáp ứng nhu cầu kinh doanh Doanh nghiệp Quản lý hóa đơn da dạng xuất import liệu hệ thống Mở rộng thêm chức tìm kiếm Phân quyền truy cập … Sẽ phát triển ứng dụng website “Quản lý quan hệ khách hàng” thành hệ thống hồn thiện tính hơn, với chức ban đầu ứng dụng web tập trung hỗ trợ tính quản lý dự án, cơng việc, lưu trữ chăm sóc thơng tin khách hàng, quản lý sản phẩm, tồn kho, điểm bán hàng hồn thiện tính tính thực tiễn thời gian tới SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 59 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu Và đồng thời đầu tư vào tính đưa vào danh sách dự định phát triển, tương lai mở rộng thành hệ thống phục vụ áp dụng vào hầu hết tất lĩnh vực quản như: quản lý nhà hàng, quản lý bãi đậu xe, quản lý quy trình xử lý rác, quản lý lịch trình lịch trình booking khách sạn, quản lý phịng… Ngồi ra, trình phát triển sử dụng phần mềm cần linh hoạt đóng góp từ cộng đồng, nên sau đề tài CRM cung cấp mã nguồn mở, để tất lập trình viên linh hoạt sử dụng nhiều cơng cụ lập trình để phát triển góp phần tăng tỷ lệ chuyển đổi số cho hầu hết doanh nghiệp vừa nhỏ Việt Nam Sau kêu gọi ứng vốn đầu tư cho dự án để nhận chuyển nhượng quyền thu phí, Mua/Bán lại cổ phần cơng ty dự án có tiềm năng, sử dụng địn bẩy tài chính: bán dịng tiền thu phí tương lai cho ngân hàng công ty bảo hiểm…, phát hành cổ phiếu thông qua IPO phát hành thêm cổ phiếu Với điều kiện thời gian kinh nghiệm hạn chế, đề tài đồ án khơng thể tránh thiếu sót Rất mong nhận đóng góp ý kiến quý báu Thầy, Cô trường Đại học Bà Rịa – Vũng Tàu để có điều kiện bổ sung, nâng cao kỹ năng, trau dồi kiến thức phục vụ tốt công tác thực tế sau Xin chân thành cảm ơn quý Thầy, Cô khoa Công nghệ kỹ thuật - Nông nghiệp công nghệ cao đặc biệt xin gửi đến thầy TS Phan Ngọc Hồng, người tận tình hướng dẫn, giúp đỡ hoàn thành đề tài đồ án tốt nghiệp lời cảm ơn sâu sắc SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 60 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu TÀI LIỆU THAM KHẢO [1] Data-models Lấy từ URL: https://flaskuser.readthedocs.io/en/latest/data_models.html#roleanduserroledatamodels - Tham khảo áp dụng vào chức phân quyền người dùng hệ thống [2] Role-based Authorization – Tham khảo từ URL: https://flaskuser.readthedocs.io/en/latest/authorization.html - Tham khảo áp dụng vào chức đăng nhập đăng xuất hệ thống [3] Flask’s documentation – Tham khảo từ URL: https://flask-doc.readthedocs.io/en/latest/ Tham khảo hướng dẫn sử dụng thư viện áp dụng đồ án [4] Flask-modular – Tham khảo từ URL: https://github.com/huanbv/flask-modular - Là mẫu mô-đun hệ thống áp dụng vào làm sở hệ thống CRM [5] Web flask mid term – Tham khảo từ URL: https://github.com/iceStorm/web-flask-midterm - Tham khảo áp dụng chức quản lý đăng nhập hệ thống website [6] Flask Ecommerce – Tham khảo từ URL: https://github.com/bugtijamal/flaskecommerce Tham khảo áp dung vào chức quản lý đơn hàng thêm đơn hàng vào giỏ hàng [7] Tailwind CSS – Tham khảo từ URL: https://tailwindcss.com/ - Được sử dụng thiết kế tùy chỉnh giao diện hệ thống website [8] Tailwind CSS Components Examples and templates – Tham khảo từ URL: https://tailwindcomponents.com/ - Sử dụng tham khảo giao diện dành cho quản trị viên trình quản trị hệ thống website [9] The Python IDE for Professional Developers - Tham khảo từ URL: https://www.jetbrains.com/pycharm/ - Sử dụng để lập trình ứng dụng website [10] DATN – Tham khảo từ Báo cáo: DATN Nguyen Thi Minh Tham – Tham khảo cách bày trí bố cục báo cáo phong cách trình bày nội dung [11] Hướng dẫn lập trình Flask – Phần 15: Tinh chỉnh cấu trúc ứng dụng – Tham khảo từ: https://thaitpham.com/huong-dan-lap-trinh-flask-phan-15-tinh-chinh-cau-truc-ung-dung/ Tham khảo cách hoạt động Blueprint Mục lục 1.2 Blueprint SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 61 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu PHỤ LỤC Cấu trúc thư mục dự án 1.1 Chi tiết cấu trúc thư mục dự án Cấu trúc chi tiết thư mục dự án CRM trình bày Hình 63 Trong đó, vùng màu vàng cấu trúc tổng quan hệ thống Tiếp theo vùng màu đỏ nơi mục bố trí với tính lưu trữ như: static, modules Thêm vào đó, mục màu tím nơi lưu trữ mã code xử lý bố cục tính hệ thống như: quản lý khách hàng, quản lý dự án, quản lý sản phẩm, quản lý danh mục sản phẩm, quản lý thương hiệu sản phẩm, quản lý nhiệm vụ, quản lý cơng việc Hình 71: Phụ lục - Cấu trúc thư mục dự án STT Tên thư mục Diễn giải Dữ liệu lưu trữ Thư mục chứa thiết kế giao diện(*.html) Thư mục chứa hình ảnh, file CSS, Bootstrap, Js Thư mục chứa môi trường, thư viện chương trình Thư mục chứa file chuyển đổi liệu Thư mục chứa cấu hình tính hệ thống Thư mục chứa file code tính hệt thống Thư mục chứa file môi trường tùy chỉnh hệ thống db template static venv migration src modules config 1.2 Blueprint Blueprint Flask áp dụng vào cấu trúc hệ thống CRM cấu trúc luận lý đại diện cho phần ứng dụng Blueprint hệ thống CRM bao gồm thành phần định tuyến (route), hàm hiển thị, form, template file tĩnh yếu tố cần thiết liên quan đến chức định hệ thống Được trình bày Hình 63 (mục màu tím) Sau sơ đồ chi tiết blueprint xác thực chức khách hàng (client) Hệ thống quản lý quan hệ khách hàng (CRM): Modules/ | _ | Client/ | _ thư mục cho blueprint Forms/ SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 62 Đề tài đồ án tốt nghiệp 2018 – 2021 | | | | | | | | | | | | _ | | | | _ | _ | _ | _ | _ Templates/ | _ | _ | _ init .py Client_controller.py Client_models.py | init .py Trường Đại học Bà Rịa – Vũng Tàu init .py Client_form.py khởi tạo blueprint form thông tin khách hàng blueprint templates Add-client.html Client.html Client-details.html nơi đăng ký blueprint định tuyến chức client tạo class để quản lý Client_controller.py nơi đăng ký blueprint Định nghĩa định tuyến cho blueprint hệ thống CRM, sử dụng decorator @client_module.route thay @app.route Bên cạnh đó, cần phải cập nhật lời gọi hàm url_for() để tạo URL Đối với hàm hiển thị định nghĩa trực tiếp từ ứng dụng, tham số tên hàm hiển thị Nhưng định tuyến định nghĩa bên blueprint sử dụng CRM, tham số bao gồm tên blueprint tên hàm hiển thị ngăn cách dấu chấm Cụ thể lập trình phải thay tất lời gọi hàm url_for('client') với url_for('client.add') tương tự cho trường hợp khác Đăng ký blueprint khách hàng (client) với ứng dụng sau: Khi gọi hàm register_blueprint() hệ thống với chức client, sử dụng tham số url_prefix Tham số tùy chọn, Flask cho phép kết nối blueprint vào tiền tố URL, nhờ URL blueprint client bắt đầu với tiền tố Mục đích áp dụng để phân biệt rõ URL blueprint khác hệ thống CRM Trong trường hợp này, URL từ blueprint khách hàng bắt đầu với tiền tố /client Ví dụ URL cho trang tạo thông tin khách hàng http://localhost:5000/client/add Bởi hệ thống sử dụng hàm url_for() để tạo URL, tất URL blueprint kết hợp với tiền tố cách tự động Code xử lý Code xử lý hệ thống CRM bao gồm chức xem, thêm, xóa, sửa thơng tin chức tương ứng xem danh sách thông tin khách hàng, xem thông tin chi tiết khách hàng, tạo thông tin khách hàng, sửa thơng tin khách hàng, xóa thơng tin khách hàng Q trình thêm, xóa, sửa đổi với mục khác thực tương tự … Ngoài ra, mẫu code xử lý với tính quản lý khách hàng (client) sử dụng để diễn giải cách thức xử lý hệ thống CRM SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 63 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu 2.1 Xem danh sách thông tin khách hàng 2.1.1 Client Model - Tạo class để quản lý Client Controller import json from datetime import datetime from sqlalchemy import ForeignKey, Sequence from sqlalchemy.orm import relationship from src import db class Client(db.Model): table_args = {'extend_existing': True} id = db.Column(db.Integer, Sequence('client_id_seg'), primary_key=True) name = db.Column(db.String(50), nullable=False) phone = db.Column(db.String(50), nullable=False) email = db.Column(db.String(100), nullable=False) website = db.Column(db.String(50), nullable=True) vat_number = db.Column(db.String(50), nullable=True) address = db.Column(db.String(100), nullable=True) zip_code = db.Column(db.String(50), nullable=True) user_id = db.Column(db.Integer, ForeignKey('user.email')) user = relationship('User', backref='clients') client_status_id = db.Column(db.Integer, ForeignKey('client_status.id')) client_status = relationship('ClientStatus', backref='clients') country_id = db.Column(db.Integer, ForeignKey('country.id')) country = relationship('Country', backref='clients') currency_id = db.Column(db.Integer, ForeignKey('currency.id')) currency = relationship('Currency', backref='clients') def init (self, name: str, phone: str, email: str, website: str, vat_number: str, address: str, zip_code: str, client_status_id: str, country_id: str, currency_id: str): """ The constructor for Client model :param name: The company's name :param phone: The company's phone number :param email: The email address of the company :param website: The website url address of the company :param vat_number: The VAT number of the company :param address: The main address of the company :param zip_code: The ZIP Code unit :param client_status_id: The client status is active or unActive :param country_id: The country's company :param currency_id: The currency's unit """ self.name = name self.phone = phone self.email = email self.website = website self.vat_number = vat_number self.address = address self.zip_code = zip_code self.client_status_id = client_status_id self.country_id = country_id SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 64 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu self.currency_id = currency_id def get_status_class(self): if self.client_status_id == 1: return "border border-green-500 text-green-700" else: return "border border-red-500 text-red-700" class ClientStatus(db.Model): id = db.Column(db.Integer, Sequence('client_status_id_seq'), primary_key=True) text = db.Column(db.String(50), nullable=False) def repr (self): return ''.format(self.id, self.text) class JsonEcodedDict(db.TypeDecorator): impl = db.Text def process_bind_param(self, value, dialect): if value is None: return '{}' else: return json.dumps(value) def process_result_value(self, value, dialect): if value is None: return {} else: return json.loads(value) class ClientOrder(db.Model): table_args = {'extend_existing': True} id = db.Column(db.Integer, Sequence('client_order_id_seg'), primary_key=True) invoice = db.Column(db.String(50), unique=True, nullable=False) status = db.Column(db.String(50), default='Pending', nullable=False) date_created = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) orders = db.Column(JsonEcodedDict) client_id = db.Column(db.Integer, ForeignKey('client.id'), nullable=False) client = relationship('Client', backref='client_orders') def repr (self): return ''.format(self.invoice) class ClientOrderHistory(db.Model): id = db.Column(db.Integer, primary_key=True) invoice = db.Column(db.String(20), unique=False,nullable=False) status = db.Column(db.String(20), default='Pending', nullable=False) customer_id = db.Column(db.Integer, unique=False, nullable=False) customer_name = db.Column(db.String(50), unique=False) country = db.Column(db.String(50), unique=False) city = db.Column(db.String(50), unique=False) contact = db.Column(db.String(50), unique=False) zipcode = db.Column(db.String(50), unique=False) SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 65 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu product_id = db.Column(db.Integer, unique=False, nullable=False) product_name = db.Column(db.String(80), nullable=False) product_price = db.Column(db.Numeric(10, 2), nullable=False) product_quantity = db.Column(db.Integer, nullable=False) product_detail = db.Column(db.String(80), default='None', nullable=False) product_brand = db.Column(db.String(50), default='None', unique=False) product_category = db.Column(db.String(50), default='None', unique=False) payment_method = db.Column(db.String(50), default='Cash', unique=False) product_delivered= db.Column(db.String(20), default='False', unique=False) delivered_time = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) order_date = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) product_cancel = db.Column(db.Boolean, nullable=False, default=False) def repr (self): return'' % self.invoice 2.1.2 Client Controller – Định tuyến chức Client from flask import Blueprint, render_template, redirect, flash, session, url_for, request, make_response from flask_login import login_required, current_user from src import db from src.main.modules.client import Client, ClientStatus, ClientOrder from src.main.modules.client.forms import ClientForm, ClientStatusForm from src.main.modules.country import Country from src.main.modules.currency import Currency import secrets import pdfkit client_module = Blueprint('client', name , static_folder='static', template_folder='templates') @client_module.route('/', methods=['GET', 'POST']) @login_required def client(): if current_user.is_authenticated: return render_template('client.html', user=current_user) return redirect('/') @client_module.route('/add', methods=['GET', 'POST']) @login_required def add(): form = ClientForm() # select customer status form client status table form.inputClientStatus.choices = [(p.id, p.text) for p in db.session.query(ClientStatus).all()] # select currency unit form currency table form.inputCurrency.choices = [(p.id, p.name) for p in db.session.query(Currency).all()] # select country form country table form.inputCountry.choices = [(p.id, p.name) for p in db.session.query(Country).all()] SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 66 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu if form.validate_on_submit(): name = form.inputName.data phone = form.inputPhone.data email = form.inputEmail.data website = form.inputWebsite.data vat_number = form.inputVatNumber.data address = form.inputAddress.data zip_code = form.inputZIPCode.data client_status_id = form.inputClientStatus.data country_id = form.inputCountry.data currency_id = form.inputCurrency.data client = Client(name=name, phone=phone, email=email, website=website, vat_number=vat_number, address=address, zip_code=zip_code, client_status_id=client_status_id, country_id=country_id, currency_id=currency_id) # add user email to owner customer client.user = current_user db.session.add(client) db.session.commit() return redirect('/client') form.inputClientStatus.render_kw = {'readonly': 'true', 'style': 'pointerevents: none'} return render_template('add-client.html', form=form, user=current_user) @client_module.route('/edit/', methods=['GET', 'POST']) @login_required def edit(id): form = ClientForm() # re-index customer status form client status table # on get request showing the form view form.inputClientStatus.choices = [(p.id, p.text) for p in db.session.query(ClientStatus).all()] # re-index currency unit form currency table form.inputCurrency.choices = [(p.id, p.name) for p in db.session.query(Currency).all()] # re-index country form country table form.inputCountry.choices = [(p.id, p.name) for p in db.session.query(Country).all()] the_client = db.session.query(Client).get(id) if form.validate_on_submit(): the_client.name = form.inputName.data the_client.phone = form.inputPhone.data the_client.email = form.inputEmail.data the_client.website = form.inputWebsite.data the_client.vat_number = form.inputVatNumber.data the_client.address = form.inputAddress.data the_client.zip_code = form.inputZIPCode.data the_client.client_status_id = form.inputClientStatus.data the_client.country_id = form.inputCountry.data the_client.currency_id = form.inputCurrency.data db.session.commit() SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 67 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu return redirect('/client') form.inputName.default = the_client.name form.inputPhone.default = the_client.phone form.inputEmail.default = the_client.email form.inputWebsite.default = the_client.website form.inputVatNumber.default = the_client.vat_number form.inputAddress.default = the_client.address form.inputZIPCode.default = the_client.zip_code form.inputClientStatus.default = the_client.client_status_id form.inputCountry.default = the_client.country_id form.inputCurrency.default = the_client.currency_id form.process() return render_template('/add-client.html', form=form, user=current_user) @client_module.route('/delete/', methods=['GET', 'POST']) @login_required def delete(id): the_client = db.session.query(Client).filter_by(id=id).first() db.session.delete(the_client) db.session.commit() return redirect(f"/client") @client_module.route('/view/', methods=['GET']) @login_required def view(id): if current_user.is_authenticated: the_client = db.session.query(Client).get(id) if not the_client.user == current_user: flash('You don\'t have any customer information') return redirect('/') return render_template('client-details.html', client=the_client, user=current_user) return redirect('/') def update_shopping_cart(): for key, shopping in session['Shoppingcart'].items(): session.modified = True del shopping['colors'] return update_shopping_cart @client_module.route('/get-order', methods=['GET', 'POST']) @login_required def get_order(): if current_user.is_authenticated: # client_id = current_user.email client_id = request.form.get('client_id') invoice = secrets.token_hex(5) update_shopping_cart try: the_order = ClientOrder(invoice=invoice, client_id=client_id, orders=session['Shoppingcart']) db.session.add(the_order) SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 68 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu db.session.commit() session.pop('Shoppingcart') flash('Your order has been sent successfully', 'success') return redirect(url_for('orders', invoice=invoice)) except Exception as e: print(e) flash('Some thing went wrong while get order', 'danger') return redirect(url_for('pos.view_cart')) @client_module.route('/orders/') @login_required def orders(invoice): if current_user.is_authenticated: grandTotal = subTotal = orders = ClientOrder.query.filter_by(invoice=invoice).order_by(ClientOrder.id.desc()).fir st() for _key, product in orders.orders.items(): discount = (product['discount'] / 100) * float(product['price']) subTotal += float(product['price']) * int(product['quantity']) subTotal -= discount tax = ("%.2f" % (.06 * float(subTotal))) grandTotal = ("%.2f" % (1.06 * float(subTotal))) else: return redirect(url_for('/')) return render_template('/client-order.html', invoice=invoice, tax=tax, subTotal=subTotal, grandTotal=grandTotal, orders=orders, user=current_user) @client_module.route('/get_pdf/', methods=['POST']) @login_required def get_pdf(invoice): if current_user.is_authenticated: grandTotal = subTotal = if request.method == "POST": orders = ClientOrder.query.filter_by(invoice=invoice).order_by(ClientOrder.id.desc()).fir st() for _key, product in orders.orders.items(): discount = (product['discount']/100) * float(product['price']) subTotal += float(product['price']) * int(product['quantity']) subTotal -= discount tax = ("%.2f" % (.06 * float(subTotal))) grandTotal = float("%.2f" % (1.06 * subTotal)) rendered = render_template('/pdf.html', invoice=invoice, tax=tax, grandTotal=grandTotal, orders=orders) pdf = pdfkit.from_string(rendered, False) response = make_response(pdf) response.headers['content-Type'] ='application/pdf' response.headers['content-Disposition'] ='inline; filename='+invoice+'.pdf' return response return request(url_for('orders')) SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 69 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu 2.1.3 Đăng ký Blueprint from client_model import Client, ClientStatus, ClientOrder, ClientOrderHistory from client_controller import client_module 2.1.4 Form thông tin khách hàng from flask_wtf import FlaskForm from wtforms import StringField, SelectField from wtforms.validators import DataRequired class ClientForm(FlaskForm): inputName = StringField(label='Name', validators=[ DataRequired(message='Please fill out the name field'), ], render_kw={"placeholder": "Client name"}) inputPhone = StringField(label='Phone Number', validators=[ DataRequired(message='Please fill out the phone number field'), ], render_kw={"placeholder": "Phone number"}) inputEmail = StringField(label='Email address', validators=[ DataRequired(message='Please fill out the email address field'), ], render_kw={"placeholder": "Email address"}) inputWebsite = StringField(label='Website', validators=[ DataRequired(message='Please fill out the website url field'), ], render_kw={"placeholder": "Website URL"}) inputVatNumber = StringField(label='VAT Number', validators=[ DataRequired(message='Please fill out the VAT number field'), ], render_kw={"placeholder": "VAT number"}) inputAddress = StringField(label='Address', validators=[ DataRequired(message='Please fill out the address field'), ], render_kw={"placeholder": "Address"}) inputZIPCode = StringField(label='ZIP Code', validators=[ DataRequired(message='Please fill out the ZIP code field'), ], render_kw={"placeholder": "ZIP code"}) inputClientStatus = SelectField('Client Status', coerce=int) inputCountry = SelectField('Country', coerce=int) inputCurrency = SelectField('Currency', coerce=int) class ClientStatusForm(FlaskForm): inputText = StringField(label='Status', validators=[ DataRequired(message='Please fill out the status field'), ], render_kw={"placeholder": "Status"}) 2.1.5 Khởi tạo Blueprint from client_form import ClientForm, ClientStatusForm 2.1.6 Khai báo định tuyến định nghĩa bên Blueprint Sau lập trình xử lý định tuyến class chức quản lý thông tin khách hàng, để chức hoạt động được, cần phải khai báo định tuyến định nghĩa bên blueprint client hệ thống SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 70 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu 2.1.6.1 Main/ init .py from flask import Flask class App(Flask): def init (self, instance_path: str): super(App, self). init ( import_name= name , instance_path=instance_path, instance_relative_config=True ) # assigning the base templates & static folder self.template_folder = './base/templates' self.static_folder = './base/static' # loading environment variables self.load_environment_variables() # registering essential partials for the app self.register_blueprints() self.register_login_manager() def register_blueprints(self): """ Registering the app's blueprints """ from src.main.modules.client import client_module self.register_blueprint(client_module, url_prefix="/client") def register_login_manager(self): # adding login manager from flask_login import LoginManager login_manager = LoginManager() login_manager.login_view = "auth.login" login_manager.init_app(self) @login_manager.user_loader def load_user(email): # registering user_loader from src.main.modules.user import User return User.query.get(email) def load_environment_variables(self): """ Loading the configured environment variables """ # Load the default configuration ( /config/default.py) self.config.from_object('config.default') # Load the file specified by the APP_CONFIG_FILE environment variable # Variables defined here will override those in the default configuration self.config.from_envvar('APP_CONFIG_FILE') SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 71 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu 2.1.6.2 Src/ init .py import sys import os from pathlib import Path def add_sys_paths(): print('\n[ADDING PATHS TO THE PYTHON ENVIRONMENT ]') # getting the current file's absolute path CURRENT_FILE_ABSOLUTE_PATH = Path( file ).absolute() # WORKING_DIR: src WORKING_DIR = os.path.abspath(os.path.join(CURRENT_FILE_ABSOLUTE_PATH, ' /')) # ROOT_DIR (includes the: src ; scripts ; venv ; ROOT_DIR = os.path.abspath(os.path.join(CURRENT_FILE_ABSOLUTE_PATH, ' / /')) # appending the WORKING_DIR, ROOT_DIR to the python environment sys.path.append(WORKING_DIR) sys.path.append(ROOT_DIR) print('\n[PATHS IN THE PYTHON ENVIRONMENT ]:') print('\n'.join(sys.path), '\n') return WORKING_DIR, ROOT_DIR def create_app(): # initializing the app print("\n[INITIALIZING THE APP ]") from src.main import App app = App(instance_path=add_sys_paths()[0]) print("\n[INITIALIZING THE DATABASE ]") db.init_app(app=app) # migrating Models to DB from flask_migrate import Migrate print("\n\n[MIGRATING THE DATABASE ]") migrate = Migrate() with app.app_context(): # allow dropping column for sqlite if db.engine.url.drivername == 'sqlite': migrate.init_app(app, db, render_as_batch=True) else: migrate.init_app(app, db) # importing models import src.main.modules.user.user_model # place your new model (want to be created in the app.sqlite) here import src.main.modules.client.client_model print('\n\n[NEW APP RETURNED ]') return app # defining the db instance SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 72 Đề tài đồ án tốt nghiệp 2018 – 2021 Trường Đại học Bà Rịa – Vũng Tàu print("\n[DEFINING THE DATABASE INSTANCE ]") from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() SINH VIÊN THỰC HIỆN: BÙI VĂN HUÂN 73 ... SỞ LÝ THUYẾT Cấu trúc hệ thống 1.1 Hệ thống quản lý quan hệ khách hàng (CRM) gì? WCRM hệ thống quản lý dành cho doanh nghiệp vừa nhỏ, bao gồm chức năng: Quản lý sản phẩm (Inventory), quản lý khách. .. tích hệ thống quản lý quan hệ khách hàng Với phân tích yêu cầu chức hệ thống quản lý quan hệ khách hàng (CRM) cần đáp ứng trình bày sơ đồ Hình Trong mơ hình Use Case có Actor tương tác với hệ thống, ... khách hàng áp dụng với doanh nghiệp vừa nhỏ Và hệ thống cần đáp ứng chức bao gồm quản lý thông tin khách hàng, quản lý dự án, quản lý công việc, quản lý nhiệm vụ, quản lý sản phẩm, tạo quản lý