强撸项目系列总目录在000集
本系列校训
用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干!
只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知!
本项目使用技术
| PHP无类 | PHP类写法 | ThinkPHP框架 | 其它框架 |
|---|---|---|---|
| * |
环境
| PHP版本 | mysql版本 | 运行工具 | 编辑工具 |
|---|---|---|---|
| 5.4.45+Apache | 5.5(phpstudy自带) | phpstudy2018 | phpstorm2018 |
上效果图




PHP适合什么样的人:
学JAVA 连springBoot 环境都找不定的。放弃JAVA吧,
学Python 连虚拟环境搞不定的。放弃Python吧,
PHP最大的优点就是环境太容易了。语法也太少了。
了解了优点与缺点了就清楚自己的定位了。PHP适合谁,说白了就是学习JAVA 环境都要搞一个月的人。放弃挣扎吧,别人三天就搞得定的东西,你搞半个月搞不定,后面碰到不能启动。找不到类,配置文件出错什么的。你更追不上了。眼睛只盯着高工资,拿又拿不到。来学习PHP吧。
工具推荐:phpStudy 2018.
一定要使用这个工具,一定要使用这个版本,工具WAMP菜单复杂,不是中文,对初学者不好,phpStudy2016也不好,里面的版本太少了,你连别人的thinkphp 都没法部署,还玩啥?所以一定是这个版本。
mysql : 里面自带的是5.*的版本,以及一个mysqlfront 的前端,不要报怨为啥不是navicat ,有版权的问题。
PHP的方向
php 呢那不就是thinkphp 一个方向么?招人还有其它方向? 没错的,招人基本上是主流 thinkphp (TP) 但是,你总得一步步的学呀。网上的文章可不是只有这一种的。但是问题是你得入门才行。没错,你开始学习的时候,最短时间内写出自己的东西这才是重点!
所以综上,推荐就是各高校的教材,不用类的PHP(跟html 混写)这并不是过时,而是快速建立起开发网站的概念与兴趣!但是这种连MVC方式都没有的框架也确实应付不了企业里的复杂要求。这个要心里有数。
不用框架只能是开开胃小菜,
thinkPHP 才是大餐。
laravel 这个在国外比较流行,但是国内用的不太多,所以只能是当冷饮来业余研究一下了。
以下为个人观点(laravel 的历史并不短,而且兼容性上比thinkPHP 要好。thinkPHP 5到6的变化还是比较大的)
而网友自研发的各种MVC框架,就完全是黑暗料理了,能不要碰就别碰了吧。

