Stars: 570
Forks: 175
Pull Requests: 17
Issues: 25
Watchers: 22
Last Updated: 2023-04-19 06:03:12
网上在线商城、综合网上购物平台
License:
Languages: PHP, Vue, Shell, Blade, Dockerfile
Docker
运行请使用v1
https://github.com/seth-shi/monday-shop/tree/1.0584453488
git clone https://github.com/seth-shi/monday-shop.git
cp .env.example .env
.env
文件中数据库,域名等配置信息docker build . -t monday-shop
-p 80:5200
, 80
代表本机的端口,5200
写死是swoole
服务运行的端口docker run -d -p 80:5200 --name monday-shop-service monday-shop
docker exec monday-shop-service php artisan migrate
演示地址:http://shop.shiguopeng.cn
后台地址:http://shop.shiguopeng.cn/admin
admin
admin
[email protected]
111111
111111
9999999.99
Redis
队列防止超卖Redis
驱动)
Redis
驱动Session
驱动数据Redis
读取Github
QQ
H5
本地存储AJAX
无刷新显示命令 | 一句话描述 |
---|---|
php artisan moon:install |
安装应用程序 |
php artisan add:shop-to-search |
生成全文索引 |
php artisan moon:uninstall |
卸载网站(清空数据库,缓存,路由) |
php artisan moon:cache |
执行缓存(缓存配置,路由,类映射) |
php artisan moon:clear |
清除缓存 |
php artisan moon:copy |
复制项目内置的静态资源 |
php artisan moon:delete |
删除项目及上传的基本静态资源 |
php artisan moon:export |
导出用户数据到json文件 |
php artisan moon:count-site |
统计站点任务(每天夜里一点执行) |
php artisan moon:del-seckills |
删除秒杀数据 (每小时自动执行一次) |
php artisan moon:moon:del-score-data |
删除积分缓存数据 (每天夜里 0 点执行) |
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);
// 回滚库存
// 做更多的事
};
?>
code
, msg
, data
)code
请参考接口全局状态码说明msg
此次请求消息,如果返回状态码为非成功,可直接展示msg
data
如果为列表页将会一个数组类型(如商品列表),否则为一个对象类型(商品详情)count
{
"code": 401,
"msg": "无效的token",
"data": []
}
token
说明
token
的有效时间为60
分钟token
失效时,服务器会主动刷新,并在响应头加入Authorization
token
将会加入黑名单不能再使用, 请将在响应头中新的token
保存使用2
周).服务器将无法再刷新,将返回402
状态码,请重新登录账户token
使用流程说明// 全局请求类
function request(_method, _url, _param, _func) {
$.ajax({
method: _method,
url: _url,
data: _param,
beforeSend: function (xhr) {
console.log(xhr);
xhr.setRequestHeader('Authorization', localStorage.getItem('api_token'))
},
complete: function (xhr, a, b) {
if (xhr.getResponseHeader('Authorization')) {
localStorage.setItem('api_token', xhr.getResponseHeader('Authorization'))
}
},
success: function (res) {
// token 永久过期
if (res.code === 402) {
// 跳去登录页面
return false;
}
// 更多状态码判断
}
});
}
// 第一次登录保存 token, 之后使用全局类请求数据即可
200
401
token
token
已被加入黑名单(一般不会出现这个问题,出现这个问题那么就是你刷新 token 的逻辑有问题)402
token
已完全失效,后台暂设为 2 周,再也无法刷新,请重新登录账户500
扩展包 | 一句话描述 | 在本项目中的使用案例 |
---|---|---|
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 | 汉语拼音翻译 | 分类首字母查询 |
acelaya/doctrine-enum-type | 枚举 | 优化代码中的映射 |
bcmath
扩展保证字符串数字运算正确composer install
安装不上依赖
composer.lock
文件,重新运行composer install
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
InnoDB
composer install
安装依赖错误
composer.lock
锁定了镜像源,删除composer.lock
再执行即可The MIT License (MIT)