ncloud.ts 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. export class CloudObject {
  2. id: string | null = null;
  3. className: string;
  4. createdAt: any;
  5. updatedAt: any;
  6. data: Record<string, any> = {};
  7. constructor(className: string) {
  8. this.className = className;
  9. }
  10. toPointer() {
  11. return { "__type": "Pointer", "className": this.className, "objectId": this.id };
  12. }
  13. set(json: Record<string, any>) {
  14. Object.keys(json).forEach(key => {
  15. if (["objectId", "id", "createdAt", "updatedAt", "ACL"].includes(key)) {
  16. return;
  17. }
  18. this.data[key] = json[key];
  19. });
  20. }
  21. get(key: string) {
  22. return this.data[key] || null;
  23. }
  24. // 修改 save 方法:根据新的接口 URL
  25. async save(): Promise<this> {
  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. "accept": "*/*",
  37. "accept-language": "zh-CN,zh;q=0.9",
  38. "content-type": "text/plain;charset=UTF-8",
  39. "x-parse-application-id": "dev",
  40. "Referer": "http://127.0.0.1:4040/",
  41. "Referrer-Policy": "strict-origin-when-cross-origin"
  42. },
  43. body: body,
  44. method: method,
  45. mode: "cors",
  46. credentials: "omit"
  47. });
  48. const result = await response?.json();
  49. if (result?.error) {
  50. console.error(result.error);
  51. }
  52. if (result?.objectId) {
  53. this.id = result.objectId;
  54. }
  55. return this;
  56. }
  57. // 修改 destroy 方法:根据新的接口 URL
  58. async destroy(): Promise<boolean> {
  59. if (!this.id) return false;
  60. const response = await fetch(`http://dev.fmode.cn:1337/parse/classes/${this.className}/${this.id}`, {
  61. headers: {
  62. "accept": "*/*",
  63. "accept-language": "zh-CN,zh;q=0.9",
  64. "x-parse-application-id": "dev",
  65. "Referer": "http://127.0.0.1:4040/",
  66. "Referrer-Policy": "strict-origin-when-cross-origin"
  67. },
  68. body: null,
  69. method: "DELETE",
  70. mode: "cors",
  71. credentials: "omit"
  72. });
  73. const result = await response?.json();
  74. if (result) {
  75. this.id = null;
  76. }
  77. return true;
  78. }
  79. }
  80. export class CloudQuery {
  81. className: string;
  82. whereOptions: Record<string, any> = {};
  83. constructor(className: string) {
  84. this.className = className;
  85. }
  86. greaterThan(key: string, value: any) {
  87. if (!this.whereOptions[key]) this.whereOptions[key] = {};
  88. this.whereOptions[key]["$gt"] = value;
  89. }
  90. greaterThanAndEqualTo(key: string, value: any) {
  91. if (!this.whereOptions[key]) this.whereOptions[key] = {};
  92. this.whereOptions[key]["$gte"] = value;
  93. }
  94. lessThan(key: string, value: any) {
  95. if (!this.whereOptions[key]) this.whereOptions[key] = {};
  96. this.whereOptions[key]["$lt"] = value;
  97. }
  98. lessThanAndEqualTo(key: string, value: any) {
  99. if (!this.whereOptions[key]) this.whereOptions[key] = {};
  100. this.whereOptions[key]["$lte"] = value;
  101. }
  102. equalTo(key: string, value: any) {
  103. this.whereOptions[key] = value;
  104. }
  105. // 修改 get 方法:根据新的接口 URL
  106. async get(id: string): Promise<Record<string, any>> {
  107. const url = `http://dev.fmode.cn:1337/parse/classes/${this.className}/${id}?`;
  108. const response = await fetch(url, {
  109. headers: {
  110. "accept": "*/*",
  111. "accept-language": "zh-CN,zh;q=0.9",
  112. "x-parse-application-id": "dev",
  113. "Referer": "http://127.0.0.1:4040/",
  114. "Referrer-Policy": "strict-origin-when-cross-origin"
  115. },
  116. body: null,
  117. method: "GET",
  118. mode: "cors",
  119. credentials: "omit"
  120. });
  121. const json = await response?.json();
  122. return json || {};
  123. }
  124. // 修改 find 方法:根据新的接口 URL
  125. async find(): Promise<CloudObject[]> {
  126. let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
  127. if (Object.keys(this.whereOptions).length) {
  128. const whereStr = JSON.stringify(this.whereOptions);
  129. url += `where=${whereStr}`;
  130. }
  131. const response = await fetch(url, {
  132. headers: {
  133. "accept": "*/*",
  134. "accept-language": "zh-CN,zh;q=0.9",
  135. "x-parse-application-id": "dev",
  136. "Referer": "http://127.0.0.1:4040/",
  137. "Referrer-Policy": "strict-origin-when-cross-origin"
  138. },
  139. body: null,
  140. method: "GET",
  141. mode: "cors",
  142. credentials: "omit"
  143. });
  144. const json = await response?.json();
  145. let list = json?.results || [];
  146. let objList = list.map((item: any) => this.dataToObj(item));
  147. return objList || [];
  148. }
  149. // 修改 first 方法:根据新的接口 URL
  150. async first(): Promise<CloudObject | null> {
  151. let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
  152. if (Object.keys(this.whereOptions).length) {
  153. const whereStr = JSON.stringify(this.whereOptions);
  154. url += `where=${whereStr}`;
  155. }
  156. const response = await fetch(url, {
  157. headers: {
  158. "accept": "*/*",
  159. "accept-language": "zh-CN,zh;q=0.9",
  160. "x-parse-application-id": "dev",
  161. "Referer": "http://127.0.0.1:4040/",
  162. "Referrer-Policy": "strict-origin-when-cross-origin"
  163. },
  164. body: null,
  165. method: "GET",
  166. mode: "cors",
  167. credentials: "omit"
  168. });
  169. const json = await response?.json();
  170. const exists = json?.results?.[0] || null;
  171. if (exists) {
  172. let existsObject = this.dataToObj(exists);
  173. return existsObject;
  174. }
  175. return null;
  176. }
  177. dataToObj(exists: any): CloudObject {
  178. let existsObject = new CloudObject(this.className);
  179. existsObject.set(exists);
  180. existsObject.id = exists.objectId;
  181. existsObject.createdAt = exists.createdAt;
  182. existsObject.updatedAt = exists.updatedAt;
  183. return existsObject;
  184. }
  185. }
  186. export class CloudUser extends CloudObject {
  187. constructor() {
  188. super("_User"); // 假设用户类在Parse中是"_User"
  189. // 读取用户缓存信息
  190. let userCacheStr = localStorage.getItem("NCloud/dev/User")
  191. if(userCacheStr){
  192. let userData = JSON.parse(userCacheStr)
  193. // 设置用户信息
  194. this.id = userData?.objectId;
  195. this.sessionToken = userData?.sessionToken;
  196. this.data = userData; // 保存用户数据
  197. }
  198. }
  199. sessionToken:string|null = ""
  200. /** 获取当前用户信息 */
  201. async current() {
  202. if (!this.sessionToken) {
  203. console.error("用户未登录");
  204. return null;
  205. }
  206. const response = await fetch(`http://dev.fmode.cn:1337/parse/users/me`, {
  207. headers: {
  208. "x-parse-application-id": "dev",
  209. "x-parse-session-token": this.sessionToken // 使用sessionToken进行身份验证
  210. },
  211. method: "GET"
  212. });
  213. const result = await response?.json();
  214. if (result?.error) {
  215. console.error(result?.error);
  216. return null;
  217. }
  218. return result;
  219. }
  220. // 登录
  221. async login(username: string, password: string): Promise<CloudUser | null> {
  222. const response = await fetch(`http://dev.fmode.cn:1337/parse/login`, {
  223. headers: {
  224. "x-parse-application-id": "dev",
  225. "Content-Type": "application/json"
  226. },
  227. body: JSON.stringify({ username, password }),
  228. method: "POST"
  229. });
  230. const result = await response?.json();
  231. if (result?.error) {
  232. console.error(result?.error);
  233. return null;
  234. }
  235. // 设置用户信息
  236. this.id = result?.objectId;
  237. this.sessionToken = result?.sessionToken;
  238. this.data = result; // 保存用户数据
  239. // 缓存用户信息
  240. console.log(result)
  241. localStorage.setItem("NCloud/dev/User",JSON.stringify(result))
  242. return this;
  243. }
  244. // 登出
  245. async logOut(){
  246. if (!this.sessionToken) {
  247. console.error("用户未登录");
  248. return;
  249. }
  250. const response = await fetch(`http://dev.fmode.cn:1337/parse/logout`, {
  251. headers: {
  252. "x-parse-application-id": "dev",
  253. "x-parse-session-token": this.sessionToken
  254. },
  255. method: "POST"
  256. });
  257. const result = await response?.json();
  258. if (result?.error) {
  259. console.error(result?.error);
  260. return false;
  261. }
  262. // 清除用户信息
  263. localStorage.removeItem("NCloud/dev/User")
  264. this.id = null;
  265. this.sessionToken = null;
  266. this.data = {};
  267. return true;
  268. }
  269. // 注册
  270. async signUp(username: string, password: string, email: string): Promise<CloudUser | null> {
  271. const userData = {
  272. username,
  273. password,
  274. };
  275. const response = await fetch(`http://dev.fmode.cn:1337/parse/users`, {
  276. headers: {
  277. "x-parse-application-id": "dev",
  278. "Content-Type": "application/json"
  279. },
  280. body: JSON.stringify({ username, password, email }),
  281. method: "POST"
  282. });
  283. const result = await response?.json();
  284. if (result?.error) {
  285. console.error(result?.error);
  286. return null;
  287. }
  288. // 设置用户信息
  289. this.id = result?.objectId;
  290. this.sessionToken = result?.sessionToken;
  291. this.data = result; // 保存用户数据
  292. // 注册成功后自动登录
  293. return await this.login(username, password);
  294. }
  295. }
  296. //fearlessUser类封装
  297. // src/lib/fearlessUser.ts
  298. export class FearlessUser extends CloudObject {
  299. static getCurrentUser(): FearlessUser | undefined {
  300. throw new Error('Method not implemented.');
  301. }
  302. sessionToken: any;
  303. constructor() {
  304. super("FearlessUser"); // 假设 FearlessUser 类在 Parse 中是 "FearlessUser"
  305. }
  306. /** 获取单个用户信息 */
  307. async getUser(id: string) {
  308. const url = `http://dev.fmode.cn:1337/parse/classes/FearlessUser/${id}?`;
  309. const response = await fetch(url, {
  310. headers: {
  311. "x-parse-application-id": "dev"
  312. },
  313. method: "GET",
  314. mode: "cors",
  315. credentials: "omit"
  316. });
  317. const result = await response?.json();
  318. if (result?.error) {
  319. console.error(result?.error);
  320. return null;
  321. }
  322. return this.dataToObj(result);
  323. }
  324. /** 获取当前登录用户的 `FearlessUser` 信息 */
  325. async getCurrentUserInfo() {
  326. const cloudUser = new CloudUser();
  327. const currentUser = await cloudUser.current();
  328. if (!currentUser) {
  329. console.error("用户未登录");
  330. return null;
  331. }
  332. const currentUserId = currentUser.objectId;
  333. // 通过 _User 的 objectId 查询 FearlessUser 表中的记录
  334. const query = new CloudQuery("FearlessUser");
  335. query.equalTo("user", { "__type": "Pointer", "className": "_User", "objectId": currentUserId });
  336. const fearlessUser = await query.first();
  337. return fearlessUser;
  338. }
  339. /** 创建或保存用户信息 */
  340. async saveUserInfo(userData: Record<string, any>) {
  341. const cloudUser = new CloudUser();
  342. const currentUser = await cloudUser.current();
  343. if (!currentUser) {
  344. console.error("用户未登录");
  345. return null;
  346. }
  347. const userPointer = { "__type": "Pointer", "className": "_User", "objectId": currentUser.objectId };
  348. const newUserInfo = {
  349. ...userData,
  350. user: userPointer // 将当前用户作为外键关联到 FearlessUser 表
  351. };
  352. const url = `http://dev.fmode.cn:1337/parse/classes/FearlessUser`;
  353. const response = await fetch(url, {
  354. headers: {
  355. "Content-Type": "application/json",
  356. "x-parse-application-id": "dev"
  357. },
  358. method: "POST",
  359. body: JSON.stringify(newUserInfo),
  360. mode: "cors",
  361. credentials: "omit"
  362. });
  363. const result = await response?.json();
  364. if (result?.error) {
  365. console.error(result?.error);
  366. return null;
  367. }
  368. return this.dataToObj(result);
  369. }
  370. /** 更新当前用户的信息 */
  371. async updateUserInfo(updatedData: Record<string, any>) {
  372. const cloudUser = new CloudUser();
  373. const currentUser = await cloudUser.current();
  374. if (!currentUser) {
  375. console.error("用户未登录");
  376. return null;
  377. }
  378. const currentUserId = currentUser.objectId;
  379. // 查找当前用户的 FearlessUser 信息
  380. const query = new CloudQuery("FearlessUser");
  381. query.equalTo("user", { "__type": "Pointer", "className": "_User", "objectId": currentUserId });
  382. const fearlessUser = await query.first();
  383. if (!fearlessUser) {
  384. console.error("未找到用户信息");
  385. return null;
  386. }
  387. // 更新信息
  388. fearlessUser.set(updatedData);
  389. await fearlessUser.save();
  390. return fearlessUser;
  391. }
  392. /** 删除当前用户的 FearlessUser 信息 */
  393. async deleteUserInfo() {
  394. const cloudUser = new CloudUser();
  395. const currentUser = await cloudUser.current();
  396. if (!currentUser) {
  397. console.error("用户未登录");
  398. return false;
  399. }
  400. const currentUserId = currentUser.objectId;
  401. // 查找当前用户的 FearlessUser 信息
  402. const query = new CloudQuery("FearlessUser");
  403. query.equalTo("user", { "__type": "Pointer", "className": "_User", "objectId": currentUserId });
  404. const fearlessUser = await query.first();
  405. if (!fearlessUser) {
  406. console.error("未找到用户信息");
  407. return false;
  408. }
  409. // 删除 FearlessUser 记录
  410. await fearlessUser.destroy();
  411. return true;
  412. }
  413. /** 将查询结果转换为 CloudObject */
  414. private dataToObj(result: any): CloudObject {
  415. let userObject = new CloudObject(this.className);
  416. userObject.set(result);
  417. userObject.id = result.objectId;
  418. userObject.createdAt = result.createdAt;
  419. userObject.updatedAt = result.updatedAt;
  420. return userObject;
  421. }
  422. async logOut() {
  423. if (!this.sessionToken) {
  424. console.error("用户未登录");
  425. return false;
  426. }
  427. const response = await fetch(`http://dev.fmode.cn:1337/parse/logout`, {
  428. headers: {
  429. "x-parse-application-id": "dev",
  430. "x-parse-session-token": this.sessionToken
  431. },
  432. method: "POST"
  433. });
  434. const result = await response?.json();
  435. if (result?.error) {
  436. console.error(result?.error);
  437. return false;
  438. }
  439. return true;
  440. }
  441. async login(username: string, password: string): Promise<FearlessUser | null> {
  442. const response = await fetch(`http://dev.fmode.cn:1337/parse/login`, {
  443. headers: {
  444. "x-parse-application-id": "dev",
  445. "Content-Type": "application/json"
  446. },
  447. body: JSON.stringify({ username, password }),
  448. method: "POST"
  449. });
  450. const result = await response?.json();
  451. if (result?.error) {
  452. console.error(result?.error);
  453. return null;
  454. }
  455. // 设置用户信息
  456. this.id = result?.objectId;
  457. this.sessionToken = result?.sessionToken;
  458. this.data = result; // 保存用户数据
  459. // 缓存用户信息
  460. console.log(result)
  461. localStorage.setItem("NCloud/dev/User",JSON.stringify(result))
  462. return this;
  463. }
  464. }