chat.page.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { Component, OnInit } from '@angular/core';
  2. import { ActivatedRoute, Router } from '@angular/router';
  3. import * as Parse from 'parse';
  4. import { TestChatCompletion, TestChatMessage } from './class-chat-completion';
  5. import { ChangeDetectorRef } from '@angular/core';
  6. @Component({
  7. selector: 'app-chat',
  8. templateUrl: './chat.page.html',
  9. styleUrls: ['./chat.page.scss'],
  10. })
  11. export class ChatPage implements OnInit {
  12. chatId: number | null = null;
  13. messageList: Array<TestChatMessage> = [];
  14. userInput: string = '';
  15. username: string = ''; // 用户名
  16. completion: TestChatCompletion;
  17. constructor(
  18. private route: ActivatedRoute,
  19. private router: Router,
  20. private cd: ChangeDetectorRef // 注入ChangeDetectorRef
  21. ) {
  22. this.completion = new TestChatCompletion(this.messageList);
  23. }
  24. ngOnInit() {
  25. this.route.queryParams.subscribe(params => {
  26. if (params['chatId']) {
  27. this.chatId = +params['chatId'];
  28. this.loadChatHistory(this.chatId);
  29. } else {
  30. this.chatId = null;
  31. this.messageList = [];
  32. }
  33. });
  34. }
  35. ionViewDidEnter() {
  36. //检测登录状况
  37. this.loadUserData();
  38. }
  39. async loadUserData() {
  40. const currentUser = Parse.User.current();
  41. if (currentUser) {
  42. this.username = currentUser.getUsername()!;
  43. } else {
  44. this.username = '未登录';
  45. }
  46. console.log("tab-ai:"+this.username);
  47. }
  48. async loadChatHistory(chatId: number | null) {
  49. if (!chatId) return;
  50. const Chat = Parse.Object.extend('ai_chat');
  51. const query = new Parse.Query(Chat);
  52. query.equalTo('chatId', chatId);
  53. query.ascending('userChatOrder');
  54. try {
  55. const results = await query.find();
  56. this.messageList = results.flatMap(chat => [
  57. { role: 'user', content: chat.get('userChat') },
  58. { role: 'assistant', content: chat.get('aiChat') }
  59. ]).filter(message => message.content); // 过滤掉内容为空的消息
  60. this.cd.detectChanges(); // 触发变更检测
  61. } catch (error) {
  62. console.error('Error loading chat history:', error);
  63. }
  64. }
  65. async sendMessage() {
  66. const userMessage: TestChatMessage = {
  67. role: 'user',
  68. content: this.userInput
  69. };
  70. this.messageList.push(userMessage);
  71. this.userInput = '';
  72. this.cd.detectChanges(); // 触发变更检测
  73. // 调用AI接口处理消息
  74. const aiMessage = await this.completion.createCompletionByStream(userMessage);
  75. if (this.chatId !== null) {
  76. await this.saveMessagesToDatabase(userMessage, aiMessage);
  77. }
  78. this.messageList.push(aiMessage);
  79. this.cd.detectChanges(); // 触发变更检测
  80. }
  81. async saveMessagesToDatabase(userMessage: TestChatMessage, aiMessage: TestChatMessage) {
  82. if (this.chatId === null) return;
  83. const Chat = Parse.Object.extend('ai_chat');
  84. const chat = new Chat();
  85. chat.set('username', this.username); // 设置用户名
  86. chat.set('chatId', this.chatId); // 设置chatId
  87. // 查询最后一个userChatOrder以确定此消息的新顺序
  88. const lastMessage = await this.getLastMessageInChat(this.chatId);
  89. let userChatOrder = 1; // 如果是对话的第一条消息,则默认为1
  90. if (lastMessage) {
  91. userChatOrder = lastMessage.get('userChatOrder') + 1;
  92. }
  93. chat.set('userChatOrder', userChatOrder); // 设置userChatOrder
  94. chat.set('userChat', userMessage.content); // 设置userChat
  95. chat.set('aiChat', aiMessage.content); // 设置aiChat
  96. try {
  97. await chat.save();
  98. } catch (error) {
  99. console.error('Error saving message:', error);
  100. }
  101. }
  102. async getLastMessageInChat(chatId: number): Promise<Parse.Object | undefined> {
  103. const Chat = Parse.Object.extend('ai_chat');
  104. const query = new Parse.Query(Chat);
  105. query.equalTo('chatId', chatId);
  106. query.descending('userChatOrder');
  107. query.limit(1); // 限制为1条结果以获取最后一条消息
  108. try {
  109. const result = await query.first();
  110. return result; // 返回最后一条消息对象,如果找不到则返回undefined
  111. } catch (error) {
  112. console.error('Error getting last message:', error);
  113. return undefined;
  114. }
  115. }
  116. }