11 Commits 5bc34d6afd ... 0348322b37

Author SHA1 Message Date
  yt 0348322b37 update:项目更改 10 months ago
  yt 5bc34d6afd feat:ImagineWork的图片生成 11 months ago
  yt 01e75a94d6 update:button修改 11 months ago
  yt 630f663773 update:tab1修改 11 months ago
  yt 0bc57dc4e9 feat:FmodeChatCompletion文本生成 11 months ago
  yt bb9e9cb298 tag框架 11 months ago
  yt 98afa4784f 第三页 11 months ago
  yt 1b3332e546 第二页 11 months ago
  yt 832b8bda10 首页设计 11 months ago
  yt 542bffbe36 djfi 11 months ago
  yt 031216f8c5 init: web3-1234567 0.1 11 months ago
100 changed files with 2084 additions and 1069 deletions
  1. 2 3
      README.md
  2. 6 0
      package-lock.json
  3. 0 8
      smarthotel-app/src/app/app.routes.ts
  4. 0 3
      smarthotel-app/src/app/edit-tag/edit-tag.component.html
  5. 0 17
      smarthotel-app/src/app/edit-tag/edit-tag.component.ts
  6. 0 29
      smarthotel-app/src/app/hotel-picture/hotel-picture.component.html
  7. 0 22
      smarthotel-app/src/app/hotel-picture/hotel-picture.component.spec.ts
  8. 0 67
      smarthotel-app/src/app/hotel-picture/hotel-picture.component.ts
  9. 0 11
      smarthotel-app/src/app/page-test/page-test.component.html
  10. 0 22
      smarthotel-app/src/app/page-test/page-test.component.spec.ts
  11. 0 44
      smarthotel-app/src/app/page-test/page-test.component.ts
  12. 0 65
      smarthotel-app/src/app/tab1/tab1.page.html
  13. 0 45
      smarthotel-app/src/app/tab1/tab1.page.ts
  14. 0 110
      smarthotel-app/src/app/tab2/tab2.page.html
  15. 0 0
      smarthotel-app/src/app/tab2/tab2.page.scss
  16. 0 111
      smarthotel-app/src/app/tab2/tab2.page.ts
  17. 0 80
      smarthotel-app/src/app/tab3/tab3.page.html
  18. 0 0
      smarthotel-app/src/app/tab3/tab3.page.scss
  19. 0 87
      smarthotel-app/src/app/tab3/tab3.page.ts
  20. 0 18
      smarthotel-app/src/app/tabs/tabs.page.html
  21. 0 1
      smarthotel-app/src/app/tabs/tabs.page.scss
  22. 0 47
      smarthotel-app/src/app/tabs/tabs.routes.ts
  23. 0 207
      smarthotel-prod/README.md
  24. BIN
      smarthotel-prod/image.png
  25. BIN
      smarthotel-prod/img/1.png
  26. BIN
      smarthotel-prod/img/2.png
  27. BIN
      smarthotel-prod/img/logo.png
  28. BIN
      smarthotel-prod/img/批注 2024-11-30 203503.png
  29. BIN
      smarthotel-prod/img/批注 2024-11-30 205345.png
  30. 0 0
      tailor-app/myapp/.browserslistrc
  31. 0 0
      tailor-app/myapp/.editorconfig
  32. 0 0
      tailor-app/myapp/.eslintrc.json
  33. 0 0
      tailor-app/myapp/.gitignore
  34. 0 0
      tailor-app/myapp/.vscode/extensions.json
  35. 0 0
      tailor-app/myapp/.vscode/settings.json
  36. 1 1
      tailor-app/myapp/angular.json
  37. 1 1
      tailor-app/myapp/capacitor.config.ts
  38. 1 1
      tailor-app/myapp/ionic.config.json
  39. 0 0
      tailor-app/myapp/karma.conf.js
  40. 267 32
      tailor-app/myapp/package-lock.json
  41. 8 1
      tailor-app/myapp/package.json
  42. 0 0
      tailor-app/myapp/src/app/app.component.html
  43. 0 0
      tailor-app/myapp/src/app/app.component.scss
  44. 0 0
      tailor-app/myapp/src/app/app.component.spec.ts
  45. 0 0
      tailor-app/myapp/src/app/app.component.ts
  46. 28 0
      tailor-app/myapp/src/app/app.routes.ts
  47. 4 0
      tailor-app/myapp/src/app/community/community.page.html
  48. 5 0
      tailor-app/myapp/src/app/community/community.page.scss
  49. 17 0
      tailor-app/myapp/src/app/community/community.page.spec.ts
  50. 97 0
      tailor-app/myapp/src/app/community/community.page.ts
  51. 58 0
      tailor-app/myapp/src/app/customization/customization.page.html
  52. 0 0
      tailor-app/myapp/src/app/customization/customization.page.scss
  53. 17 0
      tailor-app/myapp/src/app/customization/customization.page.spec.ts
  54. 189 0
      tailor-app/myapp/src/app/customization/customization.page.ts
  55. 99 0
      tailor-app/myapp/src/app/customization/test-chat-completion.ts
  56. 11 0
      tailor-app/myapp/src/app/edit-tag/edit-tag.component.html
  57. 0 0
      tailor-app/myapp/src/app/edit-tag/edit-tag.component.scss
  58. 3 1
      tailor-app/myapp/src/app/edit-tag/edit-tag.component.spec.ts
  59. 43 0
      tailor-app/myapp/src/app/edit-tag/edit-tag.component.ts
  60. 0 0
      tailor-app/myapp/src/app/explore-container/explore-container.component.html
  61. 0 0
      tailor-app/myapp/src/app/explore-container/explore-container.component.scss
  62. 0 0
      tailor-app/myapp/src/app/explore-container/explore-container.component.spec.ts
  63. 0 0
      tailor-app/myapp/src/app/explore-container/explore-container.component.ts
  64. BIN
      tailor-app/myapp/src/app/me/img/绘图1.jpg
  65. 239 0
      tailor-app/myapp/src/app/me/me.page.html
  66. 0 0
      tailor-app/myapp/src/app/me/me.page.scss
  67. 6 7
      tailor-app/myapp/src/app/me/me.page.spec.ts
  68. 124 0
      tailor-app/myapp/src/app/me/me.page.ts
  69. 99 0
      tailor-app/myapp/src/app/me/test-chat-completion.ts
  70. 3 0
      tailor-app/myapp/src/app/module/slide/slide.component.html
  71. 0 0
      tailor-app/myapp/src/app/module/slide/slide.component.scss
  72. 24 0
      tailor-app/myapp/src/app/module/slide/slide.component.spec.ts
  73. 14 0
      tailor-app/myapp/src/app/module/slide/slide.component.ts
  74. 13 0
      tailor-app/myapp/src/app/module/slide/slide.module.ts
  75. 32 0
      tailor-app/myapp/src/app/store/store.page.html
  76. 38 0
      tailor-app/myapp/src/app/store/store.page.scss
  77. 6 7
      tailor-app/myapp/src/app/store/store.page.spec.ts
  78. 242 0
      tailor-app/myapp/src/app/store/store.page.ts
  79. 26 0
      tailor-app/myapp/src/app/tabs/tabs.page.html
  80. 4 0
      tailor-app/myapp/src/app/tabs/tabs.page.scss
  81. 0 0
      tailor-app/myapp/src/app/tabs/tabs.page.spec.ts
  82. 2 2
      tailor-app/myapp/src/app/tabs/tabs.page.ts
  83. 46 0
      tailor-app/myapp/src/app/tabs/tabs.routes.ts
  84. 174 0
      tailor-app/myapp/src/app/yiyun/yiyun.page.html
  85. 77 0
      tailor-app/myapp/src/app/yiyun/yiyun.page.scss
  86. 6 7
      tailor-app/myapp/src/app/yiyun/yiyun.page.spec.ts
  87. 48 0
      tailor-app/myapp/src/app/yiyun/yiyun.page.ts
  88. 0 0
      tailor-app/myapp/src/assets/icon/favicon.png
  89. BIN
      tailor-app/myapp/src/assets/img/3d.png
  90. BIN
      tailor-app/myapp/src/assets/img/ai2.png
  91. BIN
      tailor-app/myapp/src/assets/img/ding.png
  92. BIN
      tailor-app/myapp/src/assets/img/ding2.png
  93. BIN
      tailor-app/myapp/src/assets/img/shi.png
  94. BIN
      tailor-app/myapp/src/assets/img/yi2.png
  95. 0 0
      tailor-app/myapp/src/assets/shapes.svg
  96. 0 0
      tailor-app/myapp/src/environments/environment.prod.ts
  97. 0 0
      tailor-app/myapp/src/environments/environment.ts
  98. 0 0
      tailor-app/myapp/src/global.scss
  99. 1 1
      tailor-app/myapp/src/index.html
  100. 3 11
      tailor-app/myapp/src/main.ts

+ 2 - 3
README.md

@@ -1,4 +1,3 @@
-# 智宿管家项目仓库
+tailor-prod 产品文档
 
-- smarthotel-app 项目代码
-- smarthotel-prod 产品仓库
+tailor-app 前端app项目

+ 6 - 0
package-lock.json

@@ -0,0 +1,6 @@
+{
+  "name": "s202226701017",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {}
+}

+ 0 - 8
smarthotel-app/src/app/app.routes.ts

@@ -1,8 +0,0 @@
-import { Routes } from '@angular/router';
-
-export const routes: Routes = [
-  {
-    path: '',
-    loadChildren: () => import('./tabs/tabs.routes').then((m) => m.routes),
-  },
-];

+ 0 - 3
smarthotel-app/src/app/edit-tag/edit-tag.component.html

@@ -1,3 +0,0 @@
-<p>
-  edit-tag works!
-</p>

+ 0 - 17
smarthotel-app/src/app/edit-tag/edit-tag.component.ts

@@ -1,17 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-import { IonInput } from '@ionic/angular/standalone';
-
-@Component({
-  selector: 'app-edit-tag',
-  templateUrl: './edit-tag.component.html',
-  styleUrls: ['./edit-tag.component.scss'],
-  imports:[IonInput],
-  standalone: true,
-})
-export class EditTagComponent  implements OnInit {
-
-  constructor() { }
-
-  ngOnInit() {}
-
-}

+ 0 - 29
smarthotel-app/src/app/hotel-picture/hotel-picture.component.html

@@ -1,29 +0,0 @@
-<ion-header [translucent]="true">
-  <ion-toolbar>
-    <ion-title>
-      酒店房间图片生成{{imagineWork?.progress || 0}}
-    </ion-title> 
-  </ion-toolbar>
-</ion-header>
-
-<ion-content [fullscreen]="true">
-  <!-- 生成提示词 -->
-  <ion-textarea [value]="userPrompt" (ionInput)="promptInput($event)" placeholder="房间描述" autoGrow="true"></ion-textarea>
-  <ion-button (click)="createImage()" expand="block">生成图片</ion-button>
-  <!-- 生成结果 -->
-  @if(images.length) {
-    @for(imageUrl of images;track imageUrl){
-      <img [src]="imageUrl" alt="" srcset="">
-    }
-  }
-  <!-- 生成状态 -->
-  @if(!images.length){
-    @if(imagineWork){
-      <h1>生成中</h1>
-    }
-    @if(!imagineWork){
-      <h1>未开始</h1>
-    }
-  }
-
-</ion-content>

+ 0 - 22
smarthotel-app/src/app/hotel-picture/hotel-picture.component.spec.ts

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

+ 0 - 67
smarthotel-app/src/app/hotel-picture/hotel-picture.component.ts

@@ -1,67 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-import { IonHeader, IonToolbar, IonTitle, IonContent } from '@ionic/angular/standalone';
-import { IonTextarea, IonButton } from "@ionic/angular/standalone";
-import { DalleOptions, FmodeChatCompletion, ImagineWork } from 'fmode-ng';
-
-@Component({
-  selector: 'app-hotel-picture',
-  templateUrl: './hotel-picture.component.html',
-  styleUrls: ['./hotel-picture.component.scss'],
-  standalone: true,
-  imports: [
-    IonHeader, IonToolbar, IonTitle, IonContent, 
-    IonButton,
-    IonTextarea
-  ],
-})
-export class HotelPictureComponent implements OnInit {
-
-  userPrompt:string = "宾至如归、古色古香、清静幽雅、桃李周庭、宽敞明亮。"
-  promptInput(ev:any){
-    this.userPrompt = ev.detail.value;
-  }
-  imagineWork:ImagineWork|undefined
-  images:Array<string> = []
-  constructor(){
-    // 示例任务,自己生成图片后请存储新的ID
-    this.imagineWork = new ImagineWork("lpJGiFwWeA");
-    this.imagineWork.fetchTask().then(work=>{
-      this.images = this.imagineWork?.images || [];
-    })
-  }
-
-  PictureDescResult:string = `` // 画面描述结果
-  async createImage(){
-    this.imagineWork = new ImagineWork();
-    let PromptTemple = `您是一名专业的美术画家,请您根据用户描述的房间类型和需求直接写出画面,并且以写实的风格为主。
-    房间描述如下:
-    ${this.userPrompt}
-    `
-    
-    let completion = new FmodeChatCompletion([
-      {role:"system",content:""},
-      {role:"user",content:PromptTemple}
-    ])
-    completion.sendCompletion().subscribe((message:any)=>{
-      // 打印消息体
-      console.log(message.content)
-      // 赋值消息内容给组件内属性
-      this.PictureDescResult = message.content
-      if(message?.complete){
-      let picturePrompt = `${this.PictureDescResult}`//画面描述结果
-      let options:DalleOptions = {prompt:this.userPrompt}
-      this.imagineWork?.draw(options).subscribe(work=>{
-        console.log("imagineWork",work?.toJSON())
-        console.log("images",work?.get("images"))
-        if(work?.get("images")?.length){
-          this.images = work?.get("images");
-        }
-
-      })
-    
-      }
-    })
-  }
-  ngOnInit() {}
-
-}

+ 0 - 11
smarthotel-app/src/app/page-test/page-test.component.html

@@ -1,11 +0,0 @@
-<ion-content>
-  <!-- 文本域:生成提示词 -->
-   <h1>房间的需求</h1>
-  <ion-textarea [value]="userPrompt" (ionInput)="promptInput($event)" placeholder="文本提示词" autoGrow="true"></ion-textarea>
-
-  <!-- 按钮:执行消息生成函数 -->
-  <ion-button (click)="sendMessage()" expand="block">生成房间</ion-button>
-  
-  <!-- 展示:返回消息内容 -->
-  <div>{{responseMsg}}</div>
-</ion-content>

+ 0 - 22
smarthotel-app/src/app/page-test/page-test.component.spec.ts

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

+ 0 - 44
smarthotel-app/src/app/page-test/page-test.component.ts

@@ -1,44 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-import { IonButton, IonContent, IonHeader, IonInput, IonTitle, IonToolbar } from '@ionic/angular/standalone';
-import { IonTextarea } from '@ionic/angular/standalone';
-import { FmodeChatCompletion } from 'fmode-ng';
-
-@Component({
-  selector: 'app-page-test',
-  templateUrl: './page-test.component.html',
-  styleUrls: ['./page-test.component.scss'],
-  standalone: true,
-  imports: [IonHeader, IonToolbar, IonTitle, IonContent, IonButton,
-    IonTextarea,IonInput
-    ],
-})
-export class PageTestComponent  implements OnInit {
-
-  constructor() {}
-  ngOnInit(){}
-  // 用户输入提示词
-   userPrompt:string = "请大致描述您对所居住酒店房间的需求"
-  promptInput(ev:any){
-    this.userPrompt = ev.detail.value;
-  }
-  // 属性:组件内用于展示消息内容的变量
-  responseMsg:any = ""
-  // 方法:实例化completion对象,传入消息数组,并订阅生成的可观察对象。
-  sendMessage(){
-    console.log("create")
-    let PromptTemple = `
-    您作为一名专业的酒店旅馆服务员,请您根据客户描述的房间需求,给出房间的类型和详细的描述。
-    以下是用户的描述:${this.userPrompt}`
-    let completion = new FmodeChatCompletion([
-      {role:"system",content:""},
-      {role:"user",content:PromptTemple}
-    ])
-    completion.sendCompletion().subscribe((message:any)=>{
-      // 打印消息体
-      console.log(message.content)
-      // 赋值消息内容给组件内属性
-      this.responseMsg = message.content
-    })
-  }
-
-}

