入门级Node.js 葡京签到送彩金express服务端开发(Android签到APP)

率先小编在数据Curry建了两张表,2个是用户的积分表,四个是登录状态表,分来用来记录用户的积分数和先到状态

一、APP原型

参照另一篇博客:http://www.jianshu.com/p/e2b31ba2035e

葡京签到送彩金 1葡京签到送彩金 2

二 、项目须要

为报到App提供登录、注册、请假,签到等皮之不存毛将焉附数据接口。

 

三 、项目布局

葡京签到送彩金 3

输入图片表达

在用户登录状态表中大家有1个字段,last_sign_time,即上三次签到时刻,每回能够登录的时候把那一个时间与近年来时间开展相比假诺离开为0天,则印证前天已报到(那些签到是24钟头内只好签到一遍,即四次签到时间要离开24时辰以上).假诺等于一天则后天得以登录,如若2天会同以上则表明漏签了.

4、数据库设计

用到了Mongoose将实体类和数据库对象一一对应起来,同时通过Mongoose操作数据库也颇为简约。

葡京签到送彩金 4

输入图片表达

因而时间戳的判定,及时更新状态表,并且当可以登录的时候则对用户积分表举行操作,即更新用户积分.

⑤ 、编写相关实体类

葡京签到送彩金,用户
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
});

 

陆 、路由决定

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);
};
<?php
$user_id=@$_REQUEST['user_id'];
//功能:计算两个时间戳之间相差的日时分秒
//$begin_time  开始时间戳
//$end_time 结束时间戳
function timediff($begin_time,$end_time)
{
      if($begin_time < $end_time){
         $starttime = $begin_time;
         $endtime = $end_time;
      }else{
         $starttime = $end_time;
         $endtime = $begin_time;
      }

      //计算天数
      $timediff = $endtime-$starttime;
      $days = intval($timediff/86400);
      //计算小时数
      $remain = $timediff%86400;
      $hours = intval($remain/3600);
      //计算分钟数
      $remain = $remain%3600;
      $mins = intval($remain/60);
      //计算秒数
      $secs = $remain%60;
      $res = array("day" => $days,"hour" => $hours,"min" => $mins,"sec" => $secs);
      return $res;
}


function upuserscore($current_total_day){
$user_id=@$_REQUEST['user_id'];
//读取数据库配置信息的ini文件
    $ary=parse_ini_file('db.ini');
    $db_login_name=base64_decode($ary['db_login_name']);
    $db_login_password=base64_decode($ary['db_login_password']);
    $db_host=base64_decode($ary['db_host']);
    $db_name=base64_decode($ary['db_name']);
//链接数据库
 $scorelink=mysqli_connect($db_host,$db_login_name,$db_login_password);

mysqli_select_db($scorelink,$db_name); //选择数据库

//检查积分表里是否有该用户  有的话则更新数据  没有的话则插入数据
$scoreq = "SELECT * FROM user_score WHERE user_id=$user_id"; //SQL插入语句
        mysqli_query($scorelink,"SET NAMES utf8");

        $rs = mysqli_query($scorelink,$scoreq); //获取数据集
        if(!$rs){
                exit(json_encode(array('status'=>"success",'code'=>"1",'error'=>mysqli_error($scorelink))));
        }

        if(mysqli_num_rows($rs)){//该用户有数据 则更新其积分信息
            $total_score="";
             while($row = mysqli_fetch_row($rs)) {
            $total_score=$row[4];
           }
            $scoreusdateq = "UPDATE user_score SET user_total_score ='98' WHERE user_id=$user_id;"; //更新
            mysqli_query($scorelink,"SET NAMES utf8");
            $ustaters = mysqli_query($scorelink,$scoreusdateq); //获取数据集
            if($ustaters ==1){
                    exit(json_encode(array('status'=>"success",'code'=>"100")));
                mysqli_close($scorelink);//关闭连接    
                exit();
            }else{
                    exit(json_encode(array('status'=>"success",'code'=>"1")));
                     mysqli_close($scorelink);//关闭连接
                      exit();
            }
        }else{//没有该用户数据 则插入其积分信息
            $scoreinsertq = "insert into user_score (user_id,user_total_score)values($user_id,10)"; //SQL插入语句
            mysqli_query($scorelink,"SET NAMES utf8");

            $rs = mysqli_query($scorelink,$scoreinsertq); //获取数据集

            if(!$rs){
                    exit(json_encode(array('status'=>"success",'code'=>"1",'error'=>mysqli_error($scorelink))));
            }
            if(strpos($q,"SELECT") === false){
                    exit(json_encode(array('status'=>"success",'code'=>"100")));
            }

            mysqli_close($scorelink);//关闭连接

        }

}




