tab2.page.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import { Component } from '@angular/core';
  2. import { ModalController } from '@ionic/angular/standalone';
  3. // 引用fmode-ng智能体组件
  4. import { ChatPanelOptions, FmodeChat, FmodeChatMessage, openChatPanelModal } from 'fmode-ng';
  5. import Parse from "parse";
  6. import { CloudObject, CloudQuery, CloudUser } from 'src/lib/ncloud';
  7. @Component({
  8. selector: 'app-tab2',
  9. templateUrl: 'tab2.page.html',
  10. styleUrls: ['tab2.page.scss'],
  11. standalone: false,
  12. })
  13. export class Tab2Page {
  14. // 处理图片加载失败
  15. handleImageError(event: Event) {
  16. const img = event.target as HTMLImageElement;
  17. img.src = 'assets/icon/hoshino.jpeg'; // 备用图片
  18. }
  19. // 处理按钮点击
  20. openDetails() {
  21. console.log('查看资讯按钮被点击');
  22. // 实际项目中可以跳转页面:
  23. // this.router.navigate(['/details']);
  24. }
  25. openConsult(chatId?:string){
  26. localStorage.setItem("company","E4KpGvTEto")
  27. let options:ChatPanelOptions = {
  28. roleId:"2DXJkRsjXK", // 预设,无需更改
  29. // chatId:chatId, // 若存在,则恢复会话。若不存在,则开启新会话
  30. onChatInit:(chat:FmodeChat)=>{
  31. console.log("onChatInit");
  32. console.log("Chat类",chat);
  33. console.log("预设角色",chat.role);
  34. // 角色名称
  35. chat.role.set("name","星野荐");
  36. // 角色称号
  37. chat.role.set("title","漫画家");
  38. // 角色描述
  39. chat.role.set("desc","个人作品画风清新,但隐藏“推荐彩蛋”,星野荐,年龄26岁");
  40. // 角色标签
  41. chat.role.set("tags",['跑步', '动感单车']);
  42. // 角色头像
  43. chat.role.set("avatar","assets/icon/hoshino.jpeg")
  44. // 角色提示词
  45. chat.role.set("prompt",`
  46. # 角色设定
  47. 性别:男
  48. 年龄:32岁
  49. 国籍:日本(活跃于国际漫画平台)
  50. 职业:
  51. 漫画家(创作小众治愈系作品)
  52. “漫画考古学家”(专注挖掘冷门神作)
  53. 线上漫画推荐专栏主理人
  54. 发型:微卷的深棕色短发,总有一撮呆毛翘起。
  55. 服饰:爱穿宽松的条纹衬衫+工装裤,胸前挂着一副老式放大镜(用来“鉴定漫画细节”)。
  56. 标志性道具:
  57. 手捧一本封面夸张的漫画,书脊贴满彩色标签。
  58. 背包上别满各国漫画角色的徽章。
  59. 表情:热情洋溢的笑容,眼神专注时会在镜片后反光。
  60. `);
  61. // 对话灵感分类
  62. let promptCates = [
  63. {
  64. "img": "assets/icon/leixing.jpeg",
  65. "name": "类型"
  66. },
  67. {
  68. "img": "assets/icon/fengge.jpeg",
  69. "name": "风格"
  70. },
  71. {
  72. "img": "assets/icon/zhuti.jpeg",
  73. "name": "主题"
  74. }
  75. ]
  76. setTimeout(() => {
  77. chat.role.set("promptCates",promptCates)
  78. }, 500);
  79. // 对话灵感列表
  80. let promptList = [
  81. {
  82. cate:"类型",img:"/assets/icon/leixing.jpg",
  83. messageList:[
  84. "我喜欢热血战斗类的漫画,比如《龙珠》《火影忍者》,有什么类似的推荐吗?",
  85. "有没有好看的悬疑推理漫画,剧情烧脑的那种?",
  86. "最近想看看轻松搞笑的日常漫画,能推荐一些吗?",
  87. "对科幻机甲类的漫画感兴趣,类似《高达》或者《攻壳机动队》这样的有推荐吗?",
  88. "有没有黑暗奇幻风格的漫画,比如《剑风传奇》这种?"
  89. ]
  90. },
  91. {
  92. cate:"风格",img:"/assets/icon/fengge.jpg",
  93. messageList:[
  94. "我喜欢画风细腻、人物美型的漫画,比如《CLAMP》的作品,有类似的推荐吗?",
  95. "有没有画风独特、辨识度高的漫画,比如《JOJO的奇妙冒险》那种?",
  96. "喜欢复古手绘风格的漫画,类似《浪客行》这样的,能推荐一些吗?",
  97. "有没有色彩鲜艳、视觉冲击力强的漫画,比如《死神》早期的风格?",
  98. "偏好写实画风的漫画,类似《寄生兽》这样的,有什么推荐?"
  99. ]
  100. },
  101. {
  102. cate:"主题",img:"/assets/icon/zhuti.jpg",
  103. messageList: [
  104. "有没有主角成长线很精彩的漫画,比如从弱小变强的那种?",
  105. "想看看关于‘复仇’主题的漫画,剧情要够狠够刺激的!",
  106. "有没有讲述友情、团队合作的漫画,类似《海贼王》这种?",
  107. "对‘时间循环’或者‘平行世界’设定的漫画感兴趣,有什么推荐?",
  108. "有没有探讨人性、社会问题的深刻漫画,类似《死亡笔记》或《怪物》?"
  109. ]
  110. },
  111. ]
  112. let ChatPrompt = Parse.Object.extend("ChatPrompt");
  113. setTimeout(() => {
  114. chat.promptList = promptList.map(item=>{
  115. let prompt = new ChatPrompt();
  116. prompt.set(item);
  117. prompt.img = item.img;
  118. return prompt;
  119. })
  120. }, 500);
  121. // 功能按钮区域预设
  122. chat.leftButtons = [
  123. { // 提示 当角色配置预设提示词时 显示
  124. title:"话题灵感", // 按钮标题
  125. showTitle:true, // 是否显示标题文字
  126. icon:"color-wand-outline", // 标题icon图标
  127. onClick:()=>{ // 按钮点击事件
  128. chat.isPromptModalOpen = true
  129. },
  130. show:()=>{ // 按钮显示条件
  131. return chat?.promptList?.length // 存在话题提示词时显示
  132. }
  133. },
  134. ]
  135. },
  136. onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
  137. console.log("onMessage",message)
  138. let content:any = message?.content
  139. if(typeof content == "string"){
  140. // 根据阶段标记判断下一步处理过程
  141. if (content.includes('[导诊完成]')) {
  142. // 进入问诊环节
  143. console.log('进入问诊环节');
  144. } else if (content.includes('[问诊完成]')) {
  145. // 进入检查环节
  146. console.log('进入检查环节');
  147. } else if (content.includes('[检查完成]')) {
  148. // 进入诊断与处方环节
  149. console.log('进入诊断与处方环节');
  150. } else if (content.includes('[处方完成]')) {
  151. // 结束会话或其他逻辑
  152. console.log('结束会话');
  153. }
  154. }
  155. },
  156. onChatSaved:(chat:FmodeChat)=>{
  157. // chat?.chatSession?.id 本次会话的 chatId
  158. console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
  159. }
  160. }
  161. openChatPanelModal(this.modalCtrl,options)
  162. }
  163. constructor(private modalCtrl:ModalController,) {}
  164. }