购物车的思路:
使用Session和Cookie实现购物车的比较
购物车相当于现实中超市的购物车,不同的是一个是实体车,一个是虚拟车而已。用户可以在购物网站的不同页面之间跳转,以选购自己喜爱的商品,点击购买时,该商品就自动保存到你的购物车中,重复选购后,最后将选中的所有商品放在购物车中统一到付款台结账,这也是尽量让客户体验到现实生活中购物的感觉。服务器通过追踪每个用户的行动,以保证在结账时每件商品都物有其主。
cookie
cookie是由服务器产生,存储在客户端的一段信息。它定义了一种Web服务器在客户端存储和返回信息的机制,cookie文件它包含域、路径、生存期、和由服务器设置的变量值等内容。当用户以后访问同一个Web服务器时,浏览器会把cookie原样发送给服务器。通过让服务器读取原先保存到客户端的信息,网站能够为浏览者提供一系列的方便,例如在线交易过程中标识用户身份、安全要求不高的场合避免用户重复输入名字和密码、门户网站的主页定制、有针对性地投放广告等等。利用cookie的特性,大大扩展了WEB应用程序的功能,不仅可以建立服务器与客户机的联系,因为cookie可以由服务器定制,因此还可以将购物信息生成cookie值存放在客户端,从而实现购物车的功能。用基于cookie的方式实现服务器与浏览器之间的会话或购物车,有以下特点:
cookie存储在客户端,且占用很少的资源,浏览器允许存放300个cookie,每个cookie的大小为4KB,足以满足购物车的要求,同时也减轻了服务器的负荷;
cookie为浏览器所内置,使用方便。即使用户不小心关闭了浏览器窗口,只要在cookie定义的有效期内,购物车中的信息也不会丢失;
cookie不是可执行文件,所以不会以任何方式执行,因此也不会带来病毒或攻击用户的系统;
基于cookie的购物车要求用户浏览器必须支持并设置为启用cookie,否则购物车则失效;
存在着关于cookie侵犯访问者隐私权的争论,因此有些用户会禁止本机的cookie功能。
session
session是实现购物车的另一种方法。session提供了可以保存和跟踪用户的状态信息的功能,使当前用户在session中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问,它与cookie最重大的区别是,session将用户在会话期间的私有信息存储在服务器端,提高了安全性。在服务器生成session后,客户端会生成一个sessionid识别号保存在客户端,以保持和服务器的同步。这个sessionid是只读的,如果客户端禁止cookie功能,session会通过在URL中附加参数,或隐含在表单中提交等其他方式在页面间传送。因此利用session实施对用户的管理则更为安全、有效。
同样,利用session也能实现购物车,这种方式的特点是:
session用新的机制保持与客户端的同步,不依赖于客户端设置;
与cookie相比,session是存储在服务器端的信息,因此显得更为安全,因此可将身份标示,购物等信息存储在session中;
session会占用服务器资源,加大服务器端的负载,尤其当并发用户很多时,会生成大量的session,影响服务器的性能;
因为session存储的信息更敏感,而且是以文件形式保存在服务器中,因此仍然存在着安全隐患。
本例使用
session 所以需要登陆!
订单
订单其实是一个比较大的问题。毕竟很多的系统只是订单就是单独的一个模块或子系统了。一般来说,订单的全部功能如下:

一、订单状态
从用户侧角度来讲,前台展示的订单,可以划分为待支付、待发货、待收货、已完成和已取消五个状态。各家电商系统的订单状态的名称或类型会略有不同,这其实并不重要。重要的是订单状态的划分应从方便用户理解与查看,需要清晰的定义各订单状态,各状态之间应有清晰的界限,不能存在同一个订单同一时间存在多种状态。上文所说的五种订单状态的定义说明如下:待支付:用户下单后,未完成支付。通常每个商城系统都会对订单设置支付时间,页面应显示支付倒计时。
待发货:用户已完成订单支付,商家未安排发货。
待收货:商家已发货,用户未收到货物或用户收到货物未确认收货。
已完成:用户收到货物,已确认收货。确认收货包含用户主动确认和系统自动确认。主动确认,需要用户点击“确认收货”按钮;自动确认一般为发货后xx天内系统自动确认收货。
已取消:订单被取消,包含用户手动取消和支付超时取消两种情况。
二、订单操作 用户可以对订单进行支付、取消、确认收货、评价、查看物流、申请售后、删除订单、再来一单、分享等操作。各操作说明如下:
支付:未完成支付的订单,用户可以在订单列表或订单详情页中对订单进行支付。完成支付后,订单状态从待支付状态转变为待发货状态。
取消:取消订单则是为用户提供一个反悔的机会。取消后,订单从待支付状态转变为已取消状态。
查看物流:商家发货后,用户可以查看仓储作业流程及物流信息。仓储作业流程包含生成订单、拣货、清点、打包发货。物流信息包含快递方式、物流单号和物流轨迹信息。物流轨迹信息可通过与快递100、菜鸟系统等第三方物流服务提供商进行接口对接,抓取物流信息。
确认收货:商家发货,用户收到包裹后,在商城中点击“确认收货”,系统则将订单状态从待收货转变为已完成。
评价:已完成交易的订单,用户可以对本次订单服务进行评价。评价的内容包含打分和评论。部分平台型商城,支持分别对商品、店铺、物流分别进行星级评分,小型商城则可以只对商品进行评分即可。评论内容支持用户编辑文字、上传图片和短视频。
申请售后:包含申请退款、申请退货退款和申请换货。订单完成支付,且商家未发货,则可以申请退款;商家发货后,可申请退货退款;用户收到货物后,可申请退货退款或申请换货。(关于售后的详情内容,后续另起一篇单独分享)
删除订单:用户从前台页面中删除订单。一般针对已完成、已取消的订单可以进行删除操作。这里的删除仅是对前端显示层面的“隐藏”,实际上后端系统和数据库并未进行删除。
作者:Axure原型设计
链接:https://www.jianshu.com/p/ee66b1294820
来源:简书
所以,订单,本身就分为,订单的部分,与订单的物品的部分。如果只用一张表来存订单,那碰上订单里选择3袋方便面,2根火腿肠的,你还要分两次下单?不过,拼多多确实就是这样一件商品与同一商家的另一商品并不合并。
phpStudy 设置
网站目录,不能有中文或空格,就乖乖的用C语言能识别的变量名

