Trong quá trình phát triển phần mềm SaaS từ năm 2006, chúng tôi nhận thấy:
1. Với số lượng module lớn (Khoảng 400 module) nếu lập trình theo phương pháp thông thường sẽ rất lâu mới hoàn thiện được.
2. Do nhiều người phát triển nên khó đạt được sự thống nhất, chuẩn hóa hoàn toàn (Mỗi người viết một cách, một giao diện).
3. Những module quan trọng sẽ được test kỹ nhưng những module ít quan trọng có khả năng bị bỏ sót.
4. Các module thường rất giống nhau, có thể chia thành 5,6 loại như: thêm sửa xóa, báo cáo, bảng tính, danh sách các mục, cây danh mục, …
Do đó cần phải phát triển một công cụ sinh mã tự động đáp ứng các yêu cầu sau: 1. Có thể sinh mã mà không cần phải lập trình.
2. Có thể phát triển nhiều mẫu khác nhau 3. Đơn giản dễ sử dụng
4. Có thể nhận dạng từ database để tạo ra các module một cách tự động 5. Phù hợp với hệ thống SaaS đang phát triển
Trên cơ sở đó đề ra giải pháp
1. Quá trình sản xuất phần mềm không theo mô hình thông thường mà theo các bước:
o Phân tích bài toán
o Xem có mẫu nào phù hợp không o Nều không có thì
Tổng quát hóa bài toán
Xây dựng mẫu tương ứng o Sinh mã tự động cho bài toán
o Chỉnh sửa cho phù hợp, cải tiến mẫu 2. Hệ thống sinh code gồm các công cụ:
o Ngôn ngữ mô hình pattern
o Bộ phân tích cú pháp và biên dịch
o Chương trình tạo giao diện nhập tham số sinh code cho người dùng o Bộ nhận dạng từ cơ sở dữ liệu
Sơ đồ hệ thống
Hình 48: Sơ đồ hệ thống sinh mã
3.5.1. Ngôn ngữ Pattern
3.5.1.1. Nguyên tắc
Pattern dùng để sinh mã nên gồm 2 bộ phận: Mã mẫu: Viết như mã thông thường
Các cấu trúc điều khiển + biến tham số. Sử dụng các ký hiệu đặc biệt
3.5.1.2. Cú pháp
Khai báo biến
Ký hiệu [[-tenbien-]]
Hệ thống sẽ tạo ra một ô input để nhập giá trị cho biến này Hoặc [[-tennhom.tenbien-]]
Hệ thống sẽ tạo ra một nhóm input, trong đó có một ô tenbien để nhập giá trị. Các nhóm có thể lồng nhau
Ví dụ
Hình 49: Form khai báo sinh mã
DECLARE
Cú pháp:
[[!—DECLARE:tenbien--]]Các khai báo[[!--/DECLARE--]] Các khai báo gồm có:
Type = kiểu;
(Kiểu có thể là text, select, checkbox hay textarea)
Options = các tùy chọn;
(Sử dụng khi type=select)
Tips = mô tả ý nghĩa của biến;
Display_condition = điều kiện để ô input được hiển thị;
Style = Định dạng cho ô input;
Recognize_class = lớp nhận dạng từ bảng; Recognize_function = Hàm nhận dạng từ bảng; Ví dụ: [[!--DECLARE:test--]] Biến độc lập Nút để nhân bản 1 nhóm Nút để xóa 1 nhóm
Tương đương ký hiệu multiple_items.columns.name Nhóm
cha
Nhóm con
type = select; options = abc,123;
tips = Day la o input thu nghiem; [[!--/DECLARE--]]
LIST
Cú pháp:
[[!--LIST:tennhom--]] mã sinh code [[!--/LIST:tennhom--]] Ý nghĩa: Liệt kê các nhóm trong một danh sách, với mỗi nhóm thực hiện sinh code theo mã sinh code bên trong LIST. Một danh sách gồm nhiều nhóm, có khả năng thêm, sửa xóa các nhóm.
Ví dụ:
[[!--LIST:friends--]]
Hello Mr(s).[[-friends.name-]]!<br /> [[!--/LIST --]]
IF
Cú pháp: [[!--IF:bieuthuc--]]mã sinh code 1[[!--ELSE--]] mã sinh code 2[[!--/IF--]] Ý nghĩa: Trả về mã sinh code 1 nếu biểu thức đúng, mã sinh code 2 nếu sai
Biểu thức có thể là:
Tên biến = các giá trị phân cách nhau bằng dấu phẩy
Bộ biên dịch sẽ so sánh giá trị của biến với từng giá trị, nếu có một giá trị bằng nhau thì trả về đúng. Hệ thống cũng tự động nhận dạng ô input cho biến là một hộp select box có các giá trị cho trong biểu thức bên phải
Tên biến != các giá trị phân cách nhau bằng dấu phẩy
Bộ biên dịch sẽ so sánh giá trị của biến với từng giá trị, nếu có một giá trị bằng nhau thì trả về sai
Bieuthuc1 or bieuthuc2
Bộ biên dịch sẽ trả về đúng nếu 1 trong các biểu thức đúng
Tendanhsach[tenbien] = các giá trị phân cách nhau bằng dấu phẩy
Bộ biên dịch sẽ so sánh giá trị của từng biến trong các nhóm của danh sách với từng giá trị trong biểu thức bên phải, nếu có một giá trị bằng nhau thì trả về đúng
Tendanhsach[tenbien] != các giá trị phân cách nhau bằng dấu phẩy
Bộ biên dịch sẽ so sánh giá trị của từng biến trong các nhóm của danh sách với từng giá trị trong biểu thức bên phải, nếu có một giá trị bằng nhau thì trả về sai
(bieuthucPHP)
Bộ biên dịch sẽ thực hiện và trả về giá trị biểu thức PHP Ví dụ: [[!--LIST:friends--]] [[!--IF:friends.gender=male--]] Hello Mr.[[-friends.name-]]! [[!--ELSE--]] Hello Mrs.[[-friends.name-]]! [[!--/IF--]] [[!--/LIST --]] SCRIPT Cú pháp: [[!--SCRIPT--]] mã PHP [[!--/SCRIPT--]] Ý nghĩa: Thực hiện đoạn mã PHP lúc sinh code (runtime)
Để ghi nội dung vào file kết quả sinh code, nối thêm xâu vào biến $code
ORDER
Cú pháp: [[!--ORDER:tenbien--]] mã sinh code [[!--/ORDER--]] Ý nghĩa: Đánh dấu một đoạn code để sắp xếp thứ tự hiển thị theo biến ―tenbien‖ Ví dụ:
Hình 50: Sắp thứ tự cho tên biến
Trong database_fields sẽ xuất hiện một trường order để thể hiện thứ tự khi hiển thị trong form AUTO_ORDER_LIST Cú pháp: [[!--AUTO_ORDER_LIST--]] danh_sach_cac_menh_de_ORDER [[!--/AUTO_ORDER_LIST--]] Tự động sắp xếp các mệnh đề ORDER ORDER_LIST Cú pháp: [[!--ORDER_LIST--]] danh_sach_cac_menh_de_ORDER [[!--/ORDER_LIST--]]
Tạo một danh sách các mệnh đề ORDER, muốn sắp xếp thế nào thì viết SCRIPT sắp xếp tương ứng LOAD Cú pháp: [[!--LOAD:ten_file_hoac_thu_muc --]] cac_menh_de_REPLACE [[!--/LOAD--]]
Hoặc
[[!--LOAD:ten_bien=gia_tri_mac_dinh --]] cac_menh_de_REPLACE
[[!--/LOAD--]]
Ý nghĩa: Đọc nội dung của file hoặc thư mục đưa vào pattern
REPLACE
Cú pháp
[[!--REPLACE:ten_region_hoac_ten_bien--]] giá_trị_mới
[[!--/REPLACE--]]
Ý nghĩa: Thay đổi vùng hoặc tên biến thành giá trị mới. Dùng để kế thừa các pattern đã có sẵn bằng cách thay đổi một vài chi tiết
REGION
Cú pháp:
[[!--REGION:ten_vung--]] mã sinh code
[[!--/REGION--]]
Vùng dùng để đánh dấu một đoạn code có thể thay thế khi LOAD 3.5.2. Bộ nhận dạng từ bảng CSDL
Thông thường database được thiết kế tuân theo một số chuẩn quy ước. Ví dụ tên của đối tượng dữ liệu thường có chữ ―name‖, trường nối với bảng khác có ký hiệu ―_id‖ ở cuối, trường ngày tháng có kiểu là Date, … Ta có thể xây dựng một tập các luật để ánh xạ từ định dạng của một cột dữ liệu sang định dạng trong form nhập (hoặc cột trong báo cáo hay danh sách)
Hiện tại đã có bộ nhận dạng cho các pattern: 1. CRUD
2. Listing 3. Spreadsheet 4. Report
3.5.3. Một số pattern đã phát triển
3.5.3.1. CRUD
CRUD (Create, Read, Update, Delete) là kiểu module chủ yếu dùng trong hoạt động quản trị. Có một số lượng rất lớn các tính năng quản trị là các thao tác Thêm, Sửa, Xóa đơn giản.
Tác giả: Nguyễn Hữu Huân, Đoàn Chiến Thắng, Nguyễn Hoàng Long Một form điển hình:
Hình 51: Form CRUD điển hình Các thành phần chính của mẫu CRUD:
1. Fields: Các trường dạng dữ liệu thông thường. Một fields có các thành phần: o Name: Tên của field.
o Type: Kiểu. Text, Select, Int, Float, Date, Time, DateInt, DateTime, Const, File, Image, Textarea, RichEditor, SimpleRichEditor, Checkbox, Radio.
o Filtertype: kiểu tìm kiếm.
o displayInList: Có hiển thị ở list hay khong. o Required: Có bắt buộc hay không.
o Unique: Có duy nhất hay không.
2. Database_fields: Các trường liên kết với bảng khác. Có các thành phần. multiple_items
database_fields fields
o Name: Tên trường.
o Table: Tên bảng liên quan.
o Title_name: Cột dùng làm tiêu đề. o Filter_type: Kiểu lọc.
Category select: Lọc dạng menu hình cây bên trái.
Select: Lọc dạng select box xổ xuống.
Text: Lọc dạng text.
o Display in list:có hiển thị ở danh sách không. o Condition: Điều kiện để liệt kê ở bảng.
3. Language_field: Những trường đa ngôn ngữ. Các thành phần o Name: Tên trường.
o type: Kiểu. Kiểu text, textarea, richeditor, … o Filter_type: Kiểu lọc.
Text: Lọc dạng text.
int: Lọc dạng số, từ bao nhiêu đến bao nhiêu.
date: Lọc dạng ngày tháng.
o Display in list:có hiển thị ở danh sách không. o Required: Có bắt buộc không.
4. Multiple items: Các mục của các bảng khác liên quan đến bản ghi dưới dạng 1 nhiều. Có các thành phần:
o Table name: Tên bảng liên quan. o Reference name: Tên trường liên quan.
o Columns: List các cột trong bảng liên quan. Thành phần của columns gần giống thành phần của fields.
o Database_columns: List các cột dạng database trong bảng liên quan, liên quan đến bảng khác. Thành phần của database_columns gần giống thành phần của database_fields.
o Language_columns: List các cột đa ngôn ngữ trong bảng liên quan. Thành phần của language_columns gần giống thành phần của language_fields.
3.5.3.2. Report
Sinh ra các loại báo cáo khác nhau như Crystal Report
Hình 52: Một báo cáo mẫu
Spreadsheets
Cho phép chỉnh sửa trực tiếp ở tất cả các trường dưới dạng bảng tính Tác giả: Nguyễn Hoàng Long, Nguyễn Đăng Khoa
Hình 53: Form quản lý kiểu bảng tính
3.5.3.3. All in one
Module cho phép thực hiện tất cả các hành động như thêm, sửa, xóa, hiển thị danh sách trên một form duy nhất.
Ví dụ
Hình 54: Form dạng all in one
3.5.3.4. Listing
Module chuyên dùng để liệt kê danh sách.
Tác giả: Nguyễn Đăng Khoa, Cử nhân trường Công Nghệ
Hình 55: Form dạng listing
3.5.3.5. Detail
Đưa ra thông tin chi tiết về một đối tượng dữ liệu. Tác giả: Nguyễn Đăng Khoa
Hình 56: Form dạng detail
3.5.3.6. Các template khác đang phát triển
1. Invoice: Chuyên tạo các loại hóa đơn.
2. Ajax CRUD: Module như CRUD nhưng dùng Ajax cho việc cập nhật dữ liệu. 3. Game: Tạo game nhiều người chơi như trò http://rungchuongvang.vn.
4. Chart: Tạo biểu đồ.
5. DataMap: tổng hợp dữ liệu, kích vào một mục sẽ xem được chi tiết + sửa mục dữ liệu đó.
Chương 4 PHẦN MỀM QUẢN LÝ KHÁCH HÀNG THEO MÔ HÌNH SAAS