java實現(xiàn)收藏功能
本文實例為大家分享了java實現(xiàn)收藏功能的具體代碼,供大家參考,具體內容如下
需求分析
分析:
1.要求用戶必須登錄,否則提示
2.第一次點擊,表示收藏成功,收藏數(shù)+1,顯示藍色星星
3.第二次點擊,表示取消收藏操作,收藏數(shù)-1,顯示白色星星
-------------------------------------
核心問題:當前請求時收藏操作,還是取消收藏操作
[這類型的操作,稱之為有狀態(tài)的操作]
解決方案:第一次請求過來時,留下一個記號,第二次請求時候,根據(jù)記號有無決定收藏還是取消收藏
引出新問題:記號怎么設計
-------------------------------------
記號應該存在緩存中,而不是mongodb/mysql
原因:現(xiàn)在所有操作都是緩存里面操作,也即:使用redis來緩存集合,此時需要思考,key值與value值設計
步驟分析
//判斷是否存在以用戶id為key的key鍵,返回list
1.創(chuàng)建一個收藏接口,傳攻略sid,獲取用戶uid
2.請求進入之后需要判斷是收藏操作還是取消收藏操作
3.通過uid拼接出用戶收藏的攻略id集合(記號)的key
4.判斷key是否存在,如果存在,直接獲取sidList,如果不存在,返回空集合list
//判斷是取消收藏還是收藏操作,返回boolean類型
5.判斷當前傳入的sid是否在sidList(攻略id集合)中
1>如果不在,當前請求為收藏請求,獲取vo對象,收藏數(shù)+1,將sid添加到sidList(攻略id集合)
2>如果在,當前請求為取消收藏請求,獲取vo對象,收藏數(shù)-1,將sid從sidList(攻略id集合)移除
6.更新sidList(攻略id集合),更新vo對象
//從redis中取出來的集合字符串轉換為集合
JSON.parseArray(集合字符串,String.class)
具體實現(xiàn)
//獲取收藏數(shù)id集合 @Override ? ? public List<String> getStrategyFavorStatisVO(String userId, String sid) { ? ? ? ? //拼接key ? ? ? ? String key = RedisKeys.USER_STRATEGY_FAVOR.join(userId); ? ? ? ? //判斷redis中有沒有該key ? ? ? ? List<String> list = new ArrayList<>(); ? ? ? ? if (template.hasKey(key)) { ? ? ? ? ? ? //如果存在,就直接獲得key對應的收藏數(shù)集合 ? ? ? ? ? ? String sidListStr = template.opsForValue().get(key); ? ? ? ? ? ? //將字符串解析為集合 ? ? ? ? ? ? list = JSON.parseArray(sidListStr, String.class); ? ? ? ? } ? ? ? ? //如果不存在,創(chuàng)建list,緩存到redis中,并返回空集合 ? ? ? ? return list; ? ? } ? ? //判斷集合中是否存在攻略id ? ? @Override ? ? public boolean isExistsSid(String uid, String sid) { ? ? ? ? List<String> list = this.getStrategyFavorStatisVO(uid, sid); ? ? ? ? StrategyStatisVO statisVO = this.getStrategyStatisVO(sid); ? ? ? ? //判斷是否在存在傳過來的攻略id ? ? ? ? if (!list.contains(sid)) { ? ? ? ? ? ? //不存在,收藏操作,收藏數(shù)+1,添加到list集合中 ? ? ? ? ? ? statisVO.setFavornum(statisVO.getFavornum() + 1); ? ? ? ? ? ? list.add(sid); ? ? ? ? } else { ? ? ? ? ? ? //存在,取消收藏操作,收藏數(shù)-1,并從list集合中移除 ? ? ? ? ? ? statisVO.setFavornum(statisVO.getFavornum() - 1); ? ? ? ? ? ? list.remove(sid); ? ? ? ? } ? ? ? ? //更新vo對象,更新list ? ? ? ? this.setStrategyStatisVO(statisVO); ? ? ? ? template.opsForValue().set(RedisKeys.USER_STRATEGY_FAVOR.join(uid), JSON.toJSONString(list)); ? ? ? ? return list.contains(sid); ? ? } ---------------------------------------- ?? ?//獲取vo對象 ??? ?@Override ? ? public StrategyStatisVO getStrategyStatisVO(String sid) { ? ? ? ? //使用枚舉類拼接key ? ? ? ? String key = RedisKeys.STRATEGY_STATIS_VO.join(sid); ? ? ? ? StrategyStatisVO statisVO = new StrategyStatisVO(); ? ? ? ? //判斷vo對象是否存在,即判斷key是否存在 ? ? ? ? if (!template.hasKey(key)) { ? ? ? ? ? ? //不存在,初始化數(shù)據(jù),將數(shù)據(jù)查出來,然后賦值給vo對象,最后存起來 ? ? ? ? ? ? Strategy strategy = strategyService.get(sid); ? ? ? ? ? ? BeanUtils.copyProperties(strategy, statisVO); ? ? ? ? ? ? statisVO.setStrategyId(sid); ? ? ? ? ? ? template.opsForValue().set(key, JSON.toJSONString(statisVO)); ? ? ? ? } else { ? ? ? ? ? ? //存在,獲取vo對象 ? ? ? ? ? ? String VO = template.opsForValue().get(key); ? ? ? ? ? ? statisVO = JSON.parseObject(VO, StrategyStatisVO.class); ? ? ? ? } ? ? ? ? return statisVO; ? ? } ?? ?//設置vo對象,將vo對象存儲到redis數(shù)據(jù)庫中 ?? ? @Override ? ? public void setStrategyStatisVO(StrategyStatisVO statisVO) { ? ? ? ? String key = RedisKeys.STRATEGY_STATIS_VO.join(statisVO.getStrategyId()); ? ? ? ? template.opsForValue().set(key, JSON.toJSONString(statisVO)); ? ? }
小結
1.關于收藏功能的實現(xiàn)其實與點贊功能類似,都是點擊一下,數(shù)據(jù)+1,再點擊一下,數(shù)據(jù)-1
2.關于這類問題,我們稱之為有狀態(tài)的操作,就是第一次操作之后,我們需要留下一個記號(key鍵,value-list集合)
3.例如上面的操作,我們用key鍵作為標記,key鍵通過當前用戶id拼接,站在用戶角度
4.先判斷key鍵是否存在,存在,就通過key取出list集合,不存在,返回空集合給前端,這個是用來顯示收藏顏色的
5.當我們點擊操作時,只需要判斷傳進來的攻略id是否存在集合中即可
6.如果不在,當前請求為收藏請求,獲取vo對象,收藏數(shù)+1,將sid添加到sidList(攻略id集合)
如果在,當前請求為取消收藏請求,獲取vo對象,收藏數(shù)-1,將sid從sidList(攻略id集合)移除
7.最后更新sidList(攻略id集合),更新vo對象即可
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Mybatis-plus操作json字段實戰(zhàn)教程
這篇文章主要介紹了Mybatis-plus操作json字段實戰(zhàn)教程,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02Mybatis中一條SQL使用兩個foreach的問題及解決
這篇文章主要介紹了Mybatis中一條SQL使用兩個foreach的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Spring Boot整合Swagger測試api構建全紀錄
這篇文章主要給大家介紹了關于Spring Boot整合Swagger測試api構建的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-01-01SpringMVC實現(xiàn)controller中獲取session的實例代碼
本篇文章主要介紹了SpringMVC實現(xiàn)controller中獲取session的實例代碼,具有一定的參考價值,有興趣的可以了解一下。2017-02-02idea運行main方法或Test避免編譯整個應用的實現(xiàn)方法
這篇文章主要介紹了idea運行main方法或Test避免編譯整個應用的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04