移動端的賬號模塊設計

一朝群、概述

「賬號」指的就是App的登錄賬號燕耿,如手機號碼。你可以能會認為姜胖,賬號不就一個手機號碼誉帅,頂多加一個UserInfo用戶信息,這個有啥好講的呢右莱?確實蚜锨,市面上大部分App確實如此,也能夠滿足業(yè)務需求了慢蜓。

不過亚再,實際中存在這樣場景下:
  • 一個用戶的「賬號」下面存在「子賬號」;
  • 用戶基礎數(shù)據(jù)多晨抡,含有多個用戶數(shù)據(jù)類氛悬;
  • 用戶相關(guān)數(shù)據(jù),多個接口返回凄诞;
  • 服務器重構(gòu)圆雁,接口迭代,返回數(shù)據(jù)字段變更帆谍;
  • 一個App往往伪朽,是允許多個用戶登錄,有些App也希望緩存多個賬號信息汛蝙,等等烈涮。

這些場景下,不進行賬號的管理治理窖剑,那么后續(xù)訪問用戶基礎數(shù)據(jù)坚洽,更新用戶基礎數(shù)據(jù),將會越發(fā)吃力西土,也是很容易出錯的讶舰。

二、移動端賬號需要考慮的問題

  • 賬號數(shù)據(jù)緩存和持久化
    大部分的用戶數(shù)據(jù)直接簡單本地緩存和內(nèi)存緩存即需了,但也存在數(shù)據(jù)流多訪問頻率極低的跳昼,需要查詢的可以考慮持久化到數(shù)據(jù)庫中,例如IM用戶關(guān)系肋乍、通訊錄等鹅颊。

  • 賬號數(shù)據(jù)安全性問題
    核心數(shù)據(jù)盡可能不存放本地,例如銀行卡號墓造,密碼等等堪伍。確有需求锚烦,則需要考慮安全加密機制,避免被破解泄露信息帝雇。

  • 賬號數(shù)據(jù)訪問接口設計
    賬號數(shù)據(jù)是整個App最基礎的數(shù)據(jù)涮俄,它的訪問頻率無疑是最高,網(wǎng)絡請求摊求、key值禽拔、數(shù)據(jù)庫字段等都需要它刘离。因此室叉,一套方便快捷的訪問接口,無疑會讓業(yè)務方調(diào)用更加舒心硫惕,無形也提高開發(fā)效率茧痕。

  • 移動端賬號數(shù)據(jù)訪問特點
    多讀少些是移動端賬號數(shù)據(jù)的訪問特點,往往是一次更新后續(xù)直接訪問恼除。對于數(shù)據(jù)同步方案踪旷,可以考慮加入讀寫鎖進行保護。

  • 賬號數(shù)據(jù)與服務器解耦
    服務器往往因為重構(gòu)豁辉、優(yōu)化等導致接口數(shù)據(jù)字段變更令野,如果一開始直接使用接口數(shù)據(jù)Model的話,整個App所有相關(guān)都要進行修改徽级,如果是跨App或者跨項目气破,更是無可接受的。
    因此餐抢,有必要設計內(nèi)部賬號Model现使,與外部隔離開。

三旷痕、設計方案

3.1碳锈、賬號模塊架構(gòu)設計圖
account.png

可以大致分為以下幾個部分:

  • BussinessLogic,專門負責賬號業(yè)務邏輯處理欺抗,例如登錄售碳、退出、修改密碼等绞呈,服務接口請求等贸人。
    同時負責將服務器接口數(shù)據(jù)ResponseData 轉(zhuǎn)化為 賬號模塊需要的數(shù)據(jù)model。

  • AccessInterface报强,針對高頻賬號數(shù)據(jù)提供的訪問接口灸姊。

  • AccountCenter,賬號數(shù)據(jù)管理核心類秉溉,
    往往被設計成單例類力惯,有此僅有一份碗誉,很符合單例特性。
    負責賬號數(shù)據(jù)組織父晶,處理緩存邏輯哮缺、安全性邏輯。
    負責多賬號甲喝、多子賬號管理
    切換賬號失敗數(shù)據(jù)回滾尝苇。

  • Storage,負責賬號數(shù)據(jù)的存儲

  • Security埠胖,負責安全加密算法相關(guān)糠溜。

3.2、賬號的數(shù)據(jù)設計
  • 賬號使用獨立的數(shù)據(jù)模型
    將服務器接口返回的數(shù)據(jù)模型 轉(zhuǎn)為 獨立設計的賬號數(shù)據(jù)模型直撤。這樣在服務器接口移動的時候非竿,本地可以保持不變,業(yè)務層接口可以保持不變谋竖。

  • 賬號的數(shù)據(jù)模型
    所有的屬性都為只讀红柱,避免外部輕易修改;只能通過方法接口修改更新蓖乘。

