mysql+socket.io

笔记

1.NodeJS——数据库
2.数据交互——Ajax跨域
3.WebSocket

--------------------------------------------------------------------------------

导入数据——必须先建库

--------------------------------------------------------------------------------

1.连接
  let db=mysql.createConnection({host, port, user, password, database});
  ?

2.查询
  db.query('干啥', (err, data)=>{});

--------------------------------------------------------------------------------

SQL:
4大查询
1.增   INSERT
  INSERT INTO 表 (字段列表) VALUES(值列表)

  INSERT INTO user_table (ID, name, gender, chinese, math, english) VALUES(0, 'blue', '男', 35, 18, 29);

2.删   DELETE
  DELETE FROM 表 WHERE 条件

  DELETE FROM user_table WHERE ID=3;

3.改   UPDATE
  UPDATE 表 SET 字段=值, 字段2=值2, ... WHERE 条件

  UPDATE user_table SET chinese=100 WHERE ID=2;

4.查   SELECT
  SELECT 字段列表 FROM 表 WHERE 条件

  SELECT name, gender FROM user_table WHERE ID=2;

--------------------------------------------------------------------------------

1.node中mysql写法
  let db=mysql.createConnection({配置});
  let db=mysql.createPool({配置});

  db.query(sql, (err, data)=>{});

2.基础SQL语句
  增删改查

--------------------------------------------------------------------------------

用户注册、登陆:
1.数据库结构(数据字典)
2.接口格式(接口文档)

--------------------------------------------------------------------------------

1.数据库结构
2.接口
注册:
  /reg?user=xxx&pass=xxx
  =>{err: 0, msg: '原因'}

登陆:
  /login?user=xxx&pass=xxx
  =>{err: 0, msg: '原因'}

--------------------------------------------------------------------------------

RESTful

--------------------------------------------------------------------------------

WebSocket:
1.双向通信
2.自动跨域
3.性能高

--------------------------------------------------------------------------------

socket.io

--------------------------------------------------------------------------------

WebSocket不是独立使用

mysql.js

const mysql=require('mysql');

//连接池
let db=mysql.createPool({host: 'localhost', user: 'root', password: '', port: 3309, database: '20180127'});

db.query(`INSERT INTO student_table (ID, name, gender, chinese, math, english) VALUES(0, '小明', '男', 98, 5, 3);`, (err, data)=>{
  if(err){
    console.log('错了', err);
  }else{
    console.log(data);
  }
});

server.js

const http=require('http');
const mysql=require('mysql');
const fs=require('fs');
const url=require('url');
const zlib=require('zlib');
const crypto=require('crypto');

const _key='sadfslekrtuew5iutoselgdtjiypoydse4ufhs.edtyo;s8te4arfeliawkfhtsie5tlfia;sefdshroiupeoutwyeli5gurse;ihf';

function md5(str){
  let obj=crypto.createHash('md5');

  obj.update(str);

  return obj.digest('hex');
}

function md5_2(str){
  return md5(md5(str)+_key);
}

let db=mysql.createPool({host: 'localhost', port: 3309, user: 'root', password: '', database: '20180127'});

