s202226701053 пре 6 месеци
родитељ
комит
1e51b9df55
24 измењених фајлова са 238 додато и 158 уклоњено
  1. 9 8
      E-Cover-app/src/agent/tasks/generate/generate-picture.ts
  2. 2 2
      E-Cover-app/src/agent/tasks/generate/generate-prompt.ts
  3. 0 5
      E-Cover-app/src/app/app.routes.ts
  4. 0 2
      E-Cover-app/src/app/chat-content/chat-content.component.ts
  5. 0 8
      E-Cover-app/src/app/chat-panel/chat-panel.component.html
  6. 0 33
      E-Cover-app/src/app/chat-panel/chat-panel.component.scss
  7. 0 22
      E-Cover-app/src/app/chat-panel/chat-panel.component.spec.ts
  8. 0 37
      E-Cover-app/src/app/chat-panel/chat-panel.component.ts
  9. 0 1
      E-Cover-app/src/app/generate-option/generate-option.component.html
  10. 10 6
      E-Cover-app/src/app/generate-option/generate-option.component.ts
  11. 2 2
      E-Cover-app/src/app/generate-result/generate-result.component.html
  12. 9 0
      E-Cover-app/src/app/generate-result/generate-result.component.scss
  13. 2 1
      E-Cover-app/src/app/settings/settings.component.ts
  14. 2 2
      E-Cover-app/src/app/tab1/tab1.page.html
  15. 9 1
      E-Cover-app/src/app/tab1/tab1.page.ts
  16. 3 2
      E-Cover-app/src/app/tab3/tab3.page.ts
  17. 2 2
      E-Cover-app/src/app/user-info/user-info.component.ts
  18. 7 7
      E-Cover-app/src/lib/user/modal-user-edit/modal-user-edit.component.ts
  19. 3 3
      E-Cover-app/src/lib/user/modal-user-login-main/modal-user-login-main.component.ts
  20. 1 1
      E-Cover-app/src/lib/user/modal-user-login/modal-user-login.component.html
  21. 6 0
      E-Cover-app/src/lib/user/modal-user-login/modal-user-login.component.scss
  22. 3 3
      E-Cover-app/src/lib/user/modal-user-login/modal-user-login.component.ts
  23. 83 10
      E-Cover-prod/UMLprod/diagram.puml
  24. 85 0
      E-Cover-prod/UMLprod/test.md

+ 9 - 8
E-Cover-app/src/agent/tasks/generate/generate-picture.ts

