Browse Source

Merge branch 'master' of http://git.fmode.cn:3000/13576288855/202226701011

sqj 2 months ago
parent
commit
dd52c7d756

+ 20 - 0
FitMind-app/deploy.ps1

@@ -0,0 +1,20 @@
+# 打包项目,携带应用前缀(index.html中相对路径将自动修复为/dev/jxnu/<学号>前缀)
+# /dev/ 项目测试版上传路径
+# /dev/jxnu/<学号> nova-crm项目预留路径
+set NODE_OPTIONS=–max_old_space_size=16000
+node ./node_modules/@angular/cli/bin/ng build --base-href="/dev/jxnu/202226701011/"
+
+# 清空旧文件目录
+obsutil rm obs://nova-cloud/dev/jxnu/202226701011 -r -f -i=XSUWJSVMZNHLWFAINRZ1 -k=P4TyfwfDovVNqz08tI1IXoLWXyEOSTKJRVlsGcV6 -e="obs.cn-south-1.myhuaweicloud.com"
+
+# 同步文件目录
+obsutil sync ./www obs://nova-cloud/dev/jxnu/202226701011  -i=XSUWJSVMZNHLWFAINRZ1 -k=P4TyfwfDovVNqz08tI1IXoLWXyEOSTKJRVlsGcV6 -e="obs.cn-south-1.myhuaweicloud.com" -acl=public-read
+
+
+# 授权公开可读
+obsutil chattri obs://nova-cloud/dev/jxnu/202226701011 -r -f -i=XSUWJSVMZNHLWFAINRZ1 -k=P4TyfwfDovVNqz08tI1IXoLWXyEOSTKJRVlsGcV6 -e="obs.cn-south-1.myhuaweicloud.com" -acl=public-read
+
+# 列举对象
+obsutil ls obs://nova-cloud/dev/jxnu/202226701011  -i=XSUWJSVMZNHLWFAINRZ1 -k=P4TyfwfDovVNqz08tI1IXoLWXyEOSTKJRVlsGcV6 -e="obs.cn-south-1.myhuaweicloud.com"
+
+

+ 10 - 6
FitMind-app/src/app/tab1/tab1.page.ts

@@ -1,8 +1,9 @@
 import { Component, CUSTOM_ELEMENTS_SCHEMA, OnInit } from '@angular/core';
 import { FormsModule } from '@angular/forms';
-import { IonicModule, AlertController } from '@ionic/angular';
 import { CommonModule } from '@angular/common';
 import { Router } from '@angular/router';
+import { AlertController, IonSegment, IonCard, IonCardTitle, IonCardSubtitle, IonButton, IonGrid, IonRow, IonToolbar, IonTitle } from '@ionic/angular/standalone';
+import { IonSegmentButton, IonCardHeader, IonCardContent, IonCol, IonIcon, IonChip, IonHeader, IonContent } from '@ionic/angular/standalone';
 
 @Component({
   selector: 'app-tab1',
@@ -10,9 +11,12 @@ import { Router } from '@angular/router';
   templateUrl: 'tab1.page.html',
   styleUrls: ['tab1.page.scss'],
   imports: [
-    IonicModule,
     CommonModule,
-    FormsModule
+    FormsModule,
+    IonSegment,IonSegmentButton,IonCard,IonCardHeader,
+    IonCardTitle,IonCardSubtitle,IonCardContent,IonButton,
+    IonGrid,IonRow,IonCol,IonIcon,IonChip,
+    IonHeader,IonContent,IonToolbar,IonTitle
   ],
   schemas: [CUSTOM_ELEMENTS_SCHEMA]
 })
