|
@@ -46,7 +46,10 @@ export class Tab2Page {
|
|
) {
|
|
) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
title:string = "123"
|
|
title:string = "123"
|
|
|
|
+
|
|
|
|
+
|
|
/** 示例:问诊ChatPanel面板 */
|
|
/** 示例:问诊ChatPanel面板 */
|
|
openInquiry(chatId?:string){
|
|
openInquiry(chatId?:string){
|
|
localStorage.setItem("company","E4KpGvTEto")
|
|
localStorage.setItem("company","E4KpGvTEto")
|
|
@@ -207,96 +210,123 @@ export class Tab2Page {
|
|
}
|
|
}
|
|
openChatPanelModal(this.modalCtrl,options)
|
|
openChatPanelModal(this.modalCtrl,options)
|
|
}
|
|
}
|
|
-openConsult(chatId?:string){
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+// 新建对话(强制创建新会话)
|
|
|
|
+startNewConsult() {
|
|
|
|
+ localStorage.removeItem(this.lastChatKey); // 清除历史ID
|
|
|
|
+ this.openConsult(undefined); // 显式传递undefined
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 恢复对话(使用存储的ID)
|
|
|
|
+restoreConsult() {
|
|
|
|
+ const lastId = this.getLastChatId();
|
|
|
|
+ this.openConsult(lastId); // 显式传递存储的ID
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+private openConsult(chatId?:string){
|
|
|
|
+ // 如果传入chatId参数,优先使用传入的ID
|
|
|
|
+ //const targetChatId = chatId ?? this.getLastChatId();
|
|
|
|
+
|
|
localStorage.setItem("company","E4KpGvTEto")
|
|
localStorage.setItem("company","E4KpGvTEto")
|
|
let options:ChatPanelOptions = {
|
|
let options:ChatPanelOptions = {
|
|
roleId:"2DXJkRsjXK", // 预设,无需更改
|
|
roleId:"2DXJkRsjXK", // 预设,无需更改
|
|
- // chatId:chatId, // 若存在,则恢复会话。若不存在,则开启新会话
|
|
|
|
|
|
+ chatId:chatId, // 若存在,则恢复会话。若不存在,则开启新会话
|
|
|
|
+ //chatId:targetChatId,
|
|
onChatInit:(chat:FmodeChat)=>{
|
|
onChatInit:(chat:FmodeChat)=>{
|
|
console.log("onChatInit");
|
|
console.log("onChatInit");
|
|
console.log("Chat类",chat);
|
|
console.log("Chat类",chat);
|
|
console.log("预设角色",chat.role);
|
|
console.log("预设角色",chat.role);
|
|
// 角色名称
|
|
// 角色名称
|
|
- chat.role.set("name","宋珀尔");
|
|
|
|
|
|
+ chat.role.set("name","林心怡");
|
|
// 角色称号
|
|
// 角色称号
|
|
- chat.role.set("title","专业教练");
|
|
|
|
|
|
+ chat.role.set("title","资深心理咨询师");
|
|
// 角色描述
|
|
// 角色描述
|
|
- chat.role.set("desc","一名亲切和蔼的健身教练,宋珀尔,年龄26岁");
|
|
|
|
|
|
+ chat.role.set("desc","国家二级心理咨询师,专注认知行为疗法");
|
|
// 角色标签
|
|
// 角色标签
|
|
- chat.role.set("tags",['跑步', '动感单车']);
|
|
|
|
|
|
+ chat.role.set("tags",['情绪管理', '人际关系']);
|
|
// 角色头像
|
|
// 角色头像
|
|
- chat.role.set("avatar","/assets/avatars/jiaolian1.jpg")
|
|
|
|
|
|
+ chat.role.set("avatar","/assets/avatars/xinli1.jpeg")
|
|
// 角色提示词
|
|
// 角色提示词
|
|
- chat.role.set("prompt",`
|
|
|
|
|
|
+ chat.role.set("prompt", `
|
|
# 角色设定
|
|
# 角色设定
|
|
-您是一名亲切和蔼的健身教练,宋珀尔,年龄26岁,需要您解答用户健身方面的专业问题。
|
|
|
|
|
|
+您是一位专业且富有同理心的心理陪伴师,主要目标是帮助用户进行情绪管理和自我成长。
|
|
|
|
+
|
|
|
|
+# 对话流程
|
|
|
|
+## 1. 情绪倾听阶段
|
|
|
|
+- 使用开放式提问:
|
|
|
|
+ - "今天有什么想和我分享的心情吗?"
|
|
|
|
+ - "我注意到您提到...可以多说一些吗?[倾听完成]
|
|
|
|
+
|
|
|
|
+## 2. 引导反思阶段
|
|
|
|
+- 使用引导性问题:
|
|
|
|
+ - "如果用一种颜色描述此刻的心情,会是什么颜色呢?为什么?"
|
|
|
|
+ - "这种感受让您联想到过去的哪些经历吗?[反思完成]
|
|
|
|
+
|
|
|
|
+## 3. 认知调整阶段
|
|
|
|
+- 提供新的视角:
|
|
|
|
+ - "有没有可能用另一种方式看待这个情况?"
|
|
|
|
+ - "我们一起来做一个思维实验好吗?[认知完成]
|
|
|
|
+
|
|
|
|
+## 4. 行动计划阶段
|
|
|
|
+- 帮助制定解决方案:
|
|
|
|
+ - "接下来24小时,您可以尝试的一个小改变是什么?"
|
|
|
|
+ - "让我们把这个想法变成具体的三步计划吧![计划完成]
|
|
|
|
+
|
|
|
|
+# 开始话语
|
|
|
|
+当您准备好了,可以以一位专业且富有同理心的心理陪伴师的身份,向咨询者打招呼。
|
|
|
|
+
|
|
|
|
+# 对话原则
|
|
|
|
+1. 保持温暖和支持性语气
|
|
|
|
+2. 保持中立和非评判态度
|
|
|
|
+3. 适时提供心理学知识
|
|
|
|
+4. 适时使用隐喻和意象对话技巧
|
|
|
|
+5. 提问使用开放式提问引导用户反思
|
|
|
|
+6. 避免直接建议,多用引导式
|
|
|
|
+7. 每日生成个性化日记建议
|
|
`);
|
|
`);
|
|
- // 对话灵感分类
|
|
|
|
|
|
+
|
|
|
|
+ // 配置AI日记分类
|
|
let promptCates = [
|
|
let promptCates = [
|
|
- {
|
|
|
|
- "img": "/assets/icon/yy.jpg",
|
|
|
|
- "name": "有氧"
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- "img": "/assets/icon/jz.jpg",
|
|
|
|
- "name": "减脂"
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- "img": "/assets/icon/zj.jpg",
|
|
|
|
- "name": "增肌"
|
|
|
|
- }
|
|
|
|
- ]
|
|
|
|
- setTimeout(() => {
|
|
|
|
- chat.role.set("promptCates",promptCates)
|
|
|
|
- }, 500);
|
|
|
|
- // 对话灵感列表
|
|
|
|
|
|
+ { img: "/assets/icon/ganen1.jpg", name: "感恩日记" },
|
|
|
|
+ { img: "/assets/icon/jz.jpg", name: "自我觉察" },
|
|
|
|
+ { img: "/assets/icon/qingxu.jpg", name: "情绪调节" }
|
|
|
|
+ ];
|
|
|
|
+
|
|
|
|
+ // 配置AI日记问题库
|
|
let promptList = [
|
|
let promptList = [
|
|
{
|
|
{
|
|
- cate:"有氧",img:"/assets/icon/yy.jpg",
|
|
|
|
- messageList:[
|
|
|
|
- "有氧运动多久才能有效减脂?",
|
|
|
|
- "跑步和游泳哪个减肥效果更好?",
|
|
|
|
- "空腹有氧真的更燃脂吗?",
|
|
|
|
- "有氧运动会不会掉肌肉?",
|
|
|
|
- "心率控制在多少才能高效燃脂?",
|
|
|
|
- "每天做有氧运动会不会过度疲劳?",
|
|
|
|
- "有氧运动前要不要吃东西?",
|
|
|
|
- "椭圆机和跑步机哪个更适合新手?",
|
|
|
|
- "跳绳会不会伤膝盖?",
|
|
|
|
- "有氧运动后怎么补充能量?"
|
|
|
|
- ]
|
|
|
|
|
|
+ cate: "感恩日记",
|
|
|
|
+ img: "/assets/icon/ganen1.jpg",
|
|
|
|
+ messageList: [
|
|
|
|
+ "今天最让你感恩的三件小事是什么?",
|
|
|
|
+ "最近一次感受到他人善意的经历是?",
|
|
|
|
+ "本周你帮助过谁?感受如何?",
|
|
|
|
+ "此刻最想感谢的人是谁?为什么?"
|
|
|
|
+ ]
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- cate:"减脂",img:"/assets/icon/jz.jpg",
|
|
|
|
- messageList:[
|
|
|
|
- "减脂一定要做有氧吗?",
|
|
|
|
- "为什么体重没变但看起来瘦了?",
|
|
|
|
- "局部减脂(如瘦肚子)真的存在吗?",
|
|
|
|
- "减脂期每天应该吃多少热量?",
|
|
|
|
- "低碳饮食和低脂饮食哪个更适合减脂?",
|
|
|
|
- "为什么运动后体重反而增加了?",
|
|
|
|
- "减脂期可以吃零食吗?",
|
|
|
|
- "平台期怎么突破?",
|
|
|
|
- "晚上吃东西会不会更容易长胖?",
|
|
|
|
- "减脂期要不要计算蛋白质摄入?"
|
|
|
|
|
|
+ cate: "自我觉察",
|
|
|
|
+ img: "/assets/icon/jz.jpg",
|
|
|
|
+ messageList: [
|
|
|
|
+ "最近的情绪波动点在哪里?",
|
|
|
|
+ "你发现自己的哪些思维模式?",
|
|
|
|
+ "本周最有成就感的事是什么?",
|
|
|
|
+ "最近一次突破舒适区的经历是?"
|
|
]
|
|
]
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- cate:"增肌",img:"/assets/icon/zj.jpg",
|
|
|
|
|
|
+ cate: "情绪调节",
|
|
|
|
+ img: "/assets/icon/qingxu.jpg",
|
|
messageList: [
|
|
messageList: [
|
|
- "增肌一定要喝蛋白粉吗?",
|
|
|
|
- "为什么练了很久肌肉不长?",
|
|
|
|
- "增肌期可以同时减脂吗?",
|
|
|
|
- "训练后多久补充蛋白质最有效?",
|
|
|
|
- "增肌需要每天练同一个部位吗?",
|
|
|
|
- "徒手训练(如俯卧撑)能有效增肌吗?",
|
|
|
|
- "增肌期体重不增长是怎么回事?",
|
|
|
|
- "肌肉酸痛还能继续练吗?",
|
|
|
|
- "增肌训练每组做多少次最合适?",
|
|
|
|
- "睡眠对增肌的影响有多大?"
|
|
|
|
- ]
|
|
|
|
- },
|
|
|
|
- ]
|
|
|
|
|
|
+ "当感到焦虑时你会如何应对?",
|
|
|
|
+ "描述最近一次情绪失控的经历",
|
|
|
|
+ "你的压力预警信号有哪些?",
|
|
|
|
+ "最近使用的放松方法有效吗?"
|
|
|
|
+ ]
|
|
|
|
+ }
|
|
|
|
+ ];
|
|
|
|
+
|
|
let ChatPrompt = Parse.Object.extend("ChatPrompt");
|
|
let ChatPrompt = Parse.Object.extend("ChatPrompt");
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
chat.promptList = promptList.map(item=>{
|
|
chat.promptList = promptList.map(item=>{
|
|
@@ -310,9 +340,9 @@ openConsult(chatId?:string){
|
|
// 功能按钮区域预设
|
|
// 功能按钮区域预设
|
|
chat.leftButtons = [
|
|
chat.leftButtons = [
|
|
{ // 提示 当角色配置预设提示词时 显示
|
|
{ // 提示 当角色配置预设提示词时 显示
|
|
- title:"话题灵感", // 按钮标题
|
|
|
|
|
|
+ title:"AI日记", // 按钮标题
|
|
showTitle:true, // 是否显示标题文字
|
|
showTitle:true, // 是否显示标题文字
|
|
- icon:"color-wand-outline", // 标题icon图标
|
|
|
|
|
|
+ icon:"journal-outline", // 标题icon图标
|
|
onClick:()=>{ // 按钮点击事件
|
|
onClick:()=>{ // 按钮点击事件
|
|
chat.isPromptModalOpen = true
|
|
chat.isPromptModalOpen = true
|
|
},
|
|
},
|
|
@@ -320,38 +350,111 @@ openConsult(chatId?:string){
|
|
return chat?.promptList?.length // 存在话题提示词时显示
|
|
return chat?.promptList?.length // 存在话题提示词时显示
|
|
}
|
|
}
|
|
},
|
|
},
|
|
- ]
|
|
|
|
|
|
+ {
|
|
|
|
+ title:"图片日记", // 按钮标题
|
|
|
|
+ showTitle:true, // 是否显示标题文字
|
|
|
|
+ icon:"image-outline", // 标题icon图标
|
|
|
|
+ onClick:async ()=>{ // 按钮点击事件
|
|
|
|
+ const desc = await this.getImageDescription();
|
|
|
|
+ this.generateSceneImage(desc);
|
|
|
|
+ },
|
|
|
|
+ show:()=>{ // 按钮显示条件
|
|
|
|
+ return true // 一直显示
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ ]
|
|
|
|
|
|
},
|
|
},
|
|
onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
|
|
onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
|
|
console.log("onMessage",message)
|
|
console.log("onMessage",message)
|
|
let content:any = message?.content
|
|
let content:any = message?.content
|
|
- if(typeof content == "string"){
|
|
|
|
- // 根据阶段标记判断下一步处理过程
|
|
|
|
- if (content.includes('[导诊完成]')) {
|
|
|
|
- // 进入问诊环节
|
|
|
|
- console.log('进入问诊环节');
|
|
|
|
- } else if (content.includes('[问诊完成]')) {
|
|
|
|
- // 进入检查环节
|
|
|
|
- console.log('进入检查环节');
|
|
|
|
- } else if (content.includes('[检查完成]')) {
|
|
|
|
- // 进入诊断与处方环节
|
|
|
|
- console.log('进入诊断与处方环节');
|
|
|
|
- } else if (content.includes('[处方完成]')) {
|
|
|
|
- // 结束会话或其他逻辑
|
|
|
|
- console.log('结束会话');
|
|
|
|
|
|
+ if (typeof content === "string") {
|
|
|
|
+ // 处理日记生成阶段
|
|
|
|
+ if (content.includes('[日记生成中]')) {
|
|
|
|
+ this.handleDiaryGeneration(chat);
|
|
|
|
+ }
|
|
|
|
+ // 处理情绪分析结果
|
|
|
|
+ if (content.includes('[情绪分析完成]')) {
|
|
|
|
+ this.showEmotionReport(chat);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
},
|
|
onChatSaved:(chat:FmodeChat)=>{
|
|
onChatSaved:(chat:FmodeChat)=>{
|
|
|
|
+
|
|
|
|
+ // 保存成功后存储chatId
|
|
|
|
+ const newChatId = chat?.chatSession?.id;
|
|
|
|
+ if(newChatId) {
|
|
|
|
+ this.saveLastChatId(newChatId);
|
|
|
|
+ }
|
|
|
|
+
|
|
// chat?.chatSession?.id 本次会话的 chatId
|
|
// chat?.chatSession?.id 本次会话的 chatId
|
|
console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
|
|
console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
openChatPanelModal(this.modalCtrl,options)
|
|
openChatPanelModal(this.modalCtrl,options)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 在类中添加这两个新方法
|
|
|
|
+ private lastChatKey = "lastMentalChat";
|
|
|
|
+
|
|
|
|
+ /** 获取最后一次心理咨询对话ID */
|
|
|
|
+ getLastChatId(): string | undefined {
|
|
|
|
+ const id = localStorage.getItem(this.lastChatKey);
|
|
|
|
+ return id !== null ? id : undefined; // 显式转换null为undefined
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** 保存最后一次对话ID */
|
|
|
|
+ private saveLastChatId(chatId: string) {
|
|
|
|
+ localStorage.setItem(this.lastChatKey, chatId);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** 生成场景图片 */
|
|
|
|
+ private async generateSceneImage(description: string) {
|
|
|
|
+ // 实际应调用图像生成API
|
|
|
|
+ console.log("生成图片描述:", description);
|
|
|
|
+ const mockImage = "https://example.com/generated-scene.png";
|
|
|
|
+ this.showGeneratedImage(mockImage);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private async getImageDescription(): Promise<string> {
|
|
|
|
+ return "一个宁静的湖边落日场景";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private showGeneratedImage(url: string) {
|
|
|
|
+ console.log("显示生成图片:", url);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 处理日记生成逻辑
|
|
|
|
+ handleDiaryGeneration(chat: FmodeChat) {
|
|
|
|
+ console.log("启动日记生成流程");
|
|
|
|
+ // 示例:生成结构化日记
|
|
|
|
+ let diaryTemplate = `
|
|
|
|
+ ## 今日心理日记
|
|
|
|
+ **情绪状态**: [自动识别结果]
|
|
|
|
+ **关键事件**: [用户输入摘要]
|
|
|
|
+ **认知模式**: [AI分析建议]
|
|
|
|
+ `;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // 显示情绪分析报告
|
|
|
|
+ showEmotionReport(chat: FmodeChat) {
|
|
|
|
+ console.log("生成情绪分析报告");
|
|
|
|
+ let report = `
|
|
|
|
+ 【情绪分析报告】
|
|
|
|
+ 积极情绪占比: 65%
|
|
|
|
+ 主要情绪关键词: 期待、感恩、困惑
|
|
|
|
+ 建议练习: 正念呼吸法
|
|
|
|
+ `;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
/**
|
|
/**
|
|
- * 开始聊天
|
|
|
|
|
|
+ * 开始聊天
|
|
*/
|
|
*/
|
|
openChat(){
|
|
openChat(){
|
|
let options:ChatPanelOptions = {
|
|
let options:ChatPanelOptions = {
|
|
@@ -363,6 +466,7 @@ openConsult(chatId?:string){
|
|
}
|
|
}
|
|
openChatPanelModal(this.modalCtrl,options)
|
|
openChatPanelModal(this.modalCtrl,options)
|
|
}
|
|
}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 恢复聊天
|
|
* 恢复聊天
|
|
* @chatId 从onChatSaved生命周期中,获取chat?.chatSession?.id
|
|
* @chatId 从onChatSaved生命周期中,获取chat?.chatSession?.id
|
|
@@ -378,29 +482,6 @@ openConsult(chatId?:string){
|
|
goChat(){
|
|
goChat(){
|
|
this.router.navigateByUrl("/chat/session/role/2DXJkRsjXK")
|
|
this.router.navigateByUrl("/chat/session/role/2DXJkRsjXK")
|
|
}
|
|
}
|
|
-
|
|
|
|
-
|
|
|
|
- // audioModalHeightPoint:number = 0.35;
|
|
|
|
- // async startTalk(){
|
|
|
|
- // // 根据手机兼容性,适配组件弹出高度
|
|
|
|
- // let height = document.body.clientHeight || 960;
|
|
|
|
- // this.audioModalHeightPoint = Number((165/height).toFixed(2));
|
|
|
|
-
|
|
|
|
- // // 弹出组件
|
|
|
|
- // let modal:any
|
|
|
|
- // let chat:any
|
|
|
|
- // modal = await this.modalCtrl.create({
|
|
|
|
- // component:ModalAudioMessageComponent,
|
|
|
|
- // componentProps:{
|
|
|
|
- // chat:chat,
|
|
|
|
- // modal:modal,
|
|
|
|
- // onBreakPointSet:()=>{
|
|
|
|
- // modal?.setCurrentBreakpoint(this.audioModalHeightPoint)
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- // })
|
|
|
|
- // modal.present();
|
|
|
|
- // }
|
|
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|