10天 撸一个小全栈项目(umi-nodeJs-mysql/redis 实现登录、增删改查)

1,220 阅读2分钟

寄语:前端开发也需要了解后端嘛?答案是肯定的,了解后端的数据的存储,模块划分、以及接口设计对于我们前端开发也是非常有好处的。

先上一张效果图

server端

1. 数据库 mysql, redis

考虑到session访问比较频繁,以及后续判断用户登录状态。采用内存缓存数据库redis,加快访问速度。封装redis操作:

const redis = require("redis");
const { REDIS_CONF } = require("../conf/db");
const redisClient = redis.createClient(REDIS_CONF.port, REDIS_CONF.host);
redisClient.on("error", err => {
  console.log("err", err);
});
const set = (key, value) => {
  if (typeof value === "object") {
    value = JSON.stringify(value);
  }
  redisClient.set(key, value, redis.print);
};
const get = key => {
  return new Promise((resolve, reject) => {
    redisClient.get(key, (err, value) => {
      if (err) {
        reject(err);
        return;
      }

      if (value == null) {
        resolve(null);
        return;
      }
      try {
        resolve(JSON.parse(value));
      } catch {
        resolve(value);
      }
    });
  });
};
module.exports = {
  get,
  set
};

mysql可以用来存储一些大数据量数据。封装mysql操作:

const mysql = require('mysql')
const { MYSQL_CONF } = require('../conf/db')
const con = mysql.createConnection(MYSQL_CONF)
con.connect()
const exec = sql => {
  return new Promise((resolve, reject) => {
    con.query(sql, (err, result) => {
      if (err) {
        reject(err)
        return
      }
      resolve(result)
    })
  })
}
module.exports = {
  exec
}

2. 接口、路由设计

将请求头中的cookie解析成key,value,存储到req.cookie. 用户首次登录判断cookie中是否存在userId(判断用户标识字段)。没有则给响应头cookie中设置一个userId

将get请求的参数封装成key,value.存储到request.query

将post接口参数是存储到request.body

请求url路径判断,分别做对应的接口路由处理。每次处理前需要判断userId是否在有效的登录期内。 eg:

if (method === "POST" && req.path === "/api/blob/new") {
    const loginCheckResult = loginCheck(req);
    if (loginCheckResult) {
      return loginCheckResult;
    }
    req.body.author = req.session.username;
    const result = newBlob(req.body);
    return result.then(data => new SuccessModel(data));
  }

3. controller

拿到从路由传过来的请求参数,拼接对应的sql语句, 并返回结果

const newBlob = (blobData = {}) => {
  const { title, content, author, createTime = Date.now() } = blobData;
  const sql = `insert into blogs (title, content, createTime, author)
    values('${title}', '${content}', ${createTime}, '${author}')
  `;
  return exec(sql).then(insertData => insertData.insertId);
};

客户端

特别提醒: 前端服务,和后端服务在不同端口,因此有浏览器跨域限制,可以在umi中配置代理服务器eg:


proxy: {
    '/api': {
      target: 'http://localhost:9000',
      changeOrigin: true
    }
  }

至此,整个项目前后端联调完成

未完待续, todo-next:

  1. 密码加密
  2. server端日志

github: github.com/promotion-x…