let server=http.createServer((req, res)=>{
  let {pathname, query}=url.parse(req.url, true);
  let {user, pass}=query;

  switch(pathname){
    //接口
    case '/reg':
      //校验
      if(!user){
        res.write('{"err": 1, "msg": "username can\'t be null"}');
        res.end();
      }else if(!pass){
        res.write('{"err": 1, "msg": "password can\'t be null"}');
        res.end();
      }else if(!/^\w{4,16}$/.test(user)){
        res.write('{"err": 1, "msg": "username is invaild"}');
        res.end();
      }else if(/['|"]/.test(pass)){
        res.write('{"err": 1, "msg": "password is invaild"}');
        res.end();
      }else{
        db.query(`SELECT * FROM user_table WHERE username='${user}'`, (err, data)=>{
          if(err){
            res.write('{"err": 1, "msg": "database error"}');
            res.end();
          }else if(data.length>0){
            res.write('{"err": 1, "msg": "this username exsits"}');
            res.end();
          }else{
            db.query(`INSERT INTO user_table (ID,username,password) VALUES(0,'${user}','${md5_2(pass)}')`, (err, data)=>{
              if(err){
                res.write('{"err": 1, "msg": "database error"}');
                res.end();
              }else{
                res.write('{"err": 0, "msg": "success"}');
                res.end();
              }
            });
          }
        });
      }
      break;
    case '/login':
      //校验
      if(!user){
        res.write('{"err": 1, "msg": "username can\'t be null"}');
        res.end();
      }else if(!pass){
        res.write('{"err": 1, "msg": "password can\'t be null"}');
        res.end();
      }else if(!/^\w{4,16}$/.test(user)){
        res.write('{"err": 1, "msg": "username is invaild"}');
        res.end();
      }else if(/['|"]/.test(pass)){
        res.write('{"err": 1, "msg": "password is invaild"}');
        res.end();
      }else{
        db.query(`SELECT * FROM user_table WHERE username='${user}'`, (err, data)=>{
          if(err){
            res.write('{"err": 1, "msg": "database error"}');
            res.end();
          }else if(data.length==0){
            res.write('{"err": 1, "msg": "no this user"}');
            res.end();
          }else if(data[0].password!=md5_2(pass)){
            res.write('{"err": 1, "msg": "username or password is incorrect"}');
            res.end();
          }else{
            res.write('{"err": 0, "msg": "success"}');
            res.end();
          }
        });
      }
      break;
    default:
      //缓存      TODO
      //静态文件
      let rs=fs.createReadStream(`www${pathname}`);
      let gz=zlib.createGzip();

      res.setHeader('content-encoding', 'gzip');
      rs.pipe(gz).pipe(res);

      rs.on('error', err=>{
        res.writeHeader(404);
        res.write('Not Found');
        res.end();
      });
  }
});
server.listen(8080);

1.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="jquery.js" charset="utf-8"></script>
    <script>
    $(function (){
      //注册
      $('#btn_reg').click(function (){
        $.ajax({
          url: '/reg',
          data: {user: $('#user').val(),pass: $('#pass').val()},
          dataType: 'json',
          success(json){
            if(json.err){
              alert('注册失败'+json.msg);
            }else{
              alert('注册成功');
            }
          },
          error(err){
            alert('失败');
          }
        });
      });

      //登陆
      $('#btn_login').click(function (){
        $.ajax({
          url: '/login',
          data: {user: $('#user').val(),pass: $('#pass').val()},
          dataType: 'json',
          success(json){
            if(json.err){
              alert('登陆失败'+json.msg);
            }else{
              alert('登陆成功');
            }
          },
          error(err){
            alert('失败');
          }
        });
      });
    });
    </script>
  </head>
  <body>
    用户:<input type="text" id="user" /><br>
    密码:<input type="password" id="pass" /><br>
    <input type="button" value="注册" id="btn_reg">
    <input type="button" value="登陆" id="btn_login">
  </body>
</html>

socket.io

 

1.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="http://localhost:8080/socket.io/socket.io.js" charset="utf-8"></script>
    <script>
    let sock=io.connect('ws://localhost:8080/');

    //sock.emit
    //sock.on

    //sock.emit('aaa', 12, 5, 8);

    sock.on('t', function (ts){
      console.log(ts);
    });
    </script>
  </head>
  <body>

  </body>
</html>

ws_server.js

const http=require('http');
const io=require('socket.io');

let httpServer=http.createServer();
httpServer.listen(8080);

let wsServer=io.listen(httpServer);
wsServer.on('connection', sock=>{
  //sock.emit   发送
  //sock.on     接收

  /*sock.on('aaa', function (a, b, c){
    console.log(a, b, c);
  });*/

  setInterval(function (){
    sock.emit('t', new Date().getTime());
  }, 1000);
});

 

posted @ 2018-10-11 09:08  二月花开  阅读(643)  评论(0编辑  收藏  举报