1
0
Эх сурвалжийг харах

feat: session save with ChatSession

未来全栈 6 сар өмнө
parent
commit
766de9e8af

+ 3 - 3
AiStudy-app/src/app/pages/chat-session/chat-session.page.ts

@@ -22,13 +22,13 @@ import { MarkdownPreviewModule } from 'fmode-ng';
         <ion-buttons slot="start">
           <ion-back-button defaultHref="/chat-history"></ion-back-button>
         </ion-buttons>
-        <ion-title>{{ session?.getTitle() }}</ion-title>
+        <ion-title>{{ session?.get('title') }}</ion-title>
       </ion-toolbar>
     </ion-header>
 
     <ion-content class="ion-padding">
       <div *ngIf="session">
-        <div *ngFor="let message of session.getMessages()" 
+        <div *ngFor="let message of session.get('messages')" 
              [ngClass]="{'user-message': message.isUser, 'ai-message': !message.isUser}" 
              class="message-wrapper">
           <div class="message-bubble">
@@ -40,7 +40,7 @@ import { MarkdownPreviewModule } from 'fmode-ng';
                                [content]="message.content">
             </fm-markdown-preview>
             <div class="message-time">
-              {{ message.timestamp | date:'yyyy-MM-dd HH:mm:ss' }}
+              {{ message.timestamp?.iso | date:'yyyy-MM-dd HH:mm:ss' }}
             </div>
           </div>
         </div>

+ 4 - 4
AiStudy-app/src/app/pages/learning-history/learning-history.page.ts

@@ -14,7 +14,7 @@ import {
 } from '@ionic/angular/standalone';
 import { NgFor, DatePipe } from '@angular/common';
 import Parse from 'parse';
