From 98eda4e5ffaedb8562b8a38928f1c70d7fb48c0a Mon Sep 17 00:00:00 2001 From: xiadc <251308692@qq.com> Date: Sun, 4 May 2025 11:11:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(zy):=20=E6=B7=BB=E5=8A=A0=E4=BF=B1?= =?UTF-8?q?=E4=B9=90=E9=83=A8=E5=8A=9F=E8=83=BD=E5=92=8C=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增俱乐部相关接口和功能,包括创建俱乐部、申请加入俱乐部、邀请加入俱乐部等 - 添加用户消息功能,包括发送消息、查看消息等 - 优化了部分代码结构,提高了可维护性 - 更新了文档,添加了新的接口说明 --- README.md | 94 +------ addons/shopro/console/Command.php | 2 +- addons/shopro/console/ShoproChat.php | 2 +- addons/shopro/controller/user/User.php | 33 ++- addons/shopro/controller/zy/Activity.php | 118 +++++++++ addons/shopro/controller/zy/Base.php | 19 +- addons/shopro/controller/zy/Club.php | 233 +++++++++++++++++- addons/shopro/controller/zy/Game.php | 60 +++++ addons/shopro/controller/zy/Gym.php | 6 +- addons/shopro/controller/zy/Tags.php | 8 +- addons/shopro/job/Test.php | 71 +++++- application/admin/model/User.php | 1 + application/admin/model/zy/Menber.php | 1 + application/admin/model/zy/game/Activity.php | 1 + .../admin/validate/zy/game/Activity.php | 1 + application/config.php | 2 +- application/extra/queue.php | 2 +- thinkphp/lang/zh-cn.php | 2 + .../library/think/process/pipes/Windows.php | 2 +- .../think-queue/src/queue/command/Listen.php | 4 +- .../think-queue/src/queue/command/Restart.php | 2 +- .../src/queue/command/Subscribe.php | 2 +- .../think-queue/src/queue/command/Work.php | 4 +- 23 files changed, 544 insertions(+), 126 deletions(-) create mode 100644 addons/shopro/controller/zy/Activity.php create mode 100644 addons/shopro/controller/zy/Game.php diff --git a/README.md b/README.md index 9296a29..90a0018 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,5 @@ FastAdmin是一款基于ThinkPHP+Bootstrap的极速后台开发框架。 - -## 主要特性 - -* 基于`Auth`验证的权限管理系统 - * 支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置 - * 支持单管理员多角色 - * 支持管理子级数据或个人数据 -* 强大的一键生成功能 - * 一键生成CRUD,包括控制器、模型、视图、JS、语言包、菜单、回收站等 - * 一键压缩打包JS和CSS文件,一键CDN静态资源部署 - * 一键生成控制器菜单和规则 - * 一键生成API接口文档 -* 完善的前端功能组件开发 - * 基于`AdminLTE`二次开发 - * 基于`Bootstrap`开发,自适应手机、平板、PC - * 基于`RequireJS`进行JS模块管理,按需加载 - * 基于`Less`进行样式开发 -* 强大的插件扩展功能,在线安装卸载升级插件 -* 通用的会员模块和API模块 -* 共用同一账号体系的Web端会员中心权限验证和API接口会员权限验证 -* 二级域名部署支持,同时域名支持绑定到应用插件 -* 多语言支持,服务端及客户端支持 -* 支持大文件分片上传、剪切板粘贴上传、拖拽上传,进度条显示,图片上传前压缩 -* 支持表格固定列、固定表头、跨页选择、Excel导出、模板渲染等功能 -* 强大的第三方应用模块支持([CMS](https://www.fastadmin.net/store/cms.html)、[CRM](https://www.fastadmin.net/store/facrm.html)、[企业网站管理系统](https://www.fastadmin.net/store/ldcms.html)、[知识库文档系统](https://www.fastadmin.net/store/knowbase.html)、[在线投票系统](https://www.fastadmin.net/store/vote.html)、[B2C商城](https://www.fastadmin.net/store/shopro.html)、[B2B2C商城](https://www.fastadmin.net/store/wanlshop.html)) -* 整合第三方短信接口(阿里云、腾讯云短信) -* 无缝整合第三方云存储(七牛云、阿里云OSS、腾讯云存储、又拍云)功能,支持云储存分片上传 -* 第三方富文本编辑器支持(Summernote、百度编辑器) -* 第三方登录(QQ、微信、微博)整合 -* 第三方支付(微信、支付宝)无缝整合,微信支持PC端扫码支付 -* 丰富的插件应用市场 - -## 安装使用 - -https://doc.fastadmin.net - -## 在线演示 - -https://demo.fastadmin.net - -用户名:admin - -密 码:123456 - -提 示:演示站数据无法进行修改,请下载源码安装体验全部功能 - -## 界面截图 -![控制台](https://images.gitee.com/uploads/images/2020/0929/202947_8db2d281_10933.gif "控制台") - -## 问题反馈 - -在使用中有任何问题,请使用以下联系方式联系我们 - -问答社区: https://ask.fastadmin.net - -Github: https://github.com/fastadminnet/fastadmin - -Gitee: https://gitee.com/fastadminnet/fastadmin - -## 特别鸣谢 - -感谢以下的项目,排名不分先后 - -ThinkPHP:http://www.thinkphp.cn - -AdminLTE:https://adminlte.io - -Bootstrap:http://getbootstrap.com - -jQuery:http://jquery.com - -Bootstrap-table:https://github.com/wenzhixin/bootstrap-table - -Nice-validator: https://validator.niceue.com - -SelectPage: https://github.com/TerryZ/SelectPage - -Layer: https://layuion.com/layer/ - -DropzoneJS: https://www.dropzonejs.com - - -## 版权信息 - -FastAdmin遵循Apache2开源协议发布,并提供免费使用。 - -本项目包含的第三方源码和二进制文件之版权信息另行标注。 - -版权所有Copyright © 2017-2024 by FastAdmin (https://www.fastadmin.net) - -All rights reserved。 +### 队列启动命令 +- php think queue:work --daemon --queue shopro +- php think queue:work --daemon --queue shopro-high \ No newline at end of file diff --git a/addons/shopro/console/Command.php b/addons/shopro/console/Command.php index 07ccb0c..223c7bc 100644 --- a/addons/shopro/console/Command.php +++ b/addons/shopro/console/Command.php @@ -16,7 +16,7 @@ class Command extends BaseCommand /** * 执行帮助命令 */ - protected function execute(Input $input, Output $output) + protected function execute(?Input $input, ?Output $output) { $this->input = $input; $this->output = $output; diff --git a/addons/shopro/console/ShoproChat.php b/addons/shopro/console/ShoproChat.php index c4c13af..ccc6ad0 100644 --- a/addons/shopro/console/ShoproChat.php +++ b/addons/shopro/console/ShoproChat.php @@ -42,7 +42,7 @@ class ShoproChat extends Command /** * 执行帮助命令 */ - protected function execute(Input $input, Output $output) + protected function execute(?Input $input, ?Output $output) { $this->input = $input; $this->output = $output; diff --git a/addons/shopro/controller/user/User.php b/addons/shopro/controller/user/User.php index ea7d0a9..197fe97 100644 --- a/addons/shopro/controller/user/User.php +++ b/addons/shopro/controller/user/User.php @@ -9,6 +9,7 @@ use app\admin\model\shopro\user\User as UserModel; use app\admin\model\shopro\user\Coupon as UserCouponModel; use app\admin\model\shopro\order\Order as OrderModel; use app\admin\model\shopro\order\Aftersale as AftersaleModel; +use app\admin\model\zy\link\Message; use app\admin\model\shopro\ThirdOauth; class User extends Common @@ -92,7 +93,7 @@ class User extends Common { $user = auth_user(); - $params = $this->request->only(['avatar', 'nickname', 'gender']); + $params = $this->request->only(['avatar', 'nickname', 'mobile', 'gender', 'qq', 'wechat', 'years', 'bio']); $this->svalidate($params); $user->save($params); @@ -147,7 +148,7 @@ class User extends Common } //如果已经有账号则直接登录 $ret = $this->auth->direct($user->id); - }else { + } else { $this->error('该手机号暂未注册'); } if (isset($ret) && $ret) { @@ -302,4 +303,32 @@ class User extends Common $this->success('注销成功'); } + + + // 用户消息 + public function msg() + { + $params = $this->request->param(); + + $model = Message::where('user_id', $this->auth->id); + if (isset($params['type'])) { + $model->where('type', $params['type']); + } + $res = $model->select(); + + $this->success('Success', $res); + } + + // 消息读取 + public function msgRead() + { + $params = $this->request->param(); + $model = Message::get($params['msg_id'] ?? NULL); + if (empty($model)) { + $this->error(__('No rows were found')); + } + $model->save(['status' => 1]); //已读 + + $this->success('Success', $model); + } } diff --git a/addons/shopro/controller/zy/Activity.php b/addons/shopro/controller/zy/Activity.php new file mode 100644 index 0000000..d0e791b --- /dev/null +++ b/addons/shopro/controller/zy/Activity.php @@ -0,0 +1,118 @@ +model = new \app\admin\model\zy\game\Activity; + parent::__construct(); + } + + public function index() + { + $params = $this->request->param(); + $model = $this->model; + if (isset($params['name'])) { + $model->where('name', 'like', '%' . $params['name'] . '%'); + } + if (isset($params['club_id'])) { + $model->where('club_id', $params['club_id']); + } + if (isset($params['week'])) { + $model->where('week', $params['week']); + } + if (isset($params['pid'])) { + $model->where('pid', $params['pid']); + } else { + $model->where('pid', 0); + } + + $res = $model->select(); + foreach ($res as &$v) { + $v['public_time'] = json_decode($v['public_time'] ?? '[]', true); + $v['join_start_time'] = json_decode($v['join_start_time'] ?? '[]', true); + $v['join_end_time'] = json_decode($v['join_end_time'] ?? '[]', true); + $v['quit_time'] = json_decode($v['quit_time'] ?? '[]', true); + $v['cost'] = json_decode($v['cost'] ?? '[]', true); + $v['referee'] = explode(',', $v['referee']); + } + + $this->success('Success', $res); + } + + public function view() + { + $model = $this->model->get($this->request->param('id')); + if (empty($model)) { + $this->error(__('No rows were found')); + } + + $model['public_time'] = json_decode($model['public_time'] ?? '[]', true); + $model['join_start_time'] = json_decode($model['join_start_time'] ?? '[]', true); + $model['join_end_time'] = json_decode($model['join_end_time'] ?? '[]', true); + $model['quit_time'] = json_decode($model['quit_time'] ?? '[]', true); + $model['cost'] = json_decode($model['cost'] ?? '[]', true); + $model['referee'] = explode(',', $model['referee']); + + $this->success('Success', $model); + } + + // 启动周期性活动创建比赛任务 + public function test() + { + if (!\think\Cache::has('addons\shopro\job\Test@zy')) { + $res = \think\Queue::push('\addons\shopro\job\Test@zy', time(), 'shopro'); + \think\Cache::set('addons\shopro\job\Test@zy', $res); + $this->success('Success', $res); + } + $this->success('Success', '任务已存在'); + } + + // 比赛报名 + public function gameJoin() + { + Db::startTrans(); + try { + $params = $this->request->param(); + $game = \app\admin\model\zy\game\Game::where('id', $params['act_id'] ?? NULL) + ->where('date', $params['date'] ?? NULL)->find(); + if (empty($game)) { + $this->error(__('No rows were found')); + } + + $this->svalidate($params, ".create"); + $orderCreate = new OrderCreate($params); + $result = $orderCreate->calc('create'); + $order = $orderCreate->create($result); + + $join = new \app\admin\model\zy\game\GameJoin; + $join->allowField(true)->save([ + 'act_id' => $game['act_id'], + 'game_id' => $game['id'], + 'user_id' => $this->auth->id, + 'orer_id' => $order['order_sn'], + 'status' => 1, + 'users' => json_encode($params['users'] ?? []) + ]); + + Db::commit(); + } catch (ValidateException | PDOException | Exception $e) { + Db::rollback(); + $this->error($e->getMessage(), $e); + } + $this->success('Success', $join); + } +} diff --git a/addons/shopro/controller/zy/Base.php b/addons/shopro/controller/zy/Base.php index 17eea28..b4ea4ec 100644 --- a/addons/shopro/controller/zy/Base.php +++ b/addons/shopro/controller/zy/Base.php @@ -10,7 +10,18 @@ use think\exception\ValidateException; class Base extends Common { + protected $noNeedLogin = []; + protected $noNeedRight = ['*']; + protected $model; + protected $user; + + public function _initialize() + { + parent::_initialize(); + $this->user = auth_user(); + } + public function index() { @@ -21,7 +32,7 @@ class Base extends Common $res = $this->model->select(); - $this->success('获取成功', $res); + $this->success('Success', $res); } public function add() @@ -39,7 +50,7 @@ class Base extends Common if ($result === false) { $this->error(__('No rows were inserted')); } - $this->success(); + $this->success('Success'); } public function update() @@ -61,7 +72,7 @@ class Base extends Common if ($result === false) { $this->error(__('No rows were inserted')); } - $this->success(); + $this->success('Success'); } public function view() @@ -70,6 +81,6 @@ class Base extends Common if (empty($model)) { $this->error(__('No rows were found')); } - $this->success($model); + $this->success('Success', $model); } } diff --git a/addons/shopro/controller/zy/Club.php b/addons/shopro/controller/zy/Club.php index 60e1e02..46c750c 100644 --- a/addons/shopro/controller/zy/Club.php +++ b/addons/shopro/controller/zy/Club.php @@ -2,14 +2,18 @@ namespace addons\shopro\controller\zy; +use think\Db; +use think\Exception; +use app\admin\model\User; +use app\admin\model\zy\Menber; +use think\exception\PDOException; +use app\admin\model\zy\link\Apply; +use app\admin\model\zy\link\Message; +use app\admin\model\zy\game\Activity; +use think\exception\ValidateException; class Club extends Base { - - // protected $noNeedLogin = ['index']; - protected $noNeedLogin = ['*']; - protected $noNeedRight = ['*']; - public function __construct() { $this->model = new \app\admin\model\zy\Club; @@ -25,6 +29,223 @@ class Club extends Base } $res = $model->select(); - $this->success('获取成功', $res); + $this->success('Success', $res); + } + + public function add() + { + $result = false; + $params = $this->request->param(); + Db::startTrans(); + try { + $params['president'] = $this->user->id; + $result = $this->model->allowField(true)->save($params); + $menber = new Menber; + $menber->allowField(true)->save([ + 'club_id' => $this->model->id, + 'user_id' => $this->user->id, + 'role' => 3 + ]); + Db::commit(); + } catch (ValidateException | PDOException | Exception $e) { + Db::rollback(); + $this->error($e->getMessage()); + } + if ($result === false) { + $this->error(__('No rows were inserted')); + } + $this->success('Success', $result); + } + + // 获取俱乐部成员 + public function menber() + { + $params = $this->request->param(); + $query = Db::table(Menber::$tableName)->alias('m') + ->join([User::$tableName => 'u'], 'u.id = m.user_id') + ->field('m.*,u.avatar,u.gender,u.nickname'); + if (empty($params['id'])) { + return $this->error('参数错误'); + } + $query->where('club_id', $params['id']); + if (isset($params['role'])) { + $query->where('role', 'IN', explode(',', $params['role'])); + } else { + $query->where('role', '>', 0); + } + $res = $query->select(); + + $this->success('Success', $res); + } + + // 获取俱乐部活动 + public function activity() + { + $params = $this->request->param(); + $query = Db::table(Activity::$tableName) + ->where('pid', 0) //主活动 + ->field(''); + if (isset($params['club_id'])) { + $query->where('club_id', $params['club_id']); + } + if (isset($params['week'])) { + $query->where('week', $params['week']); + } + $res = $query->select(); + + $this->success('Success', $res); + } + + // 申请加入俱乐部 + public function apply() + { + $params = $this->request->param(); + $club = $this->model->get($params['club_id']); + if (empty($club)) { + return $this->error('俱乐部不存在'); + } + if ($club['join_type'] > 1) { + $this->error('该俱乐部不允许申请'); + } + if (!empty(Menber::get(['club_id' => $params['club_id'], 'user_id' => $this->user->id]))) { + $this->error('您已经是俱乐部成员,无需重复申请'); + } + if ($club['join_type'] == 0) { + (new Menber)->allowField(true)->save([ + 'club_id' => $params['club_id'], + 'user_id' => $this->user->id, + 'role' => 1 + ]); + $this->success('加入成功'); + } + (new Apply)->allowField(true)->save([ // 记录申请 + 'type' => 1, + 'user_id' => $this->user->id, + 'target_id' => $params['club_id'], + 'content' => json_encode(['reason' => $params['reason'] ?? '']), + 'reason' => $params['reason'], + 'status' => 1 + ]); + (new Message())->allowField(true)->save([ // 消息通知 + 'type' => 3, + 'name' => $club->name, + 'avatar' => $club->logo, + 'from_id' => $this->user->id, + 'target_id' => $params['club_id'], + 'content' => json_encode([ + 'topic' => '俱乐部加入申请', + '俱乐部名称' => $club->name, + '申请人' => $this->user->nickname, + '申请时间' => date('Y-m-d H:i:s'), + 'reason' => $params['reason'] ?? '' + ]) + ]); + $this->success('已申请,请等候审核'); + } + //join_type 0:'开放加入,无需审核',1:'开放申请,审核加入',2:'会员邀请,无需审核',3:'会员邀请,审核加入',4:'仅管理员邀请,无需审核' + + // 邀请加入俱乐部 + public function invite() + { + $params = $this->request->param(); + $club = $this->model->get($params['club_id']); + if (empty($club)) { + return $this->error('俱乐部不存在'); + } + $menber = Menber::where('club_id', $params['club_id']) + ->where('user_id', $this->user->id) + ->where('role', '>', 0)->find(); + if (empty($menber)) { + $this->error('您无权邀请加入俱乐部'); + } + $user = User::get($params['user_id']); + if (empty($user)) { + return $this->error('用户不存在'); + } + if ($menber['role'] > 1 || $club['join_type'] == 0 || $club['join_type'] == 2) { // 管理员或者开放加入 + (new Menber)->allowField(true)->save([ + 'club_id' => $club->id, + 'user_id' => $user->id, + 'role' => 1 + ]); + $this->success('邀请加入成功'); + } + (new Apply)->allowField(true)->save([ // 记录申请 + 'type' => 1, + 'user_id' => $user->id, + 'target_id' => $club->id, + 'content' => json_encode(['reason' => $params['reason'] ?? '']), + 'reason' => $params['reason'], + 'status' => 1 + ]); + (new Message())->allowField(true)->save([ // 消息通知 + 'type' => 3, + 'name' => $club->name, + 'avatar' => $club->logo, + 'from_id' => $this->user->id, + 'target_id' => $params['club_id'], + 'content' => json_encode([ + 'topic' => '俱乐部加入申请', + '俱乐部名称' => $club->name, + '申请人' => $this->user->nickname, + '申请时间' => date('Y-m-d H:i:s'), + 'reason' => $params['reason'] ?? '' + ]) + ]); + $this->success('已邀请,请等候审核'); + } + + // 获取申请列表 + public function applyList() + { + $params = $this->request->param(); + $club = $this->model->get($params['club_id']); + if (empty($club)) { + return $this->error('俱乐部不存在'); + } + $menber = Menber::where('club_id', $params['club_id']) + ->where('user_id', $this->user->id) + ->where('role', '>', 1)->find(); + if (empty($menber)) { + $this->error('您无权处理申请'); + } + $query = Apply::where('type', 1)->where('target_id', $params['club_id']); + if (isset($params['status'])) { + $query->where('status', $params['status']); + } + $applyList = $query->select(); + $this->success('Success', $applyList); + } + + // 处理申请 + public function handle() + { + $params = $this->request->param(); + $apply = Apply::get($params['apply_id']); + $menber = Menber::where('club_id', $apply['target_id']) + ->where('user_id', $this->user->id) + ->where('role', '>', 1)->find(); + if (empty($menber)) { + $this->error('您无权处理申请'); + } + if (empty($apply)) { + return $this->error('申请记录不存在'); + } + if ($apply['status'] != 1) { + return $this->error('该申请已处理'); + } + if ($params['status'] == 2) { + (new Menber)->allowField(true)->save([ + 'club_id' => $apply['target_id'], + 'user_id' => $apply['user_id'], + 'role' => 1 + ]); + } + $apply->save([ + 'status' => $params['status'], + 'reply' => $params['reply'] ?? '' + ]); + + $this->success('处理成功'); } } diff --git a/addons/shopro/controller/zy/Game.php b/addons/shopro/controller/zy/Game.php new file mode 100644 index 0000000..249f735 --- /dev/null +++ b/addons/shopro/controller/zy/Game.php @@ -0,0 +1,60 @@ +model = new \app\admin\model\zy\game\Game; + parent::__construct(); + } + + public function index() + { + $params = $this->request->param(); + $model = $this->model; + if (isset($params['name'])) { + $model->where('name', 'like', '%' . $params['name'] . '%'); + } + if (isset($params['club_id'])) { + $model->where('club_id', $params['club_id']); + } + if (isset($params['week'])) { + $model->where('week', $params['week']); + } + if (isset($params['pid'])) { + $model->where('pid', $params['pid']); + } else { + $model->where('pid', 0); + } + if (isset($params['public_time'])) { + $model->where('public_time', $params['public_time']); + } else { + $model->where('public_time', '<=', date('Y-m-d H:i:s')); + } + + $res = $model->select(); + foreach ($res as &$v) { + + $v['cost'] = json_decode($v['cost'] ?? '[]', true); + $v['referee'] = explode(',', $v['referee']); + } + + $this->success('Success', $res); + } + + public function view() + { + $model = $this->model->get($this->request->param('id')); + if (empty($model)) { + $this->error(__('No rows were found')); + } + + $model['cost'] = json_decode($model['cost'] ?? '[]', true); + $model['referee'] = explode(',', $model['referee']); + + $this->success('Success', $model); + } +} diff --git a/addons/shopro/controller/zy/Gym.php b/addons/shopro/controller/zy/Gym.php index 8f10ec4..4be4a20 100644 --- a/addons/shopro/controller/zy/Gym.php +++ b/addons/shopro/controller/zy/Gym.php @@ -7,10 +7,6 @@ namespace addons\shopro\controller\zy; class Gym extends Base { - // protected $noNeedLogin = ['index']; - protected $noNeedLogin = ['*']; - protected $noNeedRight = ['*']; - public function __construct() { $this->model = new \app\admin\model\zy\Stadium; @@ -27,6 +23,6 @@ class Gym extends Base $res = $model->select(); - $this->success('获取成功', $res); + $this->success('Success', $res); } } diff --git a/addons/shopro/controller/zy/Tags.php b/addons/shopro/controller/zy/Tags.php index dccd55f..f0612dd 100644 --- a/addons/shopro/controller/zy/Tags.php +++ b/addons/shopro/controller/zy/Tags.php @@ -7,11 +7,7 @@ use addons\shopro\controller\Common; class Tags extends Common { - - // protected $noNeedLogin = ['index']; - protected $noNeedLogin = ['*']; - protected $noNeedRight = ['*']; - + public function index() { $params = $this->request->param(); @@ -24,6 +20,6 @@ class Tags extends Common } $res = $model->select(); - $this->success('获取成功', $res); + $this->success('Success', $res); } } diff --git a/addons/shopro/job/Test.php b/addons/shopro/job/Test.php index aae54ee..551c043 100644 --- a/addons/shopro/job/Test.php +++ b/addons/shopro/job/Test.php @@ -2,7 +2,11 @@ namespace addons\shopro\job; +use think\Db; +use think\Exception; use think\queue\Job; +use think\exception\PDOException; +use think\exception\ValidateException; class Test extends BaseJob { @@ -13,7 +17,7 @@ class Test extends BaseJob { // 创建目录 $this->mkdir(); - + // 写入日志文件 $filename = RUNTIME_PATH . 'storage/queue/shopro.log'; file_put_contents($filename, date('Y-m-d H:i:s')); @@ -48,4 +52,69 @@ class Test extends BaseJob @mkdir($dir, 0755, true); } } + + /** + * 周期性活动创建比赛 + */ + public function zy(Job $job, $data) + { + Db::startTrans(); + try { + $_actModel = new \app\admin\model\zy\game\Activity(); + $_gameModel = new \app\admin\model\zy\game\Game(); + $week = date('w'); //当前星期 + $current = time(); //当前时间 + $activity = (clone $_actModel)::where('type', 1)->where('pid', 0)->select(); //周期性主活动 + foreach ($activity as $act) { + $act = $act->toArray(); + $publicTime = json_decode($act['public_time'] ?? '[]', true); + $publicBefore = intval($publicTime['before'] ?? 0); //提前几天 + $PublicWeek = $act['week'] - $publicBefore; //设定应该发布的星期 + if ($PublicWeek != $week && ($PublicWeek + 7) != $week) { + print_r('星期不对'); + continue; // 星期不对 + } + $public_time = strtotime($publicTime['time']); //设定的时间 + if ($current < $public_time) { + print_r('时间未到'); + continue; //时间未到 + } + $act['public_time'] = date('Y-m-d H:i:s', $public_time - $publicBefore * 86400); //设定的时间 + $act['date'] = date('Y-m-d', $public_time - $publicBefore * 86400); //设定的日期 + $games = (clone $_gameModel)::where('act_id', $act['id']) + ->where('public_time', $act['public_time']) + ->where('date', $act['date'])->select(); + if (!empty($games)) { + print_r('已存在'); + continue; // 已存在 + } + $joinStartTime = json_decode($act['join_start_time'] ?? '[]', true); + $act['join_start_time'] = date('Y-m-d H:i:s', strtotime($joinStartTime['time']) - intval($joinStartTime['before']) * 86400); + $joinEndTime = json_decode($act['join_end_time'] ?? '[]', true); + $act['join_end_time'] = date('Y-m-d H:i:s', strtotime($joinEndTime['time']) - intval($joinEndTime['before']) * 86400); + $quitTime = json_decode($act['quit_time'] ?? '[]', true); + $act['quit_time'] = date('Y-m-d H:i:s', strtotime($quitTime['time']) - intval($quitTime['before']) * 86400); + $act['act_id'] = $act['id']; + unset($act['id']); + $res = (clone $_gameModel)->allowField(true)->save($act); + $subs = (clone $_actModel)::where('pid', $act['act_id'])->select(); + foreach ($subs as $sub) { //存在子活动 + $sub = $sub->toArray(); + $sub['public_time'] = $act['public_time']; + $sub['join_start_time'] = $act['join_start_time']; + $sub['join_end_time'] = $act['join_end_time']; + $sub['quit_time'] = $act['quit_time']; + $sub['act_id'] = $act['act_id']; + $sub['date'] = $act['date']; + unset($sub['id']); + $res = (clone $_gameModel)->allowField(true)->save($sub); + } + } + Db::commit(); + } catch (ValidateException | PDOException | Exception $e) { + Db::rollback(); + format_log_error($e, 'zy.activity create game'); + } + $job->release(600); //$delay为延迟时间 + } } diff --git a/application/admin/model/User.php b/application/admin/model/User.php index 4a8f0c7..74e5f88 100644 --- a/application/admin/model/User.php +++ b/application/admin/model/User.php @@ -10,6 +10,7 @@ class User extends Model { // 表名 + public static $tableName = 'user'; protected $name = 'user'; // 自动写入时间戳字段 protected $autoWriteTimestamp = 'int'; diff --git a/application/admin/model/zy/Menber.php b/application/admin/model/zy/Menber.php index 2e19b5f..ddd151a 100644 --- a/application/admin/model/zy/Menber.php +++ b/application/admin/model/zy/Menber.php @@ -14,6 +14,7 @@ class Menber extends Model // 表名 protected $table = 'zy_menber'; + public static $tableName = 'zy_menber'; // 自动写入时间戳字段 protected $autoWriteTimestamp = false; diff --git a/application/admin/model/zy/game/Activity.php b/application/admin/model/zy/game/Activity.php index 5580701..e30ba62 100644 --- a/application/admin/model/zy/game/Activity.php +++ b/application/admin/model/zy/game/Activity.php @@ -14,6 +14,7 @@ class Activity extends Model // 表名 protected $table = 'zy_activity'; + public static $tableName = 'zy_activity'; // 自动写入时间戳字段 protected $autoWriteTimestamp = false; diff --git a/application/admin/validate/zy/game/Activity.php b/application/admin/validate/zy/game/Activity.php index e9f350e..bd5e769 100644 --- a/application/admin/validate/zy/game/Activity.php +++ b/application/admin/validate/zy/game/Activity.php @@ -10,6 +10,7 @@ class Activity extends Validate * 验证规则 */ protected $rule = [ + 'week' => 'number|between:0,6', ]; /** * 提示消息 diff --git a/application/config.php b/application/config.php index d385b12..acab6c5 100644 --- a/application/config.php +++ b/application/config.php @@ -185,7 +185,7 @@ return [ // +---------------------------------------------------------------------- 'cache' => [ // 驱动方式 - 'type' => 'File', + 'type' => 'redis', // 缓存保存目录 'path' => CACHE_PATH, // 缓存前缀 diff --git a/application/extra/queue.php b/application/extra/queue.php index 51878f0..b33c03f 100644 --- a/application/extra/queue.php +++ b/application/extra/queue.php @@ -1,7 +1,7 @@ 'Redis', // Redis 驱动 - 'expire' => 0, // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null + 'expire' => 60, // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null 'default' => 'default', // 默认的队列名称 'host' => '127.0.0.1', // redis 主机ip 'port' => 6379, // redis 端口 diff --git a/thinkphp/lang/zh-cn.php b/thinkphp/lang/zh-cn.php index eb7a914..fa3f962 100644 --- a/thinkphp/lang/zh-cn.php +++ b/thinkphp/lang/zh-cn.php @@ -19,6 +19,8 @@ return [ 'Type error' => '类型错误', 'Fatal error' => '致命错误', 'syntax error' => '语法错误', + 'param error' => '参数错误', + 'param lose: {:param}' => '参数缺失: {:param}', // 框架核心错误提示 'dispatch type not support' => '不支持的调度类型', diff --git a/thinkphp/library/think/process/pipes/Windows.php b/thinkphp/library/think/process/pipes/Windows.php index f5788c5..ea73389 100644 --- a/thinkphp/library/think/process/pipes/Windows.php +++ b/thinkphp/library/think/process/pipes/Windows.php @@ -210,7 +210,7 @@ class Windows extends Pipes } if (null !== $w && 0 < count($w)) { - while (strlen($this->inputBuffer)) { + while (strlen((string)$this->inputBuffer)) { $written = fwrite($w[0], $this->inputBuffer, 2 << 18); if ($written > 0) { $this->inputBuffer = (string) substr($this->inputBuffer, $written); diff --git a/vendor/topthink/think-queue/src/queue/command/Listen.php b/vendor/topthink/think-queue/src/queue/command/Listen.php index 4759135..e298551 100644 --- a/vendor/topthink/think-queue/src/queue/command/Listen.php +++ b/vendor/topthink/think-queue/src/queue/command/Listen.php @@ -34,7 +34,7 @@ class Listen extends Command ->setDescription('Listen to a given queue'); } - public function initialize(Input $input, Output $output) + public function initialize(?Input $input, ?Output $output) { $this->listener = new Listener($this->findCommandPath()); $this->listener->setSleep($input->getOption('sleep')); @@ -45,7 +45,7 @@ class Listen extends Command }); } - public function execute(Input $input, Output $output) + public function execute(?Input $input, ?Output $output) { $delay = $input->getOption('delay'); diff --git a/vendor/topthink/think-queue/src/queue/command/Restart.php b/vendor/topthink/think-queue/src/queue/command/Restart.php index 29d4a18..766afbc 100644 --- a/vendor/topthink/think-queue/src/queue/command/Restart.php +++ b/vendor/topthink/think-queue/src/queue/command/Restart.php @@ -23,7 +23,7 @@ class Restart extends Command $this->setName('queue:restart')->setDescription('Restart queue worker daemons after their current job'); } - public function execute(Input $input, Output $output) + public function execute(?Input $input, ?Output $output) { Cache::set('think:queue:restart', time()); $output->writeln("Broadcasting queue restart signal."); diff --git a/vendor/topthink/think-queue/src/queue/command/Subscribe.php b/vendor/topthink/think-queue/src/queue/command/Subscribe.php index 35fc725..a05347f 100644 --- a/vendor/topthink/think-queue/src/queue/command/Subscribe.php +++ b/vendor/topthink/think-queue/src/queue/command/Subscribe.php @@ -31,7 +31,7 @@ class Subscribe extends Command ->addOption('option', null, Option::VALUE_IS_ARRAY | Option::VALUE_OPTIONAL, 'the options'); } - public function execute(Input $input, Output $output) + public function execute(?Input $input, ?Output $output) { $url = $input->getArgument('url'); diff --git a/vendor/topthink/think-queue/src/queue/command/Work.php b/vendor/topthink/think-queue/src/queue/command/Work.php index f7c2c95..406c4f7 100644 --- a/vendor/topthink/think-queue/src/queue/command/Work.php +++ b/vendor/topthink/think-queue/src/queue/command/Work.php @@ -33,7 +33,7 @@ class Work extends Command */ protected $worker; - protected function initialize(Input $input, Output $output) + protected function initialize(?Input $input, ?Output $output) { $this->worker = new Worker(); } @@ -57,7 +57,7 @@ class Work extends Command * @param Output $output * @return int|null|void */ - public function execute(Input $input, Output $output) + public function execute(?Input $input, ?Output $output) { $queue = $input->getOption('queue');