You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SocketIO批量存储并发送多组数据?快餐管理系统需求

快餐订单存储与提交方案

核心思路

放弃隐藏输入框追加数据的方式,改用JavaScript内存数组+JSON序列化管理订单数据,既能高效维护选中的食品ID,又能一次性打包发送给服务器,后续配合服务器生成订单号存入SQL即可。

具体实现方案

1. 前端订单数据管理

初始化数组存储选中的食品ID,点击食品按钮时更新数组,提交时将数组转为JSON字符串发送:

// 初始化订单数组
let orderItems = [];

// 食品按钮点击事件(假设按钮通过data-food-id存储食品ID)
document.querySelectorAll('.food-btn').forEach(btn => {
  btn.addEventListener('click', () => {
    const foodId = btn.dataset.foodId;
    // 避免重复添加同一款食品
    if (!orderItems.includes(foodId)) {
      orderItems.push(foodId);
    }
    // 实时更新页面的订单预览
    updateOrderPreview();
  });
});

// 提交订单到服务器
function submitOrder() {
  if (orderItems.length === 0) return;
  
  fetch('/api/submit-order', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ items: orderItems })
  })
  .then(res => res.json())
  .then(data => {
    // 展示服务器返回的订单编号与状态(仿麦当劳看板样式)
    showOrderStatus(data.orderId, data.status);
    // 清空本地订单数据
    orderItems = [];
    updateOrderPreview();
  });
}

// 辅助函数:更新页面订单预览
function updateOrderPreview() {
  document.getElementById('order-preview').textContent = `已选食品ID:${orderItems.join(', ')}`;
}

2. 服务器端处理与SQL存储

服务器接收JSON格式的订单数据后,生成唯一订单编号,将订单编号、食品ID列表存入SQL数据库(可拆分存入关联表,符合数据库设计范式):

示例(Node.js + MySQL):

const express = require('express');
const mysql = require('mysql2');
const app = express();
app.use(express.json());

// 数据库连接配置
const db = mysql.createConnection({
  host: 'localhost',
  user: 'your-db-user',
  password: 'your-db-pwd',
  database: 'fastfood_db'
});

// 提交订单接口
app.post('/api/submit-order', (req, res) => {
  const { items } = req.body;
  if (!items || items.length === 0) {
    return res.status(400).json({ error: '订单不能为空' });
  }

  // 生成唯一订单编号(示例:时间戳+4位随机数)
  const orderId = Date.now() + '-' + Math.floor(Math.random() * 10000);
  const status = '待制作'; // 初始状态

  // 插入主订单表
  const insertOrderSql = `INSERT INTO orders (order_id, status, created_at) VALUES (?, ?, NOW())`;
  db.query(insertOrderSql, [orderId, status], (err) => {
    if (err) throw err;

    // 插入订单详情表(拆分食品ID,便于后续统计查询)
    const insertDetailSql = `INSERT INTO order_details (order_id, food_id) VALUES ?`;
    const detailValues = items.map(id => [orderId, id]);
    db.query(insertDetailSql, [detailValues], (err) => {
      if (err) throw err;
      // 返回订单信息给前端
      res.json({ orderId, status });
    });
  });
});

app.listen(3000, () => console.log('服务器已启动'));

3. 备选方案:LocalStorage持久化未提交订单

如果需要页面刷新后保留未提交的订单,可将数组同步存入LocalStorage:

// 页面加载时恢复订单数据
window.addEventListener('load', () => {
  const savedOrder = localStorage.getItem('pendingOrder');
  if (savedOrder) {
    orderItems = JSON.parse(savedOrder);
    updateOrderPreview();
  }
});

// 更新订单数组时同步到LocalStorage
function updateOrderArray(foodId) {
  if (!orderItems.includes(foodId)) {
    orderItems.push(foodId);
    localStorage.setItem('pendingOrder', JSON.stringify(orderItems));
  }
}

方案优势

  • 比隐藏输入框追加数据更易维护,避免字符串拼接的混乱
  • 数组操作灵活,可轻松实现添加、删除、去重等逻辑
  • JSON序列化后传输数据体积小,服务器解析成本低
  • 配合数据库关联表存储,符合SQL设计范式,便于后续订单查询与统计

内容的提问来源于stack exchange,提问作者Erkan Mikiver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:01:10