tab3.page.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import { Component } from '@angular/core';
  2. import { Router } from '@angular/router';
  3. import { ChatPanelOptions, FmChatModalInput, FmodeChat, FmodeChatMessage, openChatPanelModal } from 'fmode-ng';
  4. import Parse from "parse";
  5. import { ModalController} from '@ionic/angular/standalone';
  6. @Component({
  7. selector: 'app-tab3',
  8. templateUrl: 'tab3.page.html',
  9. styleUrls: ['tab3.page.scss'],
  10. standalone: false,
  11. })
  12. export class Tab3Page {
  13. constructor(
  14. private modalCtrl:ModalController,
  15. private router:Router,
  16. ) {}
  17. openConsult(chatId?:string){
  18. // 如果传入chatId参数,优先使用传入的ID
  19. //const targetChatId = chatId ?? this.getLastChatId();
  20. localStorage.setItem("company","E4KpGvTEto")
  21. let options:ChatPanelOptions = {
  22. roleId:"2DXJkRsjXK", // 预设,无需更改
  23. //chatId:chatId, // 若存在,则恢复会话。若不存在,则开启新会话
  24. //chatId:targetChatId,
  25. onChatInit:(chat:FmodeChat)=>{
  26. console.log("onChatInit");
  27. console.log("Chat类",chat);
  28. console.log("预设角色",chat.role);
  29. // 角色名称
  30. chat.role.set("name","林心怡");
  31. // 角色称号
  32. chat.role.set("title","资深心理咨询师");
  33. // 角色描述
  34. chat.role.set("desc","国家二级心理咨询师,专注认知行为疗法");
  35. // 角色标签
  36. chat.role.set("tags",['情绪管理', '人际关系']);
  37. // 角色头像
  38. chat.role.set("avatar","assets/icon/xinli1.jpeg")
  39. // 角色提示词
  40. chat.role.set("prompt", `
  41. # 角色设定
  42. 您是一位专业且富有同理心的心理陪伴师,主要目标是帮助用户进行情绪管理和自我成长。
  43. # 开始话语
  44. 当您准备好了,可以以一位专业且富有同理心的心理陪伴师的身份,向咨询者打招呼。
  45. # 对话原则
  46. 1. 保持温暖和支持性语气
  47. 2. 保持中立和非评判态度
  48. 3. 适时提供心理学知识
  49. 4. 提问使用开放式提问引导用户反思
  50. 5. 避免直接建议,多用引导式
  51. 6. 每日生成个性化日记建议
  52. `);
  53. // 配置AI日记分类
  54. let promptCates = [
  55. { img: "assets/icon/ganen1.jpg", name: "感恩日记" },
  56. { img: "assets/icon/jz.jpg", name: "自我觉察" },
  57. { img: "assets/icon/qingxu.jpg", name: "情绪调节" }
  58. ];
  59. setTimeout(() => {
  60. chat.role.set("promptCates", promptCates)
  61. }, 500);
  62. // 配置AI日记问题库
  63. let promptList = [
  64. {
  65. cate: "感恩日记",
  66. img: "assets/icon/ganen1.jpg",
  67. messageList: [
  68. "今天最让你感恩的三件小事是什么?",
  69. "最近一次感受到他人善意的经历是?",
  70. "本周你帮助过谁?感受如何?",
  71. "此刻最想感谢的人是谁?为什么?"
  72. ]
  73. },
  74. {
  75. cate: "自我觉察",
  76. img: "assets/icon/jz.jpg",
  77. messageList: [
  78. "最近的情绪波动点在哪里?",
  79. "你发现自己的哪些思维模式?",
  80. "本周最有成就感的事是什么?",
  81. "最近一次突破舒适区的经历是?"
  82. ]
  83. },
  84. {
  85. cate: "情绪调节",
  86. img: "assets/icon/qingxu.jpg",
  87. messageList: [
  88. "当感到焦虑时你会如何应对?",
  89. "描述最近一次情绪失控的经历",
  90. "你的压力预警信号有哪些?",
  91. "最近使用的放松方法有效吗?"
  92. ]
  93. }
  94. ];
  95. let ChatPrompt = Parse.Object.extend("ChatPrompt");
  96. setTimeout(() => {
  97. chat.promptList = promptList.map(item=>{
  98. let prompt = new ChatPrompt();
  99. prompt.set(item);
  100. prompt.img = item.img;
  101. return prompt;
  102. })
  103. }, 500);
  104. // 功能按钮区域预设
  105. chat.leftButtons = [
  106. { // 提示 当角色配置预设提示词时 显示
  107. title:"AI日记", // 按钮标题
  108. showTitle:true, // 是否显示标题文字
  109. icon:"journal-outline", // 标题icon图标
  110. onClick:()=>{ // 按钮点击事件
  111. chat.isPromptModalOpen = true
  112. },
  113. show:()=>{ // 按钮显示条件
  114. return chat?.promptList?.length // 存在话题提示词时显示
  115. }
  116. },
  117. {
  118. title:"图片日记", // 按钮标题
  119. showTitle:true, // 是否显示标题文字
  120. icon:"image-outline", // 标题icon图标
  121. onClick:async ()=>{ // 按钮点击事件
  122. const desc = await this.getImageDescription();
  123. this.generateSceneImage(desc);
  124. },
  125. show:()=>{ // 按钮显示条件
  126. return true // 一直显示
  127. }
  128. },
  129. ]
  130. },
  131. onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
  132. console.log("onMessage",message)
  133. let content:any = message?.content
  134. if (typeof content === "string") {
  135. // 处理日记生成阶段
  136. if (content.includes('[日记生成中]')) {
  137. this.handleDiaryGeneration(chat);
  138. }
  139. // 处理情绪分析结果
  140. if (content.includes('[情绪分析完成]')) {
  141. this.showEmotionReport(chat);
  142. }
  143. }
  144. },
  145. onChatSaved:(chat:FmodeChat)=>{
  146. // chat?.chatSession?.id 本次会话的 chatId
  147. console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
  148. }
  149. }
  150. openChatPanelModal(this.modalCtrl,options)
  151. }
  152. // 在类中添加这两个新方法
  153. private lastChatKey = "lastMentalChat";
  154. /** 获取最后一次心理咨询对话ID */
  155. getLastChatId(): string | undefined {
  156. const id = localStorage.getItem(this.lastChatKey);
  157. return id !== null ? id : undefined; // 显式转换null为undefined
  158. }
  159. /** 保存最后一次对话ID */
  160. private saveLastChatId(chatId: string) {
  161. localStorage.setItem(this.lastChatKey, chatId);
  162. }
  163. /** 生成场景图片 */
  164. private async generateSceneImage(description: string) {
  165. // 实际应调用图像生成API
  166. console.log("生成图片描述:", description);
  167. const mockImage = "http://example.com/generated-scene.png";
  168. this.showGeneratedImage(mockImage);
  169. }
  170. private async getImageDescription(): Promise<string> {
  171. return "一个宁静的湖边落日场景";
  172. }
  173. private showGeneratedImage(url: string) {
  174. console.log("显示生成图片:", url);
  175. }
  176. // 处理日记生成逻辑
  177. handleDiaryGeneration(chat: FmodeChat) {
  178. console.log("启动日记生成流程");
  179. // 示例:生成结构化日记
  180. let diaryTemplate = `
  181. ## 今日心理日记
  182. **情绪状态**: [自动识别结果]
  183. **关键事件**: [用户输入摘要]
  184. **认知模式**: [AI分析建议]
  185. `;
  186. }
  187. // 显示情绪分析报告
  188. showEmotionReport(chat: FmodeChat) {
  189. console.log("生成情绪分析报告");
  190. let report = `
  191. 【情绪分析报告】
  192. 积极情绪占比: 65%
  193. 主要情绪关键词: 期待、感恩、困惑
  194. 建议练习: 正念呼吸法
  195. `;
  196. }
  197. //开始聊天
  198. goChat(){
  199. this.router.navigateByUrl("/chat/session/role/2DXJkRsjXK")
  200. }
  201. }