|
@@ -1,11 +1,190 @@
|
|
|
-import { Component } from '@angular/core';
|
|
|
+import { Component, OnInit, afterNextRender } from '@angular/core';
|
|
|
+import { CommonModule } from '@angular/common';
|
|
|
+import { RouterModule } from '@angular/router';
|
|
|
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
|
|
+import {
|
|
|
+ faCat,
|
|
|
+ faBell,
|
|
|
+ faUser,
|
|
|
+ faTrashAlt,
|
|
|
+ faLightbulb,
|
|
|
+ faCheck,
|
|
|
+ faSpinner,
|
|
|
+ faHome,
|
|
|
+ faSearch,
|
|
|
+ faBookOpen,
|
|
|
+ faShoppingCart
|
|
|
+} from '@fortawesome/free-solid-svg-icons';
|
|
|
+import { Chart } from 'chart.js';
|
|
|
+import { CartItemComponent } from './components/cart-item/cart-item.component/cart-item.component';
|
|
|
+import { NutritionChartComponent } from './components/nutrition-chart/nutrition-chart.component/nutrition-chart.component';
|
|
|
+import { BudgetProgressComponent } from './components/budget-progress/budget-progress.component/budget-progress.component';
|
|
|
+import { SuggestionItemComponent } from './components/suggestion-item/suggestion-item.component/suggestion-item.component';
|
|
|
+import { HistoryItemComponent } from './components/history-item/history-item.component/history-item.component';
|
|
|
|
|
|
@Component({
|
|
|
selector: 'app-page-order',
|
|
|
- imports: [],
|
|
|
- templateUrl: './page-order.html',
|
|
|
- styleUrl: './page-order.scss'
|
|
|
+ standalone: true,
|
|
|
+ imports: [
|
|
|
+ CommonModule,
|
|
|
+ RouterModule,
|
|
|
+ FontAwesomeModule,
|
|
|
+ CartItemComponent,
|
|
|
+ NutritionChartComponent,
|
|
|
+ BudgetProgressComponent,
|
|
|
+ SuggestionItemComponent,
|
|
|
+ HistoryItemComponent
|
|
|
+ ],
|
|
|
+ templateUrl: './page-order.component.html',
|
|
|
+ styleUrls: ['./page-order.component.scss']
|
|
|
})
|
|
|
-export class PageOrder {
|
|
|
+export class PageOrderComponent implements OnInit {
|
|
|
+ // Icons
|
|
|
+ icons = {
|
|
|
+ faCat,
|
|
|
+ faBell,
|
|
|
+ faUser,
|
|
|
+ faTrashAlt,
|
|
|
+ faLightbulb,
|
|
|
+ faCheck,
|
|
|
+ faSpinner,
|
|
|
+ faHome,
|
|
|
+ faSearch,
|
|
|
+ faBookOpen,
|
|
|
+ faShoppingCart
|
|
|
+ };
|
|
|
|
|
|
-}
|
|
|
+ // Cart items data
|
|
|
+ cartItems = [
|
|
|
+ { id: 1, name: '招牌酸菜鱼', price: 68, quantity: 1, initial: '酸' },
|
|
|
+ { id: 2, name: '香辣小龙虾', price: 98, quantity: 1, initial: '虾' },
|
|
|
+ { id: 3, name: '金汤肥牛锅', price: 58, quantity: 1, initial: '牛' }
|
|
|
+ ];
|
|
|
+
|
|
|
+ // Suggestions data
|
|
|
+ suggestions = [
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ name: '清蒸鲈鱼',
|
|
|
+ price: 62,
|
|
|
+ initial: '鱼',
|
|
|
+ reason: '更低热量 · 更高蛋白质'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ name: '蒜蓉蒸虾',
|
|
|
+ price: 88,
|
|
|
+ initial: '虾',
|
|
|
+ reason: '更低脂肪 · 更少辛辣'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 3,
|
|
|
+ name: '番茄牛腩汤',
|
|
|
+ price: 48,
|
|
|
+ initial: '汤',
|
|
|
+ reason: '更多维生素 · 更低热量'
|
|
|
+ }
|
|
|
+ ];
|
|
|
+
|
|
|
+ // History items data
|
|
|
+ historyItems = [
|
|
|
+ { id: 1, name: '点菜喵主题餐厅', date: '06-25 消费¥236', initial: '喵' },
|
|
|
+ { id: 2, name: '渔家小馆', date: '06-20 消费¥182', initial: '鱼' },
|
|
|
+ { id: 3, name: '龙虾先生', date: '06-15 消费¥320', initial: '虾' },
|
|
|
+ { id: 4, name: '火锅物语', date: '06-10 消费¥198', initial: '锅' }
|
|
|
+ ];
|
|
|
+
|
|
|
+ // Order summary data
|
|
|
+ orderSummary = {
|
|
|
+ subtotal: 224,
|
|
|
+ delivery: 3.5,
|
|
|
+ discount: 15,
|
|
|
+ total: 212.5
|
|
|
+ };
|
|
|
+
|
|
|
+ // Budget data
|
|
|
+ budget = {
|
|
|
+ total: 800,
|
|
|
+ spent: 520,
|
|
|
+ remaining: 280,
|
|
|
+ percentage: 65
|
|
|
+ };
|
|
|
+
|
|
|
+ // Nutrition data
|
|
|
+ nutrition = {
|
|
|
+ balance: 72,
|
|
|
+ healthScore: 4.8,
|
|
|
+ nutrients: '3/5'
|
|
|
+ };
|
|
|
+
|
|
|
+ constructor() {
|
|
|
+ afterNextRender(() => {
|
|
|
+ this.initializeChart();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ ngOnInit(): void {}
|
|
|
+
|
|
|
+ initializeChart(): void {
|
|
|
+ const ctx = document.getElementById('nutritionChart') as HTMLCanvasElement;
|
|
|
+ if (!ctx) return;
|
|
|
+
|
|
|
+ new Chart(ctx, {
|
|
|
+ type: 'radar',
|
|
|
+ data: {
|
|
|
+ labels: ['蛋白质', '碳水', '脂肪', '纤维', '维生素'],
|
|
|
+ datasets: [{
|
|
|
+ label: '当前营养值',
|
|
|
+ data: [85, 70, 45, 60, 75],
|
|
|
+ fill: true,
|
|
|
+ backgroundColor: 'rgba(255, 107, 107, 0.2)',
|
|
|
+ borderColor: 'rgba(255, 107, 107, 1)',
|
|
|
+ pointBackgroundColor: 'rgba(255, 107, 107, 1)',
|
|
|
+ pointBorderColor: '#fff',
|
|
|
+ pointHoverBackgroundColor: '#fff',
|
|
|
+ pointHoverBorderColor: 'rgba(255, 107, 107, 1)'
|
|
|
+ }]
|
|
|
+ },
|
|
|
+ options: {
|
|
|
+ scales: {
|
|
|
+ r: {
|
|
|
+ angleLines: { display: true },
|
|
|
+ suggestedMin: 0,
|
|
|
+ suggestedMax: 100,
|
|
|
+ ticks: {
|
|
|
+ stepSize: 20,
|
|
|
+ backdropColor: 'transparent'
|
|
|
+ },
|
|
|
+ grid: { color: 'rgba(0, 0, 0, 0.1)' },
|
|
|
+ pointLabels: { font: { size: 11 } }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ plugins: { legend: { display: false } }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ updateQuantity(item: any, change: number): void {
|
|
|
+ const newQuantity = item.quantity + change;
|
|
|
+ if (newQuantity >= 1) {
|
|
|
+ item.quantity = newQuantity;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ removeItem(itemId: number): void {
|
|
|
+ this.cartItems = this.cartItems.filter(item => item.id !== itemId);
|
|
|
+ }
|
|
|
+
|
|
|
+ replaceSuggestion(suggestionId: number): void {
|
|
|
+ const suggestion = this.suggestions.find(s => s.id === suggestionId);
|
|
|
+ if (suggestion) {
|
|
|
+ // In a real app, you would implement the replacement logic here
|
|
|
+ console.log(`Replacing with ${suggestion.name}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ checkout(): void {
|
|
|
+ // In a real app, you would implement the checkout logic here
|
|
|
+ console.log('Checking out...');
|
|
|
+ }
|
|
|
+}
|