ncloud.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. //CloudObject.ts
  2. export class CloudObject {
  3. className: string;
  4. id: string | null = null;
  5. createdAt:any;
  6. updatedAt:any;
  7. data: Record<string, any> = {};
  8. constructor(className: string) {
  9. this.className = className;
  10. }
  11. toPointer() {
  12. return { "__type": "Pointer", "className": this.className, "objectId": this.id };
  13. }
  14. set(json: Record<string, any>) {
  15. Object.keys(json).forEach(key => {
  16. if (["objectId", "id", "createdAt", "updatedAt", "ACL"].indexOf(key) > -1) {
  17. return;
  18. }
  19. this.data[key] = json[key];
  20. });
  21. }
  22. get(key: string) {
  23. return this.data[key] || null;
  24. }
  25. async save() {
  26. let method = "POST";
  27. let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}`;
  28. // 更新
  29. if (this.id) {
  30. url += `/${this.id}`;
  31. method = "PUT";
  32. }
  33. const body = JSON.stringify(this.data);
  34. const response = await fetch(url, {
  35. headers: {
  36. "content-type": "application/json;charset=UTF-8",
  37. "x-parse-application-id": "dev"
  38. },
  39. body: body,
  40. method: method,
  41. mode: "cors",
  42. credentials: "omit"
  43. });
  44. const result = await response?.json();
  45. if (result?.error) {
  46. console.error(result?.error);
  47. }
  48. if (result?.objectId) {
  49. this.id = result?.objectId;
  50. }
  51. return this;
  52. }
  53. async destroy() {
  54. if (!this.id) return;
  55. const response = await fetch(`http://dev.fmode.cn:1337/parse/classes/${this.className}/${this.id}`, {
  56. headers: {
  57. "x-parse-application-id": "dev"
  58. },
  59. body: null,
  60. method: "DELETE",
  61. mode: "cors",
  62. credentials: "omit"
  63. });
  64. const result = await response?.json();
  65. if (result) {
  66. this.id = null;
  67. }
  68. return true;
  69. }
  70. }
  71. // CloudQuery.ts
  72. export class CloudQuery {
  73. className: string;
  74. whereOptions: Record<string, any> = {};
  75. constructor(className: string) {
  76. this.className = className;
  77. }
  78. greaterThan(key: string, value: any) {
  79. if (!this.whereOptions[key]) this.whereOptions[key] = {};
  80. this.whereOptions[key]["$gt"] = value;
  81. }
  82. greaterThanAndEqualTo(key: string, value: any) {
  83. if (!this.whereOptions[key]) this.whereOptions[key] = {};
  84. this.whereOptions[key]["$gte"] = value;
  85. }
  86. lessThan(key: string, value: any) {
  87. if (!this.whereOptions[key]) this.whereOptions[key] = {};
  88. this.whereOptions[key]["$lt"] = value;
  89. }
  90. lessThanAndEqualTo(key: string, value: any) {
  91. if (!this.whereOptions[key]) this.whereOptions[key] = {};
  92. this.whereOptions[key]["$lte"] = value;
  93. }
  94. equalTo(key: string, value: any) {
  95. this.whereOptions[key] = value;
  96. }
  97. async get(id: string) {
  98. const url = `http://dev.fmode.cn:1337/parse/classes/${this.className}/${id}?`;
  99. const response = await fetch(url, {
  100. headers: {
  101. "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
  102. "x-parse-application-id": "dev"
  103. },
  104. body: null,
  105. method: "GET",
  106. mode: "cors",
  107. credentials: "omit"
  108. });
  109. const json = await response?.json();
  110. return json || {};
  111. }
  112. async find() {
  113. let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
  114. if (Object.keys(this.whereOptions).length) {
  115. const whereStr = JSON.stringify(this.whereOptions);
  116. url += `where=${whereStr}`;
  117. }
  118. const response = await fetch(url, {
  119. headers: {
  120. "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
  121. "x-parse-application-id": "dev"
  122. },
  123. body: null,
  124. method: "GET",
  125. mode: "cors",
  126. credentials: "omit"
  127. });
  128. const json = await response?.json();
  129. let list = json?.results || []
  130. let objList = list.map((item:any)=>this.dataToObj(item))
  131. return objList || [];
  132. }
  133. async first() {
  134. let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
  135. if (Object.keys(this.whereOptions).length) {
  136. const whereStr = JSON.stringify(this.whereOptions);
  137. url += `where=${whereStr}`;
  138. }
  139. const response = await fetch(url, {
  140. headers: {
  141. "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
  142. "x-parse-application-id": "dev"
  143. },
  144. body: null,
  145. method: "GET",
  146. mode: "cors",
  147. credentials: "omit"
  148. });
  149. const json = await response?.json();
  150. const exists = json?.results?.[0] || null;
  151. if (exists) {
  152. let existsObject = this.dataToObj(exists)
  153. return existsObject;
  154. }
  155. return null
  156. }
  157. //使得页面上获得的数据是由CloudObject构成的
  158. dataToObj(exists:any):CloudObject{
  159. let existsObject = new CloudObject(this.className);
  160. existsObject.set(exists);
  161. existsObject.id = exists.objectId;
  162. existsObject.createdAt = exists.createdAt;
  163. existsObject.updatedAt = exists.updatedAt;
  164. return existsObject;
  165. }
  166. }
  167. // CloudUser.ts
  168. export class CloudUser extends CloudObject {
  169. sessionToken: string | null = ""; // 用户的 sessionToken,用于身份验证
  170. constructor() {
  171. super("_User"); // 调用父类构造函数,指定类名为 "User"
  172. // 读取用户缓存信息
  173. let userCacheStr = localStorage.getItem("NCloud/dev/User");
  174. if (userCacheStr) {
  175. let userData = JSON.parse(userCacheStr);
  176. // 设置用户信息
  177. this.id = userData?.objectId; // 设置用户 ID
  178. this.sessionToken = userData?.sessionToken; // 设置 sessionToken
  179. this.data = userData; // 保存用户数据
  180. }
  181. }
  182. /** 获取当前用户信息 */
  183. async current() {
  184. // 检查用户是否登录
  185. if (!this.sessionToken) {
  186. console.error("用户未登录");
  187. return null; // 如果未登录,返回 null
  188. }
  189. return this;
  190. // // 发送 GET 请求以获取当前用户信息
  191. // const response = await fetch(`http://dev.fmode.cn:1337/parse/users/me`, {
  192. // headers: {
  193. // "x-parse-application-id": "dev",
  194. // "x-parse-session-token": this.sessionToken // 使用 sessionToken 进行身份验证
  195. // },
  196. // method: "GET"
  197. // });
  198. // const result = await response?.json(); // 解析响应
  199. // if (result?.error) {
  200. // console.error(result?.error); // 处理错误
  201. // return null;
  202. // }
  203. // return result; // 返回用户信息
  204. }
  205. /** 登录 */
  206. async login(username: string, password: string): Promise<CloudUser | null> {
  207. // 发送 POST 请求以进行用户登录
  208. const response = await fetch(`http://dev.fmode.cn:1337/parse/login`, {
  209. headers: {
  210. "x-parse-application-id": "dev",
  211. "Content-Type": "application/json"
  212. },
  213. body: JSON.stringify({ username, password }), // 登录凭据
  214. method: "POST"
  215. });
  216. const result = await response?.json(); // 解析响应
  217. if (result?.error) {
  218. console.error(result?.error); // 处理错误
  219. return null;
  220. }
  221. // 设置用户信息
  222. this.id = result?.objectId; // 设置用户 ID
  223. this.sessionToken = result?.sessionToken; // 设置 sessionToken
  224. this.data = result; // 保存用户数据
  225. // 缓存用户信息到 localStorage
  226. console.log(result);
  227. localStorage.setItem("NCloud/dev/User", JSON.stringify(result));
  228. return this; // 返回当前用户实例
  229. }
  230. /** 登出 */
  231. async logout() {
  232. // 检查用户是否登录
  233. if (!this.sessionToken) {
  234. console.error("用户未登录");
  235. return;
  236. }
  237. // 发送 POST 请求以进行用户登出
  238. const response = await fetch(`http://dev.fmode.cn:1337/parse/logout`, {
  239. headers: {
  240. "x-parse-application-id": "dev",
  241. "x-parse-session-token": this.sessionToken // 使用 sessionToken 进行身份验证
  242. },
  243. method: "POST"
  244. });
  245. const result = await response?.json(); // 解析响应
  246. if (result?.error) {
  247. console.error(result?.error); // 处理错误
  248. return false; // 登出失败
  249. }
  250. // 清除用户信息
  251. localStorage.removeItem("NCloud/dev/User"); // 从 localStorage 中移除用户信息
  252. this.id = null; // 清除用户 ID
  253. this.sessionToken = null; // 清除 sessionToken
  254. this.data = {}; // 清空用户数据
  255. return true; // 登出成功
  256. }
  257. /** 注册 */
  258. async signUp(username: string, password: string, additionalData: Record<string, any> = {}) {
  259. // 构建用户数据
  260. const userData = {
  261. username,
  262. password,
  263. ...additionalData // 合并额外的用户数据
  264. };
  265. // 发送 POST 请求以进行用户注册
  266. const response = await fetch(`http://dev.fmode.cn:1337/parse/users`, {
  267. headers: {
  268. "x-parse-application-id": "dev",
  269. "Content-Type": "application/json"
  270. },
  271. body: JSON.stringify(userData), // 注册凭据
  272. method: "POST"
  273. });
  274. const result = await response?.json(); // 解析响应
  275. if (result?.error) {
  276. console.error(result?.error); // 处理错误
  277. return null; // 注册失败
  278. }
  279. // 设置用户信息
  280. this.id = result?.objectId; // 设置用户 ID
  281. this.sessionToken = result?.sessionToken; // 设置 sessionToken
  282. this.data = result; // 保存用户数据
  283. return this; // 返回当前用户实例
  284. }
  285. //覆盖save方法
  286. override async save() {
  287. let method = "POST";
  288. let url = `http://dev.fmode.cn:1337/parse/users`;
  289. // 更新用户信息
  290. if (this.id) {
  291. url += `/${this.id}`;
  292. method = "PUT";
  293. }
  294. let data:any = JSON.parse(JSON.stringify(this.data))
  295. delete data.createdAt
  296. delete data.updatedAt
  297. delete data.ACL
  298. delete data.objectId
  299. const body = JSON.stringify(data);
  300. let headersOptions:any = {
  301. "content-type": "application/json;charset=UTF-8",
  302. "x-parse-application-id": "dev",
  303. "x-parse-session-token": this.sessionToken, // 添加sessionToken以进行身份验证
  304. }
  305. const response = await fetch(url, {
  306. headers: headersOptions,
  307. body: body,
  308. method: method,
  309. mode: "cors",
  310. credentials: "omit"
  311. });
  312. const result = await response?.json();
  313. if (result?.error) {
  314. console.error(result?.error);
  315. }
  316. if (result?.objectId) {
  317. this.id = result?.objectId;
  318. }
  319. localStorage.setItem("NCloud/dev/User",JSON.stringify(this.data))
  320. return this;
  321. }
  322. }
  323. //CloudPost.ts
  324. export class CloudPost extends CloudObject {
  325. constructor() {
  326. super('FilmPost'); // 调用父类构造函数,指定类名
  327. }
  328. // 设置帖子数据,包括发布者信息
  329. setPostData(postData: Record<string, any>, userId: string|null) {
  330. this.set(postData); // 设置帖子内容
  331. this.data["author"] = { "__type": "Pointer", "className": "_User", "objectId": userId }; // 设置发布者信息
  332. }
  333. // 更新帖子数据
  334. async updatePost(postData: Record<string, any>) {
  335. this.set(postData); // 更新帖子内容
  336. return await this.save(); // 保存更新
  337. }
  338. // 删除帖子
  339. async deletePost() {
  340. return await this.destroy(); // 调用父类的 destroy 方法
  341. }
  342. }