🗣 Wd提问: PHP源码外卖系统
🤖 Ai回答: 开发一个基于 PHP 的外卖系统是一个完整的 Web 项目,涵盖用户端、商家端和管理后台。以下是一个简化版的 PHP 外卖系统源码结构和核心功能实现,适合学习或二次开发。
🍔 PHP 外卖系统(简化版)
✅ 功能模块
1、用户注册/登录
2、商家列表 & 菜单展示
3、添加菜品到购物车
4、下单与订单管理
5、管理员后台(增删改查商家/菜品)
6、使用 MySQL 存储数据
📁 项目目录结构
/php-food-delivery/
│
├── config/
│ └── db.php 数据库连接
│
├── includes/
│ ├── header.php 公共头部
│ ├── footer.php 公共底部
│ └── auth.php 登录验证函数
│
├── assets/
│ ├── css/style.css
│ └── js/script.js
│
├── user/
│ ├── login.php
│ ├── register.php
│ ├── index.php 用户首页(浏览商家)
│ ├── menu.php 查看菜单
│ ├── cart.php 购物车
│ ├── order.php 提交订单
│ └── logout.php
│
├── admin/
│ ├── login.php
│ ├── dashboard.php 后台首页
│ ├── add_restaurant.php
│ ├── add_food.php
│ └── orders.php 查看所有订单
│
├── images/ 存放图片
│
└── index.php 入口页面
🔧 数据库设计(MySQL)
sql
创建数据库
CREATE DATABASE food_delivery;
USE food_delivery;
用户表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
role ENUM('user', 'admin') DEFAULT 'user',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
商家表
CREATE TABLE restaurants (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
address TEXT,
phone VARCHAR(15),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
菜品表
CREATE TABLE foods (
id INT AUTO_INCREMENT PRIMARY KEY,
restaurant_id INT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
image VARCHAR(100),
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id)
);
订单表
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
food_id INT,
quantity INT DEFAULT 1,
total_price DECIMAL(10,2),
status ENUM('pending', 'completed', 'cancelled') DEFAULT 'pending',
order_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (food_id) REFERENCES foods(id)
);
🔐 config/db.php
php
<?php
$host = 'localhost';
$dbname = 'food_delivery';
$username = 'root';
$password = '';
try {
$pdo = new PDO(mysql:host=$host;dbname=$dbname, $username, $password);
$pdo-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die(数据库连接失败: 、$e-getMessage());
}
?
🌐 index.php(入口页)
php
<?php include 'includes/header.php'; ?
<h2欢迎来到外卖系统</h2
<p<a href=user/login.php用户登录</a</p
<p<a href=admin/login.php管理员登录</a</p
<?php include 'includes/footer.php'; ?
👤 user/login.php
php
<?php
session_start();
include '../config/db.php';
include '../includes/auth.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $pdo-prepare(SELECT * FROM users WHERE username = ? AND role = 'user');
$stmt-execute([$username]);
$user = $stmt-fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
header(Location: index.php);
exit;
} else {
echo 用户名或密码错误!;
}
}
?
<form method=post
<h3用户登录</h3
<input type=text name=username placeholder=用户名 required<br<br
<input type=password name=password placeholder=密码 required<br<br
<button type=submit登录</button
</form
<a href=register.php注册账号</a
🛒 user/cart.php(示例:简单购物车逻辑)
php
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header(Location: login.php);
exit;
}
// 模拟购物车(实际项目建议用 session 数组存储)
$cart = isset($_SESSION['cart']) ? $_SESSION['cart'] : [];
if ($_POST['action'] == 'add') {
$food_id = $_POST['food_id'];
$cart[] = $food_id;
$_SESSION['cart'] = $cart;
}
?
<h2购物车</h2
<ul
<?php foreach ($cart as $food_id): ?
<?php
$stmt = $pdo-prepare(SELECT * FROM foods WHERE id = ?);
$stmt-execute([$food_id]);
$food = $stmt-fetch();
?
<li<?= htmlspecialchars($food['name']) ? ¥<?= $food['price'] ?</li
<?php endforeach; ?
</ul
<a href=index.php继续浏览</a |
<a href=order.php去结算</a
📦 user/order.php(提交订单)
php
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header(Location: login.php);
exit;
}
$cart = $_SESSION['cart'] ?? [];
$total = 0;
foreach ($cart as $food_id) {
$stmt = $pdo-prepare(SELECT price FROM foods WHERE id = ?);
$stmt-execute([$food_id]);
$food = $stmt-fetch();
$total += $food['price'];
}
// 保存订单(简化:只存第一条)
$stmt = $pdo-prepare(INSERT INTO orders (user_id, food_id, quantity, total_price) VALUES (?, ?, ?, ?));
$stmt-execute([$_SESSION['user_id'], $cart[0], count($cart), $total]);
// 清空购物车
unset($_SESSION['cart']);
echo 下单成功!总金额:¥{$total};
?
🎨 includes/header.php
php
<!DOCTYPE html
<html lang=zh
<head
<meta charset=UTF-8
<title外卖系统</title
<link rel=stylesheet href=assets/css/style.css
</head
<body
<header
<h1🍔 快乐外卖</h1
<nav
<a href=index.php首页</a
<?php if (isset($_SESSION['username'])): ?
<span你好, <?= $_SESSION['username'] ?!</span
<a href=logout.php登出</a
<?php endif; ?
</nav
</header
<hr
💻 admin/dashboard.php(管理员后台)
php
<?php
session_start();
if (!isset($_SESSION['admin'])) {
header(Location: login.php);
exit;
}
?
<h2管理员后台</h2
<ul
<li<a href=add_restaurant.php添加商家</a</li
<li<a href=add_food.php添加菜品</a</li
<li<a href=orders.php查看订单</a</li
</ul
<a href=logout.php登出</a
✅ 如何运行?
1、安装 XAMPP / WAMP / LAMP
2、将项目放入 `htdocs` 目录
3、导入 SQL 到 phpMyAdmin
4、访问 `http://localhost/php-food-delivery/`
🚀 可扩展功能(进阶)
使用 Bootstrap 美化界面
实现完整购物车(Session + JSON)
增加配送地址、支付模拟
AJAX 异步添加菜品
图片上传功能(商家/菜品图)
验证码登录、邮箱注册
Laravel 或 ThinkPHP 框架重构
📦 下载源码(GitHub 示例)
你可以克隆一个开源版本学习:
bash
git clone https://github.com/example/php-food-delivery-system.git
⚠️ 注:目前 GitHub 上有许多开源 PHP 外卖系统,搜索关键词:
`php
📣 商家广告:





0
IP地址: 146.199.47.151
搜索次数: 2
提问时间: 2025-11-05 22:31:16
🛒 域名购买:
ww.fj.cn
27.gs
wc.chat
8.sx.cn
54.gold
7.hk.cn
73.gold
te.biz
4666.com.cn
82.gs
❓️ 热门提问:
ps5常用主机设定
机房消音降噪
win11创建ftp服务器
关键词广告关键词广告创意工具
代理工具DNS设置
单域名证书价格
连接mysql服务器
SEO数据面板
怎样搭建vps服务器
bootstrap dns 服务器
豌豆Ai站群搜索引擎系统
🌐 域名评估:
yu7.tw.cn
xphone.center
su7.ac.cn
46.gg
mxek.cn
aaaa.jl.cn
sf.xz.cn
an.sc.cn
nn.gs.cn
hswp.cn
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
谷哥seo
广州日美月饼厂
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。