+ 0 - 65
smarthotel-app/src/app/tab1/tab1.page.html

@@ -1,65 +0,0 @@
-<ion-header>
-  <ion-toolbar>
-    <ion-title>
-      <ion-icon name="home" slot="start"></ion-icon>
-    </ion-title>
-    <ion-searchbar placeholder="输入目的地、酒店名称或需求" slot="start"></ion-searchbar>
-    <ion-avatar slot="end">
-      <ion-img src="smarthotel-prod\img\logo.png" length="2px" wide="2px"></ion-img>
-    </ion-avatar>
-  </ion-toolbar>
-</ion-header>
-
-<ion-content [fullscreen]="true">
-  <div class="welcome-banner">
-    <h2>欢迎来到智宿管家,您的智慧住宿助手!</h2>
-    <ion-button expand="full" color="primary">开始体验</ion-button>
-  </div>
-
-  <div class="function-area">
-    <!-- 订房策略生成 -->
-    <ion-card>
-      <ion-card-header>
-        <ion-card-title>订房策略生成</ion-card-title>
-      </ion-card-header>
-      <ion-card-content>
-        <ion-button expand="full" (click)="goToPage1()">生成订房策略</ion-button>
-      </ion-card-content>
-    </ion-card>
-
-    <!-- 房间图片生成 -->
-    <ion-card>
-      <ion-card-header>
-        <ion-card-title>房间图片生成</ion-card-title>
-      </ion-card-header>
-      <ion-card-content>
-        <ion-button expand="full" (click)="goToPage2()">生成房间图片</ion-button>
-      </ion-card-content>
-    </ion-card>
-  </div>
-
-  <div class="feedback-recommendation">
-    <!-- 用户反馈区域 -->
-    <ion-card>
-      <ion-card-header>
-        <ion-card-title>用户反馈</ion-card-title>
-      </ion-card-header>
-      <ion-card-content>
-        <ion-textarea placeholder="我们希望听到您的声音!请分享您的建议或意见。"></ion-textarea>
-        <ion-button expand="full" color="secondary">提交反馈</ion-button>
-      </ion-card-content>
-    </ion-card>
-
-    <!-- 推荐酒店展示 -->
-    <ion-card>
-      <ion-card-header>
-        <ion-card-title>为您推荐:</ion-card-title>
-      </ion-card-header>
-      <ion-card-content>
-        <h3>海滨酒店</h3>
-        <p>豪华海景房</p>
-        <p>评分:4.8/5</p>
-      </ion-card-content>
-    </ion-card>
-  </div>
-</ion-content>

+ 0 - 45
smarthotel-app/src/app/tab1/tab1.page.ts

@@ -1,45 +0,0 @@
-import { Component } from '@angular/core';
-import { IonHeader, IonToolbar, IonTitle, IonContent } from '@ionic/angular/standalone';
-import { ExploreContainerComponent } from '../explore-container/explore-container.component';
-import { IonAvatar, IonButton, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonImg, IonInput, IonSearchbar, IonTextarea } from '@ionic/angular/standalone';
-import { IonIcon } from '@ionic/angular/standalone';
-import { Router } from '@angular/router';
-import { CommonModule } from '@angular/common';
-
-
-@Component({
-  selector: 'app-tab1',
-  templateUrl: 'tab1.page.html',
-  styleUrls: ['tab1.page.scss'],
-  standalone: true,
-  imports: [
-    IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent,
-    IonButton,IonInput,IonImg,IonTextarea,IonAvatar,IonCard,IonCardTitle,
-    IonCardContent,IonCardHeader,IonSearchbar,IonIcon,CommonModule
-  ],
-})
-
-export class Tab1Page {
-  strategyInput: string = '';
-  strategyResult: string = '';
-  roomInput: string = '';
-  roomImage: string | null = null;
-  userFeedback: string = '';
-
-  constructor(private router: Router) {}
-  goToPage1(){
-    this.router.navigate(['/tabs/page-test']);
-  }
-
-  goToPage2(){
-    this.router.navigate(['/tabs/hotel-picture']);
-  }
-
-  // 提交用户反馈的方法
-  submitFeedback() {
-    // 处理用户反馈逻辑
-    console.log('用户反馈:', this.userFeedback);
-    // 清空反馈文本框
-    this.userFeedback = '';
-  }
-}

+ 0 - 110
smarthotel-app/src/app/tab2/tab2.page.html

@@ -1,110 +0,0 @@
-<ion-header>
-  <ion-toolbar>
-    <ion-buttons slot="start">
-      <ion-button (click)="goBack()">
-        <ion-icon name="arrow-back"></ion-icon>
-        <span>返回</span>
-      </ion-button>
-    </ion-buttons>
-    <ion-title>房间管理</ion-title>
-    <ion-buttons slot="end">
-      <ion-button (click)="openProfile()">
-        <ion-icon name="person-circle"></ion-icon>
-      </ion-button>
-    </ion-buttons>
-  </ion-toolbar>
-</ion-header>
-
-<ion-content [fullscreen]="true">
-  <ion-card>
-    <ion-card-header>
-      <ion-card-title>房间状态概览</ion-card-title>
-    </ion-card-header>
-    <ion-card-content>
-      <div>
-        <p>总房间数: {{ totalRooms }}</p>
-        <p>已入住: {{ occupiedRooms }}</p>
-        <p>空房: {{ availableRooms }}</p>
-        <p>待清洁: {{ cleaningRooms }}</p>
-      </div>
-      <ion-img src="path_to_your_chart_image.png"></ion-img> <!-- 替换为实际图表 -->
-    </ion-card-content>
-  </ion-card>
-
-  <ion-list>
-    <ion-item *ngFor="let room of rooms">
-      <ion-label>
-        <h2>房间号: {{ room.number }}</h2>
-        <p>房型: {{ room.type }}</p>
-        <p>当前状态: {{ room.status }}</p>
-      </ion-label>
-      <ion-button (click)="updateRoomStatus(room.number,selectedStatus)">更新状态</ion-button>
-      <ion-button (click)="viewRoomDetails(room.number)">查看详情</ion-button>
-    </ion-item>
-  </ion-list>
-
-  <ion-item>
-    <ion-label>选择房间状态</ion-label>
-    <ion-select [(ngModel)]="selectedStatus">
-      <ion-select-option value="已入住">已入住</ion-select-option>
-      <ion-select-option value="空闲">空闲</ion-select-option>
-      <ion-select-option value="待清洁">待清洁</ion-select-option>
-    </ion-select>
-  </ion-item>
-  
-  <ion-item>
-    <ion-label>选择房间</ion-label>
-    <ion-select [(ngModel)]="selectedRoom">
-      <ion-select-option *ngFor="let room of rooms" [value]="room.number">{{ room.number }}</ion-select-option>
-    </ion-select>
-  </ion-item>
-  
-  <ion-button expand="full" (click)="updateRoomStatus(selectedRoom, selectedStatus)">更新状态</ion-button>
-  <ion-toast [isOpen]="toastOpen" message="{{ toastMessage }}" duration="2000"></ion-toast>
-
-  <ion-modal [isOpen]="isModalOpen" (ionModalDidClose)="closeModal()">
-    <ion-header>
-      <ion-toolbar>
-        <ion-title>房间详情</ion-title>
-        <ion-buttons slot="end">
-          <ion-button (click)="closeModal()">
-            <ion-icon name="close"></ion-icon>
-          </ion-button>
-        </ion-buttons>
-      </ion-toolbar>
-    </ion-header>
-    <ion-content>
-      <ion-card>
-        <ion-card-header>
-          <ion-card-title>房间基本信息</ion-card-title>
-        </ion-card-header>
-        <ion-card-content>
-          <p>房间号: {{ roomDetails.number }}</p>
-          <p>房型: {{ roomDetails.type }}</p>
-          <p>面积: {{ roomDetails.size }}</p>
-          <p>设施: {{ roomDetails.amenities }}</p>
-        </ion-card-content>
-      </ion-card>
-      <ion-card>
-        <ion-card-header>
-          <ion-card-title>入住客人信息</ion-card-title>
-        </ion-card-header>
-        <ion-card-content>
-          <p>姓名: {{ guestInfo.name }}</p>
-          <p>入住时间: {{ guestInfo.checkIn }}</p>
-          <p>退房时间: {{ guestInfo.checkOut }}</p>
-        </ion-card-content>
-      </ion-card>
-      <ion-card>
-        <ion-card-header>
-          <ion-card-title>历史入住记录</ion-card-title>
-        </ion-card-header>
-        <ion-list>
-          <ion-item *ngFor="let record of historyRecords">
-            <p>{{ record.date }} - {{ record.guestName }}</p>
-          </ion-item>
-        </ion-list>
-      </ion-card>
-    </ion-content>
-  </ion-modal>
-</ion-content>

+ 0 - 0
smarthotel-app/src/app/tab2/tab2.page.scss


+ 0 - 111
smarthotel-app/src/app/tab2/tab2.page.ts

@@ -1,111 +0,0 @@
-import { Component } from '@angular/core';
-import { IonHeader, IonToolbar, IonTitle, IonContent, IonicRouteStrategy } from '@ionic/angular/standalone';
-import { ExploreContainerComponent } from '../explore-container/explore-container.component';
-import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonIcon, IonImg, IonItem, IonLabel, IonList, IonSelect, IonSelectOption, IonToast } from '@ionic/angular/standalone';
-import { IonModal } from '@ionic/angular/standalone';
-import { IonButtons, ToastController } from '@ionic/angular/standalone';
-import { CommonModule } from '@angular/common';
-import { FormsModule } from '@angular/forms'; // 导入 FormsModule
-
-
-
-@Component({
-  selector: 'app-tab2',
-  templateUrl: 'tab2.page.html',
-  styleUrls: ['tab2.page.scss'],
-  standalone: true,
-  imports: [
-    IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent,
-    IonButtons,IonIcon,IonCard,IonCardHeader,IonCardTitle,IonCardContent,
-    IonImg,IonList,IonItem,IonLabel,IonSelect,IonSelectOption,IonModal,IonToast,
-    IonButton,CommonModule,FormsModule, 
-  ]
-})
-export class Tab2Page {
-  totalRooms: number = 50;
-  occupiedRooms: number = 30;
-  availableRooms: number = 15;
-  cleaningRooms: number = 5;
-
-  rooms = [
-    { number: '101', type: '豪华双人间', status: '已入住' },
-    { number: '102', type: '标准单人间', status: '空闲' },
-    { number: '103', type: '豪华双人间', status: '待清洁' },
-    // 更多房间数据...
-  ];
-
-  selectedStatus: string | null = null; // 初始化为 null
-  selectedRoom: string | null = null; // 初始化为 null
-  toastOpen: boolean = false;
-  toastMessage: string = '';
-  isModalOpen: boolean = false; // 控制模态框的打开与关闭
-  roomDetails: any = {}; // 存储房间详情信息
-  guestInfo: any = {}; // 存储入住客人信息
-  historyRecords: any[] = []; // 存储历史入住记录
-
-  constructor(private toastController: ToastController) {}
-
-  goBack() {
-    // 返回上一页的逻辑
-    console.log('返回上一页');
-  }
-
-  openProfile() {
-    // 打开个人资料页的逻辑
-    console.log('打开个人资料页');
-  }
-
-  updateRoomStatus(roomNumber: string | null, status: string | null) {
-    if (roomNumber && status) {
-      const room = this.rooms.find(r => r.number === roomNumber);
-      if (room) {
-        room.status = status;
-        this.showToast('状态更新成功!');
-      } else {
-        this.showToast('状态更新失败,请重试。');
-      }
-    } else {
-      this.showToast('房间号或状态无效。');
-    }
-  }
-
-  viewRoomDetails(roomNumber: string) {
-    // 查找房间详情并打开模态框
-    const room = this.rooms.find(r => r.number === roomNumber);
-    if (room) {
-      this.roomDetails = room;
-      this.guestInfo = { name: '张三', checkIn: '2024年11月25日', checkOut: '2024年11月30日' }; // 示例数据
-      this.historyRecords = [
-        { date: '2024年11月20日 - 2024年11月25日', guestName: '李四' },
-        // 更多历史记录...
-      ];
-      this.isModalOpen = true; // 打开模态框
-    }
-  }
-  
-
-  closeModal() {
-    this.isModalOpen = false; // 关闭模态框
-  }
-
-  async updateStatus() {
-    // 更新状态的逻辑
-    if (this.selectedRoom && this.selectedStatus) {
-      this.updateRoomStatus(this.selectedRoom, this.selectedStatus);
-    } else {
-      this.showToast('请先选择房间和状态。');
-    }
-  }
-
-  async showToast(message: string) {
-    this.toastMessage = message;
-    this.toastOpen = true;
-
-    const toast = await this.toastController.create({
-      message: this.toastMessage,
-      duration: 2000,
-      position: 'bottom',
-    });
-    await toast.present();
-  }
-}

+ 0 - 80
smarthotel-app/src/app/tab3/tab3.page.html

@@ -1,80 +0,0 @@
-<ion-header>
-  <ion-toolbar>
-    <ion-buttons slot="start">
-      <ion-button (click)="goBack()">
-        <ion-icon name="arrow-back"></ion-icon>
-      </ion-button>
-    </ion-buttons>
-    <ion-title>智能客服</ion-title>
-    <ion-buttons slot="end">
-      <ion-button (click)="goToProfile()">
-        <ion-icon name="person-circle"></ion-icon>
-      </ion-button>
-    </ion-buttons>
-  </ion-toolbar>
-</ion-header>
-
-<ion-content [fullscreen]="true">
-  <div class="chat-container">
-    <div class="chat-message" *ngFor="let message of chatMessages">
-      <div class="message" [ngClass]="{'customer': message.sender === 'customer', 'support': message.sender === 'support'}">
-        {{ message.text }}
-      </div>
-    </div>
-    <ion-item>
-      <ion-input placeholder="请输入您的问题或需求" [(ngModel)]="userMessage"></ion-input>
-      <ion-button (click)="sendMessage()">发送</ion-button>
-    </ion-item>
-  </div>
-
-  <ion-card>
-    <ion-card-header>
-      <ion-card-title>常见问题</ion-card-title>
-    </ion-card-header>
-    <ion-list>
-      <ion-item *ngFor="let faq of faqs" (click)="toggleFAQ(faq)">
-        <ion-label>{{ faq.question }}</ion-label>
-        <ion-icon slot="end" [name]="faq.isOpen ? 'chevron-up' : 'chevron-down'"></ion-icon>
-      </ion-item>
-      <ng-container *ngFor="let faq of faqs">
-        <ion-item *ngIf="faq.isOpen">
-          <ion-label>{{ faq.answer }}</ion-label>
-        </ion-item>
-      </ng-container>
-    </ion-list>
-  </ion-card>
-
-  <ion-card>
-    <ion-card-header>
-      <ion-card-title>服务评分</ion-card-title>
-    </ion-card-header>
-    <ion-card-content>
-      <ion-rating [(ngModel)]="userRating" max="5" icon="star"></ion-rating>
-      <ion-item>
-        <ion-input placeholder="请分享您的反馈意见(可选)" [(ngModel)]="userFeedback"></ion-input>
-      </ion-item>
-      <ion-button expand="full" (click)="submitFeedback()">提交评分</ion-button>
-      <div *ngIf="feedbackMessage">{{ feedbackMessage }}</div>
-    </ion-card-content>
-  </ion-card>
-
-  <ion-card>
-    <ion-card-header>
-      <ion-card-title>快捷服务</ion-card-title>
-    </ion-card-header>
-    <ion-card-content>
-      <ion-button expand="full" (click)="checkout()">
-        退房间
-      </ion-button>
-      <ion-button expand="full" (click)="requestCleaning()">
-        请求清洁
-      </ion-button>
-      <ion-button expand="full" (click)="inquireFacilities()">
-        咨询设施
-      </ion-button>
-      <ion-button expand="full" (click)="contactSupport()">
-        联系客服
-      </ion-button>
-    </ion-card-content>
-  </ion-card>
-</ion-content>

+ 0 - 0
smarthotel-app/src/app/tab3/tab3.page.scss


+ 0 - 87
smarthotel-app/src/app/tab3/tab3.page.ts