-import { CloudUser } from 'src/lib/ncloud';
+import { CloudQuery, CloudUser } from 'src/lib/ncloud';
 
 interface LearningPlan {
   id: string;
@@ -62,12 +62,12 @@ export class LearningHistoryPage implements OnInit {
       }
 
       const LearningPlan = Parse.Object.extend('LearningPlan');
-      const query = new Parse.Query(LearningPlan);
+      const query = new CloudQuery(LearningPlan);
       query.equalTo('userId', currentUser.id);
-      query.descending('createdAt');
+      // query.descending('createdAt');
 
       const results = await query.find();
-      this.learningPlans = results.map(plan => ({
+      this.learningPlans = results.map((plan:any) => ({
         id: plan.id,
         subject: plan.get('subject'),
         timeFrame: plan.get('timeFrame'),

+ 4 - 3
AiStudy-app/src/app/services/chat-session.service.ts

@@ -45,10 +45,11 @@ export class ChatSessionService {
   }
 
   // 获取单个会话
-  async getSession(sessionId: string): Promise<ChatSession | null> {
+  async getSession(sessionId: string): Promise<any | null> {
     const query = new CloudQuery(ChatSession.className);
-    const result = await query.get(sessionId);
-    return result ? Object.assign(new ChatSession(), result) : null;
+    query.equalTo('objectId',sessionId)
+    const result = await query.first();
+    return result
   }
 
   // 更新会话

+ 15 - 14
AiStudy-app/src/app/services/database.service.ts

@@ -1,5 +1,6 @@
 import { Injectable } from '@angular/core';
 import Parse from 'parse';
+import { CloudQuery } from 'src/lib/ncloud';
 
 // 添加自定义教师接口
 export interface CustomTeacher {
@@ -51,7 +52,7 @@ export class DatabaseService {
   // 查询数据
   async query(className: string, conditions?: any) {
     try {
-      const query = new Parse.Query(className);
+      const query = new CloudQuery(className);
       if (conditions) {
         Object.keys(conditions).forEach(key => {
           query.equalTo(key, conditions[key]);
@@ -67,7 +68,7 @@ export class DatabaseService {
   // 更新数据
   async update(className: string, objectId: string, data: any) {
     try {
-      const query = new Parse.Query(className);
+      const query = new CloudQuery(className);
       const object = await query.get(objectId);
       Object.keys(data).forEach(key => {
         object.set(key, data[key]);
@@ -82,7 +83,7 @@ export class DatabaseService {
   // 删除数据
   async delete(className: string, objectId: string) {
     try {
-      const query = new Parse.Query(className);
+      const query = new CloudQuery(className);
       const object = await query.get(objectId);
       return await object.destroy();
     } catch (error) {
@@ -109,11 +110,11 @@ export class DatabaseService {
   // 获取用户的自定义教师列表
   async getUserCustomTeachers(userId: string): Promise<CustomTeacher[]> {
     try {
-      const query = new Parse.Query('CustomTeacher');
+      const query = new CloudQuery('CustomTeacher');
       query.equalTo('userId', userId);
-      query.ascending('createdAt');
-      const results = await query.find();
-      return results.map(obj => ({
+      // query.ascending('createdAt');
+      const results:any = await query.find();
+      return results.map((obj:any) => ({
         objectId: obj.id,
         userId: obj.get('userId'),
         name: obj.get('name'),
@@ -161,7 +162,7 @@ export class DatabaseService {
   // 更新自定义教师
   async updateCustomTeacher(objectId: string, teacherData: Partial<CustomTeacher>): Promise<CustomTeacher> {
     try {
-      const query = new Parse.Query('CustomTeacher');
+      const query = new CloudQuery('CustomTeacher');
       const teacher = await query.get(objectId);
       
       // 使用类型断言确保字段名是字符串
@@ -191,7 +192,7 @@ export class DatabaseService {
   // 删除自定义教师
   async deleteCustomTeacher(objectId: string): Promise<void> {
     try {
-      const query = new Parse.Query('CustomTeacher');
+      const query = new CloudQuery('CustomTeacher');
       const teacher = await query.get(objectId);
       await teacher.destroy();
     } catch (error) {
@@ -223,9 +224,9 @@ export class DatabaseService {
 
   async getChatSessions(userId: string) {
     try {
-      const query = new Parse.Query('ChatSession');
+      const query = new CloudQuery('ChatSession');
       query.equalTo('userId', userId);
-      query.descending('updatedAt'); // 按更新时间降序排序
+      // query.descending('updatedAt'); // 按更新时间降序排序
       return await query.find();
     } catch (error) {
       console.error('Error getting chat sessions:', error);
@@ -235,7 +236,7 @@ export class DatabaseService {
 
   async getChatSession(sessionId: string) {
     try {
-      const query = new Parse.Query('ChatSession');
+      const query = new CloudQuery('ChatSession');
       return await query.get(sessionId);
     } catch (error) {
       console.error('Error getting chat session:', error);
@@ -245,7 +246,7 @@ export class DatabaseService {
 
   async updateChatSession(sessionId: string, updateData: Partial<ChatSessionData>) {
     try {
-      const query = new Parse.Query('ChatSession');
+      const query = new CloudQuery('ChatSession');
       const session = await query.get(sessionId);
       
       // 使用类型断言确保字段名是字符串
@@ -265,7 +266,7 @@ export class DatabaseService {
 
   async deleteChatSession(sessionId: string) {
     try {
-      const query = new Parse.Query('ChatSession');
+      const query = new CloudQuery('ChatSession');
       const session = await query.get(sessionId);
       return await session.destroy();
     } catch (error) {

+ 34 - 34
AiStudy-app/src/app/tab1/tab1.page.html

@@ -1,40 +1,15 @@
 <ion-header [translucent]="true">
-  <div class="teacher-selector">
-    <ion-button fill="clear" id="select-teacher">
-      <div class="teacher-info">
-        <ion-icon name="person-circle-outline" class="teacher-icon"></ion-icon>
-        <div class="teacher-name">{{ selectedTeacher.name }}</div>
-        <div class="teacher-description">{{ selectedTeacher.description }}</div>
-      </div>
-    </ion-button>
-
-    <ion-modal trigger="select-teacher" [breakpoints]="[0, 0.5]" [initialBreakpoint]="0.5">
-      <ng-template>
-        <ion-content>
-          <ion-list>
-            <ion-item *ngFor="let teacher of teachers" (click)="selectTeacher(teacher)" [class.selected]="teacher.id === selectedTeacher.id">
-              <div class="teacher-list-item">
-                <ion-icon [name]="teacher.id === 'custom' ? 'add-circle-outline' : 'person-circle-outline'" class="teacher-icon"></ion-icon>
-                <div class="teacher-details">
-                  <div class="teacher-name">{{ teacher.name }}</div>
-                  <div class="teacher-description">{{ teacher.description }}</div>
-                </div>
-                <ion-button *ngIf="teacher.isCustom" 
-                          fill="clear" 
-                          slot="end" 
-                          (click)="editTeacher($event, teacher.objectId!)">
-                  <ion-icon name="create-outline"></ion-icon>
-                </ion-button>
-              </div>
-            </ion-item>
-          </ion-list>
-        </ion-content>
-      </ng-template>
-    </ion-modal>
-  </div>
   <ion-toolbar>
     <ion-title>
-      对话
+      <div id="select-teacher">
+        <div class="teacher-info" style="display:flex;flex-direction: column;min-height: 50px;">
+          <div style="display:flex;">
+            <ion-icon name="person-circle-outline" class="teacher-icon"></ion-icon>
+            <div class="teacher-name">{{ selectedTeacher.name }}</div>
+          </div>
+          <div class="teacher-description">{{ selectedTeacher.description }}</div>
+        </div>
+      </div>
     </ion-title>
     <ion-buttons slot="end">
       <ion-button 
@@ -105,3 +80,28 @@
     </ion-item>
   </ion-toolbar>
 </ion-footer>
+
+
+<ion-modal trigger="select-teacher" [breakpoints]="[0, 0.5]" [initialBreakpoint]="0.5">
+  <ng-template>
+    <ion-content>
+      <ion-list>
+        <ion-item *ngFor="let teacher of teachers" (click)="selectTeacher(teacher)" [class.selected]="teacher.id === selectedTeacher.id">
+          <div class="teacher-list-item">
+            <ion-icon [name]="teacher.id === 'custom' ? 'add-circle-outline' : 'person-circle-outline'" class="teacher-icon"></ion-icon>
+            <div class="teacher-details">
+              <div class="teacher-name">{{ teacher.name }}</div>
+              <div class="teacher-description">{{ teacher.description }}</div>
+            </div>
+            <ion-button *ngIf="teacher.isCustom" 
+                      fill="clear" 
+                      slot="end" 
+                      (click)="editTeacher($event, teacher.objectId!)">
+              <ion-icon name="create-outline"></ion-icon>
+            </ion-button>
+          </div>
+        </ion-item>
+      </ion-list>
+    </ion-content>
+  </ng-template>
+</ion-modal>

+ 5 - 1
AiStudy-app/src/lib/ncloud.ts

@@ -131,7 +131,11 @@ export class CloudQuery {
         });
 
         const json = await response?.json();
-        return json || {};
+        // if (json) {
+        //     let existsObject = this.dataToObj(json)
+        //     return existsObject;
+        // }
+        return json || {}
     }
 
     async find():Promise<Array<CloudObject>> {