大染志

想要玩得很 High 的程序员


  • 首页

  • 归档

  • 标签

  • 关于

  • 知识图谱

node、express、mysql、jade实现用户登录数据获取及验证

发表于 2011-11-01 | 更新于: 2014-07-22 | 分类于 node.js

今天要给大家介绍一下如何利用node.js的expressjademysql三个module实现获取form表单的内容以及通过数据库验证登录的正确性。请确保你已经下载好了前面三个module并且你的电脑里面已经安装好mysql。

首先看看运行页面:

再给大家看看整个小系统的目录结构吧:

请大家按照图中所示的目录结构建立好所有的文档吧。当然jquery你下载就可以了。

接下来,我们将建立数据库:

create database receipts;  #创建数据库

#创建名为user的表
<pre style="padding-left: 30px;">use receipts;
create table  user (
    userid bigint auto_increment not null primary key,
    username  varchar(20) not null,
    pass  varchar(30) not null
);

然后我们来书写我们所需要的login.jade。这里使用jade,我们需要创建一个简单的layout.jade(模板),在layout模板中我们将定义最基本的网页框架。设定大多数网页相同的部分。这里关于jade的语法我就不多讲了,jade的官网上很详细,直接给出layout的代码:

!!! 5
html
      head
         <span style="color: #ff0000;"> title=title</span>
       <span style="color: #ff0000;"> link(rel='stylesheet',type='text/css',href='/css/style.css')</span>
      body!=body

注意,由于jade会对我们所写的代码进行重新编码,编码成linux的相关格式,这里建议大家使用类似notepad++、ultra editor等软件时将其编码为UTF-8 无DOM格式,并且请不要在文件中同时使用空格和Tab对文件分隔,会导致报错。这里强调一下比如上述 title=title,这里是把网页的标题赋值给一个变量叫做title,之后我们声明并赋值title。link后面不能添加空格。类似的也一样。

下面是我们的登录界面login.jade,代码如下:

form(id='login',method='post',action='/login')
    h1 Log In
    p(style='margin-top:20px;')   #{error}
    fieldset(id='inputs')
        input(id='username',name='username',type='text',placeholder='Username',autofocus='',required='')
        input(id='password',name='password',type='password',placeholder='Passowrd',required='')
     fieldset(id='actions')
        input(type='submit',id='submit',value='Log in')
        a(href='') Forgot your password
        a(href='http://google.com') Register

大致是定义一个完整的表单。并且定义一个显示提示错误信息的地方。当然还有最重要的css代码。我将在后面提供源码给大家下载。
home.jade和index.jade这个程序里面我们用不到,因此内容可以不管它。

接下来,我们就开始写代码了。当然是使用express了。首先我们将写两个路由器在app.js中,一个是显示登录的页面并且作为首页,另外一个是验证登录的页面。

//首先添加配置信息

app.set('view engine','jade');   //设置模板引擎
app.set('views',__dirname+'/views');   //配置jade文件夹
app.use(express.static(__dirname+'/public'));  //设置静态文件文件夹,比如css,js,/images
<span style="color: #ff0000;">app.use(express.bodyParser()); //用户获取form表单数据</span>
app.use(express.methodOverride());

//设置首页。
app.get('/',function(req,res){
    res.render('index',{title:'欢迎使用收据管理系统',error:''});
});
在编写登录验证登录路由之前,我们需要明确这里我们需要处理那些事:
  • 获取表单中数据
  • 创建mysql数据库连接
  • 从mysql请求数据
  • 将数据库中数据与form表单进行比较,并返回结果。

//获取表单中数据
var user = req.body.username; //这样便可以获取到form表单中 name=”username”值,依赖于express.bodyParser()

创建mysql数据库连接。这里我们将做一个小小的封装。将封装的函数写入 user.js

//连接mysql服务器
function connectServer(){
    //创建mysql连接,设置用户名,密码
    var client = mysql.createClient({
        user:'root',
        password :'root'
    });
    client.host= '127.0.0.1';
    client.port=3306;
    <span style="color: #ff0000;">client.database='receipts'; //选择需要使用的数据库,创建数据库时不必须,其他时候必须</span>
    return client;   //返回创建好的数据库连接对象
}