@@ -1,87 +0,0 @@
-import { Component } from '@angular/core';
-import { IonHeader, IonToolbar, IonTitle, IonContent, IonButtons, IonCardContent } from '@ionic/angular/standalone';
-import { ExploreContainerComponent } from '../explore-container/explore-container.component';
-import { IonButton, IonCard, IonCardHeader, IonCardTitle, IonIcon, IonInput, IonItem, IonLabel, IonList, IonRadio } from '@ionic/angular/standalone';
-import { CommonModule } from '@angular/common';
-import { FormsModule } from '@angular/forms'; // 导入 FormsModule
-
-interface FAQ {
-  question: string;
-  answer: string;
-  isOpen: boolean;
-}
-
-@Component({
-  selector: 'app-tab3',
-  templateUrl: 'tab3.page.html',
-  styleUrls: ['tab3.page.scss'],
-  standalone: true,
-  imports: [
-    IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent,
-    IonButton,IonIcon,IonTitle,IonContent,IonItem,IonInput,IonCard,IonCardHeader,
-    IonCardTitle,IonCardHeader,IonList,IonLabel,IonCardTitle,IonButtons,IonCardContent,
-    CommonModule,FormsModule
-  ],
-})
-export class Tab3Page {
-
-  userMessage: string = '';
-  userRating: number = 0;
-  userFeedback: string = '';
-  feedbackMessage: string = '';
-  
-  chatMessages: { sender: string, text: string }[] = [
-    { sender: 'support', text: '欢迎来到智能客服,请问有什么可以帮助您的?' },
-  ];
-
-  faqs: FAQ[] = [
-    { question: '如何预定房间?', answer: '您可以通过我们的应用直接预定,也可以拨打前台电话。', isOpen: false },
-    { question: '酒店提供哪些设施?', answer: '我们提供游泳池、健身房、会议室等设施。', isOpen: false },
-  ];
-
-  goBack() {
-    // Logic to navigate back
-  }
-
-  goToProfile() {
-    // Logic to navigate to user profile
-  }
-
-  sendMessage() {
-    if (this.userMessage.trim()) {
-      this.chatMessages.push({ sender: 'customer', text: this.userMessage });
-      this.userMessage = '';
-      // Simulate a response from support
-      this.chatMessages.push({ sender: 'support', text: '谢谢您的咨询,我们会尽快回复您。' });
-    }
-  }
-
-  toggleFAQ(faq: FAQ) {
-    faq.isOpen = !faq.isOpen;
-  }
-
-  submitFeedback() {
-    if (this.userRating > 0) {
-      this.feedbackMessage = '感谢您的反馈!评分提交成功。';
-      // Logic to handle feedback submission
-    } else {
-      this.feedbackMessage = '请给出评分。';
-    }
-  }
-
-  checkout() {
-    // Logic to check out a room
-  }
-
-  requestCleaning() {
-    // Logic to request cleaning
-  }
-
-  inquireFacilities() {
-    // Logic to inquire about facilities
-  }
-
-  contactSupport() {
-    // Logic to contact support
-  }
-}

+ 0 - 18
smarthotel-app/src/app/tabs/tabs.page.html

@@ -1,18 +0,0 @@
-<ion-tabs>
-  <ion-tab-bar slot="bottom">
-    <ion-tab-button tab="tab1" href="/tabs/tab1">
-      <ion-icon aria-hidden="true" name="tv"></ion-icon>
-      <ion-label>预订</ion-label>
-    </ion-tab-button>
-
-    <ion-tab-button tab="tab2" href="/tabs/tab2">
-      <ion-icon aria-hidden="true" name="chatbox"></ion-icon>
-      <ion-label>信息</ion-label>
-    </ion-tab-button>
-
-    <ion-tab-button tab="tab3" href="/tabs/tab3">
-      <ion-icon aria-hidden="true" name="people"></ion-icon>
-      <ion-label>客户</ion-label>
-    </ion-tab-button>
-  </ion-tab-bar>
-</ion-tabs>

+ 0 - 1
smarthotel-app/src/app/tabs/tabs.page.scss

@@ -1 +0,0 @@
-

+ 0 - 47
smarthotel-app/src/app/tabs/tabs.routes.ts

@@ -1,47 +0,0 @@
-import { Routes } from '@angular/router';
-import { TabsPage } from './tabs.page';
-import { HotelPictureComponent } from '../hotel-picture/hotel-picture.component';
-
-export const routes: Routes = [
-  {
-    path: 'tabs',
-    component: TabsPage,
-    children: [
-      {
-        path: 'tab1',
-        loadComponent: () =>
-          import('../tab1/tab1.page').then((m) => m.Tab1Page),
-      },
-      {
-        path: 'tab2',
-        loadComponent: () =>
-          import('../tab2/tab2.page').then((m) => m.Tab2Page),
-      },
-      {
-        path: 'tab3',
-        loadComponent: () =>
-          import('../tab3/tab3.page').then((m) => m.Tab3Page),
-      },
-      {
-        path: 'page-test',
-        loadComponent: () =>
-          import('../page-test/page-test.component').then((m) => m.PageTestComponent),
-      },
-      {
-        path: 'hotel-picture',
-        loadComponent: () =>
-          import('../hotel-picture/hotel-picture.component').then((m) => HotelPictureComponent),
-      },
-      {
-        path: '',
-        redirectTo: '/tabs/tab1',
-        pathMatch: 'full',
-      },
-    ],
-  },
-  {
-    path: '',
-    redirectTo: '/tabs/tab1',
-    pathMatch: 'full',
-  },
-];

+ 0 - 207
smarthotel-prod/README.md

@@ -1,207 +0,0 @@
-# 项目策划书# 智宿管家项目策划书
-
-
-- 姓名 叶腾
-- 学号 202226701017
-- 班级 22级大数据班
-- 手机 19807921102
-
-## 项目设想
-
-### 01 一句话描述项目设想(行业领域、用户画像、核心功能) 
-- (行业)酒店管理领域,旨在提升酒店运营效率和客户体验。(用户)酒店经营者、管理者,以及对高质量住宿体验有需求的游客。(功能)利用AI智能技术实现酒店管理一体化,包括智能预订、客户服务、房间管理、数据分析等功能。
-
-### 02 项目的业务流程 
-#### 1、用户信息收集:
-用户(酒店管理者)输入酒店基本信息、房间类型、定价策略、客户需求等,系统可通过分析历史运营数据获取相关信息。
-#### 2、需求明确:
-用户提出酒店管理需求,如预订管理、客户服务、房间维护等,以及特殊要求,如节假日促销、客户偏好等。
-#### 3、数据整合与分析:
-系统整合客户信息、市场动态、竞争对手情况等,结合用户输入和需求,利用算法分析最佳管理方案。
-#### 4、方案生成:
-根据分析结果生成酒店管理方案,包括定价策略、促销活动、客户服务流程等。
-#### 5、方案展示与调整:
-向用户展示管理方案,用户可提出修改意见,系统根据反馈快速调整。
-#### 6、预订与提醒:
-用户确认后,系统自动管理相关服务,并在关键节点提醒用户各项准备事宜。
-#### 7、数据分析与反馈:
-定期收集运营数据和客户反馈,用于改进后续管理策略。
-
-### 03 项目的商业模式 
-- 付费订阅模式:用户支付一定的费用,如每月或每年订阅,获取不同等级的酒店管理服务,等级越高,服务越全面。
-- 按次收费模式:针对只偶尔需要管理服务的用户,每次使用服务时支付相应费用。
-- 商家合作分成:与旅游平台、在线旅行社、餐饮服务商等合作,推荐用户消费,从中获取一定比例的分成。
-- 广告收入模式:在系统中展示与酒店相关的优质产品或服务广告,收取广告商费用。
-- 增值服务收费:例如为用户提供市场调研、客户满意度调查等增值服务,并收取额外费用。
-
-### 04 相对可行的策略
-#### 初期策略:
-- 聚焦特定用户群体:先针对中小型酒店、民宿等有较强管理需求的群体,开发符合他们需求的管理解决方案。
-- 提供免费试用与口碑营销:为新用户提供有限次数的免费试用,鼓励他们分享体验,通过口碑吸引更多潜在用户。
-- 与本地旅游平台合作推广:与当地旅游平台合作,展示管理系统的优势,吸引更多酒店加入。
-#### 中期策略:
-- 优化用户体验:根据用户反馈不断改进管理系统,提高系统的智能化和个性化程度。
-- 拓展服务内容:增加如市场分析、客户关系管理等新功能,满足更多用户需求。
-- 推出会员制度:设置不同等级会员,提供如优先服务、更多定制化方案、专属客服等特权,激励用户升级会员。
-#### 长期策略:
-- 跨地区拓展:在本地模式成熟后,将业务拓展到其他城市,与当地酒店建立合作,复制成功经验。
-- 数据驱动发展:深入分析用户数据,挖掘用户潜在需求,开发新的功能和服务,如根据客户反馈自动调整服务内容。
-- 打造酒店管理平台:不仅仅是管理系统,还构建酒店交流、经验分享等功能的平台,增强用户粘性。
-
-## 一、项目背景
-
-### 政策背景
-
-> 用关键字:兴趣、社交,搜索相关的政策和扶持
-
-- 2022年1月12日,《国务院关于印发“十四五”数字经济发展规划的通知》发布,指出数字化服务是提升服务质量的重要途径。
-- 2022年12月14日,中共中央、国务院印发《扩大内需战略规划纲要(2022-2035年)》,提出支持旅游业发展,鼓励酒店行业创新和数字化转型,推动优质服务供给。
-### 行业背景
-
-- 根据《2024-2030年中国酒店行业发展前景预测及投资策略研究报告》,酒店行业正在向智能化、数字化方向发展,市场潜力巨大。
-
-### 市场痛点
-
-- 旅馆管理效率低,传统管理模式难以满足市场需求。
-- 客户体验差,服务人员对客户需求响应不及时。
-- 数据分析能力不足,难以根据市场变化快速调整策略。
-## 二、产品定位
-
-### 用户分析
-
-- 用户(酒店经营者)
-- 中小型酒店
-- 民宿
-- 客户
-- 商务旅行者
-- 休闲游客
-
-### 主要功能
-
-- 智能预订:运用AIGC文本生成,根据用户所描述的需求,帮助用户制定订房策略,同  
-  时运用AIGC图片生成,生成用户描述的相应的房间图片。
-- 客户服务:智能客服系统,快速响应客户需求。
-- 房间管理:实时更新酒店的房间状态。
-
-### 商业模式
-
-- 订阅制收费
-- 按次收费
-- 商家合作分成
-- 广告收入
-
-## 三、可行性测试
-
-### 活动策划
-
-#### 智能预订的提示词相关
-- 用户输入lü'guan信息,系统自动生成预订页面。
-- 根据客户需求,推荐房型和价格。
-#### 客户服务
-- 智能客服系统,24小时在线解答客户疑问。
-- 根据客户反馈,自动调整服务内容。
-#### 数据分析
-- 定期生成运营报告,分析入住率、客户满意度等数据。
-- 提供市场趋势分析,帮助用户调整经营策略。
-
-#### 1. 筛选风险
-
-客户需求变化:根据季节、节假日等因素,及时调整房价和促销活动。
-市场竞争:分析竞争对手的定价策略和促销活动,制定相应的应对措施。
-
-#### 2. 活运营方案选择
-
-结合市场数据,制定合理的定价策略和促销活动,提升客户入住率。
-
-#### 3. 运营流程的策划
-
-- **运营时间**:全年无休,24小时服务。
-
-- 流程设计:
-    客户在线预订
-    系统自动确认
-    客户入住及服务
-    客户反馈收集
-
-#### 4. 客户互动环节
-
-- 提供客户满意度调查,收集客户反馈,持续改进服务。
-
-#### 5. 活动的奖励设计
-
-- **忠诚计划**: 为回头客提供折扣和积分奖励,增加客户粘性。
-- **推荐奖**: 鼓励客户推荐新客户,给予相应的奖励
-
-#### 总结
-
-通过以上策划,项目能够在考虑用户需求和市场变化的基础上,提供一个高效、智能的酒店管理平台,提升酒店运营效率和客户体验。
-
-## 四、产品结构
-
-### 竞品分析
-
-1. 寻找智能旅馆管理的三款App,体验其中核心功能。
-   - 例如:OYO、Airbnb等,参考其管理系统和用户体验。
-2. 寻找数据分析相关App至少1款,体验其数据分析功能。
-   - 例如:Tableau等,参考其数据展示和分析能力。
-
-### 产品结构图
-![](img/1.png)
-#### 产品结构图说明:
-- 用户管理模块:负责用户的注册、登录、角色管理和信息维护,确保用户能够顺利使用系统功能。
-- 预订管理模块:实现房间的查询、预订、订单管理以及取消和修改预订等功能,提升用户预订体验。
-- 客户服务模块:提供智能客服系统,收集客户反馈并解答常见问题,确保客户满意度。
-- 数据分析模块:分析运营数据、客户满意度和市场趋势,帮助酒店管理者制定策略。
-- 营销管理模块:管理促销活动、折扣策略和客户忠诚计划,以提升客户粘性和入住率。
-- 系统管理模块:负责系统的设置、数据备份与恢复以及权限管理,确保系统安全和稳定。
-### 信息结构图
-![](img/2.png)
-#### 信息结构图说明:
-##### 用户管理:
-- 用户ID:唯一标识用户。
-- 用户名:用户的登录名。
-- 密码:用户的账户密码。
-- 角色:用户在系统中的角色(如管理员、普通用户等)。
-- 联系信息:用户的联系方式。
-- 注册时间:用户注册的时间。
-
-##### 预订管理:
-- 预订ID:唯一标识每个预订。
-- 用户ID:与预订相关的用户ID。
-- 房间ID:被预订的房间ID。
-- 预订状态:当前预订的状态(如已确认、已取消等)。
-- 入住日期:客户的入住日期。
-- 离店日期:客户的离店日期。
-- 订单总额:预订的总费用。
-- 创建时间:预订创建的时间。
-
-##### 客户服务:
-- 客户ID:与反馈相关的客户ID。
-- 反馈内容:客户提交的反馈信息。
-- 反馈时间:客户反馈的时间。
-- 处理状态:反馈的处理状态(如已处理、待处理等)。
-- 回复内容:客服对客户反馈的回复。
-
-##### 数据分析:
-- 数据ID:唯一标识每条数据记录。
-- 日期:记录的日期。
-- 客户满意度:通过调查等方式收集的客户满意度评分。
-- 入住率:酒店的入住率统计。
-- 营收分析:酒店的收入分析。
-
-##### 营销管理:
-- 活动ID:唯一标识每个营销活动。
-- 活动名称:营销活动的名称。
-- 活动类型:活动的类型(如折扣、促销等)。
-- 开始时间:活动的开始时间。
-- 结束时间:活动的结束时间。
-- 折扣信息:活动中的折扣信息。
-
-##### 系统管理:
-- 系统设置:系统的基本设置。
-- 数据备份状态:系统数据的备份状态。
-- 用户权限:系统中不同用户的权限设置。
-- 系统日志:记录系统的操作日志。
-- 系统版本:当前系统的版本信息。
-## FAQ:项目起名
-### 智宿管家

BIN
smarthotel-prod/image.png


BIN
smarthotel-prod/img/1.png


BIN
smarthotel-prod/img/2.png


BIN
smarthotel-prod/img/logo.png


BIN
smarthotel-prod/img/批注 2024-11-30 203503.png


BIN
smarthotel-prod/img/批注 2024-11-30 205345.png


+ 0 - 0
smarthotel-app/.browserslistrc → tailor-app/myapp/.browserslistrc


+ 0 - 0
smarthotel-app/.editorconfig → tailor-app/myapp/.editorconfig


+ 0 - 0
smarthotel-app/.eslintrc.json → tailor-app/myapp/.eslintrc.json


+ 0 - 0
smarthotel-app/.gitignore → tailor-app/myapp/.gitignore


+ 0 - 0
smarthotel-app/.vscode/extensions.json → tailor-app/myapp/.vscode/extensions.json


+ 0 - 0
smarthotel-app/.vscode/settings.json → tailor-app/myapp/.vscode/settings.json


+ 1 - 1
smarthotel-app/angular.json → tailor-app/myapp/angular.json

@@ -129,7 +129,7 @@
     "schematicCollections": [
       "@ionic/angular-toolkit"
     ],
