1. 程式人生 > >基於Express+mongoose搭建的學生管理系統

基於Express+mongoose搭建的學生管理系統

上一週學了下mongoose,雖然學了點皮毛,但還是想寫寫總結總結,這也是我的第一篇技術部落格。還是蠻開心的,happy~~來,切入正題!專案原始碼我會放在github上。 github 地址

程式碼目錄

secondPost

有些東西可根據自己喜好設定,並非必須。

建立並初始化目錄

$ mkdir student_manage
$ cd student_manage
$ npm init

第三方模組安裝

1. Express

1.1 Express 基於 Node.js 平臺,快速、開放、極簡的 web 開發框架。
 Express 4.x API 中文手冊 安裝如下:

$ npm install express --save

1.2 body-parser用於解析客戶端請求的body中的內容,內部使用JSON編碼處理,url編碼處理以及對於檔案的上傳處理。安裝如下:

$ npm install body-parser --save

2. mongoose

2.1  mongoose是在node.js非同步環境下對mongodb進行便捷操作的物件模型工具。
mongoose文件 安裝如下:

$ npm install mongoose --save

開始寫程式碼咯~~

當然在專案開始前要確定電腦是否安裝mongoDB 

下載好具體怎麼配置還請問度娘或Google吧,本文不做介紹了哈。注意:安裝完mongoDB的時候進行專案時要把lib目錄下的mongod伺服器開啟哈~~

先展示下最終實現的專案效果,以防大家心裡有數。

首頁
首頁

新增頁
新增頁

修改頁
修改頁

前臺具體程式碼就不列出來,比較簡單,為了節約時間,就使用bootstrap進行快速生成,當然大家可以進行美化。

核心程式碼(敲黑板~~~)

  1. mydb.js 對資料庫進行連線
    //引入mongoose模組
var mongoose=require('mongoose')

//資料庫連線地址  連結到myStudent資料庫
var DB_URL='mongodb://localhost:27017/myStudent'
//資料庫連線
mongoose.connect(DB_URL)

//連線成功終端顯示訊息
mongoose.connection.on('connected'
,function () { console.log('mongoose connection open to '+DB_URL) }) //連線失敗終端顯示訊息 mongoose.connection.on('error',function () { console.log('mongoose error ') }) //連線斷開終端顯示訊息 mongoose.connection.on('disconnected',function () { console.log('mongoose disconnected') }) //建立一個Schema 每一個schema會一一對應mongo中的collection var schema=mongoose.Schema //例項化一個Schema var studentSchema=new schema( { //設定studentSchema資訊的資料格式 name:{type:String}, sex:{type:String}, age:{type:Number}, phone:{type:String}, email:{type:String}, other:{type:String}, }, //{versionKey: false}是幹嘛用?如果不加這個設定,我們通過mongoose第一次建立某個集合時, // 它會給這個集合設定一個versionKey屬性值,我們不需要,所以不讓它顯示 { versionKey:false } ) //生成一個具體student的model並匯出 //第一個引數是集合名,在資料庫中會自動加s //把Model名字字母全部變小寫和在後面加複數s var student=mongoose.model('student',studentSchema) //將Student的model匯出 module.exports=student

裡面的程式碼我已逐條進行註釋。有幾個要說明的地方:1.可能大家看到Schema的時候有一點懵,不過他理解起來挺簡單的就像關係型資料庫裡面的表。定義可以這麼講:schema是mongoose裡會用到的一種資料模式,可以理解為表結構的定義;每個schema會對映到mongodb中的一個collection,它不具備操作資料庫的能力。2.生成一個student的model的時候,如果myStudent資料庫裡面沒有student(第一個引數的值)集合的話,系統會自動建立一個students的collection,注意在student後面加了s

  1. app.js
//匯入express模組
var expres=require('express')
var bodyParser=require('body-parser')
//匯入之前寫的mydb.js
var student=require('./mydb')

//呼叫函式, express例項化
var app=expres()

app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())

//處理靜態目錄
app.use(expres.static('www'))

// 允許跨域訪問///
app.all('/api/*', function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*')
    res.header('Access-Control-Allow-Headers', 'x-Request-with')
    res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
    res.header('X-Powered-By', '4.15.2')
    res.header('Content-Type', 'application/json;charset=utf-8')
    next()   //執行下一個中介軟體。
})

//首頁展示獲取資料
app.post('/index',function (req,res) {
    //mongoose 資料查詢
    student.find({}).exec(function (error,data) {
        if (error){
            console.log('資料獲取失敗'+error)
        }
        else{
            res.json({
                status:'y',
                message:'查詢成功',
                //傳遞返回的資料
                data:data
            })
        }
    })
})

//修改頁面 獲取資料
app.post('/modify',function (req,res) {
    //mongoose根據條件進行查詢
    student.find({_id: req.body.id}).exec(function (error,data) {
        console.log('2')
        if (error){
            console.log('資料獲取失敗'+error)
        }
        else{
            console.log(data)
            res.json({
                status:'y',
                message:'查詢成功',
                data:data
            })
            console.log(4)
        }
    })
})

//修改提交修改資料庫
app.post('/modifyStu',function (req,res) {
    console.log('1')
    console.log(req.body)
    //查詢的條件
    var whereStr={_id:req.body.id}
    //更新的內容
    var updateStr={
        $set:{
            name:req.body.name,
            sex:req.body.sex,
            age: req.body.age,
            phone:req.body.phone,
            email:req.body.email,
            other:req.body.other,

        }
    }
    //對資料庫進行更新
    student.update(whereStr,updateStr,function (error) {
        if (error){
            console.log('資料修改失敗:'+error)
            res.json({
                status:'y',
                message:'修改失敗',
                data:req.body
            })
        }
        else{
            console.log('資料修改成功')
            res.json({
                status:'y',
                message:'修改成功',
                data:req.body
            })
        }
    })
})

