Ucenter

  • github
  • API doc
  • 版本
    version content date
    v0.1.0 项目迁移构建 17.04.23
    v0.2.0 支持通过github授权登录 17.05.23
  • model设计
    • redis

      • app.js

      key type name
      apps hash hget apps {appId} =>{app secret}
      • token.js

      key type name
      token:${token} hash key为token的值
      -access_token hash field access token
      -refresh_token hash field refresh token
      -app_id hash field token 对应的app
      -user_id hash field token对应的user id (objectId)
      -user_short_id hash field token对应的user 短id
      -expire_at hash field token 到期日期(timestamp)
      -type hash field token类型 (access_token/refresh_token)
      • user.js

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

      • user.js

      key type name
      _id ObjectId mongo主键
      short_id Number 用户短id 基于redis.userTotalCount
      name String 用户名
      mobile String 用户注册手机
      apps Array 用户关联的apps,以appId组成的Array
      status Number 用户状态 0:active 1:baned
      create_at Date 用户创建日期
      chance Number 创建的时候随机生成的0~1数,用于随机选取用户
      oauth Array 存储用户授权平台的信息
      -platform String 授权平台名称
      -platform_user_id String 平台的用户id
      -platform_user_name String 平台用户名
      -email String 用户在平台绑定的邮箱
      -avatar String 平台的用户头像
      -status Number 用户状态 0:active 1:baned
      -bind_at Date 绑定时间

      索引:

          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

      key type name
      _id ObjectId mongo主键
      app_id String app 独立的id,每个app唯一
      user_id String 关联用户表的_id
      password String 用户密码
      status Number 用户状态 0:active 1:baned
      create_at Date 用户改app的注册时间
      update_at Date 用户信息更新时间
      last_login Date 上次登录时间
      last_refresh Date 上册refresh token 时间
      login_times Number 登陆次数

      索引:

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

      key type name
      _id ObjectId mongo主键
      user_id String token关联用户表的_id
      app_id String token关联的app_id
      access_token String access token
      refresh_token String refresh token
      access_expire_at Date access token 的到期时间
      refresh_expire_at Date refresh token 的到期时间
      platform Array 使用过的平台

      索引:

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

    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 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
34 声望1 粉丝