-    "analytics": false
+    "analytics": "5fac3f36-027e-4162-83d1-2f5feadd13d1"
   },
   "schematics": {
     "@ionic/angular-toolkit:component": {

+ 1 - 1
smarthotel-app/capacitor.config.ts → tailor-app/myapp/capacitor.config.ts

@@ -2,7 +2,7 @@ import type { CapacitorConfig } from '@capacitor/cli';
 
 const config: CapacitorConfig = {
   appId: 'io.ionic.starter',
-  appName: 'smarthotel-app',
+  appName: 'myapp',
   webDir: 'www'
 };
 

+ 1 - 1
smarthotel-app/ionic.config.json → tailor-app/myapp/ionic.config.json

@@ -1,5 +1,5 @@
 {
-  "name": "smarthotel-app",
+  "name": "myapp",
   "integrations": {
     "capacitor": {}
   },

+ 0 - 0
smarthotel-app/karma.conf.js → tailor-app/myapp/karma.conf.js


+ 267 - 32
smarthotel-app/package-lock.json → tailor-app/myapp/package-lock.json

@@ -1,11 +1,11 @@
 {
-  "name": "smarthotel-app",
+  "name": "myapp",
   "version": "0.0.1",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
-      "name": "smarthotel-app",
+      "name": "myapp",
       "version": "0.0.1",
       "dependencies": {
         "@angular/animations": "^18.0.0",
@@ -22,10 +22,17 @@
         "@capacitor/keyboard": "6.0.3",
         "@capacitor/status-bar": "6.0.2",
         "@ionic/angular": "^8.0.0",
+        "@ionic/vue": "^8.4.0",
+        "@ionic/vue-router": "^8.4.0",
+        "@types/echarts": "^4.9.22",
+        "echarts": "^5.5.1",
         "fmode-ng": "^0.0.62",
         "ionicons": "^7.2.1",
+        "parse": "^5.3.0",
         "rxjs": "~7.8.0",
+        "swiper": "^11.1.15",
         "tslib": "^2.3.0",
+        "vue": "^3.5.13",
         "zone.js": "~0.14.2"
       },
       "devDependencies": {
@@ -1208,7 +1215,6 @@
       "version": "7.25.9",
       "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
       "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
@@ -1218,7 +1224,6 @@
       "version": "7.25.9",
       "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
       "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
@@ -1267,7 +1272,6 @@
       "version": "7.26.2",
       "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.2.tgz",
       "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/types": "^7.26.0"
@@ -2663,7 +2667,6 @@
       "resolved": "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.24.7.tgz",
       "integrity": "sha512-eytSX6JLBY6PVAeQa2bFlDx/7Mmln/gaEpsit5a3WEvjGfiIytEsgAwuIXCPM0xvw0v0cJn3ilq0/TvXrW0kgA==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "core-js-pure": "^3.30.2",
         "regenerator-runtime": "^0.14.0"
@@ -2740,7 +2743,6 @@
       "version": "7.26.0",
       "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.0.tgz",
       "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/helper-string-parser": "^7.25.9",
@@ -2751,9 +2753,9 @@
       }
     },
     "node_modules/@babylonjs/core": {
-      "version": "7.37.0",
-      "resolved": "https://registry.npmmirror.com/@babylonjs/core/-/core-7.37.0.tgz",
-      "integrity": "sha512-BwwZqRr35V9rasMoApBn7TDubulzL9g6+96HhEqYiRQYqJ5arZTEdhanmYgNDy5zem4zF/k4srCi7HmWH212Aw==",
+      "version": "7.35.2",
+      "resolved": "https://registry.npmmirror.com/@babylonjs/core/-/core-7.35.2.tgz",
+      "integrity": "sha512-V15G3ZypYbvMyb4tQfsCSkF8SO/7lXuV44fyqOBJGU1FFcOsnP2JdqJiY6RJpFS6q1//8BH/NYZMEllguvlB8A==",
       "license": "Apache-2.0",
       "peer": true
     },
@@ -4573,6 +4575,25 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
+    "node_modules/@ionic/vue": {
+      "version": "8.4.0",
+      "resolved": "https://registry.npmmirror.com/@ionic/vue/-/vue-8.4.0.tgz",
+      "integrity": "sha512-mtSerl9oC21d6xv1q+QuGm61IzJbqpkWbt0lQryXZ3kK1/aVVOnHAN5bX8tPPUN2ALA7CyTWXaCvhxceRV/paA==",
+      "license": "MIT",
+      "dependencies": {
+        "@ionic/core": "8.4.0",
+        "ionicons": "^7.0.0"
+      }
+    },
+    "node_modules/@ionic/vue-router": {
+      "version": "8.4.0",
+      "resolved": "https://registry.npmmirror.com/@ionic/vue-router/-/vue-router-8.4.0.tgz",
+      "integrity": "sha512-g9cLVES3svWnhLbZI4qRTlk2PbbdNB+xAjaMAUGVNZqJRMhIzU3vs4Wiazmd90Bwx39bgr/1o2TPYWzDt1yw0g==",
+      "license": "MIT",
+      "dependencies": {
+        "@ionic/vue": "8.4.0"
+      }
+    },
     "node_modules/@isaacs/cliui": {
       "version": "8.0.2",
       "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -4736,7 +4757,6 @@
       "version": "1.5.0",
       "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
       "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/@jridgewell/trace-mapping": {
@@ -5892,6 +5912,15 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/echarts": {
+      "version": "4.9.22",
+      "resolved": "https://registry.npmmirror.com/@types/echarts/-/echarts-4.9.22.tgz",
+      "integrity": "sha512-7Fo6XdWpoi8jxkwP7BARUOM7riq8bMhmsCtSG8gzUcJmFhLo387tihoBYS/y5j7jl3PENT5RxeWZdN9RiwO7HQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/zrender": "*"
+      }
+    },
     "node_modules/@types/estree": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
@@ -6148,6 +6177,12 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/zrender": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmmirror.com/@types/zrender/-/zrender-4.0.6.tgz",
+      "integrity": "sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==",
+      "license": "MIT"
+    },
     "node_modules/@typescript-eslint/eslint-plugin": {
       "version": "6.21.0",
       "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
@@ -6615,6 +6650,134 @@
         "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
       }
     },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+      "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/shared": "3.5.13",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+      "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-core": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+      "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/compiler-core": "3.5.13",
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.11",
+        "postcss": "^8.4.48",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-sfc/node_modules/postcss": {
+      "version": "8.4.49",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz",
+      "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+      "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
+      "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+      "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+      "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/runtime-core": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "csstype": "^3.1.3"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+      "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13"
+      },
+      "peerDependencies": {
+        "vue": "3.5.13"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz",
+      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
+      "license": "MIT"
+    },
     "node_modules/@webassemblyjs/ast": {
       "version": "1.14.1",
       "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz",
@@ -7396,9 +7559,9 @@
       }
     },
     "node_modules/babylonjs-gltf2interface": {
-      "version": "7.37.0",
-      "resolved": "https://registry.npmmirror.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-7.37.0.tgz",
-      "integrity": "sha512-SG6tl3kiI8lkO+XS22RPQMgDJio/7FyCBTN0/C65UP8wUWbFXPIbPb1zUdJBufpCWXsrCgTNad1IWlulQ4iNxw==",
+      "version": "7.35.2",
+      "resolved": "https://registry.npmmirror.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-7.35.2.tgz",
+      "integrity": "sha512-mJtvjD6+Tjz/bvqoNH23PEOsLMAcxSl44ucZV2Yob8apJUh4UvCneAPREwLCLpu5N959L7ChlwtSU0+NBYbawQ==",
       "license": "Apache-2.0",
       "peer": true
     },
@@ -8433,7 +8596,6 @@
       "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==",
       "hasInstallScript": true,
       "license": "MIT",
-      "peer": true,
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/core-js"
@@ -8523,8 +8685,7 @@
       "version": "4.2.0",
       "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
       "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/css-loader": {
       "version": "7.1.2",
@@ -8605,6 +8766,12 @@
         "node": ">=4"
       }
     },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+      "license": "MIT"
+    },
     "node_modules/custom-event": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/custom-event/-/custom-event-1.0.1.tgz",
@@ -9002,6 +9169,22 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/echarts": {
+      "version": "5.5.1",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz",
+      "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "2.3.0",
+        "zrender": "5.6.0"
+      }
+    },
+    "node_modules/echarts/node_modules/tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
+      "license": "0BSD"
+    },
     "node_modules/ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
@@ -9924,6 +10107,12 @@
         "node": ">=4.0"
       }
     },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "license": "MIT"
+    },
     "node_modules/esutils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
@@ -11212,8 +11401,7 @@
       "version": "6.2.1",
       "resolved": "https://registry.npmmirror.com/idb-keyval/-/idb-keyval-6.2.1.tgz",
       "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==",
-      "license": "Apache-2.0",
-      "peer": true
+      "license": "Apache-2.0"
     },
     "node_modules/ieee754": {
       "version": "1.2.1",
@@ -12629,9 +12817,9 @@
       }
     },
     "node_modules/langsmith": {
-      "version": "0.2.8",
-      "resolved": "https://registry.npmmirror.com/langsmith/-/langsmith-0.2.8.tgz",
-      "integrity": "sha512-wKVNZoYtd8EqQWUEsfDZlZ77rH7vVqgNtONXRwynUp7ZFMFUIPhSlqE9pXqrmYPE8ZTBFj7diag2lFgUuaOEKw==",
+      "version": "0.2.7",
+      "resolved": "https://registry.npmmirror.com/langsmith/-/langsmith-0.2.7.tgz",
+      "integrity": "sha512-9LFOp30cQ9K/7rzMt4USBI0SEKKhsH4l42ZERBPXOmDXnR5gYpsGFw8SZR0A6YLnc6vvoEmtr/XKel0Odq2UWw==",
       "license": "MIT",
       "peer": true,
       "dependencies": {
@@ -13216,7 +13404,6 @@
       "version": "0.30.11",
       "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz",
       "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.5.0"
@@ -13953,7 +14140,6 @@
       "version": "3.3.7",
       "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
       "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
-      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -14899,7 +15085,6 @@
       "resolved": "https://registry.npmmirror.com/parse/-/parse-5.3.0.tgz",
       "integrity": "sha512-mWBnE6hHJhdvlx5KPQcYgCGRdgqKhPw+5fSC0j7vOfse3Lkh3xtDwOfmDpvv2LXZVBj72G/mgVKMRmbAICRzkQ==",
       "license": "Apache-2.0",
-      "peer": true,
       "dependencies": {
         "@babel/runtime-corejs3": "7.24.7",
         "idb-keyval": "6.2.1",
@@ -14974,7 +15159,6 @@
         "https://github.com/sponsors/ctavan"
       ],
       "license": "MIT",
-      "peer": true,
       "bin": {
         "uuid": "dist/bin/uuid"
       }
@@ -15118,7 +15302,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
       "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
-      "dev": true,
       "license": "ISC"
     },
     "node_modules/picomatch": {
@@ -15856,8 +16039,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
       "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/readable-stream": {
       "version": "3.6.2",
@@ -16984,7 +17166,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
       "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
-      "dev": true,
       "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.10.0"
@@ -17438,6 +17619,25 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/swiper": {
+      "version": "11.1.15",
+      "resolved": "https://registry.npmmirror.com/swiper/-/swiper-11.1.15.tgz",
+      "integrity": "sha512-IzWeU34WwC7gbhjKsjkImTuCRf+lRbO6cnxMGs88iVNKDwV+xQpBCJxZ4bNH6gSrIbbyVJ1kuGzo3JTtz//CBw==",
+      "funding": [
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/swiperjs"
+        },
+        {
+          "type": "open_collective",
+          "url": "http://opencollective.com/swiper"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4.7.0"
+      }
+    },
     "node_modules/symbol-observable": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/symbol-observable/-/symbol-observable-4.0.0.tgz",
@@ -17945,7 +18145,7 @@
       "version": "5.4.5",
       "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.4.5.tgz",
       "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
-      "dev": true,
+      "devOptional": true,
       "license": "Apache-2.0",
       "bin": {
         "tsc": "bin/tsc",
@@ -18780,6 +18980,27 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/vue": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz",
+      "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-sfc": "3.5.13",
+        "@vue/runtime-dom": "3.5.13",
+        "@vue/server-renderer": "3.5.13",
+        "@vue/shared": "3.5.13"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/watchpack": {
       "version": "2.4.1",
       "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.1.tgz",
@@ -19494,7 +19715,6 @@
       "resolved": "https://registry.npmmirror.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
       "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=0.4.0"
       }
@@ -19639,6 +19859,21 @@
       "resolved": "https://registry.npmmirror.com/zone.js/-/zone.js-0.14.10.tgz",
       "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==",
       "license": "MIT"
+    },
+    "node_modules/zrender": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz",
+      "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "tslib": "2.3.0"
+      }
+    },
+    "node_modules/zrender/node_modules/tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
+      "license": "0BSD"
     }
   }
 }

+ 8 - 1
smarthotel-app/package.json → tailor-app/myapp/package.json

@@ -1,5 +1,5 @@
 {
-  "name": "smarthotel-app",
+  "name": "myapp",
   "version": "0.0.1",
   "author": "Ionic Framework",
   "homepage": "https://ionicframework.com/",
@@ -27,10 +27,17 @@
     "@capacitor/keyboard": "6.0.3",
     "@capacitor/status-bar": "6.0.2",
     "@ionic/angular": "^8.0.0",
+    "@ionic/vue": "^8.4.0",
+    "@ionic/vue-router": "^8.4.0",
+    "@types/echarts": "^4.9.22",
+    "echarts": "^5.5.1",
     "fmode-ng": "^0.0.62",
     "ionicons": "^7.2.1",
+    "parse": "^5.3.0",
     "rxjs": "~7.8.0",
+    "swiper": "^11.1.15",
     "tslib": "^2.3.0",
+    "vue": "^3.5.13",
     "zone.js": "~0.14.2"
   },
   "devDependencies": {

+ 0 - 0
smarthotel-app/src/app/app.component.html → tailor-app/myapp/src/app/app.component.html


+ 0 - 0
smarthotel-app/src/app/app.component.scss → tailor-app/myapp/src/app/app.component.scss


+ 0 - 0
smarthotel-app/src/app/app.component.spec.ts → tailor-app/myapp/src/app/app.component.spec.ts


+ 0 - 0
smarthotel-app/src/app/app.component.ts → tailor-app/myapp/src/app/app.component.ts


+ 28 - 0
tailor-app/myapp/src/app/app.routes.ts

@@ -0,0 +1,28 @@
+import { Routes } from '@angular/router';
+
+export const routes: Routes = [
+  {
+    path: '',
+    loadChildren: () => import('./tabs/tabs.routes').then((m) => m.routes),
+  },
+  {
+    path: 'customization',
+    loadComponent: () => import('./customization/customization.page').then( m => m.CustomizationPage)
+  },
+  {
+    path: 'community',
+    loadComponent: () => import('./community/community.page').then( m => m.CommunityPage)
+  },
+  {
+    path: 'yiyun',
+    loadComponent: () => import('./yiyun/yiyun.page').then( m => m.YiyunPage)
+  },
+  {
+    path: 'store',
+    loadComponent: () => import('./store/store.page').then( m => m.StorePage)
+  },
+  {
+    path: 'me',
+    loadComponent: () => import('./me/me.page').then( m => m.MePage)
+  },
+];

+ 4 - 0
tailor-app/myapp/src/app/community/community.page.html

@@ -0,0 +1,4 @@
+
+<ion-content>
+  <div class="echarts" id="chart"></div>
+</ion-content>

+ 5 - 0
tailor-app/myapp/src/app/community/community.page.scss

@@ -0,0 +1,5 @@
+.echarts{
+    width: 340px;
+    height: 200px;
+    margin: 0 auto;
+}

+ 17 - 0
tailor-app/myapp/src/app/community/community.page.spec.ts

@@ -0,0 +1,17 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { CommunityPage } from './community.page';
+
+describe('CommunityPage', () => {
+  let component: CommunityPage;
+  let fixture: ComponentFixture<CommunityPage>;
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(CommunityPage);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 97 - 0
tailor-app/myapp/src/app/community/community.page.ts

@@ -0,0 +1,97 @@
+
+import { Component, NgModule, OnInit } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { addIcons } from 'ionicons';
+import { camera,trendingUpOutline,sparklesOutline,cloudyOutline,diceOutline} from 'ionicons/icons';
+import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonLabel, IonItem, IonList, IonBackButton, IonButtons, IonIcon, IonItemDivider, IonAvatar, IonThumbnail, IonItemOptions, IonItemOption, IonItemSliding, IonInput, IonCheckbox, IonRadio, IonToggle, IonRadioGroup, IonSearchbar,IonSegment,IonSegmentButton,IonDatetime,IonFooter,IonCardContent,IonCardTitle,IonCardHeader,IonCard,IonCol,IonRow,IonGrid,IonChip,IonTabButton,IonListHeader,ItemReorderEventDetail, IonTabBar, IonTabs,IonCardSubtitle,IonImg,IonBadge   } from '@ionic/angular/standalone';
+addIcons({camera,trendingUpOutline,sparklesOutline,cloudyOutline,diceOutline})
+
+import * as echarts from 'echarts';
+@Component({
+  selector: 'app-community',
+  templateUrl: './community.page.html',
+  styleUrls: ['./community.page.scss'],
+  standalone: true,
+  imports: [IonContent, IonHeader, IonTitle, IonToolbar, CommonModule, FormsModule, IonButton,  IonLabel, IonLabel, IonList, IonItem, IonBackButton, IonButtons, IonIcon, IonItemDivider, IonAvatar, IonThumbnail, IonItemOptions, IonItemSliding, IonItemOption, IonItemOptions,IonInput,IonCheckbox,IonRadio,IonToggle,IonRadioGroup,IonSearchbar,IonSegment,IonSegmentButton,IonDatetime,IonFooter,IonCardContent,IonCardTitle,IonCardHeader,IonCard,IonCol,IonRow,IonGrid,IonChip,IonTabButton,IonTabBar,IonTabs,IonListHeader,IonCardSubtitle,IonImg,IonBadge ]
+
+})
+
+
+export class CommunityPage implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+    
+    this.initEchart();
+  }
+  public chart: any;
+  initEchart() {
+    let ec = echarts as any;
+    let container = document.getElementById('chart');
+    this.chart = ec.init(container);
+    let option = {
+      tooltip: {
+        trigger: 'axis'
+      },
+      legend: {
+        data: ['邮件营销', '联盟广告', '视频广告', '直接访问', '搜索引擎']
+      },
+      grid: {
+        left: "2%",
+        right: "3%",
+        bottom: "1%",
+        borderWidth:10,
+        containLabel: true
+      },
+      toolbox: {
+        feature: {
+          saveAsImage: {}
+        }
+      },
+      xAxis: {
+        type: 'category',
+        boundaryGap: false,
+        data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
+      },
+      yAxis: {
+        type: 'value'
+      },
+      series: [
+        {
+          name: '邮件营销',
+          type: 'line',
+          stack: '总量',
+          data: [120, 132, 101, 134, 90, 230, 210]
+        },
+        {
+          name: '联盟广告',
+          type: 'line',
+          stack: '总量',
+          data: [220, 182, 191, 234, 290, 330, 310]
+        },
+        {
+          name: '视频广告',
+          type: 'line',
+          stack: '总量',
+          data: [150, 232, 201, 154, 190, 330, 410]
+        },
+        {
+          name: '直接访问',
+          type: 'line',
+          stack: '总量',
+          data: [320, 332, 301, 334, 390, 330, 320]
+        },
+        {
+          name: '搜索引擎',
+          type: 'line',
+          stack: '总量',
+          data: [820, 932, 901, 934, 1290, 1330, 1320]
+        }
+      ]
+    };
+ 
+    this.chart.setOption(option);
+}}
+

