NGHIÊN CỨU NODE JS KẾT HỢP POSTGRESQL XÂY DỰNG PHẦN MỀM QUẢN LÝ KHÁCH HÀNG VÀ KHAI THÁC KHÁCH HÀNG TIỀM NĂNG CHO DOANH NGHIỆP

67 0 0
Tài liệu đã được kiểm tra trùng lặp
NGHIÊN CỨU NODE JS KẾT HỢP POSTGRESQL XÂY DỰNG PHẦN MỀM QUẢN LÝ KHÁCH HÀNG VÀ KHAI THÁC KHÁCH HÀNG TIỀM NĂNG CHO DOANH NGHIỆP

Đ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

Công Nghệ Thông Tin, it, phầm mềm, website, web, mobile app, trí tuệ nhân tạo, blockchain, AI, machine learning - Công Nghệ Thông Tin, it, phầm mềm, website, web, mobile app, trí tuệ nhân tạo, blockchain, AI, machine learning - Công nghệ thông tin UBND TỈNH QUẢNG NAM TRỜNG ĐẠI HỌC QUẢNG NAM KHOA CÔNG NGHỆ THÔNG TIN ---------- VÕ VĂN THẢO NGHIÊN CỨU NODE.JS KẾT HỢP POSTGRESQL XÂY DỰNG PHẦN MỀM QUẢN LÝ KHÁCH HÀNG VÀ KHAI THÁC KHÁCH HÀNG TIỀM NĂNG CHO DOANH NGHIỆP KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC Quảng Nam, tháng 4 năm 2019 UBND TỈNH QUẢNG NAM TRỜNG ĐẠI HỌC QUẢNG NAM KHOA CÔNG NGHỆ THÔNG TIN ---------- KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC Đề tài: NGHIÊN CỨU NODE.JS KẾT HỢP POSTGRESQL XÂY DỰNG PHẦN MỀM QUẢN LÝ KHÁCH HÀNG VÀ KHAI THÁC KHÁCH HÀNG TIỀM NĂNG CHO DOANH NGHIỆP Sinh viên thực hiện VÕ VĂN THẢO MSSV: 2115031048 CHUYÊN NGÀNH: CÔNG NGHỆ THÔNG TIN KHÓA 2015 – 2019 Cán bộ hướng dẫn ThS. TRẦN THỊ DIỆU HIỀN Quảng Nam, tháng 4 năm 2019 LỜI CÁM ƠN Để có được điều kiện thực hiện Khóa luận tốt nghiệp cũng như hoàn thành chương trình học 4 năm tại trường Đại học Quảng Nam, em đã nhận được những sự chỉ dạ y tận tình với những kinh nghiệm quý báu từ quý thầy cô trong trường Đại học Quả ng Nam nói chung và trong khoa Công nghệ thông tin nói riêng Em xin được gửi lời cảm ơn chân thành nhất đến: - Ban giám hiệu cùng quý thầy cô trường Đai học Quảng Nam đã tạo cho em một môi trường học tập tích cực và vui vẻ. - Quý thầy cô trong khoa công nghệ thông tin đã truyền dạy cho em những kiế n thức chuyên môn quý báu sẽ là hành trang trong cuộc sống và công việc sau này. - Cô Th.S Trần Thị Diệu Hiền – Giảng viên khoa Công nghệ thông tin đã tận tình hướng dẫn, chỉ bảo, giúp đỡ em trong suốt quá trình thực hiện khóa luận. - Gia đình và bạn bè đã luôn động viên và là chỗ dựa tinh thần vững chắ c trong suốt thời gian qua, đã tạo cho em niềm tin, động lực để vượt qua những khó khăn trong quá trình thực hiện khóa luận MỤC LỤC Phần 1. MỞ ĐẦU ........................................................................................................ 1 1.1.Lý do chọn đề tài ................................................................................................ 1 1.2. Mục tiêu của đề tài............................................................................................ 1 1.3. Đối tƣợng và phạm vi nghiên cứu .................................................................... 2 1.3.1. Đối tƣợng nghiên cứu ................................................................................ 2 1.3.2. Phạm vi nghiên cứu ................................................................................... 2 1.4.Phƣơng pháp nghiên cứu .................................................................................. 2 1.5 Lịch sử nghiên cứu ............................................................................................ 2 1.6 Đóng góp của đề tài ........................................................................................... 2 1.7 Cấu trúc đề tài.................................................................................................... 3 Phần 2. NỘI DUNG NGHIÊN CỨU........................................................................... 4 CHƠNG 1: CƠ SỞ LÝ THUYẾT VỀ NODE.JS VÀ CSDL POSTGRESQL ........... 4 1.1.Ngôn ngữ lập trình Node.JS .............................................................................. 4 1.1.1.Giới thiệu về Node.JS.................................................................................. 4 1.1.2. Installation Node.js .................................................................................... 8 1.1.3. Các objects cơ bản...................................................................................... 8 1.2. Cơ sở dữ liệu PostgreSQL............................................................................... 19 1.2.1. Giới thiệu mã nguồn mở .......................................................................... 19 1.2.2.Giới thiệu sơ lƣợc về PostgreSQL ............................................................. 22 2.1.3. u điểm và nhƣợc điểm của PostgreSQL ................................................ 23 Chƣơng 2 : KHẢO SÁT THỰC TRẠNG , PHÂN TÍCH VÀ THIẾT KẾ HỆ THÔNG QUẢN LÝ.................................................................................................... 25 2.1. Khảo sát thực trạng ........................................................................................ 25 2.1.1. Tổng quan về hệ thống quản lý khách hàng ............................................ 25 2.1.2. Mục tiêu của hệ thống và những khó khăn ............................................. 29 2.1.3. Những yêu cầu đặt ra đối với hệ thống mới ............................................ 30 2.2. Phân tích chức năng của hệ thống ................................................................. 30 2.3. Xác định các tác nhân và ca sử dụng ............................................................. 34 2.3.1. Xác định các tác nhân và vai trò của các tác nhân ................................. 34 2.3.2. Ca sử dụng của hệ thống và sơ đồ Use Case............................................ 34 2.3.3. Xác định Object ........................................................................................ 37 2.3.4. Biểu đồ tƣơng tác ..................................................................................... 37 3.1. Hƣớng dẫn cài đặt hệ thống ........................................................................... 48 Phần 3. KẾT LUẬN................................................................................................... 58 1. Kết luận.............................................................................................................. 58 2. Hạn chế.............................................................................................................. 58 DANH MỤC CÁC KÝ HIỆU, CÁC TỪ VIẾT TẮT Từ viết tắt Ký hiệu Tiếng Việt Tiếng Anh CSDL Cơ sở dữ liệu Database CSS Tập tin định kiểu theo tầng Cascading Style Sheets CRM Quản lý quan hệ khách hàng Customer Relationship Management CNTT Công nghệ thông tin Information Technology ERP Kế hoạch nguồn doanh nghiệp Enterprise Resource Planning HTML Ngôn ngữ đánh dấu siêu văn bản HyperText Markup Language PHP Xử lý siêu văn bản HyperText Preprocessor TCPIP Giao thức mạng Transmission Control ProtocolInternet Protocol UC Trường hợp sử dụng Use Case DANH MỤC CÁC HÌNH VÀ BẢNG Hình 2. 1 Tổng quan hệ thống ................................................................................... 29 Bảng 2. 2 Chức năng đăng nhập ................................................................................ 30 Bảng 2. 3 Chức năng quản lý thành viên ................................................................... 30 Bảng 2.4 Chức năng quản lý nhóm khách hàng ......................................................... 31 Bảng 2.5 Chức năng quản lý khách hàng ................................................................... 31 Bảng 2.6 Chức năng gửi mail cho khách hàng .......................................................... 32 Bảng 2.7 Chức năng phân quyền ............................................................................... 32 Hình 2. 8 Quan hệ giữa Actor quản lý với các UC ..................................................... 33 Hình 2. 9 Quan hệ giữa Actor nhân viên với các UC ................................................. 34 Hình 2. 10 Quan hệ giữa UC và UC .......................................................................... 34 Hình 2.11. Xác định mối quan hệ giữa UC và UC ..................................................... 34 Hình 2. 12 Biểu đồ tuần tự đăng nhập ....................................................................... 36 Hình 2. 13 Biểu đồ tuần tự quản lý người dùng ......................................................... 37 Hình 2. 14 Biểu đồ tuần tự quản lý nhóm khách hàng ................................................ 37 Hình 2. 15 Biểu đồ tuần tự quản lý khách hàng ......................................................... 38 Hình 2. 16 Biểu đồ tuần tự quản lý mail marketing .................................................... 38 Hình 2. 17 Biểu đồ cộng tác đăng nhập ..................................................................... 39 Hình 2. 18 Biểu đồ cộng tác quản lý người dùng ....................................................... 39 Hình 2. 19 Biểu đồ cộng tác quản lý nhóm khách hàng.............................................. 40 Hình 2. 20 Biểu đồ cộng tác quản lý khách hàng ....................................................... 40 Hình 2. 21 Biểu đồ cộng tác quản lý mail marketing.................................................. 41 Hình 2.22. Biểu đồ lớp............................................................................................... 41 Bảng 2.23. Bảng người dùng ..................................................................................... 42 Bảng 2.24. Bảng nhóm khách hàng............................................................................ 43 Bảng 2.25. Bảng khách hàng ..................................................................................... 44 Bảng 2.26. Bảng Phòng ban ...................................................................................... 44 Bảng 2.27. Bảng Quyền ............................................................................................. 44 Bảng 2.28. Bảng Mối quan hệ ................................................................................... 44 Bảng 2.29. Bảng Chức năng ...................................................................................... 45 Bảng 2.30. Bảng Phân quyền chức năng theo người dùng ......................................... 45 Bảng 2.31. Bảng Phân quyền chức năng theo nhóm người dùng................................ 45 Bảng 2.32. Bảng Mail đã gửi ..................................................................................... 46 Bảng 2.33. Bảng Mail nhận ....................................................................................... 46 Bảng 2.34. Bảng Phân quyền chức năng theo nhóm người dùng................................ 46 Hình 3.1. Giao diện đăng nhập .................................................................................. 54 Hình 3.2. Giao diện Mail Marketing .......................................................................... 54 Hình 3.3. Giao diện form gửi Mail Marketing ........................................................... 55 Hình 3.4. Giao diện trang quản lý nhóm khách hàng ................................................. 55 Hình 3.5. Giao diện trang quản lý khách hàng .......................................................... 56 Hình 3.6. Giao diện trang quản lý người dùng........................................................... 56 1 Phần 1. MỞ ĐẦU 1.1. Lý do chọn đề tài Trong bối cảnh toàn cầu hoá nền kinh tế hiện nay, sự thành công hay thất bại của một doanh nghiệp không chỉ dựa vào nguồn lực vốn có mà còn phụ thuộc vào rất nhiều yếu tố từ môi trường bên ngoài như chính sách kinh tế vĩ mô của nhà nước, sự gia nhập hay rút khỏi ngành của các đối thủ cạnh tranh và đặc biệt là thái độ của khách hàng đối với sản phẩm, dịch vụ của doanh nghiệp. Nhưng làm thế nào để doanh nghiệp có thể quan sát, nắm bắt được hành vi, thái độ của khách hàng trong việc sử dụng sản phẩm hay dịch vụ của mình một cách thường xuyên và liên tục, từ đó giúp doanh nghiệp có những chính sách điều chỉnh kịp thời về sản phẩm, về qui trình cung cấp dịch vụ hay bổ sung những tiện ích nhằm tăng cao sự hài lòng của khách hàng, giảm thiểu sự phiền hà cho khách hàng. Việc ứng dụng quản trị quan hệ khách hàng sẽ tiết kiệm được rất nhiều chi phí cho doanh nghiệp. Ngày nay, nhiều doanh nghiệp đang sử dụng giải pháp quản trị quan hệ khách hàng với mục đích phân tích thói quen, nhu cầu của khách hàng trên cơ sở dữ liệu sẵn có, quản lý các chiến dịch tiếp thị và nâng cao hiệu quả kinh doanh. Xuất phát từ nhận thức đó, tôi đã mạnh dạn chọn đề tài “Nghiên cứu Node.js kết hợp Postgresql xây dựng phần mềm quản lý khách hàng và khai thác khách hàng tiềm năng cho doanh nghiệp” làm khóa luận tốt nghiệp. 1.2. Mục tiêu của đề tài Thông qua đặc điểm, thực trạng quản lý khách hàng tại Công ty Fixcom từ đó đề xuất một số giải pháp nhằm hoàn thiện công tác quản trị quan hệ khách hàng hoàn chỉnh. Xây dựng cơ sở dữ liệu khách hàng tốt nhất, phân loại khách hàng, xác định nhu cầu của khách hàng, xây dựng chiến lược quan hệ với từng nhóm khách hàng. Xây dựng các hoạt động CRM cho khách hàng nhằm tạo ra nhiều giá trị cho khách hàng, duy trì và gia tăng lòng trung thành của khách hàng, tiết kiệm chi phí, tăng lợi nhuận, tạo sự cạnh tranh bền vững cho doanh nghiệp. 2 1.3. Đối tƣợng và phạm vi nghiên cứu 1.3.1. Đối tƣợng nghiên cứu Tài liệu về Node.js, Postgresql, Bootstrap, Jquery. Phương pháp phân tích và thiết kế hệ thống theo hướng đối tượng. 1.3.2. Phạm vi nghiên cứu Phạm vi nghiên cứu khách hàng và doanh nghiệp 1.4. Phƣơng pháp nghiên cứu - Đề tài nghiên cứu sử dụng một số phương pháp sau: + Phương pháp nghiên cứu tài liệu: Nghiên cứu thực trạng, đọc các tài liệu, giáo trình liên quan tới phần mềm quản lý khách hàng để đưa ra giải pháp xây dựng phần mềm. + Phương pháp tổng kết kinh nghiệm: Qua việc nghiên cứu tài liệu, giáo trình rút ra kinh nghiệm để xây dựng phần mềm quản lý khách hàng + Phương pháp lấy ý kiến chuyên gia: Lấy ý kiến giảng viên trực tiếp hướng dẫn để hoàn thiện về mặt nội dung cũng như hình thức của đề tài 1.5. Lịch sử nghiên cứu Quá trinh nghiên cứu Node.js kết hợp Postgresql là một quá trình, chúng ta phải tìm hiểu kỹ về lý thuyết rồi sau đó rồi di chuyển qua thực hành để áp dụng vào trong phần mềm của mình. 1.6. Đóng góp của đề tài - Cung cấp kiến thức về thiết kế phần mềm. - Cung cấp một phần mềm quản lý và có thể nói đây là một phần mềm có tính ứng dụng cao và sẽ làm phong phú thêm cho kho phần mềm quản lý. - Với đề tài này tôi mong muốn cung cấp một tài liệu tham khảo cho các bạn sinh viên trong khoa c ũng như ngoài khoa khi tiếp cận và tìm hiểu về lĩnh vực nghiên cứu phần mềm quản lý và nhất là lĩnh vực mà tôi đang nghiên cứu. 3 1.7. Cấu trúc đề tài Gồm 3 chương: Chương 1: Cơ sở lý thuyết về Node.JS và CSDL PostgreSQL. Chương này trình bày tổng quan về công nghệ Node.JS và cơ sở dữ liệu PostgreSQL Chương 2: Khảo sát thực trạng, phân tích và thiết kế hệ thống quản lý Chương này trình bày về cơ sở lý thuyết hệ thống quản trị quan hệ khách hàng, đồng thời phân tích và thiết kế yêu cầu hệ thống cần có cho phù hợp với yêu cầu bài toán Chương 3: Xây dựng hệ thống Chương này hướng dẫn cài đặt hệ thống để vận hành 4 Phần 2. NỘI DUNG NGHIÊN CỨU CHƠNG 1: CƠ SỞ LÝ THUYẾT VỀ NODE.JS VÀ CSDL POSTGRESQL 1.1. Ngôn ngữ lập trình Node.JS 1.1.1. Giới thiệu về Node.JS Node.js là một hệ thống phần mềm được thiết kế để viết các ứng dụng internet có khả năng mở rộng, đặc biệt là máy chủ web. Chương trình được viết bằng JavaScript, sử dụng kỹ thật điều khiển theo sự kiện, nhậpxuất không đồng bộ để tối tiểu tổng chi phí và tối đại khả năng mở rộng. Node.js bao gồm có V8 JavaScript engine của Google, libUV, và vài thư viện khác. Node.js được tạo bởi Ryan Dahl từ năm 2009, và phát triển dưới sự bảo trợ của Joyent. Mục tiêu ban đầu của Dahl là làm cho trang web có khả năng push như trong một số ứng dụng web như Gmail. Sau khi thử với vài ngôn ngữ Dahl chọn Javascript vì một API NhậpXuất không đầy đủ. Điều này cho phép anh có thể định nghĩa một quy ước NhậpXuất điểu khiển theo sự kiện, non-blocking. Vài môi trường tương tự được viết trong các ngôn ngữ khác bao gồm Twisted cho Python, Perl Object Environment cho Perl, libevent cho C và EventMachine cho Ruby. Khác với hầu hết các chương trình Javascript, Node.js không chạy trên một trình duyệt mà chạy trên Server. Node.js sử dụng nhiều chi tiết kỹ thuật của CommonJS. Nó cung cấp một môi trường REPL cho kiểm thử tương tác. Node.js được InfoWorld bình chọn là “Công nghệ của năm” năm 2012. Để bắt đầu dùng Node.js, bạn phải hiểu sự khác nhau giữa Node.js với các môi trường truyền thống chạy trên server (server side) phổ biến như PHP, Python, Ruby, etc NodeJS là một mã nguồn được xây dựng dựa trên nền tảng Javascript V8 Engine, nó được sử dụng để xây dựng các ứng dụng web như các trang video clip, các forum và đặc biệt là trang mạng xã hội phạm vi hẹp. NodeJS là một mã nguồn mở được sử dụng rộng bởi hàng ngàn lập trình viên trên toàn thế giới. NodeJS có thể chạy trên nhiều nền tảng hệ điều hành khác nhau từ WIndow cho tới Linux, OS X nên đó cũng là một lợi thế. NodeJS cung cấp các thư viện phong phú ở dạng 5 Javascript Module khác nhau giúp đơn giản hóa việc lập trình và giảm thời gian ở mức thấp nhất. Các đặc tính của Node.js:  Không đồng bộ: Tất cả các API của NodeJS đều không đồng bộ ( none- blocking ), nó chủ yếu dựa trên nền của NodeJS Server và chờ đợi Server trả dữ liệu về. Việc di chuyển máy chủ đến các API tiếp theo sau khi gọi và cơ chế thông báo các sự kiện của Node.js giúp máy chủ để có được một phản ứng từ các cuộc gọi API trước (Realtime).  Chạy rất nhanh: NodeJS được xây dựng dựa vào nền tảng V8 Javascript Engine nên việc thực thi chương trình rất nhanh.  Đơn luồng nhưng khả năng mở rộng cao: Node.js sử dụng một mô hình luồng duy nhất với sự kiện lặp. cơ chế tổ chức sự kiện giúp các máy chủ để đáp ứng một cách không ngăn chặn và làm cho máy chủ cao khả năng mở rộng như trái ngược với các máy chủ truyền thống mà tạo đề hạn chế để xử lý yêu cầu. Node.js sử dụng một chương trình đơn luồng và các chương trình tương tự có thể cung cấp dịch vụ cho một số lượng lớn hơn nhiều so với yêu cầu máy chủ truyền thống như Apache HTTP Server.  Không đệm: NodeJS không đệm bất kì một dữ liệu nào và các ứng dụng này chủ yếu là đầu ra dữ liệu.  Có giấy phép: NodeJS đã được cấp giấy phép bởi MIT License. 1.1.1.1. Node.js chỉ là môi trƣờng Node.js chỉ là môi trường – điều đó có nghĩa là bạn phải tự làm tất cả. Đó không phải là một server http ngầm định hoặc là bất cứ server nào khác. Điều này có thể là hơi khó hiểu với người mới, nhưng thành công thực sự của nó là đưa lại một hiệu năng đáng kinh ngạc. Một scrips có thể điều phối mọi kết nối với các client. Điều này làm sử dụng ít tài nguyên đưa đến một hiệu quả rất cao. Và giờ ta xem chấm điểm benchmark cho hai đoạn code trên khi chạy trên hai môi trường khác nhau: 6 Number of iterations Node.js PHP 100 2.00 0.14 10 000 3.00 10.53 1 000 000 15.00 1119.24 10 000 000 143.00 10621.46 1 000 000 000 11118.00 1036272.19 Tôi thực hiện chạy hai đoạn code trên từ command line (console command) nên không có trễ thao tác thực thi. Tôi chạy từng thử nghiệm 10 lần và lấy kết quả trung bình. PHP nhanh hơn trong các lần chạy với số lượng nhỏ vòng lặp. Nhưng vấn đề thay đổi khi số lượng vòng lặp tăng lên, số lần xử lý tăng lên thì PHP chạy chậm hơn rất nhiều trong khi Node.js có tốc độ đáng kinh ngạc. Sau tất cả thao tác, PHP chậm hơn 93 so với Node.js. 1.1.1.2. Module Node.js sử dụng một kiến trúc mô-đun để đơn giản hóa việc tạo ra các ứng dụng phức tạp. Mô-đun giống như các thư viện trong C, hoặc các đơn vị trong Pascal. Mỗi module có chứa một tập hợp các chức năng liên quan đến "đối tượng" của các mô-đun. Ví dụ, các mô-đun http chứa các chức năng cụ thể cho HTTP. Node.js cung cấp một vài mô-đun cơ bản để giúp bạn truy cập các tập tin trên hệ thống tập tin, tạo ra trình điều khiển server HTTP và TCP UDP và thực hiện các chức năng hữu ích khác. Để gọi một module thật dễ dàng, chỉ cần gọi hàm require() như sau var http = require(„http‟); Hàm require() trả về tham chiếu đến các module quy định. Trong trường hợp của mã này, một tham chiếu đến các module http được lưu trữ trong biến http. Trong đoạn code trên, ta đã truyền tên của module vào trong hàm require(). Việc này chỉ định cho Node.js tìm trong thư mục nodemodules module tương ứng để thực hiện. Nếu Node không thấy module tương ứng trong thư mục thì nó sẽ tìm trên global module cache. Bạn cũng có thể chỉ định một module qua một file vật lý qua đường dẫn tương đối hay tuyệt đối như sau: var myModule = require(''''.myModule.js''''); 7 Module được đóng gói từng phần mã. Đoạn mã nằm trong một mô-đun chủ yếu là private - có nghĩa là các chức năng và biến được định nghĩa trong họ chỉ có thể truy cập từ bên trong của các mô-đun. Tuy nhiên, bạn có thể tiếp xúc với chức năng và hoặc các biến được sử dụng từ bên ngoài của mô-đun. Để làm như vậy, phải sử dụng các đối tượng export với các thuộc tính và phương thức của nó với từng phần mã mà bạn muốn gọi từ bên ngoài. Hãy xem xét các modul ví dụ sau đây: var PI = Math.PI; exports.area = function (r) { return PI r r; }; exports.circumference = function (r) { return 2 PI r; }; Trong ví dụ này PI là biến private và chỉ được sử dụng bên trong đoạn mã, trong đó có hai hàm area() và circumference() được từ khóa exports chỉ định thì sẽ có thể truy cập được từ bên ngoài. 1.1.1.3. Global Scope Node là một môi trường chạy javascrip với google V8 engine do đó hỗ trợ chạy được ở server side. Do đó bạn cũng nên tuân thủ các kinh nghiệm mà bạn có trong lập trình với các ứng dụng client-side. Ví dụ khi tạo các biến global trong Node không phải lúc nào cũng có thể tạo. Nhưng bạn có thể tạo dễ dàng các biến hoặc hàm global với cách bỏ từ khóa var trước các biến như sau: globalVariable = 1; globalFunction = function () { ... }; Nhưng các biến global nên tránh sử dụng, và xin nhớ cẩn thận rằng khi khai báo biến thì dùng từ khóa var để thực hiện. 1.1.1.4. Cộng đồng Cộng đồng phát triển Node.js chủ yếu tập trung ở hai nhóm google: nodejs và nodejs-dev, một kênh IRC là nodejs trên mạng freenode. Có một hội thảo về Node.js là NodeConf được tổ chức thường niên. Hiện nay Node.js được sử dụng bởi nhiều công ty trong đó có Linkedin, Microsoft, Yahoo và Walmart. 8 1.1.2. Installation Node.js Hiển nhiên là bạn phải học cách cài đặt node trước khi muốn viết và chạy bất cứ ứng dụng nào trên nền node. Cài đặt node thì rất là đơn giản, bạn là người sử dụng window hay linux thì trên website nodejs.org đều đã có những bộ cài tương ứng, bạn chỉ cần download về và cài đặt như thông thường. Với linux thì bạn sử dụng package manager, bật cửa sổ terminal và type: sudo apt-get update sudo apt-get install node Hoặc: sudo aptitude update sudo aptitude install node Bạn có thể cần thêm Node.js vào danh sách mã nguồn bằng lệnh sau: sudo echo deb sid main > etcapt sources.list.dsid.list Cần trọng khi cài sid packages trên những hệ thống cũ hơn có thể làm hệ thống của bạn bị ảnh hưởng, hay cẩn thận và remove etcaptsources.list.dsid.list sau khi bạn cài xong Node. 2. Installing New Modules Node.js có một ứng dụng quản lý packages, đó là Node Package Manager (NPM). Ứng dụng này tự động được cài đặt khi bạn cài Node.js và bạn dùng NPM để cài đặt các module khác. Để cài đặt một module, bạn mở cửa sổ command line của nodejs ra, vào đường dẫn tương ứng và nhập lệnh: npm install modulename Không phụ thuộc vào hệ điều hành bạn dùng, lệnh trên sẽ cài module mà bạn mong muốn chỉ định. 1.1.3. Các objects cơ bản. 1.1.3.1. Global Objects (đối tƣợng toàn cục). Như chúng ta đã biết, hệ thống mô-đun của node không khuyến khích việc sử dụng biến toàn cục, tuy nhiên node cung cấp một globals quan trọng để sử dụng. Việc đầu tiên và quan trọng nhất là tiến trình global, cho thấy nhiều thao tác như quá trình truyền tín hiệu, xuất cảnh, proccess id (pid), và nhiều hơn nữa. Globals khác, chẳng hạn như console obiects được cung cấp cho những người sử dụng để viết JavaScript cho trình duyệt web. 9 a. Console Các console obiects sử dụng một số lệnh được sử dụng để xuất thông tin để stdout hoặc stderr.Chúng là các lệnh như: console.log (data, ...) Phương pháp console obiects được sử dụng thường xuyên nhất là console.log(), mà chỉ đơn giản là viết cho stdout và gắn một nguồn cấp dữ liệu dòng =>Wahoo console.log({foo:''''bar''''}); => Object Object Còn một lệnh có chức năng như console.log() đó là console.info(). console.error (data, ...) Giống hệt nhau để console.log(), tuy nhiên viết cho stderr. console.error (''''kết nối cơ sở dữ liệu không thành công ''''); Còn một lệnh có chức năng như console.error()đó là console.warn(). b.Process Các process obj ect gắn liền với goodies. Trước tiên, chúng ta sẽ có một cái nhìn tại một số thuộc tính cung cấp thông tin về node process đó: process.version Chuỗi phiên bản nút, ví dụ: Console.log(„Version: ‟ + process.version); Version v0.8.16 process.execPath Đường dẫn đến thư mục thực thi chính của chương trình “usrlocalbinnode” process.platform Các nền tảng bạn đang sử dụng. Ví dụ “darwin” c.Buffer Cơ bản JavaScript là Unicode thân thiện, nhưng không phải với dữ liệu nhị phân. Khi giao tiếp với luồng TCP hoặc hệ thống tập tin, liệu nhị phân cần thiết để xử lý các luồng octet. Node cung cấp một số phương pháp cho việc khai thác, tạo và sử dụng luồng octet. Để xử lý các dữ liệu nhị phân, node cung cấp cho chúng ta với các đối tượng 10 toàn cục. Buffer là tương tự như một mảng các số nguyên, nhưng tương ứng với việc cấp phát bộ nhớ thô bên ngoài V8 heap. Buffer không thể được thay đổi kích cỡ. Có một số cách để xây dựng một trường hợp bộ đệm, và nhiều cách bạn có thể thao tác dữ liệu của nó. Chuyển đổi giữa Buffers và các đối tượng chuỗi JavaScript đòi hỏi một phương pháp mã hóa rõ ràng. Sự kiện (Event). Khái niệm về một "sự kiện" là rất quan trọng trong node, và được sử dụng rất nhiều trong suốt module chính của chương trình và module của bên thứ 3. Module sự kiện chính của Node cung cấp cho chúng ta với một hàm tạo, EventEmitter. a. EventEmitter Thông thường một đối tượng kế thừa từ EventEmỉtter, tuy nhiên ví dụ nhỏ dưới đây minh họa API. Đầu tiên chúng ta tạo ra một emitter, sau đó chúng ta có thể xác định bất kỳ số lượng callbacks sử dụng emitter.on() phương pháp, mà chấp nhận tên của các sự kiện và các đối tượng tùy ý thông qua như là dữ liệu. Khi emitter. emit () được gọi, chúng ta chỉ requried để truyền các tên sự kiện, theo sau bởi bất kỳ số lượng tham số (trong trường hợp này các chuỗi tên đầu tiên và cuối cùng). var EventEmitter = require(''''events'''').EventEmitter; var emitter = new EventEmitter; b. Kế thừa từ EventEmitter (Inheriting From EventEmitter). Được sử dụng phổ biến và thiết thực của EventEmỉtter là tính kế thừa từ nó. Điều này có nghĩa là chủng ta có thể giữ nguyên EventEmỉtter nguyên mẫu mà không bị ảnh hưởng trong khi sử dụng API của nó đối với phương tiện riêng của chúng ta. Để làm như vậy, chúng ta bắt đầu bằng cách xác định các hàm khởi tạo Trong, trong đó tất nhiên sẽ bark từ thời gian đến thời gian (còn được biết đến như một sự kiện). var EventEmitter = require(''''events'''').EventEmitter; function Dog(name) { this.name = name; Ở đây chúng ta kế thừa từ EventEmỉtter vì vậy chủng ta có thể sử dụng các phương thức mà nó cung cấp, chẳng hạn như EventEmitter.on() và EventEmitter.emit() . Nếu thuộc tính proto bị loại trừ, đừng lo lắng, chúng sẽ được trở lại này sau. Dog.prototype.proto = EventEmitter.prototype; 11 Bây giờ chúng ta có Dog được thành lập, chúng ta có thể tạo ra ... Simon Khi Simon bark, chúng ta có thể cho stdout biết bằng cách gọi console.log() với callback. Callback chính nó được gọi là trong ngữ cảnh của các đối tượng var simon = new Dog(''''simon''''); simon.on(''''bark'''', function(){ console.log(this.name '''' barked''''); } ; Bark hai lần mỗi giây: setlnterval(function () { simon.emit(''''bark‟); }, 500); c. Loại bỏ các sự kiện lắng nghe (Removing Event Listeners). Như chúng ta đã biết, lắng nghe sự kiện chỉ đơn giản là hàm đó được gọi khi chúng ta emit () một sự kiện. Chúng ta có thể loại bỏ những người nghe bằng cách dùng lệnh removeListener (type, callback), mặc dù điều này không được dùng thường xuyên. Trong ví dụ dưới đây, chúng ta phát ra thông báo "foo bar" mỗi 300 mill giây, trong đó có một cuộc gọi lại của console.log() . Sau 1000 mill giây, chúng ta gọi removeListener () với các đối số tương tự mà tôi đã thông qua on () ban đầu. Chúng ta cũng có thể sử dụng removeAiiListeners (type), trong đó loại bỏ tất cả các người nghe được đăng ký type nhất định. var EventEmitter = require(1 events 1).EventEmitter; var emitter = new EventEmitter; emitter.on(''''message'''', console.log); setlnterval(function 0{ emitter.emit(''''message'''', ''''foo bar''''); }, 300); setTimeout(function 0{ emitter.removeListener(''''message'''', console.log); }, 1000); 12 1.1.3.3. Luồng (Streams). Streams là một khái niệm quan trọng trong nút. Các luồng API là một cách duy nhất để xử lý luồng giống như dữ liệu. Ví dụ, dữ liệu có thể được xem trực tiếp một tập tin, trực tiếp vào một socket để đáp ứng một HTTP request, hoặc trực tiếp từ một nguồn chỉ cho đọc như stdin. Để bây giờ, chúng ta sẽ tập trung vào các API, để lại các chi tiết cụ thể luồng chương sau. a. Readable Streams Readable Streams được xem như một HTTP request kế thừa từ EventEmitter để lộ dữ liệu đến qua các sự kiện. Việc đầu tiên của những sự kiện này là sự kiện dữ liệu, là một đoạn tùy ý của các dữ liệu được truyền đi để xử lý sự kiện như là một trường hợp đệm (Buffer instance ). req.on(„data‟, function(buf) { Làm gì đó vói Buffer }) ; Một sự kiện quan trọng khác là kết thúc, đại diện cho sự kết thúc của dữ liệu sự kiện. Ví dụ, đây là một HTTP echo server, chỉ đơn giản là "simply" các request body data thông qua các response. Vì vậy, nếu chúng ta POST "hello world", response của chúng ta sẽ là " hello world ". var http = require(„http‟); http.createServer(function(req, res){ res.writeHead(200); req.on(„data‟, function(data) { res.write(data); }); req.on(„end‟, function(){ res.end(); }) ; }), listen (3000); Module sys thực sự có một chức năng được thiết kế đặc biệt cho hành động "simply" này, aptly tên sỵs. pump (). Nó chấp nhận một luồng đọc như là đối số đầu tiên, và viết dòng thứ hai. 13 var http = require(„ http''''); sys = require(„sys‟); http.createServer(function(req, res){ res.writeHead(200); sys.pump(req, res); }).listen(3000); stream.readable Giá tri boolean được mặc định là true, nhưng sẽ thành false sau khi xảy ra một lỗi, luồng đến một ''''kết thúc'''', hoặc destroy () được gọi. stream.setEncoding (encoding) Làm cho ''''data'''' sự kiện phát ra một chuỗi thay vì một bộ đệm. encoding có thể là „utf 8‟ Mặc định là „ utf 8‟. Như chúng ta biết, chúng ta có thể gọi toString () trên một bộ đệm để trả về một chuỗi đại diện của dữ liệu nhị phân. Tuơng tự như vậy, chúng ta có thể gọi setEncoding () trên một luồng, sau đó dữ liệu sự kiện sẽ phát ra chuỗi. req.setEncoding(„utf8‟); req.on(„ data‟, function(str){ Làm gì đó với string }); stream.pause() Vấn đề là một tín hiệu tư vấn cho các lớp giao tiếp cơ bản, yêu cầu không có thêm dữ liệu được gửi cho đến khi resume () được gọi. Lưu ý ràng, do tính chất tư vấn, luồng nhất định sẽ không được tạm dừng ngay lập tức, và do đó, sự kiện ''''data'''' có thể được phát ra cho một khoảng thời gian không xác định, ngay cả sau khi pause () được gọi. stream.resume() Tiếp tục lại sự kiện ''''data'''' sau khi pause (). stream.destroy() Đóng tập tin mô tả cơ bản. Stream là không còn có thể ghi và cũng không thể đọc được. 14 Các dòng sẽ không phát ra bất kỳ chi tiết ''''data'''', hoặc sự kiện kết thúc''''. Bất kỳ dữ liệu ghi xếp hàng sẽ không được gửi đi. Các luồng được tải sự kiện ''''close'''' khi nguồn lực của mình đã được xử lý. stream.pipe (destination, options) Đây là một phương pháp Stream.prototype có sẵn trên tất cả các luồng. Kết nối này đọc dòng để WriteStream điểm đến. Dừ liệu đến trên luồng này được ghi đến đích. Các luồng đích và nguồn được giữ đồng bộ bằng cách tạm dừng và khôi phục khi cần thiết. Chức năng này trả về các luồng đích. Theo mặc định end () được gọi là điểm đến khi đi qua luồng nguồn phát ra cuối cùng, do đó, điểm đến mà không thể ghi được, {end: false} là tùy chọn để giữ cho luồng đích mở. Điều này giữ process. stdout mở ràng "Goodbye" có thể được viết ở cuối, process.stdin.resume(); process.stdin.pipe (process.stdout, (end: false}); process.stdin.on ("end", function(){ process.stdout.write ("Goodbye \ n"); }); b. Writable Stream. Một lớp cơ sở cho việc tạo ra các Writable Stream. Tương tự như Readable Stream, bạn có có thể tạo ra các lớp con bằng cách ghi đè không đồng bộ khi sử dụng câu lệnh write(chunk, cb). stream, writable Giá trị boolean được mặc định đó là true, nhưng sẽ thành false sau khi lỗi xảy ra hoặc end() destroy() được gọi. stream.Write (string, encoding) Viết chuỗi với encoding cho luồng. Trả về true nếu chuỗi đã được bỏ vào bộ đệm kernel. Trả về false để cho biết rằng bộ đệm kernel đã đầy, và dữ liệu sẽ được gửi đi trong tương lai. Sự kiện ''''drain'''' sẽ cho biết khi nào bộ đệm kernel là rỗng một lần nữa. Việc mã hóa mặc định ''''utf8''''. 15 stream.Write (buffer) Tương tự như trên, ngoại trừ với một bộ đệm thô. stream.end0 Kết thúc dòng với EOF hoặc FIN. Cuộc gọi này sẽ cho phép hàng đợi ghi dữ liệu được gửi trước khi đóng luồng. stream.end (string, encoding) Gửi chuỗi với mã hóa nhất định và chấm dứt dòng với EOF hoặc FIN. Điều này rất hữu ích để giảm số lượng các gói tin gửi đi. stream.end (buffer) Tương tự như trên, nhưng với một bộ đệm. stream.destroy() Đóng mô tả tập tin cơ bản. Stream là không còn có thể ghi và cũng không thể đọc được, các luồng sẽ không phát ra bất kỳ chi tiết ''''data'''', hoặc sự kiện ''''kết thúc''''. Bất kỳ hàng đợi dữ liệu ghi sẽ không được gửi đi. các luồng được tải sự kiện ''''close'''' khi tài nguyên của mình đã được xử lý. stream.destroySoon() Sau khi ghi hàng đợi được giải phóng, đóng tập tin mô tả. destroySoon () vẫn có thể hủy ngay lập tức, miễn là không có dữ liệu còn lại trong hàng đợi để viết. 1.1.3.4.File System Để làm việc với hệ thống tập tin, node cung cấp module "fs". Các lệnh thực thi các hoạt động POSIX, và hầu hết các phương pháp làm việc đồng bộ hoặc không đồng bộ. Chủng ta sẽ xem xét làm thế nào để sử dụng cả hai, sau đó thiết lập lựa chọn tốt hơn. a. Làm việc với tập tin hệ thống. Cho phép bắt đầu với một ví dụ cơ bản làm việc với tập tin hệ thống. Ví dụ này tạo một thư mục, tạo ra một tập tin bên trong nó, sau đó viết nội dung của tập tin đến console: var fs = require(''''fs''''); fs.mkdir(''''.helloDir'''', 0777, function (err) { 16 if (err) throw err; fs.writeFile(''''.helloDirmessage.txt'''', ''''Hello Node‟ , function (err) { if (err) throw err; console.log(„file created with contents:‟); fs.readFile(''''.helloDirmessage.txt'''',''''UTF-8'''' ,function (err, data) { if (err) throw err; console.log(data); }); }) ; }) ; Rõ ràng trong ví dụ trên, ứng với mỗi callback đều đặt trong callback trước đây được gọi là callbacks chainable. Mô hình này cần được theo sau khi sử dụng phương pháp không đồng bộ, không có đảm bảo rằng các hoạt động sẽ được hoàn thành theo thứ tự họ đang tạo ra. Điều này có thể dẫn đến hành vi không thể đoán trước. Ví dụ có thể được viết lại để sử dụng một cách tiếp cận đồng bộ: fs.mkdirSync(''''.helloDirSync'''',0777); fs.writeFileSync(''''.helloDirSyncmessage.txt'''', ''''Hello Node‟); var data = fs.readFileSync(„.helloDirSyncmessage.txt‟,‟UTF-8‟ ); console.log(''''file created with contents:''''); console.log(data); Nó là tốt hơn để sử dụng phương pháp không đồng bộ trên các máy chủ với một tải cao, như các phương pháp đồng bộ sẽ làm cho toàn bộ quá trình để ngăn chặn và chờ cho các hoạt động để hoàn thành. Điều này sẽ ngăn chặn bất kỳ kết nối đến hoặc các sự kiện khác. 17 b. File thông tin Các đối tượng fs.stats có chứa thông tin về một tập tin hoặc thư mục cụ thể. Điều này có thể được sử dựng để xác định loại đối tượng mà chúng ta đang làm việc. Trong ví dụ này, chúng ta đang nhận được tất cả các đối tượng tập tin trong một thư mục và hiển thị cho dù chúng là một tập tin hoặc một đối tượng thư mục. c. Xem các tập tin. Phương pháp fs.watchfile theo dõi một tập tin và thay đổi một sự kiện bất cứ khi nào tập tin được thay đổi. var fs = require(„fs‟); fs.watchFile(''''.testFile.txt'''', function (curr, prev) { console.log(„ the current mtime is: „ + curr.mtime); console.log(''''the previous mtime was: „ + prev.mtime); }); fs.writeFile(''''.testFile.txt'''', "changed", function (err) { if (err) throw err; console.log("file write complete"); }) ; Một tập tin cũng có thể được unwatched bằng cách sử dụng phương pháp gọi fs.unwatchFile. Cách này chỉ nên sử dụng một lần khi tập tin không còn cần được giám sát. 1.1.3.5.HTTP. Để sử dụng HTTP server và client phải dùng lệnh require („http‟). Các giao diện HTTP trong Node được thiết kế để hỗ trợ nhiều tính năn...

Trang 1

UBND TỈNH QUẢNG NAM

TRƯỜNG ĐẠI HỌC QUẢNG NAM KHOA CÔNG NGHỆ THÔNG TIN

- -

VÕ VĂN THẢO

NGHIÊN CỨU NODE.JS KẾT HỢP POSTGRESQL XÂY DỰNG PHẦN MỀM QUẢN LÝ KHÁCH HÀNG VÀ KHAI THÁC KHÁCH HÀNG TIỀM NĂNG CHO

DOANH NGHIỆP

KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC

Quảng Nam, tháng 4 năm 2019

Trang 2

UBND TỈNH QUẢNG NAM

TRƯỜNG ĐẠI HỌC QUẢNG NAM KHOA CÔNG NGHỆ THÔNG TIN

KHÓA 2015 – 2019 Cán bộ hướng dẫn

ThS TRẦN THỊ DIỆU HIỀN

Quảng Nam, tháng 4 năm 2019

Trang 3

LỜI CÁM ƠN

Để có được điều kiện thực hiện Khóa luận tốt nghiệp cũng như hoàn thành chương trình học 4 năm tại trường Đại học Quảng Nam, em đã nhận được những sự chỉ dạy tận tình với những kinh nghiệm quý báu từ quý thầy cô trong trường Đại học Quảng Nam nói chung và trong khoa Công nghệ thông tin nói riêng

Em xin được gửi lời cảm ơn chân thành nhất đến:

- Ban giám hiệu cùng quý thầy cô trường Đai học Quảng Nam đã tạo cho em một môi trường học tập tích cực và vui vẻ

- Quý thầy cô trong khoa công nghệ thông tin đã truyền dạy cho em những kiến thức chuyên môn quý báu sẽ là hành trang trong cuộc sống và công việc sau này - Cô Th.S Trần Thị Diệu Hiền – Giảng viên khoa Công nghệ thông tin đã tận tình hướng dẫn, chỉ bảo, giúp đỡ em trong suốt quá trình thực hiện khóa luận

- Gia đình và bạn bè đã luôn động viên và là chỗ dựa tinh thần vững chắc trong suốt thời gian qua, đã tạo cho em niềm tin, động lực để vượt qua những khó khăn

trong quá trình thực hiện khóa luận

Trang 4

MỤC LỤC

Phần 1 MỞ ĐẦU 1

1.1.Lý do chọn đề tài 1

1.2 Mục tiêu của đề tài 1

1.3 Đối tượng và phạm vi nghiên cứu 2

1.3.1 Đối tượng nghiên cứu 2

Phần 2 NỘI DUNG NGHIÊN CỨU 4

CHƯƠNG 1: CƠ SỞ LÝ THUYẾT VỀ NODE.JS VÀ CSDL POSTGRESQL 4

1.1.Ngôn ngữ lập trình Node.JS 4

1.1.1.Giới thiệu về Node.JS 4

1.1.2 Installation Node.js 8

1.1.3 Các objects cơ bản 8

1.2 Cơ sở dữ liệu PostgreSQL 19

1.2.1 Giới thiệu mã nguồn mở 19

1.2.2.Giới thiệu sơ lược về PostgreSQL 22

2.1.3 Ưu điểm và nhược điểm của PostgreSQL 23

Chương 2 : KHẢO SÁT THỰC TRẠNG , PHÂN TÍCH VÀ THIẾT KẾ HỆ THÔNG QUẢN LÝ 25

2.1 Khảo sát thực trạng 25

2.1.1 Tổng quan về hệ thống quản lý khách hàng 25

2.1.2 Mục tiêu của hệ thống và những khó khăn 29

2.1.3 Những yêu cầu đặt ra đối với hệ thống mới 30

2.2 Phân tích chức năng của hệ thống 30

2.3 Xác định các tác nhân và ca sử dụng 34

2.3.1 Xác định các tác nhân và vai trò của các tác nhân 34

2.3.2 Ca sử dụng của hệ thống và sơ đồ Use Case 34

Trang 5

DANH MỤC CÁC KÝ HIỆU, CÁC TỪ VIẾT TẮT

Từ viết tắt/ Ký

CSS Tập tin định kiểu theo tầng Cascading Style Sheets CRM Quản lý quan hệ khách hàng Customer Relationship

Management

CNTT Công nghệ thông tin Information Technology ERP Kế hoạch nguồn doanh nghiệp Enterprise Resource Planning HTML Ngôn ngữ đánh dấu siêu văn

Trang 6

Bảng 2.6 Chức năng gửi mail cho khách hàng 32

Bảng 2.7 Chức năng phân quyền 32

Hình 2 8 Quan hệ giữa Actor quản lý với các UC 33

Hình 2 9 Quan hệ giữa Actor nhân viên với các UC 34

Hình 2 10 Quan hệ giữa UC và UC 34

Hình 2.11 Xác định mối quan hệ giữa UC và UC 34

Hình 2 12 Biểu đồ tuần tự đăng nhập 36

Hình 2 13 Biểu đồ tuần tự quản lý người dùng 37

Hình 2 14 Biểu đồ tuần tự quản lý nhóm khách hàng 37

Hình 2 15 Biểu đồ tuần tự quản lý khách hàng 38

Hình 2 16 Biểu đồ tuần tự quản lý mail marketing 38

Bảng 2.30 Bảng Phân quyền chức năng theo người dùng 45

Bảng 2.31 Bảng Phân quyền chức năng theo nhóm người dùng 45

Trang 7

Bảng 2.32 Bảng Mail đã gửi 46

Bảng 2.33 Bảng Mail nhận 46

Bảng 2.34 Bảng Phân quyền chức năng theo nhóm người dùng 46

Hình 3.1 Giao diện đăng nhập 54

Hình 3.2 Giao diện Mail Marketing 54

Hình 3.3 Giao diện form gửi Mail Marketing 55

Hình 3.4 Giao diện trang quản lý nhóm khách hàng 55

Hình 3.5 Giao diện trang quản lý khách hàng 56

Hình 3.6 Giao diện trang quản lý người dùng 56

Trang 8

Phần 1 MỞ ĐẦU

1.1 Lý do chọn đề tài

Trong bối cảnh toàn cầu hoá nền kinh tế hiện nay, sự thành công hay thất bại của một doanh nghiệp không chỉ dựa vào nguồn lực vốn có mà còn phụ thuộc vào rất nhiều yếu tố từ môi trường bên ngoài như chính sách kinh tế vĩ mô của nhà nước, sự gia nhập hay rút khỏi ngành của các đối thủ cạnh tranh và đặc biệt là thái độ của khách hàng đối với sản phẩm, dịch vụ của doanh nghiệp Nhưng làm thế nào để doanh nghiệp có thể quan sát, nắm bắt được hành vi, thái độ của khách hàng trong việc sử dụng sản phẩm hay dịch vụ của mình một cách thường xuyên và liên tục, từ đó giúp doanh nghiệp có những chính sách điều chỉnh kịp thời về sản phẩm, về qui trình cung cấp dịch vụ hay bổ sung những tiện ích nhằm tăng cao sự hài lòng của khách hàng, giảm thiểu sự phiền hà cho khách hàng Việc ứng dụng quản trị quan hệ khách hàng sẽ tiết kiệm được rất nhiều chi phí cho doanh nghiệp Ngày nay, nhiều doanh nghiệp đang sử dụng giải pháp quản trị quan hệ khách hàng với mục đích phân tích thói quen, nhu cầu của khách hàng trên cơ sở dữ liệu sẵn có, quản lý các chiến dịch tiếp thị và nâng cao hiệu quả kinh doanh Xuất phát từ nhận thức đó, tôi đã mạnh dạn chọn đề tài “Nghiên cứu Node.js kết hợp Postgresql xây dựng phần mềm quản lý khách hàng và khai thác khách hàng tiềm năng cho doanh nghiệp” làm khóa luận tốt nghiệp

1.2 Mục tiêu của đề tài

Thông qua đặc điểm, thực trạng quản lý khách hàng tại Công ty Fixcom từ đó đề xuất một số giải pháp nhằm hoàn thiện công tác quản trị quan hệ khách hàng hoàn chỉnh

Xây dựng cơ sở dữ liệu khách hàng tốt nhất, phân loại khách hàng, xác định nhu cầu của khách hàng, xây dựng chiến lược quan hệ với từng nhóm khách hàng Xây dựng các hoạt động CRM cho khách hàng nhằm tạo ra nhiều giá trị cho khách hàng, duy trì và gia tăng lòng trung thành của khách hàng, tiết kiệm chi phí, tăng lợi nhuận, tạo sự cạnh tranh bền vững cho doanh nghiệp

Trang 9

1.3 Đối tượng và phạm vi nghiên cứu 1.3.1 Đối tượng nghiên cứu

Tài liệu về Node.js, Postgresql, Bootstrap, Jquery

Phương pháp phân tích và thiết kế hệ thống theo hướng đối tượng

1.3.2 Phạm vi nghiên cứu

Phạm vi nghiên cứu khách hàng và doanh nghiệp

1.4 Phương pháp nghiên cứu

- Đề tài nghiên cứu sử dụng một số phương pháp sau:

+ Phương pháp nghiên cứu tài liệu: Nghiên cứu thực trạng, đọc các tài liệu, giáo trình liên quan tới phần mềm quản lý khách hàng để đưa ra giải pháp xây dựng phần mềm

+ Phương pháp tổng kết kinh nghiệm: Qua việc nghiên cứu tài liệu, giáo trình rút ra kinh nghiệm để xây dựng phần mềm quản lý khách hàng

+ Phương pháp lấy ý kiến chuyên gia: Lấy ý kiến giảng viên trực tiếp hướng dẫn để hoàn thiện về mặt nội dung cũng như hình thức của đề tài

1.5 Lịch sử nghiên cứu

Quá trinh nghiên cứu Node.js kết hợp Postgresql là một quá trình, chúng ta phải tìm hiểu kỹ về lý thuyết rồi sau đó rồi di chuyển qua thực hành để áp dụng vào trong phần mềm của mình

1.6 Đóng góp của đề tài

- Cung cấp kiến thức về thiết kế phần mềm

- Cung cấp một phần mềm quản lý và có thể nói đây là một phần mềm có tính ứng dụng cao và sẽ làm phong phú thêm cho kho phần mềm quản lý

- Với đề tài này tôi mong muốn cung cấp một tài liệu tham khảo cho các bạn sinh viên trong khoa cũng như ngoài khoa khi tiếp cận và tìm hiểu về lĩnh vực nghiên cứu phần mềm quản lý và nhất là lĩnh vực mà tôi đang nghiên cứu

Trang 10

1.7 Cấu trúc đề tài

Gồm 3 chương:

Chương 1: Cơ sở lý thuyết về Node.JS và CSDL PostgreSQL

Chương này trình bày tổng quan về công nghệ Node.JS và cơ sở dữ liệu PostgreSQL

Chương 2: Khảo sát thực trạng, phân tích và thiết kế hệ thống quản lý

Chương này trình bày về cơ sở lý thuyết hệ thống quản trị quan hệ khách hàng, đồng thời phân tích và thiết kế yêu cầu hệ thống cần có cho phù hợp với yêu cầu bài toán

Chương 3: Xây dựng hệ thống

Chương này hướng dẫn cài đặt hệ thống để vận hành

Trang 11

Phần 2 NỘI DUNG NGHIÊN CỨU

CHƯƠNG 1: CƠ SỞ LÝ THUYẾT VỀ NODE.JS VÀ CSDL POSTGRESQL

1.1 Ngôn ngữ lập trình Node.JS

1.1.1 Giới thiệu về Node.JS

Node.js là một hệ thống phần mềm được thiết kế để viết các ứng dụng internet có khả năng mở rộng, đặc biệt là máy chủ web Chương trình được viết bằng JavaScript, sử dụng kỹ thật điều khiển theo sự kiện, nhập/xuất không đồng bộ để tối tiểu tổng chi phí và tối đại khả năng mở rộng Node.js bao gồm có V8 JavaScript engine của Google, libUV, và vài thư viện khác

Node.js được tạo bởi Ryan Dahl từ năm 2009, và phát triển dưới sự bảo trợ của Joyent

Mục tiêu ban đầu của Dahl là làm cho trang web có khả năng push như trong một số ứng dụng web như Gmail Sau khi thử với vài ngôn ngữ Dahl chọn Javascript vì một API Nhập/Xuất không đầy đủ Điều này cho phép anh có thể định nghĩa một quy ước Nhập/Xuất điểu khiển theo sự kiện, non-blocking

Vài môi trường tương tự được viết trong các ngôn ngữ khác bao gồm Twisted cho Python, Perl Object Environment cho Perl, libevent cho C và EventMachine cho Ruby Khác với hầu hết các chương trình Javascript, Node.js không chạy trên một trình duyệt mà chạy trên Server Node.js sử dụng nhiều chi tiết kỹ thuật của CommonJS Nó cung cấp một môi trường REPL cho kiểm thử tương tác

Node.js được InfoWorld bình chọn là “Công nghệ của năm” năm 2012 Để bắt đầu dùng Node.js, bạn phải hiểu sự khác nhau giữa Node.js với các môi trường truyền thống chạy trên server (server side) phổ biến như PHP, Python,

Ruby, etc

NodeJS là một mã nguồn được xây dựng dựa trên nền tảng Javascript V8 Engine, nó được sử dụng để xây dựng các ứng dụng web như các trang video clip, các forum và đặc biệt là trang mạng xã hội phạm vi hẹp NodeJS là một mã nguồn mở được sử dụng rộng bởi hàng ngàn lập trình viên trên toàn thế giới NodeJS có thể chạy trên nhiều nền tảng hệ điều hành khác nhau từ WIndow cho tới Linux, OS X nên đó cũng là một lợi thế NodeJS cung cấp các thư viện phong phú ở dạng

Trang 12

Javascript Module khác nhau giúp đơn giản hóa việc lập trình và giảm thời gian ở mức thấp nhất

 Chạy rất nhanh: NodeJS được xây dựng dựa vào nền tảng V8 Javascript Engine nên việc thực thi chương trình rất nhanh

 Đơn luồng nhưng khả năng mở rộng cao: Node.js sử dụng một mô hình luồng duy nhất với sự kiện lặp cơ chế tổ chức sự kiện giúp các máy chủ để đáp ứng một cách không ngăn chặn và làm cho máy chủ cao khả năng mở rộng như trái ngược với các máy chủ truyền thống mà tạo đề hạn chế để xử lý yêu cầu Node.js sử dụng một chương trình đơn luồng và các chương trình tương tự có thể cung cấp dịch vụ cho một số lượng lớn hơn nhiều so với yêu cầu máy chủ truyền thống như Apache HTTP Server

 Không đệm: NodeJS không đệm bất kì một dữ liệu nào và các ứng dụng này chủ yếu là đầu ra dữ liệu

 Có giấy phép: NodeJS đã được cấp giấy phép bởi MIT License

1.1.1.1 Node.js chỉ là môi trường

Node.js chỉ là môi trường – điều đó có nghĩa là bạn phải tự làm tất cả Đó không phải là một server http ngầm định hoặc là bất cứ server nào khác Điều này có thể là hơi khó hiểu với người mới, nhưng thành công thực sự của nó là đưa lại một hiệu năng đáng kinh ngạc Một scrips có thể điều phối mọi kết nối với các client Điều này làm sử dụng ít tài nguyên đưa đến một hiệu quả rất cao

Và giờ ta xem chấm điểm benchmark cho hai đoạn code trên khi chạy trên hai môi trường khác nhau:

Trang 13

Number of iterations Node.js PHP

1.1.1.2 Module

Node.js sử dụng một kiến trúc mô-đun để đơn giản hóa việc tạo ra các ứng dụng phức tạp Mô-đun giống như các thư viện trong C, hoặc các đơn vị trong Pascal Mỗi module có chứa một tập hợp các chức năng liên quan đến "đối tượng" của các mô-đun Ví dụ, các mô-đun http chứa các chức năng cụ thể cho HTTP Node.js cung cấp một vài mô-đun cơ bản để giúp bạn truy cập các tập tin trên hệ thống tập tin, tạo ra trình điều khiển server HTTP và TCP / UDP và thực hiện các chức năng hữu ích khác

Để gọi một module thật dễ dàng, chỉ cần gọi hàm require() như sau var http = require(„http‟);

Hàm require() trả về tham chiếu đến các module quy định Trong trường hợp của mã này, một tham chiếu đến các module http được lưu trữ trong biến http Trong đoạn code trên, ta đã truyền tên của module vào trong hàm require() Việc này chỉ định cho Node.js tìm trong thư mục node_modules module tương ứng để thực hiện Nếu Node không thấy module tương ứng trong thư mục thì nó sẽ tìm trên global module cache Bạn cũng có thể chỉ định một module qua một file vật lý qua đường dẫn tương đối hay tuyệt đối như sau:

var myModule = require('./myModule.js');

Trang 14

Module được đóng gói từng phần mã Đoạn mã nằm trong một mô-đun chủ yếu là private - có nghĩa là các chức năng và biến được định nghĩa trong họ chỉ có thể truy cập từ bên trong của các mô-đun Tuy nhiên, bạn có thể tiếp xúc với chức năng và / hoặc các biến được sử dụng từ bên ngoài của mô-đun Để làm như vậy, phải sử dụng các đối tượng export với các thuộc tính và phương thức của nó với từng phần mã mà bạn muốn gọi từ bên ngoài Hãy xem xét các modul ví dụ sau đây:

var PI = Math.PI;

exports.area = function (r) { return PI * r * r;

};

exports.circumference = function (r) { return 2 * PI * r;

};

Trong ví dụ này PI là biến private và chỉ được sử dụng bên trong đoạn mã, trong đó có hai hàm area() và circumference() được từ khóa exports chỉ định thì sẽ có thể truy cập được từ bên ngoài

1.1.1.3 Global Scope

Node là một môi trường chạy javascrip với google V8 engine do đó hỗ trợ chạy được ở server side Do đó bạn cũng nên tuân thủ các kinh nghiệm mà bạn có trong lập trình với các ứng dụng client-side Ví dụ khi tạo các biến global trong Node không phải lúc nào cũng có thể tạo Nhưng bạn có thể tạo dễ dàng các biến hoặc hàm global với cách bỏ từ khóa var trước các biến như sau:

Trang 15

1.1.2 Installation Node.js

Hiển nhiên là bạn phải học cách cài đặt node trước khi muốn viết và chạy bất cứ ứng dụng nào trên nền node Cài đặt node thì rất là đơn giản, bạn là người sử dụng window hay linux thì trên website nodejs.org đều đã có những bộ cài tương ứng, bạn chỉ cần download về và cài đặt như thông thường

Với linux thì bạn sử dụng package manager, bật cửa sổ terminal và type: sudo apt-get update

sudo apt-get install node Hoặc:

sudo aptitude update sudo aptitude install node

Bạn có thể cần thêm Node.js vào danh sách mã nguồn bằng lệnh sau: sudo echo deb sid main > /etc/apt/ sources.list.d/sid.list

Cần trọng khi cài sid packages trên những hệ thống cũ hơn có thể làm hệ thống của bạn bị ảnh hưởng, hay cẩn thận và remove /etc/apt/sources.list.d/sid.list sau khi bạn cài xong Node 2 Installing New Modules Node.js có một ứng dụng quản lý packages, đó là Node Package Manager (NPM) Ứng dụng này tự động được cài đặt khi bạn cài Node.js và bạn dùng NPM để cài đặt các module khác Để cài đặt một module, bạn mở cửa sổ command line của nodejs ra, vào đường dẫn tương ứng và nhập lệnh:

npm install module_name

Không phụ thuộc vào hệ điều hành bạn dùng, lệnh trên sẽ cài module mà bạn mong muốn chỉ định

1.1.3 Các objects cơ bản

1.1.3.1 Global Objects (đối tƣợng toàn cục)

Như chúng ta đã biết, hệ thống mô-đun của node không khuyến khích việc sử dụng biến toàn cục, tuy nhiên node cung cấp một globals quan trọng để sử dụng Việc đầu tiên và quan trọng nhất là tiến trình global, cho thấy nhiều thao tác như quá trình truyền tín hiệu, xuất cảnh, proccess id (pid), và nhiều hơn nữa Globals khác, chẳng hạn như console obiects được cung cấp cho những người sử dụng để viết JavaScript cho trình duyệt web

Trang 16

//=>Wahoo

console.log({foo:'bar'}); // => [Object Object]

Còn một lệnh có chức năng như console.log() đó là console.info()

Để xử lý các dữ liệu nhị phân, node cung cấp cho chúng ta với các đối tượng

Trang 17

toàn cục Buffer là tương tự như một mảng các số nguyên, nhưng tương ứng với việc cấp phát bộ nhớ thô bên ngoài V8 heap Buffer không thể được thay đổi kích cỡ Có một số cách để xây dựng một trường hợp bộ đệm, và nhiều cách bạn có thể thao tác dữ liệu của nó

Chuyển đổi giữa Buffers và các đối tượng chuỗi JavaScript đòi hỏi một phương pháp mã hóa rõ ràng Sự kiện (Event)

Khái niệm về một "sự kiện" là rất quan trọng trong node, và được sử dụng rất nhiều trong suốt module chính của chương trình và module của bên thứ 3 Module

sự kiện chính của Node cung cấp cho chúng ta với một hàm tạo, EventEmitter

a EventEmitter

Thông thường một đối tượng kế thừa từ EventEmỉtter, tuy nhiên ví dụ nhỏ dưới

đây minh họa API Đầu tiên chúng ta tạo ra một emitter, sau đó chúng ta có thể xác định bất kỳ số lượng callbacks sử dụng emitter.on() phương pháp, mà chấp nhận tên của các sự kiện và các đối tượng tùy ý thông qua như là dữ liệu Khi emitter emit () được gọi, chúng ta chỉ requried để truyền các tên sự kiện, theo sau bởi bất kỳ số lượng tham số (trong trường hợp này các chuỗi tên đầu tiên và cuối cùng)

var EventEmitter = require('events').EventEmitter;

var emitter = new EventEmitter;

b Kế thừa từ EventEmitter (Inheriting From EventEmitter)

Được sử dụng phổ biến và thiết thực của EventEmỉtter là tính kế thừa từ nó Điều này có nghĩa là chủng ta có thể giữ nguyên EventEmỉtter nguyên mẫu mà không bị

ảnh hưởng trong khi sử dụng API của nó đối với phương tiện riêng của chúng ta Để làm như vậy, chúng ta bắt đầu bằng cách xác định các hàm khởi tạo Trong, trong đó tất nhiên sẽ bark từ thời gian đến thời gian (còn được biết đến như một sự kiện)

var EventEmitter = require('events').EventEmitter; function Dog(name) { this.name = name;

Ở đây chúng ta kế thừa từ EventEmỉtter vì vậy chủng ta có thể sử dụng các

phương thức mà nó cung cấp, chẳng hạn như EventEmitter.on() và EventEmitter.emit() Nếu thuộc tính proto bị loại trừ, đừng lo lắng, chúng sẽ được trở lại này sau

Dog.prototype.proto = EventEmitter.prototype;

Trang 18

Bây giờ chúng ta có Dog được thành lập, chúng ta có thể tạo ra Simon! Khi

Simon bark, chúng ta có thể cho stdout biết bằng cách gọi console.log() với

callback Callback chính nó được gọi là trong ngữ cảnh của các đối tượng var simon = new Dog('simon'); simon.on('bark',

function(){

console.log(this.name ' barked'); } ;

Bark hai lần mỗi giây: setlnterval(function () {

simon.emit('bark‟); }, 500);

c Loại bỏ các sự kiện lắng nghe (Removing Event Listeners)

Như chúng ta đã biết, lắng nghe sự kiện chỉ đơn giản là hàm đó được gọi khi chúng ta emit () một sự kiện Chúng ta có thể loại bỏ những người nghe bằng cách dùng lệnh removeListener (type, callback), mặc dù điều này không được dùng thường xuyên

Trong ví dụ dưới đây, chúng ta phát ra thông báo "foo bar" mỗi 300 mill giây, trong đó có một cuộc gọi lại của console.log() Sau 1000 mill giây, chúng ta gọi removeListener () với các đối số tương tự mà tôi đã thông qua on () ban đầu Chúng ta cũng có thể sử dụng removeAiiListeners (type), trong đó loại bỏ tất cả các người

nghe được đăng ký type nhất định

var EventEmitter = require(1 events 1).EventEmitter; var emitter = new EventEmitter; emitter.on('message', console.log);

Trang 19

1.1.3.3 Luồng (Streams)

Streams là một khái niệm quan trọng trong nút Các luồng API là một cách duy nhất để xử lý luồng giống như dữ liệu Ví dụ, dữ liệu có thể được xem trực tiếp một tập tin, trực tiếp vào một socket để đáp ứng một HTTP request, hoặc trực tiếp từ

một nguồn chỉ cho đọc như stdin Để bây giờ, chúng ta sẽ tập trung vào các API, để

lại các chi tiết cụ thể luồng chương sau

a Readable Streams

Readable Streams được xem như một HTTP request kế thừa từ EventEmitter để lộ dữ liệu đến qua các sự kiện Việc đầu tiên của những sự kiện này là sự kiện dữ liệu, là một đoạn tùy ý của các dữ liệu được truyền đi để xử lý sự kiện như là một trường hợp đệm (Buffer instance )

req.on(„data‟, function(buf) { // Làm gì đó vói Buffer }) ;

Một sự kiện quan trọng khác là kết thúc, đại diện cho sự kết thúc của dữ liệu sự kiện Ví dụ, đây là một HTTP echo server, chỉ đơn giản là "simply" các request body data thông qua các response Vì vậy, nếu chúng ta POST "hello world", response của chúng ta sẽ là " hello world "

var http = require(„http‟);

http.createServer(function(req, res){ res.writeHead(200);

req.on(„data‟, function(data) { res.write(data);

});

req.on(„end‟, function(){ res.end();

}) ;

}), listen (3000);

Module sys thực sự có một chức năng được thiết kế đặc biệt cho hành động "simply" này, aptly tên sỵs pump () Nó chấp nhận một luồng đọc như là đối số đầu tiên, và viết dòng thứ hai

Trang 20

var http = require(„ http'); sys = require(„sys‟);

http.createServer(function(req, res){ res.writeHead(200);

sys.pump(req, res); }).listen(3000);

Trang 21

Các dòng sẽ không phát ra bất kỳ chi tiết 'data', hoặc sự kiện *kết thúc' Bất kỳ dữ liệu ghi xếp hàng sẽ không được gửi đi Các luồng được tải sự kiện 'close' khi nguồn lực của mình đã được xử lý

stream.pipe (destination, [options])

Đây là một phương pháp Stream.prototype có sẵn trên tất cả các luồng

Kết nối này đọc dòng để WriteStream điểm đến Dừ liệu đến trên luồng này được ghi đến đích Các luồng đích và nguồn được giữ đồng bộ bằng cách tạm dừng và khôi phục khi cần thiết Chức năng này trả về các luồng đích

Theo mặc định end () được gọi là điểm đến khi đi qua luồng nguồn phát ra cuối cùng, do đó, điểm đến mà không thể ghi được, {end: false} là tùy chọn để giữ cho luồng đích mở

Điều này giữ process stdout mở ràng "Goodbye" có thể được viết ở cuối, process.stdin.resume();

process.stdin.pipe (process.stdout, (end: false}); process.stdin.on ("end", function(){

process.stdout.write ("Goodbye \ n"); });

b Writable Stream

Một lớp cơ sở cho việc tạo ra các Writable Stream Tương tự như Readable Stream, bạn có có thể tạo ra các lớp con bằng cách ghi đè không đồng bộ khi sử dụng câu lệnh

_write(chunk, cb)

stream, writable

Giá trị boolean được mặc định đó là true, nhưng sẽ thành false sau khi lỗi xảy ra hoặc end() /destroy() được gọi

stream.Write (string, [encoding])

Viết chuỗi với encoding cho luồng Trả về true nếu chuỗi đã được bỏ vào bộ đệm kernel Trả về false để cho biết rằng bộ đệm kernel đã đầy, và dữ liệu sẽ được gửi đi trong tương lai Sự kiện 'drain' sẽ cho biết khi nào bộ đệm kernel là rỗng một lần nữa Việc mã hóa mặc định 'utf8'

Trang 22

stream.end (string, encoding)

Gửi chuỗi với mã hóa nhất định và chấm dứt dòng với EOF hoặc FIN Điều này rất hữu ích để giảm số lượng các gói tin gửi đi

a Làm việc với tập tin hệ thống

Cho phép bắt đầu với một ví dụ cơ bản làm việc với tập tin hệ thống Ví dụ này tạo một thư mục, tạo ra một tập tin bên trong nó, sau đó viết nội dung của tập tin đến console:

var fs = require('fs');

fs.mkdir('./helloDir', 0777, function (err) {

Trang 23

if (err) throw err;

fs.writeFile('./helloDir/message.txt', 'Hello Node‟, function (err) { if (err) throw err;

console.log(„file created with contents:‟);

fs.readFile('./helloDir/message.txt','UTF-8' ,function (err, data) {

if (err) throw err; console.log(data); });

}) ; }) ;

Rõ ràng trong ví dụ trên, ứng với mỗi callback đều đặt trong callback trước đây được gọi là callbacks chainable Mô hình này cần được theo sau khi sử dụng phương pháp không đồng bộ, không có đảm bảo rằng các hoạt động sẽ được hoàn thành theo thứ tự họ đang tạo ra Điều này có thể dẫn đến hành vi không thể đoán trước

Ví dụ có thể được viết lại để sử dụng một cách tiếp cận đồng bộ: fs.mkdirSync('./helloDirSync',0777);

fs.writeFileSync('./helloDirSync/message.txt', 'Hello Node‟); var data = fs.readFileSync(„./helloDirSync/message.txt‟,‟UTF-8‟); console.log('file created with contents:');

console.log(data);

Nó là tốt hơn để sử dụng phương pháp không đồng bộ trên các máy chủ với một tải cao, như các phương pháp đồng bộ sẽ làm cho toàn bộ quá trình để ngăn chặn và chờ cho các hoạt động để hoàn thành Điều này sẽ ngăn chặn bất kỳ kết nối đến hoặc các sự kiện khác

Trang 24

b File thông tin

Các đối tượng fs.stats có chứa thông tin về một tập tin hoặc thư mục cụ thể Điều này có thể được sử dựng để xác định loại đối tượng mà chúng ta đang làm việc Trong ví dụ này, chúng ta đang nhận được tất cả các đối tượng tập tin trong một thư mục và hiển thị cho dù chúng là một tập tin hoặc một đối tượng thư mục

fs.writeFile('./testFile.txt', "changed", function (err) { if (err) throw err;

console.log("file write complete"); }) ;

Một tập tin cũng có thể được unwatched bằng cách sử dụng phương pháp gọi fs.unwatchFile Cách này chỉ nên sử dụng một lần khi tập tin không còn cần được giám sát

1.1.3.5.HTTP

Để sử dụng HTTP server và client phải dùng lệnh require („http‟)

Các giao diện HTTP trong Node được thiết kế để hỗ trợ nhiều tính năng của các giao thức truyền thống khó sử dụng Trong đó, có thể là đoạn mã hóa, tin nhắn

HTTP headers được biểu diễn bởi một đối tượng như thế này: { 'content-length‟: '123',

'content-type‟: 'text/plain', 'connection': 'keep-alive',

Trang 25

http.createClient ([port], [host])

Hàm này bị phản đối sử dụng, hãy sử dụng http request () để thay thế Xây dựng một HTTP client mới Port và host tham chiếu đến máy chủ để được kết nối

Class: http.Server

server.listen(port, [hostname], [backlog], [callback])

Bắt đầu chấp nhận các kết nối trên port chỉ định và hostname Neu hostname được bỏ qua, các server sẽ chấp nhận các kết nối trực tiếp đến bất kỳ địa chỉ IPv4 (INADDR ANY) Để nghe một socket Unix, cung cấp một tên tập tin thay vì port và hostname

Backlog là chiều dài tối đa của hàng đợi kết nối đang chờ Chiều dài thực tế sẽ được xác định bởi hệ điều hành thông qua các thiết lập sysctl như

tcp_max_syn_backiog và somaxconn trên Linux Giá trị mặc định của tham số này là 511 (không phải 512)

Hàm này là không đồng bộ Gọi lại tham số cuối cùng sẽ được thêm vào như là một listener cho sự kiện 'listen' Xem thêm net Server, listen (port)

server.listen (path, [callback])

Bat đầu một máy chủ socket UNIX lắng nghe cho các kết nối trên đường dẫn nhất định Hàm này là không đồng bộ Gọi lại tham so cuối cùng sẽ được thêm vào như là một người biết lắng nghe cho sự kiện' listen' Xem thêm net Server listen (path)

server.listen (handle, [callback])

Các đối tượng có thể được thiết lập để xử lý một máy chủ hoặc socket, hoặc đối tượng {fd: <n>}

Trang 26

Lắng nghe trên một mô tả tập tin không được hỗ trợ trên Windows

Chức năng này là không đồng bộ Gọi lại tham số cuối cùng sẽ được thêm vào như là một người biết lắng nghe cho sự kiện ' listen' Xem thêm net Server listen ()

server.close ([callback])

Dừng server và chấp nhận các kết nổi mới Xem net Server close()

1.2 Cơ sở dữ liệu PostgreSQL 1.2.1 Giới thiệu mã nguồn mở 1.2.1.1 Khái niệm mã nguồn mở

Mã nguồn mở hiểu theo nghĩa rộng là khái niệm chung được sử dụng cho tất cả các phần mềm mà mã nguồn của nó được công bố rộng rãi, công khai và cho phép mọi người tiếp tục phát triển phần mềm đó Điều này không có nghĩa chúng được sao chép, sửa chữa thoải mái hay sử dụng vào mục đích nào cũng được

Mã nguồn mở được công bố dưới rất nhiều điều kiện khác nhau, một số trong đó cho phép phát triển, sử dụng và bán tùy ý miễn là giữ nguyên các dòng về nguồn gốc sản phẩm, một số bắt buộc tất cả các sản phẩm làm ra từ đó cũng phải là Open Source, một số khác đòi hỏi phải công bố trọn vẹn mã nguồn, một số khác không cho phép sử dụng vào mục đích thương mại, một số khác lại không có rằng buộc nào đáng kể… Qua đó ta thấy khái niệm Open Source không thể chuẩn xác mà muốn nói đến tính pháp lý của việc sử dụng các phần mềm mã nguồn mở, chúng ta phải xem xét đến điều kiện sử dụng cụ thể mà dưới đó chúng được công bố Một điều kiện hay được áp dụng nhất là GPL: GNU General Public Licence của tổ chức Free Software Foundation

GPL có hai đặc điểm phân biệt đó là:

Tác giả gốc giữ bản quyền về phần mềm nhưng cho phép người dùng có nhiều quyền, trong đó có quyền tìm hiểu, phát triển, công bố cũng như quyền khai thác thương mại sản phẩm

Đặc điểm thứ hai thường được gọi là hiệu ứng virut (virus effect) vì nó biến tất cả các phần mềm có dùng mã nguồn GPL cũng biến thành phần mềm GPL Trên

Trang 27

thực tế điều này có nghĩa: bất kì tác giả nào sử dụng dù chỉ một phần rất nhỏ mã nguồn GPL trong chương trình của mình, cũng phải công bố dưới điều kiện GPL Các điều khoản phân phối của phần mềm mã nguồn mở phải tuân thủ các tiêu chuẩn sau:

 Tự do tái phân phối

 Mã nguồn

 Các phần mềm phải có nguồn gốc

 Tính toàn vẹn của mã nguồn cung cấp bởi tác giả

 Không có sự phân biệt giữa cá nhân hay nhóm người

 Không phân biệt bất cứ một lĩnh vực nào

 Việc phân phối bản quyền

 Giấy phép không được dành riêng cho một sản phẩm

 Giấy phép không được hạn chế các phần mềm khác

1.2.1.2 Lợi ích của mã nguồn mở

Phần mềm có thể được sao chép hoàn toàn miễn phí, người dùng hoàn toàn an tâm khi chia sẻ một chương trình tốt với bạn bè

Hầu hết các sản phẩm Open Source đều có khả năng bảo mật tuyệt vời, khi một vết nứt được tìm thấy, nó thường được vá nhanh hơn phần mềm có bản quyền Các hệ thống Open Source, nhất là các hệ thống dựa trên UNIX, thường rất linh hoạt Bởi vì chúng được xây dựng từ nhiều khối thống nhất và được mô tả cặn kẽ, rất dễ để người dùng thay thế nhiều phần của hệ thống với phần có giao diện tương tự

Có một cộng đồng hỗ trợ lớn, không bị phụ thuộc vào một công ty nào

Open Source đã được các công ty lớn chấp nhận chẳng hạn như IBM, Oracle và Sun Thậm chí Microsoft đã phải lưu tâm đến Open Source như đối thủ lớn

Với Open Source, việc phân phối và phát triển là một phương pháp lâu dài để tạo ra phần mềm, người mua được cung cấp cả giải pháp phần mềm lẫn những mã nguồn có giấy phép Open Source Hơn nữa các doanh nghiệp vừa và nhỏ sẽ ưa chuộng phần mềm Open Source hơn

Hiện nay đã có một số tổ chức dự định sử dụng Open Source để xây dựng nhân tố cốt lõi của hệ thống – từ hệ điều hành, cơ sở dữ liệu, ứng dụng và Web

Trang 28

server… đến các hệ thống quản trị nội dung và nhiều phần mềm kinh doanh thông minh

Mặc dù con đường để free software khẳng định vị trí vẫn còn dài, nhưng đáng chú ý là Open Source đã dành được 70% ứng dụng Web và dường như con số này vẫn tiếp tục tăng

1.2.1.3 Ứng dụng của mã nguồn mở hiện tại

- Hiện nay, trên thế giới có rất nhiều loại mã nguồn mở khác nhau, mỗi loại mã nguồn mở lại có một ứng dụng riêng Dưới đây là một số loại mã nguồn mở được sử dụng rộng rãi:

+ Ubuntu là hệ điều hành mã nguồn mở dùng cho máy tính xách tay, máy tính để bàn và cả máy chủ, Ubuntu chứa tất cả các chương trình ứng dụng cần thiết cho công việc tại nhà, ở trường hay tại văn phòng công ty

+ Vbulletin là mã nguồn mở xây dựng các diễn đàn trực tuyến được sử dụng phổ biến nhất hiện nay Hầu hết các diễn đàn lớn tại Việt Nam đều được xây dựng bằng Vbulletin

+ Apache Tomcat là hệ thống mã nguồn mở của hãng Apache Software, Ứng dụng Apache Tomcat có thể xử lý được số lượng lớn các yêu cầu bao gồm ứng dụng web trực tuyến, các gói dữ liệu lưu thông giữa server-client, tùy biến dễ dàng theo nhu cầu, quy mô của từng tổ chức, doanh nghiệp

+ Linux là một hệ điều hành mã nguồn mở dạng Unix được xây dựng bởi Linus Torvalds, Linux có mọi đặc tính của một hệ điều hành hiện đại: hệ thống đa nhiệm, đa tuyến đoạn, bộ nhớ ảo, thư viện độ , tải theo nhu cầu, quản lý bộ nhớ, các trình điều khiển thiết bị và giao mạng TCP/IP

+ Open office là chương trình mã nguồn mở thay thế cho Microsoft office, ưu điểm của nó là dung lượng nhỏ và có thể tương thích được với Microsoft Office nhưng chưa thể thân thiên bằng Microsoft Office

+ NukeViet là một hệ quản trị nội dung mã nguồn mở được ứng dụng để thiết kế các trang web như các cổng thông tin điện tử hoặc các website doanh nghiệp, báo điện tử, tạp chí điện tử, website của các doanh nghiệp vừa và nhỏ, website của các cơ quan, tổ chức phi chính phủ, website các trường học, website của gia đình hay cá nhân

Trang 29

+ Greenstone là một bộ phần mềm dùng để xây dựng và phân phối các bộ sưu tập thư viện số Nó cung cấp cho người sử dụng, đặc biệt là các trường đại học, các thư viện hoặc trong các trụ sở công cộng xây dựng các thư viện số riêng của họ

+ PostgreSQL là một hệ quản trị cơ sở dữ liệu quan hệ

+Ngoài ra còn rất nhiều loại mã nguồn mở khác như: Eclipse, Webwork, WebGUI, OpenCMS, Fedora…

1.2.2.Giới thiệu sơ lƣợc về PostgreSQL 1.2.2.1 PostgreSQL là gì?

PostgreSQL là hệ quản trị cơ sở dữ liệu được viết theo hướng mã nguồn mở và rất mạnh mẽ Hệ quản trị cơ sở dữ liệu này đã có hơn 15 năm phát triển, đồng thời cấu trúc đã được kiểm chứng và tạo được lòng tin với người sử dụng về độ tin cậy, tính toàn vẹn dữ liệu, và tính đúng đắn PostgreSQL có thể chạy trên tất cả các hệ điều hành, bao gồm cả Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64), và Windows Có hỗ trợ đầy đủ các foreign keys, joins, views, triggers, và stored procedures (trên nhiều ngôn ngữ) Hệ quản trị này còn bao gồm các kiểu dữ liệu SQL: 2008 như INTEGER, NUMBER, BOOLEAN, CHAR, VARCHAR, DATE INTERVAL, vàTIMESTAMPs PostgreSQL cũng hỗ trợ lưu trữ các đối tượng có kiểu dữ liệu nhị phân lớn, bao gồm cả hình ảnh, âm thanh, hoặc video Hệ quản trị cơ sở dữ liệu này được sử dụng thông qua giao diện của các ngôn ngữ C / C + +, Java, Net, Perl, Python, Ruby, Tcl, ODBC…

Là một hệ quản trị cơ sở dữ liệu mạnh, PostgreSQL có các tính năng phức tạp như kiểm soát truy cập đồng thời nhiều phiên bản (MVCC), khôi phục dữ liệu tại từng thời điểm (Recovery), quản lý dung lượng bảng (tablespaces), sao chép không đồng bộ, giao dịch lồng nhau (savepoints), sao lưu trực tuyến hoặc nội bộ, truy vấn phức tạp và tối ưu hóa, và viết trước các khai báo để quản lý và gỡ lỗi PostgreSQL hỗ trợ bộ ký tự quốc tế, hỗ trợ bảng mã nhiều byte, Unicode, và cho phép định dạng, sắp xếp và phân loại ký tự văn bản (chữ hoa, thường) PostgreSQL còn được biết đến với khả năng mở rộng để nâng cao cả về số lượng dữ liệu quản lý và số lượng người dùng truy cập đồng thời Đã từng có những hệ thống PostgreSQL hoạt động trong môi trường thực tế thực hiện quản lý vượt quá 4 terabyte dữ liệu

Trang 30

1.2.2.2 Vài nét về lịch sử PostgreSQL

Hệ thống quản lý cơ sở dữ liệu đối tượng-quan hệ bây giờ được gọi là PostgreSQL có nguồn gốc từ các gói Postgres viết tại Đại học California ở Berkeley Với hơn hai thập kỷ phát triển, PostgreSQL bây giờ là cơ sở dữ liệu mã nguồn mở tiên tiến nhất sẵn sàng ở bất cứ đâu

2.1.3 Ƣu điểm và nhƣợc điểm của PostgreSQL a Ƣu điểm

- Dễ cấu hình, thích ứng tốt, độ tin cậy cao - Hỗ trợ tốt với PHP và Java

- Là một phần mềm mã nguồn mở - Tuân thủ các chuẩn của SQL

- Hoạt động được trên nhiều hệ điều hành như: Windows , Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64)

- Lưu trữ (dạng nhị phân) các đối tượng có dữ liệu lớn như hình ảnh, âm thanh, hoặc video - Hỗ trợ các ngôn ngữ như C/C++, Java, Net, Perl, Python, Ruby, Tcl, ODBC

- Có sự thống nhất giữa những người phát triển (tái dụng những kỹ năng và các thư viện đã có)

- Có hầu hết các truy vấn SQL với các kiểu dữ liệu như INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL, và TIMESTAMP

- Tạo chỉ mục giúp quá trình truy vấn đạt hiệu quả cao hơn - Hỗ trợ các chức năng tìm kiếm tổng quát hóa có thể “gắn” các chỉ mục vào giúp quá trình tìm kiếm được thực hiện trên phạm vi rộng hơn như: compound, unique, partial, and functional indexes

- Có thể tạo mới kiểu dữ liệu, các hàm, các thủ tục (procedure)…

- Hỗ trợ đa người dùng: dữ liệu không gian có xu hướng là các dữ liệu tham chiếu, tức là được chia sẻ bởi nhiều người dùng Lưu trữ dữ liệu trong hệ quản trị cơ sở dữ liệu sẽ cung cấp những lợi ích như: truy cập từ xa thông qua các chuẩn giao tiếp như: JDBC, ODBC, PERL/DBI , làm tăng tính bảo mật cho dữ liệu như: một số người dùng có toàn quyền tuy nhiên một số người dùng chỉ có thể đọc hay không được nhìn thấy

b Nhƣợc điểm

Trang 31

- Cộng đồng người dùng tương đối ít - Chậm hơn so với MySQL

- Không có tham số mặc định trong PL/PGSQL

Trang 32

Chương 2 : KHẢO SÁT THỰC TRẠNG , PHÂN TÍCH VÀ THIẾT KẾ HỆ THÔNG QUẢN LÝ

2.1 Khảo sát thực trạng

2.1.1 Tổng quan về hệ thống quản lý khách hàng 2.1.1.1 Định nghĩa

CRM là viết tắt của Customer Relationship Management - Quản lý quan hệ khách hàng Đó là chiến lược của các công ty trong việc phát triển quan hệ gắn bó với khách hàng qua nghiên cứu, tìm hiểu kỳ lưỡng nhu cầu và thói quen của họ Thiết lập mối quan hệ tốt đẹp với với khách hàng có ý nghĩa đặc biệt quan trọng đối với sự thành công của mỗi công ty nên đây là vấn đề hết sức được chú trọng

Quản lý quan hệ khách hàng là một phương pháp giúp các doanh nghiệp tiếp cận và giao tiếp với khách hàng một cách có hệ thống và hiệu quả, quản lý các thông tin của khách hàng như thông tin về tài khoản, nhu cầu, liên lạc nhằm phục vụ khách hàng tốt hơn

Thông qua hệ thống quan hệ khách hàng, các thông tin của khách hàng sẽ được cập nhật và được lưu trữ trong hệ thống quản lý cơ sở dữ liệu Nhờ một công cụ dò tìm dữ liệu đặc biệt, doanh nghiệp có thể phân tích, hình thành danh sách khách hàng tiềm năng và lâu năm để đề ra những chiến lược chăm sóc khách hàng hợp lý Ngoài ra, doanh nghiệp còn có thể xử lý các vấn đề vướng mắc của khách hàng một cách nhanh chóng và hiệu quả

Tóm lại, CRM là một chiến lược quan trọng trong hoạt động quản lý doanh nghiệp trong kỷ nguyên thông tin và tri thức Mục tiêu của CRM là tối đa hóa giá trị khách hàng thông qua việc xây dựng, phát triển và duy trì một tổ chức luôn định hướng vào khách hàng và thỏa màn khách hàng Nhiều doanh nghiệp Việt Nam hiện nay đã nhận thức được tầm quan trọng của việc quản lý quan hệ khách hàng, nhưng mới chỉ dừng lại ở việc đầu tư giải pháp công nghệ đơn thuần Trong khi đó, mọi công nghệ dù có hữu dụng đến mấy cũng không thể mang lại những biến đổi tích cực nếu con người không sẵn sàng hoặc không có khả năng ứng dụng một cách hiệu quả Con người chính là yếu tố cần được quan tâm và đầu tư thỏa đáng trong chiến lược quản lý quan hệ khách hàng Và vấn đề cốt lõi cần đề cập ở đây chính là

Trang 33

những giá trị, những tư tưởng, ý thức - các nền tảng văn hóa tổ chức - giúp biến ý tưởng, mục tiêu của các doanh nghiệp thành hành động cụ thể

2.1.1.2 Lợi ích của CRM

Hiệu quả của hệ thống CRM còn thể hiện ở tính đơn giản khi khách hàng có thể trao đổi thông tin với công ty thông qua các cách thức khác nhau, thông qua các kênh liên lạc khác nhau, vào các thời điểm khác nhau, với các ngôn ngữ khác nhau tùy thuộc vào sở thích của khách hàng Đặc biệt khách hàng luôn cảm thấy đang giao tiếp với một thực thể duy nhất và đang nhận được sự chăm sóc mang tính cá nhân mặc dù các yêu cầu của khách hàng có thể phải đi qua những kênh nội bộ phức tạp mới đến đúng bộ phận phụ trách về sản phẩm hay dịch vụ đó

Với sự trợ giúp của một chương trình CRM hiệu quả, doanh nghiệp có thể phân tích thấu đáo mọi thông tin về mỗi khách hàng cả ở dạng tiềm năng và thân thiết Từ đó định ra giá trị thực mà khách hàng có khả năng mang lại và phân loại các nhóm khách hàng theo các thị trường mục tiêu nhằm có chính sách chăm sóc họp lý hơn Ở một phương diện khác, CRM còn hỗ trợ đắc lực cho các doanh nghiệp khi xây dựng chiến lược marketing nhờ một hệ thống trong suốt về hồ sơ khách hàng, giúp đơn giản hóa quá trình tiếp thị và bán hàng

Theo kết quả nghiên cứu của hai chuyên gia là Paul Gray và Jongbok Byun, trường Claremont Graduate School, khi triển khai CRM thành công, doanh nghiệp sẽ được hưởng rất nhiều lợi ích, chẳng hạn:

> Việc ứng dụng CRM sẽ tiết kiệm được rất nhiều chi phí cho các doanh nghiệp: Thông thường chi phí để tiếp cận một khách hàng mới thường cao gấp 5 đến 10 lần chi phí duy trì một khách hàng đã có sẵn Chi phí bán hàng và chi phí phục vụ khách hàng cũ cũng thấp hơn so với một khách hàng mới

những khách hàng trung thành thường có xu hướng quay trở lại mua, họ thường ít quan tâm chú ý đến giá cả và cũng dễ dàng phục vụ hơn khách hàng mới Bên cạnh đó những khách hàng hài lòng với công ty sẽ khen ngợi công ty với nhiều người khác, qua đó giúp công ty có thêm những khách hàng mới và trở thành kênh tuyên truyền hiệu quả với các đối tượng tiềm năng khác

Ngày đăng: 07/05/2024, 03:50

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

Tài liệu liên quan