增加小程序,修改游戏前端

This commit is contained in:
2026-02-04 17:29:51 +08:00
parent de17737ca1
commit 8c677908d7
835 changed files with 283328 additions and 2165 deletions

View File

@@ -0,0 +1,316 @@
import { config } from '../config';
class RemoteConfig {
data: any;
url: string;
timer: number | null;
updateCallbacks: Function[];
constructor() {
this.data = null;
this.url = "";
this.timer = null;
this.updateCallbacks = [];
// 优先使用直接配置的完整 URL (如 Gitee/GitHub Raw URL)
if (config.remoteConfig.configUrl && config.remoteConfig.configUrl.startsWith('http')) {
this.url = config.remoteConfig.configUrl;
console.log('RemoteConfig: Using direct configUrl:', this.url);
} else {
console.warn('RemoteConfig: Missing configUrl.');
}
}
isReady(): boolean {
return this.data !== null;
}
onUpdate(callback: Function) {
if (typeof callback === 'function') {
this.updateCallbacks.push(callback);
}
}
triggerUpdate() {
this.updateCallbacks.forEach(cb => {
try {
cb();
} catch (e) {
console.error('Error in remote config update callback:', e);
}
});
}
start() {
this.fetchConfig();
// 小程序端通常不需要高频轮询,或者可以在 onShow 中触发
// const interval = 30000;
// this.timer = setInterval(() => {
// this.fetchConfig();
// }, interval);
}
fetchConfig() {
if (!this.url) return;
console.log('Fetching remote config from:', this.url);
wx.request({
url: this.url,
data: { t: Date.now() },
success: (res: any) => {
if (res.statusCode === 200) {
this.parseData(res.data);
} else {
console.error('Remote config fetch failed with status:', res.statusCode);
// 获取失败,触发更新以便上层处理错误(此时 data 可能为 null
this.triggerUpdate();
}
},
fail: (err) => {
console.error('Error fetching remote config:', err);
// 网络错误,触发更新以便上层处理错误
this.triggerUpdate();
}
});
}
parseData(data: any) {
let parsedData = null;
if (typeof data === 'string') {
try {
parsedData = JSON.parse(data.trim());
} catch (e) {
console.error('Failed to parse config JSON:', e);
}
} else {
parsedData = data;
}
if (parsedData) {
this.data = parsedData;
this.triggerUpdate();
}
}
getParaValue(paraname: string, agentid: string, gameid: string, channelid: string, marketid: number) {
let paravalue = null;
if (!this.data) {
return paravalue;
}
// 1. Root level
if (this.data[paraname]) {
paravalue = this.data[paraname];
}
// Helper to find item in list and update paravalue
const findAndCheck = (list: any[], key: string, value: any) => {
if (!list || !Array.isArray(list)) return null;
for (const item of list) {
if (item[key] == value) {
if (item[paraname]) {
paravalue = item[paraname];
}
return item;
}
}
return null;
};
// 2. Agent level
const agent = findAndCheck(this.data.agentlist, 'agentid', agentid);
if (!agent) return paravalue;
// 3. Game level
const game = findAndCheck(agent.gamelist, 'gameid', gameid);
if (!game) return paravalue;
// 4. Channel level
const channel = findAndCheck(game.channellist, 'channelid', channelid);
if (!channel) return paravalue;
// 5. Market level
const market = findAndCheck(channel.marketlist, 'marketid', marketid);
return paravalue;
}
// 获取游戏列表_下载页面
getGameListDownHtml(agentid: string, channelid: string) {
const gamelist: any[] = [];
if (!this.data || !this.data.agentlist) {
return gamelist;
}
for (const agent of this.data.agentlist) {
if (agent.agentid == agentid) {
if (agent.gamelist) {
for (const game of agent.gamelist) {
const o_game: any = {
name: game.gamename,
image: game.game_down_image,
state: game.game_down_state,
memo: game.game_down_memo
};
if (game.channellist) {
for (const channel of game.channellist) {
if (channel.channelid == channelid) {
const _ios_marketid = channel.ios_defdownload_marketid;
const _and_marketid = channel.and_defdownload_marketid;
if (channel.marketlist) {
for (const market of channel.marketlist) {
if (market.marketid == _ios_marketid) {
o_game.ios_down = market.app_download;
o_game.ios_size = market.app_size;
o_game.ios_marketid = _ios_marketid;
}
if (market.marketid == _and_marketid) {
o_game.android_down = market.app_download;
o_game.android_size = market.app_size;
}
}
}
if (o_game.ios_down && o_game.android_down) {
gamelist.push(o_game);
}
break;
}
}
}
}
}
break;
}
}
return gamelist;
}
// 获取游戏列表_游戏大厅
getGameListGameHall(agentid: string, channelid: string, marketid: number) {
const gamelist: any[] = [];
if (!this.data || !this.data.agentlist) {
return gamelist;
}
for (const agent of this.data.agentlist) {
if (agent.agentid == agentid) {
if (agent.gamelist) {
for (const game of agent.gamelist) {
if (game.gameid != "G2hw0ubng0zcoI0r4mx3H2yr4GejidwO") {
const o_game: any = {
gameid: game.gameid,
gamename: game.gamename,
gamedir: game.game_hall_dir,
gameimage: game.game_hall_image,
gameversion: game.game_version,
gamezip: game.game_zip,
zipsize: game.game_size
};
if (game.channellist) {
for (const channel of game.channellist) {
if (channel.channelid == channelid) {
if (channel.game_version > 0) {
o_game.gameversion = channel.game_version;
}
if (channel.game_zip) {
o_game.gamezip = channel.game_zip;
}
if (channel.game_size) {
o_game.zipsize = channel.game_size;
}
if (channel.marketlist) {
for (const market of channel.marketlist) {
if (market.marketid == marketid) {
if (market.game_version > 0) {
o_game.gameversion = market.game_version;
}
if (market.game_zip) {
o_game.gamezip = market.game_zip;
}
if (market.game_size) {
o_game.zipsize = market.game_size;
}
break;
}
}
}
gamelist.push(o_game);
break;
}
}
}
}
}
}
break;
}
}
return gamelist;
}
// 获取代理城市列表
getAgentList(agentid: string, channelid: string) {
const agentlist: any[] = [];
if (!this.data || !this.data.agentlist) {
return agentlist;
}
for (const agent of this.data.agentlist) {
if (agent.agentid == agentid || agent.relagentid == agentid) {
const o_agent = {
agentid: agent.agentid,
name: agent.agentname,
channelid: (agent.gamelist && agent.gamelist[0] && agent.gamelist[0].channellist && agent.gamelist[0].channellist[0]) ? agent.gamelist[0].channellist[0].channelid : ''
};
agentlist.push(o_agent);
}
}
return agentlist;
}
// 获取子游戏服务器列表
getGameServerList(agentid: string) {
const iplist: string[] = [];
const paraname = "game_server_http";
const doPushToIpList = (ip: string) => {
if (ip && !iplist.includes(ip)) {
iplist.push(ip);
}
};
if (!this.data || !this.data.agentlist) {
return iplist;
}
const agent = this.data.agentlist.find((a: any) => a.agentid === agentid);
if (!agent) {
return iplist;
}
if (this.data[paraname]) {
doPushToIpList(this.data[paraname]);
}
if (agent[paraname]) {
doPushToIpList(agent[paraname]);
}
if (agent.gamelist) {
for (const game of agent.gamelist) {
if (game[paraname]) {
doPushToIpList(game[paraname]);
}
}
}
return iplist;
}
}
export const remoteConfig = new RemoteConfig();

View File

@@ -0,0 +1,19 @@
export const formatTime = (date: Date) => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const hour = date.getHours()
const minute = date.getMinutes()
const second = date.getSeconds()
return (
[year, month, day].map(formatNumber).join('/') +
' ' +
[hour, minute, second].map(formatNumber).join(':')
)
}
const formatNumber = (n: number) => {
const s = n.toString()
return s[1] ? s : '0' + s
}