+ 58 - 0
tailor-app/myapp/src/app/customization/customization.page.html

@@ -0,0 +1,58 @@
+<ion-header [translucent]="true">
+  <ion-toolbar>
+    <ion-title>customization</ion-title>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+  
+  
+
+
+    <ion-list >
+      <ion-item  >
+        <app-edit-tag (onTagChange)="setTags($event)"></app-edit-tag>
+      </ion-item>
+
+      <ion-item  >
+        <ion-textarea (ionInput)="onInputarea($event)" label="服装描述" placeholder="请尽可能描述衣服需要的功能" [autoGrow]="true"></ion-textarea>
+      </ion-item>
+
+    </ion-list>    
+    <!-- <h1>父级页面传参</h1>
+    @for(tag of editTags;track tag;){
+      <p>{{tag}}</p>
+    } -->
+    <!-- GPT组件 -->
+    <!-- <h1>GPT组件</h1>
+     <ion-input type="" [(ngModel)]="inputValue"  ></ion-input> -->
+    <ion-button (click)="printInputValue()">提交</ion-button>
+    @if(!isComplete){
+      <div>{{gptre}}</div>
+    }
+   
+   @if(isComplete){
+    <fm-markdown-preview class="content-style" [content]="gptre" ></fm-markdown-preview>
+   }
+
+
+   <ion-title>服装生成{{imagineWork?.progress || 0}}</ion-title>
+   <!-- <ion-textarea [value]="userPrompt" (ionInput)="promptInput($event)" placeholder="服装填写" autoGrow="true"></ion-textarea> -->
+  <ion-button (click)="createImage()" expand="block">生成图片</ion-button>
+  <!-- 生成结果 -->
+  @if(images.length) {
+    @for(imageUrl of images;track imageUrl){
+      <img [src]="imageUrl" alt="" srcset="">
+    }
+  }
+  <!-- 生成状态 -->
+  @if(!images.length){
+    @if(imagineWork){
+      <h1>生成中</h1>
+    }
+    @if(!imagineWork){
+      <h1>未开始</h1>
+    }
+  }
+  {{   picdetail}}
+</ion-content>

+ 0 - 0
smarthotel-app/src/app/edit-tag/edit-tag.component.scss → tailor-app/myapp/src/app/customization/customization.page.scss


+ 17 - 0
tailor-app/myapp/src/app/customization/customization.page.spec.ts

