seth-shi / monday-shop

网上在线商城、综合网上购物平台
618 stars 178 forks source link
b2c e-shop e-shopping laravel monday-shop shop shopping

seth-shi/monday-shop

QQ 群

部署(新新新)

  1. 下载源码(也可直接下载压缩包, 然后解压)
    • git clone https://github.com/seth-shi/monday-shop.git
  2. 修改配置
    • cp .env.example .env
    • 修改.env文件中数据库,域名等配置信息
  3. 构建镜像
    • docker build . -t monday-shop
  4. 运行
    • docker run -d --net=host --name monday-shop-service monday-shop
  5. 执行安装命令
    • docker exec monday-shop-service php artisan moon:install

目录说明

演示地址

演示地址:http://shop.shiguopeng.cn

后台地址:http://shop.shiguopeng.cn/admin

页面展示

PC首页 支付 个人设置 个人中心 积分详情 后台仪表盘 后台订单列表 用户喜好数据

Feature

Commands

命令 一句话描述
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);

           // 回滚库存
           // 做更多的事
       };

?>

API

// 第一次登录保存 token, 之后使用全局类请求数据即可



* 接口全局状态码说明(建议封装一个全局请求类或者中间件,统一处理全局状态码)
    * `200`
        * 请求数据成功
    * `401` 
        * 身份验证出错(未登录就请求数据)
        * 非法无效的`token`
        * `token`已被加入黑名单(一般不会出现这个问题,出现这个问题那么就是你刷新 token 的逻辑有问题)
    * `402`
        * `token`已完全失效,后台暂设为 2 周,再也无法刷新,请重新登录账户
    * `500`
        * 服务器出错,具体请参考响应的消息
* __接口文档__(重要的事情说三遍)

[接口文档](http://shop.shiguopeng.cn/docs.html)

[接口文档](http://shop.shiguopeng.cn/docs.html)

[接口文档](http://shop.shiguopeng.cn/docs.html)
![](public/media/api_example.gif)

## Packages
| 扩展包 | 一句话描述 | 在本项目中的使用案例 |
| --- | --- | --- |
|[z-song/laravel-admin](https://github.com/z-song/laravel-admin)|后台|快速搭建后台系统|
|[mews/captcha](https://github.com/mewebstudio/captcha)|验证码|登录注册功能使用验证码验证|
|[overtrue/laravel-socialite](https://github.com/overtrue/laravel-socialite)|第三方登录|用户登录可以使用Github,QQ,新浪微博|
|[intervention/image](https://github.com/Intervention/image)|图片处理|是为 Laravel 定制的图片处理工具,加水印|
|[webpatser/laravel-uuid](https://github.com/webpatser/laravel-uuid)|uuid生成|商品添加增加一个uuid,订单号|
|[renatomarinho/laravel-page-speed](https://github.com/renatomarinho/laravel-page-speed)|压缩页面DOM|打包优化您的网站自动导致35%以上的优化(已移除使用)|
|[overtrue/laravel-pinyin](https://github.com/overtrue/laravel-pinyin)|汉语拼音翻译|分类首字母查询|
|[acelaya/doctrine-enum-type](https://github.com/acelaya/doctrine-enum-type)|枚举|优化代码中的映射|

## Reference
* [Laravel 的中大型專案架構](https://old-oomusou.goodjack.tw/laravel/architecture/)
* [十个 Laravel 5 程序优化技巧](https://laravel-china.org/articles/2020/ten-laravel-5-program-optimization-techniques)
* [十个 Laravel 5 程序优化技巧](http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html)
* [服务器做了两个优化 CPU 使用率减低 40%(使用缓存优化访问量不写数据库)](https://learnku.com/articles/13366/the-server-has-made-two-optimization-and-the-cpu-utilization-rate-has-been-reduced-by-40)

## Notice
* 建议开启`bcmath`扩展保证字符串数字运算正确
* 监听队列如果长时间没反应,或者一直重复任务
    * 数据库没配置好,导致队列任务表连接不上
    * 邮件配置出错,导致发送邮件一直失败
* `composer install`安装不上依赖
    * 请删除`composer.lock`文件,重新运行`composer install`
* `SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint`
    * 数据库引擎切换到`InnoDB`
* `composer install` 安装依赖错误
    * `composer.lock`锁定了镜像源,删除`composer.lock`再执行即可
## License
The MIT License (MIT)