a. Selectors
id #
Trả về một phần tử của mảng: Array <Element>. Nó tƣơng ứng với một phần tử duy nhất đƣợc gán bởi thuộc tính id. Nếu id chứa các ký tự nhƣ dấu chấm (.) hoặc 2 dấu [] thì chúng phải thêm 2 dấu ngạch chéo (\\) vào trƣớc các ký tự đó.
Nếu là $("#some.id") thì phải viết thành $("#some\\.id") Nếu là $("#some[id]") thì phải viết thành $("#some\\[id]\\")
element
Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử với tên đƣợc gán.
.class
Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử với tên lớp.
Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử.
:contains(text)
Kiểu trả về: Array<Element(s). Tƣơng ứng với các phần tử chứa nội dung văn bản.
Ví dụ: Gạch chân tất cả các thẻ “div” có chứa từ “John”. $("div:contains('John')").css("text-decoration", "underline");
:empty
Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử không có phần tử con
Ví dụ: Chèn xâu “Không có nội dung” màu đỏ vào các thẻ “td” không có phần tử con.
$("td:empty").text("Không có nội dung!").css('color','red');
:has(selector)
Kiểu trả về: Array<Element(s). Tƣơng ứng với các phần tử bao gồm ít nhất một phần tử phù hợp với định danh selector.
Ví dụ: Đặt cỡ chữ là 30px cho đoạn văn có nằm trong các thẻ “div” có chứa thẻ “p”.
$("div:has(p)").css("font-size", "30px");
:parent
Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử là cha (chứa các phần tử con, gồm cả phần tử văn bản).
b. Các thuộc tính (Attributes) addClass (class)
Kiểu trả về: jQuery. Thêm các class đã xác định vào mỗi tập phần tử phù hợp. Nếu có thêm nhiều class thì các class đƣợc cách nhau bởi khoảng trắng.
Ví dụ: Thêm class “Maudo” vào các thẻ p. $("p").addClass("Maudo");
removeClass (class)
Kiểu trả về: jQuery. Loại bỏ tất cả hoặc các class đã xác định khỏi tập phần tử phù hợp.
Ví dụ: Loại bỏ class “Maudo” khỏi các thẻ p. $("p").removeClass("Maudo");
toggleClass (class)
Kiểu trả về: jQuery. Thêm class nếu class chƣa tồn tại hoặc loại bỏ nếu class đã tồn tại.
Ví dụ: Thêm class “Maudo” vào thẻ p nếu class “Maudo” chƣa tồn tại trong thẻ p hoặc loại bỏ class “Maudo” khỏi thẻ p nếu nó tồn tại.
$("p").toggleClass("Maudo");
html()
Kiểu trả về: String. Lấy nội dung html (innerHTML) của phần tử.
Ví dụ: Mỗi khi click vào thẻ p lấy nội dung html của thẻ p đó và thông báo nội dung lấy đƣợc.
$("p").click(function() {alert($(this).html())});
text()
Kiểu trả về: String. Lấy nội dung text (innerText) của phần tử.
Ví dụ: Mỗi khi click vào thẻ p lấy nội dung text của thẻ p đó và thông báo nội dung lấy đƣợc.
$("p").click(function() {alert($(this).html())});
c. Các sự kiện (Events) bind (type, [data], fn)
Bind một hander vào một sự kiện cho mỗi phần tử phù hợp, “type” là sự kiện, “[data]” (tùy chọn) thêm dữ liệu thông qua sự kiện, “fn” là hàm xử lý khi sự kiện đó xảy ra.
over, out là 2 hàm xử lý sự kiện. Hàm over xử lý khi chuột di chuyển trên phần tử, hàm out xử lý khi chuột rời khỏi phần tử
.click(): bắt sự kiện click tƣơng tự nhƣ sự kiện onClick() trong Dom. .submit(): dùng để submit các sự kiện javascript.
Ví dụ: Minh hoạ xử lý sự kiện submit khi thí sinh nhấn nút “Nộp bài” hoặc đã hết thời gian làm bài mà thí sinh chƣa nộp bài, hệ thống sẽ tự động nộp bài
function SubmitTestResult(){ var score = 0; total = 0;
$("input[type='hidden']").each(function(index) { total++;
var id=$(this).attr("id");
var correctValue = $(this).attr("value");
if($("input[type='radio'][name='" + id + "'][value='" + correctValue + "']").attr("checked")==true){ score++; } }); total = total - 2; $("input[type='hidden'][name='score']").attr("value",score); $("input[type='hidden'][name='total']").attr("value",total); if (_currentSeconds <= 0) { $("form[id='frmTest']").submit(); }else{
var cfm = confirm("Ban chac chan muon nop bai?"); if(cfm)
$("form[id='frmTest']").submit(); }}
CHƢƠNG 3. PHÁT TRIỂN HỆ THỐNG THỬ NGHIỆM 3.1. Thiết kế và thực hiện các mô đun chức năng
Mục tiêu của đề tài là xây dựng một hệ thống sát hạch trắc nghiệm bằng máy tính với quy mô nhỏ, gọn nhẹ, dễ dàng triển khai để bƣớc đầu khuyến khích phát triển chuẩn QTI. Trong phạm vi đề tài này chỉ tập trung vào xây dựng các chức năng xử lý bài thi của thí sinh. Các chức năng đƣợc xây dựng dựa trên chuẩn IMS và đặc tả IMS QTI. Thuật ngữ QTI gọi câu hỏi là item và bài trắc nghiệm là test. Hệ thống này không gồm công cụ soạn thảo câu hỏi trắc nghiệm theo chuẩn QTI và công cụ xây dựng bộ đề thi trắc nghiệm.
3.1.1. Đặc tả yêu cầu chức năng của mô đun xử lý bài thi
Trong hệ thống sát hạch trắc nghiệm bằng máy tính, module xử lý bài thi phải bao gồm các chức năng sau đây:
- Thí sinh đăng nhập hệ thống - Thí sinh lựa chọn môn thi
- Hệ thống lấy một bài thi từ kho dữ liệu ra và hiển thị
- Xử lý thao tác khi thí sinh làm bài thi và nộp bài hoặc hệ thống tự động thu khi hết giờ.
- Chấm điểm bài thi, lƣu giữ thông tin kết quả thi. - Thông báo kết quả thi cho sinh viên
3.1.2. Sơ đồ usecase của mô đun Xử lý bài thi
Hình 3.1: Sơ đồ usecase của mô đun Xử lý bài thi
Sau đây là các lƣợc đồ tuần tự thể hiện thao tác của các chức năng mô đun xử lý bài thi trong hệ thống tổ chức sát hạch trắc nhiệm bằng máy tính:
a. Đăng nhập hệ thống
Chức năng này cho phép thí sinh đăng nhập vào hệ thống. Mỗi thí sinh tham gia hệ thống sẽ đƣợc cấp 1 tài khoản truy cập duy nhất trên hệ thống, tài khoản này bao gồm các thông tin: mã số thí sinh và mật khẩu. Hệ thống sẽ kiểm tra thông tin mã số và mật khẩu thí sinh nhập, nếu nhập đúng hệ thống cho phép thí sinh chọn môn thi, ngƣợc lại hệ thống yêu cầu thí sinh đăng nhập lại. Đăng nhập Chọn môn thi Làm bài thi Nộp bài thi Xem kết quả thi Thí sinh
Hình 3.2: Lược đồ tuần tự Đăng nhập hệ thống
b. Chọn môn thi
Chức năng này cho phép thí sinh chọn môn thi. Sau khi thí sinh đăng nhập thành công vào hệ thống, hệ thống cho phép thí sinh chọn môn thi và thí sinh sẽ nhận đƣợc một bài thi ngẫu nhiên.
Hình 3.3: Lược đồ tuần tự Chọn môn thi
Thí sinh
Giao diện Hệ thống CSDL
1: Đăng nhập hệ thống 2: Chuyển dữ liệu đăng nhậpvào hệ thống
3: Truy vấn tài khoản đăng nhập 4: Lấy dữ liệu môn thi
của thí sinh Sai thông tin tài khoản
Thí sinh
Giao diện Hệ thống CSDL
1: Đăng nhập hệ thống 2: Chuyển dữ liệu đăng nhập vào hệ thống
3: Truy vấn tài khoản đăng nhập 4: Lấy dữ liệu môn thi
của thí sinh 5: Lấy dữ liệu các câu
hỏi của đề thi 6: Hiển thị thông tin bài thi
c. Làm bài thi
Chức năng này cho phép thí sinh làm bài thi trắc nghiệm. Thí sinh sau khi đăng nhập hệ thống sẽ nhận đƣợc bài thi ngẫu nhiên. Đề thi đƣợc trộn lẫn một cách ngẫu nhiên theo cách thức đảm bảo các đề thi có nội dung thi đầy đủ, không trùng lặp, khách quan. Hệ thống sẽ tự động tính thời gian làm bài của thí sinh.
d. Nộp bài thi
Chức năng này cho phép thí sinh nộp bài thi. Khi thí sinh nộp bài thi, hệ thống sẽ tự động chấm điểm và thông báo kết quả thi cho thí sinh. Trƣờng hợp hết thời gian làm bài (hệ thống tự động tính thời gian làm bài) mà thí sinh chƣa nộp bài, hệ thống sẽ tự động nộp bài và chấm điểm.
e. Xem kết quả thi
Chức năng này cho phép thí sinh xem kết quả thi. Sau khi thi xong, thí sinh có thể xem kết quả bài thi vừa làm. Hệ thống sẽ hiển thị kết quả bài thi cho thí sinh.
Hình 3.4: Lược đồ tuần tự của mô đun Xử lý bài thi
12: Làm bài thi
7: Bắt đầu làm bài Thí sinh
Giao diện Hệ thống CSDL
1: Đăng nhập hệ thống 2: Chuyển dữ liệu đăng nhập vào hệ thống
3: Truy vấn tài khoản đăng nhập 4: Lấy dữ liệu môn thi
của thí sinh 5: Lấy dữ liệu các câu
hỏi của đề thi 6: Hiển thị thông tin bài thi
8: Bắt đầu tính thời gian
9: Chuyển thông tin thời gian hệ thống 10: Tính thời gian làm bài
11: Hiển thị đề thi và thời gian còn lại
13: Kiểm tra thời gian đã hết
14: Đóng cửa sổ làm bài, yêu cầu nộp bài thi
15: Nộp bài thi 16: Chuyển dữ liệu vào hệ thống
17: Chấm bài thi 18: Lƣu kết quả vào CSDL
3.1.3. Thiết kế các mô đun chức năng theo khung kiến trúc MVC
Mô đun (phân hệ con) hỗ trợ xử lý bài thi của thí sinh đƣợc tập trung phát triển trƣớc (hệ thống này không gồm công cụ soạn thảo câu hỏi trắc nghiệm theo chuẩn QTI và công cụ xây dựng bộ đề thi trắc nghiệm). Hệ thống cho phép các thí sinh vào làm bài thi trên máy tính, các thông tin của hệ thống đƣợc đặt ở một server cố định (đƣợc đặt trong sƣu tập etest). Mỗi thí sinh sẽ đƣợc cấp 1 tài khoản truy cập duy nhất trên hệ thống, tài khoản này bao gồm các thông tin: mã số thí sinh và mật khẩu (dùng để đăng nhập). Thông tin tài khoản của thí sinh đƣợc lƣu ở tệp users.xml trong sƣu tập etest/users.
Khi thí sinh đăng nhập vào hệ thống (khung nhìn login.xql), hệ thống sẽ kiểm tra thông tin mã số và mật khẩu thí sinh nhập với thông tin thí sinh lƣu trong cơ sở dữ liệu (hàm check-login), nếu nhập đúng hệ thống cho phép thí sinh chọn môn thi (khung nhìn choose_test.xql), ngƣợc lại hệ thống yêu cầu thí sinh đăng nhập lại. Hệ thống còn cho phép lƣu lại mã số đăng nhập (hàm store-username)
Sau khi thí sinh chọn môn thi, hệ thống sẽ hiển thị một bài thi (test.xql), cấu trúc bài thi gồm tối đa 10 câu hỏi (có thể thay đổi thông số này). Các câu hỏi đƣợc chọn ngẫu nhiên trong kho câu hỏi của môn học, đảm bảo các đề thi có nội dung thi đầy đủ, không trùng lặp, khách quan (hàm random) và cho phép thí sinh làm bài thi. Hệ thống sẽ tự động tính lùi thời gian (hàm tiện ích javascript Count_down.js)
Khi thí sinh nộp bài, hệ thống tự động chấm điểm (dùng hàm SubmitTestResult). Hệ thống sẽ kiểm tra phƣơng án trả lời câu hỏi của thí sinh với phƣơng án trả lời đúng của câu hỏi lƣu trong cơ sở dữ liệu (các tệp .xml đƣợc biểu diễn bởi cặp thẻ <correctResponse> và </correctResponse>) Việc xử lý phƣơng án trả lời của thí sinh thông qua các file .xml nằm trong thẻ <responseProcessing template/>. Ví dụ với câu hỏi đơn lựa chọn, việc xử
lý phƣơng án trả lời của thí sinh thông qua file: <responseProcessing template="http://10.6.1.9/question/qti_v2p0/rptemplates/match_correct"/>
Sau đó hệ thống thông báo kết quả thi cho thí sinh (score.xql). Trƣờng hợp hết thời gian làm bài mà thí sinh chƣa nộp bài, hệ thống sẽ tự động nộp bài và chấm điểm.
Các mô đun chức năng xử lý bài thi cuả thí sinh đƣợc đặt trong một thƣ mục tên là etest.
Hệ thống phân cấp các sƣu tập nhƣ sau:
Mức (kèm đƣờng dẫn) Tên sƣu tập Mô tả
1 etest Sƣu tập gốc của ứng dụng
2 etest/users Dữ liệu về ngƣời sử dụng hệ thống: tên
đăng nhập, mật khẩu
2 etest/subjects Sƣu tập tất cả các môn học
3 etest/subjects/subject Sƣu tập của một môn học cụ thể, ở đây
subject là một tên môn học.
Bảng 3.1: Bảng hệ thống phân cấp các sưu tập
Danh sách các mô đun và các hàm:
STT Mô đun / hàm Mô tả
1 index.xql Lối vào chính
2 controller.xql Trình điều khiển chính
3 Views/ login.xql Khung nhìn đăng nhập lần đầu store-username() Lƣu username
check-login($username, $password)
Kiểm tra đăng nhập 4 Views/ logout.xql Khung nhìn đăng xuất
5 Js/Count_down.js Đồng hồ đếm lùi khi thí sinh nhận bài thi bắt đầu làm bài
6 Js/utilities-functions.js Các hàm tiện ích Java script 7 Views/choose_test.xql Hiển thị môn thi của thí sinh
STT Mô đun / hàm Mô tả
8 Models/ test.xql Trang thí sinh làm bài thi
random($max, $num) Chọn câu hỏi ngẫu nhiên trong kho câu hỏi
display_page($subject) Hiển thị bài thi của môn học $subject
9 Models/ score.xql Trang kết quả làm bài, hiển thị kết quả làm bài tới thí sinh
SubmitTestResult() Tính điểm bài thi
Bảng 3.2: Bảng danh sách các mô đun và các hàm
3.1.4. Các dạng câu hỏi trắc nghiệm QTI có thể thực hiện
Có rất nhiều kiểu câu hỏi có thể đƣợc sử dụng trong các hệ thống sát hạch trắc nghiệm bằng máy tính. IMS Global đƣa ra một đặc tả có tên IMS QTI (Question and Test Interoperability - khả năng tƣơng tác giữa câu hỏi và bài trắc nghiệm) cho các câu hỏi và bài trắc nghiệm. Các câu hỏi này đƣợc thể hiện dƣới các tệp XML (eXtensible Markup Language) mô tả dữ liệu và do đó dễ dàng đƣợc chia sẻ dữ liệu giữa các hệ thống. Trong phạm vi đề tài này, ta chỉ xét một vài kiểu câu hỏi do IMS đƣa ra:
a. Câu hỏi dạng “đúng hay sai”
Đây là dạng câu hỏi đơn giản nhất trong thi trắc nghiệm. Câu hỏi đƣợc đƣa ra dƣới dạng một mệnh đề với hai phƣơng án trả lời: hoặc đúng hoặc sai. Thí sinh trả lời bằng cách đánh dấu chọn.
Hình 3. : Câu hỏi dạng đúng - sai
b. Câu hỏi đơn lựa chọn
Câu hỏi: Các phƣơng thức trong Java chỉ có thể trả về các kiểu
dữ liệu nguyên thuỷ (boolean, char, int, float, double,…)? Đúng
Mô tả: Câu hỏi có kèm một danh sách các phƣơng án trả lời cho trƣớc trong đó có duy nhất một phƣơng án đúng.
Hình 3.6: Câu hỏi đơn lựa chọn
c. Câu hỏi lựa chọn nội tuyến
Mô tả: Điền vào chỗ trống trong đoạn văn bản bằng cách lựa chọn đáp án từ một danh sách cho trƣớc.
Hình 3.7: Câu hỏi lựa chọn nội tuyến
d. Câu hỏi dạng ghép cặp
Mô tả: Cho trƣớc hai danh sách, thí sinh cần ghép các mục trong danh sách này với các mục trong danh sách kia sao cho đúng ý nghĩa.
3.1.5. Triển khai chức năng xử lý bài thi trắc nghiệm bằng máy tính
Hình 3.9: Mô hình thiết kế mô đun Xử lý bài thi tại Khoa CNTT - Trường Cao đẳng Công nghệ Viettronics
3.2. Triển khai cơ sở dữ liệu eXist quản trị ngân hàng câu hỏi theo chuẩn QTI dƣới dạng các tệp XML QTI dƣới dạng các tệp XML
3.2.1. Các bƣớc chính
Mặc dù phân hệ quản lý ngân hàng câu hỏi không thuộc đề tài luận văn nhƣng để triển khai thử nghiệm chức năng phân phối bài thi đến thí sinh và xử lý quá trình làm bài thi ta cần cài đặt CSDL các câu hỏi và bài thi.
Bƣớc 1: Khởi động eXist Database Startup Bƣớc 2: Chạy ứng dụng eXist Admin Client:
index.xql che ck_logi n.xql login.xql (process logging in) choose_test.xql (1 test name is 1 collection in eXist DB) test.xql (choose random questions from the
chosen above)
score.xql
(calculate score base on data and user’s answers)
java script to show clock, auto submit when time out not valid
- Tạo các sƣu tập theo thiết kế. Phân quyền truy cập tƣơng ứng cho các vai trò ngƣời sử dụng.
- Nhập khẩu (Import) các tệp XML (ngân hàng câu hỏi của từng môn học) vào từng sƣu tập tƣơng ứng vừa tạo nói trên.
Bƣớc 3: Chạy file vấn tin: http://localhost:8080/exist/etest/index.xql
Để thử nghiệm, kho câu hỏi và bài thi gồm các môn học sau: Tin học đại cƣơng, Mạng máy tính và Internet, Bảng tính điện tử, Lập trình Java, Cấu trúc máy tính.
3.2.2. Các bƣớc để triển khai eXist a. Cài đặt eXist a. Cài đặt eXist
Tải gói cài đặt tại địa chỉ http://exist-db.org, phiên bản 1.4.2 (tên file eXist-setup-1.4.2-rev16251.jar)
Dành cho ngƣời mới bắt đầu, gói .jar (java archive) hỗ trợ giao diện đồ họa lúc cài đặt; tự động xác định đƣợc các thông số hệ thống (các biến môi trƣờng và biến đƣờng dẫn) cho eXist. Nó cũng tự động tạo ra các lối tắt trên màn hình sau khi cài đặt (cho hệ điều hành Windows hoặc Linux).
Sau khi tải về, để cài đặt thực hiện 1 trong 2 cách dƣới đây: 1. Kích đúp vào gói cài đặt:
eXist-setup-1.4.2-rev16251.jar (Windows và Mac)
2. Trong cửa sổ dòng lệnh của Windows hoặc cửa sổ shell của Unix, gõ câu lệnh java:
java -jar eXist-setup-1.4.2-rev16251.jar
Cài đặt eXist như một dịch vụ
Install eXist as Service: Sau khi cài đặt eXist thành công, có thể cài đặt eXist nhƣ một dịch vụ bằng cách chọn Install eXist as Service để eXist tự động chạy khi bật máy nhƣ một dịch vụ nền (background service). Sau đó, kích hoạt bằng công cụ “Service manager”.
b. Sử dụng eXist
Khởi động eXist Database
Sau khi cài đặt thành công, nếu không thay đổi gì trong quá trình cài đặt