|
|
@@ -1,5 +1,358 @@
|
|
|
+// // CloudObject.ts
|
|
|
+// //CloudObject 是表示数据库中单个对象的类。每个 CloudObject 实例对应数据库中的一条记录。
|
|
|
+// export class CloudObject {
|
|
|
+// className: string; // 类名,用于标识对象的类型
|
|
|
+// id: string | null = null; // 对象的唯一标识符,初始为 null
|
|
|
+// createdAt: any; // 对象创建时间
|
|
|
+// updatedAt: any; // 对象更新时间
|
|
|
+// data: Record<string, any> = {}; // 存储对象的实际数据
|
|
|
+
|
|
|
+// // 构造函数,初始化类名
|
|
|
+// constructor(className: string) {
|
|
|
+// this.className = className; // 设置对象的类名
|
|
|
+// }
|
|
|
+
|
|
|
+// // 将当前对象转换为指针形式,包含类名和对象 ID
|
|
|
+// 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]; // 将数据设置到对象的 data 属性中
|
|
|
+// });
|
|
|
+// }
|
|
|
+
|
|
|
+// // 获取指定键的值
|
|
|
+// get(key: string) {
|
|
|
+// return this.data[key] || null; // 返回对应键的值,如果不存在则返回 null
|
|
|
+// }
|
|
|
+
|
|
|
+// // 保存对象到服务器
|
|
|
+// async save() {
|
|
|
+// let method = "POST"; // 默认使用 POST 方法
|
|
|
+// let url = `https://dev.fmode.cn/parse/classes/${this.className}`; // 基础 URL
|
|
|
+
|
|
|
+// // 如果对象已有 ID,则为更新操作,使用 PUT 方法
|
|
|
+// if (this.id) {
|
|
|
+// url += `/${this.id}`; // 追加对象 ID 到 URL
|
|
|
+// method = "PUT"; // 设置为 PUT 方法
|
|
|
+// }
|
|
|
+
|
|
|
+// const body = JSON.stringify(this.data); // 将数据转换为 JSON 字符串
|
|
|
+// const response = await fetch(url, {
|
|
|
+// headers: {
|
|
|
+// "content-type": "application/json;charset=UTF-8", // 设置请求内容类型为 JSON
|
|
|
+// "x-parse-application-id": "dev" // 设置应用 ID
|
|
|
+// },
|
|
|
+// body: body, // 请求体
|
|
|
+// method: method, // 请求方法
|
|
|
+// mode: "cors", // 跨域请求模式
|
|
|
+// credentials: "omit" // 不附带凭证
|
|
|
+// });
|
|
|
+
|
|
|
+// const result = await response?.json(); // 解析响应为 JSON
|
|
|
+// if (result?.error) {
|
|
|
+// console.error(result?.error); // 输出错误信息
|
|
|
+// }
|
|
|
+// if (result?.objectId) {
|
|
|
+// this.id = result?.objectId; // 如果返回了对象 ID,则更新本地 ID
|
|
|
+// }
|
|
|
+// return this; // 返回当前对象实例
|
|
|
+// }
|
|
|
+
|
|
|
+// // 删除对象
|
|
|
+// async destroy() {
|
|
|
+// if (!this.id) return; // 如果对象没有 ID,则无法删除
|
|
|
+// const response = await fetch(`https://dev.fmode.cn/parse/classes/${this.className}/${this.id}`, {
|
|
|
+// headers: {
|
|
|
+// "x-parse-application-id": "dev" // 设置应用 ID
|
|
|
+// },
|
|
|
+// body: null, // 请求体为空
|
|
|
+// method: "DELETE", // 使用 DELETE 方法
|
|
|
+// mode: "cors", // 跨域请求模式
|
|
|
+// credentials: "omit" // 不附带凭证
|
|
|
+// });
|
|
|
+
|
|
|
+// const result = await response?.json(); // 解析响应为 JSON
|
|
|
+// if (result) {
|
|
|
+// this.id = null; // 删除成功后,将本地 ID 设置为 null
|
|
|
+// }
|
|
|
+// return true; // 返回删除成功的状态
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // CloudQuery.ts\
|
|
|
+// //CloudQuery 是用于查询数据库中多个对象的类。它允许你构建查询条件并获取符合条件的多个记录。
|
|
|
+// export class CloudQuery {
|
|
|
+// className: string; // 存储类名
|
|
|
+// whereOptions: Record<string, any> = {}; // 存储查询条件的对象,初始为空对象
|
|
|
+
|
|
|
+// // 构造函数,接受一个类名作为参数
|
|
|
+// constructor(className: string) {
|
|
|
+// this.className = className; // 初始化类名
|
|
|
+// }
|
|
|
+
|
|
|
+// // 方法:添加大于条件
|
|
|
+// greaterThan(key: string, value: any) {
|
|
|
+// // 如果该键不存在,则初始化为空对象
|
|
|
+// if (!this.whereOptions[key]) this.whereOptions[key] = {};
|
|
|
+// // 设置大于条件
|
|
|
+// this.whereOptions[key]["$gt"] = value;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 方法:添加大于等于条件
|
|
|
+// greaterThanAndEqualTo(key: string, value: any) {
|
|
|
+// // 如果该键不存在,则初始化为空对象
|
|
|
+// if (!this.whereOptions[key]) this.whereOptions[key] = {};
|
|
|
+// // 设置大于等于条件
|
|
|
+// this.whereOptions[key]["$gte"] = value;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 方法:添加小于条件
|
|
|
+// lessThan(key: string, value: any) {
|
|
|
+// // 如果该键不存在,则初始化为空对象
|
|
|
+// if (!this.whereOptions[key]) this.whereOptions[key] = {};
|
|
|
+// // 设置小于条件
|
|
|
+// this.whereOptions[key]["$lt"] = value;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 方法:添加小于等于条件
|
|
|
+// lessThanAndEqualTo(key: string, value: any) {
|
|
|
+// // 如果该键不存在,则初始化为空对象
|
|
|
+// if (!this.whereOptions[key]) this.whereOptions[key] = {};
|
|
|
+// // 设置小于等于条件
|
|
|
+// this.whereOptions[key]["$lte"] = value;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 方法:添加等于条件
|
|
|
+// equalTo(key: string, value: any) {
|
|
|
+// // 直接设置等于条件
|
|
|
+// this.whereOptions[key] = value;
|
|
|
+// }
|
|
|
+
|
|
|
+// async get(id: string) {
|
|
|
+// const url = `https://dev.fmode.cn/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 || {};
|
|
|
+// }
|
|
|
+
|
|
|
+// async find() {
|
|
|
+// // 构建请求的基础 URL,包含类名
|
|
|
+// let url = `https://dev.fmode.cn/parse/classes/${this.className}?`;
|
|
|
+
|
|
|
+// // 检查是否有查询条件,如果有,则将其序列化为 JSON 字符串
|
|
|
+// if (Object.keys(this.whereOptions).length) {
|
|
|
+// const whereStr = JSON.stringify(this.whereOptions);
|
|
|
+// // 将查询条件添加到 URL 中
|
|
|
+// url += `where=${whereStr}`;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 使用 fetch API 发送 GET 请求
|
|
|
+// const response = await fetch(url, {
|
|
|
+// headers: {
|
|
|
+// // 如果服务器返回的内容没有变化,则使用此请求头
|
|
|
+// "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
|
|
|
+// // 设置 Parse 应用的 ID
|
|
|
+// "x-parse-application-id": "dev"
|
|
|
+// },
|
|
|
+// body: null, // GET 请求不需要请求体
|
|
|
+// method: "GET", // 请求方法为 GET
|
|
|
+// mode: "cors", // 跨域请求模式
|
|
|
+// credentials: "omit" // 不携带凭据(如 Cookies)
|
|
|
+// });
|
|
|
+
|
|
|
+// // 解析响应为 JSON 格式
|
|
|
+// const json = await response?.json();
|
|
|
+// // 从结果中提取数据,默认为空数组
|
|
|
+// let list = json?.results || [];
|
|
|
+// // 将获取的原始数据转换为对象列表
|
|
|
+// let objList = list.map((item: any) => this.dataToObj(item));
|
|
|
+// // 返回转换后的对象列表,如果没有数据则返回空数组
|
|
|
+// return objList || [];
|
|
|
+// }
|
|
|
+// async first() {
|
|
|
+// let url = `https://dev.fmode.cn/parse/classes/${this.className}?`;
|
|
|
+
|
|
|
+// if (Object.keys(this.whereOptions).length) {
|
|
|
+// const whereStr = JSON.stringify(this.whereOptions);
|
|
|
+// 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
|
|
|
+// }
|
|
|
+
|
|
|
+// 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;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // CloudUser.ts
|
|
|
+// export class CloudUser extends CloudObject {
|
|
|
+// constructor() {
|
|
|
+// super("_User"); // 假设用户类在Parse中是"_User"
|
|
|
+// // 读取用户缓存信息
|
|
|
+// let userCacheStr = localStorage.getItem("NCloud/dev/User")
|
|
|
+// if(userCacheStr){
|
|
|
+// let userData = JSON.parse(userCacheStr)
|
|
|
+// // 设置用户信息
|
|
|
+// this.id = userData?.objectId;
|
|
|
+// this.sessionToken = userData?.sessionToken;
|
|
|
+// this.data = userData; // 保存用户数据
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// sessionToken:string|null = ""
|
|
|
+// /** 获取当前用户信息 */
|
|
|
+// async current() {
|
|
|
+// if (!this.sessionToken) {
|
|
|
+// console.error("用户未登录");
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+
|
|
|
+// const response = await fetch(`https://dev.fmode.cn/parse/users/me`, {
|
|
|
+// headers: {
|
|
|
+// "x-parse-application-id": "dev",
|
|
|
+// "x-parse-session-token": this.sessionToken // 使用sessionToken进行身份验证
|
|
|
+// },
|
|
|
+// method: "GET"
|
|
|
+// });
|
|
|
+
|
|
|
+// const result = await response?.json();
|
|
|
+// if (result?.error) {
|
|
|
+// console.error(result?.error);
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+
|
|
|
+// /** 登录 */
|
|
|
+// async login(username: string, password: string):Promise<CloudUser|null> {
|
|
|
+// const response = await fetch(`https://dev.fmode.cn/parse/login`, {
|
|
|
+// headers: {
|
|
|
+// "x-parse-application-id": "dev",
|
|
|
+// "Content-Type": "application/json"
|
|
|
+// },
|
|
|
+// body: JSON.stringify({ username, password }),
|
|
|
+// method: "POST"
|
|
|
+// });
|
|
|
+
|
|
|
+// const result = await response?.json();
|
|
|
+// if (result?.error) {
|
|
|
+// console.error(result?.error);
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 设置用户信息
|
|
|
+// this.id = result?.objectId;
|
|
|
+// this.sessionToken = result?.sessionToken;
|
|
|
+// this.data = result; // 保存用户数据
|
|
|
+// // 缓存用户信息
|
|
|
+// console.log(result)
|
|
|
+// localStorage.setItem("NCloud/dev/User",JSON.stringify(result))
|
|
|
+// return this;
|
|
|
+// }
|
|
|
+
|
|
|
+// /** 登出 */
|
|
|
+// async logout() {
|
|
|
+// if (!this.sessionToken) {
|
|
|
+// console.error("用户未登录");
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// const response = await fetch(`https://dev.fmode.cn/parse/logout`, {
|
|
|
+// headers: {
|
|
|
+// "x-parse-application-id": "dev",
|
|
|
+// "x-parse-session-token": this.sessionToken
|
|
|
+// },
|
|
|
+// method: "POST"
|
|
|
+// });
|
|
|
+
|
|
|
+// const result = await response?.json();
|
|
|
+// if (result?.error) {
|
|
|
+// console.error(result?.error);
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 清除用户信息
|
|
|
+// localStorage.removeItem("NCloud/dev/User")
|
|
|
+// this.id = null;
|
|
|
+// this.sessionToken = null;
|
|
|
+// this.data = {};
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+
|
|
|
+// /** 注册 */
|
|
|
+// async signUp(username: string, password: string, additionalData: Record<string, any> = {}) {
|
|
|
+// const userData = {
|
|
|
+// username,
|
|
|
+// password,
|
|
|
+// ...additionalData // 合并额外的用户数据
|
|
|
+// };
|
|
|
+
|
|
|
+// const response = await fetch(`https://dev.fmode.cn/parse/users`, {
|
|
|
+// headers: {
|
|
|
+// "x-parse-application-id": "dev",
|
|
|
+// "Content-Type": "application/json"
|
|
|
+// },
|
|
|
+// body: JSON.stringify(userData),
|
|
|
+// method: "POST"
|
|
|
+// });
|
|
|
+
|
|
|
+// const result = await response?.json();
|
|
|
+// if (result?.error) {
|
|
|
+// console.error(result?.error);
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+
|
|
|
+// // 设置用户信息
|
|
|
+// this.id = result?.objectId;
|
|
|
+// this.sessionToken = result?.sessionToken;
|
|
|
+// this.data = result; // 保存用户数据
|
|
|
+// return this;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
// CloudObject.ts
|
|
|
-//CloudObject 是表示数据库中单个对象的类。每个 CloudObject 实例对应数据库中的一条记录。
|
|
|
export class CloudObject {
|
|
|
className: string;
|
|
|
id: string | null = null;
|
|
|
@@ -17,7 +370,7 @@ export class CloudObject {
|
|
|
|
|
|
set(json: Record<string, any>) {
|
|
|
Object.keys(json).forEach(key => {
|
|
|
- if (["objectId", "id", "createdAt", "updatedAt", "ACL"].indexOf(key) > -1) {
|
|
|
+ if (["objectId", "id", "createdAt", "updatedAt"].indexOf(key) > -1) {
|
|
|
return;
|
|
|
}
|
|
|
this.data[key] = json[key];
|
|
|
@@ -78,55 +431,52 @@ export class CloudObject {
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
+
|
|
|
+ // 新增方法:添加Pointer类型
|
|
|
+ addPointer(key: string, className: string, objectId: string) {
|
|
|
+ this.data[key] = {
|
|
|
+ "__type": "Pointer",
|
|
|
+ "className": className,
|
|
|
+ "objectId": objectId
|
|
|
+ };
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-// CloudQuery.ts\
|
|
|
-//CloudQuery 是用于查询数据库中多个对象的类。它允许你构建查询条件并获取符合条件的多个记录。
|
|
|
+// CloudQuery.ts
|
|
|
export class CloudQuery {
|
|
|
- className: string; // 存储类名
|
|
|
- whereOptions: Record<string, any> = {}; // 存储查询条件的对象,初始为空对象
|
|
|
+ className: string;
|
|
|
+ queryParams: Record<string, any> = {};
|
|
|
|
|
|
- // 构造函数,接受一个类名作为参数
|
|
|
constructor(className: string) {
|
|
|
- this.className = className; // 初始化类名
|
|
|
+ this.className = className;
|
|
|
}
|
|
|
|
|
|
- // 方法:添加大于条件
|
|
|
+ include(...fileds:string[]) {
|
|
|
+ this.queryParams["include"] = fileds;
|
|
|
+ }
|
|
|
greaterThan(key: string, value: any) {
|
|
|
- // 如果该键不存在,则初始化为空对象
|
|
|
- if (!this.whereOptions[key]) this.whereOptions[key] = {};
|
|
|
- // 设置大于条件
|
|
|
- this.whereOptions[key]["$gt"] = value;
|
|
|
+ if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
|
|
|
+ this.queryParams["where"][key]["$gt"] = value;
|
|
|
}
|
|
|
|
|
|
- // 方法:添加大于等于条件
|
|
|
greaterThanAndEqualTo(key: string, value: any) {
|
|
|
- // 如果该键不存在,则初始化为空对象
|
|
|
- if (!this.whereOptions[key]) this.whereOptions[key] = {};
|
|
|
- // 设置大于等于条件
|
|
|
- this.whereOptions[key]["$gte"] = value;
|
|
|
+ if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
|
|
|
+ this.queryParams["where"][key]["$gte"] = value;
|
|
|
}
|
|
|
|
|
|
- // 方法:添加小于条件
|
|
|
lessThan(key: string, value: any) {
|
|
|
- // 如果该键不存在,则初始化为空对象
|
|
|
- if (!this.whereOptions[key]) this.whereOptions[key] = {};
|
|
|
- // 设置小于条件
|
|
|
- this.whereOptions[key]["$lt"] = value;
|
|
|
+ if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
|
|
|
+ this.queryParams["where"][key]["$lt"] = value;
|
|
|
}
|
|
|
|
|
|
- // 方法:添加小于等于条件
|
|
|
lessThanAndEqualTo(key: string, value: any) {
|
|
|
- // 如果该键不存在,则初始化为空对象
|
|
|
- if (!this.whereOptions[key]) this.whereOptions[key] = {};
|
|
|
- // 设置小于等于条件
|
|
|
- this.whereOptions[key]["$lte"] = value;
|
|
|
+ if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
|
|
|
+ this.queryParams["where"][key]["$lte"] = value;
|
|
|
}
|
|
|
|
|
|
- // 方法:添加等于条件
|
|
|
equalTo(key: string, value: any) {
|
|
|
- // 直接设置等于条件
|
|
|
- this.whereOptions[key] = value;
|
|
|
+ if (!this.queryParams["where"]) this.queryParams["where"] = {};
|
|
|
+ this.queryParams["where"][key] = value;
|
|
|
}
|
|
|
|
|
|
async get(id: string) {
|
|
|
@@ -144,48 +494,55 @@ export class CloudQuery {
|
|
|
});
|
|
|
|
|
|
const json = await response?.json();
|
|
|
- return json || {};
|
|
|
+ if (json) {
|
|
|
+ let existsObject = this.dataToObj(json)
|
|
|
+ return existsObject;
|
|
|
+ }
|
|
|
+ return null
|
|
|
}
|
|
|
|
|
|
- async find() {
|
|
|
- // 构建请求的基础 URL,包含类名
|
|
|
+ async find():Promise<Array<CloudObject>> {
|
|
|
let url = `https://dev.fmode.cn/parse/classes/${this.className}?`;
|
|
|
-
|
|
|
- // 检查是否有查询条件,如果有,则将其序列化为 JSON 字符串
|
|
|
- if (Object.keys(this.whereOptions).length) {
|
|
|
- const whereStr = JSON.stringify(this.whereOptions);
|
|
|
- // 将查询条件添加到 URL 中
|
|
|
- url += `where=${whereStr}`;
|
|
|
- }
|
|
|
-
|
|
|
- // 使用 fetch API 发送 GET 请求
|
|
|
+
|
|
|
+ let queryStr = ``
|
|
|
+ Object.keys(this.queryParams).forEach(key=>{
|
|
|
+ let paramStr = JSON.stringify(this.queryParams[key]);
|
|
|
+ if(key=="include"){
|
|
|
+ paramStr = this.queryParams[key]?.join(",")
|
|
|
+ }
|
|
|
+ if(queryStr) {
|
|
|
+ url += `${key}=${paramStr}`;
|
|
|
+ }else{
|
|
|
+ url += `&${key}=${paramStr}`;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ // if (Object.keys(this.queryParams["where"]).length) {
|
|
|
+
|
|
|
+ // }
|
|
|
+
|
|
|
const response = await fetch(url, {
|
|
|
headers: {
|
|
|
- // 如果服务器返回的内容没有变化,则使用此请求头
|
|
|
"if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
|
|
|
- // 设置 Parse 应用的 ID
|
|
|
"x-parse-application-id": "dev"
|
|
|
},
|
|
|
- body: null, // GET 请求不需要请求体
|
|
|
- method: "GET", // 请求方法为 GET
|
|
|
- mode: "cors", // 跨域请求模式
|
|
|
- credentials: "omit" // 不携带凭据(如 Cookies)
|
|
|
+ body: null,
|
|
|
+ method: "GET",
|
|
|
+ mode: "cors",
|
|
|
+ credentials: "omit"
|
|
|
});
|
|
|
-
|
|
|
- // 解析响应为 JSON 格式
|
|
|
+
|
|
|
const json = await response?.json();
|
|
|
- // 从结果中提取数据,默认为空数组
|
|
|
- let list = json?.results || [];
|
|
|
- // 将获取的原始数据转换为对象列表
|
|
|
- let objList = list.map((item: any) => this.dataToObj(item));
|
|
|
- // 返回转换后的对象列表,如果没有数据则返回空数组
|
|
|
+ let list = json?.results || []
|
|
|
+ let objList = list.map((item:any)=>this.dataToObj(item))
|
|
|
return objList || [];
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
async first() {
|
|
|
let url = `https://dev.fmode.cn/parse/classes/${this.className}?`;
|
|
|
|
|
|
- if (Object.keys(this.whereOptions).length) {
|
|
|
- const whereStr = JSON.stringify(this.whereOptions);
|
|
|
+ if (Object.keys(this.queryParams["where"]).length) {
|
|
|
+ const whereStr = JSON.stringify(this.queryParams["where"]);
|
|
|
url += `where=${whereStr}`;
|
|
|
}
|
|
|
|
|
|
@@ -222,18 +579,27 @@ export class CloudQuery {
|
|
|
// CloudUser.ts
|
|
|
export class CloudUser extends CloudObject {
|
|
|
constructor() {
|
|
|
- super("_User"); // 假设用户类在Parse中是"_User"
|
|
|
- // 读取用户缓存信息
|
|
|
- let userCacheStr = localStorage.getItem("NCloud/dev/User")
|
|
|
- if(userCacheStr){
|
|
|
- let userData = JSON.parse(userCacheStr)
|
|
|
- // 设置用户信息
|
|
|
- this.id = userData?.objectId;
|
|
|
- this.sessionToken = userData?.sessionToken;
|
|
|
- this.data = userData; // 保存用户数据
|
|
|
+ // 调用父类构造函数,假设用户类在Parse中是"_User"
|
|
|
+ super("_User");
|
|
|
+
|
|
|
+ // 从本地存储中读取用户缓存信息
|
|
|
+ let userCacheStr = localStorage.getItem("NCloud/dev/User");
|
|
|
+
|
|
|
+ // 如果缓存中存在用户数据
|
|
|
+ if (userCacheStr) {
|
|
|
+ // 将缓存的字符串数据解析为JSON对象
|
|
|
+ let userData = JSON.parse(userCacheStr);
|
|
|
+
|
|
|
+ // 设置当前实例的id属性为用户数据中的objectId
|
|
|
+ this.id = userData?.objectId; // 使用可选链操作符安全访问objectId
|
|
|
+
|
|
|
+ // 设置当前实例的sessionToken属性为用户数据中的sessionToken
|
|
|
+ this.sessionToken = userData?.sessionToken; // 使用可选链操作符安全访问sessionToken
|
|
|
+
|
|
|
+ // 保存整个用户数据对象到当前实例的data属性中
|
|
|
+ this.data = userData; // 将用户数据保存到data属性中,以便后续使用
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
sessionToken:string|null = ""
|
|
|
/** 获取当前用户信息 */
|
|
|
async current() {
|
|
|
@@ -241,21 +607,21 @@ export class CloudUser extends CloudObject {
|
|
|
console.error("用户未登录");
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
- const response = await fetch(`https://dev.fmode.cn/parse/users/me`, {
|
|
|
- headers: {
|
|
|
- "x-parse-application-id": "dev",
|
|
|
- "x-parse-session-token": this.sessionToken // 使用sessionToken进行身份验证
|
|
|
- },
|
|
|
- method: "GET"
|
|
|
- });
|
|
|
-
|
|
|
- const result = await response?.json();
|
|
|
- if (result?.error) {
|
|
|
- console.error(result?.error);
|
|
|
- return null;
|
|
|
- }
|
|
|
- return result;
|
|
|
+ return this;
|
|
|
+ // const response = await fetch(`https://dev.fmode.cn/parse/users/me`, {
|
|
|
+ // headers: {
|
|
|
+ // "x-parse-application-id": "dev",
|
|
|
+ // "x-parse-session-token": this.sessionToken // 使用sessionToken进行身份验证
|
|
|
+ // },
|
|
|
+ // method: "GET"
|
|
|
+ // });
|
|
|
+
|
|
|
+ // const result = await response?.json();
|
|
|
+ // if (result?.error) {
|
|
|
+ // console.error(result?.error);
|
|
|
+ // return null;
|
|
|
+ // }
|
|
|
+ // return result;
|
|
|
}
|
|
|
|
|
|
/** 登录 */
|
|
|
@@ -300,18 +666,26 @@ export class CloudUser extends CloudObject {
|
|
|
method: "POST"
|
|
|
});
|
|
|
|
|
|
- const result = await response?.json();
|
|
|
+ let result = await response?.json();
|
|
|
+
|
|
|
if (result?.error) {
|
|
|
console.error(result?.error);
|
|
|
+ if(result?.error=="Invalid session token"){
|
|
|
+ this.clearUserCache()
|
|
|
+ return true;
|
|
|
+ }
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ this.clearUserCache()
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ clearUserCache(){
|
|
|
// 清除用户信息
|
|
|
localStorage.removeItem("NCloud/dev/User")
|
|
|
this.id = null;
|
|
|
this.sessionToken = null;
|
|
|
this.data = {};
|
|
|
- return true;
|
|
|
}
|
|
|
|
|
|
/** 注册 */
|
|
|
@@ -338,9 +712,81 @@ export class CloudUser extends CloudObject {
|
|
|
}
|
|
|
|
|
|
// 设置用户信息
|
|
|
+ // 缓存用户信息
|
|
|
+ console.log(result)
|
|
|
+ localStorage.setItem("NCloud/dev/User",JSON.stringify(result))
|
|
|
this.id = result?.objectId;
|
|
|
this.sessionToken = result?.sessionToken;
|
|
|
this.data = result; // 保存用户数据
|
|
|
return this;
|
|
|
}
|
|
|
+
|
|
|
+ override async save() {
|
|
|
+ let method = "POST";
|
|
|
+ let url = `https://dev.fmode.cn/parse/users`;
|
|
|
+
|
|
|
+ // 更新用户信息
|
|
|
+ if (this.id) {
|
|
|
+ url += `/${this.id}`;
|
|
|
+ method = "PUT";
|
|
|
+ }
|
|
|
+
|
|
|
+ let data:any = JSON.parse(JSON.stringify(this.data))
|
|
|
+ delete data.createdAt
|
|
|
+ delete data.updatedAt
|
|
|
+ delete data.ACL
|
|
|
+ delete data.objectId
|
|
|
+ const body = JSON.stringify(data);
|
|
|
+ let headersOptions:any = {
|
|
|
+ "content-type": "application/json;charset=UTF-8",
|
|
|
+ "x-parse-application-id": "dev",
|
|
|
+ "x-parse-session-token": this.sessionToken, // 添加sessionToken以进行身份验证
|
|
|
+ }
|
|
|
+ const response = await fetch(url, {
|
|
|
+ headers: headersOptions,
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ localStorage.setItem("NCloud/dev/User",JSON.stringify(this.data))
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+export class CloudApi{
|
|
|
+ async fetch(path:string,body:any,options?:{
|
|
|
+ method:string
|
|
|
+ body:any
|
|
|
+ }){
|
|
|
+
|
|
|
+ let reqOpts:any = {
|
|
|
+ headers: {
|
|
|
+ "x-parse-application-id": "dev",
|
|
|
+ "Content-Type": "application/json"
|
|
|
+ },
|
|
|
+ method: options?.method || "POST",
|
|
|
+ mode: "cors",
|
|
|
+ credentials: "omit"
|
|
|
+ }
|
|
|
+ if(body||options?.body){
|
|
|
+ reqOpts.body = JSON.stringify(body || options?.body);
|
|
|
+ reqOpts.json = true;
|
|
|
+ }
|
|
|
+ let host = `https://dev.fmode.cn`
|
|
|
+ // host = `http://127.0.0.1:1337`
|
|
|
+ let url = `${host}/api/`+path
|
|
|
+ console.log(url,reqOpts)
|
|
|
+ const response = await fetch(url,reqOpts);
|
|
|
+ let json = await response.json();
|
|
|
+ return json
|
|
|
+ }
|
|
|
}
|