演示地址:http://shop.shiguopeng.cn
后台地址:http://shop.shiguopeng.cn/admin
- 账号:
admin
- 密码:
admin
- 首页数据全走缓存(推荐使用
Redis
驱动)- 未登录的首页,零数据库查询,通过缓存驱动
- 计划任务每分钟会更新一次首页数据
- 开启秒杀模块,零数据库查询,通过
Redis
驱动 - 登录之后首页零数据库查询,
Session
驱动数据
- 秒杀功能
- 秒杀过期,自动回退库存
- 使用延时队列,当订单超过三十分钟(可配置)未付款,自动取消订单
- 秒杀商品,如果用户收藏,发送邮件提醒活动
- 后台秒杀模块的开启关闭
- 秒杀的商品数量,皆通过
Redis
读取
- 第三方授权登录 + 登录回跳
Github
QQ
- 微博
- 第三方支付(支持自动适应手机,web 支付)
- 支付宝支付,退款
- 微信支付
- 购物车
- 使用
H5
本地存储 - 登录之后同时显示本地购物车和数据库购物车数量
- 用户登录之后会询问是否需要持久化到数据库
- 使用
- 商品搜索
- 支持拼音首字母
AJAX
无刷新显示
- 订阅模块
- 每周定时推送一封邮件包含最受欢迎,最新,最火卖商品
- 分类排序
- 后台使用拖动排序,可以设置在商城首页优先展示的分类
- 评论模块
- 用户下订单之后可以评论
- 数据统计
- 每天晚上一点进行站点数据统计
- 全文搜索
- 响应式网站
- 获取源代码
- 直接下载压缩包或者monday-shop.zip下载
- 或者
git
克隆源代码
git clone [email protected]:DavidNineRoc/monday-shop.git
- 安装依赖扩展包
composer install
- 生成配置文件(修改其中的配置选项:数据库的一定要修改)
cp .env.example .env
- 开启秒杀功能
- 安装前可以把
database/seeds/SettingsTablesSeeder.php
中的is_open_seckill
设置为1
- 安装之后可以直接通过后台管理系统设置中的配置设置管理
- 安装前可以把
- 使用安装命令(会执行执行数据库迁移,填充,等)
php artisan moon:install
- 任务调度(订阅推荐,数据统计!!!)
- 运行队列处理器(发送订阅邮件等耗时任务)
Linux
系统:nohup php artisan queue:work --tries=3 &
windows
系统直接打开一个命令行窗口,运行命令,不要关闭窗口即可php artisan queue:work --tries=3
命令 | 一句话描述 |
---|---|
php artisan moon:install |
安装应用程序 |
php artisan moon:uninstall |
卸载网站(清空数据库,缓存,路由) |
php artisan moon:cache |
执行缓存(缓存配置,路由,类映射) |
php artisan moon:clear |
清除缓存 |
php artisan moon:copy |
复制项目内置的静态资源 |
php artisan moon:delete |
删除项目及上传的基本静态资源 |
php artisan moon:count-site |
统计站点任务(每天夜里一点执行) |
php artisan moon:del-seckills |
删除秒杀数据 (每小时自动执行一次) |
php artisan moon:update-home |
更新首页数据 (每分钟自动执行一次) |
php artisan moon:send-subscribes |
发送订阅邮件 (每个礼拜六早上八点) |
php artisan queue:work --tries=3 |
监听队列(邮件发送,处理过期的秒杀数据 !!! |
## 初始化抢购数据
<?php
// 假设当前秒杀活动的 id 为 9
// 可以在模型的 created 事件做这个事情
$id = 9;;
// 填充一个 redis 队列,数量为抢购的数量,后面的 9 无意义
\Redis::lpush("seckills:{$id}:queue", array_fill(0, $seckill->number, 9));
?>
## 抢购
<?php
// 从路由或者参数中得到当前秒杀活动的 id
$id = 9;
$userId = auth()->id();
// 判断是否已经开始了秒杀
// 返回 0,代表当前用户已经抢购过了
if (0 == Redis::hset("seckills:{$id}:users:{$userId}", 'id', $userId)) {
return responseJson(403, '你已经抢购过了');
}
// 如果从队列中读取到了 null,代表已经没有库存
if (is_null(Redis::lpop("seckills:{$id}:queue"))) {
return responseJson(403, '已经抢购完了');
}
// 这里就可以开始入库订单
?>
## 利用 crontab 定时扫描过期数据,回滚库存,删除过期 redis (可选)
<?php
// 查出已经过期确没有回滚过的秒杀,
Seckill::query()
->where('end_at', '<', date('Y-m-d H:i:s'))
->get()
->map(function (Seckill $seckill) {
// 先模糊查找到所有用户 key
$ids = Redis::keys("seckills:{$seckill->id}:*");
Redis::del($ids);
// 回滚库存
// 做更多的事
};
?>
扩展包 | 一句话描述 | 在本项目中的使用案例 |
---|---|---|
z-song/laravel-admin | 后台 | 快速搭建后台系统 |
mews/captcha | 验证码 | 登录注册功能使用验证码验证 |
overtrue/laravel-socialite | 第三方登录 | 用户登录可以使用Github,QQ,新浪微博 |
intervention/image | 图片处理 | 是为 Laravel 定制的图片处理工具,加水印 |
webpatser/laravel-uuid | uuid生成 | 商品添加增加一个uuid,订单号 |
renatomarinho/laravel-page-speed | 压缩页面DOM | 打包优化您的网站自动导致35%以上的优化(已移除使用) |
overtrue/laravel-pinyin | 汉语拼音翻译 | 分类首字母查询 |
- 建议开启
bcmath
扩展保证字符串数字运算正确 - 监听队列如果长时间没反应,或者一直重复任务
- 数据库没配置好,导致队列任务表连接不上
- 邮件配置出错,导致发送邮件一直失败
composer install
安装不上依赖- 请删除
composer.lock
文件,重新运行composer install
- 请删除
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
- 数据库引擎切换到
InnoDB
- 数据库引擎切换到
MIT