//刪除資料庫其中的項
app.post('/del',function (req,res) {
    //mongoose根據指定條件進行刪除
    student.remove({_id: req.body.id},function(error){
        if (error){
            console.log('資料獲取失敗'+error)
            res.json({
                status:'y',
                message:'刪除不成功',
            })
        }
        else{
            res.json({
                status:'y',
                message:'刪除成功',
            })
        }
    })
})

//導航欄search操作
app.post('/findName',function (req,res) {
    console.log(req.body.searchName)
    student.find({name: req.body.searchName}).exec(function (error,data) {
        if (error){
            console.log('查詢失敗'+error)
            res.json({
                status:'y',
                message:'查詢失敗',
            })
        }
        else{
            res.json({
                status:'y',
                message:'查詢成功',
                data:data
            })
        }
    })
})

//新增資料庫操作
app.post('/addStu',function (req,res) {
    console.log(req.body)
    //例項化一個student
    var newStu=new student({
        name:req.body.name,
        sex:req.body.sex,
        age:req.body.age,
        phone:req.body.phone,
        email:req.body.email,
        other:req.body.other,

    })
    //對例項化的內容進行儲存
    newStu.save(function (error) {
        if (error){
            console.log('資料新增失敗:'+error)
            res.json({
                status:'y',
                message:'新增失敗',
                data:req.body
            })
        }
        else {
            console.log('資料新增成功')
            res.json({
                status:'y',
                message:'新增成功',
                data:req.body
            })
        }
    })
})

//伺服器監聽埠
app.listen(3000,()=>{
    console.log('node is ok')
})

到處伺服器搭建完成,接下來就是對各個js程式碼進行操作,ajax獲取表單資料請求伺服器,ajax獲取位址列請求伺服器等等。然後ajax在接收到伺服器返回的資料,對此進行渲染到前臺頁面,此專案我用的是 artTemplate 進行模板渲染。

就舉一個栗子吧~~

  1. 新增頁的 addAjax.js

$(function () {

    //新增表單驗證方法   手機號的驗證
    $.validator.addMethod('isPhone',function (value,ele) {
        var length=value.length
        var reg=/^1[34578]\d{9}$/
        if (length >= 11 && reg.test(value)){
            return true
        }
        else {
            return false
        }
    })

    //對錶單進行驗證
    $('#addForm').validate({
        debug:true,
        //驗證的規則
        rules:{
            name:{
                required:true,
                minlength:3
            },
            age:{
                required:true
            },
            phone:{
                required:true,
                isPhone:true
            },
            email:{
                required:true,
                email:true
            }
        },
        //錯誤的提示資訊
        messages:{
            name:{
                required:'姓名不能為空',
                minlength:'姓名不能少於3位'
            },
            age:{
                required:'年齡不能為空'
            },
            phone:{
                required:'手機號不能為空',
                isPhone:'手機號格式錯誤'
            },
            email:{
                required:'郵箱不能為空',
                email:'郵箱格式錯誤'
            }
        },
        //正確時執行的函式
        submitHandler:function (form) {
            //ajax請求
            $.ajax({
                type:'post',
                url:'/addStu',
                dataType:'json',
                //表單資料序列化
                data:$(form).serialize(),
                //ajax請求成功操作
                success:function (res) {
                    $('.modal-body').text(res.message)
                    //顯示出模態框
                    $('.modal').modal('show').on('hidden.bs.modal',function () {
                        if (res.message == '新增成功'){
                            location.href='index.html'
                        }
                    })
                },
                //ajax請求失敗操作
                error:function (jqXHR) {
                    console.log(jqXHR.status)
                }
            })
        },

    })
})

表單驗證我用了 jquery.validate.js

  1. 新增完畢,首頁進行渲染 index.html(部分)
{{each}}
    <tr>
        <td>{{$value.name}}</td>
        <td>{{$value.sex}}</td>
        <td>{{$value.age}}</td>
        <td>{{$value.phone}}</td>
        <td>{{$value.email}}</td>
        <td>
            <a href="/modify.html?id={{$value._id}}" class="modify" data-index="{{$value._id}}">修改</a>
            <a href="" class="del" data-index="{{$value._id}}">刪除</a>
        </td>
    </tr>
    {{/each}}
  1. 首頁的 indexAjax.js(部分)
$(function () {
    $.ajax({
        type:'post',
        url:'/index',
        success:function (res) {
            //進行模板渲染
            var strHtml=template('showStu',res.data)
            $('#tb').html(strHtml)

            ......程式碼有點長就不放了哈~~........

結尾

夜已深。不知不覺寫這個文章也花了挺長時間的,哈哈哈,不過自己開心就行~~ 自己在做這個專案的時候,以為會很快搞完,但是還是遇到了問題,哎,糾結了好久,現在也沒得出個答案,後來用了另一種的解決方法,感覺有點像投機取巧,但好像也不能怎麼說,哈哈…個人技術水平真的很渣,寫文章一方面是分享,一方面是再次重溫自己的思路。請勿噴哈~~自己的第一篇技術部落格,寫的有點匆忙,不過還是希望可以給大家帶來幫助。
      
      
      
            於 廈門高崎新村 自己的小屋