tab1.page.html 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <ion-header [translucent]="true">
  2. <div class="teacher-selector">
  3. <ion-button fill="clear" id="select-teacher">
  4. <div class="teacher-info">
  5. <ion-icon name="person-circle-outline" class="teacher-icon"></ion-icon>
  6. <div class="teacher-name">{{ selectedTeacher.name }}</div>
  7. <div class="teacher-description">{{ selectedTeacher.description }}</div>
  8. </div>
  9. </ion-button>
  10. <ion-modal trigger="select-teacher" [breakpoints]="[0, 0.5]" [initialBreakpoint]="0.5">
  11. <ng-template>
  12. <ion-content>
  13. <ion-list>
  14. <ion-item *ngFor="let teacher of teachers" (click)="selectTeacher(teacher)" [class.selected]="teacher.id === selectedTeacher.id">
  15. <div class="teacher-list-item">
  16. <ion-icon name="person-circle-outline" class="teacher-icon"></ion-icon>
  17. <div class="teacher-details">
  18. <div class="teacher-name">{{ teacher.name }}</div>
  19. <div class="teacher-description">{{ teacher.description }}</div>
  20. </div>
  21. </div>
  22. </ion-item>
  23. </ion-list>
  24. </ion-content>
  25. </ng-template>
  26. </ion-modal>
  27. </div>
  28. </ion-header>
  29. <ion-content [fullscreen]="true">
  30. <div class="chat-container">
  31. <div class="chat-content">
  32. <!-- 历史消息显示 -->
  33. <div *ngFor="let message of messages"
  34. [ngClass]="{'user-message': message.isUser, 'ai-message': !message.isUser}"
  35. class="message-wrapper">
  36. <div class="message-bubble">
  37. @if(message.isUser) {
  38. <div class="message-content">{{ message.content }}</div>
  39. } @else {
  40. <fm-markdown-preview class="message-content" [content]="message.content"></fm-markdown-preview>
  41. }
  42. <div class="message-time">
  43. {{ message.timestamp | date:'HH:mm' }}
  44. </div>
  45. </div>
  46. </div>
  47. <!-- 实时消息预览 -->
  48. @if(isLoading && !isComplete) {
  49. <div class="ai-message message-wrapper">
  50. <div class="message-bubble">
  51. <div class="message-content">{{ currentResponse }}</div>
  52. </div>
  53. </div>
  54. }
  55. </div>
  56. </div>
  57. </ion-content>
  58. <ion-footer>
  59. <ion-toolbar>
  60. <ion-item>
  61. <ion-textarea
  62. [(ngModel)]="userInput"
  63. placeholder="请输入消息..."
  64. (keyup.enter)="sendMessage()"
  65. [disabled]="isLoading"
  66. autoGrow="true"
  67. rows="1"
  68. ></ion-textarea>
  69. <ion-button slot="end"
  70. (click)="sendMessage()"
  71. [disabled]="!userInput || isLoading">
  72. <ion-icon name="send"></ion-icon>
  73. </ion-button>
  74. </ion-item>
  75. </ion-toolbar>
  76. </ion-footer>