Khi đã quen với việc lập trình ta nhận thấy có những công việc lập trình lặp đi lặp lại. Như vậy lập trình cũng cần phải được công nghiệp hoá để mỗi lập trình viên sử dụng bộ não vào những công việc mới. Làm cách nào để công nghiệp hoá lập trình và giúp tăng năng suất lập trình lên 20 lần (1 người = 20 người). Chúng ta sẽ tìm hiểu cách mà framework sau đây công nghiệp hoá tối đa những đoạn code lập trình lặp đi lặp lại.
PHẦN I: GIỚI THIỆU FRAMEWORK INDUSTRY
Tên framework:
Industry
Người xây dựng:
Đỗ Minh Hiền
Lịch sử:
– Được phát triển từ tháng 3 năm 2013 với công nghệ ban đầu hướng tới là: vaadin + astyanax + cassandra
– Do những yếu tố khách quan tác động, tháng 11/2014 phiên bản với cassandra tạm thời dừng phát triển, để chuyển sang phát triển phiên bản vaadin + oracle trước. Phiên bản với cassandra sẽ tiếp tục phát triển sau.
– 15/01/2015 phiên bản đầu tiên của (vaadin + oracle) đã hoàn thành với các tính năng sau.
Các công nghệ được sử dụng
1. Web framework Vaadin 7.3.7
2. Kết nối cơ sở dữ liệu: C3p0 + JDBC
3. Cơ sở dữ liệu Oracle, MySQL
Ưu điểm:
– Phát triển cực nhanh
– Đã tối ưu
– Đã vá lỗi an toàn thông tin
– Tương thích nhiều trình duyệt
– Kiến trúc tinh gọn, chủ yếu tập trung code phía server.
– Tốc độ build và run chương trình nhanh (1 phút từ lúc nhấn nút run hoặc debug chương trình sẽ chạy xong)
Nhược điểm:
– Chưa hỗ trợ nhiều Theme + bố cục trình bày
Các tính năng trong framework
- Chỉ cần khai báo và chạy- giảm 70% test case.
- Giải quyết hầu hết các bài toán quan hệ: 1 – nhiều, nhiều – nhiều, nhiều -1
- Hỗ trợ các loại xử lý file, datetime, popup single choice & popup multi choice.
- Tự động xử lý cập nhật theo lô với các câu lệnh tương tự
- Tương thích các loại phiên bản trình duyệt chrome và firefox.
- Tối ưu truy vấn, không kết nối cơ sở dữ liệu nếu điều kiện tìm kiếm là tập con của điều kiện tìm kiếm trước đó. Sau các thao tác thêm mới, sửa dữ liệu, không truy vấn lại database. Giảm tối đa kết nối tới DB.
- Hỗ trợ báo cáo động, chỉ cần viết query và khai báo cột.
- Tích hợp phân quyền riêng tại hệ thống, không phân quyền chung. Tăng tốc cổng đăng nhập bằng cách chỉ làm nhiệm vụ duy nhất là xác thực, không query trả dữ liệu phân quyền.Sử dụng phiên bản mới Cas 3.5.2.
- Hỗ trợ fix các lỗi an toàn thông tin
- Hỗ trợ đa ngôn ngữ
- Hỗ trợ phân trang dữ liệu
- Hỗ trợ các hàm tương tác giúp lập trình viên bổ sung thêm code trước và sau các sự kiện (Tìm kiếm, thêm mới, sửa, xoá)
- Hỗ trợ khai báo các kiểu validate (Độ dài, số > x < y, email, ngày tháng – từ ngày – đến ngày)
- Hỗ trợ khai báo ràng buộc điều kiện tìm kiếm mặc định để giới hạn dữ liệu- Chạy tốt trên web server jetty và tomcat.
Định hướng phát triển tương lai:
- Tự động sinh giao diện mobile
- Tích hợp đóng gói cài đặt
- Tích hợp mã hoá bảo vệ và quản lý license.
PHẦN II: GIỚI THIỆU MỘT SỐ CHỨC NĂNG CHÍNH
Giao diện chương trình
Chức năng có quan hệ 1 nhiều:
Ví dụ quản lý menu:
Viết code
Chạy chương trình
Chức năng có quan hệ nhiều – nhiều
Ví dụ: quản lý vai trò
Viết code
Chạy chương trình
Nhấn nút “Thêm mới”
Nhấn nút mở popup lấy bản ghi quan hệ nhiều – nhiều
viết code cho PopupMultiMenuAction
Bật popup
Quan hệ một nhiều sử dụng single popup thay cho ComboBox
Viết code chức năng quản lý người dùng
Chạy chương trình
Nhấn nút “Sửa”
Viết code poup single
Bật single poup
Báo cáo Excel
Viết code báo cáo:
Giao diện xuất báo cáo
PHẦN III: JAVADOC
Framework được viết theo đúng design patterm và viết đầy đủ Java doc cho tất cả các hàm, sau đây là một số Java Doc cho các hàm thường dùng:
1. Hàm addComponentToForm()
/**
* Hàm thêm component vào giao diện nhập
*
* @param label mô tả
* @param component thành phần trên giao diện
* @param databaseFieldName tên cột tương ứng trong database
* @param dataType loại dữ liệu
* @param isMandatory bắt buộc nhập
* @param dataLength độ dài dữ liệu
* @param format kiểm tra định dạng dữ liệu:
* ví dụ đơn giản: int,long,float,double,email
* ví dụ nâng cao: int>=-1 : kiểu số nguyên lớn hơn -1
* float:2>=0.5 : kiểu số thực 2 chữ số thập phân sau dấu phẩy lớn hơn hoặc bằng 0.5
* @param caption mô tả thêm
* @param useToSearch sử dụng để tìm kiếm
* @param isPassword Có phải password không
* @param searchMandatory Bắt buộc nhập khi tìm kiếm (Để lấy dữ liệu mới từ DB)
* ví dụ: date:and_mandatory:100 (kiểu thời gian, luôn bắt buộc nhập, không vượt quá khoảng 100 ngày)
* int:or_mandatory (kiểu số nguyên, chỉ bắt buộc nhập khi tất cả trường bắt buộc chưa có dữ liệu)
* @param isCollapsed Có ẩn cột trên table không
* @param searchDefaultValue Điều kiện tìm kiếm mặc định
* @param visibleAdd Hiển thị tại màn hình thêm mới
* @param visibleEdit Hiển thị tại màn hình sửa
* @param enableAdd Hiệu lực tại màn hình thêm mới
* @param enableEdit Hiệu lực tại màn hình sửa
* @param defaultValue Giá trị mặc định tại màn hình thêm mới và màn hình sửa
* @since 18/11/2014 HienDM
*/
public void addComponentToForm(String label, Component component,
String databaseFieldName, String dataType,
boolean isMandatory, Integer dataLength, String format, String caption,
boolean useToSearch, boolean isPassword, String searchMandatory,
boolean isCollapsed, Object searchDefaultValue, boolean visibleAdd,
boolean visibleEdit, boolean enableAdd, boolean enableEdit, Object defaultValue)
2. Hàm setComponentAsSysdate()
/**
* Hàm thêm component là một sysdate không nhập trên giao diện
*
* @param label mô tả
* @param databaseFieldName tên cột tương ứng trong database
* @param useToSearch sử dụng để tìm kiếm
* @param searchMandatory Bắt buộc nhập khi tìm kiếm (Để lấy dữ liệu mới từ DB)
* ví dụ: date:and_mandatory:100 (kiểu thời gian, luôn bắt buộc nhập, không vượt quá khoảng 100 ngày)
* int:or_mandatory (kiểu số nguyên, chỉ bắt buộc nhập khi tất cả trường bắt buộc chưa có dữ liệu)
* @param isCollapsed Có ẩn cột trên table không
* @param searchDefaultValue Điều kiện tìm kiếm mặc định
* @since 18/11/2014 HienDM
*/
public void setComponentAsSysdate(String label, String databaseFieldName, boolean useToSearch,
String searchMandatory, boolean isCollapsed, Object searchDefaultValue)
3. Hàm setComponentAsLoginUser()
/**
* Hàm thêm component là tên đăng nhập không nhập trên giao diện
*
* @param label mô tả
* @param databaseFieldName tên cột tương ứng trong database
* @param useToSearch sử dụng để tìm kiếm
* @param searchMandatory Bắt buộc nhập khi tìm kiếm (Để lấy dữ liệu mới từ
* DB) ví dụ: date:and_mandatory:100 (kiểu thời gian, luôn bắt buộc nhập,
* không vượt quá khoảng 100 ngày) int:or_mandatory (kiểu số nguyên, chỉ bắt
* buộc nhập khi tất cả trường bắt buộc chưa có dữ liệu)
* @param isCollapsed Có ẩn cột trên table không
* @param searchDefaultValue Điều kiện tìm kiếm mặc định
* @param onlyView chỉ được xem bản ghi do mình tạo ra
* @param onlyEdit chỉ được sửa bản ghi do mình tạo ra
* @param popup Popup chọn người dùng
* @param onlyViewGroup 0: được xem tất, 1: chỉ được xem bản ghi trong group của mình
* 2: chỉ được xem bản ghi từ group của mình trở xuống
* @param filterParentColumn Tên cột trong bảng của chức năng hiện tại của component cha khi filter
* @param filterChildColumn Tên cột trong bảng quan hệ cha con của component cha khi filter
* @since 18/11/2014 HienDM
*/
public void setComponentAsLoginUser(String label, String databaseFieldName, boolean useToSearch,
String searchMandatory, boolean isCollapsed, Object searchDefaultValue, boolean onlyView,
boolean onlyEdit, PopupSingleAction popup, String filterParentColumn, String filterChildColumn,
int onlyViewGroup
)
4. Hàm addCheckBoxToForm()
/**
* Hàm thêm checkbox vào giao diện nhập
*
* @param label mô tả
* @param component thành phần trên giao diện
* @param databaseFieldName tên cột tương ứng trong database
* @param dataType loại dữ liệu
* @param isMandatory bắt buộc nhập
* @param dataLength độ dài dữ liệu
* @param format kiểm tra định dạng dữ liệu:
* ví dụ đơn giản: int,long,float,double,email
* ví dụ nâng cao: int>=-1 : kiểu số nguyên lớn hơn -1
* float:2>=0.5 : kiểu số thực 2 chữ số thập phân sau dấu phẩy lớn hơn hoặc bằng 0.5
* @param caption mô tả thêm
* @param useToSearch sử dụng để tìm kiếm
* @param isPassword có phải password không
* @param searchMandatory Bắt buộc nhập khi tìm kiếm (Để lấy dữ liệu mới từ DB)
* ví dụ: date:and_mandatory:100 (kiểu thời gian, luôn bắt buộc nhập, không vượt quá khoảng 100 ngày)
* int:or_mandatory (kiểu số nguyên, chỉ bắt buộc nhập khi tất cả trường bắt buộc chưa có dữ liệu)
* @param isCollapsed Có ẩn cột trên table không
* @param searchDefaultValue Điều kiện tìm kiếm mặc định
* @param visibleAdd Hiển thị tại màn hình thêm mới
* @param visibleEdit Hiển thị tại màn hình sửa
* @param enableAdd Hiệu lực tại màn hình thêm mới
* @param enableEdit Hiệu lực tại màn hình sửa
* @param enable mô tả trạng thái checkbox enable
* @param disable mô tả trạng thái checkbox disable
* @since 18/11/2014 HienDM
*/
public void addCheckBoxToForm(String label, CheckBox component,
String databaseFieldName, String dataType,
boolean isMandatory, Integer dataLength, String format, String caption,
boolean useToSearch, boolean isPassword, String searchMandatory, boolean isCollapsed,
Object searchDefaultValue, boolean visibleAdd, boolean visibleEdit, boolean enableAdd,
boolean enableEdit, String enable, String disable)
5. Hàm addComboBoxToForm() dữ liệu query từ database
/**
* Hàm thêm combobox dữ liệu từ database vào giao diện nhập
*
* @param label mô tả
* @param component thành phần trên giao diện
* @param databaseFieldName tên cột tương ứng trong database
* @param dataType loại dữ liệu
* @param isMandatory bắt buộc nhập
* @param dataLength độ dài dữ liệu
* @param format kiểm tra định dạng dữ liệu:
* ví dụ đơn giản: int,long,float,double,email
* ví dụ nâng cao: int>=-1 : kiểu số nguyên lớn hơn -1
* float:2>=0.5 : kiểu số thực 2 chữ số thập phân sau dấu phẩy lớn hơn hoặc bằng 0.5
* @param caption mô tả thêm
* @param useToSearch sử dụng để tìm kiếm
* @param isPassword có phải password không
* @param searchMandatory Bắt buộc nhập khi tìm kiếm (Để lấy dữ liệu mới từ DB)
* ví dụ: date:and_mandatory:100 (kiểu thời gian, luôn bắt buộc nhập, không vượt quá khoảng 100 ngày)
* int:or_mandatory (kiểu số nguyên, chỉ bắt buộc nhập khi tất cả trường bắt buộc chưa có dữ liệu)
* @param isCollapsed Có ẩn cột trên table không
* @param searchDefaultValue Điều kiện tìm kiếm mặc định
* @param visibleAdd Hiển thị tại màn hình thêm mới
* @param visibleEdit Hiển thị tại màn hình sửa
* @param enableAdd Hiệu lực tại màn hình thêm mới
* @param enableEdit Hiệu lực tại màn hình sửa
* @param query câu lệnh truy vấn cơ sở dữ liệu
* @param lstParameter danh sách tham số cho câu lệnh truy vấn
* @param cboTableName tên bảng dữ liệu
* @param idColumn trường dữ liệu id của combobox trong database
* @param idType kiểu dữ liệu id của combobox trong database
* @param nameColumn tên dữ liệu trong combobox
* @param defaultValue id dữ liệu mặc định
* @param defaultCaption tên dữ liệu mặc định
* @param isRefresh cập nhật dữ liệu sau khi thêm, sửa, xóa
* @param isMultiLanguage đa ngôn ngữ
* @param filterParentColumn trường dữ liệu dùng để filter của component cha
* @param filterChildColumn trường dữ liệu dùng đề filter của component con
* @since 18/11/2014 HienDM
*/
public void addComboBoxToForm(String label, ComboBox component,
String databaseFieldName, String dataType,
boolean isMandatory, Integer dataLength, String format, String caption,
boolean useToSearch, boolean isPassword, String searchMandatory, boolean isCollapsed,
Object searchDefaultValue, boolean visibleAdd, boolean visibleEdit, boolean enableAdd,
boolean enableEdit, String query, List lstParameter,
String cboTableName, String idColumn, String idType, String nameColumn,
String defaultValue, String defaultCaption, boolean isRefresh, boolean isMultiLanguage,
String filterParentColumn, String filterChildColumn
)
6. Hàm addComboBoxToForm() dữ liệu fix cứng
/**
* Hàm thêm combobox dữ liệu fix cứng vào giao diện nhập
*
* @param label mô tả
* @param component thành phần trên giao diện
* @param databaseFieldName tên cột tương ứng trong database
* @param dataType loại dữ liệu
* @param isMandatory bắt buộc nhập
* @param dataLength độ dài dữ liệu
* @param format kiểm tra định dạng dữ liệu:
* ví dụ đơn giản: int,long,float,double,email
* ví dụ nâng cao: int>=-1 : kiểu số nguyên lớn hơn -1
* float:2>=0.5 : kiểu số thực 2 chữ số thập phân sau dấu phẩy lớn hơn hoặc bằng 0.5
* @param caption mô tả thêm
* @param useToSearch dùng để tìm kiếm
* @param isPassword có phải password không
* @param searchMandatory Bắt buộc nhập khi tìm kiếm (Để lấy dữ liệu mới từ DB)
* ví dụ: date:and_mandatory:100 (kiểu thời gian, luôn bắt buộc nhập, không vượt quá khoảng 100 ngày)
* int:or_mandatory (kiểu số nguyên, chỉ bắt buộc nhập khi tất cả trường bắt buộc chưa có dữ liệu)
* @param isCollapsed Có ẩn cột trên table không
* @param searchDefaultValue Điều kiện tìm kiếm mặc định
* @param visibleAdd Hiển thị tại màn hình thêm mới
* @param visibleEdit Hiển thị tại màn hình sửa
* @param enableAdd Hiệu lực tại màn hình thêm mới
* @param enableEdit Hiệu lực tại màn hình sửa
* @param data dữ liệu fix cứng
* @param defaultValue id dữ liệu mặc định
* @param defaultCaption tên dữ liệu mặc định
* @since 18/11/2014 HienDM
*/
public void addComboBoxToForm(String label, ComboBox component,
String databaseFieldName, String dataType,
boolean isMandatory, Integer dataLength, String format, String caption,
boolean useToSearch, boolean isPassword, String searchMandatory, boolean isCollapsed,
Object searchDefaultValue, boolean visibleAdd, boolean visibleEdit, boolean enableAdd,
boolean enableEdit, Object[][] data, String defaultValue, String defaultCaption
)
7. Hàm addSinglePopupToForm()
/**
* Hàm thêm Single popup dữ liệu vào giao diện nhập
*
* @param label mô tả
* @param databaseFieldName tên cột tương ứng trong database
* @param dataType loại dữ liệu
* @param isMandatory bắt buộc nhập
* @param dataLength độ dài dữ liệu
* @param format kiểm tra định dạng dữ liệu:
* ví dụ đơn giản: int,long,float,double,email
* ví dụ nâng cao: int>=-1 : kiểu số nguyên lớn hơn -1
* float:2>=0.5 : kiểu số thực 2 chữ số thập phân sau dấu phẩy lớn hơn hoặc bằng 0.5
* @param caption mô tả thêm
* @param useToSearch dùng để tìm kiếm
* @param searchMandatory Bắt buộc nhập khi tìm kiếm (Để lấy dữ liệu mới từ DB)
* ví dụ: date:and_mandatory:100 (kiểu thời gian, luôn bắt buộc nhập, không vượt quá khoảng 100 ngày)
* int:or_mandatory (kiểu số nguyên, chỉ bắt buộc nhập khi tất cả trường bắt buộc chưa có dữ liệu)
* @param isCollapsed Có ẩn cột trên table không
* @param searchDefaultValue Điều kiện tìm kiếm mặc định
* @param visibleAdd Hiển thị tại màn hình thêm mới
* @param visibleEdit Hiển thị tại màn hình sửa
* @param enableAdd Hiệu lực tại màn hình thêm mới
* @param enableEdit Hiệu lực tại màn hình sửa
* @param popup popup tìm kiếm dữ liệu
* @param column số cột trình bày giao diện
* @param defaultValue id dữ liệu mặc định
* @param defaultCaption tên dữ liệu mặc định
* @param idColumn trường dữ liệu id của combobox trong database
* @param nameColumn tên dữ liệu trong combobox
* @param cboTableName tên bảng dữ liệu
* @param filterParentColumn trường dữ liệu dùng để filter của component cha
* @param filterChildColumn trường dữ liệu dùng để filter của component con
* @since 18/11/2014 HienDM
*/
public void addSinglePopupToForm(String label, String databaseFieldName, String dataType,
boolean isMandatory, Integer dataLength, String format, String caption,
boolean useToSearch, String searchMandatory, boolean isCollapsed,
Object searchDefaultValue, boolean visibleAdd, boolean visibleEdit, boolean enableAdd,
boolean enableEdit, PopupSingleAction popup, Integer column, String defaultValue,
String defaultCaption, String idColumn, String nameColumn, String cboTableName,
String filterParentColumn, String filterChildColumn
)
8. Hàm addMultiPopupToForm()
/**
* Hàm thêm popup multi choice vào giao diện nhập
*
* @param label mô tả
* @param isMandatory bắt buộc nhập
* @param isCollapsed Có hiển thị trên table không
* @param popup popup multi choice
* @param column số cột trình bày giao diện
* @param lstAttachField danh sách trường dữ liệu đính kèm
* @param tableName tên bảng dữ liệu
* @param idPopup khóa chính của bảng đính kèm
* @param idConnect khóa chính của bảng cha
* @param idFieldDB khóa chính của bảng quan hệ nhiều nhiều
* @param sequenceName sequence của bảng đính kèm
* @param filterParentColumn trường dữ liệu dùng để filter của component cha
* @param filterChildColumn trường dữ liệu dùng để filter của component con
* @param filterTableName tên bảng nối filter cha và filter con
* @since 05/01/2015 HienDM
*/
public void addMultiPopupToForm(String label, boolean isMandatory, boolean isCollapsed,
PopupMultiAction popup, Integer column, List<List> lstAttachField, String tableName,
String idPopup, String idConnect, String idFieldDB, String sequenceName,
String filterParentColumn, String filterChildColumn, String filterTableName
)
9. Hàm addUploadFieldToForm()
/**
* Hàm thêm File vào giao diện nhập
*
* @param label mô tả
* @param component thành phần trên giao diện
* @param databaseFieldName tên cột tương ứng trong database
* @param dataType loại dữ liệu
* @param isMandatory bắt buộc nhập
* @param dataLength độ dài tên file
* @param format kiểm tra định dạng dữ liệu:
* ví dụ đơn giản: int,long,float,double,email
* ví dụ nâng cao: int>=-1 : kiểu số nguyên lớn hơn -1
* float:2>=0.5 : kiểu số thực 2 chữ số thập phân sau dấu phẩy lớn hơn hoặc bằng 0.5
* @param caption mô tả thêm
* @param isCollapsed Có hiển thị trên table không
* @param isPicture có phải là ảnh không
* @param fileDirectory Đường dẫn thư mục chứa file
* @param maxFileSize kích thước file lớn nhất (MByte)
* @since 18/11/2014 HienDM
*/
public void addUploadFieldToForm(String label, UploadField component,
String databaseFieldName, String dataType,
boolean isMandatory, Integer dataLength, String format, String caption,
boolean isCollapsed, String fileDirectory, boolean isPicture, int maxFileSize)
Bình luận