Browse Source

feat:用户信息表seUser,CloudSeUser类

刘嘉轩 7 months ago
parent
commit
ebcbec3c49

+ 20 - 0
smarteat-app/deploy.ps1

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

+ 6 - 3
smarteat-app/src/app/tab1/tab1.page.ts

@@ -1,8 +1,7 @@
 import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
 import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
-import { IonicModule} from '@ionic/angular'; // 导入 IonicModule
 import { addIcons } from 'ionicons';
 import { addIcons } from 'ionicons';
-import { ExploreContainerComponent } from '../explore-container/explore-container.component';
 import { albumsOutline, documentOutline, leafOutline, scanOutline, storefrontOutline } from 'ionicons/icons';
 import { albumsOutline, documentOutline, leafOutline, scanOutline, storefrontOutline } from 'ionicons/icons';
+import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCol, IonContent, IonGrid, IonHeader, IonIcon, IonInput, IonRow, IonTextarea, IonTitle, IonToolbar } from '@ionic/angular/standalone';
 import { Router } from '@angular/router';
 import { Router } from '@angular/router';
 import { CommonModule } from '@angular/common';  // 导入 CommonModule
 import { CommonModule } from '@angular/common';  // 导入 CommonModule
 
 
@@ -12,7 +11,11 @@ import { CommonModule } from '@angular/common';  // 导入 CommonModule
   templateUrl: 'tab1.page.html',
   templateUrl: 'tab1.page.html',
   styleUrls: ['tab1.page.scss'],
   styleUrls: ['tab1.page.scss'],
   standalone: true, // 使用 standalone 组件
   standalone: true, // 使用 standalone 组件
