基于koa2开发的用户中心

虚拟货币
• 阅读 3164

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});
  • 工程目录

    基于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 工具类的封装

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这