Merge branch 'main' of 47.107.44.202:xionglijia/18xchat

This commit is contained in:
2025-08-26 14:23:12 +08:00
7 changed files with 278 additions and 3 deletions
+8 -3
View File
@@ -28,6 +28,7 @@ import LanguageUtils, { LanguageType } from "../../Main/Common/LanguageUtils";
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";
@@ -304,11 +305,15 @@ export class PreloadUI extends Component {
const reqData = {
};
console.log("玩家数据请求数据:", reqData);
console.log("个人信息请求数据:", reqData);
let res = await PlayerDataService.I.reqMyInfo(reqData);
console.log("玩家数据响应数据:", res);
console.log("个人信息响应数据:", res);
if (res && res.code === proto.cs.EnmRetCode.SUCCESS) {
const resData = res.data;
// 保存数据
const walletData = DataManager.I.getDataById<WalletData>(DataId.Wallet);
walletData.diamond = resData.diamond;
walletData.vipExpire = resData.vipExpire;
}
}
@@ -10,6 +10,7 @@ import { MetaData } from "./MetaData";
import { NetTimeData } from "./NetTimeData";
import { ThemeData } from "./ThemeData";
import { WalletData } from "./WalletData";
import { ShopData } from "./ShopData";
/**
* 集中定义数据ID,避免写错字符串
@@ -22,6 +23,7 @@ export enum DataId {
NetTime = "netTime",
Theme = "theme",
Wallet = "wallet",
Shop = "shop",
}
/** 构造器类型 */
@@ -54,6 +56,7 @@ export class DataManager {
this.register(DataId.NetTime, NetTimeData);
this.register(DataId.Theme, ThemeData);
this.register(DataId.Wallet, WalletData);
this.register(DataId.Shop, ShopData);
}
/**
+148
View File
@@ -0,0 +1,148 @@
/**
* 技师数据
*/
import { BaseData } from "./BaseData";
import proto from 'db://assets/Scripts/proto/proto.pb.js';
export interface GirlBriefVO {
id: number;
name: string;
age: number;
tagKey: string;
priceType: number;
price: number; // 用 number 存(i64 转)
avatar: string;
star: number;
}
export interface GirlPhotoVO {
pic: string;
isRelease: boolean;
price: number;
}
export interface GirlDetailVO {
id: number; // = brief.id
desc: string;
isRelease: boolean;
chatCount: number;
photos: GirlPhotoVO[];
}
export class GirlData extends BaseData {
// 实体归一化
private _briefs = new Map<number, GirlBriefVO>();
private _details = new Map<number, GirlDetailVO>();
// 列表索引
private _dailyRecommend: number[] = [];
private _categoryPages = new Map<number, Map<number, number[]>>(); // category -> (page -> [girlId])
get briefById() { return this._briefs; }
get detailById() { return this._details; }
get dailyRecommendIds() { return this._dailyRecommend; }
public reset(): void {
this._briefs.clear();
this._details.clear();
this._dailyRecommend = [];
this._categoryPages.clear();
}
public clear(): void {
this._briefs.clear();
this._details.clear();
this._dailyRecommend = [];
this._categoryPages.clear();
}
public destroy(): void {
super.destroy();
this._briefs = null;
this._details = null;
this._dailyRecommend = null;
this._categoryPages = null;
}
/** 合并 Brief 列表到缓存(去重+覆盖最新字段) */
mergeBriefs(list: pb.cs.IGirlBrief[] | pb.cs.GirlBrief[]): void {
for (const g of list) {
const id = g.id!;
this._briefs.set(id, {
id,
name: g.name || "",
age: g.age || 0,
tagKey: g.tagKey || "",
priceType: g.priceType || 0,
price: i64(g.price),
avatar: g.avatar || "",
star: g.star || 0,
});
}
}
/** 每日推荐:只维护 id 索引,实体来自 _briefs */
applyDailyRecommend(res: pb.cs.ICSDailyRecommendRes): void {
const girls = res.girls ?? [];
this.mergeBriefs(girls);
this._dailyRecommend = girls.map(g => g.id!);
}
/** 分类分页列表:category + page -> id[] */
applyGirlList(category: number, page: number, res: pb.cs.ICSGetGirlListRes): void {
const girls = res.girls ?? [];
this.mergeBriefs(girls);
if (!this._categoryPages.has(category)) {
this._categoryPages.set(category, new Map());
}
const pages = this._categoryPages.get(category)!;
pages.set(page, girls.map(g => g.id!));
}
/** 详情:合并 brief + detail */
applyGirlDetail(res: pb.cs.ICSGetGirlDetailRes): void {
const d = res.detail!;
const b = d.brief!;
this.mergeBriefs([b]);
const vo: GirlDetailVO = {
id: b.id!,
desc: d.desc || "",
isRelease: !!d.isRelease,
chatCount: d.chatCount || 0,
photos: (d.photos ?? []).map(p => ({
pic: p.pic || "",
isRelease: !!p.isRelease,
price: p.price || 0,
})),
};
this._details.set(vo.id, vo);
}
/** 页面读取:根据分类+页获取 id 列表 */
getPageIds(category: number, page: number): number[] {
const pages = this._categoryPages.get(category);
return pages?.get(page) ?? [];
}
/** 本地变更:聊天次数变更(成功买次数后) */
incChatCount(girlId: number, delta: number) {
const d = this._details.get(girlId);
if (d) d.chatCount = Math.max(0, d.chatCount + delta);
}
/** 本地变更:解锁技师/照片(例如购买后或服务器回调) */
setGirlReleased(girlId: number, v: boolean) {
const d = this._details.get(girlId);
if (d) d.isRelease = v;
}
setPhotoReleased(girlId: number, pic: string, v: boolean) {
const d = this._details.get(girlId);
if (!d) return;
const p = d.photos.find(x => x.pic === pic);
if (p) p.isRelease = v;
}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "fcbd75b6-cda1-4c93-80a8-79eda1ab5e54",
"files": [],
"subMetas": {},
"userData": {}
}
+100
View File
@@ -0,0 +1,100 @@
/**
* 商品数据
*/
import { BaseData } from "./BaseData";
import proto from 'db://assets/Scripts/proto/proto.pb.js';
export class ShopData extends BaseData {
// 商品数据
private _goods = new Map<number, proto.cs.IGood>();
// 商品 id
private _goodIds: number[] = [];
public reset(): void {
this._goods.clear();
this._goodIds = [];
}
public clear(): void {
this._goods.clear();
this._goodIds = [];
}
public destroy(): void {
super.destroy();
this._goods = null;
this._goodIds = null;
}
/** 设置商品数据 */
public set goods(res: proto.cs.ICSGetShopRes) {
const list = res.Goods ?? [];
this._goods.clear();
this._goodIds = [];
for (const g of list) {
const vo: proto.cs.IGood = {
id: g.id, // 商品 id
name: g.name || "", // 商品名字
desc: g.desc || "", // 商品描述
price: g.price || "0.00", // 商品价格
count: g.count || 0, // 商品数量
};
this._goods.set(vo.id, vo);
this._goodIds.push(vo.id);
}
console.log("设置商品数据:", this._goods);
}
/** 获取所有商品数据 */
public get goods(): Map<number, proto.cs.IGood> { return this._goods; }
/** 获取所有商品数据的数量 */
public get goodsCount(): number { return this._goods ? this._goods.size : 0; }
/** 获取所有商品 id */
public get goodIds(): number[] { return this._goodIds; }
/** 获取vip商品数据 */
public get vipGoods(): proto.cs.IGood[] {
return this._goodIds.map(id => this._goods.get(id)!).filter(g => g.id > 2000);
}
/** 获取普通商品数据 */
public get normalGoods(): proto.cs.IGood[] {
return this._goodIds.map(id => this._goods.get(id)!).filter(g => g.id <= 2000);
}
/** 根据商品 id 获取商品数据 */
private getGoodDataById(id: number): proto.cs.IGood | null {
if (!this._goods) return null;
return this._goods.get(id) ?? null;
}
/** 根据商品 id 获取商品名字 */
public getNameById(id: number): string | null {
let oneData = this.getGoodDataById(id);
if (!oneData) return null;
return oneData.name;
}
/** 根据商品 id 获取商品描述 */
public getDescById(id: number): string | null {
let oneData = this.getGoodDataById(id);
if (!oneData) return null;
return oneData.desc;
}
/** 根据商品 id 获取商品价格 */
public getPriceById(id: number): string | null {
let oneData = this.getGoodDataById(id);
if (!oneData) return null;
return oneData.price;
}
/** 根据商品 id 获取商品数量 */
public getCountById(id: number): number | null {
let oneData = this.getGoodDataById(id);
if (!oneData) return null;
return oneData.count;
}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "c6e24881-4575-4e81-a204-1219d51625b6",
"files": [],
"subMetas": {},
"userData": {}
}
+1
View File
@@ -29,6 +29,7 @@ export class ThemeData extends BaseData {
/** 设置主题数据 */
public set themes(res: proto.cs.ICSHallThemeRes) {
const list = res.themes ?? [];
this._themes.clear();
this._themeIds = [];
for (const t of list) {
const vo: proto.cs.IHallTheme = {