Node.js 切近实战(二) 之图书管理系统

上一篇Node.Js切近实战讲述了如何在VS上搭建Node.Js开发环境,相信看过那篇博客的同学,你已经对Node.Js有了好感,多了解些技术还是很有必要的。所谓实战见真功,还是要实战才行。我看博客园上一些专家荣誉的人写的博客,全是理论,没有实战,没有实战就没有发言权。熟能生巧,实战出理论。

我们看一下项目结构

典型的NodeJs三层架构,controller,model,view,这里每个部分什么职能,我就不多说了。

首先我们看一下登录界面,先上图,我看博客的时候,会首先看博客中有没有图,比如一篇博客讲的是实时通讯或者自己包装了一个html5播放器,结果整篇博客全是代码和汉字,没有图片,这样的博客也没有什么吸引力。废话不多说,看看界面。

还是BootStrap布局,只是我将BootStrap的primary样式改了下,变成Telerik Kendo UI中的primary样式,因为后面的话我们是要使用Kendo UI去做前端UI的。Telerik Kendo UI for Html5是很不错的,样式美观大方,支持Jquey和Angualr JS。地址:http://www.telerik.com/kendo-ui

其实这个登录界面很简单,还是使用jade模板,代码如下

doctype html
html
  head
    base(href=‘/‘)
    title #{title}
    link(rel=‘stylesheet‘, href=‘/stylesheets/style.css‘)
    link(rel=‘stylesheet‘,href=‘/stylesheets/bootstrap/css/bootstrap.min.css‘)
    link(rel=‘stylesheet‘,href=‘/stylesheets/bootstrap/css/bootstrap-theme.min.css‘)
    link(rel=‘stylesheet‘,href=‘/stylesheets/kendo/kendo.common-material.min.css‘)
    link(rel=‘stylesheet‘,href=‘/stylesheets/kendo/kendo.material.min.css‘)
    script(src=‘/javascripts/thirdpart/angular.min.js‘,type="text/javascript")
  body(style=‘background-color:#CCCCCC;‘)
    #main_layout(ng-app=‘loginModule‘ ng-controller=‘loginController‘)
     .panel.panel-primary
       .panel-heading
         h3.panel-title
          img(src=‘/images/userlogin.png‘ style=‘width:25px;height:25px‘)
          label.left-margin-10 User login
       form(ng-submit=‘loginIn()‘ role=‘form‘)
        div.panel-content
          .center-align-text
            h3 Please Enter your Information
          .row
            .col-md-12.row-margin
              .input-group.row-margin
                span.input-group-addon(style=‘background-color:#FF9900‘)
                  img.input-group-img(src=‘/images/userno.png‘)
                input.form-control(ng-model=‘Login.UserName‘ type=‘text‘ autofocus=‘autofocus‘ placeholder=‘Please input user name‘ maxlength=15 required title=‘User name can\‘t be empty!‘)
            .col-md-12.row-margin-large
              .input-group
                span.input-group-addon(style=‘background-color:#009966‘)
                  img.input-group-img(src=‘/images/password.jpg‘)
                input.form-control(ng-model=‘Login.Password‘ type=‘password‘ placeholder=‘Please input password‘ required maxlength=‘15‘ title=‘Password can\‘t be empty!‘)
            .col-md-12.row-margin-large(style=‘margin-bottom:10px‘)
            .col-md-6
              div.row-middle-height
               input#chk_remember.k-checkbox(type=‘checkbox‘ ng-model=‘IsRemember‘ ng-true-value=‘true‘ ng-false-value=‘false‘)
               label.k-checkbox-label(for=‘chk_remember‘) Remember me
            .col-md-6
              .right-align-text.row-middle-height
                button.k-button.k-primary(type=‘submit‘) Login
          .row.row-margin
            .center-align-text
              span(ng-show=‘IsLoading‘)
               img(src=‘/stylesheets/images/loading_2x.gif‘)
               span(style=‘color:#337ab7;font-weight:bold‘)  login,please wait......

script(type=‘text/javascript‘ src=‘/javascripts/local/login.js‘)

大家看到了,使用angularJs做前端数据绑定,有些人说这是MVC模式,我看是MVVM模式还差不多,做过Silverlight和WPF的同学肯定会认为这是MVVM模式。OK,在这里我们使用Html5的验证,效果

提交的时候自己去做验证,OK,我们看一下Js。

var appModule = angular.module(‘loginModule‘, []);

appModule.config(function ($locationProvider) {
    $locationProvider.html5Mode(true);
});

appModule.controller(‘loginController‘, function ($scope, $http, $location) {
    var config;
    $scope.IsLoading = false;
    $scope.Login = {
        UserName: ‘‘,
        Password: ‘‘
    };
    
    $scope.setRemeberUserInfo = function () {
        if (localStorage.UserInfo != null) {
            var userObj = angular.fromJson(localStorage.UserInfo);
            $scope.Login.UserName = userObj.UserName;
            $scope.Login.Password = userObj.Password;
        }
    }
    
    var sessionConfig = sessionStorage.getItem("config");
    if (sessionConfig != null) {
        config = angular.fromJson(sessionConfig);
    }
    else {
        $http.get(‘/config‘).success(function (data) {
            config = data;
            sessionStorage.setItem("config", JSON.stringify(data));
        });
    }
    
    $scope.setRemeberUserInfo();
    
    $scope.loginIn = function () {
        var postData = JSON.stringify($scope.Login);
        $scope.IsLoading = true;
        
        if (sessionStorage.getItem("LoginUser") != null) {
            $http({
                method: "post",
                url: "/user",
                headers: { ‘Content-Type‘: ‘application/json‘ },
                data: JSON.parse(sessionStorage.getItem("LoginUser"))
            }).success(function (data) {
                window.location.href = ‘/main‘
            });
        }
        else {   
            $http.post(config.loginUrl, postData).success(function (data, status, headers) {
                sessionStorage.setItem("LoginUser", JSON.stringify(data.UserInfo));
                if ($scope.IsRemember) {
                    localStorage.UserInfo = postData;
                }
                
                $scope.IsLoading = false;
                $http({
                    method: "post",
                    url: "/user",
                    headers: { ‘Content-Type‘: ‘application/json‘ },
                    data: data.UserInfo
                }).success(function (data) {
                    window.location.href = ‘/main‘
                });
            }).error(function (data) {
                $scope.IsLoading = false;
                
                if (data.error) {
                    alert(‘Login failed,please check your account.‘)
                }
            });
        }
    }
});

在这里,用户名和密码是Login对象的两个属性,所以我们页面直接绑定Login.UserName和Login.Password即可。在登陆的时候判断如果用户在本地存在,则直接跳过登录,将用户信息存入数据库,否则调用登录api进行登录,登陆成功,如果需要记住密码,则将用户信息存到本地localStorage。

下一次当打开该页面时,系统会拿localStorage中的用户信息直接赋值到文本框( $scope.setRemeberUserInfo();)

OK,登录就说这么多,登录其实和NodeJs服务端没有什么联系。我们看一下登陆后的界面。

OK,今天就到这里,更多精彩内容,请看下期。

时间: 2024-10-11 13:53:34

Node.js 切近实战(二) 之图书管理系统的相关文章

Node.js 切近实战(二) 之图书管理系统(图书信息录入)

上一节我们讲了图书管理系统的登录,相信大家对jade模板和angular js也有了了解,今天的话我们来看一下图书信息录入.在这里我们准备使用Nosql数据库,本篇博客中使用的是MongoDB.OK.Mongo DB的安装我就不多说了,那么Node.Js平台使用mongoDB我们使用什么扩展包好呢,我觉得还是mongoose比较合适,封装了好多针对mongodb的方法,简单易用. 首先我们来看一下图书model的设计bookInfo.js. var mongoose = require('mon

Node.js 切近实战(二) 之图书管理系统(图书查询)

最近又当上了Master,负责带项目,有时候,遇到的问题我很郁闷.比如一个Story,需求中说的是将单个修改改为批量修改,举个例子,商品信息修改,之前是用一个商品id修改,但是现在改成多个商品id修改.我的意思是直接将文本框宽度高度加大,支持回车换行就行了,然后再将API修改为支持批量查询.这个界面上上面是一个Grid,下面是一个表单,选择Grid的数据后,会加载到下面表单.只能加载一条下去,就因为这个,有人提出如果加载一个下去,那么大个文本框只显示一个选中的商品id,视觉上无法接受.说是要将选

Node.js 切近实战(七) 之Excel在线(文件&文件组)

最近西安的天气真他妈的热,感觉还是青海的天气美,最高温28度.上周逛了青海湖,感觉还是意犹未尽,其实我还是很喜欢去一趟西藏的,但是考虑到花费也没人陪我,我暂时放弃这个念头.计划去一下重庆或者甘南,也许是现实的. OK,废话不多说,今天我们来看一下Excel在线部分的文件和文件组.首先我们来看一下页面,调一下胃口.俗话说无图无真相,先看图. 没错,还是Telerik Kendo UI,其实我面试的时候当听到别人说自己用的是EasyUI和ExtJs的时候,我就不那么上心,但是如果有人用的是Kendo

Node.js 切近实战(十二) 之Linux部署

之前的话我们的项目都是跑在windows上,今天我们要将我们的程序跑到linxu机器上.在看linux部署之前,我们先看一下node.js类似于asp.net mvc的过滤器或者叫拦截器.在app.js中我们加入如下代码 var beforeRequest = function (req, res, next) {     if (req.originalUrl == '/'          || req.originalUrl == '/login'          || req.orig

Node.js 切近实战(一) 之环境搭建

哥们先来吐槽一下,最近面试别人的一些经历.有的小伙干了五年,这五年干的是同样的活,三层架构,ASP.NET MVC,Jquery.看简历还能用,结果面试中才知道这五年自己没写过泛型类,泛型方法,委托自定义事件也都没用过,还说抽象类中必须都是抽象方法才可以.还有一小伙,干了十年,泛型委托一概不清楚.最近有个干了9年的,也呆过几家外企,感觉还挺牛,来了之后果然牛,敲着个二郎腿,声音比我还大,搞得好像他在面试我.9年了,只会最常用的一些东西,asp.net mvc,asp.net webforms,W

Node.js 切近实战(十) 之Excel在线(共享文件)

本篇文章我就不罗嗦了,主要讲的是共享文件列表,主要功能就是查看别人共享的文件. 打开该界面,用户可以在左侧看到共享文件的人员的信息,点击该人可以查看该人共享了哪些文件.在Grid里面有查看文件修改记录,编辑,标记为星标文件等功能.OK,我们先看一下UI代码. div(style='padding:5px;')  include ../common/search.jade .row-margin  hr.panel-line   #splitter(style='height:750px;')  

Node.js 切近实战(十一) 之实时通讯

曾经在幽幽暗暗反反复复中追问,才知道平平淡淡从从容容才是真,听着歌曲,写博客,感觉就来了. 今天我们主要看一下Socket.IO实时通讯,先看一下界面. .row  .col-md-9   .panel.panel-primary    .panel-heading     h3.panel-title(style='font-size:13px;') Chat Message    .panel-body#div_msgbody(style='min-height:590px;max-heig

Node.js 切近实战(九) 之Excel在线(在线编辑)

最近实在是太想去西藏了,我自己总是喜欢人少的旅游地,喜欢一望无垠,喜欢蓝天白云大草原. 之前有一节我给大家讲过文件列表,如下,今天我们要讲的就是Excel在线编辑. 当我们双击文件图标的时候会跳转到一个Excel修改界面,如下. ok,这里我们使用的依然是Telerik Kendo UI中的SpreadSheet,看一下这个Spread Sheet是如何用的. 我们定义一个spreadsheet的div,我们看一下这个div怎么生成sheet. $("#spreadsheet").ke

Node.js 切近实战(八) 之Excel在线(文件权限)

最近美国又他妈的皮痒了,在南海找事,还说什么中国必须接受南海仲裁结果,我去你大爷的,你以为你是谁啊.说实话只要我们要决一死战的勇气,还管什么华盛顿航母,佛吉尼亚潜艇,大不了大家一起死,不,全世界一起死.怎么个死法,中国惹急了先给俄罗斯来几颗核弹,然后俄罗斯反击中国的同时,也会给欧洲扔几颗核弹,给美国扔很多核弹,然后欧洲英法会给其他国家扔核弹,美国给世界扔核弹,俄罗斯只给北冰洋扔就行了,中国给美国和太平洋扔就行了,这样世界就不复存在了. 今天我们来看一下文件权限管理,这个其实是对共享出去的文件的一