@protocol AccountModelProtocol <NSObject>
- (void)updateModelWithData:(id)data;

@end

// userInfo
@interface UserInfo : NSObject <AccountModelProtocol>
@property (readonly) NSString *userId;
@property (readonly) NSString *userName;
@end

@interface UserInfo ()
@property (nonatomic, copy) NSString *userId;
@property (nonatomic, copy) NSString *userName;
@end

@implementation UserInfo
- (void)updateModelWithData:(id)data {
    
}
@end
  • 賬號的相關(guān)數(shù)據(jù)進行分類锤悄,大致可分為以下:
    銀行賬號、身份證等敏感信息
    基礎用戶信息:手機號碼嘉抒、用戶名零聚、性別、生日众眨、區(qū)域等
    第三方平臺賬號信息握牧,例如IM、七牛云娩梨、阿里云等賬號
    賬號動態(tài)變化信息沿腰,如登錄sessionId、AccessToken信息等狈定。
    教育App颂龙,用戶學校信息、用戶班級信息纽什、家長孩子信息措嵌。
    用戶等級信息、Vip信息等
@interface UserInfo : NSObject <AccountModelProtocol>
@end

@interface UserLevelInfo : NSObject <AccountModelProtocol>
@end

@interface SchoolInfo : NSObject <AccountModelProtocol>
@end
  • 針對常用的數(shù)據(jù)芦缰,專門提供專門易用接口企巢,方便上層使用。
    同時让蕾, 對于提供接口浪规,保證數(shù)據(jù)可用性或听,為空不返回nil,而是空字符笋婿。保證上層不需要判空直接使用誉裆,不會導致crash。
// 通過類方法簡化
@protocol UserInfoAccessProtocol <NSObject>
+ (NSString *)userId;
@end

@protocol UserLevelAccessProtocol <NSObject>
+ (NSString *)userLevelName;
@end

// 易用接口訪問層
@interface AccountCenter (Access) <UserInfoAccessProtocol, UserLevelAccessProtocol>
@end
@implementation AccountCenter (Access)
+ (NSString *)userId {
    return accountSingleton.userInfo.UserId ? : @""; 
}
+ (NSString *)userLevelName {
    return accountSingleton.userLevelInfo.levelName ? : @""; 
}
@end
  • 數(shù)據(jù)完整性校驗
    針對保存進來的數(shù)據(jù)缸濒,需要進行完整性校驗足丢,保證數(shù)據(jù)的可用性。例如用戶數(shù)據(jù)庇配,userid斩跌、phone必須不為空;第三方賬號account讨永、appid必須不為空滔驶。

  • 賬號訪問接口建議提供同步接口
    對于賬號數(shù)據(jù)訪問,都是要求快速且同步的卿闹;如果設計成異步,往往給業(yè)務調(diào)用者造成不必要麻煩萝快。遇見過將其設計成異步锻霎,真的是無盡的深淵。

  • 根據(jù)賬號訪問特性揪漩,設計讀寫鎖進行多線程同步旋恼。

  • 可根據(jù)實際需要提供深拷貝的接口

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奄容,隨后出現(xiàn)的幾起案子冰更,更是在濱河造成了極大的恐慌,老刑警劉巖昂勒,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜀细,死亡現(xiàn)場離奇詭異,居然都是意外死亡戈盈,警方通過查閱死者的電腦和手機奠衔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塘娶,“玉大人归斤,你說我怎么就攤上這事〉蟀叮” “怎么了脏里?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長虹曙。 經(jīng)常有香客問我迫横,道長鸦难,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任员淫,我火速辦了婚禮合蔽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘介返。我一直安慰自己拴事,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布圣蝎。 她就那樣靜靜地躺著刃宵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徘公。 梳的紋絲不亂的頭發(fā)上牲证,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音关面,去河邊找鬼坦袍。 笑死,一個胖子當著我的面吹牛等太,可吹牛的內(nèi)容都是我干的捂齐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缩抡,長吁一口氣:“原來是場噩夢啊……” “哼奠宜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞻想,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤压真,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蘑险,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滴肿,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年漠其,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘴高。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡和屎,死狀恐怖拴驮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柴信,我是刑警寧澤套啤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響潜沦,放射性物質(zhì)發(fā)生泄漏萄涯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一唆鸡、第九天 我趴在偏房一處隱蔽的房頂上張望涝影。 院中可真熱鬧,春花似錦争占、人聲如沸燃逻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伯襟。三九已至,卻和暖如春握童,著一層夾襖步出監(jiān)牢的瞬間姆怪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工澡绩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稽揭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓英古,卻偏偏與公主長得像淀衣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子召调,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容