diff --git a/CHANGELOG.md b/CHANGELOG.md index 44b3b1c5..5690757b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +### [v1.2.4](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.4)(2021-01-10) + +#### 增加 + +- 后台增加上传logo和favicon图标 +- 后台增加公众号自定义菜单配置 +- 课程页增加咨询 + +### 优化 + +- oauth中state参数为安全base64加解码 +- findById参数类型不对时抛出异常 +- task表增加索引加快数据查找 +- markdown内容解析改由后端完成 +- 公众号应答处理逻辑 + ### [v1.2.3](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.3)(2021-01-03) #### 增加 diff --git a/README.md b/README.md index c082a651..3e0f415a 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,16 @@  -#### 项目介绍 +### 项目介绍 酷瓜云课堂,依托腾讯云基础服务架构,采用C扩展框架Phalcon开发,GPL-2.0开源协议,致力开源网课系统,开源网校系统,开源在线教育系统。 - - - + + +  -#### 系统功能 +### 系统功能 实现了点播、直播、专栏、会员、微聊等,是一个完整的产品,具体功能我也不想写一大堆,自己体验吧! @@ -21,17 +21,19 @@ - 课程数据来源于网络(无实质内容),切莫购买 - 管理后台已禁止数据提交,私密配置已过滤 -演示帐号:**13507083515 / 123456** (前后台通用) - 桌面端演示: - [前台演示](https://ctc.koogua.com) - [后台演示](https://ctc.koogua.com/admin) +演示帐号:100015@163.com / 123456 (前后台通用) + 移动端演示:  +演示帐号:13507083515 / 123456 + 支付流程演示: - [MySQL提升课程全面讲解MySQL架构设计(0.01元)](https://ctc.koogua.com/order/confirm?item_id=1390&item_type=1) @@ -40,7 +42,18 @@ Tips: 测试支付请用手机号注册一个新账户,以便接收订单通知,以及避免课程无法购买 -#### 项目组件 +即时通讯演示: + +请使用以下两个帐号在不同终端或者浏览器登录,打开微聊界面 + +- 帐号A:100015@163.com / 123456 +- 帐号B:100065@163.com / 123456 + +微信推送演示: + +Tips: 请用手机注册一个新账号,用户中心 -> 关注订阅,扫码关注公众号。之后的登录、购买、退款、直播、咨询等会有消息推送。 + +### 项目组件 - 后台框架:[phalcon 3.4.5](https://phalcon.io) - 前端框架:[layui 2.5.6](https://layui.com), [layim 3.9.5](https://www.layui.com/layim)(已授权) @@ -48,45 +61,27 @@ Tips: 测试支付请用手机号注册一个新账户,以便接收订单通 - 即时通讯:[workerman 3.5.22](https://workerman.net) - 基础依赖:[php7.3](https://php.net), [mysql5.7](https://mysql.com), [redis5.0](https://redis.io) -#### 安装指南 +### 安装指南 - [运行环境搭建](https://gitee.com/koogua/course-tencent-cloud-docker) - [系统服务配置](https://gitee.com/koogua/course-tencent-cloud/wikis) +- [客户终端配置](https://gitee.com/koogua/course-tencent-cloud-app) -#### 开发计划 - -- 桌面端:进行中 -- 移动端:进行中 -- 小程序:待启动 - -#### 意见反馈 +### 意见反馈 - [在线反馈](https://gitee.com/koogua/course-tencent-cloud/issues)(推荐) +- [官方论坛](https://koogua.com/forum)(推荐) - QQ交流群: 787363898 -#### 通过这个项目能学到什么? - -- 项目规划,phalcon,缓存,JWT,即时通讯,全文检索 -- docker,supervisor,devops -- git,linux,php,mysql,redis,nginx - -#### 有阿里云版吗? +### 有阿里云版吗? 阿里云版规划中,之前阿里云服务过期未续费,所以腾讯云版本先出。 -#### 代码有加密吗? +### 代码有加密吗? 所有代码都公开(授权代码除外,例如layim),没有所谓的商业版和付费插件。 -#### 有商业服务吗? - -生存才能发展,我们目前提供的服务包括: - -- 系统安装 -- 系统定制 -- 企业授权 - -#### 开源助力 +### 开源助力 毫无保留的真开源不容易,如果对你有帮助,请给我们 **STAR** !!! diff --git a/app/Console/Tasks/DeliverTask.php b/app/Console/Tasks/DeliverTask.php index ad7c846b..874401a4 100644 --- a/app/Console/Tasks/DeliverTask.php +++ b/app/Console/Tasks/DeliverTask.php @@ -248,12 +248,12 @@ class DeliverTask extends Task { $itemType = TaskModel::TYPE_DELIVER; $status = TaskModel::STATUS_PENDING; - $tryCount = self::TRY_COUNT; + $createTime = strtotime('-3 days'); return TaskModel::query() ->where('item_type = :item_type:', ['item_type' => $itemType]) ->andWhere('status = :status:', ['status' => $status]) - ->andWhere('try_count < :try_count:', ['try_count' => $tryCount + 1]) + ->andWhere('create_time > :create_time:', ['create_time' => $createTime]) ->orderBy('priority ASC') ->limit($limit) ->execute(); diff --git a/app/Console/Tasks/NoticeTask.php b/app/Console/Tasks/NoticeTask.php index 06841554..b736b80c 100644 --- a/app/Console/Tasks/NoticeTask.php +++ b/app/Console/Tasks/NoticeTask.php @@ -125,12 +125,12 @@ class NoticeTask extends Task $status = TaskModel::STATUS_PENDING; - $tryCount = self::TRY_COUNT; + $createTime = strtotime('-1 days'); return TaskModel::query() ->inWhere('item_type', $itemTypes) ->andWhere('status = :status:', ['status' => $status]) - ->andWhere('try_count < :try_count:', ['try_count' => $tryCount + 1]) + ->andWhere('create_time > :create_time:', ['create_time' => $createTime]) ->orderBy('priority ASC') ->limit($limit) ->execute(); diff --git a/app/Console/Tasks/RefundTask.php b/app/Console/Tasks/RefundTask.php index 1697a4e1..7529c242 100644 --- a/app/Console/Tasks/RefundTask.php +++ b/app/Console/Tasks/RefundTask.php @@ -296,12 +296,12 @@ class RefundTask extends Task { $itemType = TaskModel::TYPE_REFUND; $status = TaskModel::STATUS_PENDING; - $tryCount = self::TRY_COUNT; + $createTime = strtotime('-3 days'); return TaskModel::query() ->where('item_type = :item_type:', ['item_type' => $itemType]) ->andWhere('status = :status:', ['status' => $status]) - ->andWhere('try_count < :try_count:', ['try_count' => $tryCount + 1]) + ->andWhere('create_time > :create_time:', ['create_time' => $createTime]) ->orderBy('priority ASC') ->limit($limit) ->execute(); diff --git a/app/Console/Tasks/UpgradeTask.php b/app/Console/Tasks/UpgradeTask.php index 0dbfa0dc..cfd14aab 100644 --- a/app/Console/Tasks/UpgradeTask.php +++ b/app/Console/Tasks/UpgradeTask.php @@ -80,7 +80,7 @@ class UpgradeTask extends Task $redis->del($statsKey); } - echo "start reset metadata..." . PHP_EOL; + echo "end reset metadata..." . PHP_EOL; } /** diff --git a/app/Http/Admin/Controllers/SettingController.php b/app/Http/Admin/Controllers/SettingController.php index 309d6bd8..7d949a67 100644 --- a/app/Http/Admin/Controllers/SettingController.php +++ b/app/Http/Admin/Controllers/SettingController.php @@ -328,9 +328,9 @@ class SettingController extends Controller } /** - * @Route("/wechat", name="admin.setting.wechat") + * @Route("/wechat/oa", name="admin.setting.wechat_oa") */ - public function wechatAction() + public function wechatOaAction() { $settingService = new SettingService(); @@ -340,7 +340,7 @@ class SettingController extends Controller $data = $this->request->getPost(); - $settingService->updateWechatSettings($section, $data); + $settingService->updateWechatOASettings($section, $data); return $this->jsonSuccess(['msg' => '更新配置成功']); @@ -348,6 +348,7 @@ class SettingController extends Controller $oa = $settingService->getWechatOASettings(); + $this->view->pick('setting/wechat_oa'); $this->view->setVar('oa', $oa); } } diff --git a/app/Http/Admin/Controllers/TestController.php b/app/Http/Admin/Controllers/TestController.php index fb398d11..4db114d2 100644 --- a/app/Http/Admin/Controllers/TestController.php +++ b/app/Http/Admin/Controllers/TestController.php @@ -11,6 +11,7 @@ use App\Services\Mail\Test as TestMailService; use App\Services\MyStorage as StorageService; use App\Services\Sms\Test as TestSmsService; use App\Services\Vod as VodService; +use App\Services\Wechat as WechatService; /** * @RoutePrefix("/admin/test") @@ -54,6 +55,24 @@ class TestController extends Controller } } + /** + * @Post("/wechat/oa", name="admin.test.wechat_oa") + */ + public function wechatOaAction() + { + $wechatService = new WechatService(); + + $oa = $wechatService->getOfficialAccount(); + + $result = $oa->qrcode->temporary('foo', 86400); + + if (isset($result['ticket'])) { + return $this->jsonSuccess(['msg' => '接口返回成功']); + } else { + return $this->jsonError(['msg' => '接口返回失败,请检查相关配置']); + } + } + /** * @Get("/live/push", name="admin.test.live_push") */ diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 89b75942..77104b1d 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -759,9 +759,9 @@ class AuthNode extends Service ], [ 'id' => '5-1-13', - 'title' => '微信平台', + 'title' => '微信公众号', 'type' => 'menu', - 'route' => 'admin.setting.wechat', + 'route' => 'admin.setting.wechat_oa', ], ], ], diff --git a/app/Http/Admin/Services/Setting.php b/app/Http/Admin/Services/Setting.php index 92ade54d..87e2b6a4 100644 --- a/app/Http/Admin/Services/Setting.php +++ b/app/Http/Admin/Services/Setting.php @@ -5,6 +5,7 @@ namespace App\Http\Admin\Services; use App\Caches\Setting as SettingCache; use App\Repos\Setting as SettingRepo; use App\Repos\Vip as VipRepo; +use App\Services\Wechat as WechatService; class Setting extends Service { @@ -63,6 +64,26 @@ class Setting extends Service $oa['notify_url'] = $oa['notify_url'] ?: kg_full_url(['for' => 'home.wechat.oa.notify']); + $oa['menu'] = json_decode($oa['menu'], true); + + /** + * 构造一个3*5的二维树形菜单 + */ + for ($i = 0; $i < 3; $i++) { + if (!isset($oa['menu'][$i])) { + $oa['menu'][$i] = ['name' => sprintf('菜单%s', $i + 1)]; + } + for ($j = 0; $j < 5; $j++) { + if (!isset($oa['menu'][$i]['children'][$j])) { + $oa['menu'][$i]['children'][$j] = [ + 'type' => 'view', + 'name' => '', + 'url' => '', + ];; + } + } + } + return $oa; } @@ -171,12 +192,36 @@ class Setting extends Service } } - public function updateWechatSettings($section, $settings) + public function updateWechatOASettings($section, $settings) { - if ($section == 'wechat.oa') { - if (isset($settings['notice_template'])) { - $settings['notice_template'] = kg_json_encode($settings['notice_template']); + if (!empty($settings['notice_template'])) { + $settings['notice_template'] = kg_json_encode($settings['notice_template']); + } + + $buttons = []; + + if (!empty($settings['menu'])) { + foreach ($settings['menu'] as $i => $top) { + $buttons[$i]['name'] = $top['name']; + $buttons[$i]['url'] = $top['url']; + $buttons[$i]['type'] = 'view'; + foreach ($top['children'] as $j => $sub) { + if (!empty($sub['name']) && !empty($sub['url'])) { + $buttons[$i]['sub_button'][$j]['name'] = $sub['name']; + $buttons[$i]['sub_button'][$j]['url'] = $sub['url']; + $buttons[$i]['sub_button'][$j]['type'] = 'view'; + } else { + unset($settings['menu'][$i]['children'][$j]); + } + } } + $settings['menu'] = kg_json_encode($settings['menu']); + } + + if (!empty($buttons)) { + $service = new WechatService(); + $oa = $service->getOfficialAccount(); + $oa->menu->create($buttons); } $this->updateSettings($section, $settings); diff --git a/app/Http/Admin/Views/setting/site.volt b/app/Http/Admin/Views/setting/site.volt index 11b91cb5..5067bfc6 100644 --- a/app/Http/Admin/Views/setting/site.volt +++ b/app/Http/Admin/Views/setting/site.volt @@ -31,6 +31,32 @@ +