//接下来我们将从数据库获取数据,同样我们也做一个封装。因为要执行数据库操作。因此我们需要传入一个数据库连接对象client,并且传入用户名,以便查出该用户对应的密码。再则我们需要创建一个回调函数以便于,在获取到数据库中的值后,做出相关判断。按照常规长发很难获取值。应该闭包可以。(这个回调函数得感谢一个群里的大牛。),代码如下。

//执行mysql查询操作。返回查询获取到的对象
 function  selectFun(client,username,callback){
    //client为一个mysql连接对象
    client.query('select pass from user where username="'+username+'"',function(err,results,fields){
        if(err) throw err;

        callback(results);   //在获取结果之后由回调函数进行相关操作
    });
}
我们将关于数据库的两个函数,写在user.js里面。因此这里我们需要导出这两个函数,使用exports关键字,以便在其他地方可以使用。
exports.connect = connectServer;
exports.selectFun  = selectFun;    //注意没有函数的()哦。</pre>



好了函数写好了。现在我们就该在app.js中使用了。
导入我们刚创建的user.jsmodule
var usr = require('./dao/user');
然后就可以使用了。
app.post('/login',function(req,res){
    var user = req.body.username,
    pass = req.body.password,
    client = usr.connect(), //创建数据库连接
    result  = null;
     //这里在回调函数里面进行mysql返回值的验证。很重要
    <span style="color: #ff0000;">usr.selectFun(client,req.body.username,function(result){</span>
        console.log('查询结果为'+result);

        if(result[0]===undefined){   //这里需要说明的是,mysql返回结果存在一个数组对象中。
            res.send('没有该用户!');
            }else{
            <span style="color: #ff0000;">if(result[0].pass==req.body.password){</span>
                res.send('登录成功');
                }else{
                    res.send('你输入的密码有误');</pre>
                          });
            }
        }
    });  //执行查询
});
大家是不是看得太乱了。对不起。都是我的文字控制能力不好。大家凑合着看看吧。我把源码给大家,当然没有包含mysql创建数据库的源码哦。

大家下载源码吧:http://115.com/file/bh03gw2q#


有什么问题,我们一起交流一起学习吧。

Node.js web框架express入门(1)

发表于 2011-10-29 | 更新于: 2014-07-22 | 分类于 node.js

从我自己现在学校node.js说了解的情况,我觉得node.js至少比Java简单不少。使用node.js的诸多第三方框架更是让node.js简单了不少。其实express 框架几天前我就看了一些。也写了一些例子。虽然没有完全掌握,但是我想在这里和大家一起分享我学到的知识,也算是一种记录。

首先,当然我们也得安装express 的module

npm install express

接下来我们就是可以开始写一个简单的程序了。

var express = require('express'); //导入module
 var app = express.createServer(); //创建并返回一个express的server对象
 app.get('/',function (req,res){ //为跟地址目录设置路由,并且监听get方法。
       res.send("Hello,World"); //向浏览器返回hello world
  });
 app.listen(4000); //设置服务器监听4000端口

运行程序,然后再浏览器中输入localhost:4000试试,是不是出现了hello world了。当然这只是一个最简单的程序。下面我们可以再多做一些。

这里需要说明一下。默认的,系统将在您的请求处理中,在此例里面即在app.get();里面为你添加下面两句话

res.charset='utf-8';         //系统默认的res.send()和res.render()都默认采用utf-8编码
    res.contentType('Text/html');      //系统提供默认为Text/Html的Content-Type

接下来,我们将通过链接中的地址获取请求内容

在程序中加入一段代码如下

app.get('/hello/:name',function (req,res){
       //如果你在地址栏中输入如下/hello/Junv.那么你将在页面中看到name=======Junv
      //'/hello/:name'中的name相当于定义一个变量name,并且把我们输入的名字赋值给他。
       res.send('name======'+req.params.name);
});

试试看看吧。成功了吧!

对不起,写着写着觉得很别扭。今天就写到这里吧。下次在继续吧。

使用Node.js发送电子邮件(E-mail)

