您的位置:首页 > 数据库 > Mongodb

基于koa2开发的一个用户中心

2017-07-19 00:00 393 查看

Ucenter

..表格这边显示错误, github 地址

版本

|version|content|date
|:--|:----|:----
|v0.1.0|项目迁移构建|17.04.23
|v0.2.0|支持通过github授权登录|17.05.23
|v0.2.1|支持docker!从配置上支持😅|17.06.28

API doc

docker image

docker-compose run

docker-compose up -d


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});


工程目录



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 工具类的封装
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