大家好,我是技術UP主小傅哥。
哈哈哈,不是干項目,就是在干項目的路上。除了正式的全程視頻手把手帶著做的,小傅哥也陸續(xù)的開始更新了大廠的 PRD 資料、市面上火熱的外賣,進行DDD重構編寫。這次又帶來一個輕量基于 SpringBoot + Redis 實現(xiàn)的, ?? ?? 釣魚佬,網(wǎng)頁游戲項目 。
這個項目還在線部署過,讓伙伴們體驗效果。?? 下面有介紹,你可以自己部署體驗。
為啥會有這樣一個項目呢???
在互聯(lián)網(wǎng)應用場景中,京東、淘寶、拼多多等,我們時常會看到一些游戲化玩法的場景,如;集卡、澆水、養(yǎng)動物,通過這些場景增強用戶粘性,以及提高轉化率。因為這些游戲化場景的背后,還是一套套的營銷玩法,最終把一些券、積分、物品發(fā)放給用戶。
京東 - 我的 - 互動游戲
而小傅哥的社群,是按照互聯(lián)網(wǎng)公司級別的一個項目組進行規(guī)劃、設計、落地的。在這個社群有非常豐富的項目資源,已經(jīng)提供的有,業(yè)務的 - 交易、拼團、營銷、openai應用、ai agent、IM等,組件的 - api網(wǎng)關、扳手工程、動態(tài)線程池、透視業(yè)務監(jiān)控、支付sdk組件、IntelliJ IDEA 插件等。
那么為了讓小傅哥的社群,給大家提供的項目,是一個有立體化分層關系結構的,可以通過對接形成各個環(huán)節(jié)的流程閉環(huán)。所以小傅哥在全程視頻手把手帶著做以外,又增加了 PRD 文檔、吉祥外賣、這次又增加一個釣魚佬娛樂的項目。
基本你在小傅哥的這個社群,就等同于你在一個一線互聯(lián)網(wǎng)大廠進行一次實習! 接下來,小傅哥來介紹下這個小游戲項目。
一、運行效果
該項目是一個輕量的網(wǎng)頁游戲應用項目,提供了 Java、Python 2個版本,數(shù)據(jù)使用 Redis 進行存儲。以娛樂化的方式,讓伙伴學習到 Redis 的相關技術。此外,你可以把這樣的一個項目,與星球里的大營銷(積分、兌換、返利、抽獎)進行對接使用。在描述上,是以調研了xxx互聯(lián)網(wǎng)公司的xxx游戲化場景,進行設計實現(xiàn)的這樣一整套系統(tǒng)。
1. 登錄
2. 畫魚
3. 魚塘
- 魚塘頁面,可以看到所有登錄用戶投放進來的魚,還可以釣魚??。也許會把別人的魚釣魚到自己的魚簍里。當然,釣魚是需要積分的,你需要點擊簽到獲得積分。
- 頁面里還有一些問題的話術和救贖時間(上班摸魚等于救贖自己?。?/section>
- 本次設計的頁面和后端的代碼,都比較簡單,后端也僅有一層架構。如果想添加功能,可以自己實現(xiàn),也可以使用 trae.ai、Cursor 等工具,來輔助開發(fā)。
- 哈哈哈,還有伙伴提建議,讓這些魚,可以支持在線售賣。如果你還有很多想法,可以拿到這套代碼,做一些擴展。
4. 居民
在魚塘居民下,可以看到各個伙伴畫的各種魚。你可以對這些魚點一個喜歡或者不喜歡。
二、項目介紹
1. 工程代碼
- 地址:https:///KnowledgePlanet/xfg-fish-pond  - 文末加入小傅哥社群,即可獲得全部代碼,以及其他17個實戰(zhàn)項目
- 說明:項目提供了前端代碼,SpringBoot 服務端代碼,以及一個 python 版本的代碼。
2. 項目啟動
- 首先,在 xfg-fish-pond-app 下,resources/application-dev.yml 配置 redis 鏈接信息。 
- 之后,啟動項目后,點擊打開頁面即可訪問了。如果你要部署云服務器,可以通過 docker 構建鏡像在云服務器部署即可。
如果你正在做星球的項目,那么很多都可以與這套項目做微服務對接。如;大營銷的積分、兌換、返利、抽獎,也可以把 ai 場景對接進來,還可以把小型支付對接進來,買賣魚的交易。
三、技術學習
本套項目的數(shù)據(jù)存儲都是基于 Redis 實現(xiàn)的,你可以在這套代碼中學習到非常多的 Redis 應用技術。
1. 用戶會話管理(UserController)
登錄時存儲用戶信息:
RMap<String, String> userMap = redisService.getMap(userKey);
userMap.put("userId", userId);
userMap.put("username", username);
userMap.put("loginTime", LocalDateTime.now().toString());
userMap.expire(86400, TimeUnit.SECONDS); // 24小時過期
用戶列表管理:
redisService.addSetMember(USER_LIST_KEY, userId); // 添加到在線用戶列表
redisService.removeSetMember(USER_LIST_KEY, userId); // 從在線用戶列表移除
2. 積分系統(tǒng)(PointsController)
積分存儲和操作:
// 獲取用戶積分
int points = Integer.parseInt(pointsMap.getOrDefault("points", "0"));
// 更新積分
pointsMap.put("points", String.valueOf(newPoints));
pointsMap.put("lastUpdated", LocalDateTime.now().toString());
簽到記錄:
String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
RMap<String, String> signMap = redisService.getMap(signKey);
signMap.put(today, LocalDateTime.now().toString());
積分變動記錄:
String recordValue = points + "|" + type + "|" + reason + "|" + LocalDateTime.now().toString();
recordsMap.put(recordId, recordValue);
3. 魚類管理(FishController)
添加魚到池塘:
RMap<String, String> fishMap = redisService.getMap(fishKey);
fishMap.put("name", fishName);
fishMap.put("emoji", emoji);
fishMap.put("userId", userId);
fishMap.put("createTime", LocalDateTime.now().toString());
// 添加到魚類列表
redisService.addSetMember(FISH_LIST_KEY, fishId);
4. 釣魚系統(tǒng)(FishingController)
釣魚記錄:
String recordValue = success + "|" + fishEmoji + "|" + fishName + "|" + fishRarity + "|" + 
                   LocalDateTime.now().toString() + "|" + transferred + "|" + 
                   originalOwner + "|" + fishId;
recordsMap.put(recordId, recordValue);
魚簍管理:
String fishValue = emoji + "|" + name + "|" + rarity + "|" + 
                  LocalDateTime.now().toString() + "|" + originalFishId + "|" + image;
basketMap.put(fishId, fishValue);
5. 投票系統(tǒng)(VoteController)
用戶投票記錄:
RMap<String, String> userVotesMap = redisService.getMap(userVotesKey);
userVotesMap.put(fishId, voteType); // "like" 或 "dislike"
投票統(tǒng)計:
fishVotesMap.put("likes", String.valueOf(currentLikes));
fishVotesMap.put("dislikes", String.valueOf(currentDislikes));
fishVotesMap.put("score", String.valueOf(currentLikes - currentDislikes));
6. 系統(tǒng)監(jiān)控(SystemController)
Redis 健康檢查:
// 設置測試值
redisService.setValue("health_check", "ok");
// 讀取測試值
String value = redisService.getValue("health_check");
// 刪除測試值
redisService.remove("health_check");
// 獲取用戶總數(shù)
Map<String, String> userList = redisService.getMapAll("user_list");