Merge branch 'main' of http://47.107.44.202:3000/xionglijia/18xchat
This commit is contained in:
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "1.2.0",
|
||||||
|
"importer": "directory",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "78089db8-0ee4-4f29-9a3b-8ee927360d57",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "1.2.0",
|
||||||
|
"importer": "directory",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "d82373f7-a30d-43a3-84b1-e4d7e37c8e09",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
+128
@@ -0,0 +1,128 @@
|
|||||||
|
/**
|
||||||
|
* 整个APP的环境配置逻辑
|
||||||
|
*/
|
||||||
|
import { sys } from "cc";
|
||||||
|
import { DEBUG, EDITOR, PREVIEW } from "cc/env";
|
||||||
|
import { Env, AppConfigShape } from "./env";
|
||||||
|
import { devConfig } from "./dev";
|
||||||
|
import { testConfig } from "./test";
|
||||||
|
import { prodConfig } from "./prod";
|
||||||
|
|
||||||
|
type PartialEndpoints = Partial<AppConfigShape["endpoints"]>;
|
||||||
|
|
||||||
|
const LS_ENV_KEY = "app_env";
|
||||||
|
const LS_OVERRIDE_KEY = "app_endpoints_override"; // 存JSON字符串
|
||||||
|
|
||||||
|
export class AppConfig {
|
||||||
|
private static _I: AppConfig | null = null;
|
||||||
|
static get I(): AppConfig {
|
||||||
|
if (!AppConfig._I) AppConfig._I = new AppConfig();
|
||||||
|
return AppConfig._I;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _cfg!: AppConfigShape;
|
||||||
|
|
||||||
|
private constructor() {
|
||||||
|
const env = this.detectEnv();
|
||||||
|
this._cfg = this.byEnv(env);
|
||||||
|
|
||||||
|
// 运行时覆盖:query > localStorage
|
||||||
|
// this.applyQueryOverride();
|
||||||
|
// this.applyLocalOverride();
|
||||||
|
}
|
||||||
|
|
||||||
|
public getEnv(): Env { return this._cfg.env; }
|
||||||
|
public isDev(): boolean { return this._cfg.env === Env.Dev; }
|
||||||
|
public isTest(): boolean { return this._cfg.env === Env.Test; }
|
||||||
|
public isProd(): boolean { return this._cfg.env === Env.Prod; }
|
||||||
|
get endpoints() { return this._cfg.endpoints; }
|
||||||
|
|
||||||
|
/** 切换环境(开发工具用) */
|
||||||
|
public switchEnv(env: Env) {
|
||||||
|
this._cfg = this.byEnv(env);
|
||||||
|
sys.localStorage.setItem(LS_ENV_KEY, env);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 运行时局部覆盖 endpoints(紧急切换) */
|
||||||
|
public overrideEndpoints(patch: PartialEndpoints) {
|
||||||
|
this._cfg = {
|
||||||
|
...this._cfg,
|
||||||
|
endpoints: { ...this._cfg.endpoints, ...patch, cdn: { ...this._cfg.endpoints.cdn, ...(patch.cdn || {}) } }
|
||||||
|
};
|
||||||
|
sys.localStorage.setItem(LS_OVERRIDE_KEY, JSON.stringify(patch));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 清除覆盖,回到纯环境配置 */
|
||||||
|
public clearOverrides() {
|
||||||
|
sys.localStorage.removeItem(LS_OVERRIDE_KEY);
|
||||||
|
this._cfg = this.byEnv(this._cfg.env);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 获取 HTTP 基础地址
|
||||||
|
* @param stripTrailingSlash 是否去掉末尾斜杠,默认 true
|
||||||
|
*/
|
||||||
|
public getHttpBase(stripTrailingSlash: boolean = true): string {
|
||||||
|
const raw = this._cfg.endpoints.httpBase || "";
|
||||||
|
if (stripTrailingSlash) {
|
||||||
|
return raw.replace(/\/+$/, "");
|
||||||
|
}
|
||||||
|
// 保证有一个结尾斜杠
|
||||||
|
return raw.endsWith("/") ? raw : raw + "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------ 内部 ------------
|
||||||
|
private byEnv(env: Env): AppConfigShape {
|
||||||
|
switch (env) {
|
||||||
|
case Env.Dev: return devConfig;
|
||||||
|
case Env.Test: return testConfig;
|
||||||
|
default: return prodConfig;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private isEnv(x: any): x is Env {
|
||||||
|
return x === Env.Dev || x === Env.Test || x === Env.Prod;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 默认环境:优先 localStorage,再看 EDITOR/DEBUG,最后 prod */
|
||||||
|
private detectEnv(): Env {
|
||||||
|
const saved = sys.localStorage.getItem(LS_ENV_KEY) as Env | null;
|
||||||
|
if (saved && this.isEnv(saved)) {
|
||||||
|
return saved;
|
||||||
|
}
|
||||||
|
// 编辑器/预览时默认 dev
|
||||||
|
if (EDITOR || (PREVIEW && DEBUG)) return Env.Dev;
|
||||||
|
// 调试构建默认 test
|
||||||
|
if (DEBUG) return Env.Test;
|
||||||
|
// 发行构建默认 prod
|
||||||
|
return Env.Prod;
|
||||||
|
}
|
||||||
|
|
||||||
|
private applyLocalOverride() {
|
||||||
|
const raw = sys.localStorage.getItem(LS_OVERRIDE_KEY);
|
||||||
|
if (raw) {
|
||||||
|
try {
|
||||||
|
this.overrideEndpoints(JSON.parse(raw));
|
||||||
|
} catch { /* ignore */ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 支持浏览器 query 覆盖:?env=test&http=...&socket=...&cdn_bgm=... */
|
||||||
|
private applyQueryOverride() {
|
||||||
|
if (!sys.isBrowser) return;
|
||||||
|
const qs = new URLSearchParams(window.location.search);
|
||||||
|
const qEnv = qs.get("env") as Env | null;
|
||||||
|
if (qEnv && this.isEnv(qEnv)) {
|
||||||
|
this._cfg = this.byEnv(qEnv);
|
||||||
|
sys.localStorage.setItem(LS_ENV_KEY, qEnv);
|
||||||
|
}
|
||||||
|
const patch: PartialEndpoints = {};
|
||||||
|
if (qs.get("http")) (patch.httpBase = qs.get("http")!);
|
||||||
|
if (qs.get("socket")) (patch.socketBase = qs.get("socket")!);
|
||||||
|
const cdnPatch: any = {};
|
||||||
|
if (qs.get("cdn_bgm")) cdnPatch.bgm = qs.get("cdn_bgm");
|
||||||
|
if (qs.get("cdn_zhen")) cdnPatch.zhenCang = qs.get("cdn_zhen");
|
||||||
|
if (qs.get("cdn_bgvideo")) cdnPatch.bgVideo = qs.get("cdn_bgvideo");
|
||||||
|
if (Object.keys(cdnPatch).length) (patch.cdn = cdnPatch);
|
||||||
|
if (Object.keys(patch).length) this.overrideEndpoints(patch);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "4.0.24",
|
||||||
|
"importer": "typescript",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "56e9ec0c-c2ef-4ace-89f7-73829135c361",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* 开发环境配置
|
||||||
|
*/
|
||||||
|
import { AppConfigShape, Env } from "./env";
|
||||||
|
export const devConfig: AppConfigShape = {
|
||||||
|
env: Env.Dev,
|
||||||
|
endpoints: {
|
||||||
|
httpBase: "http://43.139.27.67:8081/",
|
||||||
|
socketBase: "ws://127.0.0.1:9001/ws/",
|
||||||
|
cdn: {
|
||||||
|
bgm: "http://127.0.0.1:8081/BGM/",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "4.0.24",
|
||||||
|
"importer": "typescript",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "c1151830-fdb3-40f2-a317-9a5f37aed7d8",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* 环境的类型,接口定义
|
||||||
|
*/
|
||||||
|
export enum Env {
|
||||||
|
Dev = "dev",
|
||||||
|
Test = "test",
|
||||||
|
Prod = "prod",
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CDNConfig {
|
||||||
|
bgm: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Endpoints {
|
||||||
|
httpBase: string; // 业务 HTTP
|
||||||
|
socketBase: string; // WebSocket
|
||||||
|
cdn: CDNConfig; // 各类静态资源
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AppConfigShape {
|
||||||
|
env: Env;
|
||||||
|
endpoints: Endpoints;
|
||||||
|
// 其他:开关、埋点、灰度、版本号……
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "4.0.24",
|
||||||
|
"importer": "typescript",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "4d45e3c5-2567-4426-a736-0329df3f0549",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* 生产环境配置
|
||||||
|
*/
|
||||||
|
import { AppConfigShape, Env } from "./env";
|
||||||
|
export const prodConfig: AppConfigShape = {
|
||||||
|
env: Env.Prod,
|
||||||
|
endpoints: {
|
||||||
|
httpBase: "https://xqmnyx.vip.hnhxzkj.com/api/",
|
||||||
|
socketBase: "wss://www.confessioncontract.com/game/ai/response/",
|
||||||
|
cdn: {
|
||||||
|
bgm: "https://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/BGM/",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "4.0.24",
|
||||||
|
"importer": "typescript",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "80fc473d-912a-4b60-824f-f6de8db5e4c3",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* 测试环境配置
|
||||||
|
*/
|
||||||
|
import { AppConfigShape, Env } from "./env";
|
||||||
|
export const testConfig: AppConfigShape = {
|
||||||
|
env: Env.Test,
|
||||||
|
endpoints: {
|
||||||
|
httpBase: "http://43.139.27.67:8081/",
|
||||||
|
socketBase: "wss://www.confessioncontract.com/test/game/ai/response/",
|
||||||
|
cdn: {
|
||||||
|
bgm: "https://test-cdn.example.com/BGM/",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "4.0.24",
|
||||||
|
"importer": "typescript",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "9cbbaeca-8a67-49c7-8c2c-75afedc8d8c0",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
import { HttpManager, HttpMethod } from "../transport/HttpManager";
|
import { HttpManager, HttpMethod } from "../transport/HttpManager";
|
||||||
import { JsonCodec } from "../codec/JsonCodec";
|
import { JsonCodec } from "../codec/JsonCodec";
|
||||||
import { ProtoCodec } from "../codec/ProtoCodec";
|
import { ProtoCodec } from "../codec/ProtoCodec";
|
||||||
@@ -6,6 +5,7 @@ import type { Endpoint } from "./endpoints";
|
|||||||
import { ApiCode, type ApiResponse } from "./types";
|
import { ApiCode, type ApiResponse } from "./types";
|
||||||
import { DataManager, DataId } from "db://assets/Scripts/chat18x/data/DataManager";
|
import { DataManager, DataId } from "db://assets/Scripts/chat18x/data/DataManager";
|
||||||
import { LoginData } from "db://assets/Scripts/chat18x/data/LoginData";
|
import { LoginData } from "db://assets/Scripts/chat18x/data/LoginData";
|
||||||
|
import { AppConfig } from "db://assets/Scripts/chat18x/config/env/appConfig";
|
||||||
|
|
||||||
export class ApiClient {
|
export class ApiClient {
|
||||||
private static _I: ApiClient | null = null;
|
private static _I: ApiClient | null = null;
|
||||||
@@ -14,8 +14,7 @@ export class ApiClient {
|
|||||||
return ApiClient._I;
|
return ApiClient._I;
|
||||||
}
|
}
|
||||||
private constructor(private http = HttpManager.I) {}
|
private constructor(private http = HttpManager.I) {}
|
||||||
// TODO
|
private get baseUrl() { return AppConfig.I.getHttpBase() }
|
||||||
private get baseUrl() { return "http://43.139.27.67:8081" }
|
|
||||||
private get token() { return DataManager.I.getDataById<LoginData>(DataId.Login).getToken();}
|
private get token() { return DataManager.I.getDataById<LoginData>(DataId.Login).getToken();}
|
||||||
|
|
||||||
public async call<Req, Res>(ep: Endpoint<Req, Res>, req: Req): Promise<ApiResponse<Res>> {
|
public async call<Req, Res>(ep: Endpoint<Req, Res>, req: Req): Promise<ApiResponse<Res>> {
|
||||||
|
|||||||
@@ -6,9 +6,8 @@ export type CodecKind = "json" | "proto";
|
|||||||
export interface Endpoint<Req, Res> {
|
export interface Endpoint<Req, Res> {
|
||||||
path: string;
|
path: string;
|
||||||
method: HttpMethod;
|
method: HttpMethod;
|
||||||
codec: CodecKind;
|
codec: CodecKind; // 编解码类型,"json", "proto"
|
||||||
reqType?: Type; // codec=proto 时必填
|
reqType?: Type; // codec=proto 时必填
|
||||||
resType?: Type; // codec=proto 时必填
|
resType?: Type; // codec=proto 时必填
|
||||||
needsAuth?: boolean;
|
needsAuth?: boolean; // 是否需要token
|
||||||
lock?: boolean;
|
|
||||||
}
|
}
|
||||||
@@ -11,15 +11,14 @@ export class AuthService {
|
|||||||
}
|
}
|
||||||
private constructor(private api = ApiClient.I) {}
|
private constructor(private api = ApiClient.I) {}
|
||||||
|
|
||||||
private EP_LOGIN: Endpoint<proto.ProtoMsg.ILoginReq, proto.ProtoMsg.ILoginRsp> = {
|
|
||||||
path: "login",
|
|
||||||
method: "POST",
|
|
||||||
codec: "json",
|
|
||||||
needsAuth: false
|
|
||||||
};
|
|
||||||
|
|
||||||
// 登录
|
// 登录
|
||||||
public async login(req: proto.ProtoMsg.ILoginReq): Promise<ApiResponse<proto.ProtoMsg.ILoginRsp>> {
|
public async login(req: proto.ProtoMsg.ILoginReq): Promise<ApiResponse<proto.ProtoMsg.ILoginRsp>> {
|
||||||
return this.api.call(this.EP_LOGIN, req);
|
let EP_LOGIN: Endpoint<proto.ProtoMsg.ILoginReq, proto.ProtoMsg.ILoginRsp> = {
|
||||||
|
path: "login",
|
||||||
|
method: "POST",
|
||||||
|
codec: "json",
|
||||||
|
needsAuth: false
|
||||||
|
};
|
||||||
|
return this.api.call(EP_LOGIN, req);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"ver": "1.1.50",
|
||||||
|
"importer": "prefab",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "e8bb1098-aba2-4951-9141-f835ac1d8671",
|
||||||
|
"files": [
|
||||||
|
".json"
|
||||||
|
],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {
|
||||||
|
"syncNodeName": "LoadingPanel"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user