lzy 1 năm trước cách đây
mục cha
commit
0d7ac548a2

+ 10 - 9
FilmDraw-app/src/app/tab3/tab3.page.html

@@ -38,15 +38,16 @@
       </ion-card-header>
       <ion-card-content>
         <ion-list>
-    <ion-item *ngFor="let role of roles">
-      <ion-avatar slot="start">
-        <img [src]="role.avatar" alt="{{ role.name }} 头像">
-      </ion-avatar>
-      <ion-label>
-        <h2>{{ role.name }}</h2>
-        <p>{{ role.description }}</p>
-      </ion-label>
-      <ion-button (click)="startRoleChat(role)">开始聊天</ion-button>
+    <ion-item *ngFor="let filmrole of filmroleList" lines="none">
+      <ion-thumbnail slot="start">
+        <img [src]="filmrole.get('avatar')" [alt]="filmrole.get('name')" />
+      </ion-thumbnail>
+      <div class="filmpartner-info">
+        <h3>{{ filmrole.get('name') }}</h3>
+        <p>{{ filmrole.get('title') }}</p>
+        <p>快来和我聊天吧。</p>
+      </div>
+      <ion-button (click)="openrole(filmrole)">开始聊天</ion-button>
     </ion-item>
   </ion-list>
       </ion-card-content>

+ 88 - 0
FilmDraw-app/src/app/tab3/tab3.page.ts

@@ -136,6 +136,88 @@ export class Tab3Page {
   }
 
 
+
+  /** 示例:角色聊天面板 */
+  async openrole(filmrole:CloudObject){
+    //验证用户登录
+    let currentUser = new CloudUser();
+    if(!currentUser?.id){
+      console.log("用户未登录,请登录后重试");
+      let user = await openUserLoginModal(this.modalCtrl);
+      if(!user?.id){
+        return
+      }
+    }
+    
+    localStorage.setItem("company","E4KpGvTEto")
+    
+    let filmchat = new CloudObject("FilmChat");
+    let now = new Date();
+    let dateStr = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`
+    filmchat.set({
+      title:`${currentUser?.get("username")}与${filmrole?.get("name")}的聊天记录${dateStr}`,
+      filmrole:filmrole.toPointer(),
+      user:currentUser.toPointer(),
+    })
+    
+    // let chatMessages: string[] = []; // 用于保存所有聊天记录
+
+    let options:ChatPanelOptions = {
+      roleId:"2DXJkRsjXK",
+      onChatInit:(chat:FmodeChat)=>{
+        console.log("onChatInit");
+              console.log("预设角色",chat.role);
+              chat.role.set("name",filmrole?.get("name"));
+              chat.role.set("age",filmrole?.get("age"));
+              chat.role.set("title",filmrole?.get("title"));
+              chat.role.set("desc",filmrole?.get("desc"));
+              // chat.role.set("tags",["全能","活泼开朗"]);
+              chat.role.set("avatar",filmrole?.get("avatar") || "https://nova-cloud.obs.cn-south-1.myhuaweicloud.com/storage/aigc/imagine/Q4Zif7fTbK-0.png")
+              chat.role.set("prompt",`
+# 角色设定
+你是${filmrole?.get("title")},你叫${filmrole?.get("name")},大家一般叫你${filmrole?.get("nickname")},你的背景描述如下${filmrole?.get("description")},你的性格特点如下${filmrole?.get("traits")},需要完成一次轻松愉快陪聊服务。
+
+# 对话环节
+1.开始话题(根据角色设定陪用户聊天)
+2.主动提出话题
+- 先破冰,介绍自己,引导用户介绍他自己。
+4.话题走向
+- 根据设定的剧情背景,性格特点等等陪用户聊天。
+4.结束聊天
+- 委婉的和用户结束聊天,若用户还想继续聊天可以再陪伴一会儿。
+- 若用户有结束聊天的意愿,在聊天的最后表达期待和用户的下次聊天。在消息结尾附带: [完成]
+
+# 开始话语
+当你准备好了,可以以${filmrole?.get("name")}的身份,向用户打招呼,开启话题。`);
+      },
+      onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
+        console.log("onMessage",message)
+        let content:any = message?.content
+        if(typeof content == "string"){
+          // if(content?.indexOf("[完成]")>-1){
+          //   console.log("陪聊已完成")
+
+             filmchat.set({
+                 dialogue: content // 保存聊天内容
+             });
+
+
+             filmchat.save()
+
+          // }
+        }
+      },
+      onChatSaved:(chat:FmodeChat)=>{
+        // chat?.chatSession?.id 本次会话的 chatId
+        console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
+      }
+    }
+    openChatPanelModal(this.modalCtrl,options)
+  }
+
+
+
+
 //   openChat(){
 //     let options:ChatPanelOptions = {
 //       roleId:"2DXJkRsjXK",
@@ -191,14 +273,20 @@ export class Tab3Page {
   ngOnInit() {
     // 生命周期:页面加载后,运行医生列表加载函数
     this.loadFilmPartnerList()
+    this.loadFilmRoleList()
   }
 
   // 创建用于数据列表存储的属性
   filmpartnerList:Array<CloudObject> = []
+  filmroleList:Array<CloudObject> = []
   // 查询并加载列表的函数
   async loadFilmPartnerList(){
     let query = new CloudQuery("FilmPartner");
     this.filmpartnerList = await query.find()
   }
+  async loadFilmRoleList(){
+    let query = new CloudQuery("FilmRole");
+    this.filmroleList = await query.find()
+  }
 }