@@ -0,0 +1,17 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { CustomizationPage } from './customization.page';
+
+describe('CustomizationPage', () => {
+  let component: CustomizationPage;
+  let fixture: ComponentFixture<CustomizationPage>;
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(CustomizationPage);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 189 - 0
tailor-app/myapp/src/app/customization/customization.page.ts

@@ -0,0 +1,189 @@
+import { Component, OnInit } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonInput, IonTextarea, IonItem, IonList } from '@ionic/angular/standalone';
+import { TestChatCompletion } from './test-chat-completion';
+import { EditTagComponent } from '../edit-tag/edit-tag.component';
+import { FmodeChatCompletion, MarkdownPreviewModule } from 'fmode-ng';
+import { DalleOptions, ImagineWork } from 'fmode-ng';
+@Component({
+  selector: 'app-customization',
+  templateUrl: './customization.page.html',
+  styleUrls: ['./customization.page.scss'],
+  standalone: true,
+  imports: [IonContent, IonHeader, IonTitle, IonToolbar, CommonModule, FormsModule, IonButton, IonInput, EditTagComponent, IonTextarea, IonItem, IonList, MarkdownPreviewModule,]
+})
+export class CustomizationPage implements OnInit {
+  public isComplete: boolean = false;
+  public inputValue = ""
+  public gptre = ""
+  area: string = ""
+  editTags: Array<string> = []
+  onInput(event: any) {
+    console.log(event.detail.value);
+
+  }
+  setTags(ev: any) {
+    console.log(ev);
+    this.editTags = ev
+  }
+  onInputarea(event: any) {
+    this.area = event.detail.value;
+    console.log(this.area);
+
+  }
+  ngOnInit() {
+  }
+
+
+  async printInputValue() {
+    console.log("create")
+    let promt = `您作为一名专业的服装推荐师,请帮我推荐具体的某件衣服,不要鞋子裤子,帽子,我只要你推荐某个具体服装,风格是:${this.editTags.join(",")},需要的衣服功能是:${this.area}`
+    let completion = new FmodeChatCompletion([
+      { role: "system", content: "" },
+      { role: "user", content: promt }
+    ])
+    completion.sendCompletion().subscribe((message: any) => {
+      // 打印消息体
+      console.log(message.content)
+      // 赋值消息内容给组件内属性
+      this.gptre = message.content
+      if (message?.complete) {
+        this.isComplete = true
+      }
+    })
+
+
+
+
+
+
+
+
+    // console.log("开始解析");
+    // console.log(this.inputValue);
+
+    // let token = "r:16cd8f27084ff647fcdb5308a6783c4c"
+    // localStorage.setItem("token",token)
+    // let promt=`您作为一名专业的服装推荐师,请帮我推荐具体的某件衣服,风格是:${this.editTags.join(",")},需要的衣服功能是:${this.area}`
+    // let messageList: any = [
+    //   {
+    //     role: "system", content: `${new Date().toLocaleString}`
+    //   },
+    //   {
+    //     role: "user", content: promt
+    //   }
+    // ]
+
+    // let completion=new TestChatCompletion(messageList)
+    // completion.createCompletionByStream()
+    // setInterval(()=>{
+    //   console.log(messageList);
+    //   if(messageList.length!=1){
+    //     this.gptre=messageList[messageList.length-1].content
+
+    //   }
+    // },2000)
+
+
+    // let bodyJson = {
+    //   "token": `Bearer ${token}`,
+    //   "messages": messageList,
+    //   "model": "fmode-4.5-128k",
+    //   "temperature": 0.5,
+    //   "presence_penalty": 0,
+    //   "frequency_penalty": 0,
+    //   "top_p": 1,
+    //   "stream": true
+    // };
+
+    // let response = await fetch("https://test.fmode.cn/api/apig/aigc/gpt/v1/chat/completions", {
+    //   "headers": {
+    //     "accept": "text/event-stream",
+    //   },
+    //   "body": JSON.stringify(bodyJson),
+    //   "method": "POST",
+    //   "mode": "cors",
+    //   "credentials": "omit"
+    // });
+    // let reader = response.body?.getReader()
+    // if (!reader) {
+    //   throw new Error("Failed to get the response reader.");
+    // }
+
+    // let decoder = new TextDecoder();
+    // let buffer = "";
+
+    // while (true) {
+    //   let { done, value } = await reader.read();
+    //   if (done) {
+    //     break;
+    //   }
+    //   let data = decoder.decode(value);
+    //   let messages = data.split("\n");
+    //   console.log(messages);
+
+    //   for (let i = 0; i < messages.length - 1; i++) {
+    //     let message = messages[i];
+    //     console.log(message);
+    //     let dataStr: string = message.split("data: ")[1]
+    //     if (dataStr && dataStr.startsWith("{")) {
+    //       try {
+    //         let json = JSON.parse(dataStr);
+    //         let content = json.choices[0].delta.content
+    //         this.gptre = this.gptre + content
+    //       } catch (err) { }
+    //     }
+
+
+    //   }
+    // }
+
+
+  }
+
+  userPrompt: string = ""
+  promptInput(ev: any) {
+    this.userPrompt = ev.detail.value;
+  }
+  imagineWork: ImagineWork | undefined
+  images: Array<string> = []
+  constructor(
+  ) {
+    // 示例任务,自己生成图片后请存储新的ID
+    console.log('ImagineWork instance:', this.imagineWork);
+    this.imagineWork = new ImagineWork("EXOVSbrmMK");
+    this.imagineWork.fetchTask().then(work => {
+      this.images = this.imagineWork?.images || [];
+    })
+  }
+  picdetail: string = ""
+  async createImage() {
+    let promotTemplate = `您是一名专业的美术画家,请您根据服装描述内容,将其描述的服装细节描述出来,服装描述如下:${this.gptre}`
+    let completion = new FmodeChatCompletion([
+      { role: "system", content: "" },
+      { role: "user", content: promotTemplate }
+    ])
+
+    completion.sendCompletion().subscribe((message: any) => {
+      // 打印消息体
+      console.log(message.content)
+      // 赋值消息内容给组件内属性
+      this.picdetail = message.content
+      if (message?.complete) {
+        this.imagineWork = new ImagineWork();
+        let options: DalleOptions = { prompt: this.picdetail }
+        this.imagineWork.draw(options).subscribe(work => {
+          console.log("imagineWork", work?.toJSON())
+          console.log("images", work?.get("images"))
+          if (work?.get("images")?.length) {
+            this.images = work?.get("images");
+          }
+        })
+      }
+    })
+
+
+
+  }
+}

+ 99 - 0
tailor-app/myapp/src/app/customization/test-chat-completion.ts

@@ -0,0 +1,99 @@
+export interface TestChatMessage{
+    role:string
+    content:string
+}
+export class TestChatCompletion{
+messageList:Array<TestChatMessage>
+constructor(messageList:Array<TestChatMessage>){
+    this.messageList = messageList
+}
+async createCompletionByStream() {
+
+let token = localStorage.getItem("token");
+let bodyJson = {
+  "token": `Bearer ${token}`,
+  "messages": this.messageList,
+  "model": "fmode-4.5-128k",
+  "temperature": 0.5,
+  "presence_penalty": 0,
+  "frequency_penalty": 0,
+  "top_p": 1,
+  "stream":true
+};
+
+let response = await fetch("https://test.fmode.cn/api/apig/aigc/gpt/v1/chat/completions", {
+  "headers": {
+    "accept": "text/event-stream",
+    "sec-fetch-dest": "empty",
+    "sec-fetch-mode": "cors",
+    "sec-fetch-site": "same-site"
+  },
+  "referrer": "https://ai.fmode.cn/",
+  "referrerPolicy": "strict-origin-when-cross-origin",
+  "body": JSON.stringify(bodyJson),
+  "method": "POST",
+  "mode": "cors",
+  "credentials": "omit"
+});
+
+let messageAiReply = ""
+let messageIndex = this.messageList.length
+let reader = response.body?.getReader();
+if (!reader) {
+  throw new Error("Failed to get the response reader.");
+}
+
+let decoder = new TextDecoder();
+let buffer = "";
+
+while (true) {
+  let { done, value } = await reader.read();
+  if (done) {
+    break;
+  }
+
+  buffer += decoder.decode(value);
+
+  // Split the buffer by newlines to get individual messages
+  let messages = buffer.split("\n");
+
+  // Process each message
+  for (let i = 0; i < messages.length - 1; i++) {
+    let message = messages[i];
+
+    // Process the message as needed
+    /**
+     * data: {"id":"chatcmpl-y2PLKqPDnwAFJIj2L5aqdH5TWK9Yv","object":"chat.completion.chunk","created":1696770162,"model":"fmode-4.5-128k","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
+     * data: {"id":"chatcmpl-y2PLKqPDnwAFJIj2L5aqdH5TWK9Yv","object":"chat.completion.chunk","created":1696770162,"model":"fmode-4.5-128k","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
+     * data: [DONE]
+     */
+    let dataText = message.replace("data:\ ","")
+    if(dataText.startsWith("{")){
+      try{
+        let dataJson = JSON.parse(dataText)
+        console.log(dataJson)
+        messageAiReply += dataJson?.choices?.[0]?.delta?.content || ""
+        this.messageList[messageIndex] = {
+          role:"assistant",
+          content:messageAiReply
+        }
+      }catch(err){}
+    }
+    if(dataText.startsWith("[")){
+      console.log(message)
+      console.log("完成")
+      this.messageList[messageIndex] = {
+        role:"assistant",
+        content:messageAiReply
+      }
+      messageAiReply = ""
+    }
+    // Parse the message as JSON
+    // let data = JSON.parse(message);
+
+    // Clear the processed message from the buffer
+    buffer = buffer.slice(message.length + 1);
+  }
+}
+}
+}

+ 11 - 0
tailor-app/myapp/src/app/edit-tag/edit-tag.component.html

@@ -0,0 +1,11 @@
+
+
+  
+  
+    <ion-input [value]="userInputText" (ionInput)="onInput($event)" type="" ></ion-input>
+    <!-- <p>当前输入{{userInputText}}</p> -->
+    <ion-button (click)="addtag()">添加标签</ion-button>
+    @for(tag of tags;track tag;){
+      <ion-chip>{{tag}} <span (click)="deleteTag(tag)">x</span></ion-chip>
+    }
+    

+ 0 - 0
smarthotel-app/src/app/hotel-picture/hotel-picture.component.scss → tailor-app/myapp/src/app/edit-tag/edit-tag.component.scss


+ 3 - 1
smarthotel-app/src/app/edit-tag/edit-tag.component.spec.ts → tailor-app/myapp/src/app/edit-tag/edit-tag.component.spec.ts

@@ -1,4 +1,5 @@
 import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
 
 import { EditTagComponent } from './edit-tag.component';
 
@@ -8,7 +9,8 @@ describe('EditTagComponent', () => {
 
   beforeEach(waitForAsync(() => {
     TestBed.configureTestingModule({
-      imports: [EditTagComponent],
+      declarations: [ EditTagComponent ],
+      imports: [IonicModule.forRoot()]
     }).compileComponents();
 
     fixture = TestBed.createComponent(EditTagComponent);

+ 43 - 0
tailor-app/myapp/src/app/edit-tag/edit-tag.component.ts

@@ -0,0 +1,43 @@
+import { Component, EventEmitter, OnInit, Output } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonInput, IonChip, IonItem, IonList } from '@ionic/angular/standalone';
+
+@Component({
+  selector: 'app-edit-tag',
+  templateUrl: './edit-tag.component.html',
+  styleUrls: ['./edit-tag.component.scss'],
+  standalone: true,
+  imports: [IonContent, IonHeader, IonTitle, IonToolbar, CommonModule, FormsModule,IonButton,IonInput,IonChip,IonItem,IonList]
+
+})
+export class EditTagComponent  implements OnInit {
+  public inputValue = ""
+  public gptre = ""
+  tags:Array<string>=[]
+
+  userInputText:string=""
+  onInput(event:any){
+  this.userInputText=  event.detail.value
+    
+  }
+  deleteTag(tag:string){
+    let idx=this.tags.findIndex(item=>item==tag)
+    this.tags.splice(idx,1)
+
+  }
+  addtag(){
+    this.tags.push(this.userInputText);
+    this.userInputText=""
+    this.onTagChange.emit(this.tags)
+  }
+  @Output()
+  onTagChange:EventEmitter<Array<string>>=new EventEmitter<Array<string>>()
+  constructor() { }
+
+  ngOnInit() {
+  }
+  
+
+  
+}

+ 0 - 0
smarthotel-app/src/app/explore-container/explore-container.component.html → tailor-app/myapp/src/app/explore-container/explore-container.component.html


+ 0 - 0
smarthotel-app/src/app/explore-container/explore-container.component.scss → tailor-app/myapp/src/app/explore-container/explore-container.component.scss


+ 0 - 0
smarthotel-app/src/app/explore-container/explore-container.component.spec.ts → tailor-app/myapp/src/app/explore-container/explore-container.component.spec.ts


+ 0 - 0
smarthotel-app/src/app/explore-container/explore-container.component.ts → tailor-app/myapp/src/app/explore-container/explore-container.component.ts


BIN
tailor-app/myapp/src/app/me/img/绘图1.jpg


+ 239 - 0
tailor-app/myapp/src/app/me/me.page.html

@@ -0,0 +1,239 @@
+<ion-header [translucent]="true">
+  <ion-toolbar color="success">
+    <ion-title>me</ion-title>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+
+    <!-- GPT组件 -->
+    <h1>GPT组件</h1>
+     <ion-input type="" [(ngModel)]="inputValue"  ></ion-input>
+    <ion-button (click)="printInputValue()">提交</ion-button>
+   {{gptre}}
+
+
+  <h1>页面跳转和组件使用</h1>
+  <!-- 页面跳转和组件使用 -->
+  <ion-button [routerLink]="[ '/yiyun' ]">
+    跳转到yiyun
+  </ion-button>
+
+  <app-slide></app-slide>
+  <h1>button组件调用</h1>
+  <!-- button组件调用 -->
+  <ion-button [routerLink]="[ '/yiyun' ]" color="warning">
+    修改按钮颜色
+  </ion-button>
+ 
+  <ion-buttons slot="start">
+    <ion-back-button>返回i按钮</ion-back-button>
+  </ion-buttons>
+
+  <ion-button expand="block">
+    按钮可以block
+  </ion-button>
+
+  <ion-button expand="full">
+    按钮可以直角
+  </ion-button>
+
+  <ion-button fill="clear" expand="block">
+    按钮可以透明背景填充
+  </ion-button>
+
+  <ion-button>
+    <ion-icon slot="icon-only" name="add"></ion-icon>
+  </ion-button>
+  <ion-button fill="clear">
+    <ion-icon slot="icon-only" name="add"></ion-icon>
+  </ion-button>
+
+  <ion-button size="small">
+    小按钮
+  </ion-button>
+  <ion-button size="large">
+    大按钮
+  </ion-button>
+
+  <ion-button mode="ios" color="primary">
+    ios按钮
+  </ion-button>
+  <ion-button mode="md" color="primary">
+    android按钮
+  </ion-button>
+
+  <ion-button>
+    <ion-icon name="add" slot="start"></ion-icon>
+    图片在左侧文字在右侧按钮
+  </ion-button>
+  <ion-button>
+    <ion-icon name="add" slot="end"></ion-icon>
+    图片在右侧文字在右侧按钮
+  </ion-button>
+
+  <!-- List组件调用 -->
+  <h1>List组件调用 </h1>
+  <ion-list lines="full">
+    <ion-item *ngFor="let item of list" [routerLink]="[ '/yiyun' ]">
+      {{item}}
+    </ion-item>
+  </ion-list>
+
+  <ion-list>
+    <ion-item-divider>
+      <ion-label>分组列表A</ion-label>
+    </ion-item-divider>
+    <ion-item>
+      a
+    </ion-item>
+    <ion-item>
+      aaa
+    </ion-item>
+
+    <ion-item-divider>
+      <ion-label>B</ion-label>
+    </ion-item-divider>
+    <ion-item>
+      b
+    </ion-item>
+    <ion-item>
+      bbb
+    </ion-item>
+  </ion-list>
+
+  <ion-list lines="full">
+    <ion-item *ngFor="let item of list">
+      <ion-icon slot="start" name="add"></ion-icon>
+      带图标列表{{item}}
+    </ion-item>
+  </ion-list>
+
+  <ion-list>
+    <ion-item *ngFor="let item of list">
+      <ion-avatar item-left>
+        <img src="assets/shapes.svg">
+      </ion-avatar>
+      <ion-label>列表中的头像</ion-label>
+    </ion-item>
+  </ion-list>
+
+  <ion-list>
+    <ion-item *ngFor="let item of list">
+      <ion-thumbnail item-left>
+        <img src="assets/shapes.svg">
+      </ion-thumbnail>
+      <div>
+        <h2>我是标题</h2>
+        <p>我是新闻</p>
+      </div>
+      <button ion-button clear item-right></button>
+    </ion-item>
+  </ion-list>
+
+  <ion-list>
+    <ion-item-sliding>
+      <ion-item>
+        <ion-label>滑动列表1</ion-label>
+      </ion-item>
+      <ion-item-options side="start">
+        <ion-item-option>Favorite</ion-item-option>
+        <ion-item-option color="primary">Share</ion-item-option>
+      </ion-item-options>
+
+      <ion-item-options side="end">
+        <ion-item-option>Unread</ion-item-option>
+      </ion-item-options>
+    </ion-item-sliding>
+
+    <ion-item-sliding>
+      <ion-item>
+        <ion-label>滑动列表2</ion-label>
+      </ion-item>
+      <ion-item-options side="start">
+        <ion-item-option>Favorite</ion-item-option>
+        <ion-item-option color="primary">Share</ion-item-option>
+      </ion-item-options>
+
+      <ion-item-options side="end">
+        <ion-item-option>Unread</ion-item-option>
+      </ion-item-options>
+    </ion-item-sliding>
+  </ion-list>
+  <!-- 表单组件 -->
+  <h1>表单组件</h1>
+
+  <ion-list>
+    <ion-item>
+      <ion-label>用户名</ion-label>
+      <ion-input [(ngModel)]="peopleInfo.username"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label>是否本科</ion-label>
+      <ion-toggle slot="end" [(ngModel)]="peopleInfo.flag"></ion-toggle>
+    </ion-item>
+
+    <ion-radio-group [(ngModel)]="peopleInfo.payType">
+      <ion-item>
+        <ion-avatar item-left>
+          <img src="assets/shapes.svg">
+        </ion-avatar>
+        <ion-label>支付宝支付</ion-label>
+        <ion-radio value="1"></ion-radio>
+      </ion-item>
+
+      <ion-item>
+        <ion-avatar item-left>
+          <img src="assets/shapes.svg">
+        </ion-avatar>
+        <ion-label>微信支付</ion-label>
+        <ion-radio value="2"></ion-radio>
+      </ion-item>
+
+    </ion-radio-group>
+
+    <ion-item>
+      <ion-label>checkbox</ion-label>
+      <ion-checkbox></ion-checkbox>
+    </ion-item>
+  </ion-list>
+  {{peopleInfo|json}}
+
+  <!-- 搜索框 -->
+  <h1>搜索框</h1>
+  <ion-searchbar animated="true" placeholder="Animated"></ion-searchbar>
+  <ion-searchbar placeholder="Filter Pizza" (ionInput)="onSearchInput($event)" animated></ion-searchbar>
+
+  <!-- segment演示 -->
+  <h1>segment演示</h1>
+  <ion-segment [(ngModel)]="tab">
+    <ion-segment-button value="tab1">
+      <ion-label>详情</ion-label>
+    </ion-segment-button>
+    <ion-segment-button value="tab2">
+      <ion-label>评论</ion-label>
+    </ion-segment-button>
+
+    <div class="info" [ngSwitch]="tab">
+      <div *ngSwitchCase="'tab1'">商品简介</div>
+      <div *ngSwitchCase="'tab2'">商品评论</div>
+
+    </div>
+
+
+    {{tab}}
+
+    <!-- 日期组件 -->
+    <h1>日期组件</h1>
+    <ion-list>
+
+      <ion-item>
+        <ion-label>Date</ion-label>
+        <ion-datetime display-format="DD.MM.YYYY HH:mm"></ion-datetime>
+      </ion-item>
+    </ion-list>
+  </ion-segment>
+
+
+</ion-content>

+ 0 - 0
smarthotel-app/src/app/page-test/page-test.component.scss → tailor-app/myapp/src/app/me/me.page.scss


+ 6 - 7
smarthotel-app/src/app/tab2/tab2.page.spec.ts → tailor-app/myapp/src/app/me/me.page.spec.ts

@@ -1,13 +1,12 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MePage } from './me.page';
 
-import { Tab2Page } from './tab2.page';
+describe('MePage', () => {
+  let component: MePage;
+  let fixture: ComponentFixture<MePage>;
 
-describe('Tab2Page', () => {
-  let component: Tab2Page;
-  let fixture: ComponentFixture<Tab2Page>;
-
-  beforeEach(async () => {
-    fixture = TestBed.createComponent(Tab2Page);
+  beforeEach(() => {
+    fixture = TestBed.createComponent(MePage);
     component = fixture.componentInstance;
     fixture.detectChanges();
   });

+ 124 - 0
tailor-app/myapp/src/app/me/me.page.ts

@@ -0,0 +1,124 @@
+import { Component, OnInit } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonLabel, IonItem, IonList, IonBackButton, IonButtons, IonIcon, IonItemDivider, IonAvatar, IonThumbnail, IonItemOptions, IonItemOption, IonItemSliding, IonInput, IonCheckbox, IonRadio, IonToggle, IonRadioGroup, IonSearchbar, IonSegment, IonSegmentButton, IonDatetime } from '@ionic/angular/standalone';
+import { RouterModule } from '@angular/router';
+import { SlideModule } from '../module/slide/slide.module';
+import { addIcons } from 'ionicons';
+import { add } from 'ionicons/icons';
+// import {FmodeChatCompletion} from "fmode-ng"
+import { TestChatCompletion } from './test-chat-completion';
+
+addIcons({ add })
+@Component({
+  selector: 'app-me',
+  templateUrl: './me.page.html',
+  styleUrls: ['./me.page.scss'],
+  standalone: true,
+  imports: [IonContent, IonHeader, IonTitle, IonToolbar, CommonModule, FormsModule, IonButton, RouterModule, IonLabel, IonLabel, IonList, IonItem, SlideModule, IonBackButton, IonButtons, IonIcon, IonItemDivider, IonAvatar, IonThumbnail, IonItemOptions, IonItemSliding, IonItemOption, IonItemOptions, IonInput, IonCheckbox, IonRadio, IonToggle, IonRadioGroup, IonSearchbar, IonSegment, IonSegmentButton, IonDatetime]
+})
+export class MePage implements OnInit {
+  public list: any = []
+  public tab = "tab1"
+  constructor() { }
+  public inputValue = ""
+  public gptre = ""
+  public peopleInfo: any = {
+    username: '',
+    age: 20,
+    flag: true,
+    payType: '1',
+    checkBoxList: [
+      { val: '吃饭', ischecked: true },
+      { val: '睡觉', ischecked: false },
+      { val: '敲代码', ischecked: false }
+    ],
+    cityList: ['北京', '上海', '深圳'],
+    city: '北京'
+  }
+  ngOnInit() {
+    for (var i = 0; i < 5; i++) {
+      this.list.push(`aaaaaaa${i}`);
+    }
+  }
+  onSearchInput(event: any) {
+    console.log(event.target.value);
+  }
+  async printInputValue() {
+    console.log("开始解析");
+
+    let token = "r:16cd8f27084ff647fcdb5308a6783c4c"
+    localStorage.setItem("token",token)
+    let messageList: any = [
+      {
+        role: "system", content: `${new Date().toLocaleString}`
+      },
+      {
+        role: "user", content: this.inputValue
+      }
+    ]
+
+    let completion=new TestChatCompletion(messageList)
+    completion.createCompletionByStream()
+    setInterval(()=>{
+      console.log(messageList);
+      this.gptre=messageList[messageList.length-1].content
+    },1000)
+
+
+    // let bodyJson = {
+    //   "token": `Bearer ${token}`,
+    //   "messages": messageList,
+    //   "model": "fmode-4.5-128k",
+    //   "temperature": 0.5,
+    //   "presence_penalty": 0,
+    //   "frequency_penalty": 0,
+    //   "top_p": 1,
+    //   "stream": true
+    // };
+
+    // let response = await fetch("https://test.fmode.cn/api/apig/aigc/gpt/v1/chat/completions", {
+    //   "headers": {
+    //     "accept": "text/event-stream",
+    //   },
+    //   "body": JSON.stringify(bodyJson),
+    //   "method": "POST",
+    //   "mode": "cors",
+    //   "credentials": "omit"
+    // });
+    // let reader = response.body?.getReader()
+    // if (!reader) {
+    //   throw new Error("Failed to get the response reader.");
+    // }
+
+    // let decoder = new TextDecoder();
+    // let buffer = "";
+
+    // while (true) {
+    //   let { done, value } = await reader.read();
+    //   if (done) {
+    //     break;
+    //   }
+    //   let data = decoder.decode(value);
+    //   let messages = data.split("\n");
+    //   console.log(messages);
+
+    //   for (let i = 0; i < messages.length - 1; i++) {
+    //     let message = messages[i];
+    //     console.log(message);
+    //     let dataStr: string = message.split("data: ")[1]
+    //     if (dataStr && dataStr.startsWith("{")) {
+    //       try {
+    //         let json = JSON.parse(dataStr);
+    //         let content = json.choices[0].delta.content
+    //         this.gptre = this.gptre + content
+    //       } catch (err) { }
+    //     }
+
+
+    //   }
+    // }
+
+
+  }
+}

+ 99 - 0
tailor-app/myapp/src/app/me/test-chat-completion.ts

@@ -0,0 +1,99 @@
+export interface TestChatMessage{
+    role:string
+    content:string
+}
+export class TestChatCompletion{
+messageList:Array<TestChatMessage>
+constructor(messageList:Array<TestChatMessage>){
+    this.messageList = messageList
+}
+async createCompletionByStream() {
+
+let token = localStorage.getItem("token");
+let bodyJson = {
+  "token": `Bearer ${token}`,
+  "messages": this.messageList,
+  "model": "fmode-4.5-128k",
+  "temperature": 0.5,
+  "presence_penalty": 0,
+  "frequency_penalty": 0,
+  "top_p": 1,
+  "stream":true
+};
+
+let response = await fetch("https://test.fmode.cn/api/apig/aigc/gpt/v1/chat/completions", {
+  "headers": {
+    "accept": "text/event-stream",
+    "sec-fetch-dest": "empty",
+    "sec-fetch-mode": "cors",
+    "sec-fetch-site": "same-site"
+  },
+  "referrer": "https://ai.fmode.cn/",
+  "referrerPolicy": "strict-origin-when-cross-origin",
+  "body": JSON.stringify(bodyJson),
+  "method": "POST",
+  "mode": "cors",
+  "credentials": "omit"
+});
+
+let messageAiReply = ""
+let messageIndex = this.messageList.length
+let reader = response.body?.getReader();
+if (!reader) {
+  throw new Error("Failed to get the response reader.");
+}
+
+let decoder = new TextDecoder();
+let buffer = "";
+
+while (true) {
+  let { done, value } = await reader.read();
+  if (done) {
+    break;
+  }
+
+  buffer += decoder.decode(value);
+
+  // Split the buffer by newlines to get individual messages
+  let messages = buffer.split("\n");
+
+  // Process each message
+  for (let i = 0; i < messages.length - 1; i++) {
+    let message = messages[i];
+
+    // Process the message as needed
+    /**
+     * data: {"id":"chatcmpl-y2PLKqPDnwAFJIj2L5aqdH5TWK9Yv","object":"chat.completion.chunk","created":1696770162,"model":"fmode-4.5-128k","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
+     * data: {"id":"chatcmpl-y2PLKqPDnwAFJIj2L5aqdH5TWK9Yv","object":"chat.completion.chunk","created":1696770162,"model":"fmode-4.5-128k","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
+     * data: [DONE]
+     */
+    let dataText = message.replace("data:\ ","")
+    if(dataText.startsWith("{")){
+      try{
+        let dataJson = JSON.parse(dataText)
+        console.log(dataJson)
+        messageAiReply += dataJson?.choices?.[0]?.delta?.content || ""
+        this.messageList[messageIndex] = {
+          role:"assistant",
+          content:messageAiReply
+        }
+      }catch(err){}
+    }
+    if(dataText.startsWith("[")){
+      console.log(message)
+      console.log("完成")
+      this.messageList[messageIndex] = {
+        role:"assistant",
+        content:messageAiReply
+      }
+      messageAiReply = ""
+    }
+    // Parse the message as JSON
+    // let data = JSON.parse(message);
+
+    // Clear the processed message from the buffer
+    buffer = buffer.slice(message.length + 1);
+  }
+}
+}
+}

+ 3 - 0
tailor-app/myapp/src/app/module/slide/slide.component.html

@@ -0,0 +1,3 @@
+<p>
+  slide works!
+</p>

+ 0 - 0
smarthotel-app/src/app/tab1/tab1.page.scss → tailor-app/myapp/src/app/module/slide/slide.component.scss


+ 24 - 0
tailor-app/myapp/src/app/module/slide/slide.component.spec.ts

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

+ 14 - 0
tailor-app/myapp/src/app/module/slide/slide.component.ts

@@ -0,0 +1,14 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-slide',
+  templateUrl: './slide.component.html',
+  styleUrls: ['./slide.component.scss'],
+})
+export class SlideComponent  implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {}
+
+}

+ 13 - 0
tailor-app/myapp/src/app/module/slide/slide.module.ts

@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { SlideComponent } from './slide.component';
+
+
+@NgModule({
+  declarations: [SlideComponent],
+  imports: [
+    CommonModule,
+  ],
+  exports:[SlideComponent]
+})
+export class SlideModule { }

+ 32 - 0
tailor-app/myapp/src/app/store/store.page.html

@@ -0,0 +1,32 @@
+
+<ion-content>
+  <ion-card style="width: 90%;margin: auto;margin-top: 10px;margin-bottom: 10px;">
+    <ion-card-header>
+      <ion-card-title>各类服装年销售量渐变堆叠面积图</ion-card-title>
+    </ion-card-header>
+    <ion-card-content>
+      <p>5年内服装销售量</p>
+      <p>随时间或其他变量的变化趋势和相对大小</p>
+     
+
+<ion-button style="border-color: yellow;" expand="block" (click)="shengcheng1()"><ion-icon name="podium-outline" style="margin-right: 5px;"></ion-icon> VIP一键生成</ion-button>
+    </ion-card-content>
+  </ion-card>
+  @if(visable1){
+    <ion-progress-bar [buffer]="buffer" [value]="progress"></ion-progress-bar>
+  }
+  @if(!visable1){
+    <ion-list style="width: 100%;margin: auto;margin-top: 20px;">
+      <ion-item>
+        <h1 style="font-weight: bolder;">2017-2023 各类服装年销售量渐变堆叠面积图</h1>
+      </ion-item>
+      <ion-item class="noPadding">
+        <div class="echarts " id="chart" ></div>
+  
+          
+      </ion-item>
+    </ion-list>
+  }
+  
+  
+</ion-content>

+ 38 - 0
tailor-app/myapp/src/app/store/store.page.scss

@@ -0,0 +1,38 @@
+.echarts{
+    width: 380px;
+    height: 200px;
+    margin: 0 auto;
+}
+.item-native{
+    margin: 0;
+    padding: 0;
+}
+.noPadding{
+    --padding-start:0
+    --inner-padding-end:0
+}
+ion-button {
+    --background: #000;
+    --background-hover: #9ce0be;
+    --background-activated: #88f4be;
+    --background-focused: #88f4be;
+  
+    --color: #ecc422;
+  
+    --border-radius: 0;
+    --border-color: #000;
+    --border-style: solid;
+    --border-width: 1px;
+  
+    --box-shadow: 0 2px 6px 0 rgb(0, 0, 0, 0.25);
+  
+    --ripple-color: deeppink;
+  
+    --padding-top: 10px;
+    --padding-bottom: 10px;
+  }
+
+  ion-progress-bar {
+    --background: #f3e895;
+    --progress-background: #f7ef18;;
+  }

+ 6 - 7
smarthotel-app/src/app/tab1/tab1.page.spec.ts → tailor-app/myapp/src/app/store/store.page.spec.ts

@@ -1,13 +1,12 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { StorePage } from './store.page';
 
-import { Tab1Page } from './tab1.page';
+describe('StorePage', () => {
+  let component: StorePage;
+  let fixture: ComponentFixture<StorePage>;
 
-describe('Tab1Page', () => {
-  let component: Tab1Page;
-  let fixture: ComponentFixture<Tab1Page>;
-
-  beforeEach(async () => {
-    fixture = TestBed.createComponent(Tab1Page);
+  beforeEach(() => {
+    fixture = TestBed.createComponent(StorePage);
     component = fixture.componentInstance;
     fixture.detectChanges();
   });

+ 242 - 0
tailor-app/myapp/src/app/store/store.page.ts

@@ -0,0 +1,242 @@
+import { Component, OnInit } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonLabel, IonItem, IonList, IonBackButton, IonButtons, IonIcon, IonItemDivider, IonAvatar, IonThumbnail, IonItemOptions, IonItemOption, IonItemSliding, IonInput, IonCheckbox, IonRadio, IonToggle, IonRadioGroup, IonSearchbar,IonSegment,IonSegmentButton,IonDatetime,IonFooter,IonCardContent,IonCardTitle,IonCardHeader,IonCard,IonCol,IonRow,IonGrid,IonChip,IonImg,IonProgressBar } from '@ionic/angular/standalone';
+import * as echarts from 'echarts';
+import { podiumOutline} from 'ionicons/icons';
+import { addIcons } from 'ionicons';
+addIcons({podiumOutline})
+// <ion-icon name="podium-outline"></ion-icon>
+// <ion-icon name="bar-chart-outline"></ion-icon>
+// <ion-icon name="cellular-outline"></ion-icon>
+@Component({
+  selector: 'app-store',
+  templateUrl: './store.page.html',
+  styleUrls: ['./store.page.scss'],
+  standalone: true,
+  imports: [IonContent, IonHeader, IonTitle, IonToolbar, CommonModule, FormsModule, IonButton,  IonLabel, IonLabel, IonList, IonItem, IonBackButton, IonButtons, IonIcon, IonItemDivider, IonAvatar, IonThumbnail, IonItemOptions, IonItemSliding, IonItemOption, IonItemOptions,IonInput,IonCheckbox,IonRadio,IonToggle,IonRadioGroup,IonSearchbar,IonSegment,IonSegmentButton,IonDatetime,IonFooter,IonCardContent,IonCardTitle,IonCardHeader,IonCard,IonCol,IonRow,IonGrid,IonChip,IonImg,IonProgressBar ]
+})
+export class StorePage implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+    
+    
+  }
+  //进度条
+  public buffer = 0.06;
+  public progress = 0;
+  public visable1:boolean=true
+
+ shengcheng1(){
+    setInterval(() => {
+      this.buffer += 0.4;
+      this.progress += 0.4;
+
+      // Reset the progress bar when it reaches 100%
+      // to continuously show the demo
+      if (this.progress > 1) {
+        setTimeout(() => {
+          this.buffer = 0.06;
+          this.progress = 0;
+          this.visable1=false
+          this.initEchart();
+        }, 1000);
+      }
+    }, 1000);
+    
+  }
+  public chart: any;
+  initEchart() {
+    let ec = echarts as any;
+    let container = document.getElementById('chart');
+    this.chart = ec.init(container);
+    let option = {
+      color: ['#80FFA5', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],
+      title: {
+        text: ''
+      },
+      tooltip: {
+        trigger: 'axis',
+        axisPointer: {
+          type: 'cross',
+          label: {
+            backgroundColor: '#6a7985'
+          }
+        }
+      },
+      legend: {
+        data: ['风衣', '羽绒服', 'T恤', '牛仔裤', '连衣裙']
+      },
+      toolbox: {
+        feature: {
+          saveAsImage: {}
+        }
+      },
+      grid: {
+        left: '3%',
+        right: '4%',
+        bottom: '3%',
+        containLabel: true
+      },
+      xAxis: [
+        {
+          type: 'category',
+          boundaryGap: false,
+           data: ['2017', '2018', '2019', '2020', '2021', '2022', '2023']
+        }
+      ],
+      yAxis: [
+        {
+          type: 'value'
+        }
+      ],
+      series: [
+        {
+          name: '风衣',
+          type: 'line',
+          stack: 'Total',
+          smooth: true,
+          lineStyle: {
+            width: 0
+          },
+          showSymbol: false,
+          areaStyle: {
+            opacity: 0.8,
+            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+              {
+                offset: 0,
+                color: 'rgb(128, 255, 165)'
+              },
+              {
+                offset: 1,
+                color: 'rgb(1, 191, 236)'
+              }
+            ])
+          },
+          emphasis: {
+            focus: 'series'
+          },
+          data: [140, 232, 101, 264, 90, 340, 250]
+        },
+        {
+          name: '羽绒服',
+          type: 'line',
+          stack: 'Total',
+          smooth: true,
+          lineStyle: {
+            width: 0
+          },
+          showSymbol: false,
+          areaStyle: {
+            opacity: 0.8,
+            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+              {
+                offset: 0,
+                color: 'rgb(0, 221, 255)'
+              },
+              {
+                offset: 1,
+                color: 'rgb(77, 119, 255)'
+              }
+            ])
+          },
+          emphasis: {
+            focus: 'series'
+          },
+          data: [120, 282, 111, 234, 220, 340, 310]
+        },
+        {
+          name: 'T恤',
+          type: 'line',
+          stack: 'Total',
+          smooth: true,
+          lineStyle: {
+            width: 0
+          },
+          showSymbol: false,
+          areaStyle: {
+            opacity: 0.8,
+            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+              {
+                offset: 0,
+                color: 'rgb(55, 162, 255)'
+              },
+              {
+                offset: 1,
+                color: 'rgb(116, 21, 219)'
+              }
+            ])
+          },
+          emphasis: {
+            focus: 'series'
+          },
+          data: [320, 132, 201, 334, 190, 130, 220]
+        },
+        {
+          name: '牛仔裤',
+          type: 'line',
+          stack: 'Total',
+          smooth: true,
+          lineStyle: {
+            width: 0
+          },
+          showSymbol: false,
+          areaStyle: {
+            opacity: 0.8,
+            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+              {
+                offset: 0,
+                color: 'rgb(255, 0, 135)'
+              },
+              {
+                offset: 1,
+                color: 'rgb(135, 0, 157)'
+              }
+            ])
+          },
+          emphasis: {
+            focus: 'series'
+          },
+          data: [220, 402, 231, 134, 190, 230, 120]
+        },
+        {
+          name: '连衣裙',
+          type: 'line',
+          stack: 'Total',
+          smooth: true,
+          lineStyle: {
+            width: 0
+          },
+          showSymbol: false,
+          label: {
+            show: true,
+            position: 'top'
+          },
+          areaStyle: {
+            opacity: 0.8,
+            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+              {
+                offset: 0,
+                color: 'rgb(255, 191, 0)'
+              },
+              {
+                offset: 1,
+                color: 'rgb(224, 62, 76)'
+              }
+            ])
+          },
+          emphasis: {
+            focus: 'series'
+          },
+          data: [220, 302, 181, 234, 210, 290, 150]
+        }
+      ]
+    };
+    
+    
+ 
+    this.chart.setOption(option);
+}
+}

