基于koa2开发的一个用户中心
发布于 6 个月前 作者 mane115 1065 次浏览 来自 分享

Ucenter

github地址

上一年接手了一个开发oauth2的鉴权服务器的项目,基于drywall开发的,但是drywall的工程目录用起来十分不顺手,所以私底下用koa2写了重构了用户中心,支持单账号多app,在这里分享下我的开发心得。 有事出去一下,就先分享下模型设计和目录结构吧~ ?? 为什么表格显示都是乱的?预览是正常的?

  • 逻辑流程

    留坑

  • 程序设计

    留坑

  • model设计

    模型设计的表格显示都少了一列,等我搞清楚原因再放上来吧,github上面的模型设计是正常的

  • 工程目录

    untitled4.png

    • common

      • const.js 存放静态变量
      • error.map.js 存放错误码
    • config

      • config.dev.js 存放开发环境配置
      • config.workong.js 开发环境配置示例
      • config.production.js 存放生产环境配置
      • index.js 根据运行环境返回配置文件
    • controller 业务逻辑存放的文件目录

    • dao 数据库代理文件夹

      • mongo 对mongo的数据操作
      • sql 对sql的数据操作
      • redis 对redis的数据操作
    • logs 日志文件夹

    • midware

      • filter 该文件夹下的文件基于业务分类,封装了每个接口的数据过滤中间件
      • auth.js 验证中间件,验证token的合法性等用途
      • log.js 我使用的是使用log4js,所以基于业务配置了不同的appender 这里放一点代码解释会实际一点
        const log4js = require('log4js'),
        	  adminLogger = log4js.getLogger('admin'),
        	  oauthLogger = log4js.getLogger('oauth'),
        	  commonLogger = log4js.getLogger('common'),
        	  userLogger = log4js.getLogger('user');
        var user = async(ctx, next) => {
        	  ctx.logger = userLogger;
        	  await next()
        };   
        
    • model 数据库model定义

    • router 路由定义

    • service 第三方服务等封装,例如我把密码加密,验证放在了这里做成一个服务,token也封装成一个服务,这样以后更改密码加密形式或者token加密形式的时候就可以直接在这里改。

      • passport.js
        var bcrypt = require('bcrypt');
        var Promise = require('bluebird');
        var config = require('../config');
        Promise.promisifyAll(bcrypt);
        /**
         * 加盐加密
         * [@param](/user/param) password {string} 原始密码
         * [@return](/user/return) hash {object} 加密密码
         * [@author](/user/author) gh
         */
        var encrypt = async function(password) {
            var salt = await bcrypt.genSaltAsync(config.password.saltTimes);
            var hash = await bcrypt.hashAsync(password, salt);
            return hash;
        };
        /**
         * 密码对比
         * [@param](/user/param) password {string} 原始密码
         * [@param](/user/param) hash {string} 加密密码
         * [@return](/user/return) res {boolean} 比对结果 true:密码匹配 | false:密码不匹配
         * [@author](/user/author) gh
         */
        var validate = async function(password, hash) {
            var res = await bcrypt.compareAsync(password, hash);
            return res
        };
        module.exports = {
            encrypt,
            validate
        }
        
    • test 测试用例文件夹

    • util 工具类的封装

回到顶部