-
版本
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 }
- passport.js
-
test 测试用例文件夹
-
util 工具类的封装
-
xlelou / ucenter Goto Github PK
View Code? Open in Web Editor NEWThis project forked from mane115/ucenter
a user center server
License: MIT License