/*export interface Pointer { __type: string; className: string; objectId?: string; // 这里保持 objectId 作为可选字段 //QuestionnaireId?: string; // 自定义主键 //QuestionId?: string; // 自定义主键 //OptionId?: string; // 自定义主键 //_UserId?: string; // 自定义主键 } export class CloudObject { id: string | null = null; // 数据库生成的 objectId className: string; createdAt: string | null = null; updatedAt: string | null = null; data: Record = {}; // 新增的自定义主键 QuestionnaireId?: string; QuestionId?: string; OptionId?: string; _UserId?: string; constructor(className: string) { this.className = className; } toPointer(): Pointer { // 使用自定义主键生成指针 let pointer: Pointer = { "__type": "Pointer", "className": this.className }; // 根据类名设置相应的 ID switch (this.className) { case "Questionnaire": pointer.objectId = this.QuestionnaireId || ""; break; case "Question": pointer.objectId = this.QuestionId || ""; break; case "Option": pointer.objectId = this.OptionId || ""; break; case "_User": pointer.objectId = this._UserId || ""; break; default: pointer.objectId = this.id || ""; // 保持 objectId 作为后备 } return pointer; } set(json: Record) { Object.keys(json).forEach(key => { if (["objectId", "id", "createdAt", "updatedAt", "ACL"].includes(key)) { return; } this.data[key] = json[key]; }); } get(key: string) { return this.data[key] || null; } async save(): Promise { 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(): Promise { if (!this.id) return false; const response = await fetch(`http://dev.fmode.cn:1337/parse/classes/${this.className}/${this.id}`, { headers: { "x-parse-application-id": "dev" }, method: "DELETE", mode: "cors", credentials: "omit" }); const result = await response.json(); if (result) { this.id = null; } return true; } } export class CloudQuery { className: string; whereOptions: Record = {}; constructor(className: string) { this.className = className; } greaterThan(key: string, value: any) { if (!this.whereOptions[key]) this.whereOptions[key] = {}; this.whereOptions[key]["$gt"] = value; return this; } greaterThanAndEqualTo(key: string, value: any) { if (!this.whereOptions[key]) this.whereOptions[key] = {}; this.whereOptions[key]["$gte"] = value; return this; } lessThan(key: string, value: any) { if (!this.whereOptions[key]) this.whereOptions[key] = {}; this.whereOptions[key]["$lt"] = value; return this; } lessThanAndEqualTo(key: string, value: any) { if (!this.whereOptions[key]) this.whereOptions[key] = {}; this.whereOptions[key]["$lte"] = value; return this; } equalTo(key: string, value: any) { this.whereOptions[key] = value; return this; } async get(id: string): Promise> { const url = `http://dev.fmode.cn:1337/parse/classes/${this.className}/${id}`; const response = await fetch(url, { headers: { "x-parse-application-id": "dev" }, method: "GET", mode: "cors", credentials: "omit" }); const json = await response.json(); return json || {}; } async find(): Promise { let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`; if (Object.keys(this.whereOptions).length) { const whereStr = JSON.stringify(this.whereOptions); url += `where=${encodeURIComponent(whereStr)}`; } const response = await fetch(url, { headers: { "x-parse-application-id": "dev" }, method: "GET", mode: "cors", credentials: "omit" }); const json = await response.json(); return json?.results.map((item: any) => { const cloudObject = new CloudObject(this.className); cloudObject.set(item); cloudObject.id = item.objectId; cloudObject.createdAt = item.createdAt; cloudObject.updatedAt = item.updatedAt; return cloudObject; }) || []; } async first(): Promise { let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`; if (Object.keys(this.whereOptions).length) { const whereStr = JSON.stringify(this.whereOptions); url += `where=${encodeURIComponent(whereStr)}&limit=1`; } else { url += `limit=1`; } const response = await fetch(url, { headers: { "x-parse-application-id": "dev" }, method: "GET", mode: "cors", credentials: "omit" }); const json = await response.json(); const exists = json?.results?.[0] || null; if (exists) { const cloudObject = new CloudObject(this.className); cloudObject.set(exists); cloudObject.id = exists.objectId; cloudObject.createdAt = exists.createdAt; cloudObject.updatedAt = exists.updatedAt; return cloudObject; } return null; } }*/ // CloudObject.ts export interface Pointer { __type: string; className: string; objectId?: string; // 这里保持 objectId 作为可选字段 } export class CloudObject { id: string | null = null; className: string; data: Record = {}; createdAt: string | null = null; updatedAt: string | null = null; constructor(className: string) { this.className = className; } toPointer() { return { "__type": "Pointer", "className": this.className, "objectId": this.id }; } set(json: Record) { Object.keys(json).forEach(key => { if (["objectId", "id", "createdAt", "updatedAt", "ACL"].includes(key)) { return; } this.data[key] = json[key]; }); } get(key: string) { return this.data[key] || null; } async save(): Promise { 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, 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(): Promise { if (!this.id) return false; const response = await fetch(`http://dev.fmode.cn:1337/parse/classes/${this.className}/${this.id}`, { headers: { "x-parse-application-id": "dev" }, 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; whereOptions: Record = {}; constructor(className: string) { this.className = className; } greaterThan(key: string, value: any) { this.whereOptions[key] = { "$gt": value }; } greaterThanAndEqualTo(key: string, value: any) { this.whereOptions[key] = { "$gte": value }; } lessThan(key: string, value: any) { this.whereOptions[key] = { "$lt": value }; } lessThanAndEqualTo(key: string, value: any) { this.whereOptions[key] = { "$lte": value }; } equalTo(key: string, value: any) { this.whereOptions[key] = value; } containedIn(key: string, valueArray: any[]) { this.whereOptions[key] = { "$in": valueArray }; } async get(id: string): Promise> { 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" }, method: "GET", mode: "cors", credentials: "omit" }); const json = await response.json(); return json || {}; } async find(): Promise { let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`; if (Object.keys(this.whereOptions).length) { const whereStr = JSON.stringify(this.whereOptions); url += `where=${encodeURIComponent(whereStr)}`; } const response = await fetch(url, { headers: { "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2BDKY\"", "x-parse-application-id": "dev" }, method: "GET", mode: "cors", credentials: "omit" }); const json = await response.json(); return json?.results.map((item: any) => { const cloudObject = new CloudObject(this.className); cloudObject.set(item); cloudObject.id = item.objectId; return cloudObject; }) || []; } async first(): Promise { let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`; if (Object.keys(this.whereOptions).length) { const whereStr = JSON.stringify(this.whereOptions); url += `where=${encodeURIComponent(whereStr)}`; } const response = await fetch(url, { headers: { "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"", "x-parse-application-id": "dev" }, method: "GET", mode: "cors", credentials: "omit" }); const json = await response.json(); const exists = json?.results?.[0] || null; if (exists) { const existsObject = new CloudObject(this.className); existsObject.set(exists); existsObject.id = exists.objectId; existsObject.createdAt = exists.createdAt; existsObject.updatedAt = exists.updatedAt; return existsObject; } return null; } }