最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實現(xiàn)收藏功能

 更新時間:2022年08月31日 11:43:20   作者:shan&cen  
這篇文章主要為大家詳細介紹了java實現(xiàn)收藏功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java實現(xiàn)收藏功能的具體代碼,供大家參考,具體內(nèi)容如下

需求分析

分析:

1.要求用戶必須登錄,否則提示
2.第一次點擊,表示收藏成功,收藏數(shù)+1,顯示藍色星星
3.第二次點擊,表示取消收藏操作,收藏數(shù)-1,顯示白色星星
-------------------------------------
核心問題:當前請求時收藏操作,還是取消收藏操作
[這類型的操作,稱之為有狀態(tài)的操作]
解決方案:第一次請求過來時,留下一個記號,第二次請求時候,根據(jù)記號有無決定收藏還是取消收藏
引出新問題:記號怎么設(shè)計
-------------------------------------
記號應(yīng)該存在緩存中,而不是mongodb/mysql
原因:現(xiàn)在所有操作都是緩存里面操作,也即:使用redis來緩存集合,此時需要思考,key值與value值設(shè)計

步驟分析

//判斷是否存在以用戶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中取出來的集合字符串轉(zhuǎn)換為集合
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對應(yīng)的收藏數(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;
? ? }
?? ?//設(shè)置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));
? ? }

小結(jié)

1.關(guān)于收藏功能的實現(xiàn)其實與點贊功能類似,都是點擊一下,數(shù)據(jù)+1,再點擊一下,數(shù)據(jù)-1
2.關(guān)于這類問題,我們稱之為有狀態(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對象即可

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springBoot項目集成quartz開發(fā)定時任務(wù)案例及注意事項

    springBoot項目集成quartz開發(fā)定時任務(wù)案例及注意事項

    這篇文章主要介紹了springBoot項目集成quartz開發(fā)定時任務(wù)案例及注意事項,這些功能的主要接口(API)是Scheduler接口。它提供了簡單的操作,例如:將任務(wù)納入日程或者從日程中取消,開始/停止/暫停日程進度,需要的朋友可以參考下
    2022-06-06
  • Spring實戰(zhàn)之Bean的后處理器操作示例

    Spring實戰(zhàn)之Bean的后處理器操作示例

    這篇文章主要介紹了Spring實戰(zhàn)之Bean的后處理器操作,結(jié)合實例形式詳細分析了Bean的后處理器相關(guān)配置、操作方法及使用注意事項,需要的朋友可以參考下
    2019-12-12
  • Java基礎(chǔ)-Java變量的聲明和作用域

    Java基礎(chǔ)-Java變量的聲明和作用域

    這篇文章主要介紹了Java變量的聲明和作用域,變量其實就是內(nèi)存中的一個存儲空間,用來存儲數(shù)據(jù),具體的相關(guān)內(nèi)容,需要的小伙伴可以參考下面文章內(nèi)容
    2022-01-01
  • Spring項目中使用Junit單元測試并配置數(shù)據(jù)源的操作

    Spring項目中使用Junit單元測試并配置數(shù)據(jù)源的操作

    這篇文章主要介紹了Spring項目中使用Junit單元測試并配置數(shù)據(jù)源的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JavaCV實現(xiàn)獲取視頻每幀并保存

    JavaCV實現(xiàn)獲取視頻每幀并保存

    這篇文章主要為大家詳細介紹了JavaCV實現(xiàn)獲取視頻每幀并保存,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java?Stream實現(xiàn)多字段分組groupingBy操作詳解

    Java?Stream實現(xiàn)多字段分組groupingBy操作詳解

    Stream是Java8的一個新特性,主要用戶集合數(shù)據(jù)的處理,如排序、過濾、去重等等功能,本文就來講講如何利用Stream實現(xiàn)比較優(yōu)雅的按多字段進行分組groupingBy吧
    2023-06-06
  • MyBatis連接數(shù)據(jù)庫配置的基本步驟和機制

    MyBatis連接數(shù)據(jù)庫配置的基本步驟和機制

    MyBatis 是一個流行的持久層框架,它通過使用XML或注解的方式將SQL語句、存儲過程和Java方法進行綁定,從而避免了手寫大量的JDBC代碼和手動設(shè)置參數(shù)與結(jié)果集,本文給大家介紹了MyBatis連接數(shù)據(jù)庫配置的基本步驟和機制,需要的朋友可以參考下
    2024-05-05
  • @feignclient名字沖突的解決方案

    @feignclient名字沖突的解決方案

    這篇文章主要介紹了@feignclient名字沖突的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java封裝的實現(xiàn)訪問限定符、包

    Java封裝的實現(xiàn)訪問限定符、包

    封裝就是將數(shù)據(jù)和操作數(shù)據(jù)的方法進行有機結(jié)合,隱藏對象的屬性(成員變量)和實現(xiàn)細節(jié),僅對外公開接口來和對象進行交互,下面這篇文章主要給大家介紹了關(guān)于Java封裝實現(xiàn)訪問限定符、包的相關(guān)資料
    2022-08-08
  • 使用SpringAOP獲取用戶操作日志入庫

    使用SpringAOP獲取用戶操作日志入庫

    這篇文章主要介紹了使用SpringAOP獲取用戶操作日志入庫,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

莱州市| 沛县| 平陆县| 镇赉县| 连江县| 锡林浩特市| 明水县| 北宁市| 玉屏| 孟州市| 霍山县| 扬州市| 赤峰市| 浙江省| 湖州市| 庐江县| 美姑县| 弥渡县| 东光县| 绥中县| 哈尔滨市| 九江县| 广水市| 湛江市| 南漳县| 威远县| 新宁县| 龙陵县| 孟津县| 淮南市| 遵义县| 通城县| 肥乡县| 德庆县| 渭源县| 红原县| 汤原县| 静海县| 昌乐县| 揭阳市| 南川市|