基于koa2开发的用户中心

Ucenter

  • github

  • API doc

  • 版本

    versioncontentdate
    v0.1.0项目迁移构建17.04.23
    v0.2.0支持通过github授权登录17.05.23
  • model设计

    • redis

      • app.js

      keytypename
      appshashhget apps {appId} =>{app secret}
      • token.js

      keytypename
      token:${token}hashkey为token的值
      -access_tokenhash fieldaccess token
      -refresh_tokenhash fieldrefresh token
      -app_idhash fieldtoken 对应的app
      -user_idhash fieldtoken对应的user id (objectId)
      -user_short_idhash fieldtoken对应的user 短id
      -expire_athash fieldtoken 到期日期(timestamp)
      -typehash fieldtoken类型 (access_token/refresh_token)
      • user.js

      keyvaluename
      user:total:${app}keys存储app对应的用户总数
      ${year}-${month}-${today}:${app}bitmap存储每个app每日每个用户的在线状态和在线总数(详情可搜索如何用bitmap存储用户访问信息)
    • mongo

      • user.js

      keytypename
      _idObjectIdmongo主键
      short_idNumber用户短id 基于redis.userTotalCount
      nameString用户名
      mobileString用户注册手机
      appsArray用户关联的apps,以appId组成的Array
      statusNumber用户状态 0:active 1:baned
      create_atDate用户创建日期
      chanceNumber创建的时候随机生成的0~1数,用于随机选取用户
      oauthArray存储用户授权平台的信息
      -platformString授权平台名称
      -platform_user_idString平台的用户id
      -platform_user_nameString平台用户名
      -emailString用户在平台绑定的邮箱
      -avatarString平台的用户头像
      -statusNumber用户状态 0:active 1:baned
      -bind_atDate绑定时间

      索引:

          users.index({create_at: -1});
          users.index({name: 1});
          users.index({mobile: 1});
          users.index({'oauth.platform': 1,'oauth.platform_user_id': 1}, {unique: true});
      • app.js

      keytypename
      _idObjectIdmongo主键
      app_idStringapp 独立的id,每个app唯一
      user_idString关联用户表的_id
      passwordString用户密码
      statusNumber用户状态 0:active 1:baned
      create_atDate用户改app的注册时间
      update_atDate用户信息更新时间
      last_loginDate上次登录时间
      last_refreshDate上册refresh token 时间
      login_timesNumber登陆次数

      索引:

          apps.index({app_id: 1, user_id: 1});
      • token.js

      keytypename
      _idObjectIdmongo主键
      user_idStringtoken关联用户表的_id
      app_idStringtoken关联的app_id
      access_tokenStringaccess token
      refresh_tokenStringrefresh token
      access_expire_atDateaccess token 的到期时间
      refresh_expire_atDaterefresh token 的到期时间
      platformArray使用过的平台

      索引:

          tokens.index({app_id: 1, user_id: 1});
  • 工程目录

    《基于koa2开发的用户中心》

    • 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 password {string} 原始密码
         * @return hash {object} 加密密码
         * @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 password {string} 原始密码
         * @param hash {string} 加密密码
         * @return res {boolean} 比对结果 true:密码匹配 | false:密码不匹配
         * @author gh
         */
        var validate = async function(password, hash) {
            var res = await bcrypt.compareAsync(password, hash);
            return res
        };
        module.exports = {
            encrypt,
            validate
        }
    • test 测试用例文件夹

    • util 工具类的封装

    原文作者:mane115
    原文地址: https://segmentfault.com/a/1190000009531215
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