当前位置:   article > 正文

Vue2 + node.js项目

Vue2 + node.js项目

1、Vue2

vue2主要功能包括登入、退出、用户权限、表格的增删改查、文件下载。

Vue2项目地址icon-default.png?t=N7T8https://gitee.com/www6/finance1.git

2、node.js编写后端接口

创建项目

  1. npm install -g koa-generator //安装koa-generator
  2. koa2 创建项目名

在utils/index.js封装token

  1. var jwt = require('jsonwebtoken');
  2. const { secret, tokenExpires } = require('../conf');
  3. exports.createToken = (user) => {
  4. return jwt.sign(user, secret, {
  5. expiresIn: tokenExpires,
  6. });
  7. };
  8. exports.vertifyToken = (token) => {
  9. try {
  10. var decoed = jwt.verify(token, secret);
  11. } catch (e) {
  12. } finally {
  13. return decoed;
  14. }
  15. };
  16. exports.getUser = (token) => {
  17. return jwt.decode(token, secret);
  18. };

响应处理

  1. // 响应处理 app.js
  2. app.context.success = function (data) {
  3. this.body = {
  4. code: 20000,
  5. data,
  6. };
  7. };
  8. app.context.faild = function (data) {
  9. this.body = {
  10. code: 102,
  11. data,
  12. };
  13. };
  14. app.context.tokenExpires = function (data) {
  15. this.body = {
  16. code: 603,
  17. data,
  18. };
  19. };

创建成功之后,接着下一步。

2.2、建立Mysql链接

根目录新建models/db.js文件

  1. var mysql = require('mysql');
  2. const { db } = require('../conf');
  3. var pool = mysql.createPool(db);
  4. exports.query = function(sql,params=[]) {
  5. if (!params) {
  6. console.log('当前查询参数没有值,请查看',params);
  7. }
  8. return new Promise((resolve,reject)=>{
  9. pool.getConnection(function (err, connection) {
  10. if (err) throw err; // not connected!
  11. // Use the connection
  12. connection.query(sql,params, function (error, results, fields) {
  13. // 调试log
  14. console.log(`${sql}==>${params}=数据=>${results}`);
  15. connection.release();
  16. // Handle error after the release.
  17. if (error) {
  18. console.log('db出现异常:',error)
  19. return reject(error)
  20. }
  21. resolve(results);
  22. // Don't use the connection here, it has been returned to the pool.
  23. });
  24. });
  25. });
  26. }

根目录下新建conf.js文件

  1. exports.db = {
  2. connectionLimit: 10,
  3. host: "localhost",
  4. user: "xxx",
  5. password: "xxx",
  6. database: "xxx",
  7. };
  8. exports.secret = "xxx";
  9. exports.tokenExpires = 6000 * 3;
  10. exports.whiteList = ["/user/login", "/user/logout"];

2.3、登入

新建routes/user.js文件

  1. const router = require('koa-router')()
  2. const { doLogin} = require('../controllers/user');
  3. router.prefix('/user')
  4. .post('/login',doLogin)
  5. module.exports = router

新建controllers/user.js文件

  1. const {findUserByAccount} = require('../models/user');
  2. const { createToken, vertifyToken, getUser } = require('../utils');
  3. exports.doLogin = async (ctx, next) => {
  4. let { account, password } = ctx.request.body;
  5. if (!account || !password) {
  6. return ctx.faild('必须传递用户名和密码');
  7. }
  8. const res = await findUserByAccount(account);
  9. if (res.length === 0) {
  10. return ctx.faild('用户名或者密码不存在');
  11. }
  12. let user = res[0];
  13. if (user.password != password) {
  14. return ctx.faild('用户名或者密码不存在');
  15. }
  16. const saveUser = {
  17. id: user.id,
  18. account: user.account,
  19. // 权限
  20. type: user.role_id,
  21. };
  22. // 生成token
  23. const token = createToken(saveUser);
  24. ctx.success({
  25. token,
  26. });
  27. };
  28. ;

新建models/user.js文件

  1. const { query } = require('../models/db');
  2. exports.findUserByAccount = account => query('select * from user where account = ?',[account]);

2.4、中间件处理

  1. const { whiteList } = require('../conf');
  2. const { vertifyToken, getUser } = require('../utils');
  3. exports.checkLogin = async (ctx, next) => {
  4. // 非登录、退出
  5. // 需要检查的
  6. if (!whiteList.includes(ctx.url)) {
  7. const { token } = ctx.headers;
  8. let tokenIndex = ctx.blackTokenList.indexOf(token);
  9. // 验证token
  10. if (!vertifyToken(token)) {
  11. // 弹出这个元素,不允许访问,重新获取token
  12. ctx.blackTokenList.splice(tokenIndex, 1);
  13. return ctx.tokenExpires('无效token,请登录再试!');
  14. } else {
  15. // 黑名单: 退出后的token
  16. if (tokenIndex !== -1) return ctx.tokenExpires('token已经失效');
  17. // 解析token并存储到ctx的上面, ctx.state 本次请求的共享数据
  18. ctx.state.user = getUser(token);
  19. }
  20. }
  21. await next();
  22. };
  1. // app.js全局引入
  2. const { responseHandler, checkLogin } = require('./middlewares');
  3. app.use(checkLogin);

2.5、用户详情

  1. router.prefix('/user')
  2. .get('/info',getInfo)
  3. exports.getInfo = async (ctx) => {
  4. const user = ctx.state.user;
  5. if (!user) return ctx.faild('用户信息获取失败!');
  6. const { id } = user;
  7. const res = await findUserById(id);
  8. const dbUser = res[0];
  9. if (!dbUser) return ctx.faild('用户信息不存在,或者已经被删除');
  10. ctx.success({
  11. info: '获取成功!',
  12. roles: [{ name: dbUser.role_name }],
  13. });
  14. };
  15. exports.findUserById = id => query('select * from user where id = ?',[id]);

2.6、退出

  1. router.prefix('/user')
  2. .post('/logout',logout)
  3. // 退出后的token 在app.js全局添加
  4. app.context.blackTokenList = [];
  5. exports.logout = async (ctx) => {
  6. ctx.blackTokenList.push(ctx.headers.token);
  7. return ctx.tokenExpires('退出成功');
  8. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/283427?site
推荐阅读
相关标签
  

闽ICP备14008679号