diff --git a/assets/Scripts/Sub/UI/PreloadUI.ts b/assets/Scripts/Sub/UI/PreloadUI.ts index 2cccd25a..21dc7ff4 100644 --- a/assets/Scripts/Sub/UI/PreloadUI.ts +++ b/assets/Scripts/Sub/UI/PreloadUI.ts @@ -29,9 +29,6 @@ import { DataManager, DataId } from "../../chat18x/data/DataManager"; import { LoginData } from "../../chat18x/data/LoginData"; import { PlayerData } from "../../chat18x/data/PlayerData"; import { WalletData } from "../../chat18x/data/WalletData"; -import { AccountData } from "../../chat18x/data/AccountData"; -import { MetaData } from "../../chat18x/data/MetaData"; -import { NetTimeData } from "../../chat18x/data/NetTimeData"; import { ConfigManager } from "../../chat18x/manager/ConfigManager"; import { AppConfig } from "db://assets/Scripts/chat18x/config/env/appConfig"; import DeviceIdService from "db://assets/Scripts/chat18x/foundation/identity/DeviceIdService"; @@ -280,20 +277,7 @@ export class PreloadUI extends Component { loginData.expire = resData.expire; const playerData = DataManager.I.getDataById(DataId.Player); playerData.name = resData.name; - - - // const accountData = DataManager.I.getDataById(DataId.Account); - // accountData.identifier = resData.Identifier; - // accountData.identityType = resData.IdentityType; - // accountData.uid = resData.Uid; - // accountData.isNewGuide = resData.IsNewGuide; - // accountData.isNewRegist = resData.IsNewRegist; - // const metaData = DataManager.I.getDataById(DataId.Meta); - // metaData.gameName = resData.GameName; - // const netTimeData = DataManager.I.getDataById(DataId.NetTime); - // netTimeData.serverTime = resData.ServerTime; - // netTimeData.timezoneOffset = resData.TimezoneOffset; - + this.loginFinish = true; // this.reqMyInfo(); diff --git a/assets/Scripts/chat18x/config/GirlConfig.ts b/assets/Scripts/chat18x/config/GirlConfig.ts index 5ddc3a02..bc97c76a 100644 --- a/assets/Scripts/chat18x/config/GirlConfig.ts +++ b/assets/Scripts/chat18x/config/GirlConfig.ts @@ -25,6 +25,20 @@ export class GirlConfig extends BaseConfig { return ConfigManager.tables.TbGirls; } + /** + * 获取所有配置 id,如果存在 + */ + public getAllId(): any | null { + let allData = this.getAllConfig(); + if (!allData) return null; + const dataArr = allData.getDataList(); + let allId = []; + for (let oneData of dataArr) { + allId.push(oneData.id); + } + return allId; + } + /** * 获取配置,根据 id */ diff --git a/assets/Scripts/chat18x/data/DataManager.ts b/assets/Scripts/chat18x/data/DataManager.ts index 3ed67a4b..0cec46ed 100644 --- a/assets/Scripts/chat18x/data/DataManager.ts +++ b/assets/Scripts/chat18x/data/DataManager.ts @@ -12,6 +12,7 @@ import { ThemeData } from "./ThemeData"; import { WalletData } from "./WalletData"; import { ShopData } from "./ShopData"; import { OrderData } from "./OrderData"; +import { GirlData } from "./GirlData"; /** * 集中定义数据ID,避免写错字符串 @@ -26,6 +27,7 @@ export enum DataId { Wallet = "wallet", // 钱包数据 Shop = "shop", // 商城数据 Order = "order", // 订单数据 + Girl = "girl", // 技师数据 } /** 构造器类型 */ @@ -67,6 +69,7 @@ export class DataManager { this.register(DataId.Wallet, WalletData); this.register(DataId.Shop, ShopData); this.register(DataId.Order, OrderData); + this.register(DataId.Girl, GirlData); } /** diff --git a/assets/Scripts/chat18x/data/GirlData.ts b/assets/Scripts/chat18x/data/GirlData.ts index e90fa454..368c147c 100644 --- a/assets/Scripts/chat18x/data/GirlData.ts +++ b/assets/Scripts/chat18x/data/GirlData.ts @@ -309,6 +309,7 @@ export class GirlData extends BaseData { public setDailyRecommend(res: proto.cs.ICSDailyRecommendRes): void { this.mergeBriefs(DAILY_BUCKET, res.girls); this._dailyRecommendIds = res.girls.map(g => g.id ?? 0); + console.log("保存每日推荐: ", this._dailyRecommendIds); } /** 获取每日推荐的简要信息 */ @@ -319,10 +320,24 @@ export class GirlData extends BaseData { return b.briefs.get(b.girlIds[index]) ?? null; } + /** 获取 id */ + public getRecommendGrilId(index: number): number { + let oneData = this.getRecommendGrilBrief(DAILY_BUCKET, index); + if (!oneData) return 0; + return oneData.id; + } + /** 获取名字 */ public getRecommendGrilName(index: number): string { let oneData = this.getRecommendGrilBrief(DAILY_BUCKET, index); if (!oneData) return ""; return oneData.name; } + + /** 获取头像 */ + public getRecommendGrilAvatar(index: number): string { + let oneData = this.getRecommendGrilBrief(DAILY_BUCKET, index); + if (!oneData) return ""; + return oneData.avatar; + } } diff --git a/assets/Scripts/chat18x/network/services/GirlService.ts b/assets/Scripts/chat18x/network/services/GirlService.ts index 0f9880dd..f948fd28 100644 --- a/assets/Scripts/chat18x/network/services/GirlService.ts +++ b/assets/Scripts/chat18x/network/services/GirlService.ts @@ -5,7 +5,7 @@ import type { ApiResponse } from "../client/types"; import proto from "db://assets/Scripts/proto/proto.pb.js"; // 模拟开关 -const USE_MOCK = false; +const USE_MOCK = true; export class GirlService implements IGirlService { private static _I: GirlService | null = null; diff --git a/assets/Scripts/chat18x/network/services/MockGirlService.ts b/assets/Scripts/chat18x/network/services/MockGirlService.ts index b04c4953..fd57a6cf 100644 --- a/assets/Scripts/chat18x/network/services/MockGirlService.ts +++ b/assets/Scripts/chat18x/network/services/MockGirlService.ts @@ -1,6 +1,8 @@ import type { ApiResponse } from "../client/types"; import proto from "db://assets/Scripts/proto/proto.pb.js"; import type { IGirlService } from "./IGirlService"; +import { ConfigManager, ConfigId } from "../../manager/ConfigManager"; +import { GirlConfig } from "../../config/GirlConfig"; export class MockGirlService implements IGirlService { private delay(ms = 180) { return new Promise(r => setTimeout(r, ms)); } @@ -8,23 +10,22 @@ export class MockGirlService implements IGirlService { private pick(arr: T[]) { return arr[this.randInt(0, arr.length - 1)]; } private ok(data: T): ApiResponse { - return ({ ok: true, data } as unknown) as ApiResponse; + return ({ code: proto.cs.EnmRetCode.SUCCESS, data } as unknown) as ApiResponse; } private err(message = "mock error"): ApiResponse { - return ({ ok: false, error: { message } } as unknown) as ApiResponse; + return ({ code: 100, error: { message } } as unknown) as ApiResponse; } - private genBrief(id: number): proto.cs.IGirlBrief { - const tags = ["cute", "cool", "elegant", "sporty", "sweet"]; + private genBrief(id: number, name: string, age: number, tagKey: string, priceType: number, price: number, avatar: string, star: number): proto.cs.IGirlBrief { return { id, - name: `Girl-${id}`, - age: this.randInt(18, 28), - tagKey: this.pick(tags), - priceType: (id % 2) + 1, - price: 50 + (id % 6) * 10, - avatar: `https://dummy.local/avatar/${id}.png`, - star: (id % 5) + 1, + name, + age, + tagKey, + priceType, + price, + avatar, + star, }; } @@ -34,23 +35,72 @@ export class MockGirlService implements IGirlService { private genDetail(id: number): proto.cs.IGirlDetail { const photos = Array.from({ length: 4 }, (_, i) => this.genPhoto(id * 10 + i)); - return { brief: this.genBrief(id), desc: `Mock detail for ${id}`, photos, isRelease: Math.random() < 0.4, chatCount: this.randInt(0, 5) }; + return { brief: this.genBrief(id, "", 1, "", 2, 3, "", 4), desc: `Mock detail for ${id}`, photos, isRelease: Math.random() < 0.4, chatCount: this.randInt(0, 5) }; } // 每日推荐 async reqDailyRecommend(_req: proto.cs.ICSDailyRecommendReq): Promise> { + // 延时 await this.delay(180); - const count = this.randInt(4, 8); - const girls = Array.from({ length: count }, (_, i) => this.genBrief(100 + i)); + + const configData = ConfigManager.I.getDataById(ConfigId.Girl); + const allId = configData.getAllId(); + const recId = allId[0]; + let name = configData.getNameById(recId); + let age = Number(configData.getAgeById(recId)); + let tagKey = configData.getTagKeyById(recId); + let priceType = configData.getPriceTypeById(recId); + let price = 9.9; + let avatar = configData.getAvatarPathById(recId); + let star = 3; + let oneData = this.genBrief(recId, name, age, tagKey, priceType, price, avatar, star); + // 返回数据 + const girls = [oneData]; return this.ok({ girls }); } // 获取技师列表 async reqGetGirlList(req: proto.cs.ICSGetGirlListReq): Promise> { + // 延时 await this.delay(200); - const base = (req?.category ?? 0) * 1000 + (req?.page ?? 1) * 100; - const limit = Math.max(1, Math.min(req?.limit ?? 10, 50)); - const girls = Array.from({ length: limit }, (_, i) => this.genBrief(base + i)); + + const configData = ConfigManager.I.getDataById(ConfigId.Girl); + const allId = configData.getAllId(); + + // 按 category 精确匹配 + const category = Number(req?.category ?? -1); + const filteredIds = category >= 0 + ? allId.filter((id: number) => { + const cat = Number(configData.getCategoryById(id) ?? -1); + return cat === category; + }) + : allId; + + // 分页 + const page = Math.max(1, Number(req?.page ?? 1)); + const limit = Math.max(1, Math.min(Number(req?.limit ?? 10), 50)); + const start = (page - 1) * limit; + const pageIds = filteredIds.slice(start, start + limit); + + // 映射为 IGirlBrief + const girls: proto.cs.IGirlBrief[] = pageIds.map((id: number) => { + const name = configData.getNameById(id); + const age = Number(configData.getAgeById(id)); + const tagKey = configData.getTagKeyById(id); + const priceType = Number(configData.getPriceTypeById(id)); + const avatar = configData.getAvatarPathById(id); + + // 如果有价格配置,就用配置里的,否则给个兜底值 + const price = typeof (configData as any).getPriceById === "function" + ? Number((configData as any).getPriceById(id) ?? 9.9) + : 9.9; + + // 星级兜底:1~5 + const star = (id % 5) + 1; + + return this.genBrief(id, name, age, tagKey, priceType, price, avatar, star); + }); + return this.ok({ girls }); } diff --git a/assets/Scripts/chat18x/network/services/MockThemeService.ts b/assets/Scripts/chat18x/network/services/MockThemeService.ts index 5075b23a..c3da3317 100644 --- a/assets/Scripts/chat18x/network/services/MockThemeService.ts +++ b/assets/Scripts/chat18x/network/services/MockThemeService.ts @@ -38,6 +38,7 @@ export class MockThemeService implements IThemeService { let oneData = this.makeTheme(oneId, key, name, category, isRelease, path); themes.push(oneData); } + // 返回数据 const res: proto.cs.ICSHallThemeRes = { themes }; return this.ok(res); } diff --git a/assets/Scripts/chat18x/ui/panels/GirlListPanel.ts b/assets/Scripts/chat18x/ui/panels/GirlListPanel.ts index 6cf9653c..7cf8909b 100644 --- a/assets/Scripts/chat18x/ui/panels/GirlListPanel.ts +++ b/assets/Scripts/chat18x/ui/panels/GirlListPanel.ts @@ -4,6 +4,11 @@ import Utils from "db://assets/Scripts/Main/Common/Utils"; import { GButton } from "db://assets/Scripts/Main/Common/GButton"; import { GirlListItem } from "../../uiitems/GirlListItem"; import { ConfigManager } from "../../manager/ConfigManager"; +import { GirlService } from "db://assets/Scripts/chat18x/network/services/GirlService"; +import { DataManager, DataId } from "../../data/DataManager"; +import { GirlData } from "../../data/GirlData"; +import proto from 'db://assets/Scripts/proto/proto.pb.js'; + const { ccclass, property } = _decorator; @ccclass("GirlListPanel") @@ -28,22 +33,34 @@ export class GirlListPanel extends li_BaseView { this.refresh(this.category); } - refresh(category: number) { + async refresh(category: number) { if (this.cache) { for (let i = this.cache.length - 1; i >= 0; i--) { this.cache[i].node.destroy(); } } - const GirlsData = ConfigManager.tables.TbGirls.getDataList(); - const config = GirlsData.filter((value) => value.category == category); - for (let i = 0; i < config.length; i++) { - const cfg = config[i]; - let newNode = instantiate(this.itemInst.node); - let item = newNode.getComponent(GirlListItem); - item.refreshData(cfg, this.node); - newNode.active = true; - this.cache.push(item); - this.content.addChild(newNode); + + // 请求列表 + const reqData = { + category, + page: 1, + limit: 10, + }; + let res = await GirlService.I.reqGetGirlList(reqData); + if (res && res.code === proto.cs.EnmRetCode.SUCCESS) { + // 保存数据 + const girlData = DataManager.I.getDataById(DataId.Girl); + girlData.setGirlBriefs(category.toString(), res.data); + // 根据数据,刷新界面 + const allId = girlData.getGirlIds(category.toString()); + for (let id of allId) { + let newNode = instantiate(this.itemInst.node); + let item = newNode.getComponent(GirlListItem); + item.refreshData(category, id, this.node); + newNode.active = true; + this.cache.push(item); + this.content.addChild(newNode); + } } } diff --git a/assets/Scripts/chat18x/ui/panels/ThemePanel.ts b/assets/Scripts/chat18x/ui/panels/ThemePanel.ts index 24468b99..3573c4e5 100644 --- a/assets/Scripts/chat18x/ui/panels/ThemePanel.ts +++ b/assets/Scripts/chat18x/ui/panels/ThemePanel.ts @@ -14,13 +14,15 @@ import ResManager from "db://assets/Scripts/Main/Manager/ResManager"; import { ThemeItem } from "../../uiitems/ThemeItem"; import { NavigationManager } from "../../manager/NavigationManager"; import { GirlListItem } from "../../uiitems/GirlListItem"; -import { ConfigManager } from "../../manager/ConfigManager"; import LanguageUtils from "../../../Main/Common/LanguageUtils"; import { ViewManager } from "../../../Main/Manager/ViewManager"; import { InnerMsgCode } from "../../../Main/Config/InnerMsgCode"; import { ThemeService } from "db://assets/Scripts/chat18x/network/services/ThemeService"; +import { GirlService } from "db://assets/Scripts/chat18x/network/services/GirlService"; import { DataManager, DataId } from "../../data/DataManager"; import { ThemeData } from "../../data/ThemeData"; +import { GirlData } from "../../data/GirlData"; +import proto from 'db://assets/Scripts/proto/proto.pb.js'; const { ccclass, property } = _decorator; @@ -68,37 +70,49 @@ export class ThemePanel extends li_BaseView { }; let res = await ThemeService.I.reqHallTheme(reqData); - // 保存数据 - const themeData = DataManager.I.getDataById(DataId.Theme); - themeData.themes = res.data; - // 根据数据,构建界面显示 - const themeIds = themeData.themeIds; - for (let id of themeIds) { - let newNode = instantiate(this.itemInst.node); - let item = newNode.getComponent(ThemeItem); - item.refresh(id); - newNode.active = true; - this.cache.push(item); - this.content.addChild(newNode); - } - const rectInfo = ConfigManager.tables.TbGirls.get(10001); - this.recId = rectInfo.id; - this.rectNameKey = rectInfo.nameKey; - - //this.recName.string = LanguageUtils.getText(this.rectNameKey); - ResManager.I.changeBundleSpriteFrame( - this.recSprite, - rectInfo.avatarPath, - "Chat18x", - () => { - let sizeTran = this.recSprite.node.parent.getComponent(UITransform); - Utils.adjustBgPixelRatioToSize( - sizeTran.contentSize, - this.recSprite.node, - 1 - ); + if (res && res.code === proto.cs.EnmRetCode.SUCCESS) { + // 保存数据 + const themeData = DataManager.I.getDataById(DataId.Theme); + themeData.themes = res.data; + // 根据数据,刷新界面 + const themeIds = themeData.themeIds; + for (let id of themeIds) { + let newNode = instantiate(this.itemInst.node); + let item = newNode.getComponent(ThemeItem); + item.refresh(id); + newNode.active = true; + this.cache.push(item); + this.content.addChild(newNode); } - ); + } + + // 请求每日推荐 + const reqData2 = { + + }; + let res2 = await GirlService.I.reqDailyRecommend(reqData2); + if (res2 && res2.code === proto.cs.EnmRetCode.SUCCESS) { + const girlData = DataManager.I.getDataById(DataId.Girl); + girlData.setDailyRecommend(res2.data); + // 根据数据,刷新界面 + this.recId = girlData.getRecommendGrilId(0); + this.rectNameKey = girlData.getRecommendGrilName(0); + let avatarPath = girlData.getRecommendGrilAvatar(0); + //this.recName.string = LanguageUtils.getText(this.rectNameKey); + ResManager.I.changeBundleSpriteFrame( + this.recSprite, + avatarPath, + "Chat18x", + () => { + let sizeTran = this.recSprite.node.parent.getComponent(UITransform); + Utils.adjustBgPixelRatioToSize( + sizeTran.contentSize, + this.recSprite.node, + 1 + ); + } + ); + } } private registerListener() { diff --git a/assets/Scripts/chat18x/uiitems/GirlListItem.ts b/assets/Scripts/chat18x/uiitems/GirlListItem.ts index 04941950..24b024b9 100644 --- a/assets/Scripts/chat18x/uiitems/GirlListItem.ts +++ b/assets/Scripts/chat18x/uiitems/GirlListItem.ts @@ -7,6 +7,8 @@ import { NavigationManager } from "../manager/NavigationManager"; import { Girl, PriceType } from "../../schema/schema"; import LanguageUtils from "../../Main/Common/LanguageUtils"; import { InnerMsgCode } from "../../Main/Config/InnerMsgCode"; +import { DataManager, DataId } from "../data/DataManager"; +import { GirlData } from "../data/GirlData"; const { ccclass, property } = _decorator; @@ -33,6 +35,7 @@ export class GirlListItem extends Component { nameKey: string; tagKey: string; + category: number; private onLanguageChangeCallback = () => { if (!this.girlName || !this.tags) return; @@ -64,26 +67,31 @@ export class GirlListItem extends Component { } baseNode: Node; - refreshData(data: Girl, baseNode: Node) { + refreshData(category: number, girlId: number, baseNode: Node) { + this.category = category; this.baseNode = baseNode; - this.id = data.id; - this.nameKey = data.nameKey; - this.girlName.string = LanguageUtils.getText(data.nameKey); - this.tagKey = data.tagKey; + this.id = girlId; + // 数据 + const girlData = DataManager.I.getDataById(DataId.Girl); + this.nameKey = girlData.getGrilName(this.category.toString(), this.id); + this.girlName.string = LanguageUtils.getText(this.nameKey); + this.tagKey = girlData.getGrilTagKey(this.category.toString(), this.id); let desc = ""; - const tags = LanguageUtils.getText(data.tagKey).split("|"); + const tags = LanguageUtils.getText(this.tagKey).split("|"); for (let i = 0; i < tags.length; i++) { if (i != 0) desc += "|"; desc += tags[i]; } this.tags.string = desc; - this.price.node.active = data.priceType == PriceType.pay; - this.freeNode.active = data.priceType == PriceType.free; - this.tryNode.active = data.priceType == PriceType.first_time_free; - + let priceType = girlData.getGrilPriceType(this.category.toString(), this.id); + this.price.node.active = priceType == PriceType.pay; + this.freeNode.active = priceType == PriceType.free; + this.tryNode.active = priceType == PriceType.first_time_free; + // TODO,先用 AvatarPath 代替着 listAvatarPath + let listAvatarPath = girlData.getGrilAvatar(this.category.toString(), this.id); ResManager.I.changeBundleSpriteFrame( this.avatar, - data.listAvatarPath, + listAvatarPath, "Chat18x", () => { let sizeTran = this.avatar.node.parent.getComponent(UITransform); diff --git a/assets/bundles/Chat18x/Image/Girls/10001/video/10001_video_8.mp4 b/assets/bundles/Chat18x/Image/Girls/10001/video/10001_video_8.mp4 new file mode 100644 index 00000000..c5fe93be Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10001/video/10001_video_8.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10003/video/10003_video_6.mp4 b/assets/bundles/Chat18x/Image/Girls/10003/video/10003_video_6.mp4 new file mode 100644 index 00000000..c468c162 Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10003/video/10003_video_6.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10003/video/10003_video_7.mp4 b/assets/bundles/Chat18x/Image/Girls/10003/video/10003_video_7.mp4 new file mode 100644 index 00000000..5b8b0bb7 Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10003/video/10003_video_7.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10003/video/10003_video_8.mp4 b/assets/bundles/Chat18x/Image/Girls/10003/video/10003_video_8.mp4 new file mode 100644 index 00000000..ba197c69 Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10003/video/10003_video_8.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10005/video/10005_video_11.mp4 b/assets/bundles/Chat18x/Image/Girls/10005/video/10005_video_11.mp4 new file mode 100644 index 00000000..d64f5889 Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10005/video/10005_video_11.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10006/video/10006_video_7.mp4 b/assets/bundles/Chat18x/Image/Girls/10006/video/10006_video_7.mp4 new file mode 100644 index 00000000..91bdf590 Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10006/video/10006_video_7.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10008/video/10008_video_6.mp4 b/assets/bundles/Chat18x/Image/Girls/10008/video/10008_video_6.mp4 new file mode 100644 index 00000000..7b76ed95 Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10008/video/10008_video_6.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10008/video/10008_video_7.mp4 b/assets/bundles/Chat18x/Image/Girls/10008/video/10008_video_7.mp4 new file mode 100644 index 00000000..4e7752ce Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10008/video/10008_video_7.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10009/video/10009_video_7.mp4 b/assets/bundles/Chat18x/Image/Girls/10009/video/10009_video_7.mp4 new file mode 100644 index 00000000..896b0c83 Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10009/video/10009_video_7.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10009/video/10009_video_8.mp4 b/assets/bundles/Chat18x/Image/Girls/10009/video/10009_video_8.mp4 new file mode 100644 index 00000000..f36b3863 Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10009/video/10009_video_8.mp4 differ diff --git a/assets/bundles/Chat18x/Image/Girls/10009/video/10009_video_9.mp4 b/assets/bundles/Chat18x/Image/Girls/10009/video/10009_video_9.mp4 new file mode 100644 index 00000000..7f46e088 Binary files /dev/null and b/assets/bundles/Chat18x/Image/Girls/10009/video/10009_video_9.mp4 differ