入門級Node.js express服務端開發_Android簽到APP

1、APP原型

參考另外一篇博客:http://www.javashuo.com/article/p-tynjhsil-be.htmlgit

2、項目需求

爲簽到App提供登陸、註冊、請假,簽到等相關數據接口。github

3、項目結構

輸入圖片說明

4、數據庫設計

用到了Mongoose將實體類和數據庫對象一一對應起來,同時經過Mongoose操做數據庫也極爲簡單。 輸入圖片說明數據庫

###5、編寫相關實體類json

用戶
var userschema=new mongoose.Schema({
username:String,
password:String
});
簽到記錄
var signinschema=new mongoose.Schema({
user_name:String,
unique_id:String,/username+日期/
am_signin:String,
am_signout:String,
pm_signin:String,
pm_signout:String,
night_signout:String,
night_signin:String,
create_date:{type: Date, default: Date.now}
});
請假記錄
var holidayschema=new mongoose.Schema({
user_name:String,
begin_time:String,
end_time:String,
reason:String,
feedback:String
});api

6、路由控制

APP須要什麼樣的接口,在此文件裏配置,而後再在相應的控制器中寫相應的函數邏輯處理代碼。app

module.exports = function(app) {
  /*處理用戶登陸請求*/
  app.post('/phone_api/login',User.login);
  /*處理用戶登陸請求*/
  app.post('/phone_api/register',User.register);
  /*用戶提交請假請求*/
  app.post('/phone_api/add_holiday',Holiday.addHoliday);
  /*獲取用戶提交請假記錄*/
  app.post('/phone_api/get_holidays',Holiday.getHolidays);
  /*用戶簽到*/
  app.post('/phone_api/sign_in',Signin.signin);
  /*用戶簽到簽到記錄*/
  app.post('/phone_api/get_signins',Signin.getSignins);
};

7、主要代碼

7.一、用戶登陸數據庫設計

/*處理用戶登陸請求*/
exports.login=function(req,res){
    var username=req.body.username;
    var password=req.body.password;

    User.findOne({username:username}, function (err, docs) {
        if(err){
            res.json({"status":"error","msg":"error_system"});/*系統錯誤*/
        }else if(docs==null){
            res.json({"status":"error","msg":"error_username"});/*用戶名不存在*/
        } else {
            if(docs.password==password){
                res.json({"status":"success","msg":""});
            }
            else{
                res.json({"status":"error","msg":"error_password"});
            }
        }
    })
}

7.二、用戶簽到:主要判斷用戶點擊的按鈕,同時須要當前是否存在用戶簽到記錄,經過一個可預見性的Unique_id來實現。及用戶名加日期來限制該記錄當天的惟一性。mongoose

