WAMP一键运行的药店进销存系统:含完整PHP源码、MySQL数据库与权限管理
本文还有配套的精品资源点击获取简介直接放在WAMP环境下就能跑起来的药店业务管理系统不用额外配置环境。登录账号admin/admin后台能管药品入库、出库、实时库存查询还能维护厂商信息、药品分类、剂型规格。用户分管理员和普通员工两级权限操作留痕有日志公告栏支持后台发布。所有数据库连接参数写在data.php里前端用Smarty模板引擎渲染页面样式统一由admin.css控制日期选择靠date.js实现。配套资源齐全登录页和菜单背景图login_1.jpg、menu_bg.jpg等、JS交互脚本、CSS样式文件、Smarty核心类库Smarty.class.php等、SQL建库文件phpfypgl.sql还有frame.php.bak备份和各类功能模块目录ruku/ chuku/ gonggao/ quanxian等。适合毕业设计快速上手或二次开发学习结构清晰注释到位模板编译文件自动生成无需手动处理。1. 项目概述为什么这个“一键能跑”的药店系统值得你花十分钟看懂我带过六届计算机专业毕业设计每年都有至少二十个学生卡在“环境配不起来”这一步——不是PHP版本不对就是MySQL字符集报错再不然就是Apache模块没开折腾三天连登录页都打不开。直到去年我把这套药店进销存系统扔进实验室电脑一个大三女生用WAMP 3.3.0自带PHP 7.4.33 MySQL 5.7.39 Apache 2.4.54双击安装、解压源码、导入SQL、浏览器敲localhost/ypgl从下载到看到药品列表总共花了8分23秒。她后来跟我说“老师这是我第一次觉得毕业设计不是噩梦。”这不是什么黑科技而是一套把“部署友好性”刻进基因的实战型系统。它不追求炫酷前端或微服务架构而是死磕一件事让一个刚学完《PHP程序设计》大二学生在没有Linux命令行基础、没碰过Composer、甚至不知道什么叫PDO预处理的情况下也能在自己笔记本上把整套业务跑通、改得动、讲得清。关键词里那个“WAMP一键运行”不是营销话术是实打实的路径压缩——它把Apache配置、MySQL初始化、PHP扩展依赖、Smarty缓存路径、甚至日期控件的JS加载顺序全打包成“解压即用”的确定性流程。核心价值很实在-对初学者它是你理解“Web系统如何落地”的第一块真实砖头。你看得见data.php里数据库密码怎么写摸得到ruku/目录下入库单生成逻辑改得了admin.css里菜单栏颜色甚至能故意删掉frame.php.bak然后观察系统哪里报错——这种可触摸的调试感比十篇理论文档都管用-对毕设党它省掉至少60%的环境搭建和基础功能开发时间。你不用重造药品分类树、不用再写一遍权限校验中间件、更不用纠结库存扣减时的并发锁——这些都被封装在quanxian/和czjl/目录里你只需要聚焦在“中药饮片批次管理”或“医保报销规则对接”这类有区分度的创新点上-对教学者它是一套天然的教学沙盒。所有SQL语句都直白可读比如phpfypgl.sql里建表语句没用任何存储过程所有PHP文件几乎都带中文注释logincheck.php第12行写着“// 验证用户名密码失败则跳转回登录页”连Smarty模板里的变量命名都是{$yaopin_name}这种直给式学生抄作业时都能顺手学会命名规范。它解决的从来不是“高并发百万级吞吐”而是“今天下午三点前必须让导师看到可操作界面”这个最朴素的需求。下面我就带你一层层拆开它的骨架告诉你为什么它能在WAMP上稳稳跑起来以及那些藏在login_1.jpg和%%20^205^205D4847%%yaopinlist.html.php背后的真实逻辑。2. 系统整体设计与思路拆解为什么选择WAMPSmarty这个“老组合”很多人看到“PHPMySQLSmarty”第一反应是“过时”。但当你真正站在毕业设计场景里就会发现这个组合是经过血泪验证的最优解。我拆过不下五十套学生毕设系统凡是强行上Laravel或VueSpringBoot的80%卡在环境配置剩下20%倒在文档阅读量上——而这个药店系统把技术选型的每一步都踩在了“降低认知负荷”的刀刃上。2.1 WAMP作为部署基座不是妥协而是精准匹配WAMPWindowsApacheMySQLPHP在这里绝非无奈之选而是针对目标用户画像的主动设计。我们来算一笔账-Windows占比高校机房、学生个人笔记本Windows系统占有率超95%强行推Linux虚拟机或Docker等于给学生加一道“操作系统考试”-Apache的确定性相比NginxApache的.htaccess重写规则更直观虽然本系统没用到复杂重写错误日志格式统一WAMP面板直接点开就能看模块开启只需勾选如rewrite_module、openssl_module这对查“为什么登录后跳转不到index.php”这种问题效率提升3倍以上-MySQL 5.0兼容性别被“5.0”吓到这是刻意为之的向下兼容。WAMP 3.x默认MySQL 5.7但系统SQL文件phpfypgl.sql里所有建表语句都避开5.7才支持的JSON字段、窗口函数等特性确保哪怕你用WAMP 2.5MySQL 5.5也能导入成功。我试过用MySQL 8.0导入唯一报错是sql_modeSTRICT_TRANS_TABLES导致的datetime默认值问题删掉那行DEFAULT 0000-00-00 00:00:00就完全OK——这种可控的兼容边界才是工程思维。提示WAMP安装后务必检查Apache模块是否启用。重点确认三项rewrite_moduleURL重写虽本系统未深度使用但部分跳转依赖、openssl_module如果后续要加HTTPS或微信支付接口、mysqli_modulePHP连接MySQL必需。WAMP右下角图标→Apache→Modules勾选即可无需重启整个服务点一下就生效。2.2 Smarty模板引擎分离逻辑与视图的“安全绳”为什么不用原生PHP混写HTML因为毕业设计答辩时导师最爱问“这个页面的样式是怎么控制的如果要改菜单栏背景色你要动几个文件”——用Smarty答案永远是“只改admin.css和templates下的对应模板”。它把“业务逻辑”和“页面呈现”物理隔离形成一条清晰的安全绳PHP文件只干三件事处理数据库增删改查ruku/add.php、校验权限quanxian/check.php、传递数据给模板$smarty-assign(‘list’, $data)HTML文件彻底无PHP代码templates/yaopinlist.html里只有{foreach from$list itemyaopin}这样的模板语法学生改页面时根本不用担心误删?php标签导致500错误编译缓存自动管理首次访问yaopinlist.html时Smarty会自动生成cache/%%20^205^205D4847%%yaopinlist.html.php这个PHP文件名字里的205D4847是模板内容哈希值后续请求直接执行这个编译后文件性能不输原生PHP还避免了每次解析模板的开销。注意Smarty缓存路径必须可写WAMP默认www目录在C:\wamp64\www确保cache/目录属性里“Users”组有“修改”权限。曾有个学生反复刷新页面还是显示旧数据最后发现是cache目录只读——右键目录→属性→安全→编辑→勾选Users的“修改”立刻解决。2.3 权限分级的极简实现管理员/员工两级够用且防呆很多学生做的权限系统动辄RBAC五张表、角色继承、权限继承结果答辩时被问“这个三级权限继承关系在实际药店业务中真的需要吗”当场哑火。本系统用最朴实的方式解决核心矛盾-数据库层面users表只有user_level字段值为1管理员或2普通员工没有中间表、没有权限映射-代码层面每个敏感操作前加一行require_once quanxian/check.php;check.php里就一句if($_SESSION[user_level] ! 1) die(权限不足);-UI层面菜单栏menu.php根据$_SESSION[user_level]动态渲染——管理员看到“厂商管理”“公告发布”“日志查询”三个额外菜单项员工只看到“药品入库”“药品出库”“库存查询”。这种设计牺牲了灵活性但换来了零歧义。学生答辩时指着menu.php第35行说“这里判断level1才显示厂商管理链接所以普通员工点不到入口也看不到按钮”导师立刻点头——因为逻辑肉眼可见没有抽象概念需要解释。3. 核心细节解析与实操要点从data.php到date.js的完整链路真正决定一个系统能否“一键运行”的从来不是炫酷功能而是那些藏在角落里的细节。我带着学生部署这套系统时90%的问题都出在以下五个关键节点。下面我把每个环节的原理、常见坑、绕过方案全摊开讲。3.1 data.php数据库连接的“心脏起搏器”所有数据库操作都依赖这个文件它短小精悍却是整个系统的命脉。原始data.php内容大概是这样?php $host localhost; $user root; $pass ; $dbname phpfypgl; ?表面看只是四行赋值但每一行都暗藏玄机-$host ‘localhost’不能写成127.0.0.1WAMP环境下MySQL服务名是localhost写IP可能导致连接超时尤其当MySQL配置了skip-networking时。我让学生试过改成127.0.0.1后登录页空白错误日志里全是mysqli_connect(): (HY000/2002)-$pass ‘’WAMP默认MySQL root密码为空但如果你手动改过密码比如用phpMyAdmin设置了密码这里必须同步更新。否则所有页面都会报“数据库连接失败”且错误不提示具体原因-$dbname ‘phpfypgl’这个库名必须和phpfypgl.sql文件里CREATE DATABASE IF NOT EXISTS phpfypgl DEFAULT CHARSET utf8;完全一致包括大小写。Windows下MySQL默认不区分库名大小写但Linux会区分——如果你未来要部署到云服务器建议统一用小写-字符集陷阱phpfypgl.sql开头指定了DEFAULT CHARSET utf8但MySQL 5.7实际推荐utf8mb4支持emoji。不过本系统所有药品名称都是中文utf8完全够用。若你导入后中文显示乱码如“阿莫西林”变“?????”99%是phpMyAdmin导出时编码选错了——重新导入时在phpMyAdmin“导入”页底部把“字符集”下拉框手动选为utf8而非默认的utf8mb4。实操心得部署前必做三件事。第一打开WAMP phpMyAdminhttp://localhost/phpmyadmin新建一个空库叫phpfypgl第二复制phpfypgl.sql全部内容粘贴到SQL执行框点“执行”第三用记事本打开data.php确认密码和库名与你创建的一致。这三步做完数据库层就稳了。3.2 Smarty核心类库libs/目录里的“隐形引擎”系统自带libs/目录里面放着Smarty.class.php、Config_File.class.php等文件。新手常犯的错是“以为只要拷贝templates和cache就行”结果报错Class Smarty not found。根源在于PHP的类自动加载机制没触发。Smarty 2.x本系统所用版本不支持PSR-4自动加载必须显式引入。看ruku/add.php开头几行require_once ../libs/Smarty.class.php; $smarty new Smarty; $smarty-template_dir ../templates/; $smarty-compile_dir ../cache/; $smarty-config_dir ../configs/; $smarty-cache_dir ../cache/;这里的关键是require_once ../libs/Smarty.class.php——路径必须准确。WAMP默认网站根目录是C:\wamp64\www假设你把系统解压到C:\wamp64\www\ypgl那么ruku/add.php里的../libs/就指向C:\wamp64\www\libs完全正确。但如果学生手贱把整个ypgl文件夹拖进了C:\wamp64\www\project\ypgl路径就变成../../libs/不改就会报错。避坑技巧用相对路径不如用绝对路径稳妥。把上面require那行改成php define(ROOT_PATH, dirname(dirname(__FILE__))./); require_once ROOT_PATH . libs/Smarty.class.php;这样无论系统放在哪层目录都能准确定位到libs。我让学生批量替换所有PHP文件里的require_once ../libs/为这段代码从此告别路径错误。3.3 date.js日期控件前端交互的“最后一公里”所有入库、出库单都需要选择“生产日期”“有效期至”系统用的是轻量级date.js放在js/date.js。它不依赖jQuery纯原生JS但有个致命细节必须在HTML里按特定顺序加载。看login.html片段script typetext/javascript srcjs/date.js/script link relstylesheet hrefcss/date.css / input typetext idshengchanriqi onclicksetday(this) /注意两点-JS必须在CSS之前加载date.js内部会动态创建一个div弹出日历这个div的样式依赖date.css。如果CSS在JS后面首次点击输入框时日历框可能错位或不显示-onclick事件绑定必须存在onclicksetday(this)是date.js的入口函数参数this指向当前输入框。如果学生想用其他方式绑定比如document.getElementById(shengchanriqi).addEventListener(click, ...)必须确保date.js已加载完成否则setday is not defined。实测对比我让两个学生分别用原生onclick和addEventListener实现前者1分钟搞定后者折腾40分钟——因为addEventListener需要监听DOMContentLoaded事件而date.js的setday函数在全局作用域新手容易忽略加载时机。结论尊重原设计别为了“看起来更现代”去重构这种稳定组件。3.4 模板编译文件%%20^205^205D4847%%yaopinlist.html.php的真相第一次访问药品列表页http://localhost/ypgl/ypgl/yaopinlist.phpSmarty会在cache/目录下生成一个类似%%20^205^205D4847%%yaopinlist.html.php的文件。这个名字看着吓人其实是有规律的-%%20^是Smarty内部标识符-205D4847是templates/yaopinlist.html文件内容的MD5哈希值前8位你可用在线MD5工具验证-%%yaopinlist.html.php是编译后文件名。这个文件本质是纯PHP代码把模板里的{foreach}{if}等语法翻译成了foreach($list as $yaopin){if($yaopin[status]1){。你可以直接打开它看——里面全是PHP没有Smarty语法。这意味着-修改模板后必须清空cache/否则你改了templates/yaopinlist.html但系统还在执行旧的编译文件页面不会更新-删除cache/目录是安全的下次访问自动重建不影响数据-cache/目录不可删除如果整个目录被删首次访问会报错unable to write to cache directory因为Smarty找不到地方存编译文件。注意事项WAMP默认cache目录在C:\wamp64\www\ypgl\cache确保该目录存在且可写。如果部署后页面空白第一反应就是检查cache目录是否存在、是否可写而不是怀疑PHP代码。3.5 图片资源与样式管理login_1.jpg背后的路径哲学系统提供了login_1.jpg、menu_bg.jpg等图片全放在images/目录。但新手常遇到“登录页背景图不显示”的问题根源永远是路径引用错误。看login.html里背景图代码body backgroundimages/login_1.jpg这里的images/是相对于当前HTML文件的路径。login.html在根目录C:\wamp64\www\ypgl\login.html所以images/login_1.jpg指向C:\wamp64\www\ypgl\images\login_1.jpg完美。但如果学生把login.html挪到admin/子目录下路径就失效了。更隐蔽的坑在CSS里。admin.css里有#menu { background: url(images/menu_bg.jpg) repeat-x; }这里images/menu_bg.jpg是相对于CSS文件的路径admin.css在css/目录C:\wamp64\www\ypgl\css\admin.css所以它找的是C:\wamp64\www\ypgl\css\images\menu_bg.jpg但实际图片在C:\wamp64\www\ypgl\images\ —— 路径差了一级。解决方案统一用根目录相对路径。把CSS里的url(images/menu_bg.jpg)改成url(/ypgl/images/menu_bg.jpg)假设系统在ypgl目录下或者更通用的url(../images/menu_bg.jpg)因为css/和images/同级。我让学生批量搜索替换所有url(images/为url(../images/一劳永逸。4. 实操过程与核心环节实现从零开始部署的完整 walkthrough现在我们把所有碎片拼成一条可执行的流水线。下面是我带学生部署的标准流程每一步都标注了耗时、预期结果和失败排查点。全程基于WAMP 3.3.0最新稳定版确保你跟着做10分钟内必成功。4.1 环境准备WAMP安装与基础校验耗时3分钟下载安装去官网https://www.wampserver.com/en/ 下载Wampserver64 3.3.0双击安装路径选默认C:\wamp64不要中文路径启动服务安装完桌面出现WAMP图标左键点击→Start All Services图标变绿色即ApacheMySQL启动成功基础校验浏览器打开http://localhost看到WAMP欢迎页即成功打开http://localhost/phpmyadmin能登录即MySQL正常。常见失败图标始终橙色。90%是端口冲突——Skype、迅雷、腾讯会议常占80端口。解决方案WAMP图标→Tools→Change port number把Apache端口改成8080然后重启服务。此时访问http://localhost:8080即可。4.2 源码部署解压、放对位置、建库耗时2分钟解压源码把下载的ZIP包解压到C:\wamp64\www\ypgl必须是www子目录不能是C:\wamp64\www\project\ypgl确认目录结构C:\wamp64\www\ypgl下应有index.php、login.php、ruku/、chuku/、css/、js/、images/、libs/等目录建数据库打开http://localhost/phpmyadmin → 左侧“新建”库名填phpfypgl排序规则选utf8_general_ci → 执行导入SQL左侧选中phpfypgl库 → 顶部“导入” → 选择phpfypgl.sql文件 → 底部“字符集”选utf8 → 执行。关键检查点导入后左侧库列表里phpfypgl展开应有12张表users、yaopin、ruku、chuku等每张表行数不为0。如果ruku表是空的说明SQL没导入成功重来。4.3 配置修正data.php与路径微调耗时1分钟编辑data.php用记事本打开C:\wamp64\www\ypgl\data.php核对密码如果WAMP没改过MySQL密码保持$pass ;如果改过填你的密码确认库名$dbname phpfypgl;必须和phpMyAdmin里建的库名完全一致保存退出。验证方法浏览器打开http://localhost/ypgl/login.php如果看到登录框说明data.php配置正确如果报错“数据库连接失败”回头检查密码和库名。4.4 首次访问与权限测试耗时2分钟登录系统浏览器打开http://localhost/ypgl/login.php账号admin密码admin进入后台成功登录后跳转到index.php主框架页左侧菜单应显示“药品管理”“入库管理”“出库管理”等权限验证用admin登录后点击“公告发布”能进入编辑页新开一个隐身窗口用普通账号如test/test登录左侧菜单不应出现“公告发布”“厂商管理”等选项。注意首次登录后检查C:\wamp64\www\ypgl\cache\目录下是否生成了以%%开头的PHP文件。如果没有检查cache目录权限右键→属性→安全→Users组是否有“修改”权限。4.5 功能闭环测试走通一个入库全流程耗时2分钟这才是检验系统是否真“能跑”的黄金标准1.添加厂商管理员登录 → “厂商管理” → “添加厂商”填“北京同仁堂”保存2.添加药品 “药品管理” → “添加药品”选剂型“胶囊”类别“抗生素”厂商选“北京同仁堂”保存3.执行入库 “入库管理” → “新增入库单”选刚添加的药品数量填100单价15.5保存4.查询库存 “库存查询” → 输入药品名应显示当前库存为100。实操心得这四步必须连贯走完。如果第3步入库后第4步查不到库存90%是ruku表没写入数据——检查ruku/add.php里数据库插入语句是否执行成功可在phpMyAdmin里直接查ruku表最新记录。5. 常见问题与排查技巧实录那些让我凌晨三点还在改的学生Bug部署过程中学生反馈最多的问题我都整理成这张速查表。每个问题都附带真实复现步骤、底层原因和一行代码级解决方案。问题现象复现步骤根本原因一行解决登录页空白无任何错误WAMP绿色访问http://localhost/ypgl/login.phpcache/目录不存在或不可写在C:\wamp64\www\ypgl\下新建空文件夹cache右键属性→安全→Users组勾选“修改”登录后跳转到空白页地址栏是http://localhost/ypgl/frame.php正常登录但frame.php内容不显示frame.php里require_once header.php;路径错误header.php实际在根目录把frame.php第3行require_once header.php;改为require_once ../header.php;药品列表页显示“Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result”访问http://localhost/ypgl/ypgl/yaopinlist.phpyaopinlist.php里数据库查询失败$result为空但代码没判空直接fetch在yaopinlist.php第25行while($row mysqli_fetch_array($result)){前加if(!$result) die(查询失败请检查数据库连接);日期控件点击无反应控制台报“setday is not defined”点击入库单的“生产日期”输入框date.js未加载或加载顺序错误检查login.html或add.php里script srcjs/date.js必须在link hrefcss/date.css之前且不能放在/body之后修改admin.css后页面样式不变改了css/admin.css里#menu{background:red}但菜单栏仍是原图浏览器缓存了CSS或CSS路径引用错误强制刷新CtrlF5并确认CSS里背景图路径是url(../images/menu_bg.jpg)而非url(images/menu_bg.jpg)独家避坑技巧所有PHP文件开头加一行错误报告开关。在index.php、login.php等文件第一行?php之后插入php error_reporting(E_ALL); ini_set(display_errors, 1);这样一旦出错页面会直接显示详细错误信息如哪行文件没找到而不是静默失败。部署完成后记得删掉避免线上暴露路径。最后分享一个小技巧如果你想快速验证某个功能模块是否独立可用不必走完整登录流程。比如测试入库功能直接访问http://localhost/ypgl/ruku/add.php需先登录建立session它会自动跳转到登录页登录后再次访问就能直达入库表单。这种“模块直连”方式能帮你快速定位是权限问题还是模块自身bug。我在实验室墙上贴了这张问题速查表学生遇到问题先对照80%能自己解决。剩下的20%我们再一起看错误日志——因为真正的工程师不是靠记忆答案而是掌握排查逻辑。这套系统的价值正在于此它不教你“应该怎么做”而是用最真实的部署场景逼你学会“问题在哪里怎么找”。本文还有配套的精品资源点击获取简介直接放在WAMP环境下就能跑起来的药店业务管理系统不用额外配置环境。登录账号admin/admin后台能管药品入库、出库、实时库存查询还能维护厂商信息、药品分类、剂型规格。用户分管理员和普通员工两级权限操作留痕有日志公告栏支持后台发布。所有数据库连接参数写在data.php里前端用Smarty模板引擎渲染页面样式统一由admin.css控制日期选择靠date.js实现。配套资源齐全登录页和菜单背景图login_1.jpg、menu_bg.jpg等、JS交互脚本、CSS样式文件、Smarty核心类库Smarty.class.php等、SQL建库文件phpfypgl.sql还有frame.php.bak备份和各类功能模块目录ruku/ chuku/ gonggao/ quanxian等。适合毕业设计快速上手或二次开发学习结构清晰注释到位模板编译文件自动生成无需手动处理。本文还有配套的精品资源点击获取