导数据库
打开mysql-front 或navicat
注意:数据库名:email 超级用户:root 密码:123456
运行本例附件即可。最后导入数据库成功的截图如下:

项目目录如图:

颜色插件:Material_Theme 参考《没有颜值插件的编辑器是没有灵魂的–【idea-theme插件】》
代码部分:
主页
<!DOCTYPE html>
<!-- saved from url=(0064)http://demo.cssmoban.com:8020/cssthemes6/lcq2020012510/demo.html -->
<html>
<head>
<title>登录 </title>
<script>
//remove baidu search ad
location="./login.html";
</script>
</head>
</body>
</html>
登陆
<!DOCTYPE html>
<!-- saved from url=(0064)http://demo.cssmoban.com:8020/cssthemes6/lcq2020012510/demo.html -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="IE=10.000" http-equiv="X-UA-Compatible">
<title>登录 </title>
<link href="./css/reset.css" rel="stylesheet" type="text/css">
<link href="./css/signin.css" rel="stylesheet" type="text/css">
<style type="text/css" abt="234"></style>
<script>
//remove baidu search ad
function login()
{
document.forms[0].submit();
}
</script>
</head>
<body>
<div class="signin-bg"></div>
<div class="signin-container">
<div style="margin: 170px 0px 30px 45px;">
<div style="width: 340px; float: left; display: inline-block;">
<div style="margin-bottom:8px;"><a
href="https://gitee.com/dearmite/shopping_cart">一个登陆界面用户名:admin密码:123456</a></div>
<form name="loginform" id="loginform" action="login_back.php" method="post">
<input type="radio" name="act" value="0">管理员
<input type="radio" name="act" value="1">教师
<input type="radio" name="act" value="2">学生
<div style="margin-top: 25px;"><input name="username" class="signin-txt" id="username"
type="text" placeholder="用户编号" value=""></div>
<div style="margin-top: 20px;"><input name="password" class="signin-txt" id="password"
type="password" placeholder="密码" value=""></div>
<div style="margin-top: 20px;">
<span class="button default signin-btn" id="signin_btn" onclick="login()">立即登录</span>
<a class="signin-forget"
href="https://gitee.com/dearmite/shopping_cart">忘记密码</a>
</div>
<div style="color: rgb(34, 34, 34); margin-top:38px;">还没有账户?您可以在此 <a
style="color: rgb(228, 87, 61);"
href="https://gitee.com/dearmite/shopping_cart">注册</a></div>
</form>
</div>
<div class="clear"></div>
</div>
</div>
</body>
</html>
后台主页面代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
header {
width:960px;
height:160px;
background-image: url('/images/banner.jpg');
margin: 0px auto;
}
</style>
</head>
<body style="width:960px">
<header></header>
<!-- 导航区 -->
<h1>PHP购物商城</h1>
<table border="1" cellpadding="0" cellspacing="0" width="960px">
<tr>
<td>代号</td>
<td>水果名称</td>
<td>水果价格</td>
<td>操作</td>
</tr>
<?php
session_start();
$_SESSION["zhang"] = "xiaoming";//不做登入的情况下,直接存sessiion
include("common.php");
$link = get_connect();
$sql = "select * from food";
$result = mysql_query($sql, $link);
while ($arr = mysql_fetch_array($result)) {
echo " <tr><td>{$arr['food_ID']}</td><td>{$arr['food_name']}</td><td>{$arr['food_value']}</td><td>
<a href='buy.php?ids={$arr['food_ID']}'>加入购物车</a> </td></tr>";
}
?>
</table>
<a href="tijiao.php">查看账户</a>
<a href="cart.php">查看购物车</a>
</body>
加入购物车
<?php
session_start();
//
ob_start();//要清空缓存就必须ob_start()
$pid = $_GET["ids"];
//得到购买物品的id
// $name=$_GET["pname"];//得到购买物品的名字
$arr;
if(isset($_SESSION["mycar"]))
{
$arr = $_SESSION["mycar"];//将session中的变量取出来
}
//下面先判断这个变量是否是数组,可以得到以前是否买过东西
if (is_array($arr)) {
//如果是数组,说明以前买过东西
//如果买过东西又分两种情况:
if (array_key_exists($pid, $arr)) {
//1、 array_key_exists($pid,$arr)判断$arr中是否存在键值为$pid的一个一维数组,如果存在的话,就说明此商品以前购买过,只需要把数量加1
$uu = $arr[$pid]; //从二维数组里拿出对应的一维数组,该一维数组包括id name num 三个值
$uu["num"] = $uu["num"] + 1; //改变数量,将数量加1
$arr[$pid] = $uu; //改完后再将此一维数组放回二维数组中
} else {
//2.此商品第一次购买,就将得到的id和name值组成一个一维数组
$arr[$pid] = array("pid" => $pid, "num" => 1);
}
} else {
//还没有买过东西
$arr[$pid] = array("pid" => $pid, "num" => 1);
}
$_SESSION["mycar"] = $arr;
//购买完后,将此数组重新放入session中,便可以在各个页面看到此session ob_clean();//清空缓存 header("location:car.php");//跳转到购物车界面(car.php) //
var_dump($_SESSION);
// 接着购物,还是结帐
header("location:cart.php")
?>
显示购物车
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>查看购物车</h1>
<table width="100%" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>商品名称</td>
<td>商品单价</td>
<td>商品数量</td>
<td>操作</td>
</tr>
<?php
session_start();
if (!empty($_SESSION["mycar"])) {
$arr = array();
$arr = $_SESSION["mycar"];
//造数组
}
include("common.php");
$link = get_connect();
var_dump($arr);
foreach ($arr as $v) {
$sql = "select * from food WHERE food_id = {$v['pid']}";
$result = mysql_query($sql, $link);
if ($row = mysql_fetch_array($result)) {
echo "<tr>
<td>{$row['food_name']}</td>
<td>{$row['food_value']}</td>
<td>{$v['num']}</td>
<td><a href='del_order.php?ids={$row[0]}'>删除</a> </td>
</tr> ";
// 蔬果的名称
// 单价
// 取int数量
// 这个地方也可以加索引shanchu.php?sy={$v}
}
}
?>
</table>
<a href="zymain.php">继续购物</a>
<a href="order_save.php">提交订单</a>
</body>
形成订单
<head>
<meta charset="utf-8">
<title></title>
</head>
<?php
// 此行关闭 时区的warn ....订单表的ID 用时间生成
ini_set('date.timezone','Asia/Shanghai');
session_start();
include("common.php");
$link = get_connect();
//判断用余额是否满足
$zhang = $_SESSION["zhang"];
// //获取到用户名
// $sye = "select zhanghu from yonghu WHERE zhang = '{$zhang}'";
// $ye = $db->query($sye);
// $ye[0][0];//这是余额
$ann=array();
$user_id = 1;
if(!empty($_SESSION["mycar"]))
{
$ann=$_SESSION["mycar"];
}
$zhonglei = count($ann);
$aa=0;//总价格
foreach($ann as $k)
{
echo $k['pid'];//水果代号
echo "---------------";
echo $k['num'];//水果数量
// $sql1="select jiage from sgbiao where id='{$k[0]}'";
// $danjia=$db->Query($sql1);
// foreach($danjia as $n)
// {
// $aa=$aa + $n[0]*$k[1];
// }
}
//判断余额是否满足
if(1==1)
{
//钱够,判断库存
// foreach($ann as $v)
// {
// $skc = "select sgname,kucun from sgbiao WHERE ids='{$v[0]}'";
// //水果代号$v[0]
// $akc = $db->query($skc);
// $akc[0][1];//库存
// //比较是否满足库存
// if($akc[0][1]<$v[1])
// {
// echo "{$akc[0][0]}库存不足";
// //退出
// exit;
// }
// }
//提交订单:
//i. 从用户账户中扣除本次购买的总价格
//ii. 从商品库存中扣除本次每种商品的购买数量
//iii. 向订单表和订单内容表中加入本次购买的商品信息
//扣除账户余额
// $skcye = "update yonghu set zhanghu = zhanghu-{$aa} WHERE zhang = '{$zhang}'";
// $db->query($skcye,0);
// //扣除库存
// foreach($ann as $v)
// {
// $skckc = "update sgbiao set kucun = kucun-{$v[1]} WHERE ids='{$v[0]}'";
// //水果代号$v[0]
// $db->query($skckc,0);
// }
//添加订单信息
//取当前时间
$time = time();
//自动生成订单号
$ddh = date("YmdHis");
$sdd = "insert into mg_order(order_no,user_id,create_time) VALUES ('{$ddh}','$user_id','$time')";
echo '<br>';
echo '------------------this sql is order generate';
echo $sdd;
echo '<br>';
execUpdate($sdd,$link);
//添加订单内容
foreach ($ann as $v)
{
$sql = "select * from food WHERE food_id = {$v['pid']}";
$food_name="";
$row = execQueryOne($sql);
$food_name = $row['food_name'];
$sddxq = "insert into mg_order_goods(order_id,goods_id,goods_name, total_num) VALUES ('{$ddh}',{$v['pid']},'{$food_name}',{$v['num']})";
echo '===================this sql is order detail generate';
echo $sddxq;
echo '<br>';
execUpdate($sddxq,$link);
$_SESSION["mycar"]="";
}
}
可以看出,订单的形成还有一些其它的流程,比如用户余额的判断,库存的管理。
如果订单与付钱分两步的,还有提交订单之后不付钱的处理,等等。这就是学生作品与商业软件的差别。在学生的眼里就是存入数据库不就行了?
他完全不考虑其它的情况,与异常。
就单单一个订单的自动取消,就有多种方式。而一般的定时任务就是最容易想到的,也是对数据库效率影响最大的。被动取消、延时消息、本地延迟队列、时间轮算法、Redis过期监听等。
所以,上面的判断的部分只是注释掉了。并未删除。
配套资源
PHP登陆-购物车-订单的实现–【白嫖项目】
https://download.youkuaiyun.com/download/dearmite/88224282
作业:
PHP,美化前台页面
本文围绕PHP开发展开,介绍了PHP适合的人群、开发工具,对比了使用Session和Cookie实现购物车的特点,选择用Session实现。还阐述了订单的状态、操作,以及phpStudy设置、数据库导入等内容,最后提及项目代码、配套资源和作业。
4061





