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