摘要:加鹽加密原始密碼加密密碼密碼對比原始密碼加密密碼比對結(jié)果密碼匹配密碼不匹配測試用例文件夾工具類的封裝
Ucenter
github
API doc
版本
version | content | date |
---|---|---|
v0.1.0 | 項(xiàng)目遷移構(gòu)建 | 17.04.23 |
v0.2.0 | 支持通過github授權(quán)登錄 | 17.05.23 |
model設(shè)計
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 對應(yīng)的app |
-user_id | hash field | token對應(yīng)的user id (objectId) |
-user_short_id | hash field | token對應(yīng)的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對應(yīng)的用戶總數(shù) |
${year}-${month}-${today}:${app} | bitmap | 存儲每個app每日每個用戶的在線狀態(tài)和在線總數(shù)(詳情可搜索如何用bitmap存儲用戶訪問信息) |
mongo
user.js
key | type | name |
---|---|---|
_id | ObjectId | mongo主鍵 |
short_id | Number | 用戶短id 基于redis.userTotalCount |
name | String | 用戶名 |
mobile | String | 用戶注冊手機(jī) |
apps | Array | 用戶關(guān)聯(lián)的apps,以appId組成的Array |
status | Number | 用戶狀態(tài) 0:active 1:baned |
create_at | Date | 用戶創(chuàng)建日期 |
chance | Number | 創(chuàng)建的時候隨機(jī)生成的0~1數(shù),用于隨機(jī)選取用戶 |
oauth | Array | 存儲用戶授權(quán)平臺的信息 |
-platform | String | 授權(quán)平臺名稱 |
-platform_user_id | String | 平臺的用戶id |
-platform_user_name | String | 平臺用戶名 |
String | 用戶在平臺綁定的郵箱 | |
-avatar | String | 平臺的用戶頭像 |
-status | Number | 用戶狀態(tài) 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 獨(dú)立的id,每個app唯一 |
user_id | String | 關(guān)聯(lián)用戶表的_id |
password | String | 用戶密碼 |
status | Number | 用戶狀態(tài) 0:active 1:baned |
create_at | Date | 用戶改app的注冊時間 |
update_at | Date | 用戶信息更新時間 |
last_login | Date | 上次登錄時間 |
last_refresh | Date | 上冊refresh token 時間 |
login_times | Number | 登陸次數(shù) |
索引:
apps.index({app_id: 1, user_id: 1});
token.js
key | type | name |
---|---|---|
_id | ObjectId | mongo主鍵 |
user_id | String | token關(guān)聯(lián)用戶表的_id |
app_id | String | token關(guān)聯(lián)的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 存放靜態(tài)變量
error.map.js 存放錯誤碼
config
config.dev.js 存放開發(fā)環(huán)境配置
config.workong.js 開發(fā)環(huán)境配置示例
config.production.js 存放生產(chǎn)環(huán)境配置
index.js 根據(jù)運(yùn)行環(huán)境返回配置文件
controller 業(yè)務(wù)邏輯存放的文件目錄
dao 數(shù)據(jù)庫代理文件夾
mongo 對mongo的數(shù)據(jù)操作
sql 對sql的數(shù)據(jù)操作
redis 對redis的數(shù)據(jù)操作
logs 日志文件夾
midware
filter 該文件夾下的文件基于業(yè)務(wù)分類,封裝了每個接口的數(shù)據(jù)過濾中間件
auth.js 驗(yàn)證中間件,驗(yàn)證token的合法性等用途
log.js 我使用的是使用log4js,所以基于業(yè)務(wù)配置了不同的appender
這里放一點(diǎn)代碼解釋會實(shí)際一點(diǎn)
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 數(shù)據(jù)庫model定義
router 路由定義
service 第三方服務(wù)等封裝,例如我把密碼加密,驗(yàn)證放在了這里做成一個服務(wù),token也封裝成一個服務(wù),這樣以后更改密碼加密形式或者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} 比對結(jié)果 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 工具類的封裝
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88279.html
摘要:加鹽加密原始密碼加密密碼密碼對比原始密碼加密密碼比對結(jié)果密碼匹配密碼不匹配測試用例文件夾工具類的封裝 Ucenter github API doc 版本 version content date v0.1.0 項(xiàng)目遷移構(gòu)建 17.04.23 v0.2.0 支持通過github授權(quán)登錄 17.05.23 model設(shè)計 redis app.js key...
摘要:云集一線大廠有真正實(shí)力的程序員團(tuán)隊(duì)云集一線大廠經(jīng)驗(yàn)豐厚的碼農(nóng),開源奉獻(xiàn)各教程。融合多種常見的需求場景網(wǎng)絡(luò)請求解析模板引擎靜態(tài)資源日志記錄錯誤請求處理。結(jié)合語句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨(dú)特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實(shí)戰(zhàn)操作過程。 云...
摘要:玩轉(zhuǎn)同時全面掌握潮流技術(shù)采用新一代的開發(fā)框架更小更富有表現(xiàn)力更健壯。融合多種常見的需求場景網(wǎng)絡(luò)請求解析模板引擎靜態(tài)資源日志記錄錯誤請求處理。結(jié)合語句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨(dú)特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實(shí)戰(zhàn)操作過程。 云集一線大廠...
安裝搭建項(xiàng)目的開發(fā)環(huán)境 視頻地址:https://www.cctalk.com/v/15114357764004 showImg(https://segmentfault.com/img/remote/1460000012470016?w=1214&h=718); 文章 Koa 起手 - 環(huán)境準(zhǔn)備 由于 koa2 已經(jīng)開始使用 async/await 等新語法,所以請保證 node 環(huán)境在 7.6...
閱讀 3089·2021-11-25 09:43
閱讀 2266·2021-09-07 10:28
閱讀 3605·2021-08-11 11:14
閱讀 2788·2019-08-30 13:49
閱讀 3554·2019-08-29 18:41
閱讀 1174·2019-08-29 11:26
閱讀 1983·2019-08-26 13:23
閱讀 3382·2019-08-26 10:43