ThinkLibrary餐饮:点餐管理系统实战指南

ThinkLibrary餐饮:点餐管理系统实战指南

【免费下载链接】ThinkLibrary Library for ThinkAdmin 【免费下载链接】ThinkLibrary 项目地址: https://gitcode.com/ThinkAdmin/ThinkLibrary

痛点场景:传统餐饮管理的技术困境

你是否还在为餐饮点餐系统的开发而烦恼?面对复杂的业务逻辑、高并发的订单处理、多端数据同步等问题,传统开发方式往往需要重复造轮子,开发周期长,维护成本高。

典型痛点:

  • 前后端数据交互复杂,API开发繁琐
  • 订单状态管理混乱,容易产生数据不一致
  • 菜单管理、库存管理、会员系统等多模块耦合度高
  • 高并发场景下性能瓶颈难以突破
  • 系统扩展性差,难以适应业务变化

ThinkLibrary基于ThinkPHP框架,提供了一套完整的解决方案,让餐饮点餐系统的开发变得简单高效。

ThinkLibrary核心优势

1. 完整的CRUD操作支持

ThinkLibrary内置了强大的数据操作助手,可以快速实现数据的增删改查操作。

// 继承基础控制器
class MenuController extends \think\admin\Controller
{
    // 指定数据表
    protected $dbQuery = 'restaurant_menu';
    
    // 菜单列表展示
    public function index()
    {
        $this->_page($this->dbQuery);
    }
    
    // 菜单表单处理
    public function form()
    {
        $this->_form($this->dbQuery);
    }
    
    // 删除菜单
    public function remove()
    {
        $this->_delete($this->dbQuery);
    }
}

2. 强大的查询构建器

// 高级搜索查询
public function search()
{
    $query = $this->_query($this->dbQuery)
        ->like('name,description')  // 名称和描述模糊搜索
        ->equal('category_id')      // 分类精确匹配
        ->between('price')          // 价格区间查询
        ->dateBetween('create_time'); // 时间范围查询
    
    return $this->_page($query);
}

餐饮系统数据库设计

核心表结构设计

-- 菜品表
CREATE TABLE `restaurant_menu` (
    `id` INT UNSIGNED AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL COMMENT '菜品名称',
    `description` TEXT COMMENT '菜品描述',
    `price` DECIMAL(10,2) NOT NULL COMMENT '价格',
    `category_id` INT COMMENT '分类ID',
    `image` VARCHAR(255) COMMENT '图片地址',
    `status` TINYINT DEFAULT 1 COMMENT '状态(1上架,0下架)',
    `stock` INT DEFAULT 0 COMMENT '库存数量',
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) COMMENT='菜品表';

-- 订单表
CREATE TABLE `restaurant_order` (
    `id` VARCHAR(20) NOT NULL COMMENT '订单号',
    `table_id` INT COMMENT '桌号',
    `customer_id` INT COMMENT '顾客ID',
    `total_amount` DECIMAL(10,2) COMMENT '总金额',
    `status` TINYINT DEFAULT 1 COMMENT '状态(1待支付,2已支付,3已完成,4已取消)',
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) COMMENT='订单表';

-- 订单明细表
CREATE TABLE `restaurant_order_item` (
    `id` INT UNSIGNED AUTO_INCREMENT,
    `order_id` VARCHAR(20) NOT NULL COMMENT '订单号',
    `menu_id` INT NOT NULL COMMENT '菜品ID',
    `quantity` INT NOT NULL COMMENT '数量',
    `price` DECIMAL(10,2) NOT NULL COMMENT '单价',
    `subtotal` DECIMAL(10,2) NOT NULL COMMENT '小计',
    PRIMARY KEY (`id`)
) COMMENT='订单明细表';

核心功能实现

1. 菜单管理模块

class MenuController extends \think\admin\Controller
{
    protected $dbQuery = 'restaurant_menu';
    
    // 菜单列表带搜索
    public function index()
    {
        $this->title = '菜品管理';
        $query = $this->_query($this->dbQuery)
            ->like('name')
            ->equal('category_id,status')
            ->dateBetween('create_time');
        
        // 列表数据处理
        $this->_page($query, true, true, false, 15);
    }
    
    // 列表数据过滤
    protected function _index_page_filter(&$data)
    {
        foreach ($data as &$vo) {
            $vo['category_name'] = $this->getCategoryName($vo['category_id']);
            $vo['status_desc'] = $vo['status'] ? '上架' : '下架';
        }
    }
    
    // 表单处理
    public function form()
    {
        $this->title = '编辑菜品';
        $this->_form($this->dbQuery, 'menu/form');
    }
    
