|  | @@ -0,0 +1,221 @@
 | 
	
		
			
				|  |  | +// CloudObject.ts
 | 
	
		
			
				|  |  | +export class CloudObject {
 | 
	
		
			
				|  |  | +    id: string | null = null; // 编号
 | 
	
		
			
				|  |  | +    className: string; // 名称
 | 
	
		
			
				|  |  | +    createdAt:any;
 | 
	
		
			
				|  |  | +    updatedAt:any;
 | 
	
		
			
				|  |  | +    data: Record<string, any> = {}; // 属性、内容
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    constructor(className: string) {
 | 
	
		
			
				|  |  | +        this.className = className;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    toPointer() {
 | 
	
		
			
				|  |  | +        return { "__type": "Pointer", "className": this.className, "objectId": this.id };
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    set(json: Record<string, any>) {
 | 
	
		
			
				|  |  | +        Object.keys(json).forEach(key => {
 | 
	
		
			
				|  |  | +            if (["objectId", "id", "createdAt", "updatedAt", "ACL"].indexOf(key) > -1) {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            this.data[key] = json[key];
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    get(key: string) {
 | 
	
		
			
				|  |  | +        return this.data[key] || null;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    async save() {
 | 
	
		
			
				|  |  | +        let method = "POST";
 | 
	
		
			
				|  |  | +        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}`;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 更新
 | 
	
		
			
				|  |  | +        if (this.id) {
 | 
	
		
			
				|  |  | +            url += `/${this.id}`;
 | 
	
		
			
				|  |  | +            method = "PUT";
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const body = JSON.stringify(this.data);
 | 
	
		
			
				|  |  | +        const response = await fetch(url, {
 | 
	
		
			
				|  |  | +            headers: {
 | 
	
		
			
				|  |  | +                "content-type": "application/json;charset=UTF-8",
 | 
	
		
			
				|  |  | +                "x-parse-application-id": "dev"
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            body: body,
 | 
	
		
			
				|  |  | +            method: method,
 | 
	
		
			
				|  |  | +            mode: "cors",
 | 
	
		
			
				|  |  | +            credentials: "omit"
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const result = await response?.json();
 | 
	
		
			
				|  |  | +        if (result?.error) {
 | 
	
		
			
				|  |  | +            console.error(result?.error);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (result?.objectId) {
 | 
	
		
			
				|  |  | +            this.id = result?.objectId;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return this;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    async destroy() {
 | 
	
		
			
				|  |  | +        if (!this.id) return;
 | 
	
		
			
				|  |  | +        const response = await fetch(`http://dev.fmode.cn:1337/parse/classes/${this.className}/${this.id}`, {
 | 
	
		
			
				|  |  | +            headers: {
 | 
	
		
			
				|  |  | +                "x-parse-application-id": "dev"
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            body: null,
 | 
	
		
			
				|  |  | +            method: "DELETE",
 | 
	
		
			
				|  |  | +            mode: "cors",
 | 
	
		
			
				|  |  | +            credentials: "omit"
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const result = await response?.json();
 | 
	
		
			
				|  |  | +        if (result) {
 | 
	
		
			
				|  |  | +            this.id = null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// CloudQuery.ts
 | 
	
		
			
				|  |  | +export class CloudQuery {
 | 
	
		
			
				|  |  | +    className: string;
 | 
	
		
			
				|  |  | +    queryParams: Record<string, any> = {};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    constructor(className: string) {
 | 
	
		
			
				|  |  | +        this.className = className;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 作用是将查询参数转换为对象
 | 
	
		
			
				|  |  | +    include(...fileds:string[]) {
 | 
	
		
			
				|  |  | +        this.queryParams["include"] = fileds;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    greaterThan(key: string, value: any) {
 | 
	
		
			
				|  |  | +        if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
 | 
	
		
			
				|  |  | +        this.queryParams["where"][key]["$gt"] = value;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    greaterThanAndEqualTo(key: string, value: any) {
 | 
	
		
			
				|  |  | +        if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
 | 
	
		
			
				|  |  | +        this.queryParams["where"][key]["$gte"] = value;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    lessThan(key: string, value: any) {
 | 
	
		
			
				|  |  | +        if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
 | 
	
		
			
				|  |  | +        this.queryParams["where"][key]["$lt"] = value;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    lessThanAndEqualTo(key: string, value: any) {
 | 
	
		
			
				|  |  | +        if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
 | 
	
		
			
				|  |  | +        this.queryParams["where"][key]["$lte"] = value;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    equalTo(key: string, value: any) {
 | 
	
		
			
				|  |  | +        this.queryParams["where"][key] = value;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    async get(id: string) {
 | 
	
		
			
				|  |  | +        const url = `http://dev.fmode.cn:1337/parse/classes/${this.className}/${id}?`;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const response = await fetch(url, {
 | 
	
		
			
				|  |  | +            headers: {
 | 
	
		
			
				|  |  | +                "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
 | 
	
		
			
				|  |  | +                "x-parse-application-id": "dev"
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            body: null,
 | 
	
		
			
				|  |  | +            method: "GET",
 | 
	
		
			
				|  |  | +            mode: "cors",
 | 
	
		
			
				|  |  | +            credentials: "omit"
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const json = await response?.json();
 | 
	
		
			
				|  |  | +        // return json || {};
 | 
	
		
			
				|  |  | +        const exists = json?.results?.[0] || null;
 | 
	
		
			
				|  |  | +        if (exists) {
 | 
	
		
			
				|  |  | +            let existsObject = this.dataToObj(exists)
 | 
	
		
			
				|  |  | +            return existsObject;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return null
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    async find() {
 | 
	
		
			
				|  |  | +        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        let queryStr = ``
 | 
	
		
			
				|  |  | +        Object.keys(this.queryParams).forEach(key=>{
 | 
	
		
			
				|  |  | +            let paramStr = JSON.stringify(this.queryParams[key]); // 作用是将对象转换为JSON字符串
 | 
	
		
			
				|  |  | +            if(key=="include"){
 | 
	
		
			
				|  |  | +                paramStr = this.queryParams[key]?.join(",")
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if(key=="where"){
 | 
	
		
			
				|  |  | +                paramStr = JSON.stringify(this.queryParams[key]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if(queryStr) {
 | 
	
		
			
				|  |  | +                url += `${key}=${paramStr}`;
 | 
	
		
			
				|  |  | +            }else{
 | 
	
		
			
				|  |  | +                url += `&${key}=${paramStr}`;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const response = await fetch(url, {
 | 
	
		
			
				|  |  | +            headers: {
 | 
	
		
			
				|  |  | +                "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
 | 
	
		
			
				|  |  | +                "x-parse-application-id": "dev"
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            body: null,
 | 
	
		
			
				|  |  | +            method: "GET",
 | 
	
		
			
				|  |  | +            mode: "cors",
 | 
	
		
			
				|  |  | +            credentials: "omit"
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const json = await response?.json();
 | 
	
		
			
				|  |  | +        let list = json?.results || []
 | 
	
		
			
				|  |  | +        let objList = list.map((item:any)=>this.dataToObj(item))
 | 
	
		
			
				|  |  | +        return objList || [];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    async first() {
 | 
	
		
			
				|  |  | +        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (Object.keys(this.queryParams["where"]).length) {
 | 
	
		
			
				|  |  | +            const whereStr = JSON.stringify(this.queryParams["where"]);
 | 
	
		
			
				|  |  | +            url += `where=${whereStr}`;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const response = await fetch(url, {
 | 
	
		
			
				|  |  | +            headers: {
 | 
	
		
			
				|  |  | +                "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
 | 
	
		
			
				|  |  | +                "x-parse-application-id": "dev"
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            body: null,
 | 
	
		
			
				|  |  | +            method: "GET",
 | 
	
		
			
				|  |  | +            mode: "cors",
 | 
	
		
			
				|  |  | +            credentials: "omit"
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const json = await response?.json();
 | 
	
		
			
				|  |  | +        const exists = json?.results?.[0] || null;
 | 
	
		
			
				|  |  | +         if (exists) {
 | 
	
		
			
				|  |  | +             let existsObject = this.dataToObj(exists)
 | 
	
		
			
				|  |  | +             return existsObject;
 | 
	
		
			
				|  |  | +         }
 | 
	
		
			
				|  |  | +         return null
 | 
	
		
			
				|  |  | +        //let list = json?.results || []
 | 
	
		
			
				|  |  | +        //let objList = list.map((item:any)=>this.dataToObj(item))
 | 
	
		
			
				|  |  | +        //return objList || [];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    dataToObj(exists:any):CloudObject{
 | 
	
		
			
				|  |  | +        let existsObject = new CloudObject(this.className);
 | 
	
		
			
				|  |  | +        existsObject.set(exists);
 | 
	
		
			
				|  |  | +        existsObject.id = exists.objectId;
 | 
	
		
			
				|  |  | +        existsObject.createdAt = exists.createdAt;
 | 
	
		
			
				|  |  | +        existsObject.updatedAt = exists.updatedAt;
 | 
	
		
			
				|  |  | +        return existsObject;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |