Ver Fonte

fix:color

yf há 5 meses atrás
pai
commit
914dd9f465

+ 40 - 31
dream-app/src/app/page-dream-analysis/page-dream-analysis.component.html

@@ -1,38 +1,47 @@
-<ion-content>
+<ion-header>
+  <ion-toolbar>
+    <ion-title>
+      <ion-icon name="moon" slot="start"></ion-icon>
+      梦境解析
+    </ion-title>
+  </ion-toolbar>
+</ion-header>
 
-  <h1>梦境背景</h1>
-  <ion-input 
-    [value]="background" 
-    (ionInput)="backgroundInput($event)">
-  </ion-input>
+<ion-content>
+  <ion-item>
+    <ion-label position="stacked">梦境背景</ion-label>
+    <ion-input
+      [value]="background"
+      (ionInput)="backgroundInput($event)">
+    </ion-input>
+  </ion-item>
 
-  <!-- 文本域:生成提示词 -->
-  <h1>梦境描述</h1>
-  <ion-textarea 
-    [value]="userPrompt" 
-    (ionInput)="promptInput($event)" 
-    placeholder="请描述您的梦境" 
-    autoGrow="true">
-  </ion-textarea>
+  <ion-item>
+    <ion-label position="stacked">梦境描述</ion-label>
+    <ion-textarea
+      [value]="userPrompt"
+      (ionInput)="promptInput($event)"
+      placeholder="请详细描述您的梦境内容"
+      autoGrow="true">
+    </ion-textarea>
+  </ion-item>
 
-  <!-- 按钮:执行消息生成函数 -->
-  <ion-button 
-    (click)="sendMessage()" 
-    expand="block">
-    梦境分析
+  <ion-button
+    (click)="sendMessage()"
+    expand="block"
+    color="secondary">
+    <ion-icon name="analytics" slot="start"></ion-icon>
+    开始解析
   </ion-button>
-    
-  <!-- 展示:返回消息内容 -->
-  <div>{{responseMsg}}</div>
 
-  <!-- 使用 *ngIf 进行条件渲染 -->
-  <fm-markdown-preview 
-    *ngIf="isComplete" 
-    class="content-style" 
-    [content]="responseMsg">
-  </fm-markdown-preview>
+  <!-- 加载动画,仅在 isLoading 为 true 时显示 -->
+  <div *ngIf="isLoading" class="loading-container">
+    <ion-spinner name="crescent"></ion-spinner>
+    <p>正在解析您的梦境,请稍候...</p>
+  </div>
 
-  <!-- 显示加载指示器,当消息未完成时 -->
-  <ion-spinner *ngIf="!isComplete"></ion-spinner>
-  
+  <!-- 结果显示,仅在 isComplete 为 true 时显示 -->
+  <div *ngIf="isComplete" class="response-container">
+    <fm-markdown-preview [content]="responseMsg"></fm-markdown-preview>
+  </div>
 </ion-content>

+ 108 - 0
dream-app/src/app/page-dream-analysis/page-dream-analysis.component.scss

@@ -0,0 +1,108 @@
+:root {
+    --ion-color-primary: #4b0082;
+    --ion-color-secondary: #800080;
+    --ion-color-tertiary: #ee82ee;
+    --ion-color-light-bg: #f8f0ff;
+    --ion-color-input-bg: rgba(255, 255, 255, 0.8);
+  }
+  
+  ion-content {
+    --background: none;
+    background: linear-gradient(to bottom, #4b0082, #800080, #ee82ee);
+    position: relative;
+  }
+  
+  
+  ion-content::before {
+    content: '';
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.3);
+    pointer-events: none;
+    z-index: 2;
+  }
+  
+  ion-content > * {
+    position: relative;
+    z-index: 3;
+  }
+  
+  @keyframes twinkling {
+    0% { opacity: 0.8; }
+    50% { opacity: 0.2; }
+    100% { opacity: 0.8; }
+  }
+  
+  body {
+    font-family: '思源黑体', '微软雅黑', '苹方', sans-serif;
+    background-color: var(--ion-color-light-bg);
+    color: #333;
+  }
+  
+  ion-header {
+    --background: var(--ion-color-primary);
+    color: var(--ion-color-primary-contrast);
+  }
+  
+  ion-toolbar {
+    --background: transparent;
+  }
+  
+  ion-title {
+    font-size: 1.5rem;
+    font-weight: bold;
+    display: flex;
+    align-items: center;
+  }
+  
+  ion-title ion-icon {
+    margin-right: 8px;
+  }
+  
+  ion-item {
+    --background: var(--ion-color-input-bg);
+    border-radius: 8px;
+    margin-bottom: 16px;
+  }
+  
+  ion-input,
+  ion-textarea {
+    --padding-start: 12px;
+    --padding-end: 12px;
+  }
+  
+  ion-button {
+    --background: var(--ion-color-secondary);
+    --border-radius: 8px;
+    --padding-vertical: 10px;
+    --padding-horizontal: 20px;
+    font-weight: bold;
+    color: var(--ion-color-primary-contrast);
+    margin-top: 20px;
+  }
+  
+  .loading-container {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+    margin-top: 20px;
+    color: var(--ion-color-secondary);
+  }
+  
+  .response-container {
+    background-color: rgba(255, 255, 255, 0.8);
+    border-radius: 8px;
+    padding: 16px;
+    margin-top: 20px;
+    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+  }
+  
+  fm-markdown-preview {
+    font-size: 1rem;
+    line-height: 1.5;
+    color: #444;
+  }

+ 38 - 34
dream-app/src/app/page-dream-analysis/page-dream-analysis.component.ts

@@ -1,41 +1,51 @@
 import { CommonModule } from '@angular/common';
-import { Component, OnInit } from '@angular/core';
-import { IonButton, IonContent, IonHeader, IonInput, IonSpinner, IonTextarea, IonTitle, IonToolbar } from '@ionic/angular/standalone';
-/** 引用:从fmode-ng库引用FmodeChatCompletion类 */
+import { Component, OnInit, ViewEncapsulation } from '@angular/core';
+import {
+  IonButton,
+  IonContent,
+  IonHeader,
+  IonIcon,
+  IonInput,
+  IonItem,
+  IonLabel,
+  IonSpinner,
+  IonTextarea,
+  IonTitle,
+  IonToolbar,
+} from '@ionic/angular/standalone';
 import { FmodeChatCompletion, MarkdownPreviewModule } from 'fmode-ng';
 
 @Component({
   selector: 'app-page-dream-analysis',
   templateUrl: './page-dream-analysis.component.html',
   styleUrls: ['./page-dream-analysis.component.scss'],
+  encapsulation: ViewEncapsulation.None, // 添加这一行
   standalone: true,
   imports: [
-    IonHeader, 
-    IonToolbar, 
-    IonTitle, 
-    IonContent, 
+    IonHeader,
+    IonToolbar,
+    IonTitle,
+    IonIcon,
+    IonContent,
     IonButton,
     IonTextarea,
     IonInput,
+    IonItem,
+    IonLabel,
     IonSpinner,
     MarkdownPreviewModule,
-    CommonModule
+    CommonModule,
   ],
 })
 export class PageDreamAnalysisComponent implements OnInit {
-  // 用户输入提示词
-  background: string = "梦境背景";
-  userPrompt: string = "请描述您的梦境内容";
-
-  // 属性:组件内用于展示消息内容的变量
-  responseMsg: string = "";
+  background: string = '梦境背景';
+  userPrompt: string = '请描述您的梦境内容';
+  responseMsg: string = '';
   isComplete: boolean = false;
-
-  constructor() {}
+  isLoading: boolean = false; // 新增
 
   ngOnInit(): void {}
 
-  // 用户输入处理
   backgroundInput(event: CustomEvent) {
     this.background = event.detail.value;
   }
@@ -44,38 +54,32 @@ export class PageDreamAnalysisComponent implements OnInit {
     this.userPrompt = event.detail.value;
   }
 
-  // 发送消息方法
   sendMessage() {
-    this.isComplete = false; // 开始发送,重置完成状态
-    console.log("创建消息模板");
-
+    this.isComplete = false;
+    this.isLoading = true; // 开始加载
     const PromptTemplate = `
-      对于最近发生的${this.background},请你作为一名解梦师,请根据用户对于梦境的描述,给用户一些解释和建议。
+      对于最近发生的${this.background},请你作为一名解梦师,根据用户的梦境描述,给出一些解释和建议。
       以下是用户的梦境:${this.userPrompt}
     `;
 
-    console.log('PromptTemplate:', PromptTemplate); // 添加日志
-
     const completion = new FmodeChatCompletion([
-      { role: "system", content: "你是一名专业的解梦师。" }, // 可选的系统提示
-      { role: "user", content: PromptTemplate }
+      { role: 'system', content: '你是一名专业的解梦师。' },
+      { role: 'user', content: PromptTemplate },
     ]);
 
     completion.sendCompletion().subscribe(
       (message: any) => {
-        // 打印消息体
-        console.log("AI 回复:", message.content);
-        // 赋值消息内容给组件内属性
         this.responseMsg = message.content;
         if (message?.complete) {
-          this.isComplete = true;
+          this.isLoading = false; // 加载结束
+          this.isComplete = true; // 解析完成
         }
       },
       (error: any) => {
-        // 处理错误
-        console.error("AI 回复错误:", error);
-        this.responseMsg = "抱歉,发生了错误。请稍后再试。";
-        this.isComplete = true; // 根据需求设置
+        console.error('AI 回复错误:', error);
+        this.responseMsg = '抱歉,发生了错误。请稍后再试。';
+        this.isLoading = false; // 加载结束
+        this.isComplete = true;
       }
     );
   }