exports.signin=function(req,res){
    var unique_id=req.body.unique_id;
    var user_name=req.body.user_name;
    var type=req.body.type;
    var date=req.body.date;
    Signin.findOne({unique_id:unique_id}, function (err, docs) {
        if(err){
            res.json({"status":"error","msg":"error_system"});/*系統錯誤*/
        }else if(docs==null){
            /*如何沒有找到簽到記錄,那麼是當天第一次簽到*/
            var newSignin=new Signin();
            newSignin.unique_id=unique_id;
            newSignin.user_name=user_name;
            if(type=="am_signin"){
                newSignin.am_signin=date;
                newSignin.am_signout="0";
                newSignin.pm_signin="0";
                newSignin.pm_signout="0";
                newSignin.night_signin="0";
                newSignin.night_signout="0";
                newSignin.save(function(err){
                    if(err){
                        res.json({"status":"error","msg":"error_system"})
                    }else{
                        res.json({"status":"success","msg":""});
                    }
                });
            }else if(type=="am_signout"){
                newSignin.am_signin="0";
                newSignin.am_signout=date;
                newSignin.pm_signin="0";
                newSignin.pm_signout="0";
                newSignin.night_signin="0";
                newSignin.night_signout="0";
                newSignin.save(function(err){
                    if(err){
                        res.json({"status":"error","msg":"error_system"})
                    }else{
                        res.json({"status":"success","msg":""});
                    }
                });
            }else if(type=="pm_signin"){
                newSignin.am_signin="0";
                newSignin.am_signout="0";
                newSignin.pm_signin=date;
                newSignin.pm_signout="0";
                newSignin.night_signin="0";
                newSignin.night_signout="0";
                newSignin.save(function(err){
                    if(err){
                        res.json({"status":"error","msg":"error_system"})
                    }else{
                        res.json({"status":"success","msg":""});
                    }
                });
            }else if(type=="pm_signout"){
                newSignin.am_signin="0";
                newSignin.am_signout="0";
                newSignin.pm_signin="0";
                newSignin.pm_signout=date;
                newSignin.night_signin="0";
                newSignin.night_signout="0";
                newSignin.save(function(err){
                    if(err){
                        res.json({"status":"error","msg":"error_system"})
                    }else{
                        res.json({"status":"success","msg":""});
                    }
                });
            }else if(type=="night_signin"){
                newSignin.am_signin="0";
                newSignin.am_signout="0";
                newSignin.pm_signin="0";
                newSignin.pm_signout="0";
                newSignin.night_signin=date;
                newSignin.night_signout="0";
                newSignin.save(function(err){
                    if(err){
                        res.json({"status":"error","msg":"error_system"})
                    }else{
                        res.json({"status":"success","msg":""});
                    }
                });
            }else if(type=="night_signout"){
                newSignin.am_signin="0";
                newSignin.am_signout="0";
                newSignin.pm_signin="0";
                newSignin.pm_signout="0";
                newSignin.night_signin="0";
                newSignin.night_signout=date;
                newSignin.save(function(err){
                    if(err){
                        res.json({"status":"error","msg":"error_system"})
                    }else{
                        res.json({"status":"success","msg":""});
                    }
                });
            }
        } else {
            /*若是有記錄,只須要修改簽到記錄便可*/
            if(type=="am_signin"){
                /*修改簽到記錄*/
                if(docs.am_signin=="0"){
                    docs.am_signin=date;
                    docs.save(function(err){
                        if(err){
                            res.json({"status":"error","msg":"error_system"})
                        }else{
                            res.json({"status":"success","msg":""});
                        }
                    });
                }else{
                    /*若是有記錄,則表示已經簽到過了*/
                    res.json({"status":"error","msg":"already_signin"});
                }
            }else if(type=="am_signout"){
                if(docs.am_signout=="0"){
                    docs.am_signout=date;
                    docs.save(function(err){
                        if(err){
                            res.json({"status":"error","msg":"error_system"})
                        }else{
                            res.json({"status":"success","msg":""});
                        }
                    });
                }else{
                    /*若是有記錄,則表示已經簽到過了*/
                    res.json({"status":"error","msg":"already_signin"});
                }
            }else if(type=="pm_signin"){
                if(docs.pm_signin=="0"){
                    docs.pm_signin=date;
                    docs.save(function(err){
                        if(err){
                            res.json({"status":"error","msg":"error_system"})
                        }else{
                            res.json({"status":"success","msg":""});
                        }
                    });
                }else{
                    /*若是有記錄,則表示已經簽到過了*/
                    res.json({"status":"error","msg":"already_signin"});
                }
            }else if(type=="pm_signout"){
                if(docs.pm_signout=="0"){
                    docs.pm_signout=date;
                    docs.save(function(err){
                        if(err){
                            res.json({"status":"error","msg":"error_system"})
                        }else{
                            res.json({"status":"success","msg":""});
                        }
                    });
                }else{
                    /*若是有記錄,則表示已經簽到過了*/
                    res.json({"status":"error","msg":"already_signin"});
                }
            }else if(type=="night_signin"){
                if(docs.night_signin=="0"){
                    docs.night_signin=date;
                    docs.save(function(err){
                        if(err){
                            res.json({"status":"error","msg":"error_system"})
                        }else{
                            res.json({"status":"success","msg":""});
                        }
                    });
                }else{
                    /*若是有記錄,則表示已經簽到過了*/
                    res.json({"status":"error","msg":"already_signin"});
                }
            }else if(type=="night_signout"){
                if(docs.night_signout=="0"){
                    docs.night_signout=date;
                    docs.save(function(err){
                        if(err){
                            res.json({"status":"error","msg":"error_system"})
                        }else{
                            res.json({"status":"success","msg":""});
                        }
                    });
                }else{
                    /*若是有記錄,則表示已經簽到過了*/
                    res.json({"status":"error","msg":"already_signin"});
                }
            }
        }
    })
}

7.3 關於分頁獲取簽到記錄 sort按照id倒序排列,limit每頁顯示10條記錄,skip跳過多少條記錄。函數

/*得到用戶簽到記錄*/
exports.getSignins=function(req,res){
    /*用戶id*/
    var user_name=req.body.user_name;
    /*頁數*/
    var page_num=req.body.page_num;
    /*分頁*/
    Signin.find({user_name:user_name}).sort({'_id':-1}).limit(10).skip((page_num-1)*10).exec(function (err, doc) {
        if(err){
            res.json({"status":"error","msg":"error_system"});
        }else{
            if(doc.isNull){
                res.json({"status":"success","msg":"data_empty"});
            }
            res.json({"status":"success","msg":doc});
        }
    })
}

###8、問題與總結 使用Natapp內外網映射工具的時候須要修改端口號,將其從默認3000修改成80。 輸入圖片說明
APP項目源碼: https://github.com/dpc761218914/SignIn
Node.js服務端源碼: https://github.com/dpc761218914/SignIn_Server工具

相關文章
相關標籤/搜索