nodejs-设置权限

173 阅读3分钟

前言

登录注册

注册

  1. 查看用户是否存在
校验   
  用户存在了提示注册失败,

  用户不存在执行注册  

2. 添加新用户

登录

  1. 查看用户是否存在

  2. 校验用户名和密码

  3. 返回标识

cookie 存在客户端,安全性不高
session  存在服务器,安全性高 ,服务一旦挂了,数据丢失  

token 存在服务器,存的是一套算法,可以跨域

  jsonwebtoken  

用户注册

  router.post('/register', async (req, res) => {
    try {
      // 1. 查看用户是否已经注册  
      const sql = 'select * from user2 where username = ?'
      const { results } = await db.query(sql, req.body.username)
      // 2. 注册新用户
      if (results.length === 0) {
        const sql = 'insert into user2 set ?'
        const { results } = await db.query(sql, req.body)
        if (results.affectedRows !== 1) return res.send({ status: 0, message: '注册失败' })
        res.send({
          status: 0,
          message: 'success'
        })
      } else {
        res.send({
          status: 1,
          message: '用户已经存在'
        })
      }
    } catch (error) {
      res.send({
        message: error
      })
    }
  })

登录

router.post('/login', async (req, res) => {
    const sql = 'select * from user2 where username = ?'
    const { results } = await db.query(sql, req.body.username)

    if (results.length === 0) {
      return res.send({
        status: 0,
        message: '用户不存在'
      })
    }
    // 2. 判断用户名和密码是否正确  
    if (results[0].username === req.body.username && results[0].password === req.body.password) {
      // 3. 生成token返回给客户端   
      const token = jwt.sign(results[0].id)
      console.log(token)
      res.send({
        status: 0,
        token
      })
    }

  })

一、入口文件

const express = require('express')
const path = require('path')
const app = express()
// 设置跨域
app.use(require('cors')())

app.use(express.static(path.join(__dirname, './apidoc')))

app.use(express.urlencoded({ extended: false }))
app.use(express.json())

require('./routes/index.js')(app, express)

app.listen(3000, ['10.41.153.32', '127.0.0.1'], () => {
  console.log('本地服务 http://127.0.0.1:3000')
  console.log('远程服务 http://10.41.153.32:3000')
})

二、./routes/index.js

const db = require('../db')
const jwt = require('../utils/jwt')//生成token
const auth = require('../middleware/auth')//设置权限
module.exports = (app, express) => {
  const ctrl = require('../controller')
  const router = express.Router()

  // 请求资源
  router.get('/users', auth, ctrl.getUsers)

  // 根据id请求资源
  router.get('/users/:id', auth, ctrl.getUserById)

  // 添加资源
  router.post('/users', auth, ctrl.addUser)

  // 根据id更新资源
  router.put('/users/:id', auth, ctrl.updateUser)

  // 根据id删除资源
  router.delete('/users/:id', auth, ctrl.deleteUser)

  // 注册新用户
  router.post('/register', async (req, res) => {
    try {
      // 1. 查看用户是否已经注册  
      const sql = 'select * from user2 where username = ?'
      const { results } = await db.query(sql, req.body.username)
      // 2. 注册新用户
      if (results.length === 0) {
        const sql = 'insert into user2 set ?'
        const { results } = await db.query(sql, req.body)
        if (results.affectedRows !== 1) return res.send({ status: 0, message: '注册失败' })
        res.send({
          status: 0,
          message: 'success'
        })
      } else {
        res.send({
          status: 1,
          message: '用户已经存在'
        })
      }
    } catch (error) {
      res.send({
        message: error
      })
    }
  })

  // 登录
  router.post('/login', async (req, res) => {
    const sql = 'select * from user2 where username = ?'
    const { results } = await db.query(sql, req.body.username)
    if (results.length === 0) {
      return res.send({
        status: 0,
        message: '用户不存在'
      })
    }
    // 2. 判断用户名和密码是否正确  
    if (results[0].username === req.body.username && results[0].password === req.body.password) {
      // 3. 生成token返回给客户端   
      const token = jwt.sign(results[0].id)
      console.log(token)
      res.send({
        status: 0,
        token
      })
    }

  })

  app.use(router)
}

三、加密解密(../utils/jwt)

const SECRET = 'GAJLGHJALR'
const jwt = require('jsonwebtoken')
module.exports = {
  // 加密 
  sign(id) {
    return jwt.sign(
      {
        id
      },
      SECRET,
      { expiresIn: 1000 * 60 * 60 * 24 * 7 }
    )
  },
  // 解密
  async verify(token) {
    const { id } = await jwt.verify(token, SECRET)
    return id
  }
}

四、设置权限(../middleware/auth)

