直播平臺原始碼開發,簽到功能的實現
1 簽到日曆週期
2 展示效果以及介面分析
3 查詢總積分,簽到日曆介面
public ResponseResult selectSignIn(Integer userId, Integer year, Integer month) { boolean signFlag = Boolean.FALSE; String signKey = String.format(RedisKeyConstant.USER_SIGN_IN, year, userId); LocalDate date = LocalDate.of(year, month, 1); //這個方法前面的文章有介紹過.是查詢出一個偏移值區間的點陣圖集合 List<Long> list = cacheClient.getBit(signKey, month * 100 + 1, date.lengthOfMonth()); //查詢reids中當前使用者補籤的hash列表 (hash列表的key為補籤的日期,value存在就說明這個日期補簽了) String retroactiveKey = String.format(RedisKeyConstant.USER_RETROACTIVE_SIGN_IN, date.getMonthValue(), userId); Set<String> keys = cacheClient.hkeys(retroactiveKey); TreeMap<Integer, Integer> signMap = new TreeMap<>(); if (list != null && list.size() > 0) { // 由低位到高位,為0表示未籤,為1表示已籤 long v = list.get(0) == null ? 0 : list.get(0); //迴圈次數為當月的天數 for (int i = date.lengthOfMonth(); i > 0; i--) { LocalDate d = date.withDayOfMonth(i); int type = 0; if (v >> 1 << 1 != v) { //狀態為正常簽到 type = 1; //這裡和當前日期對比,方便前端特殊標記今天是否簽到 if (d.compareTo(LocalDate.now()) == 0) { signFlag = Boolean.TRUE; } } if (keys.contains(d.getDayOfMonth() + "")) { //狀態為補籤 type = 2; } //返回給前端當月的所有日期,以及籤,補籤或者未籤的狀態 signMap.put(Integer.parseInt(d.format(DateTimeFormatter.ofPattern("dd"))), type); v >>= 1; } } ResponseResult responseResult = ResponseResult.newSingleData(); Map<String, Object> result = new HashMap<>(2); //前文有介紹過這個表儲存了使用者的總積分 UserIntegral userIntegral = userIntegralService.getOne(new LambdaQueryWrapper<UserIntegral>().eq(UserIntegral::getUserId, userId)); //使用者總積分 result.put("total", userIntegral.getIntegral()); //使用者今日是否簽到 result.put("todaySignFlag", signFlag ? 1 : 0); //後端返回日期是為了防止手機端直接修改系統時間導致的問題 result.put("today", LocalDate.now().getDayOfMonth()); //當月的簽到情況 result.put("signCalendar", signMap); //返回給前端這個月的第一天是星期幾,方便前端渲染日曆圖的時候定位 result.put("firstDayOfWeek", date.getDayOfWeek().getValue()); //伺服器的當前月份(同上,防止手機端直接修改系統時間) result.put("monthValue", date.getMonthValue()); //使用者當月補籤的次數 result.put("retroactiveCount", keys.size()); //日曆部分會有上月的結尾幾天的資料,所以這裡需要返回給前端上個月共有多少天 result.put("lengthOfLastMonth", date.minusMonths(1).lengthOfMonth()); responseResult.setData(result); return responseResult; }
4.查詢簽到任務以及任務的完成狀態
CREATE TABLE `t_user_integral_task` ( `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `task_type` tinyint(4) DEFAULT '1' COMMENT '任務型別 1.每日任務 2福利任務', `task_tag` varchar(100) DEFAULT NULL COMMENT '任務前端標識(大寫字母組合)', `task_title` varchar(100) DEFAULT NULL COMMENT '任務標題', `icon` varchar(255) DEFAULT NULL COMMENT '小圖示', `task_copy` varchar(100) DEFAULT NULL COMMENT '任務文案', `integral` int(16) DEFAULT '0' COMMENT '任務贈送積分數', `jump_type` tinyint(4) DEFAULT NULL COMMENT '跳轉方式 1.跳轉指定商品 2.跳轉連結 3.跳轉指定介面,4:跳轉隨機商品', `jump_source` text COMMENT '跳轉或分享的地址', `sort` tinyint(2) DEFAULT '0' COMMENT '排序號', `delete_flag` tinyint(2) DEFAULT '0' COMMENT '刪除/隱藏,0:未刪除/未隱藏,1:已刪除/已隱藏', `create_time` datetime DEFAULT NULL COMMENT '建立時間', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間', PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='使用者任務表'
public ResponseResult selectSignInTask(Integer userId) { ResponseResult responseResult = ResponseResult.newSingleData(); //先查出簽到任務的mysql記錄. List<UserIntegralTask> userIntegralTaskList = list(new LambdaQueryWrapper<UserIntegralTask>() .orderByDesc(UserIntegralTask::getTaskType).orderByAsc(UserIntegralTask::getSort)); //建立一個map,key為任務的task_tag,value存在則是完成了該任務. //每日任務和福利任務分為兩個reids hash儲存.每日任務的key中包含當天日期,過期時間為一天.福利任務則是永久儲存 Map<String, String> completeFlagMap = new HashMap<>(userIntegralTaskList.size()); Map<String, String> welfareMap = cacheClient.hgetAll(String.format(RedisKeyConstant.USER_SIGN_WELFARE_TASK, userId)); if (CollUtil.isNotEmpty(welfareMap)) completeFlagMap.putAll(welfareMap); Map<String, String> dailyMap = cacheClient.hgetAll(String.format(RedisKeyConstant.USER_SIGN_DAILY_TASK, LocalDate.now().getDayOfMonth(), userId)); //把兩個hash合併 if (CollUtil.isNotEmpty(dailyMap)) completeFlagMap.putAll(dailyMap); //迴圈庫中的任務列表,並用hash的get方法查詢是否完成,然後給到前端 userIntegralTaskList.forEach(task -> { task.setCreateTime(null); task.setUpdateTime(null); task.setIntegral(null); String value = completeFlagMap.get(task.getTaskTag()); if (null == value) { task.setCompleteFlag(0); } else { task.setCompleteFlag(1); } }); responseResult.setData(userIntegralTaskList); return responseResult; }
//虛擬碼 public ResponseResult saveSignInTask(Integer userId, String tag) { //查詢出mysql中對應的tag任務,獲取關鍵資訊.(`integral`) .... //寫入積分記錄表.對應當前任務title的記錄 ... //在redis裡寫入當前使用者的這個任務完成狀態(這裡要注意如果是每日任務要給hash 列表給一天的過期時間,防止髒資料長時間不被清理,佔用redis的記憶體空間) }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2848131/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 直播平臺搭建原始碼,使用EasyExcel實現匯入匯出功能原始碼Excel
- 直播平臺原始碼,迴圈滾動RecyclerView的實現原始碼View
- 直播平臺原始碼,FlinkSQL實現行轉列原始碼SQL
- 直播平臺軟體開發,uni-app實現選項卡功能APP
- 直播平臺原始碼,圖片放大瀏覽功能原始碼
- 成品直播原始碼,實現在平臺內部的搜尋原始碼
- app直播原始碼如何實現直播間紅包功能APP原始碼
- 如何開發直播平臺,直播平臺開發需要CDN嗎
- 直播 App 原始碼搭建簡易直播平臺及個人開發直播系統的難點APP原始碼
- 直播平臺開發,使用swiper實現輪播效果
- 直播平臺搭建原始碼,bootstrap實現圖片輪播效果原始碼boot
- 直播平臺原始碼,RecycleView實現item重疊水平滑動原始碼View
- 直播平臺搭建,實現圖片縮圖功能
- 直播平臺原始碼,Android實現密碼顯示與隱藏原始碼Android密碼
- 遊戲陪玩平臺原始碼開發,依賴收集和觸發的實現遊戲原始碼
- app直播原始碼,平臺登入頁面實現和修改密碼頁面實現APP原始碼密碼
- 直播平臺原始碼,純JS實現左右滑動輪播圖原始碼JS
- 直播平臺搭建原始碼,純js實現編輯器撤消/重做原始碼JS
- 直播平臺原始碼,多種方法實現圖片複雜排列原始碼
- 直播平臺原始碼,Android自定義View實現呼吸燈效果原始碼AndroidView
- 直播+社交:一對一社交app原始碼或成直播平臺開發新寵APP原始碼
- 直播app原始碼,定時開關,實現計時器功能APP原始碼
- laravel + redis + bitmap 實現簽到功能LaravelRedis
- 直播電商平臺開發,釋出多圖片上傳到伺服器並實現圖片預覽功能伺服器
- PHP直播平臺原始碼搭建教程PHP原始碼
- PHP直播平臺原始碼伺服器併發模型PHP原始碼伺服器模型
- 直播平臺軟體開發,實現自定義標題欄
- 魚羊兒教您搭建手機直播APP平臺!直播系統原始碼開發!APP原始碼
- 教育直播APP系統原始碼,原生開發功能APP原始碼
- 一對一直播平臺原始碼,如何實現圖片釋出原始碼
- 直播帶貨平臺原始碼,利用ProgressBar實現垂直、水平進度條原始碼
- 教育直播平臺原始碼:影響線上教育直播系統開發週期的因素有哪些原始碼
- 直播系統原始碼--搭建直播平臺的奠基石原始碼
- 直播平臺原始碼,數字化大屏地圖輪播的實現echarts原始碼地圖Echarts
- 直播平臺原始碼,實現一個簡單的帶tabs選項卡切換的首頁導航功能原始碼
- 直播原始碼網站,點選分享按鈕,分享到各個渠道功能的實現原始碼網站
- 如何實現直播間原始碼重要的簡訊驗證碼功能原始碼
- 直播平臺開發的小店功能強大,如何解決直播帶貨的貨源