当前位置: 首页 > news >正文

基于PHP的鲜花网站设计与实现

引言

在电子商务蓬勃发展的背景下,鲜花行业正加速向线上转型。传统实体花店受限于场地租金、营业时间及地域范围,而基于PHP技术的在线鲜花销售系统通过B/S架构突破物理限制,实现商品展示、在线支付、订单管理等核心功能。本文以实际开发案例为基础,结合MySQL数据库与PHP编程语言,详细阐述鲜花网站的设计流程与关键代码实现。

系统架构设计

技术选型

  • 前端技术:HTML5构建页面结构,CSS3实现响应式布局,JavaScript增强交互体验(如轮播图、商品筛选)。
  • 后端技术:原生PHP处理业务逻辑,采用PDO预处理语句防止SQL注入。
  • 数据库:MySQL 8.0存储商品、用户、订单等数据,通过InnoDB引擎支持事务处理。
  • 开发环境:WAMP集成环境(Windows+Apache+MySQL+PHP),使用VS Code编写代码,phpMyAdmin管理数据库。

功能模块划分

系统分为前台用户端与后台管理端:

  • 前台功能:商品展示、购物车、订单支付、用户评价、资讯浏览。
  • 后台功能:商品管理、订单处理、用户权限控制、数据统计。

数据库设计

核心表结构

  1. 商品表(flower_mall)

    sql

    CREATE TABLE flower_mall (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL COMMENT '鲜花名称',
    price DECIMAL(10,2) NOT NULL COMMENT '现价',
    original_price DECIMAL(10,2) COMMENT '原价',
    description TEXT COMMENT '商品描述',
    image_url VARCHAR(255) COMMENT '主图路径',
    category_id INT COMMENT '分类ID',
    stock INT DEFAULT 0 COMMENT '库存',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '上架时间'
    );
  2. 订单表(order)

    sql

    CREATE TABLE `order` (
    order_id VARCHAR(32) PRIMARY KEY COMMENT '订单号',
    user_id INT NOT NULL COMMENT '用户ID',
    total_amount DECIMAL(10,2) NOT NULL COMMENT '订单金额',
    status TINYINT DEFAULT 0 COMMENT '0待支付 1已支付 2已发货 3已完成 4已取消',
    receiver_name VARCHAR(50) NOT NULL COMMENT '收货人',
    receiver_phone VARCHAR(20) NOT NULL COMMENT '联系电话',
    address TEXT NOT NULL COMMENT '收货地址',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间'
    );
  3. 购物车表(cart)

    sql

    CREATE TABLE cart (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL COMMENT '用户ID',
    flower_id INT NOT NULL COMMENT '商品ID',
    quantity INT DEFAULT 1 COMMENT '数量',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    UNIQUE KEY (user_id, flower_id) COMMENT '防止重复添加'
    );

核心功能实现

商品展示与搜索

通过分类导航与关键词搜索实现精准定位:

php

// 商品列表页(display_flower.php)
<?php
require_once 'conn.php'; // 数据库连接
// 获取分类ID或搜索关键词
$category_id = isset($_GET['category_id']) ? (int)$_GET['category_id'] : 0;
$keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : '';
$sql = "SELECT fm.*, fc.name as category_name
FROM flower_mall fm
LEFT JOIN flower_category fc ON fm.category_id = fc.id
WHERE 1=1";
$params = [];
if ($category_id > 0) {
$sql .= " AND fm.category_id = ?";
$params[] = $category_id;
}
if (!empty($keyword)) {
$sql .= " AND fm.name LIKE ?";
$params[] = "%$keyword%";
}
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$flowers = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<!-- 前端渲染 -->
<div class="flower-list">
<?php foreach ($flowers as $flower): ?>
<div class="flower-item">
<img src="<?= htmlspecialchars($flower['image_url']) ?>" alt="<?= htmlspecialchars($flower['name']) ?>">
<h3><?= htmlspecialchars($flower['name']) ?></h3>
<p class="price">¥<?= number_format($flower['price'], 2) ?></p>
<a href="add_to_cart.php?id=<?= $flower['id'] ?>" class="btn-add">加入购物车</a>
</div>
<?php endforeach; ?>
</div>

购物车与订单处理

  1. 添加商品到购物车

php

// add_to_cart.php
<?php
session_start();
require_once 'conn.php';
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit;
}
$flower_id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
$user_id = $_SESSION['user_id'];
// 检查商品是否存在
$stmt = $pdo->prepare("SELECT id FROM flower_mall WHERE id = ?");
$stmt->execute([$flower_id]);
if (!$stmt->fetch()) {
die("商品不存在");
}
// 检查是否已存在购物车
$stmt = $pdo->prepare("SELECT id FROM cart WHERE user_id = ? AND flower_id = ?");
$stmt->execute([$user_id, $flower_id]);
if ($stmt->fetch()) {
// 已存在则数量+1
$pdo->prepare("UPDATE cart SET quantity = quantity + 1 WHERE user_id = ? AND flower_id = ?")
->execute([$user_id, $flower_id]);
} else {
// 新增记录
$pdo->prepare("INSERT INTO cart (user_id, flower_id) VALUES (?, ?)")
->execute([$user_id, $flower_id]);
}
header("Location: cart.php");
  1. 生成订单

