diff --git a/miniprogram/app.ts b/miniprogram/app.ts index f5d5c29..20ce685 100644 --- a/miniprogram/app.ts +++ b/miniprogram/app.ts @@ -1,6 +1,6 @@ import { Logger } from "./core/Logger"; import { LevelLogLabel, LifeCycleLogLabel } from "./core/PresetLogLabel"; - +import { API, IParamSetting } from "./core/Api"; import { Storage } from "./core/Storage"; @@ -26,5 +26,47 @@ App({ setTimeout(() => { s.set("be", 12); }, 1000) + + interface ITestApiInput { + name: string, + id: number, + info: { + data: string + } + } + + class TestApi extends API { + + public override key:string = "TestApi"; + + public override params: IParamSetting = { + name: { + tester: "123" + }, + id: { + parse: (i) => ++i, + }, + info: {} + } + + public constructor(data:ITestApiInput) { + super(data); + this.initLabel(); + this.initData(); + } + } + + function testApi() { + let api = new TestApi({ + name: "123", + id: 456, + info: { + data: "abc" + } + }); + console.log(api); + } + + testApi(); } }) \ No newline at end of file diff --git a/miniprogram/core/Api.ts b/miniprogram/core/Api.ts new file mode 100644 index 0000000..e3098c8 --- /dev/null +++ b/miniprogram/core/Api.ts @@ -0,0 +1,162 @@ +import { LogLabel } from "./LogLabel"; +import { Logger } from "./Logger"; +import { LevelLogLabel, colorRadio } from "./PresetLogLabel"; + +interface IAnyData { + [x:string]: any +} + +type DeepReadonly = { + readonly [P in keyof T]: DeepReadonly; +}; + +/** + * 请求参数设置 + */ +type IParamSetting = { + [P in keyof T]: { + + /** + * 默认值 + */ + defaultValue?: T[P], + + /** + * 测试 + */ + tester?: RegExp | ((data:T[P]) => boolean) | string, + + /** + * 预解析函数 + */ + parse?: ((data:T[P], key:string, all:DeepReadonly>) => T[P]), + + /** + * 是否为请求头数据 + */ + isHeader?: boolean, + + /** + * 是否为模板 + */ + isTemplate?: boolean + + /** + * 是否可选 + */ + Optional?: boolean + } +} + +/** + * 接口调用 + */ +class API { + + public static defaultLogLabel:LogLabel = new LogLabel( + `API:API`, colorRadio(200, 120, 222) + ); + + /** + * Logger 使用的标签 + */ + private LogLabel:LogLabel = API.defaultLogLabel; + + /** + * Api 唯一 ID + */ + public key:string = "API"; + + /** + * API 需要的参数列表 + */ + public params:IParamSetting = {} as any; + + /** + * API 需要的数据 + */ + public data:Partial; + + /** + * 请求数据 + */ + public requestData:IAnyData = {} as any; + + /** + * 构造函数 + * 注意:data 是不安全的,请传入数据副本 + * @param data API需要的全部数据 + */ + public constructor(data? :Partial) { + this.data = data ?? {}; + } + + /** + * 初始化标签 + */ + public initLabel() { + this.LogLabel = new LogLabel( + `API:${ this.key }`, colorRadio(200, 120, 222) + ); + } + + /** + * 初始化数据 + */ + public initData() { + for(let key in this.params) { + + let data = this.data[key]; + let { defaultValue, Optional, tester, parse } = this.params[key]; + + // 默认值赋予 + if(data === void 0 && defaultValue !== void 0) { + this.data[key] = defaultValue; + } + + // 数据存在测试 + if(data === void 0 && !Optional) { + Logger.log(`数据校验异常: 数据 [${key}] 是必须的,但是并没有接收到!`, + LevelLogLabel.FatalLabel, this.LogLabel); + } + + // 用户自定义测试 + if(data !== void 0 && tester !== void 0) { + let testRes:boolean = false; + + if(tester instanceof RegExp) { + testRes = tester.test(data!); + } else if(typeof tester === "string") { + testRes = tester === data; + } else if(tester instanceof Function) { + testRes = tester(data!); + } else { + Logger.logMultiple( + [LevelLogLabel.FatalLabel, this.LogLabel], + `数据校验异常: [${ key }] 参数存在未知类型的 tester:`, tester + ); + } + + if(!testRes) { + Logger.logMultiple( + [LevelLogLabel.FatalLabel, this.LogLabel], + `数据校验异常: [${ key }] 参数数据未通过自定义的 tester:`, data + ); + } + } + + // 数据预解析 + if(parse !== void 0 && data !== void 0) { + this.data[key] = parse(data!, key, this.data as DeepReadonly>); + } + } + } + + /** + * 收集请求数据 + */ + public collectData() {} +} + +export default API; +export { API, IParamSetting } \ No newline at end of file diff --git a/project.config.json b/project.config.json index bf78da6..ec8c334 100644 --- a/project.config.json +++ b/project.config.json @@ -35,7 +35,7 @@ "outputPath": "" }, "enableEngineNative": false, - "useIsolateContext": true, + "useIsolateContext": false, "userConfirmedBundleSwitch": false, "packNpmManually": false, "packNpmRelationList": [],