校园二手交易平台开发实战:从零搭建一套完整的PHP电商系统

一、为什么做这个系统

先说个真实情况。每年毕业季,学校跳蚤市场群里各种消息刷屏,卖书的、卖生活用品的、卖数码产品的,信息杂乱不说,很多同学发完消息就找不到了。关键是时间不对等,我想买个二手显示器,翻半天群消息也不一定能找到合适的。

大二那年我自己想买个iPad看课件,连续蹲了三天群,最后总算找到一个,但是价格一点也不美丽。这让我萌生了一个想法:为什么不做一个专门给咱们学校用的二手交易平台呢?

正好这学期学了PHP,老师也让我们做个期末项目,那就把这个想法落地。

二、技术选型过程

选技术栈的时候纠结了一下。用原生PHP写?太慢了,后面维护也麻烦。用框架吧,ThinkPHP国内用的人多,文档也全,就它了。

具体版本是这样的:

  • PHP 7.3(服务器稳定版)
  • MySQL 5.7(够用就行)
  • Apache 2.4
  • ThinkPHP 5.1

前端方面,我不会花太多时间写CSS,直接上Tailwind CSS,写起来快。jQuery处理Ajax请求,轮播图用Swiper。

三、数据库设计

说实话,数据库设计改了好几版。最开始想得太复杂,后来跟同学讨论后精简了。

用户表(users):存用户名、密码(MD5加密)、邮箱、手机号、头像路径。状态字段用来禁用违规用户。

商品表(products):核心表。user_id关联发布者,category_id关联分类。图片用逗号拼接存,读取时explode拆开就行,简单粗暴。status区分在售和已售。

求购表(wanted):结构跟商品表类似,但没图片字段,求购嘛不需要图。

分类表(categories):一开始写死的,后来想想还是做成动态的,方便后台管理。

评论表(comments):用户对商品的评价,关联user_id和product_id。

轮播图表(banners):首页那几个滚动大图。

管理员表(admin_users):后台登录用,角色区分超级管理员和普通管理员。

大概就这些,够用了。

四、开发中的坑和解决

1. 路由优先级问题

这个坑了我半天。路由规则写错了顺序,后面的规则永远匹配不上。后来搞明白了,TP5.1是按顺序匹配的,具体的路由要写在前面。比如 product/detail/:id 要在 product/list 前面,不然:id会被当作list处理。

2. 分页样式

TP自带的分页样式真的一言难尽,丑到我都不想看。后来直接在layout里写了完整的分页CSS,圆角、悬停效果、激活高亮,加了个渐变色,瞬间顺眼多了。响应式也调了一下,手机上不至于太难看。

3. 文件上传

最头疼的地方。编辑商品时如果不传新图片,$request->file(‘images’)返回null,foreach直接报错。解决方案是先用try-catch包起来,然后做多层判断:files不为null、数组不为空、文件大小>0,全部通过才处理。不上传就保留原图。

4. 搜索功能

一开始搜索一直没结果,排查发现是TP5.1的查询语法问题。直接用where(‘title’, ‘like’, “%{$keyword}%”)就没毛病了。

5. 重定向循环

后台权限验证时,没登录的用户会重定向到登录页,但登录页也检查登录状态,已登录又重定向回后台,死循环。解决方法是登录控制器单独放行,不验证。

五、模块功能介绍

前台这边:

首页放轮播图和最近发布的商品、求购。商品列表左侧是分类树,右侧是卡片式商品,支持搜索和分页。详情页能看到商品所有信息,登录用户可以评论。

求购功能类似,但不带图片。

个人中心集成了我的发布、我的评论、我的求购,都能增删改。

发布商品支持多图上传,体验还行。

后台这边:

分类管理实现增删改查,删除前检查是否有商品关联。

商品管理主要是查询和删除,违规商品直接干掉。

用户管理可以禁用用户,禁用了就不能登录。

评论管理有敏感词可以删除。

管理员管理增加角色区分,超级管理员才能加管理员。

六、一些实用的代码片段

搜索的商品列表查询:

$query = Db::name('products')
    ->alias('p')
    ->join('users u', 'p.user_id = u.id')
    ->join('categories c', 'p.category_id = c.id')
    ->field('p.*, u.username, c.name as category_name');
if (!empty($keyword)) {
    $query->where('p.title', 'like', "%{$keyword}%");
}
$list = $query->paginate(10);

分页样式的关键代码:

.pagination li.active span {
    background: linear-gradient(135deg, #3182ce 0%, #2c5282 100%);
    color: #ffffff;
    border-color: #3182ce;
}

七、部署上线

部署到服务器时几个注意点:

  1. 数据库连接配置要改,localhost改成实际地址
  2. public目录作为网站根目录
  3. 如果URL重写有问题,检查.htaccess配置
  4. uploads目录要给写权限,不然图片传不上去

我用的是Apache,配置虚拟主机指向public目录,省去index.php的麻烦。

八、效果展示

登录后的首页可以看到导航栏多了个人中心入口。商品列表页左侧分类点一下右侧内容随之变化,搜索也能实时筛选。
在这里插入图片描述

发布商品页面表单友好,图片上传有进度提示。我的发布页面能看到自己发的商品,支持编辑和删除。
在这里插入图片描述

后台管理页面布局清晰,侧边栏导航,数据表格支持搜索和分页,操作按钮简洁明了。
在这里插入图片描述

手机端适配也做了,用Tailwind的响应式类,小屏幕下卡片变成单列布局,导航栏折叠,体验还不错。

九、总结

做这个项目前后花了大概两周时间,代码量不算大,但涉及的知识点挺全面的。数据库设计、路由配置、模板渲染、文件上传、权限验证、分页处理等等,基本把一个Web项目的核心流程都走了一遍。

遇到的问题比预想的多,但解决之后收获也大。特别是调试的过程,对框架的理解更深入了。
下一步计划加上微信支付和站内信功能,目前只能线下交易,有些同学还是希望有担保。还有就是增加收藏功能,看到喜欢的商品可以先标记起来。

代码已经传到GitHub了,需要的同学可以自取。项目名是campus-trading,欢迎star和交流讨论。

做这个系统的初衷很简单,就是让同学们交易更方便。代码能力有限,但产品能用,也算是为校园做了一点小贡献吧。

P31232

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