@@ -99,7 +103,7 @@ export class Tab1Page implements OnInit {
         },
         {
           text: '确认',
-          handler: (data) => {
+          handler: (data:any) => {
             console.log('地址:', data.address);
             console.log('手机号:', data.phone);
             this.showAlert('购买成功', '您的订单已提交!');
@@ -133,7 +137,7 @@ export class Tab1Page implements OnInit {
         },
         {
           text: '确认',
-          handler: (data) => {
+          handler: (data:any) => {
             console.log('姓名:', data.name);
             console.log('手机号:', data.phone);
             this.showAlert('报名成功', '您已成功报名活动!');
@@ -167,7 +171,7 @@ export class Tab1Page implements OnInit {
         },
         {
           text: '确认',
-          handler: (data) => {
+          handler: (data:any) => {
             console.log('上课时间:', data.classTime);
             console.log('手机号:', data.phone);
             this.showAlert('报名成功', '您已成功报名课程!');

+ 60 - 0
FitMind-app/src/lib/data.ts

@@ -0,0 +1,60 @@
+fetch("http://dev.fmode.cn:1337/parse/classes/_User?", {
+    "headers": {
+      "accept": "*/*",
+      "accept-language": "zh-CN,zh;q=0.9",
+      "x-parse-application-id": "dev"
+    },
+    "referrer": "http://127.0.0.1:4040/",
+    "referrerPolicy": "strict-origin-when-cross-origin",
+    "body": null,
+    "method": "GET",
+    "mode": "cors",
+    "credentials": "omit"
+  });
+
+
+  fetch("http://dev.fmode.cn:1337/parse/classes/_User", {
+    "headers": {
+      "accept": "*/*",
+      "accept-language": "zh-CN,zh;q=0.9",
+      "content-type": "text/plain;charset=UTF-8",
+      "x-parse-application-id": "dev"
+    },
+    "referrer": "http://127.0.0.1:4040/",
+    "referrerPolicy": "strict-origin-when-cross-origin",
+    "body": "",
+    "method": "POST",
+    "mode": "cors",
+    "credentials": "omit"
+  });
+
+
+  fetch("http://dev.fmode.cn:1337/parse/classes/_User", {
+    "headers": {
+      "accept": "*/*",
+      "accept-language": "zh-CN,zh;q=0.9",
+      "content-type": "text/plain;charset=UTF-8",
+      "x-parse-application-id": "dev"
+    },
+    "referrer": "http://127.0.0.1:4040/",
+    "referrerPolicy": "strict-origin-when-cross-origin",
+    "body": "",
+    "method": "PUT",
+    "mode": "cors",
+    "credentials": "omit"
+  });
+
+
+  fetch("http://dev.fmode.cn:1337/parse/classes/_User", {
+    "headers": {
+      "accept": "*/*",
+      "accept-language": "zh-CN,zh;q=0.9",
+      "x-parse-application-id": "dev"
+    },
+    "referrer": "http://127.0.0.1:4040/",
+    "referrerPolicy": "strict-origin-when-cross-origin",
+    "body": null,
+    "method": "DELETE",
+    "mode": "cors",
+    "credentials": "omit"
+  });

+ 106 - 94
FitMind-app/src/lib/ncloud.ts

@@ -1,9 +1,8 @@
-// CloudObject.ts
 export class CloudObject {
     id: string | null = null;
     className: string;
-    createdAt:any;
-    updatedAt:any;
+    createdAt: any;
+    updatedAt: any;
     data: Record<string, any> = {};
 
     constructor(className: string) {
@@ -27,9 +26,10 @@ export class CloudObject {
         return this.data[key] || null;
     }
 
+    // 修改 save 方法:根据新的接口 URL
     async save(): Promise<this> {
         let method = "POST";
-        let url = `http://1.94.237.145:1339/parse/classes/${this.className}`;
+        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}`;
         
         // 更新
         if (this.id) {
@@ -41,9 +41,9 @@ export class CloudObject {
         const response = await fetch(url, {
             headers: {
                 "accept": "*/*",
-                "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
+                "accept-language": "zh-CN,zh;q=0.9",
                 "content-type": "text/plain;charset=UTF-8",
-                "x-parse-application-id": "ylj",
+                "x-parse-application-id": "dev",
                 "Referer": "http://127.0.0.1:4040/",
                 "Referrer-Policy": "strict-origin-when-cross-origin"
             },
@@ -63,14 +63,15 @@ export class CloudObject {
         return this;
     }
 
+    // 修改 destroy 方法:根据新的接口 URL
     async destroy(): Promise<boolean> {
         if (!this.id) return false;
         
-        const response = await fetch(`http://1.94.237.145:1339/parse/classes/${this.className}/${this.id}`, {
+        const response = await fetch(`http://dev.fmode.cn:1337/parse/classes/${this.className}/${this.id}`, {
             headers: {
                 "accept": "*/*",
-                "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
-                "x-parse-application-id": "ylj",
+                "accept-language": "zh-CN,zh;q=0.9",
+                "x-parse-application-id": "dev",
                 "Referer": "http://127.0.0.1:4040/",
                 "Referrer-Policy": "strict-origin-when-cross-origin"
             },
@@ -88,7 +89,7 @@ export class CloudObject {
     }
 }
 
-// CloudQuery.ts
+
 export class CloudQuery {
     className: string;
     whereOptions: Record<string, any> = {};
@@ -121,14 +122,14 @@ export class CloudQuery {
         this.whereOptions[key] = value;
     }
 
+    // 修改 get 方法:根据新的接口 URL
     async get(id: string): Promise<Record<string, any>> {
-        const url = `http://1.94.237.145.1339/parse/classes/${this.className}/${id}?`;
+        const url = `http://dev.fmode.cn:1337/parse/classes/${this.className}/${id}?`;
         const response = await fetch(url, {
             headers: {
                 "accept": "*/*",
-                "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
-                "if-none-match": "W/\"127-p6+dUp7xlGAxzyvVsfuvVhMxjPo\"",
-                "x-parse-application-id": "ylj",
+                "accept-language": "zh-CN,zh;q=0.9",
+                "x-parse-application-id": "dev",
                 "Referer": "http://127.0.0.1:4040/",
                 "Referrer-Policy": "strict-origin-when-cross-origin"
             },
@@ -141,8 +142,9 @@ export class CloudQuery {
         return json || {};
     }
 
+    // 修改 find 方法:根据新的接口 URL
     async find(): Promise<CloudObject[]> {
-        let url = `http://1.94.237.145:1339/parse/classes/${this.className}?`;
+        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
 
         if (Object.keys(this.whereOptions).length) {
             const whereStr = JSON.stringify(this.whereOptions);
@@ -152,9 +154,8 @@ export class CloudQuery {
         const response = await fetch(url, {
             headers: {
                 "accept": "*/*",
-                "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
-                "if-none-match": "W/\"127-p6+dUp7xlGAxzyvVsfuvVhMxjPo\"",
-                "x-parse-application-id": "ylj",
+                "accept-language": "zh-CN,zh;q=0.9",
+                "x-parse-application-id": "dev",
                 "Referer": "http://127.0.0.1:4040/",
                 "Referrer-Policy": "strict-origin-when-cross-origin"
             },
@@ -163,15 +164,16 @@ export class CloudQuery {
             mode: "cors",
             credentials: "omit"
         });
-        
+
         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 || [];
     }
 
+    // 修改 first 方法:根据新的接口 URL
     async first(): Promise<CloudObject | null> {
-        let url = `http://1.94.237.145:1339/parse/classes/${this.className}?`;
+        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
 
         if (Object.keys(this.whereOptions).length) {
             const whereStr = JSON.stringify(this.whereOptions);
@@ -181,9 +183,8 @@ export class CloudQuery {
         const response = await fetch(url, {
             headers: {
                 "accept": "*/*",
-                "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
-                "if-none-match": "W/\"127-p6+dUp7xlGAxzyvVsfuvVhMxjPo\"",
-                "x-parse-application-id": "ylj",
+                "accept-language": "zh-CN,zh;q=0.9",
+                "x-parse-application-id": "dev",
                 "Referer": "http://127.0.0.1:4040/",
                 "Referrer-Policy": "strict-origin-when-cross-origin"
             },
@@ -202,44 +203,49 @@ export class CloudQuery {
         return null;
     }
 
-    dataToObj(exists:any):CloudObject{
+    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;
-        }
+        existsObject.set(exists);
+        existsObject.id = exists.objectId;
+        existsObject.createdAt = exists.createdAt;
+        existsObject.updatedAt = exists.updatedAt;
+        return existsObject;
     }
-// CloudUser.ts
+}
+
+
 export class CloudUser extends CloudObject {
+    sessionToken: string | null = "";
+
     constructor() {
-        super("_User"); // 假设用户类在Parse中是"_User"
-        // 读取用户缓存信息
-        let userCacheStr = localStorage.getItem("NCloud/ylj/User")
-        if(userCacheStr){
-            let userData = JSON.parse(userCacheStr)
-            // 设置用户信息
+        super("_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; // 保存用户数据
+            this.data = userData;
         }
     }
 
-    sessionToken:string|null = ""
-    /** 获取当前用户信息 */
+    // 获取当前用户信息
     async current() {
         if (!this.sessionToken) {
             console.error("用户未登录");
             return null;
         }
         return this;
-        /*const response = await fetch(`http://1.94.237.145:1337/parse/users/me`, {
+    }
+
+    // 登录
+    async login(username: string, password: string): Promise<CloudUser | null> {
+        const response = await fetch(`http://dev.fmode.cn:1337/parse/login`, {
             headers: {
-                "x-parse-application-id": "hcx",
-                "x-parse-session-token": this.sessionToken // 使用sessionToken进行身份验证
+                "x-parse-application-id": "dev",
+                "Content-Type": "application/json"
             },
-            method: "GET"
+            body: JSON.stringify({ username, password }),
+            method: "POST"
         });
 
         const result = await response?.json();
@@ -247,17 +253,25 @@ export class CloudUser extends CloudObject {
             console.error(result?.error);
             return null;
         }
-        return result;*/
+        // 登录成功后保存用户信息和 sessionToken
+        this.id = result?.objectId;
+        this.sessionToken = result?.sessionToken;
+        this.data = result;
+        
+        // 将用户信息保存到 localStorage 方便下次访问
+        localStorage.setItem("NCloud/dev/User", JSON.stringify(result));
+        
+        return this;
     }
 
-    /** 登录 */
-    async login(username: string, password: string):Promise<CloudUser|null> {
-        const response = await fetch(`http://1.94.237.145:1339/parse/login`, {
+    // 注册
+    async signUp(username: string, password: string, email: string): Promise<CloudUser | null> {
+        const response = await fetch(`http://dev.fmode.cn:1337/parse/users`, {
             headers: {
-                "x-parse-application-id": "ylj",
+                "x-parse-application-id": "dev",
                 "Content-Type": "application/json"
             },
-            body: JSON.stringify({ username, password }),
+            body: JSON.stringify({ username, password, email }),
             method: "POST"
         });
 
@@ -266,30 +280,34 @@ export class CloudUser extends CloudObject {
             console.error(result?.error);
             return null;
         }
-        
-        // 设置用户信息
-        this.id = result?.objectId;
-        this.sessionToken = result?.sessionToken;
-        this.data = result; // 保存用户数据
-        // 缓存用户信息
-        console.log(result)
-        localStorage.setItem("NCloud/ylj/User",JSON.stringify(result))
-        return this;
+        // 注册成功后自动登录
+        return await this.login(username, password);
     }
 
-    /** 登出 */
-    async logout() {
+    // 注销
+    async logOut(): Promise<void> {
+        // 删除用户信息和 sessionToken
+        localStorage.removeItem("NCloud/dev/User");
+        this.id = null;
+        this.sessionToken = null;
+        this.data = {};
+    }
+
+    // 修改密码
+    async changePassword(newPassword: string): Promise<boolean> {
         if (!this.sessionToken) {
             console.error("用户未登录");
-            return;
+            return false;
         }
 
-        const response = await fetch(`http://1.94.237.145:1339/parse/logout`, {
+        const response = await fetch(`http://dev.fmode.cn:1337/parse/users/${this.id}`, {
             headers: {
-                "x-parse-application-id": "ylj",
-                "x-parse-session-token": this.sessionToken
+                "x-parse-application-id": "dev",
+                "x-parse-session-token": this.sessionToken!,
+                "Content-Type": "application/json"
             },
-            method: "POST"
+            body: JSON.stringify({ password: newPassword }),
+            method: "PUT"
         });
 
         const result = await response?.json();
@@ -298,44 +316,38 @@ export class CloudUser extends CloudObject {
             return false;
         }
 
-        // 清除用户信息
-        localStorage.removeItem("NCloud/ylj/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 // 合并额外的用户数据
-        };
+    // 修改用户信息
+    async updateUserInfo(newData: Record<string, any>): Promise<boolean> {
+        if (!this.sessionToken) {
+            console.error("用户未登录");
+            return false;
+        }
 
-        const response = await fetch(`http://1.94.237.145:1339/parse/users`, {
+        const response = await fetch(`http://dev.fmode.cn:1337/parse/users/${this.id}`, {
             headers: {
-                "x-parse-application-id": "ylj",
+                "x-parse-application-id": "dev",
+                "x-parse-session-token": this.sessionToken!,
                 "Content-Type": "application/json"
             },
-            body: JSON.stringify(userData),
-            method: "POST"
+            body: JSON.stringify(newData),
+            method: "PUT"
         });
 
         const result = await response?.json();
         if (result?.error) {
             console.error(result?.error);
-            return null;
+            return false;
         }
 
-        // 设置用户信息
-        // 缓存用户信息
-        console.log(result)
-        localStorage.setItem("NCloud/ylj/User",JSON.stringify(result))
-        this.id = result?.objectId;
-        this.sessionToken = result?.sessionToken;
-        this.data = result; // 保存用户数据
-        return this;
+        // 更新本地缓存
+        this.data = { ...this.data, ...newData };
+        localStorage.setItem("NCloud/dev/User", JSON.stringify(this.data));
+
+        return true;
     }
-}
+}
+
+           

+ 1 - 1
FitMind-app/src/main.ts

@@ -17,7 +17,7 @@ Parse.serverURL = "https://server.fmode.cn/parse";
 localStorage.setItem("NOVA_APIG_SERVER", 'aHR0cHMlM0ElMkYlMkZzZXJ2ZXIuZm1vZGUuY24lMkZhcGklMkZhcGlnJTJG')
 
 // 注意:替换Token 根据Token设置Parse服务帐套权限
-Parse.User.become("r:E4KpGvTEto-135762888551732186124" )
+Parse.User.become("r:E4KpGvTEto-188799891171734916266" )
 bootstrapApplication(AppComponent, {
   providers: [
     { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },