# 框架
## node.js + Express + mysql + bower

* 生成工程: express --css stylus login
* 运行工程: DEBUG=login:* npm start

## 登录接口
  
  /login 交互方式 post json
  参数 username 用户名
  参数 password 密码 (md5)

实现:
点击(此处)折叠或打开
  1. var express = require('express');
  2. var router = express.Router();
  3. var db = require('./db.js');

  4. /* GET login listing. */
  5. router.post('/', function(req, res, next) {
  6.     var data = {};
  7.     data.ret = -1;
  8.     data.msg = "登录失败";

  9.     var name = req.param("name");
  10.     var password = req.param("password");
  11.     db.connection.query("select * from " + db.tb_name + " where name=? ", [name],
  12.         function (err, rows) {
  13.             console.error(rows);

  14.             if (rows.length == 0) {
  15.                 // 无此用户名
  16.                 data.msg = "无此用户名";
  17.                 res.json(data);
  18.                 return;
  19.             }

  20.             item = rows[0];
  21.             if (item.password.toUpperCase() == password.toUpperCase()) {
  22.                 data.msg = "登录成功";
  23.                 data.ret = 0;
  24.             }
  25.             else {
  26.                 data.msg = "密码错误";
  27.                 data.ret = -2;
  28.             }

  29.             res.json(data);
  30.             return;

  31.         });
  32. });

  33. router.get('/', function(req, res, next) {
  34.   res.render('login',
  35.       { title:'用户登录',
  36.         btn_name:"登录",
  37.         post_url:"/login"
  38.       });
  39. });

  40. module.exports = router;

## 注册接口

  /register 交互方式 post json
  参数 username 用户名
  参数 password 密码 (md5)
实现:

点击(此处)折叠或打开

  1. var express = require('express');
  2. var router = express.Router();
  3. var db = require('./db.js');

  4. function sql_default_cb(err, rows)
  5. {
  6.   if (err) {
  7.     console.error('error connecting: ' + err.stack);
  8.     return;
  9.   }
  10.   console.error('');
  11.   console.error(rows);
  12.   console.error('');
  13. }

  14. /* GET register listing. */
  15. router.get('/', function(req, res, next) {
  16.   res.render('login',
  17.       { title:'用户注册',
  18.         btn_name:"注册",
  19.         post_url:"/register"
  20.       });
  21. });

  22. router.post('/', function(req, res, next) {
  23.   var data = {};
  24.   data.ret = -1;
  25.   data.msg = "登录失败";
  26.   //data.name = req.param("name");
  27.   //data.password = req.param("password");

  28.   var name = req.param("name");
  29.   var password = req.param("password");

  30.   // 注册
  31.   db.connection.query("select * from " + db.tb_name + " where name=?", [name],
  32.       function(err, rows) {
  33.         if (rows.length!=0) {
  34.           data.msg = "用户名重复";
  35.           data.ret = -2;
  36.           res.json(data);
  37.           return;
  38.         }

  39.         // register
  40.         db.connection.query("insert into " + db.tb_name + "(name, password) values (?, ?)", [name, password],
  41.         function(err, rows) {

  42.           if (err) {
  43.             console.error(err);
  44.             data.ret = -3;
  45.             data.msg = "数据库插入错误";
  46.           }
  47.           else {
  48.             data.ret = 0;
  49.             data.msg = "注册成功";
  50.           }

  51.           console.error(rows);
  52.           res.json(data);
  53.           return;
  54.         });
  55.       });
  56. });

  57. module.exports = router;

## 表结构描述
字段类型默认值描述
_id
int

主键、自增长
name
varchar


password
varchar



## 网页端测试代码
网页端测试采用jquery.form来实现

login.jade -> login.html

点击(此处)折叠或打开

  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head><title>用户登录</title>
  4.     <meta charset="UTF-8">
  5.     <link href="/bower_components/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
  6.     <script src="/bower_components/jquery/dist/jquery.min.js"></script>
  7.     <script src="/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
  8.     <script src="/javascripts/jquery.form.js"></script>
  9.     <script src="/javascripts/jquery.md5.js"></script>
  10. </head>
  11. <body>
  12. <div class="container">
  13.     <div class="row">
  14.         <div style="padding-top:30px; " class="col-md-12">
  15.             <form id="form_Register" role="form" method="post" class="form-horizontal">
  16.                 <div class="form-group">
  17.                     <div class="col-md-2"></div>
  18.                     <h2 id="info" class="alert alert-success col-md-10"></h2></div>
  19.                 <div class="form-group"><label for="name" class="col-md-2 control-label">用户名</label>

  20.                     <div class="col-md-10"><input id="name" type="text" name="name" placeholder="请输入用户名(英文)" required=""
  21.                                                   class="form-control"></div>
  22.                 </div>
  23.                 <div class="form-group"><label for="password" class="col-md-2 control-label">密码</label>

  24.                     <div class="col-md-10"><input id="password" type="password" placeholder="请输入密码" required=""
  25.                                                   class="form-control"></div>
  26.                 </div>
  27.                 <div class="form-group">
  28.                     <div class="col-md-offset-2 col-md-10">
  29.                         <button type="submit" class="btn btn-primary">登录</button>
  30.                     </div>
  31.                     <div id="result" style="display:none;" class="result"></div>
  32.                 </div>
  33.             </form>
  34.         </div>
  35.     </div>
  36. </div>
  37. <script>var post_url = "/login";</script>
  38. <script src="/javascripts/login.js"></script>
  39. </body>
  40. </html>

login.js:

点击(此处)折叠或打开

  1. $(document).ready(function(){

  2.     function log(msg)
  3.     {
  4.         $("#info").text(msg);
  5.         $("#info").show();
  6.         timer.reset();
  7.     }

  8.     $('#form_Register').ajaxForm({
  9.         url: post_url,
  10.         type: "post",
  11.         dataType: "json",
  12.         beforeSubmit: function (arr, $form, options){
  13.             var password_md5 = $.md5($("#password").val());
  14.             arr.push({ name: 'password', value: password_md5 });
  15.             return true;
  16.         },
  17.         success: function(data) {
  18.             switch (data.ret) {
  19.                 default:
  20.                     log(data.msg);
  21.                     break;
  22.             }
  23.         }
  24.     });

  25.     // For Test
  26.     $("#name").val("admin1");
  27.     $("#password").val("123");

  28. });


## Android测试源码:
采用Volley网络库实现:  https://git.oschina.net/caicry/volley

点击(此处)折叠或打开

  1. View.OnClickListener mBtnLoginCallback = new View.OnClickListener() {
  2.         
  3.         @Override
  4.         public void onClick(View v) {
  5.             String strName = editName.getText().toString();
  6.             String strPasword = editPassword.getText().toString();    
  7.         
  8.             if (strName.length() == 0 ||
  9.                     strPasword.length() == 0) {
  10.                 showToast(
09-27 10:02