5. 美食点餐系统(technical-architecture)

alt

1. 架构设计

alt

2. 技术描述

alt

3. 路由定义

路由路径 页面组件 说明
/ Home.vue 餐厅首页
/menu Menu.vue 菜单列表页
/dish/:id DishDetail.vue 菜品详情页
/cart Cart.vue 购物车页
/order Order.vue 订单确认页
/order-history OrderHistory.vue 订单历史页
/address Address.vue 地址管理页
/address/add AddressAdd.vue 添加地址页
/profile Profile.vue 个人中心页

4. 组件架构

4.1 核心组件结构

src/
├── components/           # 公共组件
│   ├── common/          # 通用组件
│   │   ├── Header.vue   # 顶部导航
│   │   ├── Footer.vue   # 底部导航
│   │   ├── Loading.vue  # 加载组件
│   │   └── Empty.vue    # 空状态组件
│   ├── dish/            # 菜品相关组件
│   │   ├── DishCard.vue # 菜品卡片
│   │   ├── DishList.vue # 菜品列表
│   │   └── DishSpecs.vue # 规格选择
│   └── cart/            # 购物车组件
│       ├── CartItem.vue # 购物车商品项
│       └── CartFooter.vue # 购物车底部
├── views/               # 页面组件
├── stores/             # 状态管理
├── router/             # 路由配置
├── api/                # API接口
├── utils/              # 工具函数
└── assets/             # 静态资源

4.2 状态管理设计

Cart Store(购物车状态)

// stores/cart.js
export const useCartStore = defineStore('cart', {
  state: () => ({
    items: [], // 购物车商品列表
    totalAmount: 0, // 总金额
    deliveryFee: 5, // 配送费
    discount: 0 // 优惠金额
  }),
  
  actions: {
    addToCart(dish, specs, quantity) {
      // 添加商品到购物车
    },
    removeFromCart(itemId) {
      // 从购物车移除商品
    },
    updateQuantity(itemId, quantity) {
      // 更新商品数量
    },
    clearCart() {
      // 清空购物车
    },
    calculateTotal() {
      // 计算总金额
    }
  }
})

User Store(用户状态)

// stores/user.js
export const useUserStore = defineStore('user', {
  state: () => ({
    userInfo: null, // 用户信息
    addresses: [], // 用户地址列表
    defaultAddress: null // 默认地址
  }),
  
  actions: {
    login(mobile, code) {
      // 用户登录
    },
    logout() {
      // 用户登出
    },
    updateAddress(address) {
      // 更新地址
    },
    setDefaultAddress(addressId) {
      // 设置默认地址
    }
  }
})

5. 图片懒加载策略

5.1 实现方案

使用 Vue3-lazyload 插件实现图片懒加载:

// main.js
import VueLazyload from 'vue3-lazyload'

app.use(VueLazyload, {
  loading: '/images/loading.gif', // 加载中占位图
  error: '/images/error.png',     // 加载失败占位图
  preLoad: 1.3,                   // 预加载高度比例
  attempt: 1                      // 加载尝试次数
})

5.2 组件中使用

<template>
  <img v-lazy="dish.image" :alt="dish.name" />
</template>

5.3 性能优化

  • 图片压缩:使用 WebP 格式,压缩至 80% 质量
  • CDN 加速:静态资源使用 CDN 分发
  • 响应式图片:根据屏幕尺寸加载不同尺寸图片
  • 骨架屏:图片加载时显示骨架屏占位

6. 购物车逻辑设计

6.1 数据结构

interface CartItem {
  id: string;           // 购物车项ID
  dishId: string;       // 菜品ID
  dishName: string;     // 菜品名称
  image: string;        // 菜品图片
  specs: Specs;         // 规格信息
  quantity: number;   // 数量
  price: number;      // 单价
  totalPrice: number; // 小计
}

interface Specs {
  name: string;       // 规格名称(如:大份/小份)
  price: number;      // 规格价格
  attributes: object; // 其他属性
}

6.2 核心业务逻辑

  1. 添加商品:检查是否已存在相同商品和规格,存在则增加数量
  2. 更新数量:同步更新小计和总价
  3. 删除商品:从列表中移除,重新计算总价
  4. 清空购物车:一键清空所有商品
  5. 持久化存储:使用 localStorage 保存购物车数据

6.3 同步机制

  • 登录后同步本地购物车到服务器
  • 退出登录时清空本地购物车
  • 网络恢复后自动同步数据

7. API 接口设计

7.1 菜品相关接口

GET /api/dishes          # 获取菜品列表
GET /api/dishes/:id      # 获取菜品详情
GET /api/categories      # 获取分类列表
GET /api/dishes/search   # 搜索菜品

7.2 购物车接口

POST /api/cart/add       # 添加到购物车
PUT /api/cart/update     # 更新购物车商品
DELETE /api/cart/remove  # 移除购物车商品
GET /api/cart/list       # 获取购物车列表

7.3 订单接口

POST /api/orders/create  # 创建订单
GET /api/orders/list     # 获取订单列表
GET /api/orders/:id      # 获取订单详情
PUT /api/orders/cancel   # 取消订单

7.4 地址管理接口

GET /api/addresses       # 获取地址列表
POST /api/addresses      # 添加地址
PUT /api/addresses/:id   # 更新地址
DELETE /api/addresses/:id # 删除地址

8. 性能优化策略

8.1 代码分割

  • 路由级代码分割
  • 组件级按需加载
  • 第三方库 CDN 引入

8.2 缓存策略

  • 接口数据缓存
  • 图片资源缓存
  • 购物车数据本地
20大项目拆解:从PRD到架构 文章被收录于专栏

想独立做出一个完整的项目却不知从何下手?本专栏是你的终极路线图。我们由浅入深,通过20个经典项目案例,手把手带你走过产品构思、需求撰写、功能设计、技术选型、架构搭建的全过程。从&ldquo;音乐播放器&rdquo;到&ldquo;企业后台&rdquo;,你将逐步建立对软件系统的完整认知,完成从理论到实践、从单一技能到复合能力的飞跃。

全部评论
666
点赞 回复 分享
发布于 昨天 14:52 广东
想要在同质化竞争中突围,需在体验精细化、功能完整性、生态联动性三个维度补足短板
点赞 回复 分享
发布于 昨天 14:40 广东

相关推荐

不愿透露姓名的神秘牛友
12-14 11:05
谦虚的小冤种在加班:确实烂白菜,当年本科毕业字节给给开了66*15,哥们都不带看一眼的😋
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务