发表于 2011-10-26 | 更新于: 2014-07-22 | 分类于 node.js

10月27日更新,可以发送附件

今天晚上花了点时间试了一下使用node.js发送电子邮件,也挺简单的,不过有个问题一直没有解决,就是发送附件,我弄明白的时候,会补充资料的。

首先我们还是得安装node的第三方用户发送email的module 。

npm install nodemailer

安装好之后,还有一个问题需要注意,我们应该确保用来发送邮件的邮箱地址是打开只是IMAP 、SMTP功能的,这样才可以发送邮件成功。

接下来我们就开始写代码,其实很简单,官方网站也都已经说得很清楚了。

var mail = require('nodemailer');  //包含发送邮件所需module
mail.SMTP = {
    use_authentication: true, //如果我们使用QQ等邮箱,这个必须写且为true
    host: 'smtp.qq.com',   //定义用来发送邮件的邮箱服务器,一般是QQ这些的
    port:25,    //定义服务器端口,一般是25    ,如果是使用SSL端口一般为465,或者587
    ssl:false,     //默认不适用SSL,可以省略不写
    user: '[email protected]',   //邮箱用户名
    pass:'*****'   //输入邮箱密码
}
mail.send_mail(
{
    sender:'[email protected]',   //发送邮件的地址
    to:'[email protected]',     //发给谁
    subject:'随便把',               //主题
    body:'Hello,这个邮件来自node.js'
},
//回调函数,用户判断发送是否成功,如果失败,输出失败原因。
function(error,success){
    if(!error){
        console.log('message success');
        }else{
        console.log('failed'+error);
    }
}
);

这里我没有使用SSL进行发送,而且发送的是纯文本,也可以发送html,如果发送html则在send_mail函数里面加上:

html: '<p> 你好。。邮件来自node.js</p>',

如果使用SSL进行发送我们则需要将mail.SMTP改为:

mail.SMTP = {
    use_authentication: true,  //如果我们使用QQ等邮箱,这个必须写且为true
    host: 'smtp.qq.com',   //定义用来发送邮件的邮箱服务器,一般是QQ这些的
    port:465,    //定义服务器端口,一般是25    ,如果是使用SSL端口一般为465
    ssl:true,     //默认不适用SSL,可以省略不写
    user: '[email protected]',   //邮箱用户名
    pass:'*****'   //输入邮箱密码
}

好了。现在你运行程序试试,是不是成功了。

我今天晚上遇到一个错误 :503 ERROR,need EHLO and AUTH first。就是因为没有添加use_authentication = true的缘故。加上之后,搞定。

———————————————————分割线———————-

发送附件的话。首先我们得使用

var fs = require('fs');    //导入文件系统相关的包

饭后我们将文件读入内存,并将其发送。

//读入文件
var img = fs.readFileSync(__dirname+"/cat.jpg");

var attachment = [{
    'filename': "cat.jpg",   //这里只是给附件取名称,而不是导入文件内容
    'contents': img         //导入文件
}]    //定义我们需要发送的附件

接下来我们需要在send_mail函数中加入发送附件即可

