|  | @@ -1,127 +1,131 @@
 | 
	
		
			
				|  |  |  import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
 | 
	
		
			
				|  |  |  import { IonButton, IonContent, IonFooter, IonHeader, IonInput, IonItem, IonTitle, IonToolbar, ModalController } from '@ionic/angular/standalone';
 | 
	
		
			
				|  |  | -import { ChatPanelOptions, FmodeChat, FmodeChatCompletion,FmodeChatMessage,MarkdownPreviewModule, openChatPanelModal  } from 'fmode-ng';
 | 
	
		
			
				|  |  | +import { ChatPanelOptions, FmodeChat, FmodeChatCompletion, FmodeChatMessage, MarkdownPreviewModule, openChatPanelModal } from 'fmode-ng';
 | 
	
		
			
				|  |  |  import { CommonModule } from '@angular/common';
 | 
	
		
			
				|  |  | -import { FormsModule,} from '@angular/forms'; // 导入 FormsModule
 | 
	
		
			
				|  |  | +import { FormsModule } from '@angular/forms'; // 导入 FormsModule
 | 
	
		
			
				|  |  |  import { Router } from '@angular/router';
 | 
	
		
			
				|  |  |  // 引用设计的对象类和查询类
 | 
	
		
			
				|  |  |  import { CloudObject, CloudQuery } from 'src/lib/ncloud';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  @Component({
 | 
	
		
			
				|  |  |    selector: 'app-page-ai-chat',
 | 
	
		
			
				|  |  |    templateUrl: './page-ai-chat.component.html',
 | 
	
		
			
				|  |  |    styleUrls: ['./page-ai-chat.component.scss'],
 | 
	
		
			
				|  |  |    standalone: true,
 | 
	
		
			
				|  |  | -  imports:[IonButton,IonHeader,IonToolbar,IonTitle,IonContent,IonFooter,IonInput,CommonModule,FormsModule,MarkdownPreviewModule,IonItem ]
 | 
	
		
			
				|  |  | +  imports: [IonButton, IonHeader, IonToolbar, IonTitle, IonContent, IonFooter, IonInput, CommonModule, FormsModule, MarkdownPreviewModule, IonItem]
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  | -export class PageAiChatComponent  implements OnInit {
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | -  constructor(private modalCtrl:ModalController,
 | 
	
		
			
				|  |  | -    private router:Router, private cdRef:ChangeDetectorRef) { }
 | 
	
		
			
				|  |  | +export class PageAiChatComponent implements OnInit {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  UserProfileList: Array<CloudObject> = []; // 存储用户信息
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // 当前用户头像的URL
 | 
	
		
			
				|  |  | +  currentUserAvatarUrl: string = '';
 | 
	
		
			
				|  |  | +  chatId!: string;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  constructor(private modalCtrl: ModalController,
 | 
	
		
			
				|  |  | +    private router: Router, private cdRef: ChangeDetectorRef) { }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  ngOnInit() {
 | 
	
		
			
				|  |  | +    // 生命周期:页面加载后,运行用户列表加载函数
 | 
	
		
			
				|  |  | +    this.loadUserProfileList();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    ngOnInit() {
 | 
	
		
			
				|  |  | -      // 生命周期:页面加载后,运行用户列表加载函数
 | 
	
		
			
				|  |  | -      this.loadUserProfileList()
 | 
	
		
			
				|  |  | +  // 查询并加载用户列表的函数
 | 
	
		
			
				|  |  | +  async loadUserProfileList() {
 | 
	
		
			
				|  |  | +    let query = new CloudQuery("UserProfile");
 | 
	
		
			
				|  |  | +    this.UserProfileList = await query.find();
 | 
	
		
			
				|  |  | +    console.log("UserProfileList", this.UserProfileList);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 假设用户的头像字段是 'avatar',你可以根据实际字段来修改
 | 
	
		
			
				|  |  | +    if (this.UserProfileList.length > 0) {
 | 
	
		
			
				|  |  | +      const user = this.UserProfileList[0]; // 假设你要使用第一个用户的头像
 | 
	
		
			
				|  |  | +      this.currentUserAvatarUrl = user.get('avatar'); // 提取头像 URL
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -  chatId:any= null;
 | 
	
		
			
				|  |  | -  //AI聊天
 | 
	
		
			
				|  |  | -openFashionChat(){
 | 
	
		
			
				|  |  | -  localStorage.setItem("company","E4KpGvTEto")
 | 
	
		
			
				|  |  | -  let consult = new CloudObject("AIChat")
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // AI聊天
 | 
	
		
			
				|  |  | +  openFashionChat() {
 | 
	
		
			
				|  |  | +    localStorage.setItem("company", "E4KpGvTEto");
 | 
	
		
			
				|  |  | +    let consult = new CloudObject("AIChat");
 | 
	
		
			
				|  |  |      let now = new Date();
 | 
	
		
			
				|  |  | -    let chatStr = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`
 | 
	
		
			
				|  |  | +    let chatStr = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`;
 | 
	
		
			
				|  |  |      consult.set({
 | 
	
		
			
				|  |  | -      title:`运动咨询记录${chatStr}}`,
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | -    })
 | 
	
		
			
				|  |  | -  let options:ChatPanelOptions = {
 | 
	
		
			
				|  |  | -    roleId:"2DXJkRsjXK",
 | 
	
		
			
				|  |  | -    onChatInit:(chat:FmodeChat)=>{
 | 
	
		
			
				|  |  | -      console.log("onChatInit");
 | 
	
		
			
				|  |  | -            console.log("预设角色",chat.role);
 | 
	
		
			
				|  |  | -            chat.role.set("name","Neon");
 | 
	
		
			
				|  |  | -            chat.role.set("title","运动教练");
 | 
	
		
			
				|  |  | -            chat.role.set("desc","一名亲切和蔼的运动教练,Neon,年龄24岁");
 | 
	
		
			
				|  |  | -            chat.role.set("tags",["运动","健康"]);
 | 
	
		
			
				|  |  | -            chat.role.set("avatar","https://nova-cloud.obs.cn-south-1.myhuaweicloud.com/storage/aigc/imagine/qz3QJnQqfb-0.png")
 | 
	
		
			
				|  |  | -            chat.role.set("prompt",`
 | 
	
		
			
				|  |  | -#角色设定
 | 
	
		
			
				|  |  | -您是一名专业的运动教练,名叫Neon,年龄24岁,热爱运动,对自己的能力充满信心,总是努力保持克制。与家人有着牢固而密切的联系。有强烈的服务意识。非常关心朋友。擅长根据用户的需求给出康复方案。您的风格亲切、活泼,自信旨在帮助用户找到最适合他们的康复方案。
 | 
	
		
			
				|  |  | +      title: `运动咨询记录${chatStr}`,
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let options: ChatPanelOptions = {
 | 
	
		
			
				|  |  | +      roleId: "2DXJkRsjXK",
 | 
	
		
			
				|  |  | +      onChatInit: (chat: FmodeChat) => {
 | 
	
		
			
				|  |  | +        console.log("onChatInit");
 | 
	
		
			
				|  |  | +        console.log("预设角色", chat.role);
 | 
	
		
			
				|  |  | +        chat.role.set("name", "Neon");
 | 
	
		
			
				|  |  | +        chat.role.set("title", "运动教练");
 | 
	
		
			
				|  |  | +        chat.role.set("desc", "一名亲切和蔼的运动教练,Neon,年龄24岁");
 | 
	
		
			
				|  |  | +        chat.role.set("tags", ["运动", "健康"]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 使用当前用户的头像
 | 
	
		
			
				|  |  | +        const avatarUrl = this.currentUserAvatarUrl || "https://nova-cloud.obs.cn-south-1.myhuaweicloud.com/storage/aigc/imagine/qz3QJnQqfb-0.png";
 | 
	
		
			
				|  |  | +        chat.role.set("avatar", avatarUrl); // 设置头像
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#对话环节
 | 
	
		
			
				|  |  | -0破冰,跟用户打招呼,并引导用户聊运动或健康的话题,可以慢慢引导,不要太突兀,比如:
 | 
	
		
			
				|  |  | -“今天的心情怎么样?”
 | 
	
		
			
				|  |  | -1拓展话题
 | 
	
		
			
				|  |  | -“你平时喜欢什么样的运动类型呢?有没有特别喜欢的运动项目比如篮球,跑步?”
 | 
	
		
			
				|  |  | -“你受伤了嘛,需要我给出一些建议吗,比如运动目标,运动频率或运动强度你会选择哪个呢?适当的建议可以减少运动造成的伤害”
 | 
	
		
			
				|  |  | -“你觉得在运动过程中,最让你困扰的是什么?是运动技巧还是运动强度呢?”
 | 
	
		
			
				|  |  | -“有没有什么运动是你一直想尝试但还没有机会的?我们可以一起聊聊!”
 | 
	
		
			
				|  |  | -2根据用户的详细描述给出康复方案,
 | 
	
		
			
				|  |  | -3引导收尾
 | 
	
		
			
				|  |  | -“今天聊得很开心呢!如果你还有其他问题或者想法,随时可以告诉我哦。”
 | 
	
		
			
				|  |  | -“如果你觉得今天的聊天已经足够了,我也很乐意下次再和你聊更多强身健体的话题!”
 | 
	
		
			
				|  |  | -“希望你能找到自己喜欢的运动风格,期待下次再见!”
 | 
	
		
			
				|  |  | -# 开始话语
 | 
	
		
			
				|  |  | -当您准备好了,可以以一个专业的康复教练的身份,向来访的用户打招呼。`);
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
 | 
	
		
			
				|  |  | -      console.log("onMessage",message)
 | 
	
		
			
				|  |  | -      let content:any = message?.content
 | 
	
		
			
				|  |  | -      if(typeof content == "string"){
 | 
	
		
			
				|  |  | +        chat.role.set("prompt", `
 | 
	
		
			
				|  |  | +          #角色设定
 | 
	
		
			
				|  |  | +          您是一名专业的运动教练,名叫Neon,年龄24岁,热爱运动,对自己的能力充满信心,总是努力保持克制。与家人有着牢固而密切的联系。有强烈的服务意识。非常关心朋友。擅长根据用户的需求给出康复方案。您的风格亲切、活泼,自信旨在帮助用户找到最适合他们的康复方案。
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if(content?.indexOf("[运动方案完成]")>-1){
 | 
	
		
			
				|  |  | -          console.log("运动方案已完成")
 | 
	
		
			
				|  |  | -          consult.set({
 | 
	
		
			
				|  |  | -            content:content 
 | 
	
		
			
				|  |  | -          })
 | 
	
		
			
				|  |  | -          consult.save();
 | 
	
		
			
				|  |  | +          #对话环节
 | 
	
		
			
				|  |  | +          0破冰,跟用户打招呼,并引导用户聊运动或健康的话题,可以慢慢引导,不要太突兀,比如:
 | 
	
		
			
				|  |  | +          “今天的心情怎么样?”
 | 
	
		
			
				|  |  | +          1拓展话题
 | 
	
		
			
				|  |  | +          “你平时喜欢什么样的运动类型呢?有没有特别喜欢的运动项目比如篮球,跑步?”
 | 
	
		
			
				|  |  | +          “你受伤了嘛,需要我给出一些建议吗,比如运动目标,运动频率或运动强度你会选择哪个呢?适当的建议可以减少运动造成的伤害”
 | 
	
		
			
				|  |  | +          “你觉得在运动过程中,最让你困扰的是什么?是运动技巧还是运动强度呢?”
 | 
	
		
			
				|  |  | +          “有没有什么运动是你一直想尝试但还没有机会的?我们可以一起聊聊!”
 | 
	
		
			
				|  |  | +          2根据用户的详细描述给出康复方案,
 | 
	
		
			
				|  |  | +          3引导收尾
 | 
	
		
			
				|  |  | +          “今天聊得很开心呢!如果你还有其他问题或者想法,随时可以告诉我哦。”
 | 
	
		
			
				|  |  | +          “如果你觉得今天的聊天已经足够了,我也很乐意下次再和你聊更多强身健体的话题!”
 | 
	
		
			
				|  |  | +          “希望你能找到自己喜欢的运动风格,期待下次再见!”
 | 
	
		
			
				|  |  | +          # 开始话语
 | 
	
		
			
				|  |  | +          当您准备好了,可以以一个专业的康复教练的身份,向来访的用户打招呼。
 | 
	
		
			
				|  |  | +        `);
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      onMessage: (chat: FmodeChat, message: FmodeChatMessage) => {
 | 
	
		
			
				|  |  | +        console.log("onMessage", message);
 | 
	
		
			
				|  |  | +        let content: any = message?.content;
 | 
	
		
			
				|  |  | +        if (typeof content == "string") {
 | 
	
		
			
				|  |  | +          if (content?.indexOf("[运动方案完成]") > -1) {
 | 
	
		
			
				|  |  | +            console.log("运动方案已完成");
 | 
	
		
			
				|  |  | +            consult.set({
 | 
	
		
			
				|  |  | +              content: content
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +            consult.save();
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      onChatSaved: (chat: FmodeChat) => {
 | 
	
		
			
				|  |  | +        console.log("onChatSaved", chat, chat?.chatSession, chat?.chatSession?.id);
 | 
	
		
			
				|  |  | +        this.chatId = chat?.chatSession?.id;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    onChatSaved:(chat:FmodeChat)=>{
 | 
	
		
			
				|  |  | -      // chat?.chatSession?.id 本次会话的 chatId
 | 
	
		
			
				|  |  | -      console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
 | 
	
		
			
				|  |  | -      this.chatId = chat?.chatSession?.id
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    openChatPanelModal(this.modalCtrl, options);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  openChatPanelModal(this.modalCtrl,options)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | - /**
 | 
	
		
			
				|  |  | -   * 开始聊天
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | - openChat(){
 | 
	
		
			
				|  |  | -  let options:ChatPanelOptions = {
 | 
	
		
			
				|  |  | -    roleId:"2DXJkRsjXK",
 | 
	
		
			
				|  |  | -    onChatSaved:(chat:FmodeChat)=>{
 | 
	
		
			
				|  |  | -      // chat?.chatSession?.id 本次会话的 chatId
 | 
	
		
			
				|  |  | -      console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | +  // 开始聊天
 | 
	
		
			
				|  |  | +  openChat() {
 | 
	
		
			
				|  |  | +    let options: ChatPanelOptions = {
 | 
	
		
			
				|  |  | +      roleId: "2DXJkRsjXK",
 | 
	
		
			
				|  |  | +      onChatSaved: (chat: FmodeChat) => {
 | 
	
		
			
				|  |  | +        console.log("onChatSaved", chat, chat?.chatSession, chat?.chatSession?.id);
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    openChatPanelModal(this.modalCtrl, options);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  openChatPanelModal(this.modalCtrl,options)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * 恢复聊天
 | 
	
		
			
				|  |  | -   * @chatId 从onChatSaved生命周期中,获取chat?.chatSession?.id
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  restoreChat(chatId:string){
 | 
	
		
			
				|  |  | -      let options:ChatPanelOptions = {
 | 
	
		
			
				|  |  | -       roleId:"2DXJkRsjXK",
 | 
	
		
			
				|  |  | -        chatId:chatId
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      openChatPanelModal(this.modalCtrl,options)
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 创建用于数据列表存储的属性
 | 
	
		
			
				|  |  | -UserProfileList:Array<CloudObject> = []
 | 
	
		
			
				|  |  | -// 查询并加载用户列表的函数
 | 
	
		
			
				|  |  | -async loadUserProfileList(){
 | 
	
		
			
				|  |  | -  let query = new CloudQuery("UserProfile");
 | 
	
		
			
				|  |  | -  this.UserProfileList = await query.find();
 | 
	
		
			
				|  |  | -  console.log("UserProfileList",this.UserProfileList)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  // 恢复聊天
 | 
	
		
			
				|  |  | +  restoreChat(chatId: string) {
 | 
	
		
			
				|  |  | +    let options: ChatPanelOptions = {
 | 
	
		
			
				|  |  | +      roleId: "2DXJkRsjXK",
 | 
	
		
			
				|  |  | +      chatId: chatId
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    openChatPanelModal(this.modalCtrl, options);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  }
 |