Angular+Node實戰(zhàn)之登陸注冊


今天為昨天寫的登陸注冊頁面增加了前端和后端邏輯,后端采用express甲棍,前端則是angularJS迟螺,數(shù)據(jù)庫使用mongodb,沒有加緩存層荆萤。

  • Angular的服務(wù)部分

var Services=angular.module('myApp.Services',[]);

Services.factory('checkUser',function(){
    //檢查用戶登陸和注冊時填寫的格式
    function checkUserName(str, minLen, maxLen) {
        var reg = /^[(\u4e00-\u9fa5)a-z][(\u4e00-\u9fa5)a-zA-Z0-9_]{1,15}$/;
        var len = str.length;
        return reg.test(str) && len >= minLen && len <= maxLen;
    }

    function checkEmail(str) {
        var reg = /^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;
        return reg.test(str) && str.length >= 6 && str.length <= 64;
    }

    return function(form,option) {
        if(!form.username) return '用戶名缺省';
        if(!form.password) return '密碼缺省';
        if(!checkUserName(form.username, 4, 8)) return '用戶名格式有誤';
        if(!checkUserName(form.password,6,15)) return '密碼格式有誤';
        if(option=='signup'){
            if(!form.email) return 'Email缺省';
            if(!form.repeatPassword) return '重復(fù)密碼缺省';
            if(!checkEmail(form.email)) return 'Email格式錯誤';
            if(form.password!==form.repeatPassword) return '密碼不一致';
        }
        return null;
    };
}).factory('extend',function(){
//簡單深度復(fù)制對象
    return function(dst,src){
        for(var i in src){
            dst[i]= typeof src[i]==='object'?cloneObject(src[i]):src[i];
        }
    };
}).factory('CryptoJS',function(){
//加密模塊
    return window.CryptoJS;
});

  • Angular的控制器部分

Controllers.controller('SignCtrl',function($scope,$http,$window,extend,CryptoJS,checkUser){
    $scope.regForm={};
    $scope.logForm={};
    $scope.msg='';
    $scope.appear=false;
    $scope.signup=function(){
        var err=checkUser($scope.regForm,'signup');
        if(err){
            $scope.msg=err;
            $scope.appear=true;
        }
        else{
            var tmp={};
            extend(tmp,$scope.regForm);
            tmp.password=CryptoJS.SHA256(tmp.password).toString();
            tmp.password=CryptoJS.HmacSHA256(tmp.password,'ustc').toString();
            delete tmp.repeatPassword;
          //  console.log($scope.regForm);
           // console.log(tmp);
            $http.post('/signup',tmp).success(function(data){
                if(data.err){
                    console.log(data.err.message);
                    $scope.msg=data.err.message;
                    $scope.appear=true;//使alert展現(xiàn)
                }
                else{
                    $scope.msg='注冊成功镊靴,請登陸';
                    $scope.appear=true;
                    $scope.logForm.username=$scope.regForm.username;
                    $scope.logForm.password=$scope.regForm.password;
                    //自動填充登陸框
                }
            }).error(function(data){
                $scope.msg='未知錯誤,請重試';
                $scope.appear=true;
            });
        }
    };
    $scope.signin=function(){
        var err=checkUser($scope.logForm,'signin');
        if(err){
            $scope.msg=err;
            $scope.appear=true;
        }
        else{
            var tmp={};
            extend(tmp,$scope.logForm);
            tmp.password=CryptoJS.SHA256(tmp.password).toString();
            tmp.password=CryptoJS.HmacSHA256(tmp.password,'ustc').toString();
            $http.post('/signin',tmp).success(function(data){
                console.log(data);
                if(data.err){
                    console.log(data.err.message);
                    $scope.msg=data.err.message;
                    $scope.appear=true;
                }
                else{
                    $window.location.href='/';
                }
            }).error(function(data){
                $scope.msg='未知錯誤链韭,請重試';
                $scope.appear=true;
            });
        }
    };
});


  • 后端部分

function signup(req,res){
    var tmp=req.body.password;
    req.body.password=tool.MD5(tmp);
    //addUser負(fù)責(zé)與數(shù)據(jù)庫交互偏竟,會檢查用戶名和電子郵件是否重復(fù)
    userDB.addUser(req.body).then(function(cont,user){
        res.json({
            success:true,
            err:null
        });
    }).fail(function(cont,err){
        res.json({
            success:false,
            err:err
        });
    });
}

function signin(req,res){
  var tmp=req.body.password;
  var uob=req.body;
  uob.password=tool.MD5(tmp);
  Then(function(cont){
    User.findOne({username:uob.username},cont);
  }).then(function(cont,doc){
      if(!doc) return cont(new Err(msg.USER.userNone));
      if(doc.password!==uob.password) return cont(new Err(msg.USER.userPasswd));
      req.session.uname=doc.username;
      res.cookie('user',{
          username:doc.username,
          password:tmp,
          email:doc.email
      },{
          signed:true,
          maxAge:900000
      });
      res.json({
          success:true,
          err:null
      });
  }).fail(function(cont,err){
      console.log(err);
      res.json({
          success:false,
          err:err
      });
  });
}


  • 數(shù)據(jù)庫部分
function addUser(userobj){
    return Then(function(cont){
        User.findOne({username:userobj.username},cont);
    }).then(function(cont,doc){
        if(doc) return cont(new Err(msg.USER.userNameExist));
        else User.findOne({email:userobj.email},cont);
    }).then(function(cont,doc){
        if(doc) return cont(new Err(msg.USER.userEmailExist));
        else  (new User(userobj)).save(cont);
    }).fail(errorhandler);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市敞峭,隨后出現(xiàn)的幾起案子踊谋,更是在濱河造成了極大的恐慌,老刑警劉巖旋讹,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殖蚕,死亡現(xiàn)場離奇詭異,居然都是意外死亡沉迹,警方通過查閱死者的電腦和手機(jī)睦疫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞭呕,“玉大人蛤育,你說我怎么就攤上這事『桑” “怎么了瓦糕?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腋么。 經(jīng)常有香客問我刻坊,道長,這世上最難降的妖魔是什么党晋? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任谭胚,我火速辦了婚禮徐块,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灾而。我一直安慰自己胡控,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布旁趟。 她就那樣靜靜地躺著昼激,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锡搜。 梳的紋絲不亂的頭發(fā)上橙困,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音耕餐,去河邊找鬼凡傅。 笑死,一個胖子當(dāng)著我的面吹牛肠缔,可吹牛的內(nèi)容都是我干的夏跷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼明未,長吁一口氣:“原來是場噩夢啊……” “哼槽华!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趟妥,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤猫态,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后披摄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懂鸵,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年行疏,在試婚紗的時候發(fā)現(xiàn)自己被綠了匆光。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡酿联,死狀恐怖终息,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贞让,我是刑警寧澤周崭,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站喳张,受9級特大地震影響续镇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜销部,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一摸航、第九天 我趴在偏房一處隱蔽的房頂上張望制跟。 院中可真熱鬧,春花似錦酱虎、人聲如沸雨膨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聊记。三九已至,卻和暖如春恢暖,著一層夾襖步出監(jiān)牢的瞬間排监,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工杰捂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留舆床,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓琼娘,卻偏偏與公主長得像峭弟,于是被迫代替她去往敵國和親附鸽。 傳聞我的和親對象是個殘疾皇子脱拼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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