    // 表单提交前处理
    protected function _form_filter(&$data)
    {
        if (empty($data['id'])) {
            $data['create_time'] = date('Y-m-d H:i:s');
        }
    }
}

2. 订单管理模块

class OrderController extends \think\admin\Controller
{
    protected $dbQuery = 'restaurant_order';
    
    // 订单列表
    public function index()
    {
        $this->title = '订单管理';
        $query = $this->_query($this->dbQuery)
            ->equal('status')
            ->dateBetween('create_time')
            ->order('create_time desc');
        
        $this->_page($query);
    }
    
    // 创建订单
    public function create()
    {
        $data = $this->_vali([
            'table_id.require' => '桌号必须',
            'items.require'    => '菜品必须',
        ]);
        
        // 开启事务
        $this->app->db->startTrans();
        try {
            // 生成订单号
            $orderId = date('YmdHis') . mt_rand(1000, 9999);
            
            // 计算总金额
            $totalAmount = 0;
            $items = json_decode($data['items'], true);
            
            foreach ($items as $item) {
                $menu = $this->app->db->name('restaurant_menu')
                    ->where('id', $item['menu_id'])
                    ->find();
                
                if (!$menu || $menu['status'] == 0) {
                    throw new \Exception('菜品不存在或已下架');
                }
                
                if ($menu['stock'] < $item['quantity']) {
                    throw new \Exception('库存不足: ' . $menu['name']);
                }
                
                $subtotal = bcmul($menu['price'], $item['quantity'], 2);
                $totalAmount = bcadd($totalAmount, $subtotal, 2);
                
                // 插入订单明细
                $this->app->db->name('restaurant_order_item')->insert([
                    'order_id'  => $orderId,
                    'menu_id'   => $item['menu_id'],
                    'quantity'  => $item['quantity'],
                    'price'     => $menu['price'],
                    'subtotal'  => $subtotal
                ]);
                
                // 更新库存
                $this->app->db->name('restaurant_menu')
                    ->where('id', $item['menu_id'])
                    ->dec('stock', $item['quantity'])
                    ->update();
            }
            
            // 创建主订单
            $orderData = [
                'id'           => $orderId,
                'table_id'     => $data['table_id'],
                'total_amount' => $totalAmount,
                'status'       => 1, // 待支付
                'create_time'  => date('Y-m-d H:i:s')
            ];
            
            $this->app->db->name('restaurant_order')->insert($orderData);
            $this->app->db->commit();
            
            $this->success('订单创建成功', ['order_id' => $orderId]);
            
        } catch (\Exception $e) {
            $this->app->db->rollback();
            $this->error($e->getMessage());
        }
    }
}

3. 支付处理模块

class PaymentController extends \think\admin\Controller
{
    // 支付回调处理
    public function notify()
    {
        $data = $this->request->post();
        
        // 验证签名
        if (!$this->verifySign($data)) {
            $this->error('签名验证失败');
        }
        
        $orderId = $data['out_trade_no'];
        $order = $this->app->db->name('restaurant_order')
            ->where('id', $orderId)
            ->find();
            
        if (!$order) {
            $this->error('订单不存在');
        }
        
        if ($order['status'] != 1) {
            $this->success('订单已处理');
        }
        
        // 更新订单状态
        $this->app->db->name('restaurant_order')
            ->where('id', $orderId)
            ->update([
                'status' => 2, // 已支付
                'pay_time' => date('Y-m-d H:i:s')
            ]);
            
        // 记录操作日志
        sysoplog('支付成功', "订单 {$orderId} 支付成功,金额:{$order['total_amount']}");
        
        $this->success('处理成功');
    }
}

高级特性应用

1. 文件存储管理

// 菜品图片上传
public function uploadImage()
{
    $file = $this->request->file('image');
    if (!$file) {
        $this->error('请选择图片');
    }
    
    // 生成文件名
    $filename = \think\admin\Storage::name($file->getRealPath(), 'jpg', 'menu');
    
    // 保存到云存储
    $result = \think\admin\Storage::instance('qiniu')->save(
        $filename, 
        file_get_contents($file->getRealPath())
    );
    
    if ($result) {
        $url = \think\admin\Storage::instance('qiniu')->url($filename);
        $this->success('上传成功', ['url' => $url]);
    } else {
        $this->error('上传失败');
    }
}

2. 异步任务处理

// 发送订单通知
public function sendOrderNotify($orderId)
{
    // 创建异步任务
    $this->_queue(
        '发送订单通知', 
        "order:notify --order={$orderId}",
        0, // 立即执行
        ['order_id' => $orderId],
        0  // 单例模式
    );
}

// 定时库存检查
public function checkStock()
{
    // 每天凌晨检查库存
    $this->_queue(
        '库存检查', 
        'menu:check-stock',
        strtotime('tomorrow') - time(), // 明天执行
        [],
        1  // 多例模式
    );
}

3. 系统配置管理

// 设置餐厅配置
public function setRestaurantConfig()
{
    $config = $this->_vali([
        'restaurant_name.require' => '餐厅名称必须',
        'business_hours.require'  => '营业时间必须',
        'contact_info.require'   => '联系信息必须'
    ]);
    
    foreach ($config as $key => $value) {
        sysconf("restaurant.{$key}", $value);
    }
    
    $this->success('配置保存成功');
}

// 获取配置
public function getConfig()
{
    $config = [
        'name' => sysconf('restaurant.restaurant_name'),
        'hours' => sysconf('restaurant.business_hours'),
        'info' => sysconf('restaurant.contact_info')
    ];
    
    $this->success('获取成功', $config);
}

性能优化策略

1. 数据库查询优化

// 使用关联查询减少数据库请求
public function getOrderDetail($orderId)
{
    $order = $this->app->db->name('restaurant_order o')
        ->field('o.*, c.name as customer_name, t.name as table_name')
        ->leftJoin('restaurant_customer c', 'o.customer_id = c.id')
        ->leftJoin('restaurant_table t', 'o.table_id = t.id')
        ->where('o.id', $orderId)
        ->find();
        
    if ($order) {
        $items = $this->app->db->name('restaurant_order_item i')
            ->field('i.*, m.name as menu_name')
            ->leftJoin('restaurant_menu m', 'i.menu_id = m.id')
            ->where('i.order_id', $orderId)
            ->select();
            
        $order['items'] = $items;
    }
    
    return $order;
}

2. 缓存策略

// 菜单数据缓存
public function getMenuList()
{
    $cacheKey = 'restaurant:menu:list';
    $menus = $this->app->cache->get($cacheKey);
    
    if (!$menus) {
        $menus = $this->app->db->name('restaurant_menu')
            ->where('status', 1)
            ->order('category_id, sort desc')
            ->select()
            ->toArray();
            
        // 缓存1小时
        $this->app->cache->set($cacheKey, $menus, 3600);
    }
    
    return $menus;
}

安全防护措施

1. 数据验证和过滤

// 严格的输入验证
public function createOrder()
{
    $data = $this->_vali([
        'table_id.require|number' => '桌号必须为数字',
        'items.require'           => '菜品必须',
        'items.array'             => '菜品格式错误'
    ]);
    
    // XSS过滤
    $data['note'] = xss_safe($this->request->post('note', ''));
    
    // SQL注入防护
    $tableId = intval($data['table_id']);
}

2. 权限控制

// RBAC权限控制
class OrderController extends \think\admin\Controller
{
    // 需要权限的方法
    protected $access = [
        'index'  => 'order.view',
        'create' => 'order.create',
        'cancel' => 'order.cancel'
    ];
    
    public function initialize()
    {
        parent::initialize();
        
        // 检查权限
        if (!auth($this->access[$this->request->action()] ?? '')) {
            $this->error('无权访问');
        }
    }
}

部署和运维

1. 环境配置

# 安装依赖
composer require zoujingli/think-library

# 数据库迁移
php think migrate:run

# 启动队列服务
php think queue:work --daemon

2. 监控和日志

// 业务日志记录
public function someBusiness()
{
    try {
        // 业务逻辑
        sysoplog('业务操作', '执行了某个重要操作');
        
    } catch (\Exception $e) {
        // 异常日志
        trace_file($e);
        $this->error('操作失败');
    }
}

总结

ThinkLibrary为餐饮点餐管理系统提供了强大的技术支撑:

  1. 开发效率提升:内置的CRUD操作和助手类大幅减少重复代码
  2. 性能优化:异步任务、缓存策略等确保系统高性能运行
  3. 安全可靠:完善的验证机制和权限控制保障系统安全
  4. 扩展性强:模块化设计便于功能扩展和定制
  5. 维护简单:清晰的代码结构和丰富的工具类降低维护成本

通过本文的实战指南,你可以快速构建一个功能完善、性能优越的餐饮点餐管理系统。ThinkLibrary的强大功能让复杂的企业级应用开发变得简单高效。

立即行动:

  • 安装ThinkLibrary开始你的项目
  • 根据业务需求定制数据库结构
  • 利用内置工具类快速开发核心功能
  • 部署监控系统确保稳定运行

期待你的餐饮点餐系统早日上线运营!

【免费下载链接】ThinkLibrary Library for ThinkAdmin 【免费下载链接】ThinkLibrary 项目地址: https://gitcode.com/ThinkAdmin/ThinkLibrary

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值