Add API Moudle!
This commit is contained in:
parent
41519b78e4
commit
0140136a0b
@ -1,7 +1,5 @@
|
||||
import { Logger } from "./core/Logger";
|
||||
import { LevelLogLabel, LifeCycleLogLabel } from "./core/PresetLogLabel";
|
||||
import { API, IParamSetting } from "./core/Api";
|
||||
import { Storage } from "./core/Storage";
|
||||
|
||||
|
||||
App({
|
||||
@ -17,56 +15,5 @@ App({
|
||||
onLaunch() {
|
||||
Logger.log("小程序启动...",
|
||||
LevelLogLabel.TraceLabel, LifeCycleLogLabel.OnLaunchLabel);
|
||||
|
||||
let s = new Storage("test", {
|
||||
a: new Date(),
|
||||
be: 2
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
s.set("be", 12);
|
||||
}, 1000)
|
||||
|
||||
interface ITestApiInput {
|
||||
name: string,
|
||||
id: number,
|
||||
info: {
|
||||
data: string
|
||||
}
|
||||
}
|
||||
|
||||
class TestApi extends API<ITestApiInput, {}> {
|
||||
|
||||
public override key:string = "TestApi";
|
||||
|
||||
public override params: IParamSetting<ITestApiInput> = {
|
||||
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();
|
||||
}
|
||||
})
|
@ -6,6 +6,8 @@ interface IAnyData {
|
||||
[x:string]: any
|
||||
}
|
||||
|
||||
type IWxRequestOption<O> = WechatMiniprogram.RequestOption<O>;
|
||||
|
||||
type DeepReadonly<T> = {
|
||||
readonly [P in keyof T]: DeepReadonly<T[P]>;
|
||||
};
|
||||
@ -22,14 +24,26 @@ type IParamSetting<T extends IAnyData> = {
|
||||
defaultValue?: T[P],
|
||||
|
||||
/**
|
||||
* 测试
|
||||
* ### 数据测试
|
||||
* 1、支持正则表达式测试 \
|
||||
* 2、支持使用 string === string 测试 \
|
||||
* 3、支持使用 number === number 测试 \
|
||||
* 4、支持使用自定义函数测试
|
||||
*/
|
||||
tester?: RegExp | ((data:T[P]) => boolean) | string,
|
||||
tester?: RegExp | ((data:T[P]) => boolean) | string | number,
|
||||
|
||||
/**
|
||||
* 预解析函数
|
||||
* ### 预解析函数
|
||||
* 1、此函数用来处理该键值 \
|
||||
* 2、当返回 undefined 时此键值被遗弃 \
|
||||
* 3、返回值时,此键值被覆盖
|
||||
*
|
||||
* @param data 当前给定数据
|
||||
* @param key 当前给定数据键值
|
||||
* @param all 全部输入数据
|
||||
* @returns 解析结果
|
||||
*/
|
||||
parse?: ((data:T[P], key:string, all:DeepReadonly<Partial<T>>) => T[P]),
|
||||
parse?: ((data:T[P], key:string, all:DeepReadonly<Partial<T>>) => T[P] | undefined),
|
||||
|
||||
/**
|
||||
* 是否为请求头数据
|
||||
@ -53,6 +67,10 @@ type IParamSetting<T extends IAnyData> = {
|
||||
*/
|
||||
class API<I extends IAnyData, O extends IAnyData> {
|
||||
|
||||
public static get baseUrl():string {
|
||||
return "https://xxx.xxx"
|
||||
}
|
||||
|
||||
public static defaultLogLabel:LogLabel = new LogLabel(
|
||||
`API:API`, colorRadio(200, 120, 222)
|
||||
);
|
||||
@ -67,6 +85,11 @@ class API<I extends IAnyData, O extends IAnyData> {
|
||||
*/
|
||||
public key:string = "API";
|
||||
|
||||
/**
|
||||
* API url
|
||||
*/
|
||||
public url:string = "/";
|
||||
|
||||
/**
|
||||
* API 需要的参数列表
|
||||
*/
|
||||
@ -75,19 +98,29 @@ class API<I extends IAnyData, O extends IAnyData> {
|
||||
/**
|
||||
* API 需要的数据
|
||||
*/
|
||||
public data:Partial<I>;
|
||||
public data?:Partial<I>;
|
||||
|
||||
/**
|
||||
* 请求数据
|
||||
*/
|
||||
public requestData:IAnyData = {} as any;
|
||||
public requestData?:IWxRequestOption<O>;
|
||||
|
||||
/**
|
||||
* 超时时间 (wx.request)
|
||||
*/
|
||||
public timeout?:number;
|
||||
|
||||
/**
|
||||
* 请求方法 (wx.request)
|
||||
*/
|
||||
public method:HTTPMethod = HTTPMethod.GET;
|
||||
|
||||
/**
|
||||
* 构造函数
|
||||
* 注意:data 是不安全的,请传入数据副本
|
||||
* @param data API需要的全部数据
|
||||
*/
|
||||
public constructor(data? :Partial<I>) {
|
||||
public constructor(data?: Partial<I>) {
|
||||
this.data = data ?? {};
|
||||
}
|
||||
|
||||
@ -104,31 +137,38 @@ class API<I extends IAnyData, O extends IAnyData> {
|
||||
* 初始化数据
|
||||
*/
|
||||
public initData() {
|
||||
for(let key in this.params) {
|
||||
|
||||
if (this.data === void 0) {
|
||||
Logger.log(`数据初始化异常: 没有输入 [data] 数据!`,
|
||||
LevelLogLabel.FatalLabel, this.LogLabel);
|
||||
return;
|
||||
}
|
||||
|
||||
for (let key in this.params) {
|
||||
|
||||
let data = this.data[key];
|
||||
let { defaultValue, Optional, tester, parse } = this.params[key];
|
||||
let { defaultValue, Optional, tester } = this.params[key];
|
||||
|
||||
// 默认值赋予
|
||||
if(data === void 0 && defaultValue !== void 0) {
|
||||
if (data === void 0 && defaultValue !== void 0) {
|
||||
this.data[key] = defaultValue;
|
||||
}
|
||||
|
||||
// 数据存在测试
|
||||
if(data === void 0 && !Optional) {
|
||||
if (data === void 0 && !Optional) {
|
||||
Logger.log(`数据校验异常: 数据 [${key}] 是必须的,但是并没有接收到!`,
|
||||
LevelLogLabel.FatalLabel, this.LogLabel);
|
||||
}
|
||||
|
||||
// 用户自定义测试
|
||||
if(data !== void 0 && tester !== void 0) {
|
||||
if (data !== void 0 && tester !== void 0) {
|
||||
let testRes:boolean = false;
|
||||
|
||||
if(tester instanceof RegExp) {
|
||||
if (tester instanceof RegExp) {
|
||||
testRes = tester.test(data!);
|
||||
} else if(typeof tester === "string") {
|
||||
} else if (typeof tester === "string" || typeof tester === "number") {
|
||||
testRes = tester === data;
|
||||
} else if(tester instanceof Function) {
|
||||
} else if (tester instanceof Function) {
|
||||
testRes = tester(data!);
|
||||
} else {
|
||||
Logger.logMultiple(
|
||||
@ -137,25 +177,61 @@ class API<I extends IAnyData, O extends IAnyData> {
|
||||
);
|
||||
}
|
||||
|
||||
if(!testRes) {
|
||||
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<Partial<I>>);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 收集请求数据
|
||||
*/
|
||||
public collectData() {}
|
||||
public collectData() {
|
||||
|
||||
if (this.data === void 0) {
|
||||
Logger.log(`收集请求数据异常: 没有输入 [data] 数据!`,
|
||||
LevelLogLabel.FatalLabel, this.LogLabel);
|
||||
return;
|
||||
}
|
||||
|
||||
// 重置请求数据
|
||||
const requestData:IWxRequestOption<O> = this.requestData = {
|
||||
url: API.baseUrl + this.url,
|
||||
};
|
||||
|
||||
for (let key in this.params) {
|
||||
|
||||
let data = this.data[key];
|
||||
let { isHeader, isTemplate, parse } = this.params[key];
|
||||
|
||||
// 数据预解析
|
||||
if (parse !== void 0) {
|
||||
data = parse(data!, key, this.data as DeepReadonly<Partial<I>>);
|
||||
}
|
||||
|
||||
// 加载数据
|
||||
if (!isTemplate) {
|
||||
if (isHeader) {
|
||||
wx.request
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum HTTPMethod {
|
||||
OPTIONS = "OPTIONS",
|
||||
GET = "GET",
|
||||
HEAD = "HEAD",
|
||||
POST = "POST",
|
||||
PUT = "PUT",
|
||||
DELETE = "DELETE",
|
||||
TRACE = "TRACE",
|
||||
CONNECT = "CONNECT"
|
||||
}
|
||||
|
||||
export default API;
|
||||
|
63
miniprogram/pages/Timetable/TestCore.ts
Normal file
63
miniprogram/pages/Timetable/TestCore.ts
Normal file
@ -0,0 +1,63 @@
|
||||
import { Modular, Manager, ILifetime } from "../../core/Module";
|
||||
import { API, IParamSetting } from "../../core/Api";
|
||||
import { Storage } from "../../core/Storage";
|
||||
|
||||
/**
|
||||
* 顶部状态栏
|
||||
*/
|
||||
class TestCore<M extends Manager> extends Modular<M>
|
||||
implements Partial<ILifetime> {
|
||||
|
||||
public onLoad() {
|
||||
|
||||
let s = new Storage("test", {
|
||||
a: new Date(),
|
||||
be: 2
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
s.set("be", 12);
|
||||
}, 1000)
|
||||
|
||||
interface ITestApiInput {
|
||||
name: string,
|
||||
id: number,
|
||||
info: {
|
||||
data: string
|
||||
}
|
||||
}
|
||||
|
||||
class TestApi extends API<ITestApiInput, {}> {
|
||||
|
||||
public override key:string = "TestApi";
|
||||
|
||||
public override params: IParamSetting<ITestApiInput> = {
|
||||
name: {
|
||||
tester: "123"
|
||||
},
|
||||
id: {
|
||||
parse: (i) => ++i,
|
||||
},
|
||||
info: {}
|
||||
}
|
||||
|
||||
public constructor(data:ITestApiInput) {
|
||||
super(data);
|
||||
this.initLabel();
|
||||
this.initData();
|
||||
}
|
||||
}
|
||||
|
||||
let api = new TestApi({
|
||||
name: "123",
|
||||
id: 456,
|
||||
info: {
|
||||
data: "abc"
|
||||
}
|
||||
});
|
||||
console.log(api);
|
||||
}
|
||||
}
|
||||
|
||||
export default TestCore;
|
||||
export { TestCore };
|
@ -1,5 +1,6 @@
|
||||
import { Manager} from "../../core/Module";
|
||||
import { StatusBar } from "./StatusBar";
|
||||
import { TestCore } from "./TestCore";
|
||||
|
||||
/**
|
||||
* 此页面使用 Manager 进行模块化管理
|
||||
@ -7,4 +8,5 @@ import { StatusBar } from "./StatusBar";
|
||||
*/
|
||||
Manager.Page((manager)=>{
|
||||
manager.addModule(StatusBar, "statusBar");
|
||||
manager.addModule(TestCore, "testCore");
|
||||
})
|
Loading…
Reference in New Issue
Block a user