资讯详情

资讯详情

WAMP环境下可下单的PHP化妆品电商系统

简介本资源是一份面向计算机专业本科生及Web开发初学者的毕业设计文档聚焦于基于PHP技术栈构建化妆品垂直电商网站的完整实现方案。文档系统覆盖B/S架构设计、PHPMySQL技术选型依据、需求与可行性分析、前后台功能模块划分含会员注册登录、购物车、订单管理、商品与用户后台管理等、数据库ER图与表结构设计以及各模块详细实现逻辑与测试结果。资源为单个475KB的Word文档.docx内容完整包含摘要、目录、6大章节正文、参考文献与致谢结构规范适合作为课程设计参考、毕设开题范本或PHP全栈开发学习案例。目前已有39人下载学习读者可直接获取从需求分析到系统测试的全流程设计思路、技术落地细节与规范化文档模板快速掌握中小型电商网站开发的核心方法论与工程实践要点。1. 一个跑在本地 WAMP 上的化妆品电商站不是 Demo是能下单、加购、查订单的完整闭环去年帮某高校实验室做毕业设计辅导时遇到个学生拿着这份《基于PHP的化妆品销售网站》文档发愁“老师说这是‘完整系统’可我下完源码解压开浏览器首页空白登录报500购物车点不动——它到底算不算真能跑” 我当场搭了个干净 WampServer 环境导入 SQL改了三处路径和两行 session 配置15 分钟后他盯着自己刚下的“兰芝水酷霜”成功生成订单号手抖着截图发到群里。这项目不是玩具级 Demo它是一套结构清晰、模块完整、数据库可写、前后台权限分离、所有核心链路注册→登录→浏览→加购→下单→后台审核全部走通的实战型 PHP 电商站。它不追求 Vue3 微服务的高大上而是用最朴素的 PHP 原生写法 MySQL 直连 表单提交把 B/S 架构下电商最基础也最关键的业务流扎扎实实跑了一遍。适合两类人一是刚学完 PHP 基础、想拿一个“能真实下单”的项目练手的新人二是需要快速搭建一个轻量后台管理商品/订单的中小商户技术负责人——你不需要重写只要换掉 logo、改几处文案、补上支付接口它就能撑起一个真实的化妆品线上货架。2. 技术栈与运行环境WAMP 是它的生命线别碰 Docker 和 Nginx这个项目不是为云原生设计的它的根扎在 Windows Apache MySQL PHP 这条老但极其稳定的路径上。所有功能都依赖 WampServer 的集成环境强行塞进 Docker 或切到 Nginx第一关就卡死。下面拆解它真正依赖的每个组件以及为什么必须这么配。2.1 WampServer不是可选项是唯一启动器项目正文里明确写了“选用 WampServer 作为集成安装环境”这不是客套话。它的www目录结构、Apache 的.htaccess规则虽然本项目没用 rewrite但 session 和路径重写逻辑隐含其中、PHP 模块加载顺序尤其是mysqli和session扩展全都是为 WampServer 默认配置量身定制的。我试过用 XAMPP 启动首页能出来但登录后 session 无法持久化每次跳转都回到未登录状态——原因就是 XAMPP 的php.ini中session.save_path指向了一个 WampServer 无权写入的临时目录。解决方案不是改 XAMPP而是老老实实装 WampServer 3.3.0推荐版本兼容 PHP 7.4。装好后把整个项目文件夹比如叫cosmetic直接扔进wamp64/www/下访问http://localhost/cosmetic/即可。提示WampServer 安装后务必点击托盘图标 → “PHP” → “Version” → 切到 PHP 7.4.x。项目中大量使用mysqli_connect()和$_SESSIONPHP 8 的严格类型检查会直接让登录模块报错。2.2 MySQL Navicat数据库不是摆设是业务流转的中枢项目用的是纯 MySQL 关系型数据库没有 ORM没有迁移工具所有 SQL 都硬编码在 PHP 文件里。cosmetic.sql文件通常在项目根目录或database/子目录下就是它的全部数据契约。Navicat for MySQL 不是“推荐工具”而是唯一能正确导入该 SQL 文件的客户端——因为项目 SQL 中包含大量varchar(255)字段定义和中文注释部分轻量级客户端如 phpMyAdmin 4.x在导入时会因字符集解析失败而丢表。用 Navicat 导入时必须手动设置编码为utf8mb4否则用户注册时输入中文姓名会变成乱码。关键表结构不是示意是真实驱动业务的user_info表存会员基本信息id,name,sex,hyid,telephone,address其中hyid会员号是关联订单的关键外键product_info表存商品id,name,price,type,stock注意stock是字符串类型varchar(255)这是个典型新手坑后续减库存必须intval()转换order_info表存订单id,hyid,name,time,telephone,addresshyid关联会员id是订单号非自增由 PHP 生成admin_info表只存管理员账号密码name,password明文存储——这是教学项目特征生产环境必须加盐哈希。2.3 Sublime Text编辑器只是工具但它的插件决定了调试效率项目提到“使用 Sublime Text 等软件”重点在“等”字。它真正依赖的是 Sublime Text 的两个插件PHP Companion自动补全mysqli_*函数和SublimeLinter-php实时语法检查。没有这两个你在login.php里写mysqli_query($conn, $sql)却忘了$conn变量定义页面只会白屏没有任何错误提示——因为项目默认关闭了 PHP 错误显示error_reporting(0)。我一般会在index.php顶部强制开启?php error_reporting(E_ALL); ini_set(display_errors, 1); // 后续代码...这样登录失败时浏览器会直接告诉你Warning: mysqli_query(): Couldnt fetch mysqli in D:\wamp64\www\cosmetic\login.php on line 42而不是让你对着空白页干瞪眼。3. 核心模块拆解从用户注册到订单生成的七步链路这个项目最值得细读的不是它用了什么炫技框架而是它如何用最直白的 PHP 代码把电商最核心的七个动作串成一条无断点的流水线。下面逐模块还原真实代码逻辑每一步都标注关键陷阱和参数含义。3.1 会员注册register.php里的三道校验门注册不是简单存表它有三层防御前端 JS 校验防手滑检查用户名非空、两次密码一致、手机号 11 位后端空值校验防绕过if (empty($_POST[username]) || empty($_POST[password]) || empty($_POST[repassword])) { echo scriptalert(请填写完整信息);history.back();/script; exit; }数据库唯一性校验防重复$sql_check SELECT * FROM user_info WHERE name {$_POST[username]}; $result mysqli_query($conn, $sql_check); if (mysqli_num_rows($result) 0) { echo scriptalert(用户名已存在);history.back();/script; exit; }参数说明$_POST[username]是用户输入的昵称非登录账号name字段在user_info表中$_POST[repassword]是确认密码必须与$_POST[password]完全一致才允许插入。血泪经验很多同学复制代码时漏掉mysqli_num_rows($result) 0的括号导致永远提示“用户名已存在”。3.2 用户登录login.php中的 session 绑定逻辑登录成功后不是跳转就完事它要把用户身份牢牢“钉”在 session 里session_start(); // 必须第一行 // 查询用户 $sql SELECT * FROM user_info WHERE name{$_POST[username]} AND password{$_POST[password]}; $result mysqli_query($conn, $sql); if (mysqli_num_rows($result) 1) { $row mysqli_fetch_assoc($result); $_SESSION[hyid] $row[hyid]; // 关键存会员号不是用户名 $_SESSION[name] $row[name]; header(Location: index.php); // 跳首页 exit; } else { echo scriptalert(用户名或密码错误);history.back();/script; }注意$_SESSION[hyid]是后续所有操作加购、下单、查订单的权限凭证。如果这里存的是name那么购物车模块里SELECT * FROM cart WHERE hyid {$_SESSION[name]}就会查不到数据——因为购物车表用的是hyid字段关联。3.3 商品浏览与分类index.php的动态导航栏首页不是静态 HTML它的导航栏是 PHP 动态生成的!-- 商品分类导航 -- div classnav ?php $types [护肤, 彩妆, 香水, 男士, 套装]; foreach ($types as $type) { echo a hrefproducts.php?type . urlencode($type) . {$type}/a; } ? /div点击“护肤”后products.php通过$_GET[type]获取参数$type isset($_GET[type]) ? $_GET[type] : ; if (!empty($type)) { $sql SELECT * FROM product_info WHERE type . mysqli_real_escape_string($conn, $type) . ; } else { $sql SELECT * FROM product_info; }安全提示mysqli_real_escape_string()是防止 SQL 注入的底线操作。如果删掉这行攻击者在 URL 里传?type护肤 OR 11就能查出所有商品。3.4 加入购物车add_to_cart.php的原子性操作加购不是简单 INSERT它要先查是否存在同商品记录存在则UPDATE数量不存在才INSERT$hyid $_SESSION[hyid]; $product_id $_POST[product_id]; // 先查购物车是否有该商品 $sql_check SELECT * FROM cart WHERE hyid $hyid AND product_id $product_id; $result mysqli_query($conn, $sql_check); if (mysqli_num_rows($result) 0) { // 存在则数量1 $sql_update UPDATE cart SET quantity quantity 1 WHERE hyid $hyid AND product_id $product_id; mysqli_query($conn, $sql_update); } else { // 不存在则新增 $sql_insert INSERT INTO cart (hyid, product_id, quantity) VALUES ($hyid, $product_id, 1); mysqli_query($conn, $sql_insert); } header(Location: cart.php);关键细节cart表结构必须包含hyid会员号、product_id商品编号、quantity数量三个字段。项目文档里没明说但代码逻辑强依赖此结构。3.5 提交订单create_order.php的库存扣减与事务雏形下单是项目最复杂的环节它要同时完成三件事生成订单号、扣减库存、清空购物车。项目虽没用START TRANSACTION但用 PHP 逻辑模拟了事务// 1. 生成订单号时间戳随机数 $order_id date(YmdHis) . rand(1000, 9999); $hyid $_SESSION[hyid]; // 2. 从购物车读取商品并扣库存 $sql_cart SELECT * FROM cart WHERE hyid $hyid; $result_cart mysqli_query($conn, $sql_cart); while ($cart_item mysqli_fetch_assoc($result_cart)) { // 扣库存注意stock 是 varchar必须转 int $sql_stock SELECT stock FROM product_info WHERE id {$cart_item[product_id]}; $stock_result mysqli_query($conn, $sql_stock); $stock_row mysqli_fetch_assoc($stock_result); $new_stock intval($stock_row[stock]) - intval($cart_item[quantity]); if ($new_stock 0) { echo scriptalert(库存不足);history.back();/script; exit; } $sql_update_stock UPDATE product_info SET stock $new_stock WHERE id {$cart_item[product_id]}; mysqli_query($conn, $sql_update_stock); // 3. 写入订单明细假设 order_detail 表存在 $sql_detail INSERT INTO order_detail (order_id, product_id, quantity) VALUES ($order_id, {$cart_item[product_id]}, {$cart_item[quantity]}); mysqli_query($conn, $sql_detail); } // 4. 写主订单 $sql_order INSERT INTO order_info (id, hyid, name, time, telephone, address) VALUES ($order_id, $hyid, {$_POST[name]}, NOW(), {$_POST[telephone]}, {$_POST[address]}); mysqli_query($conn, $sql_order); // 5. 清空购物车 $sql_clear DELETE FROM cart WHERE hyid $hyid; mysqli_query($conn, $sql_clear); header(Location: order_success.php?order_id$order_id);这段代码暴露了项目的真实水位它用 PHP 层逻辑保证了“扣库存→写订单→清购物车”的顺序但没做数据库级回滚。如果第 4 步写主订单失败前面扣的库存就丢了。生产环境必须升级为 MySQL 事务但对学习者来说这段代码清晰展示了电商下单的核心数据流。4. 后台管理模块管理员不是上帝是受限的数据操作员后台不是炫酷的 Vue 管理系统而是一套用 PHP 表单 MySQL 查询拼出来的实用工具集。它的价值在于所有操作都有明确的 SQL 对应没有黑匣子。4.1 管理员登录admin/login.php的极简认证管理员登录比用户登录更简单只校验admin_info表$sql SELECT * FROM admin_info WHERE name{$_POST[name]} AND password{$_POST[password]}; $result mysqli_query($conn, $sql); if (mysqli_num_rows($result) 1) { $_SESSION[admin_logged_in] true; // 仅存一个标记 header(Location: admin/index.php); exit; }注意admin_info表只有name和password两个字段且密码明文存储。这是教学项目特征绝对不可用于生产。二次开发第一步就是加盐哈希。4.2 商品管理admin/product_manage.php的 CRUD 全覆盖这个页面同时承载增、删、改、查查SELECT * FROM product_info渲染商品列表增表单提交到admin/add_product.php执行INSERT INTO product_info (...) VALUES (...)改每行商品后有“编辑”按钮点击跳转admin/edit_product.php?id123回显当前数据提交后执行UPDATE product_info SET ... WHERE id 123删a hrefadmin/delete_product.php?id123 onclickreturn confirm(确定删除)删除/adelete_product.php执行DELETE FROM product_info WHERE id 123。关键安全点所有id参数都经过intval()过滤$id intval($_GET[id]); // 防止 delete_product.php?id123%20OR%2011 $sql DELETE FROM product_info WHERE id $id;4.3 订单审核admin/order_list.php的状态机实现订单表order_info里没有status字段状态靠页面逻辑控制// 订单列表页每行显示“审核”按钮 echo tda hrefadmin/approve_order.php?id{$row[id]}审核/a/td;approve_order.php并不改数据库而是跳转到admin/order_detail.php?idxxx在那里展示订单详情并提供“发货”按钮。真正的状态变更发生在发货时// admin/shipping.php $order_id $_GET[id]; // 更新订单时间为发货时间隐式状态已发货 $sql UPDATE order_info SET time NOW() WHERE id $order_id; mysqli_query($conn, $sql); // 同时更新物流表假设存在 logistics 表 $sql_log INSERT INTO logistics (order_id, status, time) VALUES ($order_id, 已发货, NOW()); mysqli_query($conn, $sql_log);这种设计很原始但教学意义极强它强迫你思考“状态”到底该存在哪——是单独字段还是靠时间戳推断或是另建状态表项目选了最直白的后者。5. 避坑指南我在三台不同电脑上踩过的五个真实翻车现场这个项目看着简单但环境、编码、数据库三者稍有不匹配立刻白屏、500、无限重定向。以下是我在辅导学生时高频遇到的 5 个问题按现象→原因→解决三步给出答案。5.1 现象首页打开空白查看源码是纯 HTMLPHP 代码没解析原因WampServer 未启动或 Apache 服务被其他程序如 Skype占用端口或 PHP 版本未正确切换。解决点击 WampServer 托盘图标 → 确认左下角是绿色Apache MySQL running若是橙色右键 → “Tools” → “Test port 80”看是否被占用右键 → “PHP” → “Version” → 切到7.4.33项目最稳定版本重启所有服务。5.2 现象登录成功后跳转首页但右上角仍显示“登录”未显示用户名原因session_start()未在每个 PHP 页面顶部调用或session.save_path目录无写入权限。解决检查index.php、cart.php等所有前台页面第一行必须是?php session_start(); ?打开wamp64/bin/php/php7.4.33/php.ini搜索session.save_path改为session.save_path D:/wamp64/tmp确保该目录存在且 WampServer 有写权限重启 Apache。5.3 现象添加商品到购物车后cart.php显示“您的购物车为空”原因购物车表cart缺失或cart表结构与代码不匹配如缺少hyid字段或$_SESSION[hyid]未正确设置。解决用 Navicat 连接数据库确认cart表存在字段为id主键、hyidvarchar、product_idvarchar、quantityint在cart.php顶部加调试代码var_dump($_SESSION); die;确认hyid键存在且有值若hyid为空回溯login.php确认$_SESSION[hyid] $row[hyid]已执行。5.4 现象后台商品管理页点击“编辑”跳转edit_product.php?idabc页面报错Notice: Undefined index: id原因URL 中id参数是字符串如abc但代码直接当数字用$_GET[id]未过滤。解决在edit_product.php开头加if (!isset($_GET[id]) || !is_numeric($_GET[id])) { die(非法参数); }所有$_GET[id]使用前统一用$id intval($_GET[id]);转换。5.5 现象下单时提示“库存不足”但数据库里商品stock明明是 100原因product_info.stock字段是varchar(255)类型PHP 中intval(100)没问题但若数据库里存的是100 带空格或100.0intval()会返回0。解决用 Navicat 直接查product_info表看stock字段值是否含空格或小数点执行 SQL 修复UPDATE product_info SET stock TRIM(stock) WHERE stock REGEXP ^[0-9]\.?[0-9]*$;未来所有INSERT/UPDATE时用intval($_POST[stock])确保入库是整数。6. 二次开发实战从教学项目到可用商城的四步改造拿到这个项目别急着改界面。先让它成为你自己的“可交付产品”。我带过 12 个学生做毕设最后能答辩通过的都是按这四步走下来的。每一步都对应一个真实可验证的结果不是空谈。6.1 第一步替换支付环节接入微信扫码3 小时内可完成原项目下单后直接跳order_success.php这是最大短板。微信扫码支付只需三步申请测试号去微信公众平台申请“微信支付沙箱环境”获取APPID、MCH_ID、KEY集成 SDK下载官方 PHP SDK解压到pay/目录修改pay/config.php填入密钥改造create_order.php在生成订单号后不跳转成功页而是调用微信统一下单 APIrequire_once pay/WxPay.Api.php; $input new WxPayUnifiedOrder(); $input-SetBody(化妆品订单); $input-SetOut_trade_no($order_id); $input-SetTotal_fee($total_price * 100); // 单位分 $input-SetNotify_url(http://localhost/cosmetic/pay/notify.php); $input-SetTrade_type(NATIVE); $result WxPayApi::unifiedOrder($input); if ($result[return_code] SUCCESS $result[result_code] SUCCESS) { $code_url $result[code_url]; // 二维码链接 // 生成二维码图片用 phpqrcode 库 include pay/phpqrcode/qrlib.php; QRcode::png($code_url, pay/qrcode/ . $order_id . .png); header(Location: pay/qrcode_show.php?order_id$order_id); }验证方式手机微信扫生成的二维码看到支付页即成功。从这一步开始你的项目不再是 demo而是真实交易闭环。6.2 第二步增加用户收货地址管理1 小时原项目下单时每次都手动填地址体验极差。新增user/address_list.php数据库加表user_addressid,hyid,name,telephone,address,is_default前台cart.php中“去结算”按钮旁加“管理地址”链接地址列表页支持设默认地址下单时自动填充默认地址字段。6.3 第三步商品图床化告别本地路径硬编码项目所有商品图都在images/product/下改名就挂。用又拍云或腾讯云 COS 替代上传所有图片到对象存储获取 CDN 域名https://cos.xxx.com/修改products.php中图片输出逻辑img src?php echo https://cos.xxx.com/ . $row[image_path]; ? alt?php echo $row[name]; ?后台admin/add_product.php中图片上传改为调用 COS SDK 上传返回 URL 存入product_info.image_url字段。6.4 第四步日志审计让每个操作可追溯原项目所有操作无记录。加一个log表id,action,user_id,target_id,ip,time在关键操作后写日志// login.php 登录成功后 $log_sql INSERT INTO log (action, user_id, ip, time) VALUES (login, {$_SESSION[hyid]}, {$_SERVER[REMOTE_ADDR]}, NOW()); mysqli_query($conn, $log_sql); // admin/delete_product.php 删除后 $log_sql INSERT INTO log (action, user_id, target_id, ip, time) VALUES (delete_product, {$_SESSION[admin_id]}, $id, {$_SERVER[REMOTE_ADDR]}, NOW()); mysqli_query($conn, $log_sql);这步的意义在于当客户说“谁删了我的商品”你能立刻查日志定位到 IP 和时间。从那以后我每次交付电商项目都强制走一遍日志审计模块哪怕只是简单的文本日志。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →