ThinkLibrary餐饮:点餐管理系统实战指南
【免费下载链接】ThinkLibrary Library for ThinkAdmin 项目地址: 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为餐饮点餐管理系统提供了强大的技术支撑:
- 开发效率提升:内置的CRUD操作和助手类大幅减少重复代码
- 性能优化:异步任务、缓存策略等确保系统高性能运行
- 安全可靠:完善的验证机制和权限控制保障系统安全
- 扩展性强:模块化设计便于功能扩展和定制
- 维护简单:清晰的代码结构和丰富的工具类降低维护成本
通过本文的实战指南,你可以快速构建一个功能完善、性能优越的餐饮点餐管理系统。ThinkLibrary的强大功能让复杂的企业级应用开发变得简单高效。
立即行动:
- 安装ThinkLibrary开始你的项目
- 根据业务需求定制数据库结构
- 利用内置工具类快速开发核心功能
- 部署监控系统确保稳定运行
期待你的餐饮点餐系统早日上线运营!
【免费下载链接】ThinkLibrary Library for ThinkAdmin 项目地址: https://gitcode.com/ThinkAdmin/ThinkLibrary
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