const jwt = require('../utils/jwt')
const db = require('../db')

module.exports = async (req, res, next) => {
  const token = req.query.token || req.headers.token || req.body.token || String(req.headers.authorization || '').split(' ').pop()

  if (!token) {
    res.send({
      status: 1,
      message: '请登录,检查是否传递了有效token'
    })
  }
  const id = await jwt.verify(token)
  console.log(id)
  if (!id) {
    res.send({
      status: 1,
      message: '用户不存在'
    })
  }

  const sql = 'select * from user2 where id = ?'
  const { results } = await db.query(sql, id)
  req.user = results
  next()
}

五、控制层(./controller/index.js)

const db = require('../db')
const moment = require('moment')
module.exports = {
  async getUsers(req, res) {
    try {
      const sql = 'select * from user where isdel = 0'
      const { results } = await db.query(sql)
      res.send({
        status: 0,
        message: results
      })
    } catch (error) {
      res.send({
        message: error
      })
    }
  },
  async getUserById(req, res) {
    try {
      const sql = 'select * from user where isdel = 0 and id = ?'
      const { results } = await db.query(sql, req.params.id)
      if (results.length === 0) return res.send({ status: 1, message: '英雄不存在' })
      res.send({
        status: 0,
        message: results
      })
    } catch (error) {
      res.send({
        message: error
      })
    }
  },
  async addUser(req, res) {
    try {
      const sql = 'insert into user set ?'
      const body = req.body
      body.add_time = moment().format('YYYY-MM-DD HH:mm:ss')
      const { results } = await db.query(sql, body)
      if (results.affectedRows !== 1) return res.send({ status: 1, message: '添加失败' })
      res.send({
        status: 0,
        message: 'success'
      })
    } catch (error) {
      res.send({
        message: error
      })
    }
  },
  async updateUser(req, res) {
    try {
      const sql = 'update user set ? where id = ?'
      const body = req.body
      body.add_time = moment().format('YYYY-MM-DD HH:mm:ss')
      const { results } = await db.query(sql, [body, req.params.id])
      if (results.affectedRows !== 1) return res.send({ status: 1, message: '更新失败' })
      res.send({
        status: 0,
        message: 'success'
      })
    } catch (error) {
      res.send({
        message: error
      })
    }
  },
  async deleteUser(req, res) {
    try {
      const sql = 'update user set isdel = 1 where id = ?'
      const { results } = await db.query(sql, req.params.id)
      if (results.affectedRows !== 1) return res.send({ status: 1, message: '删除失败' })
      res.send({
        status: 0,
        message: 'success'
      })
    } catch (error) {
      res.send({
        message: error
      })
    }
  }
}

六、连接层(./db/index.js)

module.exports = {
  query(sql, params = []) {
    return new Promise((resolve, reject) => {
      // 1. 引入mysql  
      const mysql = require('mysql')
      const dbConfig = require('./db.config')

      // 2. 创建连接对象 
      const connection = mysql.createConnection(dbConfig)

      // 3. 开启连接  
      connection.connect(err => {
        if (err) return reject(err.message + '----数据库连接失败')
        console.log('连接数据库成功')
      })

      // 4. 执行查询语句  
      connection.query(sql, params, (err, results, filds) => {
        if (err) return reject(err.message)
        resolve({
          results,
          filds
        })
      })

      // 5. 关闭连接  
      connection.end(err => {
        if (err) return reject(err.message)
        console.log('关闭数据库连接')
      })
    })
  }
}

./db/db.config.js

module.exports = {
  host: '127.0.0.1',
  user: 'root',
  password: 'root',
  database: '2101_3'
}

页面渲染上

1.首页(index.html)(加删除页)

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/bootstrap.min.css">
</head>

<body>

  <div class="container">
    <h1>英雄管理</h1>
    <a href="./add.html" class="btn btn-success pull-right">添加</a>
    <table class="table table-striped table-hover">
      <thead>
        <tr>
          <th>序号</th>
          <th>姓名</th>
          <th>年龄</th>
          <th>性别</th>
          <th>时间</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody id="tbody">

      </tbody>
    </table>


  </div>
  <script src="./js/jquery.min.js"></script>
  <script>
    function getUsers() {
      //获取本地token
      const token = localStorage.token
      console.log(token)
      $(function () {
        $.ajax({
          url: 'http://10.41.153.32:3000/users',
          //发送网络请求带上token
          headers: {
            Authorization: 'Bearer ' + token
          },
          success(res) {
            let html = '' 
            res.message.forEach(item => {
              html += `
            <tr>
              <td>${item.id}</td>
              <td>${item.name}</td>
              <td>${item.age}</td>
              <td>${item.sex}</td>
              <td>${item.add_time}</td>
              <td>
                <a href="./edit.html?id=${item.id}" class="btn btn-primary">编辑</a>
                <button type="button" class="btn btn-danger" data-id="${item.id}" id="deleteUsers">删除</button>
              </td>
            </tr>
            `
            })
            $('#tbody').html(html)
          }
        })
      })
    }
    getUsers()

    $('#tbody').on('click', '#deleteUsers', function () {
      // console.log($(this).data('id'))
      $.ajax({
        type: 'delete',
        url: 'http://10.41.153.32:3000/users/' + $(this).data('id'),
        success(res) {
          console.log(res)
          // location.reload()
          getUsers()
        }
      })
    })
  </script>