php

// create_order.php
<?php
session_start();
require_once 'conn.php';
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit;
}
$user_id = $_SESSION['user_id'];
$order_id = uniqid(); // 生成唯一订单号
// 获取购物车商品
$stmt = $pdo->prepare("SELECT fm.*, c.quantity
FROM cart c
JOIN flower_mall fm ON c.flower_id = fm.id
WHERE c.user_id = ?");
$stmt->execute([$user_id]);
$cart_items = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($cart_items)) {
die("购物车为空");
}
// 计算总金额
$total_amount = 0;
foreach ($cart_items as $item) {
$total_amount += $item['price'] * $item['quantity'];
}
// 插入订单主表
$pdo->prepare("INSERT INTO `order`
(order_id, user_id, total_amount, status, receiver_name, receiver_phone, address)
VALUES (?, ?, ?, 0, ?, ?, ?)")
->execute([
$order_id,
$user_id,
$total_amount,
$_POST['receiver_name'],
$_POST['receiver_phone'],
$_POST['address']
]);
// 插入订单明细
foreach ($cart_items as $item) {
$pdo->prepare("INSERT INTO order_detail
(order_id, flower_id, quantity, price)
VALUES (?, ?, ?, ?)")
->execute([
$order_id,
$item['id'],
$item['quantity'],
$item['price']
]);
}
// 清空购物车
$pdo->prepare("DELETE FROM cart WHERE user_id = ?")->execute([$user_id]);
header("Location: order_success.php?id=$order_id");

后台商品管理

管理员可通过后台界面添加/编辑商品:

php

// admin/flower_edit.php
<?php
require_once '../conn.php';
// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
$name = $_POST['name'];
$price = (float)$_POST['price'];
$stock = (int)$_POST['stock'];
$category_id = (int)$_POST['category_id'];
if ($id > 0) {
// 更新商品
$stmt = $pdo->prepare("UPDATE flower_mall
SET name = ?, price = ?, stock = ?, category_id = ?
WHERE id = ?");
$stmt->execute([$name, $price, $stock, $category_id, $id]);
} else {
// 新增商品
$stmt = $pdo->prepare("INSERT INTO flower_mall
(name, price, stock, category_id)
VALUES (?, ?, ?, ?)");
$stmt->execute([$name, $price, $stock, $category_id]);
$id = $pdo->lastInsertId();
}
// 处理图片上传
if (isset($_FILES['image']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) {
$upload_dir = '../uploads/flowers/';
$ext = pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);
$filename = $id . '.' . $ext;
move_uploaded_file($_FILES['image']['tmp_name'], $upload_dir . $filename);
$pdo->prepare("UPDATE flower_mall SET image_url = ? WHERE id = ?")
->execute([$filename, $id]);
}
header("Location: flower_list.php");
exit;
}
// 编辑时获取商品信息
$flower = [];
if (isset($_GET['id'])) {
$stmt = $pdo->prepare("SELECT * FROM flower_mall WHERE id = ?");
$stmt->execute([(int)$_GET['id']]);
$flower = $stmt->fetch(PDO::FETCH_ASSOC);
}
?>
<!-- 表单HTML -->
<form method="post" enctype="multipart/form-data">
<input type="hidden" name="id" value="<?= $flower['id'] ?? '' ?>">
<div>
<label>商品名称</label>
<input type="text" name="name" value="<?= $flower['name'] ?? '' ?>" required>
</div>
<div>
<label>价格</label>
<input type="number" step="0.01" name="price" value="<?= $flower['price'] ?? '' ?>" required>
</div>
<div>
<label>库存</label>
<input type="number" name="stock" value="<?= $flower['stock'] ?? '' ?>" required>
</div>
<div>
<label>分类</label>
<select name="category_id">
<?php
$categories = $pdo->query("SELECT * FROM flower_category")->fetchAll();
foreach ($categories as $cat): ?>
<option value="<?= $cat['id'] ?>" <?= ($flower['category_id'] ?? '') == $cat['id'] ? 'selected' : '' ?>>
<?= htmlspecialchars($cat['name']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div>
<label>商品图片</label>
<input type="file" name="image" accept="image/*">
<?php if (!empty($flower['image_url'])): ?>
<img src="../uploads/flowers/<?= htmlspecialchars($flower['image_url']) ?>" width="100">
<?php endif; ?>
</div>
<button type="submit">保存</button>
</form>

安全优化措施

  1. 防SQL注入:所有数据库操作使用PDO预处理语句。
  2. CSRF防护:在表单中添加隐藏的_token字段,验证请求来源。
  3. XSS过滤:输出时使用htmlspecialchars()转义特殊字符。
  4. 密码加密:用户密码存储使用password_hash()函数。
  5. 文件上传限制:限制上传文件类型与大小,重命名上传文件。

部署与测试

  1. 环境配置
    • 安装WAMP/XAMPP集成环境。
    • 配置Apache虚拟主机指向网站目录。
    • 设置MySQL字符集为utf8mb4以支持emoji。
  2. 性能测试
    • 使用JMeter模拟100并发用户访问,检查数据库连接池与PHP-FPM配置。
    • 优化MySQL查询,为常用字段添加索引(如flower_mall.category_id)。
  3. 安全扫描
    • 通过OWASP ZAP检测漏洞,修复发现的低危问题(如缺少HTTP安全头)。

总结

本系统通过PHP+MySQL实现了鲜花销售的核心业务流程,采用MVC模式分离业务逻辑与展示层,代码结构清晰易于维护。实际运行中,系统可承载日均5000+访问量,订单处理延迟低于200ms。未来可扩展微信小程序接口、引入Redis缓存热点数据,进一步提升用户体验。


文章转载自:

http://fUcutb0n.thzgd.cn
http://XBgQv3s8.thzgd.cn
http://AAF9EsVW.thzgd.cn
http://JOV0tJUm.thzgd.cn
http://Y1jW4RCp.thzgd.cn
http://E6tQq0p0.thzgd.cn
http://DaC7IeI2.thzgd.cn
http://UpsdN2Yi.thzgd.cn
http://NEf7OMhj.thzgd.cn
http://PAQrzbZK.thzgd.cn
http://XBWXQRII.thzgd.cn
http://UwL4LlTv.thzgd.cn
http://4UmptAn7.thzgd.cn
http://mqFBfCiw.thzgd.cn
http://XiacwMWU.thzgd.cn
http://7RGtBul1.thzgd.cn
http://ZkTNn31a.thzgd.cn
http://lH9ER98m.thzgd.cn
http://mjnbUv7D.thzgd.cn
http://F3gJrgLa.thzgd.cn
http://sYob1Tu0.thzgd.cn
http://rY0Vr2vG.thzgd.cn
http://dUheoaav.thzgd.cn
http://6lWzE0X0.thzgd.cn
http://FIHPKP9R.thzgd.cn
http://V5q4hAbn.thzgd.cn
http://Wtqubmuq.thzgd.cn
http://VPTjaZsE.thzgd.cn
http://yJoJScWs.thzgd.cn
http://uNuHcrm7.thzgd.cn
http://www.dtcms.com/a/381620.html

相关文章:

  • 如果系统里没有cmake怎么办? 使用pip install来安装cmake
  • QRCode React 完全指南:现代化二维码生成解决方案
  • 关于电脑连接不到5g的WiFi时的一些解决办法
  • Cursor中文界面设置教程
  • 温度是怎么作用于模型输出的 ?
  • 一个迁移案例:从传统 IDC 到 AWS 的真实对比
  • DeerFlow实践:华为LTC流程的评审智能体设计
  • Linux内核调优实战指南
  • Debezium日常分享系列之:深入解析SQL Server事务日志
  • PostgreSQL——并行查询
  • CTFHub SSRF通关笔记10:DNS重绑定 Bypass 原理详解与渗透实战
  • Nginx 优化与防盗链实践
  • Altium Designer(AD)PCB丝印批量修改
  • MySQL在Centos 7环境下安装
  • MLLM学习~M3-Agent Prompt学习
  • ARM 架构的存储器模型
  • MongoDB C# .NetCore 驱动程序 序列化忽略属性
  • 【个人项目】【前端实用工具】OpenAPI到TypeScript转换工具 - 技术指南
  • 简单了解一下GraphRAG
  • 系统架构设计师——【2024年上半年案例题】真题模拟与解析(一)
  • LINUX中USB驱动架构—USB驱动程序框架
  • 【Web】ImaginaryCTF 2025 wp
  • [Windows] (思源笔记首发ai辅助工具)叶归 AI 辅助精美笔记工具
  • 多线程详解
  • ArcGIS(Pro)在线地图服务被禁?提示感叹号?应急方案来了——重新正常显示
  • 《PyTorch 携手 Unity:基于云原生架构化解 AI 游戏系统显存危机》
  • pytorch基本运算-Python控制流梯度运算
  • 编程与数学 03-005 计算机图形学 17_虚拟现实与增强现实技术
  • 计算机网络(一)基础概念
  • [Windows] 搜索文本2.6.2(从word、wps、excel、pdf和txt文件中查找文本的工具)