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