1. 數(shù)據(jù)庫定義
- 1.1 用戶定義
var userSchema = new Schema({
username: String,
password: String,
number:Number,//學(xué)號(hào)
type:Number,//類型 0 學(xué)生 1 老師
status: Number,//狀態(tài) 0 未上線 1 上線 2 考試中 3 考務(wù)完畢
grade:Number,
meta: {
updateAt: {type:Date, default: Date.now()},
createAt: {type:Date, default: Date.now()}
}
});
- 1.2 題目定義
var questionSchema = new Schema({
number: Number,//編號(hào)
content: String,
score:Number,//分值
answer:String,//正確答案
meta: {
updateAt: {type:Date, default: Date.now()},
createAt: {type:Date, default: Date.now()}
}
});
- 1.3 答題定義
var answerSchema = new Schema({
userId: {type: ObjectId, ref: 'User'},
questionId: {type: ObjectId, ref: 'Question'},
answerCtn: String,//回答內(nèi)容
score: Number//得分
});
2. 數(shù)據(jù)庫操作
2.1概述
- 教師端:
- 學(xué)生管理噪叙,題目管理(包含添加和刪除)
- 學(xué)生狀態(tài)實(shí)時(shí)顯示(紅色:已登錄伞芹;灰色:未登錄;藍(lán)色:考試中篱蝇;綠色:已交卷)
- 學(xué)生答題情況顯示
- 學(xué)生端:
- 題目顯示
- 答卷情況更新
2.2后端代碼
2.2.1 學(xué)生端
- 獲取問題列表,形成問卷(數(shù)據(jù)庫查找-find())
exports.getQuestionList=function(data,cb){
//find()就是找到所有符合的記錄
Question.find()
.exec(function(err, docs) {
var questionList=new Array();
for(var i=0;i<docs.length;i++) {
questionList.push(docs[i].toObject());
}
cb(true, questionList);
console.log(questionList);
});
};
- 答案保存(數(shù)據(jù)庫保存及更新-update())
exports.addAnswer = function (data, cb) {
//查找之前是否有答題記錄
Answer.findOne({"userId": data.userId, "questionId": data.questionId}, function (err, doc) {
//沒有相關(guān)記錄沪铭,添加記錄
if(doc === null) {
var answer = new Answer({
userId: data.userId,
questionId: data.questionId,
answerCtn: data.content
});
answer.save(function (err, doc) {
if(err) {
entries.code = 99;
}
cb(true, entries);
});
}
//找到髓迎,更新記錄
else {
Answer.update({"userId": data.userId, "questionId": data.questionId}, {$set :{
"answerCtn": data.content
}
}, function(error, result){
if(error) {
entries.code = 99;
console.log("update error");
}
cb(true, entries);
})
}
})
};
2.3教師端
教師端的添加學(xué)生和問題與學(xué)生答案添加類似,因此不再贅述
- 刪除學(xué)生
exports.deleteQuestion=function (data,cb) {
Question.findById(data, function (err, doc) {
if (doc) {
doc.remove(function (err, doc) {
if (err) {
entries.msg = err;
cb(false,entries);
}else{
entries.msg = '刪除成功禁偎!';
cb(true,entries);
}
});
} else {
next(err);
}
});
};
3. 前端頁面渲染
3.1效果
- 教師端
3.1.1 學(xué)生狀態(tài)信息
此時(shí)Mia進(jìn)入腿堤,Cindy在答題,Kimi已經(jīng)答完題目如暖,其他人未登錄
3.1.2 學(xué)生答題情況
- 學(xué)生端
3.1.3 學(xué)生答題
3.2 渲染代碼
數(shù)據(jù)訪問方法有兩種:
- 前端通過路由接口直接訪問(以學(xué)生答題為例)
- 后端調(diào)用函數(shù)訪問得到數(shù)據(jù)渲染到前端(以獲取答卷列表為例子)
- 學(xué)生答題
使用mongoose的populate來查詢r(jià)ef的文檔笆檀,使用Population可以實(shí)現(xiàn)在一個(gè) document 中填充其他 collection(s) 的 document(s)。
exports.getAnswer = function (data, cb) {
Answer.find({userId:data})
.populate('questionId')
.exec(function(err, docs) {
if(docs!==null) {
var AnswerList = new Array();
for (var i = 0; i < docs.length; i++) {
AnswerList.push(docs[i].toObject());
}
cb(true, AnswerList);
}
});
};
路由
router.get('/:id', function(req, res, next) {
var id = req.params.id;
dbHelper.getInfor(id,function (success, doc1) {
dbHelper.getAnswer(id,function (success, doc) {
res.render('information', {
user: req.session.user,
student: doc1, //得到學(xué)生信息
data: doc, //學(xué)生答題情況
layout: 'main'
});
});
});
});
前端
<div class="info">
<div class="basicInfo">
<div class="name">姓名:{{student.username}} </div>
<div class="number">學(xué)號(hào):{{student.number}} </div>
<p class="id">{{student._id}}</p>
</div>
<table class="table">
<thead>
<tr>
<th>題號(hào)</th>
<th>題目?jī)?nèi)容</th>
<th>回答內(nèi)容</th>
</tr>
</thead>
<tbody>
{{#each data}}
<tr>
<td>{{questionId.number}}</td>
<td>{{questionId.content}}</td>
<td>{{answerCtn}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
- 獲取答卷列表
路由
router.post('/getQuestionList', function(req, res, next) {
dbHelper.getQuestionList(req.body, function (success, data) {
res.send(data);
})
});
路由引入
var urlGetQuestionList = "/getQuestionList";
數(shù)據(jù)傳輸
//成功后調(diào)用cbInitQuestion()函數(shù)
function initQuestionList() {
var jsonData = JSON.stringify({});
postData(urlGetQuestionList, jsonData, cbInitQuestion);
}
回調(diào)函數(shù)
function cbInitQuestion(result) {
var question;
var questionList="";
//將列表渲染到前端
for(var i=0;i<result.length;i++){
question = $.format(QUESTION_DETAIL,result[i].number,result[i].content,result[i].score,result[i]._id);
questionList+=question;
}
$("#question-table").append(questionList);
}