+ 26 - 0
tailor-app/myapp/src/app/tabs/tabs.page.html

@@ -0,0 +1,26 @@
+<ion-tabs style="background-color: aqua;">
+  <ion-tab-bar slot="bottom">
+    <ion-tab-button tab="customization" href="/tabs/customization">
+      <ion-icon name="color-palette-outline"></ion-icon>
+      <ion-label>定制</ion-label>
+    </ion-tab-button>
+
+    <ion-tab-button tab="community" href="/tabs/community">
+      <ion-icon name="chatbubbles-outline"></ion-icon>
+      <ion-label>社区</ion-label>
+    </ion-tab-button>
+
+    <ion-tab-button tab="yiyun" href="/tabs/yiyun">
+      <ion-icon name="cut-outline"></ion-icon>
+      <ion-label>衣韵</ion-label>
+    </ion-tab-button>
+    <ion-tab-button tab="store" href="/tabs/store">
+      <ion-icon name="storefront-outline"></ion-icon>
+      <ion-label>商家</ion-label>
+    </ion-tab-button>
+    <ion-tab-button tab="me" href="/tabs/me">
+      <ion-icon name="person-circle-outline"></ion-icon>
+      <ion-label>我的</ion-label>
+    </ion-tab-button>
+  </ion-tab-bar>
+</ion-tabs>

+ 4 - 0
tailor-app/myapp/src/app/tabs/tabs.page.scss

@@ -0,0 +1,4 @@
+
+.tabbar {
+    background-color: #5c2626 !important; // 使用!important可以确保样式被优先应用
+  }

+ 0 - 0
smarthotel-app/src/app/tabs/tabs.page.spec.ts → tailor-app/myapp/src/app/tabs/tabs.page.spec.ts


+ 2 - 2
smarthotel-app/src/app/tabs/tabs.page.ts → tailor-app/myapp/src/app/tabs/tabs.page.ts

@@ -1,7 +1,7 @@
 import { Component, EnvironmentInjector, inject } from '@angular/core';
 import { IonTabs, IonTabBar, IonTabButton, IonIcon, IonLabel } from '@ionic/angular/standalone';
 import { addIcons } from 'ionicons';
