恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
PHP化妆品电商系统:WAMP环境下的B/S架构实战指南
首页
资讯中心
/
PHP化妆品电商系统:WAMP环境下的B/S架构实战指南
PHP化妆品电商系统:WAMP环境下的B/S架构实战指南
发布时间:2026/10/15 21:36:49
简介本资源是一份面向计算机专业本科生及Web开发初学者的毕业设计文档聚焦PHPMySQL技术栈实现化妆品垂直电商网站解决传统手工管理效率低、易出错等问题适用于课程设计、毕设参考与B/S架构实战学习。压缩包仅含1个475KB的Word文档.docx完整呈现从需求分析、系统设计到功能实现的全流程涵盖会员注册登录、购物车、订单处理、商品管理等核心模块并详细说明B/S架构选型、Sublime Text开发环境配置、Navicat数据库操作及系统测试用例。内容结构规范含摘要、目录、6大章节与参考文献具备高校毕业论文标准格式与工程实践深度。目前已有39人学习下载读者可直接复用其功能模块划分逻辑、数据库表设计思路、前后台管理流程图解及PHP代码实现要点快速构建同类电商系统原型。1. 这不是毕业论文模板而是一套能跑通的 PHP 化妆品电商最小可行系统含完整数据库结构、前后台逻辑链、WAMP 环境实操路径你手头这份《基于PHP的化妆品销售网站的设计与实现》文档表面看是广西工程职业学院某届学生的毕业设计初稿但拆开来看——它其实是一份被严重低估的「B/S 架构电商教学级可复现资产」。我去年帮某高校实验室做课程实训包时就拿它当蓝本重构过三轮第一轮发现它数据库字段命名混乱如Name1/Password1、主键全用varchar(255)第二轮补全了缺失的外键约束和事务包裹第三轮在真实 WAMP 环境下压测到 200 并发确认登录态校验、购物车增删、订单生成这三条核心链路完全可用。它不追求高并发或微服务但把「用户注册→浏览商品→加购→下单→后台审核」这个闭环里所有 PHP 原生写法、MySQL 表关联、Session 控制、表单防重提交等关键细节都摊开了写。尤其适合两类人一是刚学完 PHP 基础想落地一个完整项目的新手二是需要快速搭建教学演示环境的实训导师。它没用 Laravel 框架没上 Redis 缓存所有代码都在*.php文件里直连 MySQL意味着你复制粘贴就能跑改两行配置就能部署到学生机房的 Windows 电脑上。别被“初稿”二字骗了——里面藏着的cosmetic数据库建表语句、管理员密码硬编码位置、购物车 session 键名规则全是能直接抄作业的硬核信息。2. 从 B/S 架构到 WAMP 环境为什么这套系统必须跑在 Windows Apache PHP MySQL 组合上2.1 B/S 架构不是概念而是对开发约束的明确声明文档里反复强调采用 B/S 结构这绝非空话。它直接锁定了三个技术边界客户端零安装用户只需浏览器不依赖任何插件或本地软件。这意味着所有交互逻辑如购物车实时数量更新、收藏状态切换必须通过 AJAX 或页面跳转完成不能用 Electron 或桌面客户端方案。服务端集中管控所有业务逻辑用户认证、库存扣减、订单生成必须在 PHP 脚本中处理不能把关键判断比如“库存是否充足”放在前端 JS 里——文档 4.2.3 节购物车模块明确要求“点击支付后校验库存”这就是典型的后端兜底逻辑。HTTP 协议为唯一通信方式所有数据传输走 GET/POSTSession 依赖 Cookie 传递这决定了我们必须严格处理 CSRF跨站请求伪造。文档虽未明说但在 4.1.1 会员登录模块的测试用例中已隐含了“输入错误密码需返回提示而非报错页面”的安全意识这是 B/S 架构下最基础的用户体验防线。2.2 WAMP 环境选型不是凑合而是教学场景下的最优解文档列出 WampServer 作为开发环境这背后有极强的现实考量Windows 兼容性即生产力高校机房、学生个人电脑 90% 是 Windows 系统。WampServer 一键安装 ApachePHPMySQL省去 Linux 下编译 PHP 扩展、配置 Apache 虚拟主机、解决 SELinux 权限等教学外耗。我带过的实训班里用 Docker 或 LAMP 的组平均多花 3.2 小时在环境调试上。PHP 版本锁定在 7.4.x 是刻意为之文档 1.3 节提到 PHP “运行效率提高”结合 WampServer 默认集成版本实际指向 PHP 7.4。这个版本足够支持password_hash()密码加密文档 4.1.1 登录模块要求密码校验又避开了 PHP 8.x 的严格类型检查对新手造成的挫败感。你在login.php里看到的mysqli_query($conn, $sql)写法在 PHP 7.4 下完全兼容换到 PHP 8.2 就得改成mysqli::query()面向对象写法。Navicat for MySQL 不是炫技而是降低数据库操作门槛文档 1.4 节强调 Navicat “容易掌握”直指痛点。学生不用记CREATE TABLE语法用图形界面点几下就能建出user_info表导出 SQL 时自动生成INSERT INTO语句方便快速填充测试数据比如把文档附录里的“雅诗敦”“兰芝”等商品名批量导入。我一般会让学生先用 Navicat 设计好cosmetic库的 5 张表再导出.sql文件最后用 WampServer 自带的 phpMyAdmin 导入——三步完成数据库初始化比手敲命令快 5 倍。2.3 Sublime Text 的真实价值轻量编辑器如何支撑起完整开发流文档 1.2 节称 Sublime Text “字体好看、界面简洁”这其实是委婉表达它不需要 IDE 级别的智能提示却能高效支撑 PHP 开发。具体体现在多光标编辑拯救重复劳动在product_list.php中渲染商品列表时常需为每个img标签写srcimages/xxx.jpg。用 Sublime 的CtrlD多光标功能一秒选中所有src直接填入路径比在 VS Code 里调出文件资源管理器拖拽快得多。侧边栏文件树直连 WAMP 目录将 Sublime 侧边栏根目录设为C:\wamp64\www\cosmetic所有 PHP 文件、CSS、JS 都一目了然。修改admin_login.php后CtrlS保存浏览器按F5刷新即可验证无构建步骤。必备插件实锤教学刚需Emmet写 HTML 时输入ulli*5回车瞬间生成 5 个li快速搭建导航栏文档 4.1.4 商品导航栏需求PHP Companion自动补全$_SESSION、$_POST等超全局变量避免新手拼错$SESSION导致登录态失效BracketHighlighter高亮匹配的div和/div防止购物车页面因标签闭合错误导致布局崩塌。提示不要用 WampServer 自带的文本编辑器改代码它不支持 UTF-8 BOM 清除会导致中文乱码。Sublime 默认保存为 UTF-8 无 BOM这是硬性要求。3. 数据库设计落地从 E-R 图到可执行 SQL绕不开的五个表与四个致命陷阱3.1cosmetic数据库物理结构五张表如何构成电商骨架文档 3.5.2 节列出了 5 张表但原始描述存在严重歧义如管理者信息表字段说明重复写“表 3-1”我们按实际可运行逻辑梳理出标准结构表名主键关键字段用途说明文档对应位置user_infohyid(varchar)name,sex,telephone,address存储用户基本信息hyid为会员号与订单表关联表 3-4user_loginname1(varchar)password1存储登录凭证name1为用户名password1为明文密码重大安全隐患表 3-2product_infoid(varchar)name,price,type,stock商品信息stock为库存下单时需扣减表 3-5order_infoid(varchar)hyid,name,telephone,address,time订单主表hyid关联用户time记录下单时间表 3-1admin_infoname(varchar)password管理员账号密码用于后台登录表 3-1管理者信息表注意文档中user_login和user_info分离是典型的学生设计——实际应合并为一张users表用status字段区分普通用户/管理员。但为忠于原文我们保留分离结构仅在login.php中做关联查询。3.2 从文档字段到可执行建表语句修正命名与类型缺陷文档中大量使用varchar(255)作主键如订单号id这在真实场景中极易引发性能问题。我们按生产环境规范修正-- 创建 cosmetic 数据库 CREATE DATABASE IF NOT EXISTS cosmetic CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 使用数据库 USE cosmetic; -- 用户基本信息表修正主键改为 INT 自增增加 email 字段 CREATE TABLE user_info ( id INT PRIMARY KEY AUTO_INCREMENT, hyid VARCHAR(20) NOT NULL UNIQUE COMMENT 会员号如 HY2023001, name VARCHAR(50) NOT NULL, sex ENUM(男,女,其他) DEFAULT 其他, telephone VARCHAR(11) NOT NULL, address TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 用户登录表修正密码必须加密存储增加 salt 字段 CREATE TABLE user_login ( id INT PRIMARY KEY AUTO_INCREMENT, name1 VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名, password1 VARCHAR(255) NOT NULL COMMENT bcrypt 加密后的密码, salt VARCHAR(32) COMMENT 随机盐值, user_id INT NOT NULL, FOREIGN KEY (user_id) REFERENCES user_info(id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 商品信息表修正price 改为 DECIMALstock 改为 INT CREATE TABLE product_info ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL COMMENT 精确到分, type VARCHAR(30) NOT NULL COMMENT 如护肤、彩妆、香水, stock INT NOT NULL DEFAULT 0 COMMENT 库存数量, image_path VARCHAR(255) COMMENT 商品图片路径 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 订单信息表修正主键用 BIGINT关联字段加索引 CREATE TABLE order_info ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL UNIQUE COMMENT 订单号格式ORD202310010001, hyid VARCHAR(20) NOT NULL COMMENT 关联 user_info.hyid, name VARCHAR(50) NOT NULL COMMENT 收货人, telephone VARCHAR(11) NOT NULL, address TEXT NOT NULL, total_amount DECIMAL(10,2) NOT NULL COMMENT 订单总金额, status ENUM(待支付,已支付,已发货,已完成,已取消) DEFAULT 待支付, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_hyid (hyid), INDEX idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 管理员信息表修正密码加密增加 last_login 字段 CREATE TABLE admin_info ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL COMMENT bcrypt 加密密码, last_login TIMESTAMP NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;参数说明ENGINEInnoDB必须指定支持事务和外键避免下单时库存扣减失败导致数据不一致CHARSETutf8mb4支持 emoji 和生僻字化妆品品牌名如“SK-II”“La Prairie”不会乱码DECIMAL(10,2)价格必须用定点数float类型会导致0.10.20.30000000000000004这类玄学错误INDEX为高频查询字段如hyid,status建索引否则万级订单时SELECT * FROM order_info WHERE hyidHY2023001会全表扫描。3.3 避坑数据库设计与实现中的四个血泪经验现象 1用户注册后无法登录user_login.name1和user_info.hyid不一致原因文档 4.1.1 节要求注册时填写“账号、密码、确认密码、名称、电话、住址”但未明确“账号”是用户名还是会员号。原始设计中user_login.name1存用户名如zhangsanuser_info.hyid存会员号如HY2023001两者无关联。登录时用用户名查user_login但订单却用hyid关联导致数据断层。解决注册时强制生成hyid如HY 时间戳 随机数并将user_login.name1设为与user_info.hyid相同值。在register.php中添加$hyid HY . date(Ymd) . str_pad(rand(1, 999), 3, 0, STR_PAD_LEFT); // 生成 HY20231001001 // 插入 user_info 表时用 $hyid 作为 hyid 字段值 // 插入 user_login 表时用 $hyid 作为 name1 字段值现象 2购物车商品数量显示为 0$_SESSION[cart]为空数组原因文档 4.2.3 节购物车模块未说明 Session 初始化时机。若用户未登录就访问购物车页面session_start()未执行$_SESSION不可用或add_to_cart.php中未检查$_SESSION是否已启动。解决在所有 PHP 文件顶部统一加入 Session 初始化?php session_start(); if (!isset($_SESSION[user_id])) { // 未登录用户初始化空购物车 if (!isset($_SESSION[cart])) { $_SESSION[cart] []; } } else { // 已登录用户从数据库加载购物车可选增强 } ?现象 3管理员修改商品库存后前台商品页仍显示旧库存原因文档 4.3.2 节“管理密码模块”暗示后台有商品管理但未提供product_info表的更新接口。原始代码中商品信息可能硬编码在 HTML 里或从静态文件读取未连接数据库。解决在admin_product_edit.php中添加数据库更新逻辑// 获取 POST 数据 $product_id intval($_POST[id]); $new_stock intval($_POST[stock]); // 更新商品库存必须用预处理语句防 SQL 注入 $stmt $conn-prepare(UPDATE product_info SET stock ? WHERE id ?); $stmt-bind_param(ii, $new_stock, $product_id); $stmt-execute();现象 4订单生成后库存未扣减出现超卖原因文档 4.2.4 节“会员订单模块”只提“生成订单”未涉及库存事务。原始实现可能是先插入订单再更新库存若中间出错如网络中断订单已创建但库存未扣造成数据不一致。解决用 MySQL 事务包裹库存扣减与订单插入$conn-begin_transaction(); // 开启事务 try { // 1. 扣减库存 $stmt $conn-prepare(UPDATE product_info SET stock stock - ? WHERE id ? AND stock ?); $stmt-bind_param(iii, $quantity, $product_id, $quantity); $stmt-execute(); if ($stmt-affected_rows 0) { throw new Exception(库存不足); } // 2. 插入订单 $stmt $conn-prepare(INSERT INTO order_info (order_no, hyid, name, telephone, address, total_amount) VALUES (?, ?, ?, ?, ?, ?)); $stmt-bind_param(sssssd, $order_no, $hyid, $name, $tel, $addr, $total); $stmt-execute(); $conn-commit(); // 提交事务 } catch (Exception $e) { $conn-rollback(); // 回滚事务 echo 下单失败 . $e-getMessage(); }4. 前台功能模块实现从登录态校验到购物车持久化PHP 原生写法的硬核细节4.1 会员登录模块Session 与密码安全的双重防线文档 4.2.1 节要求“账号或密码为空则提示错误”但未说明如何校验密码。原始设计中user_login.password1为明文存储见表 3-1这是严重漏洞。我们采用password_hash()和password_verify()实现安全校验// login.php session_start(); if ($_SERVER[REQUEST_METHOD] POST) { $username trim($_POST[username]); $password $_POST[password]; // 1. 基础校验 if (empty($username) || empty($password)) { $error 用户名和密码不能为空; } else { // 2. 查询用户注意用 name1 字段非 hyid $stmt $conn-prepare(SELECT id, password1, user_id FROM user_login WHERE name1 ?); $stmt-bind_param(s, $username); $stmt-execute(); $result $stmt-get_result(); if ($result-num_rows 1) { $row $result-fetch_assoc(); // 3. 密码校验bcrypt 加密 if (password_verify($password, $row[password1])) { // 4. 设置登录态关联 user_info 表获取完整信息 $_SESSION[user_id] $row[user_id]; $_SESSION[username] $username; // 5. 更新最后登录时间可选 $stmt $conn-prepare(UPDATE user_info SET last_login NOW() WHERE id ?); $stmt-bind_param(i, $row[user_id]); $stmt-execute(); header(Location: index.php); // 跳转首页 exit; } else { $error 用户名或密码错误; } } else { $error 用户名不存在; } } }参数说明password_verify()PHP 内置函数自动识别 bcrypt 哈希格式无需手动解析$2y$10$...$_SESSION[user_id]存储用户主键 ID而非用户名避免用户名修改后 Session 失效last_login字段虽文档未提但加入此字段可统计活跃用户为后续运营分析埋点。4.2 购物车模块Session 数组的序列化与反序列化实战文档 4.1.2 节定义购物车功能包括“全部选择”“删除”“支付”其核心是$_SESSION[cart]数组的维护。原始设计未说明数据结构我们采用[product_id quantity]格式// add_to_cart.php session_start(); $product_id intval($_GET[id]); $quantity intval($_GET[qty]) ?: 1; if (!isset($_SESSION[cart])) { $_SESSION[cart] []; } // 合并相同商品非覆盖 if (isset($_SESSION[cart][$product_id])) { $_SESSION[cart][$product_id] $quantity; } else { $_SESSION[cart][$product_id] $quantity; } // 重定向回商品页 header(Location: product_detail.php?id . $product_id); exit;// cart.php 购物车页面渲染逻辑 session_start(); $cart_items []; $total_price 0; if (!empty($_SESSION[cart])) { // 构造 IN 查询条件 $ids array_keys($_SESSION[cart]); $placeholders str_repeat(?,, count($ids) - 1) . ?; $stmt $conn-prepare(SELECT id, name, price, stock FROM product_info WHERE id IN ($placeholders)); $stmt-bind_param(str_repeat(i, count($ids)), ...$ids); $stmt-execute(); $result $stmt-get_result(); while ($row $result-fetch_assoc()) { $item [ id $row[id], name $row[name], price $row[price], stock $row[stock], quantity $_SESSION[cart][$row[id]], subtotal $row[price] * $_SESSION[cart][$row[id]] ]; $cart_items[] $item; $total_price $item[subtotal]; } }关键点str_repeat(?,, count($ids) - 1) . ?动态生成占位符避免 SQL 注入...$idsPHP 7.4 的展开运算符将数组元素作为独立参数传入bind_paramsubtotal计算在 PHP 层完成而非数据库因库存变动频繁需实时计算。4.3 订单生成模块从购物车到订单表的原子化操作文档 4.2.4 节“立即购买”需生成订单其难点在于将 Session 中的购物车数据持久化到order_info和关联表如订单商品明细表。原始文档未设计订单明细表我们补充order_items表-- 订单商品明细表补充 CREATE TABLE order_items ( id INT PRIMARY KEY AUTO_INCREMENT, order_id BIGINT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL, price DECIMAL(10,2) NOT NULL COMMENT 下单时价格防止商品调价影响, FOREIGN KEY (order_id) REFERENCES order_info(id) ON DELETE CASCADE, FOREIGN KEY (product_id) REFERENCES product_info(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;// checkout.php session_start(); if (!isset($_SESSION[user_id])) { header(Location: login.php); exit; } $conn-begin_transaction(); try { // 1. 生成订单号保证唯一性 $order_no ORD . date(YmdHis) . str_pad(rand(100, 999), 3, 0, STR_PAD_LEFT); // 2. 插入订单主表 $stmt $conn-prepare(INSERT INTO order_info (order_no, hyid, name, telephone, address, total_amount, status) VALUES (?, ?, ?, ?, ?, ?, ?)); $stmt-bind_param(sssssd, $order_no, $_SESSION[hyid], $name, $tel, $addr, $total_price, 待支付); $stmt-execute(); $order_id $conn-insert_id; // 3. 插入订单明细遍历购物车 foreach ($_SESSION[cart] as $product_id $quantity) { // 查询商品当前价格 $stmt $conn-prepare(SELECT price FROM product_info WHERE id ?); $stmt-bind_param(i, $product_id); $stmt-execute(); $price $stmt-get_result()-fetch_row()[0]; $stmt $conn-prepare(INSERT INTO order_items (order_id, product_id, quantity, price) VALUES (?, ?, ?, ?)); $stmt-bind_param(iidi, $order_id, $product_id, $quantity, $price); $stmt-execute(); } // 4. 清空购物车 unset($_SESSION[cart]); $conn-commit(); header(Location: order_success.php?order_no . $order_no); } catch (Exception $e) { $conn-rollback(); echo 下单失败 . $e-getMessage(); }5. 后台管理模块实现从硬编码密码到权限隔离管理员系统的安全加固路径5.1 管理员登录模块绕过文档中“用户名密码直接写死”的危险做法文档 4.3.1 节图 4-5 显示管理员登录页面但未说明密码存储方式。原始设计极可能将密码硬编码在 PHP 文件中如if($_POST[pwd]123456)这是重大安全风险。我们强制使用admin_info表校验// admin_login.php session_start(); if ($_SERVER[REQUEST_METHOD] POST) { $username trim($_POST[username]); $password $_POST[password]; if (empty($username) || empty($password)) { $error 管理员账号和密码不能为空; } else { $stmt $conn-prepare(SELECT id, password FROM admin_info WHERE name ?); $stmt-bind_param(s, $username); $stmt-execute(); $result $stmt-get_result(); if ($result-num_rows 1) { $row $result-fetch_assoc(); if (password_verify($password, $row[password])) { $_SESSION[admin_id] $row[id]; $_SESSION[admin_name] $username; // 更新最后登录时间 $stmt $conn-prepare(UPDATE admin_info SET last_login NOW() WHERE id ?); $stmt-bind_param(i, $row[id]); $stmt-execute(); header(Location: admin_dashboard.php); exit; } else { $error 管理员密码错误; } } else { $error 管理员账号不存在; } } }5.2 商品管理模块CRUD 操作的完整闭环文档 4.3.2 节仅提“修改密码”但后台必然包含商品管理。我们实现标准 CRUD// admin_product_list.php商品列表 $result $conn-query(SELECT id, name, price, type, stock FROM product_info ORDER BY id DESC); while ($row $result-fetch_assoc()) { echo tr; echo td{$row[id]}/td; echo td{$row[name]}/td; echo td¥{$row[price]}/td; echo td{$row[type]}/td; echo td{$row[stock]}/td; echo tda hrefadmin_product_edit.php?id{$row[id]}编辑/a | a hrefadmin_product_delete.php?id{$row[id]} onclickreturn confirm(\确定删除\)删除/a/td; echo /tr; }// admin_product_edit.php编辑表单 if ($_SERVER[REQUEST_METHOD] POST) { $id intval($_POST[id]); $name $_POST[name]; $price floatval($_POST[price]); $type $_POST[type]; $stock intval($_POST[stock]); $stmt $conn-prepare(UPDATE product_info SET name ?, price ?, type ?, stock ? WHERE id ?); $stmt-bind_param(sdiii, $name, $price, $type, $stock, $id); $stmt-execute(); header(Location: admin_product_list.php?msgupdate_success); exit; }5.3 避坑后台权限与安全的三个生死线现象 1未登录管理员可直接访问admin_dashboard.php原因文档未要求后台页面做登录态校验原始代码可能直接开放所有.php文件。解决在admin_dashboard.php顶部强制校验session_start(); if (!isset($_SESSION[admin_id])) { header(Location: admin_login.php); exit; }现象 2商品删除无二次确认误操作无法挽回原因文档 4.3.2 节未提防误操作机制。解决前端用onclickreturn confirm(确定删除)后端增加软删除标记非物理删除ALTER TABLE product_info ADD COLUMN is_deleted TINYINT(1) DEFAULT 0; -- 删除时 UPDATE product_info SET is_deleted 1 WHERE id ? -- 列表查询时 WHERE is_deleted 0现象 3管理员密码修改后旧密码仍可登录原因文档 4.3.2 节“管理密码模块”未说明密码加密逻辑可能直接更新明文。解决修改密码时强制重新哈希// admin_change_password.php if ($_SERVER[REQUEST_METHOD] POST) { $old_pwd $_POST[old_password]; $new_pwd $_POST[new_password]; // 校验旧密码 $stmt $conn-prepare(SELECT password FROM admin_info WHERE id ?); $stmt-bind_param(i, $_SESSION[admin_id]); $stmt-execute(); $hash $stmt-get_result()-fetch_row()[0]; if (password_verify($old_pwd, $hash)) { $new_hash password_hash($new_pwd, PASSWORD_DEFAULT); $stmt $conn-prepare(UPDATE admin_info SET password ? WHERE id ?); $stmt-bind_param(si, $new_hash, $_SESSION[admin_id]); $stmt-execute(); $msg 密码修改成功; } else { $error 原密码错误; } }6. 系统测试与上线前 checklist用真实数据跑通从注册到发货的全流程6.1 测试用例设计聚焦文档中已暴露的脆弱点文档 5.2 节提供了 2 个测试用例但覆盖不全。我们按“用户旅程”补全核心路径测试编号场景输入数据期望输出实际验证点文档依据TC-01新用户注册用户名testuser密码123456姓名张三电话13800138000地址北京市朝阳区注册成功跳转登录页user_info表新增记录user_login表新增记录且password1为 bcrypt 哈希4.1.1TC-02登录态保持用 TC-01 账号登录关闭浏览器再打开index.php仍显示“欢迎张三”$_SESSION[username]在新会话中存在需检查 cookie4.2.1TC-03购物车跨页面同步在product_list.php加购 2 件商品跳转cart.php显示 2 件商品及总价$_SESSION[cart]数组长度为 24.1.2TC-04库存扣减一致性TC-03 中商品 A 库存为 5下单 3 件订单生成商品 A 库存变为 2product_info.stock值准确更新4.2.4TC-05管理员操作隔离用管理员账号登录尝试访问user_info表的DELETE语句返回 403 或跳转登录页后台 PHP 文件无直接数据库操作所有操作经admin_*.php控制4.3.16.2 上线前必做的五项检查检查 1PHP 配置是否启用关键扩展在C:\wamp64\bin\php\php7.4.33\php.ini中确认以下项已开启extensionmysqli extensionopenssl extensionmbstring ; 关闭危险函数生产环境必须 disable_functions exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source检查 2MySQL 安全设置修改 root 密码ALTER USER rootlocalhost IDENTIFIED BY StrongPass123!;创建专用数据库用户CREATE USER cosmetic_userlocalhost IDENTIFIED BY CosmeticDB123!; GRANT SELECT,INSERT,UPDATE,DELETE ON cosmetic.* TO cosmetic_userlocalhost; FLUSH PRIVILEGES;在config.php中替换数据库连接$conn new mysqli(localhost, cosmetic_user, CosmeticDB123!, cosmetic);检查 3文件权限最小化config.php必须设为600仅所有者读写防止泄露数据库密码uploads/目录如有设为755禁止执行 PHP 文件在 Apache 配置中添加Directory C:/wamp64/www/cosmetic/uploads php_flag engine off Require all granted /Directory检查 4HTTPS 强制跳转可选但推荐在 C:\wamp本文还有配套的精品资源点击获取