//读取数据库配置信息的ini文件
    $ary=parse_ini_file('db.ini');
    $db_login_name=base64_decode($ary['db_login_name']);
    $db_login_password=base64_decode($ary['db_login_password']);
    $db_host=base64_decode($ary['db_host']);
    $db_name=base64_decode($ary['db_name']);

//链接数据库
 $link=mysqli_connect($db_host,$db_login_name,$db_login_password);

mysqli_select_db($link,$db_name); //选择数据库

//检查签到表里是否有该用户  有的话则更新数据  没有的话则插入数据
$q = "SELECT * FROM user_signin WHERE user_id=$user_id"; //SQL插入语句
        mysqli_query($link,"SET NAMES utf8");

        $rs = mysqli_query($link,$q); //获取数据集
        if(!$rs){
                exit(json_encode(array('status'=>"success",'code'=>"1",'error'=>mysqli_error($link))));
        }

        if(mysqli_num_rows($rs)){//该用户有数据 则更新其签到信息
            $last_time="";
            $total_day="";
             while($row = mysqli_fetch_row($rs)) {
            $last_time=$row[4]."<br/>";
            $total_day=$row[5];
        }
            //根据上次签到时间和这次签到时间作比较判断有没有漏签和今日是否已签到
            $current_total_day=intval($total_day)+1;
            $current_day=time();
            $ary = timediff($last_time,$current_day);
        if($ary[day]==0){//今天已签到
             exit(json_encode(array('status'=>"success",'code'=>"5")));
                mysqli_close($link);//关闭连接    
                exit();
        }else if($ary[day]==1){//没有漏签
            $usdateq = "UPDATE user_signin SET last_sign_time='$current_day', total_day='$current_total_day' WHERE user_id=$user_id;"; //更新
            mysqli_query($link,"SET NAMES utf8");
            $ustaters = mysqli_query($link,$usdateq); //获取数据集
            if($ustaters ==1){
            upuserscore($current_total_day);
                    //exit(json_encode(array('status'=>"success",'code'=>"100")));
                mysqli_close($link);//关闭连接    
                exit();
            }else{
                    exit(json_encode(array('status'=>"success",'code'=>"1")));
                     mysqli_close($link);//关闭连接
                  exit();
            }
        }else{//漏签过
        $usdateq = "UPDATE user_signin SET last_sign_time='$current_day', total_day=1 WHERE user_id=$user_id;"; //更新
        mysqli_query($link,"SET NAMES utf8");
        $ustaters = mysqli_query($link,$usdateq); //获取数据集
        if($ustaters ==1){
            upuserscore($current_total_day);
                //exit(json_encode(array('status'=>"success",'code'=>"100")));
            mysqli_close($link);//关闭连接    
            exit();
        }else{
                exit(json_encode(array('status'=>"success",'code'=>"1")));
             mysqli_close($link);//关闭连接
              exit();
        }
    }

    }else{//没有该用户记录则插入
        $current_day=time();
        $insertq = "insert into user_signin (user_id,last_sign_time,total_day)values($user_id,'$current_day',1)"; //SQL插入语句

        mysqli_query($link,"SET NAMES utf8");
        $insertrs = mysqli_query($link,$insertq); //获取数据集

        if(strpos($insertrs,"SELECT") === false){//出入数据成功
            upuserscore('1');
            //exit(json_encode(array('status'=>"success",'code'=>"100")));

            }

    }

        mysqli_close($link);//关闭连接


?>

柒 、首要代码

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.贰 、用户登录:主要判断用户点击的按钮,同时要求当前是不是留存用户登录记录,通过3个可预感性的Unique_id来落到实处。及用户名加日期来界定该记录当天的唯一性。

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});
        }
    })
}

  

八 、难点与计算

利用Natapp内外网映射工具的时候必要修改端口号,将其从暗许三千修改为80。

葡京签到送彩金 5

输入图片表明

APP项目源码:
https://github.com/dpc761218914/SignIn
Node.js服务端源码:
https://github.com/dpc761218914/SignIn\_Server