@@ -19,16 +19,17 @@ export function TaskGeneratePicture(options: {
             let imagineWork = new ImagineWork();
             // 图片生成
             const designPrompt = JSON.stringify(options.shareData.designPrompt);
-            let PicturePrompt = `您是一名专业的模特摄影师,请根据用户数据,精准地拍出穿搭效果图。
-                以下是用户的数据:${designPrompt}
+            let cloth=options.shareData.designPrompt['schemeList'];
+            const clothPrompt = JSON.stringify(cloth);
+            let PicturePrompt = `您是一名服装搭配师,请根据客户信息,搭配出穿搭效果图。
+                以下是穿搭和信息:${designPrompt}
                 有一些注意事项是你需要注意的:
                 1.图片的规格为:高 (1024x1792)应该是垂直方向的,请尽量保持这个比例。图片内容不要超过范围。
-                2.客户模特一定要用正确的年龄段,不要给你的是20岁,你用30多岁的人当模特,这是不行的。
-                3.客户的自定义描述极度重要,请务必按照客户的描述来拍摄。
-                4.客户模特一定要用正确的体型。比如客户是80kg,你找个瘦子当模特,这是不行的,一定是体型肥胖的。
-                5.照片结构整齐一些,不要有太多凌乱的感觉。左半边只需要一张整体预览,右半边找画师画出schemeList中服装的细节图。
-                6.客户模特脸部需要遮挡,不要露出脸部。
-                7.照片和画师画的细节图,一定都要分布在正方形的画布上,不要超出范围。`
+                2.客户一定要用正确的年龄段,不要给你的是20岁,你用30多岁的人当模特,这是不行的。
+                3.客户的自定义描述极度重要,请务必按照模特的描述来拍摄。
+                4.模特一定要用正确的体型。比如模特是80kg,你找个瘦子当模特,这是不行的,一定是体型肥胖的。
+                5.图片结构整齐一些,不要有太多凌乱的感觉。左半边只需要一张整体预览,右半边展示schemeList中服装的细节图。
+                6.搭配效果图和服装细节图,一定都要分布在正方形的画布上,不要超出范围。`
             console.log(PicturePrompt);
             let imgOptions: DalleOptions = { prompt: PicturePrompt }
             let countDownInt = setInterval(() => {

+ 2 - 2
E-Cover-app/src/agent/tasks/generate/generate-prompt.ts

@@ -25,8 +25,8 @@ export function TaskGeneratePrompt(options: {
                 ......
                 (传入的json中有什么属性就翻译一下,补上什么)
                 "schemeList":{
-                    "上衣":["name":"上衣特征描述(简洁,例如:轻薄短袖衬衫)","desc":"穿搭思路描述(具体,例如:选择一款轻薄透气的短袖衬衫,颜色可以是浅蓝色或淡灰色,搭配细条纹或小格纹图案,以增加层次感。衬衫的剪裁要稍微宽松,以便于活动,适合办公室环境。)"],
-                    "下装":["name":"下装特征描述","desc":"穿搭思路描述"],
+                    "短袖":["name":"特征描述(简洁,例如:轻薄短袖衬衫)","desc":"穿搭思路描述(具体,例如:选择一款轻薄透气的短袖衬衫,颜色可以是浅蓝色或淡灰色,搭配细条纹或小格纹图案,以增加层次感。衬衫的剪裁要稍微宽松,以便于活动,适合办公室环境。)"],
+                    "牛仔裤":["name":"特征描述","desc":"穿搭思路描述"],
                     ......
                 }
             }

+ 0 - 5
E-Cover-app/src/app/app.routes.ts

@@ -11,11 +11,6 @@ export const routes: Routes = [
     loadComponent: () =>
       import('./generate-option/generate-option.component').then((m) => m.GenerateOptionComponent),
   },
-  {
-    path: 'chatPanel',
-    loadComponent: () =>
-      import('./chat-panel/chat-panel.component').then((m) => m.ChatPanelComponent),
-  },
   {
     path: 'generateResult/:resultId',
     loadComponent: () =>

+ 0 - 2
E-Cover-app/src/app/chat-content/chat-content.component.ts

@@ -39,9 +39,7 @@ console.log("解析后的聊天记录", this.selectedChat);
   }
 
   goBack() {
-
     this.navCtrl.back(); // 返回上一页
-  
     }
 
 }

+ 0 - 8
E-Cover-app/src/app/chat-panel/chat-panel.component.html

@@ -1,8 +0,0 @@
-<!--头部内容,包含标题和返回按钮-->
-<ion-header>
-  <div class="header-container">
-    <ion-icon name="arrow-back-outline" size="large" class="back-icon" (click)="goBack()"></ion-icon>
-    <p class="header-title">个性化生成</p>
-  </div>
-</ion-header>
-<!-- fmode聊天组件 -->

+ 0 - 33
E-Cover-app/src/app/chat-panel/chat-panel.component.scss

@@ -1,33 +0,0 @@
-ion-header {
-  background-color: #f8f8f8;
-  padding: 10px;
-  padding-top: 30px;
-  color: black;
-  height: 60px;
-  box-shadow: none;
-
-  .header-container {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    position: relative;
-    height: 100%;
-    /* 确保容器占满整个 header 高度 */
-    padding: 10px;
-  }
-
-  .back-icon {
-    position: absolute;
-    left: 10px;
-    /* 图标距左侧的距离 */
-    cursor: pointer;
-  }
-
-  .header-title {
-    font-size: 18px;
-    /* 根据需要调整字体大小 */
-    font-weight: bold;
-    /* 可选,加粗字体 */
-    margin: 0;
-  }
-}

+ 0 - 22
E-Cover-app/src/app/chat-panel/chat-panel.component.spec.ts

@@ -1,22 +0,0 @@
-import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-
-import { ChatPanelComponent } from './chat-panel.component';
-
-describe('ChatPanelComponent', () => {
-  let component: ChatPanelComponent;
-  let fixture: ComponentFixture<ChatPanelComponent>;
-
-  beforeEach(waitForAsync(() => {
-    TestBed.configureTestingModule({
-      imports: [ChatPanelComponent],
-    }).compileComponents();
-
-    fixture = TestBed.createComponent(ChatPanelComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  }));
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-});

+ 0 - 37
E-Cover-app/src/app/chat-panel/chat-panel.component.ts

@@ -1,37 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-import { IonicModule } from '@ionic/angular';
-import { FormsModule } from '@angular/forms';
-import { CommonModule } from '@angular/common';
-import { ActivatedRoute, Router } from '@angular/router';
-import { ChatPanelOptions, FmodeChat, openChatPanelModal } from 'fmode-ng';
-import { ModalController, NavController } from '@ionic/angular/standalone';
-
-
-@Component({
-  selector: 'app-chat-panel',
-  templateUrl: './chat-panel.component.html',
-  styleUrls: ['./chat-panel.component.scss'],
-  standalone: true,
-  imports: [IonicModule, FormsModule, CommonModule],
-})
-export class ChatPanelComponent implements OnInit {
-  constructor(private route: ActivatedRoute,private modalCtrl:ModalController,private navCtrl:NavController) { }
-  ngOnInit() { this.openGenerate() }
-  goBack() {
-    this.navCtrl.back();
-  }
-  /**
-   * @打开聊天窗口
-   * 打开fmode聊天窗口的页面
-   */
-  openGenerate(){
-    let options:ChatPanelOptions = {
-      roleId:"2DXJkRsjXK",
-      onChatSaved:(chat:FmodeChat)=>{
-        // chat?.chatSession?.id 本次会话的 chatId
-        console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
-      },
-    }
-    openChatPanelModal(this.modalCtrl,options)
-  }
-}

+ 0 - 1
E-Cover-app/src/app/generate-option/generate-option.component.html

@@ -114,7 +114,6 @@
 
   <ion-button (click)="sendMsgAndGoGenerateResult()">生成</ion-button>
   <ion-button>导入默认风格</ion-button>
-  <ion-button (click)="goChatPanel()">测试页面</ion-button>
 </ion-content>
 
 <!--处理动画,默认隐藏-->

+ 10 - 6
E-Cover-app/src/app/generate-option/generate-option.component.ts

@@ -1,7 +1,7 @@
 import { CommonModule } from '@angular/common';
 import { Component, OnInit } from '@angular/core';
 import { Router } from '@angular/router';
-import { IonicModule, NavController, ModalController } from '@ionic/angular';
+import { NavController, ModalController, IonicModule } from '@ionic/angular';
 import { addIcons } from 'ionicons';
 import { arrowBackOutline, checkmarkCircleOutline, closeCircleOutline, radioButtonOffOutline, reload, reloadOutline } from 'ionicons/icons';
 import { FormsModule } from '@angular/forms';
@@ -12,13 +12,17 @@ import { TaskGeneratePrompt } from 'src/agent/tasks/generate/generate-prompt';
 import { TaskGeneratePicture } from 'src/agent/tasks/generate/generate-picture';
 import { CloudQuery, CloudUser } from 'src/lib/ncloud';
 import { CustomHeaderComponent } from 'src/lib/component/custom-header/custom-header.component';
+import { IonButton, IonCard, IonContent, IonIcon, IonImg, IonText, IonTextarea } from '@ionic/angular/standalone';
 addIcons({ 'arrow-back-outline': arrowBackOutline, radioButtonOffOutline, closeCircleOutline, checkmarkCircleOutline, reloadOutline });
 @Component({
   selector: 'app-generate-option',
   templateUrl: './generate-option.component.html',
   styleUrls: ['./generate-option.component.scss'],
   standalone: true,
-  imports: [CustomHeaderComponent, IonicModule, CommonModule, FormsModule],
+  imports: [CustomHeaderComponent, CommonModule, FormsModule, IonButton, IonCard, IonIcon,
+    IonImg, IonText, IonTextarea, IonContent
+  ],
+  providers: [ModalController],
 })
 export class GenerateOptionComponent implements OnInit {
   /**
@@ -197,8 +201,8 @@ export class GenerateOptionComponent implements OnInit {
       // 将选中的键对应的值设置为 true
       option[selectedKey] = true;
       // 更新 userProfile 中的对应字段
-      this.userProfile[name as keyof UserProfile] = selectedKey;
-    }else{
+      this.userProfile[name as keyof UserProfile] = selectedKey + ":" + this.description[selectedKey];
+    } else {
       option[selectedKey] = false;
       this.userProfile[name as keyof UserProfile] = '不限制';
     }
@@ -265,14 +269,14 @@ export class GenerateOptionComponent implements OnInit {
     let query = new CloudQuery("GenerateResult");
     let user = new CloudUser();
     query.equalTo("UserID", user.id);
-    let result:any = await query.find();
+    let result: any = await query.find();
     //按照ruslt中的careatedAt字段(string)进行排序
     result.sort((a: { createdAt: string | number | Date; }, b: { createdAt: string | number | Date; }) => {
       return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
     });
     result = result[0];
     console.log(result);
-    this.router.navigate(['generateResult',result?.id]);
+    this.router.navigate(['generateResult', result?.id]);
   }
   /**
    * @风格描述下的帮助文本点击事件

+ 2 - 2
E-Cover-app/src/app/generate-result/generate-result.component.html

@@ -8,8 +8,8 @@
     <ion-card id="show">
         <ion-label>{{jsonData['方案名']}}</ion-label>
         <ion-card *ngFor="let key of keys">
-            <ion-label>{{jsonData['schemeList'][key]['name']}}</ion-label>
-            <ion-label>{{jsonData['schemeList'][key]['desc']}}</ion-label>
+            <ion-label class="name">{{jsonData['schemeList'][key]['name']}}</ion-label>
+            <ion-label class="desc">{{jsonData['schemeList'][key]['desc']}}</ion-label>
         </ion-card>
     </ion-card>
 </ion-content>

+ 9 - 0
E-Cover-app/src/app/generate-result/generate-result.component.scss

@@ -44,6 +44,15 @@ ion-content {
             width: 95%;
             height: auto;
             margin: 2%;
+
+            .name{
+                margin: 15px;
+            }
+
+            .desc{
+                text-align: start;
+                text-indent: 40px;
+            }
         }
     }
 }

+ 2 - 1
E-Cover-app/src/app/settings/settings.component.ts

@@ -1,6 +1,7 @@
 import { Component, OnInit } from '@angular/core';
 import { Router, RouterModule } from '@angular/router';
 import { IonicModule, NavController } from '@ionic/angular';
+import { IonContent, IonHeader, IonIcon } from '@ionic/angular/standalone';
 import { addIcons } from 'ionicons';
 import { arrowBackOutline, bagRemoveOutline, chevronForwardOutline, closeCircleOutline, createOutline, handRightOutline, informationCircleOutline, lockOpenOutline, logOutOutline, shieldCheckmarkOutline, skullOutline } from 'ionicons/icons';
 import { CloudUser } from 'src/lib/ncloud';
@@ -13,7 +14,7 @@ addIcons({
   templateUrl: './settings.component.html',
   styleUrls: ['./settings.component.scss'],
   standalone: true,
-  imports: [IonicModule, RouterModule]
+  imports: [IonContent, IonIcon, IonHeader, RouterModule]
 })
 export class SettingsComponent implements OnInit {
   currentUser: CloudUser | undefined;

+ 2 - 2
E-Cover-app/src/app/tab1/tab1.page.html

@@ -72,12 +72,12 @@
     <ion-segment-view>
         <ion-segment-content id="first">
             <div class="segment-content">
-                <img *ngFor="let item of items" [src]="item?.get('image')" />
+                <img *ngFor="let item of items" [src]="item?.get('image')" (click)="recommend(item)"/>
             </div>
         </ion-segment-content>
         <ion-segment-content id="second">
             <div class="segment-content">
-                <img *ngFor="let item of recommendItems" [src]="item?.get('ItemID')?.image" />
+                <img *ngFor="let item of mostlikeItems" [src]="item?.get('ItemID')?.image" />
             </div>
         </ion-segment-content>
     </ion-segment-view>

+ 9 - 1
E-Cover-app/src/app/tab1/tab1.page.ts

@@ -79,6 +79,7 @@ export class Tab1Page {
   currentUser: CloudUser = new CloudUser();
   recommendItems: CloudObject[] | any = [];
   alreadyItems: CloudObject[] | any = [];
+  mostlikeItems: CloudObject[] | any = [];
   async getAllItem() {
     let query = new CloudQuery("UserPrefer");
     query.include("UserID");
@@ -86,6 +87,9 @@ export class Tab1Page {
     query.equalTo("UserID", this.currentUser.toPointer());
     this.recommendItems = await query.find();
     this.recommendItems.sort((a: { get: (arg0: string) => number; }, b: { get: (arg0: string) => number; }) => b.get('preference') - a.get('preference'));
+    this.mostlikeItems = this.recommendItems.slice(0, 7);
+    console.log("读取所有偏好信息成功:")
+    console.log(this.recommendItems);
   }
   async getRecommendItem() {
     let tempItems: CloudObject[] | any = [];
@@ -96,11 +100,13 @@ export class Tab1Page {
       if (list1.length > 0) {
         let index = Math.floor(Math.random() * list1.length);
         tempItems.push(list1[index]);
+        console.log("推荐"+list1[index]?.id+"成功")
         list1.splice(index, 1);
       }
       if (list2.length > 0) {
         let index = Math.floor(Math.random() * list2.length);
         tempItems.push(list2[index]);
+        console.log("推荐"+list1[index]?.id+"成功")
         list2.splice(index, 1);
       }
     }
@@ -117,8 +123,10 @@ export class Tab1Page {
     console.log(this.alreadyItems);
   }
   async recommend(item: CloudObject) {
+    console.warn("检测到点击物品:")
+    console.log(item);
     let newItem = new CloudQuery("ItemInfo");
-    newItem.equalTo("objectId", item?.get("ItemID")?.objectId);
+    newItem.equalTo("objectId", item?.id);
     const newitem = await newItem.find();
     console.log(newitem);
     let recommendService = new RecommendationService();

+ 3 - 2
E-Cover-app/src/app/tab3/tab3.page.ts

@@ -1,6 +1,6 @@
 import { Component } from '@angular/core';
 import { IonicModule } from '@ionic/angular';
-import { ModalController } from '@ionic/angular/standalone';
+import { IonAvatar, IonButton, IonCard, IonContent, IonIcon, IonImg, IonLabel, IonSegment, IonSegmentButton, IonSegmentContent, IonSegmentView, IonText, IonTitle, ModalController } from '@ionic/angular/standalone';
 import { CloudUser, CloudObject, CloudQuery } from 'src/lib/ncloud';
 import { Router } from '@angular/router';
 import { openUserLoginModal } from 'src/lib/user/modal-user-login/modal-user-login.component';
@@ -13,7 +13,8 @@ addIcons({ personAddOutline, cardOutline, flameOutline, chevronForwardOutline })
   templateUrl: 'tab3.page.html',
   styleUrls: ['tab3.page.scss'],
   standalone: true,
-  imports: [IonicModule, CommonModule],
+  imports: [IonIcon, IonContent, IonCard, IonLabel, IonSegment, IonSegmentButton, IonSegmentView,
+    CommonModule, IonSegmentContent, IonAvatar, IonImg, IonTitle, IonButton, IonText],
 })
 export class Tab3Page {
   currentUser: CloudUser | undefined;

+ 2 - 2
E-Cover-app/src/app/user-info/user-info.component.ts

@@ -1,6 +1,6 @@
 import { Component, OnInit } from '@angular/core';
 import { IonicModule, NavController } from '@ionic/angular';
-import { ModalController } from '@ionic/angular/standalone';
+import { IonContent, IonHeader, IonIcon, ModalController } from '@ionic/angular/standalone';
 import { addIcons } from 'ionicons';
 import { arrowBackOutline, chevronForwardOutline } from 'ionicons/icons';
 import { CloudUser } from 'src/lib/ncloud';
@@ -11,7 +11,7 @@ addIcons({ arrowBackOutline, chevronForwardOutline });
   templateUrl: './user-info.component.html',
   styleUrls: ['./user-info.component.scss'],
   standalone: true,
-  imports: [IonicModule]
+  imports: [IonHeader,IonContent,IonIcon]
 
 })
 export class UserInfoComponent implements OnInit {

+ 7 - 7
E-Cover-app/src/lib/user/modal-user-edit/modal-user-edit.component.ts

@@ -1,7 +1,7 @@
 import { Component, Input, OnInit } from '@angular/core';
 import { FormsModule } from '@angular/forms';
 import { IonicModule } from '@ionic/angular';
-import { ModalController } from '@ionic/angular/standalone';
+import { IonActionSheet, IonContent, IonHeader, IonIcon, IonInput, IonTextarea, ModalController } from '@ionic/angular/standalone';
 import { addIcons } from 'ionicons';
 import { arrowBackOutline } from 'ionicons/icons';
 import { CloudUser } from 'src/lib/ncloud';
@@ -11,7 +11,7 @@ addIcons({ arrowBackOutline })
   templateUrl: './modal-user-edit.component.html',
   styleUrls: ['./modal-user-edit.component.scss'],
   standalone: true,
-  imports: [IonicModule, FormsModule,],
+  imports: [IonHeader, IonIcon, IonActionSheet, IonContent, IonTextarea, FormsModule, IonInput],
 
 })
 export class ModalUserEditComponent implements OnInit {
@@ -49,7 +49,7 @@ export class ModalUserEditComponent implements OnInit {
    */
   public genderButtons = [
     {
-      text: '男', data:'男',
+      text: '男', data: '男',
     },
     {
       text: '女', data: '女',
@@ -59,17 +59,17 @@ export class ModalUserEditComponent implements OnInit {
     },
   ];
   logResult(ev: { detail: any; }) {
-    console.warn("-------------\n"+"触发点击事件");
+    console.warn("-------------\n" + "触发点击事件");
     console.log(JSON.stringify(ev.detail, null, 2));
     let gender = ev.detail.data;
-    this.currentUser?.set({gender: gender});
+    this.currentUser?.set({ gender: gender });
     console.log("保存对象如下:")
     console.log(this.currentUser);
     this.currentUser?.save();
     this.modalCtrl.dismiss(this.currentUser, 'confirm');
-    console.warn("方法执行完毕"+"\n-------------")
+    console.warn("方法执行完毕" + "\n-------------")
   }
-  
+
 
 }
 

+ 3 - 3
E-Cover-app/src/lib/user/modal-user-login-main/modal-user-login-main.component.ts

@@ -1,10 +1,10 @@
 import { Component, Input, OnInit } from '@angular/core';
 import { IonicModule } from '@ionic/angular';
-import { ModalController } from '@ionic/angular/standalone';
+import { IonButton, IonContent, IonIcon, IonInput, ModalController } from '@ionic/angular/standalone';
 import { CloudUser } from 'src/lib/ncloud';
 import { addIcons } from 'ionicons';
 import { arrowBackOutline, logoTux, logoWechat, phonePortraitOutline } from 'ionicons/icons';
-import { FormsModule } from '@angular/forms';
+import { FormsModule, } from '@angular/forms';
 import { HttpClient } from '@angular/common/http';
 addIcons({ arrowBackOutline, logoWechat, phonePortraitOutline, logoTux });
 
@@ -13,7 +13,7 @@ addIcons({ arrowBackOutline, logoWechat, phonePortraitOutline, logoTux });
   templateUrl: './modal-user-login-main.component.html',
   styleUrls: ['./modal-user-login-main.component.scss'],
   standalone: true,
-  imports: [IonicModule, FormsModule],
+  imports: [IonContent, IonIcon, IonButton, FormsModule, IonInput],
 })
 export class ModalUserLoginMainComponent implements OnInit {
   phoneNumber: string = "";

+ 1 - 1
E-Cover-app/src/lib/user/modal-user-login/modal-user-login.component.html

@@ -5,7 +5,7 @@
     <ion-icon name="phone-portrait-outline"></ion-icon>
     手机号注册
   </ion-button>
-  <ion-checkbox labelPlacement="end">我已阅读并同意<a href="#" (click)="$event.stopPropagation()">《用户协议》</a>和<a href="#"
+  <ion-checkbox labelPlacement="end" id="checkbox">我已阅读并同意<a href="#" (click)="$event.stopPropagation()">《用户协议》</a>和<a href="#"
       (click)="$event.stopPropagation()">《隐私政策》</a></ion-checkbox>
   <p>其他登录方式</p>
   <div id="other">

+ 6 - 0
E-Cover-app/src/lib/user/modal-user-login/modal-user-login.component.scss

@@ -54,4 +54,10 @@ div {
     margin: 30% auto;
     width: 70%;
     display: block;
+}
+
+#checkbox{
+    display: block;
+    margin-left:25px;
+    margin-right: 25px;
 }

+ 3 - 3
E-Cover-app/src/lib/user/modal-user-login/modal-user-login.component.ts

@@ -1,6 +1,6 @@
 import { Component, OnInit } from '@angular/core';
 import { IonicModule } from '@ionic/angular';
-import { ModalController } from '@ionic/angular/standalone';
+import { IonButton, IonCheckbox, IonContent, IonIcon, IonInput, ModalController } from '@ionic/angular/standalone';
 import { CloudUser } from 'src/lib/ncloud';
 import { addIcons } from 'ionicons';
 import { arrowBackOutline, logoWechat, personOutline, phonePortraitOutline } from 'ionicons/icons';
@@ -11,7 +11,7 @@ addIcons({ arrowBackOutline, logoWechat, phonePortraitOutline, personOutline });
   templateUrl: './modal-user-login.component.html',
   styleUrls: ['./modal-user-login.component.scss'],
   standalone: true,
-  imports: [IonicModule,],
+  imports: [IonButton, IonIcon, IonInput, IonContent, IonCheckbox],
 })
 export class ModalUserLoginComponent implements OnInit {
   constructor(private modalCtrl: ModalController) { }
@@ -42,7 +42,7 @@ export class ModalUserLoginComponent implements OnInit {
       console.log("即将关闭loginMain模态并返回用户");
       setTimeout(async () => {
         await this.modalCtrl.dismiss(user, "confirm");
-        
+
       }, 500); // 延迟500毫秒
     } else {
       await this.modalCtrl.dismiss(null, "cancel"); // 关闭主模态

+ 83 - 10
E-Cover-prod/UMLprod/diagram.puml

@@ -1,14 +1,87 @@
 ```plantuml
+
 @startuml
-|用户|
-start
-:请求服务;
-|系统|
-:读取偏好;
-:推荐算法生成结果;
-:推送主界面;
-|用户|
-:展示结果;
-stop
+entity "用户表" as User {
+    + objectId: String
+    + createdAt: Date
+    + fans: Number
+    + gender: String
+    + UserID: String
+    + name: String
+    + phone: String
+    + username: String
+    + like: Number
+    + signatuer: String
+    + avatar: String
+    + age: String
+    + subscription: Number
+}
+
+entity "个性化生成结果表" as GeneratedResult {
+    + objectId: String
+    + createdAt: Date
+    + image: String
+    + content: String
+    + UserID: Pointer<_User>
+}
+
+entity "物品表" as Item {
+    + objectId: String
+    + createdAt: Date
+    + image: String
+    + name: String
+    + tag: Array
+    + click: Number
+}
+
+entity "用户偏好表" as UserPreference {
+    + objectId: String
+    + createdAt: Date
+    + ItemID: Pointer
+    + preference: Number
+    + UserID: Pointer<_User>
+}
+
+entity "评论表" as Comment {
+    + objectId: String
+    + createdAt: Date
+    + postID: Pointer
+    + content: String
+    + UserID: Pointer<_User>
+}
+
+entity "帖子表" as Post {
+    + objectId: String
+    + createdAt: Date
+    + like: Number
+    + content: String
+    + UserID: Pointer<_User>
+    + title: String
+    + tag: Array
+    + image: Array
+}
+
+entity "话题表" as Topic {
+    + objectId: String
+    + createdAt: Date
+    + name: String
+    + click: Number
+}
+
+entity "聊天记录表" as Chat {
+    + objectId: String
+    + createdAt: Date
+    + content: Array
+    + user: Pointer<_User>
+}
+
+User -- GeneratedResult : 1..*
+User -- UserPreference : 1..*
+User -- Comment : 1..*
+User -- Post : 1..*
+User -- Chat : 1..*
+Item -- UserPreference : 1..*
+Post -- Comment : 1..*
+Post -- Topic : *..*
 @enduml
 ```

+ 85 - 0
E-Cover-prod/UMLprod/test.md

@@ -0,0 +1,85 @@
+```plantuml
+@startuml
+entity "用户表" as User {
+    + objectId: String
+    + createdAt: Date
+    + fans: Number
+    + gender: String
+    + UserID: String
+    + name: String
+    + phone: String
+    + username: String
+    + like: Number
+    + signatuer: String
+    + avatar: String
+    + age: String
+    + subscription: Number
+}
+
+entity "个性化生成结果表" as GeneratedResult {
+    + objectId: String
+    + createdAt: Date
+    + image: String
+    + content: String
+    + UserID: Pointer<_User>
+}
+
+entity "物品表" as Item {
+    + objectId: String
+    + createdAt: Date
+    + image: String
+    + name: String
+    + tag: Array
+    + click: Number
+}
+
+entity "用户偏好表" as UserPreference {
+    + objectId: String
+    + createdAt: Date
+    + ItemID: Pointer
+    + preference: Number
+    + UserID: Pointer<_User>
+}
+
+entity "评论表" as Comment {
+    + objectId: String
+    + createdAt: Date
+    + postID: Pointer
+    + content: String
+    + UserID: Pointer<_User>
+}
+
+entity "帖子表" as Post {
+    + objectId: String
+    + createdAt: Date
+    + like: Number
+    + content: String
+    + UserID: Pointer<_User>
+    + title: String
+    + tag: Array
+    + image: Array
+}
+
+entity "话题表" as Topic {
+    + objectId: String
+    + createdAt: Date
+    + name: String
+    + click: Number
+}
+
+entity "聊天记录表" as Chat {
+    + objectId: String
+    + createdAt: Date
+    + content: Array
+    + user: Pointer<_User>
+}
+
+User -- GeneratedResult : 1..*
+User -- UserPreference : 1..*
+User -- Comment : 1..*
+User -- Post : 1..*
+User -- Chat : 1..*
+Item -- UserPreference : 1..*
+Post -- Comment : 1..*
+Post -- Topic : *..*
+@enduml