-import { tv, chatbox, people } from 'ionicons/icons';
+import { colorPaletteOutline,chatbubblesOutline,cutOutline,storefrontOutline,personCircleOutline } from 'ionicons/icons';
 
 @Component({
   selector: 'app-tabs',
@@ -14,6 +14,6 @@ export class TabsPage {
   public environmentInjector = inject(EnvironmentInjector);
 
   constructor() {
-    addIcons({ tv, chatbox, people });
+    addIcons({ colorPaletteOutline,chatbubblesOutline,cutOutline,storefrontOutline,personCircleOutline});
   }
 }

+ 46 - 0
tailor-app/myapp/src/app/tabs/tabs.routes.ts

@@ -0,0 +1,46 @@
+import { Routes } from '@angular/router';
+import { TabsPage } from './tabs.page';
+
+export const routes: Routes = [
+  {
+    path: 'tabs',
+    component: TabsPage,
+    children: [
+      {
+        path: 'community',
+        loadComponent: () =>
+          import('../community/community.page').then((m) => m.CommunityPage),
+      },
+      {
+        path: 'customization',
+        loadComponent: () =>
+          import('../customization/customization.page').then((m) => m.CustomizationPage),
+      },
+      {
+        path: 'me',
+        loadComponent: () =>
+          import('../me/me.page').then((m) => m.MePage),
+      },
+      {
+        path: 'store',
+        loadComponent: () =>
+          import('../store/store.page').then((m) => m.StorePage),
+      },
+      {
+        path: 'yiyun',
+        loadComponent: () =>
+          import('../yiyun/yiyun.page').then((m) => m.YiyunPage),
+      },
+      {
+        path: '',
+        redirectTo: '/tabs/yiyun',
+        pathMatch: 'full',
+      },
+    ],
+  },
+  {
+    path: '',
+    redirectTo: '/tabs/yiyun',
+    pathMatch: 'full',
+  },
+];

+ 174 - 0
tailor-app/myapp/src/app/yiyun/yiyun.page.html

@@ -0,0 +1,174 @@
+<!-- 页面顶部导航栏 -->
+<ion-header class="ion-no-border" style="background-color: rgb(231, 244, 247);;">
+  <ion-toolbar style="background-color: rgb(231, 244, 247);;">
+    <ion-searchbar animated="true" placeholder="Animated"></ion-searchbar>
+    <ion-buttons slot="end">
+      <!-- <ion-button size="small">登录/注册</ion-button> -->
+      <!-- <ion-button size="small">商家后台入口</ion-button> -->
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+
+<!-- 品牌展示区 -->
+<ion-content>
+  <!-- <ion-slides>
+      <ion-slide>
+        <img src="最新服装定制案例图片路径" alt="服装定制案例">
+      </ion-slide>
+      <ion-slide>
+        <img src="时尚活动照片路径" alt="时尚活动">
+      </ion-slide>
+    </ion-slides> -->
+  <ion-grid>
+    <ion-row>
+      <ion-col *ngFor="let item of items; let i = index" class="custom-padding">
+        <div class="button-container">
+          <ion-icon size="large" [name]="item.image"></ion-icon>
+          <p class="item-text" style="font-weight: bolder;">{{ item.text }}</p>
+        </div>
+      </ion-col>
+    </ion-row>
+  </ion-grid>
+
+  <ion-grid style="justify-content: center;display: flex;">
+    <ion-row style="background-color: white;width: 90%;border-radius: 10px;">
+      <ion-card style="width: 44%;box-shadow: none;">
+        <ion-card-header>
+          <img src="assets/img/ding.png" alt="">
+          <ion-card-title style="font-size: 17px;font-weight:bolder;">定制服务</ion-card-title>
+        </ion-card-header>
+        <!-- <ion-card-content>
+            <ion-button expand="block">点击参与最新定制活动</ion-button>
+          </ion-card-content> -->
+      </ion-card>
+
+      <!-- 用户定制入口 -->
+      <ion-card style="width: 44%;box-shadow: none;">
+        <ion-card-header>
+          <img src="assets/img/3d.png" alt="">
+          <ion-card-title style="font-size: 17px;font-weight:bolder;">3D试衣服务</ion-card-title>
+        </ion-card-header>
+
+      </ion-card>
+    </ion-row>
+  </ion-grid>
+
+
+
+  <!-- 特色服务展示 -->
+  <!-- <ion-grid>
+      <ion-row>
+        <ion-col size="6">
+          <ion-card>
+            <ion-icon name="camera"></ion-icon> 假设AI定制对应的ion-icon名称为ai-outline,需替换准确图标名
+            <ion-card-header>
+              <ion-card-title>AI智能推荐,精准匹配</ion-card-title>
+            </ion-card-header>
+          </ion-card>
+        </ion-col>
+        <ion-col size="6">
+          <ion-card>
+            <ion-icon name="camera"></ion-icon> 假设虚拟试衣对应的ion-icon名称为body-outline,需替换准确图标名
+            <ion-card-header>
+              <ion-card-title>虚拟试衣体验,先试后买</ion-card-title>
+            </ion-card-header>
+          </ion-card>
+        </ion-col>
+      </ion-row>
+    </ion-grid> -->
+
+  <!-- 用户评价和案例展示 -->
+
+  <ion-list style="width: 90%;margin: auto;margin-top: 20px;">
+    <ion-item>
+      <h1 style="font-weight: bolder;">用户评价和案例展示</h1>
+    </ion-item>
+    <ion-item>
+
+      <ion-label>
+        <ion-grid>
+          <ion-row>
+            <ion-col size="auto">
+
+            </ion-col>
+            <ion-col width-10>
+              <ion-avatar
+                style="width: 30px;height: 30px;display: inline-block;vertical-align: middle;margin-right: 10px;">
+                <img src="assets/shapes.svg" alt="用户头像">
+              </ion-avatar>
+              <h2 style="font-weight: bolder;display: inline-block;">小林</h2>
+              <div style="margin-top: 10px;margin-bottom: 10px;">
+                衣服非常合身,面料舒适,非常满意!这件服装简直是时尚与艺术的完美融合,让人一眼难忘!从设计到剪裁,每一个细节都透露着匠人的精湛技艺与独到眼光。面料质感丝滑,穿着舒适亲肤,色彩搭配既经典又不失前卫感,完美衬托出穿着者的独特气质。
+              </div>
+            </ion-col>
+          </ion-row>
+          <ion-row>
+            <img src="assets/img/shi.png" alt="定制案例">
+
+          </ion-row>
+        </ion-grid>
+      </ion-label>
+    </ion-item>
+  </ion-list>
+
+  <!-- 商家管理入口 -->
+  <ion-card style="width: 90%;margin: auto;margin-bottom: 10px;margin-top: 10px;">
+    <ion-card-content>
+
+      <ion-button expand="block"><ion-icon name="camera"></ion-icon> 一键入库</ion-button>
+      <p>智能库存管理,让生意更简单</p>
+    </ion-card-content>
+  </ion-card>
+
+  <ion-list style="width: 90%;margin: auto;margin-top: 20px;">
+    <ion-item>
+      <h1 style="font-weight: bolder;">AI智能推荐</h1>
+    </ion-item>
+    <ion-item>
+
+
+        <ion-grid fixed style="width: 100%;">
+          <ion-row>
+            <ion-col size="6" *ngFor="let product of products" [attr.data-order]="product.order">
+              <ion-card>
+                <ion-img [src]="product.image"></ion-img>
+                <ion-card-header>
+                  <ion-card-title>{{ product.name }}</ion-card-title>
+                </ion-card-header>
+                <ion-card-content>
+                  <p>{{ product.description }}</p>
+                  <ion-button fill="clear">{{ product.price | currency }}</ion-button>
+                </ion-card-content>
+              </ion-card>
+            </ion-col>
+          </ion-row>
+        </ion-grid>
+    </ion-item>
+  </ion-list>
+
+
+
+  <!-- 最新时尚资讯 -->
+  <ion-card style="width: 90%;margin: auto;margin-top: 10px;margin-bottom: 10px;">
+    <ion-card-header>
+      <ion-card-title>2024年春季流行趋势</ion-card-title>
+    </ion-card-header>
+    <ion-card-content>
+      <p>本季流行色、面料及搭配建议一览</p>
+      <ion-button expand="block">了解更多</ion-button>
+    </ion-card-content>
+  </ion-card>
+
+  <!-- 页面底部 -->
+  <!-- <ion-footer>
+      <ion-toolbar>
+        <ion-label>© 2024 个性化定制服装平台</ion-label>
+        <ion-buttons slot="end">
+          <ion-button>客服热线:400-xxx-xxxx</ion-button>
+          <ion-button>关于我们</ion-button>
+          <ion-button>合作伙伴</ion-button>
+          <ion-button>隐私政策</ion-button>
+        </ion-buttons>
+      </ion-toolbar>
+    </ion-footer> -->
+</ion-content>

+ 77 - 0
tailor-app/myapp/src/app/yiyun/yiyun.page.scss

@@ -0,0 +1,77 @@
+ion-searchbar {
+    --background: #ffffff; // 背景颜色
+    --placeholder-color: #aaaaaa; // 占位符颜色
+    --text-color: #000000; // 文本颜色
+    --border-color: #cccccc; // 边框颜色
+    --border-radius: 15px; // 边框圆角
+    --box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); // 阴影效果
+    // 你可以添加更多的CSS变量来定制样式
+  }
+  .button-container {
+    text-align: center;
+    padding: 16px;
+    border-radius: 8px;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+    transition: all 0.3s ease;
+  }
+   
+  .button-container:hover {
+    transform: translateY(-4px);
+    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
+  }
+   
+  .item-image {
+    width: 100%;
+    height: auto;
+    border-radius: 8px 8px 0 0;
+  }
+   
+  .item-text {
+    margin-top: 0px;
+    font-size: 14px;
+    color: #333;
+  }
+  .custom-padding .button-container {
+    padding: 0px;
+    box-shadow: none;
+  }
+  ion-content {
+    --background: rgb(231, 244, 247);
+  }
+  // ion-avatar{
+  //   position: absolute;
+  //   top: 0;
+  // }
+  
+  ion-toolbar {
+    --background:rgb(231, 244, 247);;; /* 使用CSS变量设置背景色 */
+  }
+  ion-grid {
+    padding: 5px;
+  }
+  
+  ion-col {
+    width: 50%; // Adjust the width based on the number of columns you want
+  }
+  
+  ion-card {
+    margin-bottom: 10px;
+  }
+  
+  // You can use media queries to adjust the column width on different screen sizes
+  @media (min-width: 576px) {
+    ion-col {
+      min-height: 200px; // 较小屏幕下,设置一个最小高度,让布局看起来更规整
+    }
+  }
+
+  @media (min-width: 768px) {
+    ion-col {
+      min-height: 250px; // 中等屏幕下,适当增加最小高度
+    }
+  }
+
+  @media (min-width: 992px) {
+    ion-col {
+      min-height: 300px; // 大屏幕下,再增加最小高度,使布局更有瀑布流错落感
+    }}

+ 6 - 7
smarthotel-app/src/app/tab3/tab3.page.spec.ts → tailor-app/myapp/src/app/yiyun/yiyun.page.spec.ts

@@ -1,13 +1,12 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { YiyunPage } from './yiyun.page';
 
-import { Tab3Page } from './tab3.page';
+describe('YiyunPage', () => {
+  let component: YiyunPage;
+  let fixture: ComponentFixture<YiyunPage>;
 
-describe('Tab3Page', () => {
-  let component: Tab3Page;
-  let fixture: ComponentFixture<Tab3Page>;
-
-  beforeEach(async () => {
-    fixture = TestBed.createComponent(Tab3Page);
+  beforeEach(() => {
+    fixture = TestBed.createComponent(YiyunPage);
     component = fixture.componentInstance;
     fixture.detectChanges();
   });

+ 48 - 0
tailor-app/myapp/src/app/yiyun/yiyun.page.ts

@@ -0,0 +1,48 @@
+import { Component, NgModule, OnInit } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { ItemReorderEventDetail } from '@ionic/angular/standalone';
+import { addIcons } from 'ionicons';
+import { camera,trendingUpOutline,sparklesOutline,cloudyOutline,diceOutline} from 'ionicons/icons';
+import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonLabel, IonItem, IonList, IonBackButton, IonButtons, IonIcon, IonItemDivider, IonAvatar, IonThumbnail, IonItemOptions, IonItemOption, IonItemSliding, IonInput, IonCheckbox, IonRadio, IonToggle, IonRadioGroup, IonSearchbar,IonSegment,IonSegmentButton,IonDatetime,IonFooter,IonCardContent,IonCardTitle,IonCardHeader,IonCard,IonCol,IonRow,IonGrid,IonChip,IonImg } from '@ionic/angular/standalone';
+addIcons({camera,trendingUpOutline,sparklesOutline,cloudyOutline,diceOutline})
+@Component({
+  selector: 'app-yiyun',
+  templateUrl: './yiyun.page.html',
+  styleUrls: ['./yiyun.page.scss'],
+  standalone: true,
+  imports: [IonContent, IonHeader, IonTitle, IonToolbar, CommonModule, FormsModule, IonButton,  IonLabel, IonLabel, IonList, IonItem, IonBackButton, IonButtons, IonIcon, IonItemDivider, IonAvatar, IonThumbnail, IonItemOptions, IonItemSliding, IonItemOption, IonItemOptions,IonInput,IonCheckbox,IonRadio,IonToggle,IonRadioGroup,IonSearchbar,IonSegment,IonSegmentButton,IonDatetime,IonFooter,IonCardContent,IonCardTitle,IonCardHeader,IonCard,IonCol,IonRow,IonGrid,IonChip,IonImg ]
+
+})
+
+
+export class YiyunPage implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+  public items = [
+    { text: '趋势分析', image: 'trending-up-outline', page: '/page1' },
+    { text: 'AI定制', image: 'dice-outline', page: '/page2' },
+    { text: '活动优惠', image: 'sparkles-outline', page: '/page3' },
+    { text: '虚拟试衣', image: 'cloudy-outline', page: '/page4' },
+    
+  ];
+
+  products: any[] = [
+    { image: 'assets/img/shi.png', name: '商品1', description: '这是一个商品描述', price: 99.99 },
+    { image: 'assets/img/shi.png', name: '商品2', description: '这是一个商品描述', price: 199.99 },
+    { image: 'assets/img/shi.png', name: '商品1', description: '这是一个商品描述', price: 99.99 },
+    { image: 'assets/img/shi.png', name: '商品2', description: '这是一个商品描述', price: 199.99 },
+
+    // ... 更多商品数据
+  ];
+
+
+  // 打开登陆页面
+  openLoginModal(){
+    console.log("打开登陆页面");
+    
+  }
+}

+ 0 - 0
smarthotel-app/src/assets/icon/favicon.png → tailor-app/myapp/src/assets/icon/favicon.png


BIN
tailor-app/myapp/src/assets/img/3d.png


BIN
tailor-app/myapp/src/assets/img/ai2.png


BIN
tailor-app/myapp/src/assets/img/ding.png


BIN
tailor-app/myapp/src/assets/img/ding2.png


BIN
tailor-app/myapp/src/assets/img/shi.png


BIN
tailor-app/myapp/src/assets/img/yi2.png


+ 0 - 0
smarthotel-app/src/assets/shapes.svg → tailor-app/myapp/src/assets/shapes.svg


+ 0 - 0
smarthotel-app/src/environments/environment.prod.ts → tailor-app/myapp/src/environments/environment.prod.ts


+ 0 - 0
smarthotel-app/src/environments/environment.ts → tailor-app/myapp/src/environments/environment.ts


+ 0 - 0
smarthotel-app/src/global.scss → tailor-app/myapp/src/global.scss


+ 1 - 1
smarthotel-app/src/index.html → tailor-app/myapp/src/index.html

@@ -15,7 +15,7 @@
   <link rel="icon" type="image/png" href="assets/icon/favicon.png" />
 
   <!-- add to homescreen for ios -->
-  <meta name="mobile-web-app-capable" content="yes">
+  <meta name="apple-mobile-web-app-capable" content="yes" />
   <meta name="apple-mobile-web-app-status-bar-style" content="black" />
 </head>
 

+ 3 - 11
smarthotel-app/src/main.ts → tailor-app/myapp/src/main.ts

@@ -1,33 +1,25 @@
 import { bootstrapApplication } from '@angular/platform-browser';
 import { RouteReuseStrategy, provideRouter, withPreloading, PreloadAllModules } from '@angular/router';
 import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalone';
+
 import { routes } from './app/app.routes';
 import { AppComponent } from './app/app.component';
-
-
+// let token = "r:16cd8f27084ff647fcdb5308a6783c4c"
 // 引用HttpClient方法
 import { provideHttpClient } from '@angular/common/http';
 // 引用移动端授权检测供应器
 import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
 // 设置Parse服务属性
 import Parse from "parse";
-
-
 Parse.initialize("ncloudmaster");
 Parse.serverURL = "https://server.fmode.cn/parse";
 localStorage.setItem("NOVA_APIG_SERVER", 'aHR0cHMlM0ElMkYlMkZzZXJ2ZXIuZm1vZGUuY24lMkZhcGklMkZhcGlnJTJG')
-
-// 注意:替换Token 根据Token设置Parse服务帐套权限
-Parse.User.become('JSON.parse(localStorage.getItem("Parse/ncloudmaster/currentUser"))?.sessionToken')
-
-// JSON.parse(localStorage.getItem("Parse/ncloudmaster/currentUser"))?.sessionToken
-
+Parse.User.become("r:16cd8f27084ff647fcdb5308a6783c4c")
 bootstrapApplication(AppComponent, {
   providers: [
     { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
     provideIonicAngular(),
     provideRouter(routes, withPreloading(PreloadAllModules)),
-    // 添加HttpClient供应器
     provideHttpClient(),
     // 添加Diagnostic
     Diagnostic,

Some files were not shown because too many files changed in this diff