?by hzwusibo 20181210
一邻储、 業(yè)務(wù)描述
重構(gòu)最重要的首要任務(wù)是梳理功能結(jié)構(gòu)背亥。書架模塊主要包含以下以下幾個(gè)界面:
用例圖:
中除了?WIFI 傳輸般眉、導(dǎo)入本地書籍、查看閱讀歷史以外的所有用例都屬于書架首頁(yè)這個(gè)界面內(nèi)部慎宾。
二丐吓、書架架構(gòu)(Android):
書架主要分為三層浅悉、 BookBean(對(duì)應(yīng)數(shù)據(jù)庫(kù))、ShelfItemData(對(duì)應(yīng)內(nèi)存)券犁、 ShelfModel(對(duì)應(yīng)界面)
BookBean? (和書架數(shù)據(jù)庫(kù)一一對(duì)應(yīng)术健, 用于網(wǎng)絡(luò)獲取、數(shù)據(jù)庫(kù)存儲(chǔ))
ShelfItemData 列表為內(nèi)存中數(shù)據(jù)(是 DB 讀取粘衬,進(jìn)行處理后(分組荞估、分區(qū)、排序)的數(shù)據(jù) list)稚新。
ShelfModel?只用于顯示(從 ShelfItemData 層生成)勘伺,類似于 MVVM 中的 ViewModel。
ManagerShelf?進(jìn)行對(duì) ShelfItemData 層數(shù)據(jù)進(jìn)行管理操作(置頂枷莉、分組娇昙、刪除等)尺迂,操作完成后更新ShelfModel界面層與 DB 笤妙。
三、客戶端模塊分層
模塊化噪裕,將一個(gè)程序按照功能蹲盘,分成相互獨(dú)立的模塊,以便每個(gè)模塊只包含與其功能相關(guān)的內(nèi)容膳音,書架重構(gòu)設(shè)計(jì)上把書架獨(dú)立一個(gè)模塊召衔。
? 將書架模塊、正文模塊等不相干業(yè)務(wù)相互獨(dú)立祭陷, 每個(gè)模塊只包含與其功能相關(guān)的內(nèi)容苍凛。 通過(guò)Arouter路由進(jìn)行通訊。
? 框架服務(wù)層: 基礎(chǔ)的組件兵志,如網(wǎng)絡(luò)醇蝴、圖片、通訊想罕、工具類等
? 業(yè)務(wù)模塊層: 書架悠栓、閱讀器等
補(bǔ)充部分實(shí)現(xiàn)內(nèi)容:
?(實(shí)現(xiàn)的時(shí)候略有些區(qū)別)
? ? ? ?閱讀重構(gòu)有些跟最初設(shè)計(jì)不符的地方,設(shè)計(jì)和實(shí)現(xiàn)分別見(jiàn)上面兩張圖按价,最終實(shí)現(xiàn)時(shí)業(yè)務(wù)層的搜索沒(méi)有拆分成module惭适,本來(lái)打算管理公共數(shù)據(jù)模型的module_common_model也沒(méi)有使用,因?yàn)槟壳肮玫臄?shù)據(jù)模型還無(wú)法完全剝離楼镐,暫時(shí)還是放在module_base中癞志,另外模塊通信層目前看算是各個(gè)業(yè)務(wù)依賴的中間層,通信用到的數(shù)據(jù)模型也都放在了module_communication框产,下個(gè)Q閱讀重構(gòu)還會(huì)持續(xù)做凄杯,模塊化也會(huì)繼續(xù)實(shí)踐和探索师溅,下面的依賴圖也會(huì)隨著我們的不斷實(shí)踐來(lái)更新。
客戶端模塊分層后的工程結(jié)構(gòu):base基礎(chǔ)的組件盾舌、 book_shelf書架墓臭、communication模塊之間通訊等。
模塊之間的通訊通過(guò)Arouter的服務(wù)管理實(shí)現(xiàn)妖谴, 以書架為例窿锉。
1、暴露書架對(duì)外提供的服務(wù)(聲明接口膝舅,其他組件通過(guò)接口來(lái)調(diào)用書架的服務(wù))嗡载,接口統(tǒng)一在module_communication模塊中聲明,例如這里書架暴露了void addShelfBook(String id);接口仍稀。
2洼滚、在書架模塊中實(shí)現(xiàn)外提供的服務(wù)的接口
3、其他模塊調(diào)用技潘,如購(gòu)物車模塊調(diào)用書架提供的加入服務(wù)遥巴。
四、書架對(duì)外接口:
1享幽、從服務(wù)器刷新書架:1,限免領(lǐng)取特權(quán)領(lǐng)取成功需要刷新書架 2,開通包月后需要更新書架信息
void updateBookShelfFromServers();
2铲掐、根據(jù)用戶名獲取所有書架書籍
@param userName:用戶名
@return 對(duì)應(yīng)用戶的書架書籍列表,列表元素?cái)?shù)據(jù)模型見(jiàn)? {@link BaseBook}
List<SearchBook> getAllShelfDataWithUserName(String userName);
3值桩、獲取內(nèi)存中所有的書籍摆霉,直接查詢內(nèi)存
List<SearchBook> getAllShelfData();
4、本地書加入書架
void addshelfLocalBook(LocalBook local, AddShelfLocalBookCallBack addShelfLocalBookCallBack);
5奔坟、加入書架
void addShelfBook(String id);? // 新增一本書
void addShelfBookAndUpdateBook(String id, boolean is_voice_reading, int read_cont, float total_percent);// 新增并且更新信息
void addShelfBaoyue(String id);// 新增包月
void addShelfBooks(List<String> list);// 新增多本書
void syncAddBooks(List<String> list);// 同步后臺(tái)新增書
void addShelfCallBackListener(AddShelfBookCallBack callBack);? // 添加回調(diào)
void removeShelfCallBackListener(AddShelfBookCallBack callBack); // 移出回調(diào)
6携栋、 打開了某本書,書架排到一個(gè)
@param bookid:書籍
void openBookItem(String bookid);
7咳秉、 更新書籍閱讀進(jìn)度
@param bookid 需要更新的書籍
@param read_cont 已讀的章節(jié)數(shù)
@param total_percent 書籍閱讀的進(jìn)度百分比
void updateBookProgressById(String bookid, int read_cont, float total_percent);
8婉支、更新是否是語(yǔ)音閱讀
@param is_voice_reading 是否是語(yǔ)音閱讀
void updateIsVoiceReading(String bookid, boolean is_voice_reading);
9、更新章節(jié)本地更新時(shí)間滴某,用于去除小紅
void doBookUpdateTimeLocal(String bookid);
10磅摹、查詢一本書是否在當(dāng)前用戶書架
@param bookid 書籍id
? @return true:在,false:不在
boolean isBookShelfBook(String bookid);
11霎奢、刪除書架上的書
void offLineDeleteShelfs();
12户誓、 同步上傳書
void updateSyncBook(SyncModel model);
五.主界面設(shè)計(jì)
備注:? 越紅色越重要, BookShelf為書架主要最重要的類幕侠,ShelfListAdapter和ShelfGridAdapter為書架的adapter帝美。? BookGroupDialog為組內(nèi)書的彈出框,BookGroupDialogAdapter為相應(yīng)的adapter晤硕。? 以上5個(gè)類是書架最核心的類悼潭。? BookOperateGroup為分組操作庇忌, BookManageActivity為批量操作, BookOperatePopWindow為書籍長(zhǎng)按操作彈框 舰褪。? ? 綠色的部分為推展功能皆疹, ShelfFilterPopWindow為篩選框, BookRecommendPopWindow為書架推薦占拍。
六略就、? 初始化時(shí)序圖
書架是屬于 TabBar 的子頁(yè)面,APP 打開的時(shí)候其就會(huì)進(jìn)行初始化緩存數(shù)據(jù)晃酒,以下時(shí)序圖描述的就是這個(gè)過(guò)程表牢。
初始化 BookShelf 以及 DataManager
DataManager 根據(jù) userName 獲取 userName 對(duì)應(yīng)的書籍記錄
DataManager 對(duì)各區(qū)的書籍進(jìn)行分組
DataManager 對(duì)各區(qū)的書籍進(jìn)行排序
DataManager 對(duì)書籍進(jìn)行分區(qū)
DataManager 對(duì)各區(qū)的書籍生成對(duì)應(yīng)的 ViewModel
BookShelf 根據(jù)生成的 ViewModel 進(jìn)行展示
七.? ?書架刷新流程時(shí)序圖(ShelfManagerBookBean)
刷新流程階段描述的是任何主動(dòng)/被動(dòng)因素導(dǎo)致界面重新請(qǐng)求服務(wù)器從而刷新界面數(shù)據(jù)的流程
整個(gè)流程大體分為幾個(gè)部分(下面的流程跟時(shí)序圖并不對(duì)應(yīng)):
請(qǐng)求推薦數(shù)據(jù):匿名用戶或者登錄用戶都會(huì)針對(duì)性的返回一些推薦數(shù)據(jù),這些數(shù)據(jù)也是需要展現(xiàn)在書架中的
請(qǐng)求 info.json 接口贝次,此接口主要是返回書架界面主要的顯示數(shù)據(jù)崔兴,例如書籍名稱、書籍封面等等蛔翅。此接口是全量拉取敲茄,是書架界面主要的瓶頸之一。
界面刷新
判定是否需要全量更新服務(wù)器和本地中的一方數(shù)據(jù)
請(qǐng)求 detail.json 接口搁宾,此接口是按需請(qǐng)求折汞,也就是沒(méi)有顯示出來(lái)的視圖不會(huì)請(qǐng)求對(duì)應(yīng)書籍的詳細(xì)信息。此接口主要包含的是書籍信息當(dāng)中的用戶行為相關(guān)的數(shù)據(jù)盖腿,例如書籍進(jìn)度,包月數(shù)據(jù)等损同。由于是按需請(qǐng)求翩腐,所以這里可能需要有高并發(fā)。
合并?detail.json?到顯示數(shù)據(jù)當(dāng)中并進(jìn)行界面刷新
重復(fù)4
時(shí)序圖當(dāng)中步驟?8. 根據(jù)用戶操作時(shí)間戳比較是否已替換信息邏輯進(jìn)一步可以細(xì)化為:
關(guān)健步驟
1膏燃、更新數(shù)據(jù)庫(kù)
2茂卦、通知 顯示界面重新從數(shù)據(jù)庫(kù)讀到內(nèi)存, 再 initBookData (主界面组哩、 組內(nèi)等龙, 批量刪除界面),更新界面
時(shí)序圖當(dāng)中步驟?18. 根據(jù)書籍更新時(shí)間伶贰、書籍進(jìn)度比較是否替換信息邏輯進(jìn)一步可以細(xì)化為:
關(guān)健步驟
更新數(shù)據(jù)庫(kù) 蛛砰,同時(shí)更新內(nèi)存數(shù)據(jù)
通知顯示界面刷新 (主界面、 組內(nèi)黍衙, 批量刪除界面)
需要注意的是客戶端閱讀過(guò)的書籍泥畅,相應(yīng)的書架上的書籍就會(huì)顯示本地的閱讀進(jìn)度,而非?detail.json?接口給的進(jìn)度琅翻。
8 和 18 都是同步操作位仁,但是本質(zhì)上面兩個(gè)操作還是有區(qū)別的:
第 8 步主要是更新書籍的基本顯示數(shù)據(jù)
第 18 步主要更新的是用戶閱讀書籍進(jìn)度以及包月信息等數(shù)據(jù)? ??
7.1? 分組操作流程圖
7.2 分區(qū)操作流程圖
7.3. 排序流程圖
7.4. 重置Order流程圖
7.6 . 加入置頂區(qū)流程圖
7.7 移到第一本
八柑贞、 加入書架時(shí)序圖
此圖描述的是書架模塊對(duì)外提供的加入書架接口,可能涉及到的業(yè)務(wù)有:
書籍詳情加入書架
包月加入書架
外部提供加入書架的書籍id/包月id
書架請(qǐng)求獲取添加書架接口(addshelf.json)
添加書架接口(addshelf.json)返回是否添加成功聂抢,并且返回相應(yīng)書籍的“書架信息”钧嘶,返回包含書籍與用戶關(guān)聯(lián)的數(shù)據(jù)。
書架將書籍的書架信息添加到緩存琳疏,并且將書籍添加到非置頂區(qū)的首位并刷新視圖
書架將書籍的書架信息保存到數(shù)據(jù)庫(kù)
同步書架數(shù)據(jù) ? Android : 最后一步略有差別康辑, 更新數(shù)據(jù)庫(kù),再?gòu)臄?shù)據(jù)庫(kù)讀數(shù)據(jù)更新內(nèi)存
8.1 刪除流程圖
圖描述的是書架模塊對(duì)外提供的刪除書架接口轿亮,可能涉及到的業(yè)務(wù)有:
刪除書架書籍
刪除包月
刪除疮薇、批量刪除場(chǎng)景邏輯可以分為多種:
8.2 移出分組
九、 數(shù)據(jù)庫(kù)設(shè)計(jì)
9.1. 書架表(book_shelf)
十我注、接口設(shè)計(jì)
10 /shelf/info.json
接口描述: 返回書架省略信息接口按咒,用于展示/排列書架信息
10.2? /shelf/detail.json
接口描述: 批量接口,外層為數(shù)組
10.3? /shelf/saveGroup.json
接口描述: 批量接口但骨,外層為數(shù)組
10.4? /shelf/addShelf.json
接口描述:添加到書架励七,支持包月以及書籍添加
10.5 /shelf/deleteShelf.json
接口描述:批量接口,外層為數(shù)組移除書架項(xiàng)奔缠。支持包月以及書籍的移除掠抬。