-  imports: [IonicModule, ExploreContainerComponent,CommonModule],  // 通过 IonicModule 导入所有 Ionic 组件
+  imports: [ 
+    CommonModule,IonContent, IonHeader, IonTitle, IonToolbar, 
+    IonButton,IonTextarea,IonInput,IonCard,IonCardContent,IonGrid,IonRow,IonCol,IonIcon,
+    IonCardHeader,
+  ],  // 通过 IonicModule 导入所有 Ionic 组件
   schemas: [CUSTOM_ELEMENTS_SCHEMA], 
   schemas: [CUSTOM_ELEMENTS_SCHEMA], 
 })
 })
 export class Tab1Page {
 export class Tab1Page {

+ 3 - 71
smarteat-app/src/app/tab2/tab2.page.ts

@@ -1,74 +1,6 @@
-// import { Component } from '@angular/core';
-// import { IonicModule } from '@ionic/angular';  // 这里引入 IonicModule
-// import { ExploreContainerComponent } from '../explore-container/explore-container.component';
-// import { FmodeChatCompletion,MarkdownPreviewModule} from 'fmode-ng';
-
-// @Component({
-//   selector: 'app-tab2',
-//   templateUrl: 'tab2.page.html',
-//   styleUrls: ['tab2.page.scss'],
-//   standalone: true,
-//   imports: [
-//     ExploreContainerComponent,
-//     IonicModule, // 引入 IonicModule
-//     MarkdownPreviewModule,
-//   ],
-// })
-// export class Tab2Page {
-//   ngOnInit(){}
-//   constructor() {}
-
-//   // 用户输入提示词
-//   qunti: string = ""
-  
-//   quntiInput(ev: any) {
-//     this.qunti = ev.detail.value;
-//   }
-//   // 用户输入提示词
-//   jikou: string = ""
-  
-//   jikouInput(ev: any) {
-//     this.jikou = ev.detail.value;
-//   }
-//   // 用户输入提示词
-//   userPrompt: string = ""
-  
-//   promptInput(ev: any) {
-//     this.userPrompt = ev.detail.value;
-//   }
-  
-//   // 属性:组件内用于展示消息内容的变量
-//   responseMsg: any = ""
-//   // 方法:实例化completion对象,传入消息数组,并订阅生成的可观察对象。
-//   isComplete:boolean=false;
-//   sendMessage() {
-//     console.log("create")
-
-//     let PromptTemplate=`
-//     你是一名专业的饮食营养规划师,拥有丰富的营养学背景和实践经验。你的工作是为不同需求的人群提供个性化的饮食规划,帮助他们实现健康目标,如减肥、增肌、健康维护或疾病管理。
-//     你可以根据用户的需求为客户设计量身定制具体的饮食方案。
-//     当前来咨询的用户群体是${this.qunti},用户的饮食忌口是${this.jikou}需求是${this.userPrompt}`
-//     let completion = new FmodeChatCompletion([
-//       {role: "system", content: ""},
-//       {role: "user", content: this.userPrompt}
-//     ])
-//     completion.sendCompletion().subscribe((message: any) => {
-//       // 打印消息体
-//       console.log(message.content)
-//       // 赋值消息内容给组件内属性
-//       this.responseMsg = message.content
-//       if(message?.complete){
-//         this.isComplete=true
-//       }
-//     })
-//   }
-// }
-
-
 import { Component } from '@angular/core';
 import { Component } from '@angular/core';
-import { IonicModule } from '@ionic/angular';  // 这里引入 IonicModule
-import { ExploreContainerComponent } from '../explore-container/explore-container.component';
 import { FmodeChatCompletion, MarkdownPreviewModule } from 'fmode-ng';
 import { FmodeChatCompletion, MarkdownPreviewModule } from 'fmode-ng';
+import { IonButton, IonContent, IonHeader, IonInput, IonTextarea, IonTitle, IonToolbar } from '@ionic/angular/standalone';
 
 
 @Component({
 @Component({
   selector: 'app-tab2',
   selector: 'app-tab2',
@@ -76,8 +8,8 @@ import { FmodeChatCompletion, MarkdownPreviewModule } from 'fmode-ng';
   styleUrls: ['tab2.page.scss'],
   styleUrls: ['tab2.page.scss'],
   standalone: true,
   standalone: true,
   imports: [
   imports: [
-    ExploreContainerComponent,
-    IonicModule, // 引入 IonicModule
+    IonContent, IonHeader, IonTitle, IonToolbar, // 引入 IonicModule
+    IonButton,IonTextarea,IonInput,
     MarkdownPreviewModule,
     MarkdownPreviewModule,
   ],
   ],
 })
 })

+ 3 - 1
smarteat-app/src/app/tab3/tab3.page.html

@@ -13,7 +13,9 @@
     </ion-avatar>
     </ion-avatar>
     <ion-label>
     <ion-label>
       <h2>{{ userData?.name}}</h2>
       <h2>{{ userData?.name}}</h2>
-      <p>您没有访问权限,请登录。</p>
+      @if(!currentUser?.id){
+        <p> 暂无信息,请登录。</p>
+      }
     </ion-label>
     </ion-label>
     <!-- 登录、注册、编辑和退出登录按钮 -->
     <!-- 登录、注册、编辑和退出登录按钮 -->
     <div class="user-actions" slot="end">
     <div class="user-actions" slot="end">

+ 41 - 7
smarteat-app/src/app/tab3/tab3.page.ts

@@ -1,40 +1,65 @@
 
 
 import { Component, OnInit } from '@angular/core';
 import { Component, OnInit } from '@angular/core';
-import { IonicModule, NavController } from '@ionic/angular';
+import { IonAvatar, IonCardTitle, IonItem, IonLabel, IonSearchbar, NavController } from '@ionic/angular/standalone';
 import { PageEditComponent } from '../page-edit/page-edit.component';
 import { PageEditComponent } from '../page-edit/page-edit.component';
 import { CloudUser } from 'src/lib/ncloud';
 import { CloudUser } from 'src/lib/ncloud';
+import { CloudSeUser } from 'src/lib/cloudSeuser';
 import { openUserLoginModal } from 'src/lib/user/modal-user-login/modal-user-login.component';
 import { openUserLoginModal } from 'src/lib/user/modal-user-login/modal-user-login.component';
 import { ModalController } from '@ionic/angular/standalone';
 import { ModalController } from '@ionic/angular/standalone';
+import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCol, IonContent, IonGrid, IonHeader, IonIcon, IonInput, IonRow, IonTextarea, IonTitle, IonToolbar } from '@ionic/angular/standalone';
+
+interface UserInfo {
+  name: string;
+  avatar: string;
+}
 
 
 @Component({
 @Component({
   selector: 'app-tab3',
   selector: 'app-tab3',
   templateUrl: './tab3.page.html',
   templateUrl: './tab3.page.html',
   styleUrls: ['./tab3.page.scss'],
   styleUrls: ['./tab3.page.scss'],
   standalone: true,
   standalone: true,
-  imports: [IonicModule],
+  imports: [
+    IonContent, IonHeader, IonTitle, IonToolbar, // 引入 IonicModule
+    IonButton,IonTextarea,IonInput,IonCard,IonCardContent,IonGrid,IonRow,IonCol,IonIcon,
+    IonCardHeader,IonItem,IonAvatar,IonSearchbar,IonLabel,IonCardTitle,
+  ],
 })
 })
 export class Tab3Page implements OnInit {
 export class Tab3Page implements OnInit {
 
 
   currentUser:CloudUser|undefined
   currentUser:CloudUser|undefined
   // 用户信息数据
   // 用户信息数据
   userData = {
   userData = {
-    name: '',  // 默认值,可以为空测试默认显示“游客”
+    name: '',  // 默认值
     avatar: 'assets/img/user-avatar.jpg'  // 默认头像路径
     avatar: 'assets/img/user-avatar.jpg'  // 默认头像路径
   };
   };
 
 
   constructor(private navCtrl: NavController, private modalCtrl: ModalController) {
   constructor(private navCtrl: NavController, private modalCtrl: ModalController) {
-    this.currentUser = new CloudUser();
+    this.currentUser=new CloudUser();
   }
   }
   
   
-  ngOnInit() {
+  async ngOnInit() {
     // 在这里可以加载用户信息(如果从API或服务中获取)
     // 在这里可以加载用户信息(如果从API或服务中获取)
+    await this.loadUserData();
   }
   }
 
 
+  async loadUserData() {
+    // 如果用户已经登录,获取当前用户的 seUser 信息
+    if (this.currentUser) {
+      const cloudSeUser = new CloudSeUser();
+      const userInfo = await cloudSeUser.getCurrentUserInfo();
+
+      if (userInfo) {
+        this.userData.name = userInfo.get('name') || '匿名用户';  // 如果没有名字,显示默认值
+        this.userData.avatar = userInfo.get('avatar') || 'assets/img/user-avatar.jpg';  // 如果没有头像,显示默认头像
+      }
+    }
+  }  
   async login(){
   async login(){
     // 弹出登录窗口
     // 弹出登录窗口
     let user = await openUserLoginModal(this.modalCtrl);
     let user = await openUserLoginModal(this.modalCtrl);
     if(user?.id){
     if(user?.id){
       this.currentUser = user
       this.currentUser = user
+      await this.loadUserData();// 登录后加载用户信息
     }
     }
   }
   }
 
 
@@ -47,7 +72,12 @@ export class Tab3Page implements OnInit {
   }
   }
 
 
   logout(){
   logout(){
-    this.currentUser?.logout();
+    if (this.currentUser) {
+      this.currentUser.logout();
+      this.currentUser = undefined;
+      // 清空用户数据
+      this.userData = { name: '', avatar: 'assets/img/user-avatar.jpg' };
+    }
   }
   }
   
   
   async goToEdit() {
   async goToEdit() {
@@ -65,7 +95,11 @@ export class Tab3Page implements OnInit {
 
 
     if (role === 'confirm') {
     if (role === 'confirm') {
       // 更新用户信息
       // 更新用户信息
-      this.userData = data;
+      this.userData = {
+        name: data.get('name') || '匿名用户',
+        avatar: data.get('avatar') || 'assets/img/user-avatar.jpg',
+      };
+      await this.loadUserData();  // 更新头像和用户名
     }
     }
   }
   }
 
 

+ 1 - 158
smarteat-app/src/lib/ncloud.ts

@@ -317,161 +317,4 @@ export class CloudUser extends CloudObject {
         this.data = result; // 保存用户数据
         this.data = result; // 保存用户数据
         return this;
         return this;
     }
     }
-}
-// import { CloudUser,CloudObject,CloudQuery } from './ncloud'; // 引入 CloudUser 类,用于获取当前用户
-
-export class CloudSeUser extends CloudObject {
-    constructor() {
-        super("seUser"); // 假设seUser类在Parse中是"seUser"
-    }
-
-    // 获取单个用户信息
-    async getUser(id: string) {
-        const url = `http://dev.fmode.cn:1337/parse/classes/seUser/${id}?`;
-
-        const response = await fetch(url, {
-            headers: {
-                "x-parse-application-id": "dev"
-            },
-            method: "GET",
-            mode: "cors",
-            credentials: "omit"
-        });
-
-        const result = await response?.json();
-        if (result?.error) {
-            console.error(result?.error);
-            return null;
-        }
-
-        let userObject = this.dataToObj(result);
-        return userObject;
-    }
-
-    // 获取当前登录用户的 `seUser` 信息
-    async getCurrentUserInfo() {
-        const cloudUser = new CloudUser();
-        const currentUser = await cloudUser.current();
-        
-        if (!currentUser) {
-            console.error("用户未登录");
-            return null;
-        }
-
-        const currentUserId = currentUser.objectId;
-
-        // 通过 _User 的 objectId 查询 seUser 表中的记录
-        const query = new CloudQuery("seUser");
-        query.equalTo("user", { "__type": "Pointer", "className": "_User", "objectId": currentUserId });
-
-        const seUser = await query.first();
-        return seUser;
-    }
-
-    // 添加新的用户信息
-    async createUserInfo(additionalData: Record<string, any>) {
-        const cloudUser = new CloudUser();
-        const currentUser = await cloudUser.current();
-        
-        if (!currentUser) {
-            console.error("用户未登录");
-            return null;
-        }
-
-        const userPointer = { "__type": "Pointer", "className": "_User", "objectId": currentUser.objectId };
-
-        const newUserInfo = {
-            ...additionalData,
-            user: userPointer // 将当前用户作为外键关联到 seUser 表
-        };
-
-        const url = `http://dev.fmode.cn:1337/parse/classes/seUser`;
-
-        const response = await fetch(url, {
-            headers: {
-                "Content-Type": "application/json",
-                "x-parse-application-id": "dev"
-            },
-            method: "POST",
-            body: JSON.stringify(newUserInfo),
-            mode: "cors",
-            credentials: "omit"
-        });
-
-        const result = await response?.json();
-        if (result?.error) {
-            console.error(result?.error);
-            return null;
-        }
-
-        let newSeUser = this.dataToObj(result);
-        return newSeUser;
-    }
-
-    // 更新当前用户的信息
-    async updateUserInfo(updatedData: Record<string, any>) {
-        const cloudUser = new CloudUser();
-        const currentUser = await cloudUser.current();
-
-        if (!currentUser) {
-            console.error("用户未登录");
-            return null;
-        }
-
-        const currentUserId = currentUser.objectId;
-
-        // 查找当前用户的 seUser 信息
-        const query = new CloudQuery("seUser");
-        query.equalTo("user", { "__type": "Pointer", "className": "_User", "objectId": currentUserId });
-
-        const seUser = await query.first();
-        if (!seUser) {
-            console.error("未找到用户信息");
-            return null;
-        }
-
-        // 更新信息
-        seUser.set(updatedData);
-        await seUser.save();
-
-        return seUser;
-    }
-
-    // 删除当前用户的 seUser 信息
-    async deleteUserInfo() {
-        const cloudUser = new CloudUser();
-        const currentUser = await cloudUser.current();
-
-        if (!currentUser) {
-            console.error("用户未登录");
-            return false;
-        }
-
-        const currentUserId = currentUser.objectId;
-
-        // 查找当前用户的 seUser 信息
-        const query = new CloudQuery("seUser");
-        query.equalTo("user", { "__type": "Pointer", "className": "_User", "objectId": currentUserId });
-
-        const seUser = await query.first();
-        if (!seUser) {
-            console.error("未找到用户信息");
-            return false;
-        }
-
-        // 删除 seUser 记录
-        await seUser.destroy();
-
-        return true;
-    }
-
-    // 将查询结果转换为 CloudObject
-    dataToObj(result: any): CloudObject {
-        let userObject = new CloudObject(this.className);
-        userObject.set(result);
-        userObject.id = result.objectId;
-        userObject.createdAt = result.createdAt;
-        userObject.updatedAt = result.updatedAt;
-        return userObject;
-    }
-}
+}