mail.send_mail(
{
    sender:'[email protected]',   //发送邮件的地址
    to:'[email protected]',     //发给谁
    subject:'测试发送文件',       //主题
    attachments: attachment, //添加附件
    body:'Hello,这个邮件来自node.js,包含附件哦,亲!'

},

附上Nodemailer的网址:http://www.nodemailer.org/

enjoy it!

最后还是感谢 andris9 大叔很快帮我解决了问题!

使用node.js连接mysql数据库

发表于 2011-10-25 | 更新于: 2014-07-22 | 分类于 node.js



Javascript连接数据库可能很多同学之前都没有想到吧,不过现在使用node.js我们可以很容易地连接各种数据库。比如传统关系型数据库Mysql以及现在正火的非关系型数据库。这里讲一下如何连接mysql数据库其实官方的文档以及很详细了。

首先我们需要连接mysql所需的Module

npm install mysql

接下来就可以开始编程,连接数据库了。

var mysql = require('mysql');//导入mysql Module
var client = mysql.createClient({
    user:'root',
    password :'root'
});
/*
设置数据库的地址,这里请不要使用localhost,
至少我在windows这里出错,如果不写系统默认为localhost
*/
client.host ='127.0.0.1';
client.port = 3306;       //设置数据库端口,如果不写默认为3306
client.database = 'node';
    //create a database
    client.query('create database test_db',function(err){
    if (err && err.number != mysql.ERROR_DB_CREATE_EXISTS) {
             throw err;   //添加异常处理
    }
    });

这里我们使用的是client.query();执行sql语句,官方的API中client.query(sql,[params,cb])方法中还可以添加回调函数。

执行其他SQL语句也是使用client.query()函数。这里说一下插入语句

client.query('insert into node_t  values(?,?)',[1000,'Junv']  );

推荐这种参数化插入,而不是将值直接写在里面,可以防止sql注入。

注意:今天下午我最初尝试连接数据库的时候,它一直报错“Domain name not found”,只要我们加上

client.host ='127.0.0.1';

将系统默认的host=localhost改成127.0.0.1即可。具体原因不明。

是不是很简单呢?接下来我会写关于express 和jade的博客了。一边学习一边写博客。哈哈。

解决npm.js不能成功安装Node.js包

发表于 2011-10-23 | 更新于: 2014-07-22 | 分类于 node.js

学习Node.js当然安装其他开发者开发的各种各样的包一定是必须的,不知道在内地的童鞋发现一个问题没有,我们现在很难从npm.js直接去下载安装包了。笔者在电信和教育网连续试了几天都没有成功。

大概介绍一下npm.js吧。npm.js是node.js的一个包管理工具。通过你可以很方便的安装所有node.js的第三方包、类库,而不需要知道他们的地址、不需要再自己一次一次手动安装。

过程是这样的:(注:笔者只是在windows环境下测试过)

一般地我们会在cygwin里面使用” npm install 你需安装的包名”进行安装。但是我反反复复试过多次,均是很难成功,只有昨天夜里一点左右成功过一次。最初我认为我我们的网速太慢了,于是我在cygwin下面配置代理:

export http_proxy=http://127.0.0.1:8087 注:我使用的是go agent进行代理(具体安装请google一下)。

通过代理我成功地安装成功了npm 本身,但是当我转而通过 npm install …进行安装的时候就出现错误了,npm提示 Socket hang up。具体原因不明,总之npm 不能使用cygwin里面配置的代理,于是我使用 export -n http_proxy 删除代理设置。

随后我在网上又收到了另外一个解决方法。在npm里面设置打理

npm –proxy http://127.0.0.1:8087

不过设置好之后使用 npm install …,发现同样不成成功,npm 根本没有通过代理去发请求。

最后,我找到一个神器npmf。它的大致介绍是说npmf 是npm的一个复制,他可以永久保存那些包的每个版本。并且你通过npmf安装的包在你下次部署软件的时候依然可用。老实说后面一句话,我没有理解明白,到底是本地缓存,还是在网上缓存。

各位可以前往npmf网站一看究竟:http://npmfjs.org/

同时还有一个介绍npmf的网页:http://nodeknockout.com/teams/preservation-society

接下来就是见证奇迹的时刻了:

我们可以直接把npm 默认的registry 换成 npmf的:

npm config set registry http://npmfjs.org:9000

npm install 你需要安装的包

是不是发现很神奇,一个包可能10秒甚至更少就可以安装成功。如果你想把registry改成npm默认的

npm config set registry http://registry.npmjs.org

或者你可以临时使用npmf的registry的包,在你每次安装的包的时候都使用一下语句

npm –registry http://npmfjs.org:9000 install 你需要安装的包

告诉你们个秘密:通过上面的两种方法,可以使用代理哦。速度又提高了不少。哈哈。。。。。

总结:造成npmjs.org的速度很慢的原因我始终不太清楚。我想npmjs.org的网络应该比npmfjs.org好很多才对。怎么会反过来了。以前我在有人抱怨过说内地使用 npm安装包很难。但是我不知道这是个别现象还是大家都是这个样子。难道G*F*W故意把 registry.npmjs.org和谐了?哎,不管了,大家使用我这个方法来吧。欢迎各位留言

Notepad++ 设置、插件配置

发表于 2011-10-19 | 更新于: 2014-07-22 | 分类于 我们爱分享



虽然平时也一直在使用Notepad++,但是并没有深入地了解它,没有去鼓捣它。今天中午看了一篇博文说另外一个文本编辑器多么多么强大。我下载使用了一下,发现里面比较好的功能就是函数花括号自动完成、可以更换主题、支持分屏、可以安装插件同时查看几个文件,不过有一点不好就是他是收费软件。于是我想,开源的notepad++是不是也有那些功能呢?在我搜索一番之后,于是就发现了notepad的惊天大秘密。


主题设置


依次点击面板上的settings——style configurator。系统默认提供十几种不同的风格,可供选择。用户还可以为不同的编程语言设置个性化的前、后景色,设置字体大小、种类。我个人使用的主题是Black Board.


分屏实现


据我发现目前notepad++没有快捷键可以开启分屏,而是用户右键点击某个打开的文档列表的Tab。选择Move to other view 或者 Copy to other view,即可以移动或者复制到分屏。此时屏幕编程两屏界面(好像notepad++目前只支持两屏)


字体的放缩


当光标在目前程序时,按住Ctrl键同时,滚动鼠标滚轮即可实现字体的大小改变。


函数自动补充


依次点击Settings—-preferences—Back up/Auto completion。勾选enable auto-completion on each input.下面有function completion 和word completion可供选择。


同样也可以勾选Function parameter hint on input。这个是函数暗示吧。需要注意的是,我发现在javascript 和html 下提示相对较好,但是都不会补充完全,都是部分补充。笔者在Java下面测试,大致只能提示类一级,不能提示其二级方法。如果你想拥有很好的提示还是使用eclipse吧。


插件安装:


notepad++支持两种方式安装插件(plugin):第一种,将插件的.dll文件复制到notepad++安装目录的plugin目录下。第二种方法是通过notepad++自带的插件plugin management 进行安装。点击即可实现自动安装插件。安装完成后重启即可工作。


这里推荐一些比较好的插件列表:http://my.oschina.net/hcom/blog/4429


Notepad++官方下载:http://notepad-plus-plus.org/


我也是今天才发现notepad的这些功能,希望可以和大家一起交流、讨论。

Struts2 国际化使用、实现

发表于 2011-10-15 | 更新于: 2014-07-22 | 分类于 编程之美

这学期在学习Java EE,也是我选择的方向。因此很感兴趣。前几天看了Struts2 实现国际化,于是今天下午便真实操作一遍。

首先我们要实现国际化,当然得建立相关语言的.properties文件。且该文件需放在classes目录下。即是eclipse的src的根目录。

struts2的命名规则是 “自定义名_语言_国别(英文字母为大写).properties”

比如:

中文简体:test_zh_CN.properties

美国英文:test_en_US.properties

其他国家的,请大家自己在网上搜索一下吧。

.properties 文件的内容形式为key=value

比如:

中文: username=用户名(这里中文要被转码为另外一种格式,才能使用。转换后为: u7528u6237u540D,eclise会自动帮你转换)

英文:username=username

写好properties文件之后。我们就需要修改struts.xml文件让其支持国际化属性,在struts标签下添加:

这里的value属性的值“test”为你的properties文件的最前面的自定义名。

然后再使用的时候,比如我想获取username的国际化属性:

或者 均可以

当然还有另外一种方法不需要在struts.xml添加语句。在jsp需要使用国际化资源的时候,添加如下:

或者

这里的name标签的test和上面的一样。需要注意的是。你每使用一次国际化资源就需要添加一个标签。

其他的使用就和一般的struts没有区别了。

然后我们可能需要手动切换语言,在jsp页面里面添加:

<a  href="doAction.action?request_locale=zh_CN"> 中文</a>
<a  href="doAction.action?request_locale=en_US">English</a>
doAction.action 为我需要显示的Action地址。
其他的就不多讲了。这个例子只是Struts2最简单的国际化实现。

吵架好烦,哎,心力交瘁

发表于 2011-10-13 | 更新于: 2014-07-22 | 分类于 未分类

好累!好累!

我哪里错了嘛,就因为我说了一句话不太该说的话!

然后你就拂袖而去,纵使我再三挽留你,你却越来越凶,每次你这个样子,我真的不晓得应该怎么办!

我可以怎么办嘛?

我有这样凶过吗?在你面前,我不晓得脾气好了好多倍

你个性却却越来越不好。一摸到就生气,我每次都是在第一时间给你道歉,告诉你我错了。我不该这样做,但是不晓得你想过没有,难道真的每次错的都是我吗,我有那样吼过你吗?

我不是怕你,是因为我爱你,所以我在忍!我愿意接受这一切。但是你不能每次都这样啊。

好累,好烦。不晓得应该从哪里和你沟通,

今天明明不是因为我们的问题,你却说我偏向你寝室的同学,说我偏向漂亮的女生。

真的,大部分关于他们的印象我是从你那里得到的啊。我不喜欢太要强的女生,有啥子了不起嘛。我见多了。

你每次都说我是做错了不愿意道歉。但是你又晓得,很多次我真的觉得我没得错,但是我又在道歉。

在你面前我永远都是错的。

在你们寝室面前,我永远都是被最后考虑的。呼之即来挥之即去。。。。

你理解我一下嘛。你怎么就不理解人呢!

没人理解我,好累。好累!

钱让很多小人原形毕露

发表于 2011-10-12 | 更新于: 2014-07-22 | 分类于 我说

这几天学校正在搞奖学金的评比,需要每个同学自己对自己的情况进行评估,你在上一学年所获得的将和其他证书这些都是获得加分,当然学习成绩也是分数中很重要的一部分。于是情况出现了。

能够得奖的人为了得更高的将,千方百计地去找分加,同时还要看看其他人是不是快要超过他了。其他人加分是不是正规的,其他人是不是在到处找关系盖章?

真他妈的恶心,在这个奖学金评比之中我看到了谄媚、欺诈、鬼鬼祟祟,说人家加分这样或者那样的不正常。

哎!真的是,钱让小人原形毕露了。

想想去年我也不是这个样子啊。看看有些人,把所有能够加的分都加到最高!你妹啊!

一个奖学金也是,得奖的人都是妈的一群水货,什么都不会,就是会考试、会讨好老师、会拍马屁、会装疯卖傻!

你们就潇洒吧!我又一次明白了,千里之堤,溃于蚁穴!

Eclipse 自动补全、联想设置

发表于 2011-10-09 | 更新于: 2014-07-22 | 分类于 我说

笔者在第一次使用eclispe 3.7即indigo这个版本的时候,便发现一个小小的不快:平时在不知道某个方法怎么写的时候会按下Alt +/去获取eclipse给出的提示。但是在3.7这个版本却不好用,得到的是eclipse自动帮你选择一个他认为最合适的方法或者变量等等,帮你补全,而不是原来的显示所有可供选择的,让你来选择。

纠结了很久,期间尝试过使用网上说的修改Content Assist。将之前默认的 .后面加上ABCD…abcd…所有52个字符。并且 把联想的时间从系统默认的200ms提高到50ms。但是经过修改之后,eclipse变得和visual studio 一样,你每输入一个字符,系统就会进行一次提示。不过我发现这种情况下eclipse占用的CPU、内存资源变多了,在我的笔记本有时候还会变得顿卡。这不是最好的办法。

前几天吧,我才发现这个问题的症结所在。原来是eclipse官方的快捷键方式改变了。其实以前Alt+/那个联想一直在,只是在3.7版本里面这个快捷键变成了自动补全(即系统自动选择一个最合适的进行补充)。我们需要做的就是依次打开Windows——preferences——General——Keys。找到Content Assist这一项,这一项系统默认的是Alt+Space。这里我们把它改成Alt+/

1…789…31
Junv

Junv

Go, JavaScript, Ruby on Rails, Java,Docker, CI, CD, Photography

307 日志
69 分类
247 标签
GitHub LinkedIn StackOverflow Weibo
© 2020 Junv