Add API Module #12
@ -1,7 +1,5 @@
|
|||||||
import { Logger } from "./core/Logger";
|
import { Logger } from "./core/Logger";
|
||||||
import { LevelLogLabel, LifeCycleLogLabel } from "./core/PresetLogLabel";
|
import { LevelLogLabel, LifeCycleLogLabel } from "./core/PresetLogLabel";
|
||||||
import { API, IParamSetting } from "./core/Api";
|
|
||||||
import { Storage } from "./core/Storage";
|
|
||||||
|
|
||||||
|
|
||||||
App({
|
App({
|
||||||
@ -17,56 +15,5 @@ App({
|
|||||||
onLaunch() {
|
onLaunch() {
|
||||||
Logger.log("小程序启动...",
|
Logger.log("小程序启动...",
|
||||||
LevelLogLabel.TraceLabel, LifeCycleLogLabel.OnLaunchLabel);
|
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
|
[x:string]: any
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IWxRequestOption<O> = WechatMiniprogram.RequestOption<O>;
|
||||||
|
|
||||||
type DeepReadonly<T> = {
|
type DeepReadonly<T> = {
|
||||||
readonly [P in keyof T]: DeepReadonly<T[P]>;
|
readonly [P in keyof T]: DeepReadonly<T[P]>;
|
||||||
};
|
};
|
||||||
@ -22,14 +24,26 @@ type IParamSetting<T extends IAnyData> = {
|
|||||||
defaultValue?: T[P],
|
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> {
|
class API<I extends IAnyData, O extends IAnyData> {
|
||||||
|
|
||||||
|
public static get baseUrl():string {
|
||||||
|
return "https://xxx.xxx"
|
||||||
|
}
|
||||||
|
|
||||||
public static defaultLogLabel:LogLabel = new LogLabel(
|
public static defaultLogLabel:LogLabel = new LogLabel(
|
||||||
`API:API`, colorRadio(200, 120, 222)
|
`API:API`, colorRadio(200, 120, 222)
|
||||||
);
|
);
|
||||||
@ -67,6 +85,11 @@ class API<I extends IAnyData, O extends IAnyData> {
|
|||||||
*/
|
*/
|
||||||
public key:string = "API";
|
public key:string = "API";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API url
|
||||||
|
*/
|
||||||
|
public url:string = "/";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* API 需要的参数列表
|
* API 需要的参数列表
|
||||||
*/
|
*/
|
||||||
@ -75,19 +98,29 @@ class API<I extends IAnyData, O extends IAnyData> {
|
|||||||
/**
|
/**
|
||||||
* API 需要的数据
|
* 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 是不安全的,请传入数据副本
|
* 注意:data 是不安全的,请传入数据副本
|
||||||
* @param data API需要的全部数据
|
* @param data API需要的全部数据
|
||||||
*/
|
*/
|
||||||
public constructor(data? :Partial<I>) {
|
public constructor(data?: Partial<I>) {
|
||||||
this.data = data ?? {};
|
this.data = data ?? {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,31 +137,38 @@ class API<I extends IAnyData, O extends IAnyData> {
|
|||||||
* 初始化数据
|
* 初始化数据
|
||||||
*/
|
*/
|
||||||
public initData() {
|
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 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;
|
this.data[key] = defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 数据存在测试
|
// 数据存在测试
|
||||||
if(data === void 0 && !Optional) {
|
if (data === void 0 && !Optional) {
|
||||||
Logger.log(`数据校验异常: 数据 [${key}] 是必须的,但是并没有接收到!`,
|
Logger.log(`数据校验异常: 数据 [${key}] 是必须的,但是并没有接收到!`,
|
||||||
LevelLogLabel.FatalLabel, this.LogLabel);
|
LevelLogLabel.FatalLabel, this.LogLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户自定义测试
|
// 用户自定义测试
|
||||||
if(data !== void 0 && tester !== void 0) {
|
if (data !== void 0 && tester !== void 0) {
|
||||||
let testRes:boolean = false;
|
let testRes:boolean = false;
|
||||||
|
|
||||||
if(tester instanceof RegExp) {
|
if (tester instanceof RegExp) {
|
||||||
testRes = tester.test(data!);
|
testRes = tester.test(data!);
|
||||||
} else if(typeof tester === "string") {
|
} else if (typeof tester === "string" || typeof tester === "number") {
|
||||||
testRes = tester === data;
|
testRes = tester === data;
|
||||||
} else if(tester instanceof Function) {
|
} else if (tester instanceof Function) {
|
||||||
testRes = tester(data!);
|
testRes = tester(data!);
|
||||||
} else {
|
} else {
|
||||||
Logger.logMultiple(
|
Logger.logMultiple(
|
||||||
@ -137,25 +177,61 @@ class API<I extends IAnyData, O extends IAnyData> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!testRes) {
|
if (!testRes) {
|
||||||
Logger.logMultiple(
|
Logger.logMultiple(
|
||||||
[LevelLogLabel.FatalLabel, this.LogLabel],
|
[LevelLogLabel.FatalLabel, this.LogLabel],
|
||||||
`数据校验异常: [${ key }] 参数数据未通过自定义的 tester:`, data
|
`数据校验异常: [${ 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;
|
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 { Manager} from "../../core/Module";
|
||||||
import { StatusBar } from "./StatusBar";
|
import { StatusBar } from "./StatusBar";
|
||||||
|
import { TestCore } from "./TestCore";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 此页面使用 Manager 进行模块化管理
|
* 此页面使用 Manager 进行模块化管理
|
||||||
@ -7,4 +8,5 @@ import { StatusBar } from "./StatusBar";
|
|||||||
*/
|
*/
|
||||||
Manager.Page((manager)=>{
|
Manager.Page((manager)=>{
|
||||||
manager.addModule(StatusBar, "statusBar");
|
manager.addModule(StatusBar, "statusBar");
|
||||||
|
manager.addModule(TestCore, "testCore");
|
||||||
})
|
})
|
Loading…
Reference in New Issue
Block a user