考試系統(tǒng)之mongodb相關(guān)操作

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概述
  • 教師端:
  1. 學(xué)生管理噪叙,題目管理(包含添加和刪除)
  2. 學(xué)生狀態(tài)實(shí)時(shí)顯示(紅色:已登錄伞芹;灰色:未登錄;藍(lán)色:考試中篱蝇;綠色:已交卷)
  3. 學(xué)生答題情況顯示
  • 學(xué)生端:
  1. 題目顯示
  2. 答卷情況更新
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)答完題目如暖,其他人未登錄


學(xué)生信息.png
3.1.2 學(xué)生答題情況
Paste_Image.png
  • 學(xué)生端
3.1.3 學(xué)生答題
答題.png
3.2 渲染代碼

數(shù)據(jù)訪問方法有兩種:

  1. 前端通過路由接口直接訪問(以學(xué)生答題為例)
  2. 后端調(diào)用函數(shù)訪問得到數(shù)據(jù)渲染到前端(以獲取答卷列表為例子)
  1. 學(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);
}
演示

github源碼
在線代碼演示

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盒至,一起剝皮案震驚了整個(gè)濱河市酗洒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枷遂,老刑警劉巖樱衷,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異酒唉,居然都是意外死亡矩桂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門黔州,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耍鬓,“玉大人,你說我怎么就攤上這事流妻∩瘢” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵绅这,是天一觀的道長(zhǎng)涣达。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么度苔? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任匆篓,我火速辦了婚禮,結(jié)果婚禮上寇窑,老公的妹妹穿的比我還像新娘鸦概。我一直安慰自己,他們只是感情好甩骏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布窗市。 她就那樣靜靜地躺著,像睡著了一般饮笛。 火紅的嫁衣襯著肌膚如雪咨察。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天福青,我揣著相機(jī)與錄音摄狱,去河邊找鬼。 笑死无午,一個(gè)胖子當(dāng)著我的面吹牛媒役,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宪迟,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼刊愚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了踩验?” 一聲冷哼從身側(cè)響起鸥诽,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎箕憾,沒想到半個(gè)月后牡借,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袭异,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年钠龙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片御铃。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碴里,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出上真,到底是詐尸還是另有隱情咬腋,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布睡互,位于F島的核電站根竿,受9級(jí)特大地震影響陵像,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寇壳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一醒颖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壳炎,春花似錦泞歉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撒汉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涕滋,已是汗流浹背睬辐。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宾肺,地道東北人溯饵。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锨用,于是被迫代替她去往敵國和親丰刊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容