</body>

</html>

2.添加(add.html)

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/bootstrap.min.css">
</head>

<body>

  <div class="container">
    <h1>添加英雄</h1>

    <form>
      <div class="form-group">
        <label for="">姓名</label>
        <input type="text" class="form-control" id="name" placeholder="Input field">
      </div>

      <div class="form-group">
        <label for="">年龄</label>
        <input type="text" class="form-control" id="age" placeholder="Input field">
      </div>

      <div class="form-group">
        <label for="">性别</label>
        <input type="text" class="form-control" id="sex" placeholder="Input field">
      </div>

      <button type="button" class="btn btn-primary" id="addForm">Submit</button>
    </form>

  </div>
  <script src="./js/jquery.min.js"></script>
  <script>
    $(function () {
      // 1. 获取要传递的参数
      $('#addForm').click(function () {
        var data = {
          name: $('#name').val(),
          age: $('#age').val(),
          sex: $('#sex').val()
        }
        // 2. 发送ajax请求  
        $.ajax({
          type: 'post',
          url: 'http://10.41.153.32:3000/users',
          data,
          success(res) {
            console.log(res)
            // 3. 手动跳转到首页 
            location.href = '/'
          }
        })
      })
    })
  </script>
</body>

</html>

3.编辑(edit.html)

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/bootstrap.min.css">
</head>

<body>

  <div class="container">
    <h1>编辑英雄</h1>

    <form id="editForm">

    </form>

  </div>
  <script src="./js/jquery.min.js"></script>
  <script>
    $(function () {
      // const id = location.search.split('=')[1]
      const params = new URLSearchParams(location.search)
      const id = params.get('id')
      $.ajax({
        url: 'http://10.41.153.32:3000/users/' + id,
        success(res) {
          let html = `
            <div class="form-group">
              <label for="">姓名</label>
              <input type="text" class="form-control" id="name" value="${res.message[0].name}">
            </div>

            <div class="form-group">
              <label for="">年龄</label>
              <input type="text" class="form-control" id="age"  value="${res.message[0].age}">
            </div>

            <div class="form-group">
              <label for="">性别</label>
              <input type="text" class="form-control" id="sex"  value="${res.message[0].sex}">
            </div>

            <button type="button" class="btn btn-primary" id="editUsers">Submit</button>
          `
          $('#editForm').html(html)
        }
      })

      // 1. 获取要传递的参数
      $('#editForm').on('click', '#editUsers', function () {
        console.log(1)
        var data = {
          name: $('#name').val(),
          age: $('#age').val(),
          sex: $('#sex').val()
        }
        // 2. 发送ajax请求  
        $.ajax({
          type: 'put',
          url: 'http://10.41.153.32:3000/users/' + id,
          data,
          success(res) {
            // 3. 手动跳转到首页 
            location.href = '/'
          }
        })
      })
    })
  </script>
</body>

</html>

4.登录(login.html)

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/bootstrap.min.css">
</head>

<body>

  <div class="container">
    <h1>请登录账号</h1>

    <form>
      <div class="form-group">
        <label for="">用户名</label>
        <input type="text" class="form-control" id="username" value="admin">
      </div>

      <div class="form-group">
        <label for="">密码</label>
        <input type="password" class="form-control" id="password" value="admin">
      </div>


      <button type="button" class="btn btn-primary" id="loginForm">登录</button>
    </form>

  </div>
  <script src="./js/jquery.min.js"></script>
  <script>
    $(function () {
      // 1. 获取要传递的参数
      $('#loginForm').click(function () {
        var data = {
          username: $('#username').val(),
          password: $('#password').val(),
        }
        console.log(data)
        // 2. 发送ajax请求  
        $.ajax({
          type: 'post',
          url: 'http://10.41.153.32:3000/login',
          data,
          success(res) {
            // console.log('success')
            // 把token 保存到本地存储  
            localStorage.token = res.token
            location.href = './index.html'
          }
        })
      })
    })
  </script>
</body>

</html>