From 54a010287210de45a4e4add8afc8d641d7461b78 Mon Sep 17 00:00:00 2001 From: jacky huang Date: Wed, 9 Dec 2020 19:40:49 +0800 Subject: [PATCH 01/89] Develop (#14) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * !6 develop->master 1.1.0 * 更新版本号 * 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式 * Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen… * 前台学习资料部分完成 * !2 后台运营统计合并 * 后台学习资料部分完成 * Merge branch 'master' into develop * Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud * 1.增加changelog.md * 1.简化部分路由地址 * Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h… * Bump symfony/http-foundation from 4.3.4 to 5.1.6 * !7 纠正迁移文件和代码实际使用字段不一致 * 纠正迁移文件和时间代码中字段不一致 * 更新版本号 * 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式 * Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen… * 前台学习资料部分完成 * !2 后台运营统计合并 * 后台学习资料部分完成 * Merge branch 'master' into develop * Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud * 1.增加changelog.md * 1.简化部分路由地址 * Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h… * Bump symfony/http-foundation from 4.3.4 to 5.1.6 * !9 修正插入数据不一致以及后台菜单参数类型报错 * 1.修正插入的管理帐号数据 * 纠正迁移文件和时间代码中字段不一致 * 更新版本号 * 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式 * Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen… * 前台学习资料部分完成 * !2 后台运营统计合并 * 后台学习资料部分完成 * Merge branch 'master' into develop * Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud * 1.增加changelog.md * 1.简化部分路由地址 * Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h… * Bump symfony/http-foundation from 4.3.4 to 5.1.6 * !12 修正退款项目空白以及弹窗自适应 * 修复退款项目空白,以及弹窗高度自适应 * !13 修正退款项目空白以及弹窗自适应 * 修复退款项目空白,以及弹窗高度自适应 * !14 修正点击退款404 * 修复退款项目空白,以及弹窗高度自适应,取消退款内部错误 * 删除文件 LICENSE * add LICENSE. * update app/Http/Admin/Controllers/UploadController.php. 去除重复的signatureAction方法 * !19 v1.2.0阶段性合并 * 增加微信H5支付需要的Referer头信息 * v1.2.0阶段性合并 (#11) * !6 develop->master 1.1.0 * 更新版本号 * 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式 * Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen… * 前台学习资料部分完成 * !2 后台运营统计合并 * 后台学习资料部分完成 * Merge branch 'master' into develop * Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud * 1.增加changelog.md * 1.简化部分路由地址 * Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h… * Bump symfony/http-foundation from 4.3.4 to 5.1.6 * !7 纠正迁移文件和代码实际使用字段不一致 * 纠正迁移文件和时间代码中字段不一致 * 更新版本号 * 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式 * Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen… * 前台学习资料部分完成 * !2 后台运营统计合并 * 后台学习资料部分完成 * Merge branch 'master' into develop * Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud * 1.增加changelog.md * 1.简化部分路由地址 * Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h… * Bump symfony/http-foundation from 4.3.4 to 5.1.6 * !9 修正插入数据不一致以及后台菜单参数类型报错 * 1.修正插入的管理帐号数据 * 纠正迁移文件和时间代码中字段不一致 * 更新版本号 * 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式 * Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen… * 前台学习资料部分完成 * !2 后台运营统计合并 * 后台学习资料部分完成 * Merge branch 'master' into develop * Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud * 1.增加changelog.md * 1.简化部分路由地址 * Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h… * Bump symfony/http-foundation from 4.3.4 to 5.1.6 * !12 修正退款项目空白以及弹窗自适应 * 修复退款项目空白,以及弹窗高度自适应 * !13 修正退款项目空白以及弹窗自适应 * 修复退款项目空白,以及弹窗高度自适应 * !14 修正点击退款404 * 修复退款项目空白,以及弹窗高度自适应,取消退款内部错误 * 删除文件 LICENSE * add LICENSE. * update app/Http/Admin/Controllers/UploadController.php. 去除重复的signatureAction方法 * !19 v1.2.0阶段性合并 * 增加微信H5支付需要的Referer头信息 * 更新H5支付方式 * 更新H5支付方式 * 更新H5支付方式 * !23 修复添加课时后进入编辑页面500错误 * 修复添加课时后进入编辑页面500错误 * !24 修复添加课时后进入编辑页面500错误 * 修复添加课时后进入编辑页面500错误 * !33 开放登录阶段性合并 * Merge remote-tracking branch 'gitee/xiaochong0302/I280IZ' into xiaocho… * 初步完成开放登录,待线上测试7 * Merge branch 'demo' of gitee.com:koogua/course-tencent-cloud into xiao… * 初步完成开放登录,待线上测试6 * !30 开放登录线上测试5 * !29 开放登录线上测试5 * 初步完成开放登录,待线上测试5 * !28 开放登录线上测试4 * 初步完成开放登录,待线上测试4 * !27 开放登录线上测试3 * 初步完成开放登录,待线上测试3 * !26 开放登录线上测试2 * 初步完成开放登录,待线上测试2 * !25 开放登录线上测试 * 初步完成开放登录,待线上测试 * !22 验证更新h5支付 * Merge remote-tracking branch 'remotes/gitee/develop' into demo * !20 验证更新h5支付 * Merge branch 'develop' of https://gitee.com/koogua/course-tencent-clou… * !16 v1.2.0阶段性合并 * 删除调试断点代码 * 删除重复的signature方法 * Merge branch 'develop' of https://gitee.com/koogua/course-tencent-clou… * demo后台增加统计 * !5 更新版本号1.1.0 * !4 v1.1.0版本develop->demo * Merge branch 'develop' into demo * 1.增加changelog.md * Merge branch 'develop' into demo * Merge branch 'develop' into demo * Merge branch 'develop' into demo * !1 精简优化代码 * Merge branch 'develop' into demo * 合并修改 * !34 修复创建课时相关属性表数据未生成的问题 * 修复创建课时相关属性表数据未生成的问题 * !35 修复腾讯云回调数据结构改变导致的错误 * 修复腾讯云回调数据结构改变导致的错误,缩短vod_event计划任务时间 * !36 修复添加课程后进入列表500错误 * 修复未填充教师和分类的列表错误 * 优化第三方登录,修复注册密码加密问题 * !38 修复课程分类未过滤 * 过滤课程分类 * !39 修复课程分类未过滤 * 过滤课程分类 * !40 修复课程分类未过滤2 * 过滤课程分类 * 过滤课程分类 * !41 修复课程分类未过滤2 * 过滤课程分类 * 过滤课程分类 * 优化开发登录,计划任务执行路径,周期 * v1.2.1阶段性合并 (#13) * !6 develop->master 1.1.0 * 更新版本号 * 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式 * Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen… * 前台学习资料部分完成 * !2 后台运营统计合并 * 后台学习资料部分完成 * Merge branch 'master' into develop * Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud * 1.增加changelog.md * 1.简化部分路由地址 * Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h… * Bump symfony/http-foundation from 4.3.4 to 5.1.6 * !7 纠正迁移文件和代码实际使用字段不一致 * 纠正迁移文件和时间代码中字段不一致 * 更新版本号 * 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式 * Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen… * 前台学习资料部分完成 * !2 后台运营统计合并 * 后台学习资料部分完成 * Merge branch 'master' into develop * Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud * 1.增加changelog.md * 1.简化部分路由地址 * Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h… * Bump symfony/http-foundation from 4.3.4 to 5.1.6 * !9 修正插入数据不一致以及后台菜单参数类型报错 * 1.修正插入的管理帐号数据 * 纠正迁移文件和时间代码中字段不一致 * 更新版本号 * 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式 * Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen… * 前台学习资料部分完成 * !2 后台运营统计合并 * 后台学习资料部分完成 * Merge branch 'master' into develop * Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud * 1.增加changelog.md * 1.简化部分路由地址 * Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h… * Bump symfony/http-foundation from 4.3.4 to 5.1.6 * !12 修正退款项目空白以及弹窗自适应 * 修复退款项目空白,以及弹窗高度自适应 * !13 修正退款项目空白以及弹窗自适应 * 修复退款项目空白,以及弹窗高度自适应 * !14 修正点击退款404 * 修复退款项目空白,以及弹窗高度自适应,取消退款内部错误 * 删除文件 LICENSE * add LICENSE. * update app/Http/Admin/Controllers/UploadController.php. 去除重复的signatureAction方法 * !19 v1.2.0阶段性合并 * 增加微信H5支付需要的Referer头信息 * 更新H5支付方式 * 更新H5支付方式 * 更新H5支付方式 * !23 修复添加课时后进入编辑页面500错误 * 修复添加课时后进入编辑页面500错误 * !24 修复添加课时后进入编辑页面500错误 * 修复添加课时后进入编辑页面500错误 * !33 开放登录阶段性合并 * Merge remote-tracking branch 'gitee/xiaochong0302/I280IZ' into xiaocho… * 初步完成开放登录,待线上测试7 * Merge branch 'demo' of gitee.com:koogua/course-tencent-cloud into xiao… * 初步完成开放登录,待线上测试6 * !30 开放登录线上测试5 * !29 开放登录线上测试5 * 初步完成开放登录,待线上测试5 * !28 开放登录线上测试4 * 初步完成开放登录,待线上测试4 * !27 开放登录线上测试3 * 初步完成开放登录,待线上测试3 * !26 开放登录线上测试2 * 初步完成开放登录,待线上测试2 * !25 开放登录线上测试 * 初步完成开放登录,待线上测试 * !22 验证更新h5支付 * Merge remote-tracking branch 'remotes/gitee/develop' into demo * !20 验证更新h5支付 * Merge branch 'develop' of https://gitee.com/koogua/course-tencent-clou… * !16 v1.2.0阶段性合并 * 删除调试断点代码 * 删除重复的signature方法 * Merge branch 'develop' of https://gitee.com/koogua/course-tencent-clou… * demo后台增加统计 * !5 更新版本号1.1.0 * !4 v1.1.0版本develop->demo * Merge branch 'develop' into demo * 1.增加changelog.md * Merge branch 'develop' into demo * Merge branch 'develop' into demo * Merge branch 'develop' into demo * !1 精简优化代码 * Merge branch 'develop' into demo * 合并修改 * !34 修复创建课时相关属性表数据未生成的问题 * 修复创建课时相关属性表数据未生成的问题 * !35 修复腾讯云回调数据结构改变导致的错误 * 修复腾讯云回调数据结构改变导致的错误,缩短vod_event计划任务时间 * !36 修复添加课程后进入列表500错误 * 修复未填充教师和分类的列表错误 * 优化第三方登录,修复注册密码加密问题 * !38 修复课程分类未过滤 * 过滤课程分类 * !39 修复课程分类未过滤 * 过滤课程分类 * !40 修复课程分类未过滤2 * 过滤课程分类 * 过滤课程分类 * !41 修复课程分类未过滤2 * 过滤课程分类 * 过滤课程分类 * 优化开发登录,计划任务执行路径,周期 * 优化开发登录逻辑 --- CHANGELOG.md | 4 + LICENSE | 339 ++++++++++++++++++ README.md | 6 +- app/Console/Tasks/VodEventTask.php | 12 +- .../Admin/Controllers/ChapterController.php | 2 - .../Admin/Controllers/SettingController.php | 29 ++ app/Http/Admin/Services/AuthNode.php | 6 + app/Http/Admin/Services/Chapter.php | 3 +- app/Http/Admin/Services/ChapterContent.php | 14 +- app/Http/Admin/Services/Course.php | 11 +- app/Http/Admin/Services/Setting.php | 30 ++ .../Admin/Views/chapter/edit_lesson_vod.volt | 4 +- app/Http/Admin/Views/course/edit_basic.volt | 8 +- app/Http/Admin/Views/course/list.volt | 8 +- app/Http/Admin/Views/im/group/list.volt | 4 +- app/Http/Admin/Views/setting/oauth.volt | 24 ++ app/Http/Admin/Views/setting/oauth_qq.volt | 35 ++ app/Http/Admin/Views/setting/oauth_weibo.volt | 41 +++ .../Admin/Views/setting/oauth_weixin.volt | 35 ++ app/Http/Admin/Views/setting/pay_alipay.volt | 6 + app/Http/Admin/Views/setting/pay_wxpay.volt | 6 + app/Http/Admin/Views/templates/main.volt | 1 + app/Http/Api/Controllers/TradeController.php | 28 +- app/Http/Api/Services/Trade.php | 44 ++- .../Home/Controllers/AccountController.php | 6 + .../Home/Controllers/ConnectController.php | 138 +++++++ app/Http/Home/Controllers/OrderController.php | 6 + .../Home/Controllers/PublicController.php | 16 + .../Controllers/UserConsoleController.php | 34 +- app/Http/Home/Services/Connect.php | 211 +++++++++++ app/Http/Home/Views/account/login.volt | 11 + app/Http/Home/Views/connect/bind.volt | 34 ++ app/Http/Home/Views/connect/bind_login.volt | 21 ++ .../Home/Views/connect/bind_register.volt | 32 ++ app/Http/Home/Views/order/pay.volt | 8 +- .../Home/Views/user/console/account_info.volt | 58 ++- app/Http/Home/Views/user/show.volt | 6 +- app/Library/AppInfo.php | 2 +- app/Library/OAuth.php | 53 --- app/Models/Connect.php | 104 ++++++ app/Repos/Connect.php | 62 ++++ app/Services/Logic/Account/OAuthProvider.php | 23 ++ app/Services/Logic/Account/Register.php | 5 + app/Services/Logic/Order/PayProvider.php | 21 ++ .../Logic/User/Console/ConnectDelete.php | 26 ++ .../Logic/User/Console/ConnectList.php | 45 +++ app/Services/OAuth.php | 107 ++++++ app/{Library => Services}/OAuth/QQ.php | 73 ++-- app/{Library => Services}/OAuth/WeiBo.php | 50 +-- app/{Library => Services}/OAuth/WeiXin.php | 49 +-- app/Services/Pay/Alipay.php | 1 + app/Services/Pay/AlipayGateway.php | 1 + app/Services/Pay/Wxpay.php | 8 +- app/Services/Pay/WxpayGateway.php | 6 + app/Validators/Connect.php | 41 +++ .../20201205091213_create_connect_table.php | 92 +++++ ...201205112717_insert_oauth_setting_data.php | 90 +++++ public/static/home/css/common.css | 52 ++- scheduler.php | 4 +- 59 files changed, 1967 insertions(+), 229 deletions(-) create mode 100644 LICENSE create mode 100644 app/Http/Admin/Views/setting/oauth.volt create mode 100644 app/Http/Admin/Views/setting/oauth_qq.volt create mode 100644 app/Http/Admin/Views/setting/oauth_weibo.volt create mode 100644 app/Http/Admin/Views/setting/oauth_weixin.volt create mode 100644 app/Http/Home/Controllers/ConnectController.php create mode 100644 app/Http/Home/Services/Connect.php create mode 100644 app/Http/Home/Views/connect/bind.volt create mode 100644 app/Http/Home/Views/connect/bind_login.volt create mode 100644 app/Http/Home/Views/connect/bind_register.volt delete mode 100644 app/Library/OAuth.php create mode 100644 app/Models/Connect.php create mode 100644 app/Repos/Connect.php create mode 100644 app/Services/Logic/Account/OAuthProvider.php create mode 100644 app/Services/Logic/Order/PayProvider.php create mode 100644 app/Services/Logic/User/Console/ConnectDelete.php create mode 100644 app/Services/Logic/User/Console/ConnectList.php create mode 100644 app/Services/OAuth.php rename app/{Library => Services}/OAuth/QQ.php (70%) rename app/{Library => Services}/OAuth/WeiBo.php (69%) rename app/{Library => Services}/OAuth/WeiXin.php (72%) create mode 100644 app/Validators/Connect.php create mode 100644 db/migrations/20201205091213_create_connect_table.php create mode 100644 db/migrations/20201205112717_insert_oauth_setting_data.php diff --git a/CHANGELOG.md b/CHANGELOG.md index af6041a4..50174e64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### [v1.2.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.1)(2020-12-10) +- 增加QQ,微信,微博第三方登录 +- 代码优化以及问题修复 + ### [v1.2.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.0)(2020-11-25) - 增加客户端api - 代码优化以及问题修复 diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..89e08fb0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md index 1d264fff..a6a49470 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ 酷瓜云课堂,依托腾讯云基础服务架构,采用C扩展框架Phalcon开发,GPL-2.0开源协议,致力开源网课系统,开源网校系统,开源在线教育系统。 -![](https://img.shields.io/static/v1?label=release&message=1.2.0&color=blue) -![](https://img.shields.io/static/v1?label=stars&message=101&color=blue) -![](https://img.shields.io/static/v1?label=forks&message=40&color=blue) +![](https://img.shields.io/static/v1?label=release&message=1.2.1&color=blue) +![](https://img.shields.io/static/v1?label=stars&message=112&color=blue) +![](https://img.shields.io/static/v1?label=forks&message=41&color=blue) ![](https://img.shields.io/static/v1?label=license&message=GPL-2.0&color=blue) #### 系统功能 diff --git a/app/Console/Tasks/VodEventTask.php b/app/Console/Tasks/VodEventTask.php index 0189960b..49d86fc7 100644 --- a/app/Console/Tasks/VodEventTask.php +++ b/app/Console/Tasks/VodEventTask.php @@ -45,7 +45,8 @@ class VodEventTask extends Task protected function handleNewFileUploadEvent($event) { $fileId = $event['FileUploadEvent']['FileId']; - $format = $event['FileUploadEvent']['MediaBasicInfo']['Type']; + $width = $event['FileUploadEvent']['MetaData']['Height']; + $height = $event['FileUploadEvent']['MetaData']['Width']; $duration = $event['FileUploadEvent']['MetaData']['Duration']; $chapterRepo = new ChapterRepo(); @@ -56,7 +57,7 @@ class VodEventTask extends Task $vodService = new VodService(); - if ($this->isAudioFile($format)) { + if ($width == 0 && $height == 0) { $vodService->createTransAudioTask($fileId); } else { $vodService->createTransVideoTask($fileId); @@ -144,13 +145,6 @@ class VodEventTask extends Task return $vodService->confirmEvents($handles); } - protected function isAudioFile($format) - { - $formats = ['mp3', 'm4a', 'wav', 'flac', 'ogg']; - - return in_array(strtolower($format), $formats); - } - protected function updateVodAttrs(ChapterModel $chapter) { $courseStats = new CourseStatService(); diff --git a/app/Http/Admin/Controllers/ChapterController.php b/app/Http/Admin/Controllers/ChapterController.php index 9b0ff8e7..1c81ebbc 100644 --- a/app/Http/Admin/Controllers/ChapterController.php +++ b/app/Http/Admin/Controllers/ChapterController.php @@ -110,8 +110,6 @@ class ChapterController extends Controller $this->view->pick('chapter/edit_lesson'); - $resources = $chapterService->getResources($chapter->id); - $cos = $chapterService->getSettings('cos'); $this->view->setVar('cos', $cos); diff --git a/app/Http/Admin/Controllers/SettingController.php b/app/Http/Admin/Controllers/SettingController.php index 24c70aa3..71e41fc0 100644 --- a/app/Http/Admin/Controllers/SettingController.php +++ b/app/Http/Admin/Controllers/SettingController.php @@ -298,4 +298,33 @@ class SettingController extends Controller } } + /** + * @Route("/oauth", name="admin.setting.oauth") + */ + public function oauthAction() + { + $settingService = new SettingService(); + + if ($this->request->isPost()) { + + $section = $this->request->getPost('section', 'string'); + + $data = $this->request->getPost(); + + $settingService->updateSettings($section, $data); + + return $this->jsonSuccess(['msg' => '更新配置成功']); + + } else { + + $qqAuth = $settingService->getQQAuthSettings(); + $weixinAuth = $settingService->getWeixinAuthSettings(); + $weiboAuth = $settingService->getWeiboAuthSettings(); + + $this->view->setVar('qq_auth', $qqAuth); + $this->view->setVar('weixin_auth', $weixinAuth); + $this->view->setVar('weibo_auth', $weiboAuth); + } + } + } diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 43fb64fd..427c9924 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -744,6 +744,12 @@ class AuthNode extends Service 'type' => 'menu', 'route' => 'admin.setting.im', ], + [ + 'id' => '5-1-12', + 'title' => '开放登录', + 'type' => 'menu', + 'route' => 'admin.setting.oauth', + ], ], ], ], diff --git a/app/Http/Admin/Services/Chapter.php b/app/Http/Admin/Services/Chapter.php index de9372e4..5a387d95 100644 --- a/app/Http/Admin/Services/Chapter.php +++ b/app/Http/Admin/Services/Chapter.php @@ -78,6 +78,7 @@ class Chapter extends Service $data['parent_id'] = $parent->id; $data['free'] = $validator->checkFreeStatus($post['free']); $data['priority'] = $chapterRepo->maxLessonPriority($post['parent_id']); + $parentId = $parent->id; } else { $data['priority'] = $chapterRepo->maxChapterPriority($post['course_id']); $data['parent_id'] = $parentId; @@ -120,7 +121,7 @@ class Chapter extends Service } if ($attrs === false) { - throw new \RuntimeException("Create Chapter {$course->model} Attrs Failed"); + throw new \RuntimeException("Create Chapter Related Attrs Failed"); } } diff --git a/app/Http/Admin/Services/ChapterContent.php b/app/Http/Admin/Services/ChapterContent.php index f02962d1..09fccf37 100644 --- a/app/Http/Admin/Services/ChapterContent.php +++ b/app/Http/Admin/Services/ChapterContent.php @@ -81,10 +81,20 @@ class ChapterContent extends Service $vod = $chapterRepo->findChapterVod($chapter->id); + /** + * 无新文件上传 + */ if ($fileId == $vod->file_id) { return; } + /** + * 删除旧文件 + */ + if ($vod->file_id) { + $this->deleteVodFile($vod->file_id); + } + $vod->update([ 'file_id' => $fileId, 'file_transcode' => '', @@ -102,10 +112,6 @@ class ChapterContent extends Service $chapter->update(['attrs' => $attrs]); $this->updateCourseVodAttrs($vod->course_id); - - if (!empty($vod->file_id)) { - $this->deleteVodFile($vod->file_id); - } } protected function updateChapterLive(ChapterModel $chapter) diff --git a/app/Http/Admin/Services/Course.php b/app/Http/Admin/Services/Course.php index 9dba1d7c..7f644d0d 100644 --- a/app/Http/Admin/Services/Course.php +++ b/app/Http/Admin/Services/Course.php @@ -8,6 +8,7 @@ use App\Caches\CourseCategoryList as CourseCategoryListCache; use App\Caches\CourseRelatedList as CourseRelatedListCache; use App\Caches\CourseTeacherList as CourseTeacherListCache; use App\Library\Paginator\Query as PagerQuery; +use App\Models\Category as CategoryModel; use App\Models\Course as CourseModel; use App\Models\CourseCategory as CourseCategoryModel; use App\Models\CourseRating as CourseRatingModel; @@ -224,7 +225,10 @@ class Course extends Service { $categoryRepo = new CategoryRepo(); - $allCategories = $categoryRepo->findAll(['deleted' => 0]); + $allCategories = $categoryRepo->findAll([ + 'type' => CategoryModel::TYPE_COURSE, + 'deleted' => 0, + ]); if ($allCategories->count() == 0) { return []; @@ -247,8 +251,11 @@ class Course extends Service $list = []; + /** + * 没有二级分类的不显示 + */ foreach ($allCategories as $category) { - if ($category->level == 1) { + if ($category->level == 1 && $category->child_count > 0) { $list[$category->id] = [ 'name' => $category->name, 'value' => $category->id, diff --git a/app/Http/Admin/Services/Setting.php b/app/Http/Admin/Services/Setting.php index 2a19326b..d6d46164 100644 --- a/app/Http/Admin/Services/Setting.php +++ b/app/Http/Admin/Services/Setting.php @@ -9,10 +9,39 @@ use App\Repos\Vip as VipRepo; class Setting extends Service { + public function getQQAuthSettings() + { + $oauth = $this->getSettings('oauth.qq'); + + $oauth['redirect_uri'] = $oauth['redirect_uri'] ?: kg_full_url(['for' => 'home.oauth.qq_callback']); + + return $oauth; + } + + public function getWeixinAuthSettings() + { + $oauth = $this->getSettings('oauth.weixin'); + + $oauth['redirect_uri'] = $oauth['redirect_uri'] ?: kg_full_url(['for' => 'home.oauth.weixin_callback']); + + return $oauth; + } + + public function getWeiboAuthSettings() + { + $oauth = $this->getSettings('oauth.weibo'); + + $oauth['redirect_uri'] = $oauth['redirect_uri'] ?: kg_full_url(['for' => 'home.oauth.weibo_callback']); + $oauth['refuse_uri'] = $oauth['refuse_uri'] ?: kg_full_url(['for' => 'home.oauth.weibo_refuse']); + + return $oauth; + } + public function getAlipaySettings() { $alipay = $this->getSettings('pay.alipay'); + $alipay['return_url'] = $alipay['return_url'] ?: kg_full_url(['for' => 'home.alipay_callback']); $alipay['notify_url'] = $alipay['notify_url'] ?: kg_full_url(['for' => 'home.alipay_notify']); return $alipay; @@ -22,6 +51,7 @@ class Setting extends Service { $wxpay = $this->getSettings('pay.wxpay'); + $wxpay['return_url'] = $wxpay['return_url'] ?: kg_full_url(['for' => 'home.wxpay_callback']); $wxpay['notify_url'] = $wxpay['notify_url'] ?: kg_full_url(['for' => 'home.wxpay_notify']); return $wxpay; diff --git a/app/Http/Admin/Views/chapter/edit_lesson_vod.volt b/app/Http/Admin/Views/chapter/edit_lesson_vod.volt index 95be1e74..6dceb8ef 100644 --- a/app/Http/Admin/Views/chapter/edit_lesson_vod.volt +++ b/app/Http/Admin/Views/chapter/edit_lesson_vod.volt @@ -1,3 +1,5 @@ +{% set file_id = vod ? vod.file_id : '' %} + {% if play_urls %}
视频信息 @@ -51,7 +53,7 @@
- +
diff --git a/app/Http/Admin/Views/course/edit_basic.volt b/app/Http/Admin/Views/course/edit_basic.volt index e28afa78..bf0f5709 100644 --- a/app/Http/Admin/Views/course/edit_basic.volt +++ b/app/Http/Admin/Views/course/edit_basic.volt @@ -30,10 +30,10 @@
- - - - + + + +
diff --git a/app/Http/Admin/Views/course/list.volt b/app/Http/Admin/Views/course/list.volt index 450a3641..b4ed45a7 100644 --- a/app/Http/Admin/Views/course/list.volt +++ b/app/Http/Admin/Views/course/list.volt @@ -9,6 +9,8 @@ 直播 {% elseif value == 3 %} 专栏 + {% else %} + 未知 {% endif %} {%- endmacro %} @@ -22,19 +24,21 @@ 中级 {% elseif value == 4 %} 高级 + {% else %} + 未知 {% endif %} {%- endmacro %} {%- macro category_info(category) %} - {% if category %} + {% if category.id is defined %} {% set url = url({'for':'admin.course.list'},{'category_id':category.id}) %} 分类:{{ category.name }} {% endif %} {%- endmacro %} {%- macro teacher_info(teacher) %} - {% if teacher %} + {% if teacher.id is defined %} {% set url = url({'for':'admin.course.list'},{'teacher_id':teacher.id}) %} 讲师:{{ teacher.name }} {% endif %} diff --git a/app/Http/Admin/Views/im/group/list.volt b/app/Http/Admin/Views/im/group/list.volt index 6570f894..7934d5b4 100644 --- a/app/Http/Admin/Views/im/group/list.volt +++ b/app/Http/Admin/Views/im/group/list.volt @@ -9,11 +9,13 @@ {% elseif value == 3 %} + {% else %} + 未知 {% endif %} {%- endmacro %} {%- macro owner_info(owner) %} - {% if owner %} + {% if owner.id is defined %} {{ owner.name }}({{ owner.id }}) {% else %} 未设置 diff --git a/app/Http/Admin/Views/setting/oauth.volt b/app/Http/Admin/Views/setting/oauth.volt new file mode 100644 index 00000000..15b714b7 --- /dev/null +++ b/app/Http/Admin/Views/setting/oauth.volt @@ -0,0 +1,24 @@ +{% extends 'templates/main.volt' %} + +{% block content %} + +
+
    +
  • QQ登录
  • +
  • 微信登录
  • +
  • 新浪微博
  • +
+
+
+ {{ partial('setting/oauth_qq') }} +
+
+ {{ partial('setting/oauth_weixin') }} +
+
+ {{ partial('setting/oauth_weibo') }} +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/app/Http/Admin/Views/setting/oauth_qq.volt b/app/Http/Admin/Views/setting/oauth_qq.volt new file mode 100644 index 00000000..bcf13f40 --- /dev/null +++ b/app/Http/Admin/Views/setting/oauth_qq.volt @@ -0,0 +1,35 @@ +
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + + +
+
+
\ No newline at end of file diff --git a/app/Http/Admin/Views/setting/oauth_weibo.volt b/app/Http/Admin/Views/setting/oauth_weibo.volt new file mode 100644 index 00000000..5b5a7a73 --- /dev/null +++ b/app/Http/Admin/Views/setting/oauth_weibo.volt @@ -0,0 +1,41 @@ +
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + + +
+
+
\ No newline at end of file diff --git a/app/Http/Admin/Views/setting/oauth_weixin.volt b/app/Http/Admin/Views/setting/oauth_weixin.volt new file mode 100644 index 00000000..2adfc78f --- /dev/null +++ b/app/Http/Admin/Views/setting/oauth_weixin.volt @@ -0,0 +1,35 @@ +
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + + +
+
+
\ No newline at end of file diff --git a/app/Http/Admin/Views/setting/pay_alipay.volt b/app/Http/Admin/Views/setting/pay_alipay.volt index aa060e5d..ebc1bf6c 100644 --- a/app/Http/Admin/Views/setting/pay_alipay.volt +++ b/app/Http/Admin/Views/setting/pay_alipay.volt @@ -24,6 +24,12 @@
+
+ +
+ +
+
diff --git a/app/Http/Admin/Views/setting/pay_wxpay.volt b/app/Http/Admin/Views/setting/pay_wxpay.volt index beb2c4f9..22cdc504 100644 --- a/app/Http/Admin/Views/setting/pay_wxpay.volt +++ b/app/Http/Admin/Views/setting/pay_wxpay.volt @@ -30,6 +30,12 @@
+
+ +
+ +
+
diff --git a/app/Http/Admin/Views/templates/main.volt b/app/Http/Admin/Views/templates/main.volt index 3c1345f1..6b70ff60 100644 --- a/app/Http/Admin/Views/templates/main.volt +++ b/app/Http/Admin/Views/templates/main.volt @@ -22,5 +22,6 @@ {% block include_js %}{% endblock %} {% block inline_js %}{% endblock %} + \ No newline at end of file diff --git a/app/Http/Api/Controllers/TradeController.php b/app/Http/Api/Controllers/TradeController.php index f9252452..55f6b635 100644 --- a/app/Http/Api/Controllers/TradeController.php +++ b/app/Http/Api/Controllers/TradeController.php @@ -25,26 +25,6 @@ class TradeController extends Controller return $this->jsonSuccess(['trade' => $trade]); } - /** - * @Get("/h5/pay", name="api.trade.h5_pay") - */ - public function h5PayAction() - { - $sn = $this->request->getQuery('sn', 'string'); - - $service = new TradeService(); - - $response = $service->h5Pay($sn); - - if (!$response) { - echo "H5支付跳转失败,请回退重试"; - } - - $response->send(); - - exit(); - } - /** * @Post("/h5/create", name="api.trade.h5_create") */ @@ -52,13 +32,9 @@ class TradeController extends Controller { $service = new TradeService(); - $trade = $service->createH5Trade(); - - $service = new TradeInfoService(); - - $trade = $service->handle($trade->sn); + $content = $service->createH5Trade(); - return $this->jsonSuccess(['trade' => $trade]); + return $this->jsonSuccess($content); } /** diff --git a/app/Http/Api/Services/Trade.php b/app/Http/Api/Services/Trade.php index 74b3f7ae..7b487784 100644 --- a/app/Http/Api/Services/Trade.php +++ b/app/Http/Api/Services/Trade.php @@ -5,6 +5,7 @@ namespace App\Http\Api\Services; use App\Models\Client as ClientModel; use App\Models\Trade as TradeModel; use App\Services\Logic\OrderTrait; +use App\Services\Logic\Trade\TradeInfo; use App\Services\Logic\TradeTrait; use App\Services\Pay\Alipay; use App\Services\Pay\Wxpay; @@ -17,23 +18,6 @@ class Trade extends Service use OrderTrait; use TradeTrait; - public function h5Pay($sn) - { - $trade = $this->checkTradeBySn($sn); - - $response = null; - - if ($trade->channel == TradeModel::CHANNEL_ALIPAY) { - $alipay = new Alipay(); - $response = $alipay->wap($trade); - } elseif ($trade->channel == TradeModel::CHANNEL_WXPAY) { - $wxpay = new Wxpay(); - $response = $wxpay->wap($trade); - } - - return $response; - } - public function createH5Trade() { $post = $this->request->getPost(); @@ -62,7 +46,24 @@ class Trade extends Service $trade->create(); - return $trade; + $redirect = ''; + + if ($trade->channel == TradeModel::CHANNEL_ALIPAY) { + $alipay = new Alipay(); + $response = $alipay->wap($trade); + $redirect = $response ? $response->getTargetUrl() : ''; + } elseif ($trade->channel == TradeModel::CHANNEL_WXPAY) { + $wxpay = new Wxpay(); + $response = $wxpay->wap($trade); + $redirect = $response ? $response->getTargetUrl() : ''; + } + + $payment = ['redirect' => $redirect]; + + return [ + 'trade' => $this->handleTradeInfo($trade->sn), + 'payment' => $payment, + ]; } public function createMpTrade() @@ -122,4 +123,11 @@ class Trade extends Service return $this->request->getHeader('X-Platform'); } + protected function handleTradeInfo($sn) + { + $service = new TradeInfo(); + + return $service->handle($sn); + } + } diff --git a/app/Http/Home/Controllers/AccountController.php b/app/Http/Home/Controllers/AccountController.php index 8dc2d285..888deac1 100644 --- a/app/Http/Home/Controllers/AccountController.php +++ b/app/Http/Home/Controllers/AccountController.php @@ -4,6 +4,7 @@ namespace App\Http\Home\Controllers; use App\Http\Home\Services\Account as AccountService; use App\Services\Logic\Account\EmailUpdate as EmailUpdateService; +use App\Services\Logic\Account\OAuthProvider as OAuthProviderService; use App\Services\Logic\Account\PasswordReset as PasswordResetService; use App\Services\Logic\Account\PasswordUpdate as PasswordUpdateService; use App\Services\Logic\Account\PhoneUpdate as PhoneUpdateService; @@ -62,8 +63,13 @@ class AccountController extends Controller $captcha = $service->getSettings('captcha'); + $service = new OAuthProviderService(); + + $oauthProvider = $service->handle(); + $returnUrl = $this->request->getHTTPReferer(); + $this->view->setVar('oauth_provider', $oauthProvider); $this->view->setVar('return_url', $returnUrl); $this->view->setVar('captcha', $captcha); } diff --git a/app/Http/Home/Controllers/ConnectController.php b/app/Http/Home/Controllers/ConnectController.php new file mode 100644 index 00000000..10c11e4c --- /dev/null +++ b/app/Http/Home/Controllers/ConnectController.php @@ -0,0 +1,138 @@ +getAuthorizeUrl(ConnectModel::PROVIDER_QQ); + + return $this->response->redirect($url, true); + } + + /** + * @Get("/weixin", name="home.oauth.weixin") + */ + public function weixinAction() + { + $service = new ConnectService(); + + $url = $service->getAuthorizeUrl(ConnectModel::PROVIDER_WEIXIN); + + return $this->response->redirect($url, true); + } + + /** + * @Get("/weibo", name="home.oauth.weibo") + */ + public function weiboAction() + { + $service = new ConnectService(); + + $url = $service->getAuthorizeUrl(ConnectModel::PROVIDER_WEIBO); + + return $this->response->redirect($url, true); + } + + /** + * @Get("/qq/callback", name="home.oauth.qq_callback") + */ + public function qqCallbackAction() + { + $this->handleCallback(ConnectModel::PROVIDER_QQ); + } + + /** + * @Get("/weixin/callback", name="home.oauth.weixin_callback") + */ + public function weixinCallbackAction() + { + $this->handleCallback(ConnectModel::PROVIDER_WEIXIN); + } + + /** + * @Get("/weibo/callback", name="home.oauth.weibo_callback") + */ + public function weiboCallbackAction() + { + $this->handleCallback(ConnectModel::PROVIDER_WEIBO); + } + + /** + * @Get("/weibo/refuse", name="home.oauth.weibo_refuse") + */ + public function weiboRefuseAction() + { + return $this->response->redirect(['for' => 'home.account.login']); + } + + /** + * @Post("/bind/login", name="home.oauth.bind_login") + */ + public function bindLoginAction() + { + $service = new ConnectService(); + + $service->bindLogin(); + + $location = $this->url->get(['for' => 'home.uc.account']); + + return $this->jsonSuccess(['location' => $location]); + } + + /** + * @Post("/bind/register", name="home.oauth.bind_register") + */ + public function bindRegisterAction() + { + $service = new ConnectService(); + + $service->bindRegister(); + + $location = $this->url->get(['for' => 'home.uc.account']); + + return $this->jsonSuccess(['location' => $location]); + } + + protected function handleCallback($provider) + { + $code = $this->request->getQuery('code'); + $state = $this->request->getQuery('state'); + + $service = new ConnectService(); + + $openUser = $service->getOpenUserInfo($code, $state, $provider); + $connect = $service->getConnectRelation($openUser['id'], $openUser['provider']); + + if ($connect) { + if ($this->authUser->id > 0) { + $service->bindUser($openUser); + return $this->response->redirect(['for' => 'home.uc.account']); + } else { + $service->authLogin($connect); + return $this->response->redirect(['for' => 'home.index']); + } + } + + $captcha = $service->getSettings('captcha'); + + $this->view->pick('connect/bind'); + $this->view->setVar('captcha', $captcha); + $this->view->setVar('provider', $provider); + $this->view->setVar('open_user', $openUser); + } + +} diff --git a/app/Http/Home/Controllers/OrderController.php b/app/Http/Home/Controllers/OrderController.php index acf797a8..6cd6e310 100644 --- a/app/Http/Home/Controllers/OrderController.php +++ b/app/Http/Home/Controllers/OrderController.php @@ -7,6 +7,7 @@ use App\Services\Logic\Order\OrderCancel as OrderCancelService; use App\Services\Logic\Order\OrderConfirm as OrderConfirmService; use App\Services\Logic\Order\OrderCreate as OrderCreateService; use App\Services\Logic\Order\OrderInfo as OrderInfoService; +use App\Services\Logic\Order\PayProvider as PayProviderService; use Phalcon\Mvc\Dispatcher; use Phalcon\Mvc\View; @@ -82,6 +83,10 @@ class OrderController extends Controller { $sn = $this->request->getQuery('sn', 'string'); + $service = new PayProviderService(); + + $payProvider = $service->handle(); + $service = new OrderInfoService(); $order = $service->handle($sn); @@ -90,6 +95,7 @@ class OrderController extends Controller $this->response->redirect(['for' => 'home.uc.orders']); } + $this->view->setVar('pay_provider', $payProvider); $this->view->setVar('order', $order); } diff --git a/app/Http/Home/Controllers/PublicController.php b/app/Http/Home/Controllers/PublicController.php index 21e28b1e..e297095c 100644 --- a/app/Http/Home/Controllers/PublicController.php +++ b/app/Http/Home/Controllers/PublicController.php @@ -75,6 +75,22 @@ class PublicController extends \Phalcon\Mvc\Controller return $this->jsonSuccess(['token' => $token]); } + /** + * @Get("/alipay/callback", name="home.alipay_callback") + */ + public function alipayCallbackAction() + { + return $this->response->redirect('/h5/#/pages/me/index', true); + } + + /** + * @Get("/wxpay/callback", name="home.wxpay_callback") + */ + public function wxpayCallbackAction() + { + return $this->response->redirect('/h5/#/pages/me/index', true); + } + /** * @Post("/alipay/notify", name="home.alipay_notify") */ diff --git a/app/Http/Home/Controllers/UserConsoleController.php b/app/Http/Home/Controllers/UserConsoleController.php index 5e159e0e..2b56c475 100644 --- a/app/Http/Home/Controllers/UserConsoleController.php +++ b/app/Http/Home/Controllers/UserConsoleController.php @@ -2,7 +2,10 @@ namespace App\Http\Home\Controllers; +use App\Services\Logic\Account\OAuthProvider as OAuthProviderService; use App\Services\Logic\User\Console\AccountInfo as AccountInfoService; +use App\Services\Logic\User\Console\ConnectDelete as ConnectDeleteService; +use App\Services\Logic\User\Console\ConnectList as ConnectListService; use App\Services\Logic\User\Console\ConsultList as ConsultListService; use App\Services\Logic\User\Console\CourseList as CourseListService; use App\Services\Logic\User\Console\FavoriteList as FavoriteListService; @@ -59,13 +62,21 @@ class UserConsoleController extends Controller */ public function accountAction() { + $type = $this->request->getQuery('type', 'string', 'info'); + $service = new AccountInfoService(); $captcha = $service->getSettings('captcha'); $account = $service->handle(); - $type = $this->request->getQuery('type', 'string', 'info'); + $service = new OAuthProviderService(); + + $oauthProvider = $service->handle(); + + $service = new ConnectListService(); + + $connects = $service->handle(); if ($type == 'info') { $this->view->pick('user/console/account_info'); @@ -77,6 +88,8 @@ class UserConsoleController extends Controller $this->view->pick('user/console/account_password'); } + $this->view->setVar('oauth_provider', $oauthProvider); + $this->view->setVar('connects', $connects); $this->view->setVar('captcha', $captcha); $this->view->setVar('account', $account); } @@ -207,4 +220,23 @@ class UserConsoleController extends Controller return $this->jsonSuccess($content); } + /** + * @Post("/connect/{id:[0-9]+}/delete", name="home.uc.unconnect") + */ + public function deleteConnectAction($id) + { + $service = new ConnectDeleteService(); + + $service->handle($id); + + $location = $this->url->get(['for' => 'home.uc.account']); + + $content = [ + 'location' => $location, + 'msg' => '解除登录绑定成功', + ]; + + return $this->jsonSuccess($content); + } + } diff --git a/app/Http/Home/Services/Connect.php b/app/Http/Home/Services/Connect.php new file mode 100644 index 00000000..0cef8358 --- /dev/null +++ b/app/Http/Home/Services/Connect.php @@ -0,0 +1,211 @@ +request->getPost(); + + $auth = $this->getConnectAuth($post['provider']); + + $auth->checkState($post['state']); + + $validator = new AccountValidator(); + + $user = $validator->checkUserLogin($post['account'], $post['password']); + + $openUser = json_decode($post['open_user'], true); + + $this->handleConnectRelation($user, $openUser); + + $auth = $this->getAppAuth(); + + $auth->saveAuthInfo($user); + } + + public function bindRegister() + { + $post = $this->request->getPost(); + + $auth = $this->getConnectAuth($post['provider']); + + $auth->checkState($post['state']); + + $openUser = json_decode($post['open_user'], true); + + $registerService = new RegisterService(); + + $account = $registerService->handle(); + + $userRepo = new UserRepo(); + + $user = $userRepo->findById($account->id); + + $this->handleConnectRelation($user, $openUser); + + $auth = $this->getAppAuth(); + + $auth->saveAuthInfo($user); + } + + public function bindUser(array $openUser) + { + $user = $this->getLoginUser(); + + $this->handleConnectRelation($user, $openUser); + } + + public function authLogin(ConnectModel $connect) + { + $userRepo = new UserRepo(); + + $user = $userRepo->findById($connect->user_id); + + $auth = $this->getAppAuth(); + + $auth->saveAuthInfo($user); + } + + public function getAuthorizeUrl($provider) + { + $auth = $this->getConnectAuth($provider); + + return $auth->getAuthorizeUrl(); + } + + public function getOpenUserInfo($code, $state, $provider) + { + $auth = $this->getConnectAuth($provider); + + $auth->checkState($state); + + $token = $auth->getAccessToken($code); + + $openId = $auth->getOpenId($token); + + return $auth->getUserInfo($token, $openId); + } + + public function getConnectRelation($openId, $provider) + { + $connectRepo = new ConnectRepo(); + + return $connectRepo->findByOpenId($openId, $provider); + } + + public function getConnectAuth($provider) + { + $auth = null; + + switch ($provider) { + case ConnectModel::PROVIDER_QQ: + $auth = $this->getQQAuth(); + break; + case ConnectModel::PROVIDER_WEIXIN: + $auth = $this->getWeiXinAuth(); + break; + case ConnectModel::PROVIDER_WEIBO: + $auth = $this->getWeiBoAuth(); + break; + } + + if (!$auth) { + throw new \Exception('Invalid OAuth Provider'); + } + + return $auth; + } + + protected function getQQAuth() + { + $settings = $this->getSettings('oauth.qq'); + + return new QQAuth( + $settings['client_id'], + $settings['client_secret'], + $settings['redirect_uri'] + ); + } + + protected function getWeiXinAuth() + { + $settings = $this->getSettings('oauth.weixin'); + + return new WeiXinAuth( + $settings['client_id'], + $settings['client_secret'], + $settings['redirect_uri'] + ); + } + + protected function getWeiBoAuth() + { + $settings = $this->getSettings('oauth.weibo'); + + return new WeiBoAuth( + $settings['client_id'], + $settings['client_secret'], + $settings['redirect_uri'] + ); + } + + protected function getAppAuth() + { + /** + * @var $auth AuthService + */ + $auth = $this->getDI()->get('auth'); + + return $auth; + } + + protected function handleConnectRelation(UserModel $user, array $openUser) + { + $connectRepo = new ConnectRepo(); + + $connect = $connectRepo->findByOpenId($openUser['id'], $openUser['provider']); + + if ($connect) { + + $connect->open_name = $openUser['name']; + $connect->open_avatar = $openUser['avatar']; + + if ($connect->user_id != $user->id) { + $connect->user_id = $user->id; + } + + if ($connect->deleted == 1) { + $connect->deleted = 0; + } + + $connect->update(); + + } else { + + $connect = new ConnectModel(); + + $connect->user_id = $user->id; + $connect->open_id = $openUser['id']; + $connect->open_name = $openUser['name']; + $connect->open_avatar = $openUser['avatar']; + $connect->provider = $openUser['provider']; + + $connect->create(); + } + } + +} diff --git a/app/Http/Home/Views/account/login.volt b/app/Http/Home/Views/account/login.volt index edd461b6..34641c28 100644 --- a/app/Http/Home/Views/account/login.volt +++ b/app/Http/Home/Views/account/login.volt @@ -27,6 +27,17 @@ · 忘记密码
+
+ {% if oauth_provider.qq.enabled == 1 %} + + {% endif %} + {% if oauth_provider.weixin.enabled == 1 %} + + {% endif %} + {% if oauth_provider.weibo.enabled == 1 %} + + {% endif %} +
{% endblock %} diff --git a/app/Http/Home/Views/connect/bind.volt b/app/Http/Home/Views/connect/bind.volt new file mode 100644 index 00000000..ecb9d499 --- /dev/null +++ b/app/Http/Home/Views/connect/bind.volt @@ -0,0 +1,34 @@ +{% extends 'templates/main.volt' %} + +{% block content %} + + + + + +{% endblock %} + +{% block include_js %} + + {{ js_include('https://ssl.captcha.qq.com/TCaptcha.js',false) }} + {{ js_include('home/js/captcha.verify.js') }} + +{% endblock %} \ No newline at end of file diff --git a/app/Http/Home/Views/connect/bind_login.volt b/app/Http/Home/Views/connect/bind_login.volt new file mode 100644 index 00000000..abec6bfd --- /dev/null +++ b/app/Http/Home/Views/connect/bind_login.volt @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/app/Http/Home/Views/connect/bind_register.volt b/app/Http/Home/Views/connect/bind_register.volt new file mode 100644 index 00000000..87208750 --- /dev/null +++ b/app/Http/Home/Views/connect/bind_register.volt @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/app/Http/Home/Views/order/pay.volt b/app/Http/Home/Views/order/pay.volt index 16bca937..5e3a0a88 100644 --- a/app/Http/Home/Views/order/pay.volt +++ b/app/Http/Home/Views/order/pay.volt @@ -17,8 +17,12 @@ 支付金额:{{ '¥%0.2f'|format(order.amount) }}
- {{ image('home/img/alipay.png') }} - {{ image('home/img/wxpay.png') }} + {% if pay_provider.alipay.enabled == 1 %} + {{ image('home/img/alipay.png') }} + {% endif %} + {% if pay_provider.wxpay.enabled == 1 %} + {{ image('home/img/wxpay.png') }} + {% endif %}
+
+ 开放登录 +
+ {% if connects %} +
已经绑定的第三方帐号
+
+ + + + + + + + + {% for connect in connects %} + {% set url = url({'for':'home.uc.unconnect','id':connect.id}) %} + + + + + + + + {% endfor %} +
序号提供方用户信息创建日期操作
{{ loop.index }}{{ connect_provider(connect) }}{{ connect_user(connect) }}{{ date('Y-m-d H:i',connect.create_time) }}解除绑定
+
+ {% endif %} +
支持绑定的第三方帐号
+
+ {% if oauth_provider.qq.enabled == 1 %} + + {% endif %} + {% if oauth_provider.qq.enabled == 1 %} + + {% endif %} + {% if oauth_provider.qq.enabled == 1 %} + + {% endif %} +
diff --git a/app/Http/Home/Views/user/show.volt b/app/Http/Home/Views/user/show.volt index 80f762f0..f8c616e4 100644 --- a/app/Http/Home/Views/user/show.volt +++ b/app/Http/Home/Views/user/show.volt @@ -7,6 +7,8 @@ {% set full_user_url = full_url({'for':'home.user.show','id':user.id}) %} {% set qrcode_url = url({'for':'home.qrcode'},{'text':full_user_url}) %} + {% set user.area = user.area ? user.area : '火星' %} + {% set user.about = user.about ? user.about : '这个家伙很懒,什么都没留下!' %} - {% if user.about %} -
{{ user.about }}
- {% endif %} +
{{ user.about }}
{% set show_tab_courses = user.course_count > 0 %} diff --git a/app/Library/AppInfo.php b/app/Library/AppInfo.php index 569370b3..e0ab2ed3 100644 --- a/app/Library/AppInfo.php +++ b/app/Library/AppInfo.php @@ -11,7 +11,7 @@ class AppInfo protected $link = 'https://gitee.com/koogua'; - protected $version = '1.2.0'; + protected $version = '1.2.1'; public function __get($name) { diff --git a/app/Library/OAuth.php b/app/Library/OAuth.php deleted file mode 100644 index 49879bc6..00000000 --- a/app/Library/OAuth.php +++ /dev/null @@ -1,53 +0,0 @@ -appId = $appId; - $this->appSecret = $appSecret; - $this->redirectUri = $redirectUri; - } - - public function httpGet($uri, $params = [], $headers = []) - { - $client = new HttpClient(); - - $options = ['query' => $params, 'headers' => $headers]; - - $response = $client->get($uri, $options); - - return $response->getBody(); - } - - public function httpPost($uri, $params = [], $headers = []) - { - $client = new HttpClient(); - - $options = ['query' => $params, 'headers' => $headers]; - - $response = $client->post($uri, $options); - - return $response->getBody(); - } - - abstract public function getAuthorizeUrl(); - - abstract public function getAccessToken($code); - - abstract public function getOpenId($accessToken); - - abstract public function getUserInfo($accessToken, $openId); - -} diff --git a/app/Models/Connect.php b/app/Models/Connect.php new file mode 100644 index 00000000..4266e805 --- /dev/null +++ b/app/Models/Connect.php @@ -0,0 +1,104 @@ +addBehavior( + new SoftDelete([ + 'field' => 'deleted', + 'value' => 1, + ]) + ); + } + + public function beforeCreate() + { + $this->create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} diff --git a/app/Repos/Connect.php b/app/Repos/Connect.php new file mode 100644 index 00000000..e32c88a1 --- /dev/null +++ b/app/Repos/Connect.php @@ -0,0 +1,62 @@ +where('1 = 1'); + + if (isset($where['user_id'])) { + $query->andWhere('user_id = :user_id:', ['user_id' => $where['user_id']]); + } + + if (isset($where['provider'])) { + $query->andWhere('provider = :provider:', ['provider' => $where['provider']]); + } + + if (isset($where['deleted'])) { + $query->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]); + } + + $query->orderBy('id DESC'); + + return $query->execute(); + } + + /** + * @param int $id + * @return ConnectModel|Model|bool + */ + public function findById($id) + { + return ConnectModel::findFirst($id); + } + + /** + * @param string $openId + * @param int $provider + * @return ConnectModel|Model|bool + */ + public function findByOpenId($openId, $provider) + { + return ConnectModel::findFirst([ + 'conditions' => 'open_id = ?1 and provider = ?2', + 'bind' => [1 => $openId, 2 => $provider], + ]); + } + +} diff --git a/app/Services/Logic/Account/OAuthProvider.php b/app/Services/Logic/Account/OAuthProvider.php new file mode 100644 index 00000000..79a9cd2d --- /dev/null +++ b/app/Services/Logic/Account/OAuthProvider.php @@ -0,0 +1,23 @@ +getSettings('oauth.weixin'); + $weibo = $this->getSettings('oauth.weibo'); + $qq = $this->getSettings('oauth.qq'); + + return [ + 'weixin' => ['enabled' => $weixin['enabled']], + 'weibo' => ['enabled' => $weibo['enabled']], + 'qq' => ['enabled' => $qq['enabled']], + ]; + } + +} diff --git a/app/Services/Logic/Account/Register.php b/app/Services/Logic/Account/Register.php index 1d5a79f8..ade1df09 100644 --- a/app/Services/Logic/Account/Register.php +++ b/app/Services/Logic/Account/Register.php @@ -2,6 +2,7 @@ namespace App\Services\Logic\Account; +use App\Library\Utils\Password as PasswordUtil; use App\Library\Validators\Common as CommonValidator; use App\Models\Account as AccountModel; use App\Models\ImUser as ImUserModel; @@ -42,6 +43,10 @@ class Register extends Service $data['password'] = $accountValidator->checkPassword($post['password']); + $data['salt'] = PasswordUtil::salt(); + + $data['password'] = PasswordUtil::hash($data['password'], $data['salt']); + try { $this->db->begin(); diff --git a/app/Services/Logic/Order/PayProvider.php b/app/Services/Logic/Order/PayProvider.php new file mode 100644 index 00000000..a8271845 --- /dev/null +++ b/app/Services/Logic/Order/PayProvider.php @@ -0,0 +1,21 @@ +getSettings('pay.alipay'); + $wxpay = $this->getSettings('pay.wxpay'); + + return [ + 'alipay' => ['enabled' => $alipay['enabled']], + 'wxpay' => ['enabled' => $wxpay['enabled']], + ]; + } + +} diff --git a/app/Services/Logic/User/Console/ConnectDelete.php b/app/Services/Logic/User/Console/ConnectDelete.php new file mode 100644 index 00000000..27d60489 --- /dev/null +++ b/app/Services/Logic/User/Console/ConnectDelete.php @@ -0,0 +1,26 @@ +getLoginUser(); + + $validator = new ConnectValidator(); + + $connect = $validator->checkConnect($id); + + $validator->checkOwner($user->id, $connect->user_id); + + $connect->deleted = 1; + + $connect->update(); + } + +} diff --git a/app/Services/Logic/User/Console/ConnectList.php b/app/Services/Logic/User/Console/ConnectList.php new file mode 100644 index 00000000..7c930e89 --- /dev/null +++ b/app/Services/Logic/User/Console/ConnectList.php @@ -0,0 +1,45 @@ +getLoginUser(); + + $params = [ + 'user_id' => $user->id, + 'deleted' => 0, + ]; + + $connectRepo = new ConnectRepo(); + + $connects = $connectRepo->findAll($params); + + if ($connects->count() == 0) { + return []; + } + + $items = []; + + foreach ($connects as $connect) { + $items[] = [ + 'id' => $connect->id, + 'open_id' => $connect->open_id, + 'open_name' => $connect->open_name, + 'open_avatar' => $connect->open_avatar, + 'provider' => $connect->provider, + 'create_time' => $connect->create_time, + 'update_time' => $connect->update_time, + ]; + } + + return $items; + } + +} diff --git a/app/Services/OAuth.php b/app/Services/OAuth.php new file mode 100644 index 00000000..43aeefb0 --- /dev/null +++ b/app/Services/OAuth.php @@ -0,0 +1,107 @@ +clientId = $clientId; + $this->clientSecret = $clientSecret; + $this->redirectUri = $redirectUri; + } + + public function httpGet($uri, $params = [], $headers = []) + { + $client = new HttpClient(); + + $options = ['query' => $params, 'headers' => $headers]; + + $response = $client->get($uri, $options); + + return $response->getBody(); + } + + public function httpPost($uri, $params = [], $headers = []) + { + $client = new HttpClient(); + + $options = ['query' => $params, 'headers' => $headers]; + + $response = $client->post($uri, $options); + + return $response->getBody(); + } + + public function getState() + { + /** + * @var $crypt Crypt + */ + $crypt = Di::getDefault()->get('crypt'); + + return $crypt->encryptBase64(rand(1000, 9999)); + } + + public function checkState($state) + { + /** + * 注意事项: + * callback中的state参数并未做encode处理,参数中含有"+" + * 获取参数的时候却自动做了decode处理,"+"变成了空格 + */ + $state = str_replace(' ', '+', $state); + + /** + * @var $crypt Crypt + */ + $crypt = Di::getDefault()->get('crypt'); + + $value = $crypt->decryptBase64($state); + + if ($value < 1000 || $value > 9999) { + throw new \Exception('Invalid OAuth State Value'); + } + + return true; + } + + abstract public function getAuthorizeUrl(); + + abstract public function getAccessToken($code); + + abstract public function getOpenId($accessToken); + + abstract public function getUserInfo($accessToken, $openId); + +} diff --git a/app/Library/OAuth/QQ.php b/app/Services/OAuth/QQ.php similarity index 70% rename from app/Library/OAuth/QQ.php rename to app/Services/OAuth/QQ.php index 3515a0d9..2c59f144 100644 --- a/app/Library/OAuth/QQ.php +++ b/app/Services/OAuth/QQ.php @@ -1,8 +1,9 @@ $this->appId, + 'client_id' => $this->clientId, 'redirect_uri' => $this->redirectUri, + 'state' => $this->getState(), 'response_type' => 'code', - 'scope' => '', + 'scope' => 'get_user_info', ]; - + return self::AUTHORIZE_URL . '?' . http_build_query($params); } @@ -28,86 +30,85 @@ class QQ extends OAuth { $params = [ 'code' => $code, - 'client_id' => $this->appId, - 'client_secret' => $this->appSecret, + 'client_id' => $this->clientId, + 'client_secret' => $this->clientSecret, 'redirect_uri' => $this->redirectUri, 'grant_type' => 'authorization_code', - 'state' => 'ok', ]; - + $response = $this->httpPost(self::ACCESS_TOKEN_URL, $params); - + $this->accessToken = $this->parseAccessToken($response); - + return $this->accessToken; } public function getOpenId($accessToken) { $params = ['access_token' => $accessToken]; - + $response = $this->httpGet(self::OPENID_URL, $params); - + $this->openId = $this->parseOpenId($response); - + return $this->openId; } public function getUserInfo($accessToken, $openId) { $params = [ + 'oauth_consumer_key' => $this->clientId, 'access_token' => $accessToken, 'openid' => $openId, - 'oauth_consumer_key' => $this->appId, ]; - + $response = $this->httpGet(self::USER_INFO_URL, $params); - - $this->parseUserInfo($response); + + return $this->parseUserInfo($response); } protected function parseAccessToken($response) { $result = []; - + parse_str($response, $result); - + if (!isset($result['access_token'])) { throw new \Exception("Fetch Access Token Failed:{$response}"); } - + return $result['access_token']; } protected function parseOpenId($response) { - $result = $match = []; - + $result = $matches = []; + if (!empty($response)) { - preg_match('/callback\(\s+(.*?)\s+\)/i', $response, $match); - $result = json_decode($match[1], true); + preg_match('/callback\(\s+(.*?)\s+\)/i', $response, $matches); + $result = json_decode($matches[1], true); } - + if (!isset($result['openid'])) { - throw new \Exception("Fetch Openid Failed:{$response}"); + throw new \Exception("Fetch OpenId Failed:{$response}"); } - + return $result['openid']; } protected function parseUserInfo($response) { $data = json_decode($response, true); - - if ($data['ret'] != 0) { - throw new \Exception("Fetch User Info Failed:{$data['msg']}"); + + if (isset($data['ret']) && $data['ret'] != 0) { + throw new \Exception("Fetch User Info Failed:{$response}"); } - - $userInfo['type'] = 'QQ'; + + $userInfo['id'] = $this->openId; $userInfo['name'] = $data['nickname']; - $userInfo['nick'] = $data['nickname']; - $userInfo['head'] = $data['figureurl_2']; - + $userInfo['avatar'] = $data['figureurl']; + $userInfo['provider'] = ConnectModel::PROVIDER_QQ; + return $userInfo; } diff --git a/app/Library/OAuth/WeiBo.php b/app/Services/OAuth/WeiBo.php similarity index 69% rename from app/Library/OAuth/WeiBo.php rename to app/Services/OAuth/WeiBo.php index b7bc79ac..646c950b 100644 --- a/app/Library/OAuth/WeiBo.php +++ b/app/Services/OAuth/WeiBo.php @@ -1,24 +1,26 @@ $this->appId, + 'client_id' => $this->clientId, 'redirect_uri' => $this->redirectUri, + 'state' => $this->getState(), 'response_type' => 'code', ]; - + return self::AUTHORIZE_URL . '?' . http_build_query($params); } @@ -26,16 +28,16 @@ class WeiBo extends OAuth { $params = [ 'code' => $code, - 'client_id' => $this->appId, - 'client_secret' => $this->appSecret, + 'client_id' => $this->clientId, + 'client_secret' => $this->clientSecret, 'redirect_uri' => $this->redirectUri, 'grant_type' => 'authorization_code', ]; - + $response = $this->httpPost(self::ACCESS_TOKEN_URL, $params); - + $this->accessToken = $this->parseAccessToken($response); - + return $this->accessToken; } @@ -50,38 +52,38 @@ class WeiBo extends OAuth 'access_token' => $accessToken, 'uid' => $openId, ]; - + $response = $this->httpGet(self::USER_INFO_URL, $params); - + return $this->parseUserInfo($response); } private function parseAccessToken($response) { $data = json_decode($response, true); - - if (!isset($data['access_token']) || isset($data['uid'])) { + + if (!isset($data['access_token']) || !isset($data['uid'])) { throw new \Exception("Fetch Access Token Failed:{$response}"); } - + $this->openId = $data['uid']; - + return $data['access_token']; } private function parseUserInfo($response) { $data = json_decode($response, true); - - if ($data['error_code'] != 0) { - throw new \Exception("Fetch User Info Failed:{$data['error']}"); + + if (isset($data['error_code']) && $data['error_code'] != 0) { + throw new \Exception("Fetch User Info Failed:{$response}"); } - - $userInfo['type'] = 'WEIBO'; + + $userInfo['id'] = $data['id']; $userInfo['name'] = $data['name']; - $userInfo['nick'] = $data['screen_name']; - $userInfo['head'] = $data['avatar_large']; - + $userInfo['avatar'] = $data['profile_image_url']; + $userInfo['provider'] = ConnectModel::PROVIDER_WEIBO; + return $userInfo; } diff --git a/app/Library/OAuth/WeiXin.php b/app/Services/OAuth/WeiXin.php similarity index 72% rename from app/Library/OAuth/WeiXin.php rename to app/Services/OAuth/WeiXin.php index 4d741276..85d7edd2 100644 --- a/app/Library/OAuth/WeiXin.php +++ b/app/Services/OAuth/WeiXin.php @@ -1,8 +1,9 @@ $this->appId, + 'appid' => $this->clientId, 'redirect_uri' => $this->redirectUri, + 'state' => $this->getState(), 'response_type' => 'code', 'scope' => 'snsapi_login', - 'state' => 'dev', ]; - + return self::AUTHORIZE_URL . '?' . http_build_query($params); } @@ -28,15 +29,15 @@ class WeiXin extends OAuth { $params = [ 'code' => $code, - 'appid' => $this->appId, - 'secret' => $this->appSecret, + 'appid' => $this->clientId, + 'secret' => $this->clientSecret, 'grant_type' => 'authorization_code', ]; - + $response = $this->httpPost(self::ACCESS_TOKEN_URL, $params); - + $this->accessToken = $this->parseAccessToken($response); - + return $this->accessToken; } @@ -51,38 +52,38 @@ class WeiXin extends OAuth 'access_token' => $accessToken, 'openid' => $openId, ]; - + $response = $this->httpGet(self::USER_INFO_URL, $params); - + return $this->parseUserInfo($response); } private function parseAccessToken($response) { $data = json_decode($response, true); - + if (isset($data['errcode']) && $data['errcode'] != 0) { - throw new \Exception("Fetch Access Token Failed:{$data['errmsg']}"); + throw new \Exception("Fetch Access Token Failed:{$response}"); } - + $this->openId = $data['openid']; - + return $data['access_token']; } private function parseUserInfo($response) { $data = json_decode($response, true); - + if (isset($data['errcode']) && $data['errcode'] != 0) { - throw new \Exception("Fetch User Info Failed:{$data['errmsg']}"); + throw new \Exception("Fetch User Info Failed:{$response}"); } - - $userInfo['type'] = 'WEIXIN'; - $userInfo['name'] = $data['name']; - $userInfo['nick'] = $data['screen_name']; - $userInfo['head'] = $data['avatar_large']; - + + $userInfo['id'] = $data['openid']; + $userInfo['name'] = $data['nickname']; + $userInfo['avatar'] = $data['headimgurl']; + $userInfo['provider'] = ConnectModel::PROVIDER_WEIXIN; + return $userInfo; } diff --git a/app/Services/Pay/Alipay.php b/app/Services/Pay/Alipay.php index 447acd51..a8498d92 100644 --- a/app/Services/Pay/Alipay.php +++ b/app/Services/Pay/Alipay.php @@ -99,6 +99,7 @@ class Alipay extends PayService 'out_trade_no' => $trade->sn, 'total_amount' => $trade->amount, 'subject' => $trade->subject, + 'http_method' => 'GET', ]); } catch (\Exception $e) { diff --git a/app/Services/Pay/AlipayGateway.php b/app/Services/Pay/AlipayGateway.php index e686be2f..171c6870 100644 --- a/app/Services/Pay/AlipayGateway.php +++ b/app/Services/Pay/AlipayGateway.php @@ -47,6 +47,7 @@ class AlipayGateway extends Service 'alipay_root_cert' => config_path('alipay/alipayRootCert.crt'), // 支付宝根证书 'app_cert_public_key' => config_path('alipay/appCertPublicKey.crt'), // 应用公钥证书 'notify_url' => $this->settings['notify_url'], + 'return_url' => $this->settings['return_url'], 'log' => [ 'file' => log_path('alipay.log'), 'level' => $level, diff --git a/app/Services/Pay/Wxpay.php b/app/Services/Pay/Wxpay.php index cf254583..ba94fb0e 100644 --- a/app/Services/Pay/Wxpay.php +++ b/app/Services/Pay/Wxpay.php @@ -6,6 +6,7 @@ use App\Models\Refund as RefundModel; use App\Models\Trade as TradeModel; use App\Repos\Trade as TradeRepo; use App\Services\Pay as PayService; +use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Response; use Yansongda\Pay\Gateways\Wechat; use Yansongda\Pay\Log; @@ -90,7 +91,7 @@ class Wxpay extends PayService * wap支付 * * @param TradeModel $trade - * @return Response|bool + * @return RedirectResponse|bool */ public function wap(TradeModel $trade) { @@ -102,11 +103,6 @@ class Wxpay extends PayService 'body' => $trade->subject, ]); - /** - * 微信H5支付会检查Referer,构造Referer头信息 - */ - $result->headers->set('Referer', kg_site_url()); - } catch (\Exception $e) { Log::error('Wxpay Wap Exception', [ diff --git a/app/Services/Pay/WxpayGateway.php b/app/Services/Pay/WxpayGateway.php index a6c4aa82..00a7800f 100644 --- a/app/Services/Pay/WxpayGateway.php +++ b/app/Services/Pay/WxpayGateway.php @@ -21,6 +21,11 @@ class WxpayGateway extends Service $this->settings = array_merge($defaults, $options); } + public function setReturnUrl($returnUrl) + { + $this->settings['return_url'] = $returnUrl; + } + public function setNotifyUrl($notifyUrl) { $this->settings['notify_url'] = $notifyUrl; @@ -42,6 +47,7 @@ class WxpayGateway extends Service 'mch_id' => $this->settings['mch_id'], 'key' => $this->settings['key'], 'notify_url' => $this->settings['notify_url'], + 'return_url' => $this->settings['return_url'], 'cert_client' => config_path('wxpay/apiclient_cert.pem'), 'cert_key' => config_path('wxpay/apiclient_key.pem'), 'log' => [ diff --git a/app/Validators/Connect.php b/app/Validators/Connect.php new file mode 100644 index 00000000..cdcf4410 --- /dev/null +++ b/app/Validators/Connect.php @@ -0,0 +1,41 @@ +checkConnectById($id); + } + + public function checkConnectById($id) + { + $connectRepo = new ConnectRepo(); + + $connect = $connectRepo->findById($id); + + if (!$connect) { + throw new BadRequestException('connect.not_found'); + } + + return $connect; + } + + public function checkConnectByOpenId($openId, $provider) + { + $connectRepo = new ConnectRepo(); + + $connect = $connectRepo->findByOpenId($openId, $provider); + + if (!$connect) { + throw new BadRequestException('connect.not_found'); + } + + return $connect; + } +} diff --git a/db/migrations/20201205091213_create_connect_table.php b/db/migrations/20201205091213_create_connect_table.php new file mode 100644 index 00000000..53041625 --- /dev/null +++ b/db/migrations/20201205091213_create_connect_table.php @@ -0,0 +1,92 @@ +table('kg_connect', [ + 'id' => false, + 'primary_key' => ['id'], + 'engine' => 'InnoDB', + 'encoding' => 'utf8mb4', + 'collation' => 'utf8mb4_general_ci', + 'comment' => '', + 'row_format' => 'DYNAMIC', + ]) + ->addColumn('id', 'integer', [ + 'null' => false, + 'limit' => MysqlAdapter::INT_REGULAR, + 'identity' => 'enable', + 'comment' => '主键编号', + ]) + ->addColumn('user_id', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '用户编号', + 'after' => 'id', + ]) + ->addColumn('open_id', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 50, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '开放ID', + 'after' => 'user_id', + ]) + ->addColumn('open_name', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 30, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '开放名称', + 'after' => 'open_id', + ]) + ->addColumn('open_avatar', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 150, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '开放头像', + 'after' => 'open_name', + ]) + ->addColumn('provider', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '提供方', + 'after' => 'open_avatar', + ]) + ->addColumn('deleted', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '删除标识', + 'after' => 'provider', + ]) + ->addColumn('create_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '创建时间', + 'after' => 'deleted', + ]) + ->addColumn('update_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '更新时间', + 'after' => 'create_time', + ]) + ->addIndex(['open_id', 'provider'], [ + 'name' => 'openid_provider', + 'unique' => false, + ]) + ->create(); + } +} diff --git a/db/migrations/20201205112717_insert_oauth_setting_data.php b/db/migrations/20201205112717_insert_oauth_setting_data.php new file mode 100644 index 00000000..a7e4cf86 --- /dev/null +++ b/db/migrations/20201205112717_insert_oauth_setting_data.php @@ -0,0 +1,90 @@ + 'oauth.qq', + 'item_key' => 'enabled', + 'item_value' => '0', + ], + [ + 'section' => 'oauth.qq', + 'item_key' => 'client_id', + 'item_value' => '', + ], + [ + 'section' => 'oauth.qq', + 'item_key' => 'client_secret', + 'item_value' => '', + ], + [ + 'section' => 'oauth.qq', + 'item_key' => 'redirect_uri', + 'item_value' => '', + ], + [ + 'section' => 'oauth.weixin', + 'item_key' => 'enabled', + 'item_value' => '0', + ], + [ + 'section' => 'oauth.weixin', + 'item_key' => 'client_id', + 'item_value' => '', + ], + [ + 'section' => 'oauth.weixin', + 'item_key' => 'client_secret', + 'item_value' => '', + ], + [ + 'section' => 'oauth.weixin', + 'item_key' => 'redirect_uri', + 'item_value' => '', + ], + [ + 'section' => 'oauth.weibo', + 'item_key' => 'enabled', + 'item_value' => '0', + ], + [ + 'section' => 'oauth.weibo', + 'item_key' => 'client_id', + 'item_value' => '', + ], + [ + 'section' => 'oauth.weibo', + 'item_key' => 'client_secret', + 'item_value' => '', + ], + [ + 'section' => 'oauth.weibo', + 'item_key' => 'redirect_uri', + 'item_value' => '', + ], + [ + 'section' => 'oauth.weibo', + 'item_key' => 'refuse_uri', + 'item_value' => '', + ], + ]; + + $this->table('kg_setting')->insert($rows)->save(); + } + + public function down() + { + $this->execute("DELETE FROM kg_setting WHERE section = 'oauth.qq'"); + $this->execute("DELETE FROM kg_setting WHERE section = 'oauth.weixin'"); + $this->execute("DELETE FROM kg_setting WHERE section = 'oauth.weibo'"); + } + +} \ No newline at end of file diff --git a/public/static/home/css/common.css b/public/static/home/css/common.css index a78ec345..bf8478c5 100644 --- a/public/static/home/css/common.css +++ b/public/static/home/css/common.css @@ -1188,7 +1188,7 @@ } .login-wrap .link { - margin-bottom: 30px; + margin-bottom: 20px; font-size: 12px; text-align: center; } @@ -1202,6 +1202,26 @@ color: #999; } +.login-wrap .oauth { + text-align: center; +} + +.login-wrap .oauth a { + margin: 0 10px; +} + +.login-qq { + color: dodgerblue; +} + +.login-wechat { + color: green; +} + +.login-weibo { + color: red; +} + .user-profile { position: relative; } @@ -1537,9 +1557,12 @@ margin-right: 0; } +.security-item-list { + margin-top: -20px; +} + .security-item { - padding: 15px; - line-height: 50px; + line-height: 80px; border-bottom: 1px dashed #ccc; } @@ -1563,6 +1586,29 @@ float: right; } +.connect-list { + margin-bottom: 20px; +} + +.open-avatar img { + width: 16px; + height: 16px; + border-radius: 100%; +} + +.connect-tips { + color: #666; + margin-bottom: 20px; +} + +.oauth-list { + margin-bottom: 20px; +} + +.oauth-list a { + margin: 0 10px; +} + .order-filter { padding: 15px 20px; } diff --git a/scheduler.php b/scheduler.php index ddc820e2..b5b27246 100644 --- a/scheduler.php +++ b/scheduler.php @@ -8,7 +8,7 @@ $scheduler = new Scheduler(); $script = __DIR__ . '/console.php'; -$bin = '/usr/bin/php'; +$bin = '/usr/local/bin/php'; $scheduler->php($script, $bin, ['--task' => 'deliver', '--action' => 'main']) ->at('*/3 * * * *'); @@ -20,7 +20,7 @@ $scheduler->php($script, $bin, ['--task' => 'sync_learning', '--action' => 'main ->at('*/7 * * * *'); $scheduler->php($script, $bin, ['--task' => 'vod_event', '--action' => 'main']) - ->at('*/9 * * * *'); + ->at('*/5 * * * *'); $scheduler->php($script, $bin, ['--task' => 'close_trade', '--action' => 'main']) ->at('*/13 * * * *'); -- Gitee From 3f46dd5f28a16b712ae6dfdb850fe54e0ffffb96 Mon Sep 17 00:00:00 2001 From: koogua Date: Thu, 10 Dec 2020 15:51:22 +0800 Subject: [PATCH 02/89] =?UTF-8?q?!46=20v1.2.1=E9=98=B6=E6=AE=B5=E6=80=A7?= =?UTF-8?q?=E5=90=88=E5=B9=B6=20*=20Merge=20branch=20'demo'=20of=20gitee.c?= =?UTF-8?q?om:koogua/course-tencent-cloud=20into=20develop=20*=20Merge=20r?= =?UTF-8?q?emote-tracking=20branch=20'github/develop'=20into=20develop=20*?= =?UTF-8?q?=20Merge=20branch=20'develop'=20of=20https://gitee.com/koogua/c?= =?UTF-8?q?ourse-tencent-clou=E2=80=A6=20*=20=E6=9B=B4=E6=94=B9QQ=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E8=8E=B7=E5=8F=96ACCESS=5FTOKEN=E7=9A=84=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=96=B9=E5=BC=8F=20*=20Merge=20branch=20'master'=20i?= =?UTF-8?q?nto=20develop=20*=20Merge=20branch=20'master'=20of=20gitee.com:?= =?UTF-8?q?koogua/course-tencent-cloud=20into=20develop=20*=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=BC=80=E5=8F=91=E7=99=BB=E5=BD=95=E9=80=BB=E8=BE=91?= =?UTF-8?q?=20*=20v1.2.1=E9=98=B6=E6=AE=B5=E6=80=A7=E5=90=88=E5=B9=B6=20(#?= =?UTF-8?q?13)=20*=20!42=20v1.2.1=E9=98=B6=E6=AE=B5=E6=80=A7=E5=90=88?= =?UTF-8?q?=E5=B9=B6=20*=20Merge=20branches=20'develop'=20and=20'master'?= =?UTF-8?q?=20of=20https://gitee.com/koogua/cour=E2=80=A6=20*=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=BC=80=E5=8F=91=E7=99=BB=E5=BD=95=EF=BC=8C=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=EF=BC=8C=E5=91=A8=E6=9C=9F=20*=20!41=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=88=86=E7=B1=BB=E6=9C=AA=E8=BF=87=E6=BB=A4?= =?UTF-8?q?2=20*=20!40=20=E4=BF=AE=E5=A4=8D=E8=AF=BE=E7=A8=8B=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=9C=AA=E8=BF=87=E6=BB=A42=20*=20!39=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=AF=BE=E7=A8=8B=E5=88=86=E7=B1=BB=E6=9C=AA=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=20*=20!38=20=E4=BF=AE=E5=A4=8D=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=9C=AA=E8=BF=87=E6=BB=A4=20*=20Merge=20bra?= =?UTF-8?q?nch=20'master'=20of=20https://gitee.com/koogua/course-tencent-c?= =?UTF-8?q?loud=E2=80=A6=20*=20v1.2.0=E9=98=B6=E6=AE=B5=E6=80=A7=E5=90=88?= =?UTF-8?q?=E5=B9=B6=20(#11)=20*=20Merge=20pull=20request=20#10=20from=20x?= =?UTF-8?q?iaochong0302/develop=20*=20Merge=20pull=20request=20#8=20from?= =?UTF-8?q?=20xiaochong0302/develop=20*=20Merge=20pull=20request=20#5=20fr?= =?UTF-8?q?om=20xiaochong0302/develop=20*=20Merge=20pull=20request=20#3=20?= =?UTF-8?q?from=20xiaochong0302/develop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Home/Controllers/ConnectController.php | 8 +++++--- app/Services/OAuth/QQ.php | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/Http/Home/Controllers/ConnectController.php b/app/Http/Home/Controllers/ConnectController.php index 10c11e4c..708e3e81 100644 --- a/app/Http/Home/Controllers/ConnectController.php +++ b/app/Http/Home/Controllers/ConnectController.php @@ -117,11 +117,13 @@ class ConnectController extends Controller $openUser = $service->getOpenUserInfo($code, $state, $provider); $connect = $service->getConnectRelation($openUser['id'], $openUser['provider']); - if ($connect) { - if ($this->authUser->id > 0) { + if ($this->authUser->id > 0) { + if ($openUser) { $service->bindUser($openUser); return $this->response->redirect(['for' => 'home.uc.account']); - } else { + } + } else { + if ($connect && $connect->deleted == 0) { $service->authLogin($connect); return $this->response->redirect(['for' => 'home.index']); } diff --git a/app/Services/OAuth/QQ.php b/app/Services/OAuth/QQ.php index 2c59f144..4e2ba114 100644 --- a/app/Services/OAuth/QQ.php +++ b/app/Services/OAuth/QQ.php @@ -36,7 +36,7 @@ class QQ extends OAuth 'grant_type' => 'authorization_code', ]; - $response = $this->httpPost(self::ACCESS_TOKEN_URL, $params); + $response = $this->httpGet(self::ACCESS_TOKEN_URL, $params); $this->accessToken = $this->parseAccessToken($response); -- Gitee From 93411464c5b62aa43e0da85b6b0876e3b3bdf152 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 12 Dec 2020 17:01:49 +0800 Subject: [PATCH 03/89] =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=9F=BA=E6=9C=AC=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Admin/Controllers/Controller.php | 11 - .../Admin/Controllers/SettingController.php | 25 + app/Http/Admin/Services/AuthNode.php | 6 + app/Http/Admin/Services/Setting.php | 18 +- app/Http/Admin/Views/setting/wechat.volt | 16 + app/Http/Admin/Views/setting/wechat_oa.volt | 53 + app/Http/Admin/Views/templates/main.volt | 6 - .../WeChatOfficialAccountController.php | 40 + .../Home/Services/WeChatOfficialAccount.php | 17 + app/Models/WeChatSubscribe.php | 79 + app/Services/WeChat.php | 59 + composer.json | 3 +- composer.lock | 1372 ++++++++++++----- 13 files changed, 1311 insertions(+), 394 deletions(-) create mode 100644 app/Http/Admin/Views/setting/wechat.volt create mode 100644 app/Http/Admin/Views/setting/wechat_oa.volt create mode 100644 app/Http/Home/Controllers/WeChatOfficialAccountController.php create mode 100644 app/Http/Home/Services/WeChatOfficialAccount.php create mode 100644 app/Models/WeChatSubscribe.php create mode 100644 app/Services/WeChat.php diff --git a/app/Http/Admin/Controllers/Controller.php b/app/Http/Admin/Controllers/Controller.php index 25899d50..058bfa77 100644 --- a/app/Http/Admin/Controllers/Controller.php +++ b/app/Http/Admin/Controllers/Controller.php @@ -21,17 +21,6 @@ class Controller extends \Phalcon\Mvc\Controller public function beforeExecuteRoute(Dispatcher $dispatcher) { - /** - * demo分支拒绝数据提交 - */ - if ($this->isNotSafeRequest()) { - $dispatcher->forward([ - 'controller' => 'public', - 'action' => 'forbidden', - ]); - return false; - } - if ($this->isNotSafeRequest()) { $this->checkHttpReferer(); $this->checkCsrfToken(); diff --git a/app/Http/Admin/Controllers/SettingController.php b/app/Http/Admin/Controllers/SettingController.php index 71e41fc0..7452c717 100644 --- a/app/Http/Admin/Controllers/SettingController.php +++ b/app/Http/Admin/Controllers/SettingController.php @@ -327,4 +327,29 @@ class SettingController extends Controller } } + /** + * @Route("/wechat", name="admin.setting.wechat") + */ + public function wechatAction() + { + $settingService = new SettingService(); + + if ($this->request->isPost()) { + + $section = $this->request->getPost('section', 'string'); + + $data = $this->request->getPost(); + + $settingService->updateSettings($section, $data); + + return $this->jsonSuccess(['msg' => '更新配置成功']); + + } else { + + $oa = $settingService->getWeChatOASettings(); + + $this->view->setVar('oa', $oa); + } + } + } diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 427c9924..52d6bf1e 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -750,6 +750,12 @@ class AuthNode extends Service 'type' => 'menu', 'route' => 'admin.setting.oauth', ], + [ + 'id' => '5-1-13', + 'title' => '微信公众平台', + 'type' => 'menu', + 'route' => 'admin.setting.wechat', + ], ], ], ], diff --git a/app/Http/Admin/Services/Setting.php b/app/Http/Admin/Services/Setting.php index d6d46164..3b744ad8 100644 --- a/app/Http/Admin/Services/Setting.php +++ b/app/Http/Admin/Services/Setting.php @@ -57,6 +57,16 @@ class Setting extends Service return $wxpay; } + public function getWeChatOASettings() + { + $oa = $this->getSettings('wechat.oa'); + + $oa['auth_url'] = $oa['auth_url'] ?: kg_full_url(['for' => 'home.wechat.oa.auth_callback']); + $oa['notify_url'] = $oa['notify_url'] ?: kg_full_url(['for' => 'home.wechat.oa.notify_callback']); + + return $oa; + } + public function getVipSettings() { $vipRepo = new VipRepo(); @@ -87,16 +97,8 @@ class Setting extends Service $result = []; - /** - * demo分支过滤敏感数据 - */ if ($items->count() > 0) { foreach ($items as $item) { - $case1 = preg_match('/(id|auth|key|secret|password|pwd)$/', $item->item_key); - $case2 = $this->dispatcher->getControllerName() == 'setting'; - if ($case1 && $case2) { - $item->item_value = '***'; - } $result[$item->item_key] = $item->item_value; } } diff --git a/app/Http/Admin/Views/setting/wechat.volt b/app/Http/Admin/Views/setting/wechat.volt new file mode 100644 index 00000000..a37d7091 --- /dev/null +++ b/app/Http/Admin/Views/setting/wechat.volt @@ -0,0 +1,16 @@ +{% extends 'templates/main.volt' %} + +{% block content %} + +
+
    +
  • 公众号
  • +
+
+
+ {{ partial('setting/wechat_oa') }} +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/app/Http/Admin/Views/setting/wechat_oa.volt b/app/Http/Admin/Views/setting/wechat_oa.volt new file mode 100644 index 00000000..c430775b --- /dev/null +++ b/app/Http/Admin/Views/setting/wechat_oa.volt @@ -0,0 +1,53 @@ +
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + + +
+
+
\ No newline at end of file diff --git a/app/Http/Admin/Views/templates/main.volt b/app/Http/Admin/Views/templates/main.volt index 8803b2a0..6b70ff60 100644 --- a/app/Http/Admin/Views/templates/main.volt +++ b/app/Http/Admin/Views/templates/main.volt @@ -23,11 +23,5 @@ {% block include_js %}{% endblock %} {% block inline_js %}{% endblock %} -{% set site = setting('site') %} - -{% if site['analytics_enabled'] == 1 %} - {{ site['analytics_script'] }} -{% endif %} - \ No newline at end of file diff --git a/app/Http/Home/Controllers/WeChatOfficialAccountController.php b/app/Http/Home/Controllers/WeChatOfficialAccountController.php new file mode 100644 index 00000000..e62bddc9 --- /dev/null +++ b/app/Http/Home/Controllers/WeChatOfficialAccountController.php @@ -0,0 +1,40 @@ +getOfficialAccount(); + + $response = $app->server->serve(); + + $response->send(); + + exit; + } + + /** + * @Post("/notify", name="home.wechat.oa.notify") + */ + public function notifyAction() + { + + } + +} diff --git a/app/Http/Home/Services/WeChatOfficialAccount.php b/app/Http/Home/Services/WeChatOfficialAccount.php new file mode 100644 index 00000000..a6173e16 --- /dev/null +++ b/app/Http/Home/Services/WeChatOfficialAccount.php @@ -0,0 +1,17 @@ +getOfficialAccount(); + } + +} diff --git a/app/Models/WeChatSubscribe.php b/app/Models/WeChatSubscribe.php new file mode 100644 index 00000000..f1ce2201 --- /dev/null +++ b/app/Models/WeChatSubscribe.php @@ -0,0 +1,79 @@ +addBehavior( + new SoftDelete([ + 'field' => 'deleted', + 'value' => 1, + ]) + ); + } + + public function beforeCreate() + { + $this->create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} diff --git a/app/Services/WeChat.php b/app/Services/WeChat.php new file mode 100644 index 00000000..55f5ba9d --- /dev/null +++ b/app/Services/WeChat.php @@ -0,0 +1,59 @@ +logger = $this->getLogger('wechat'); + } + + public function getOfficialAccount() + { + $settings = $this->getSettings('wechat.oa'); + + $config = [ + 'app_id' => $settings['app_id'], + 'secret' => $settings['app_secret'], + 'token' => $settings['app_token'], + 'aes_key' => $settings['aes_key'], + 'log' => $this->getLogOptions(), + ]; + + return Factory::officialAccount($config); + } + + protected function getLogOptions() + { + $config = $this->getConfig(); + + $default = $config->get('env') == ENV_DEV ? 'dev' : 'prod'; + + return [ + 'default' => $default, + 'channels' => [ + 'dev' => [ + 'driver' => 'daily', + 'path' => log_path('wechat.log'), + 'level' => 'debug', + ], + 'prod' => [ + 'driver' => 'daily', + 'path' => log_path('wechat.log'), + 'level' => 'info', + ], + ] + ]; + } + +} diff --git a/composer.json b/composer.json index bcd0e1cc..fe283e37 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,8 @@ "aferrandini/phpqrcode": "1.0.1", "xiaochong0302/ip2region": "^1.0", "robmorgan/phinx": "^0.12", - "lcobucci/jwt": "^3.3" + "lcobucci/jwt": "^3.3", + "overtrue/wechat": "^4.2" }, "require-dev": { "odan/phinx-migrations-generator": "^5.1", diff --git a/composer.lock b/composer.lock index 02109891..d6cb71b6 100644 --- a/composer.lock +++ b/composer.lock @@ -1,20 +1,20 @@ { - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "cce345a8509cd31ff8492310a2a2332a", - "packages": [ - { - "name": "aferrandini/phpqrcode", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/aferrandini/PHPQRCode.git", - "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46" - }, - "dist": { + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "60ff0e1868be7414a1b31d397ced7fbd", + "packages": [ + { + "name": "aferrandini/phpqrcode", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/aferrandini/PHPQRCode.git", + "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46" + }, + "dist": { "type": "zip", "url": "https://api.github.com/repos/aferrandini/PHPQRCode/zipball/3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", @@ -25,27 +25,27 @@ "preferred": true } ] - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "PHPQRCode": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ariel Ferrandini", - "email": "arielferrandini@gmail.com", - "homepage": "http://www.ferrandini.com/", - "role": "Developer" - } + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "PHPQRCode": "lib/" + } + }, + "notification-url": "https://packagist.jp/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ariel Ferrandini", + "email": "arielferrandini@gmail.com", + "homepage": "http://www.ferrandini.com/", + "role": "Developer" + } ], "description": "PHPQRCode porting and changed for PHP 5.3 compatibility", "homepage": "https://github.com/aferrandini/PHPQRCode", @@ -344,26 +344,80 @@ ], "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "time": "2019-07-30T19:33:28+00:00" + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2019-07-30T19:33:28+00:00" }, + { + "name": "easywechat-composer/easywechat-composer", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/mingyoung/easywechat-composer.git", + "reference": "93cfce1ec842b9a5b1b0791a52afd18b833f114a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mingyoung/easywechat-composer/zipball/93cfce1ec842b9a5b1b0791a52afd18b833f114a", + "reference": "93cfce1ec842b9a5b1b0791a52afd18b833f114a", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=7.0" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0", + "phpunit/phpunit": "^6.5 || ^7.0" + }, + "type": "composer-plugin", + "extra": { + "class": "EasyWeChatComposer\\Plugin" + }, + "autoload": { + "psr-4": { + "EasyWeChatComposer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "name": "egulias/email-validator", - "version": "2.1.11", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92dd169c32f6f55ba570c309d83f5209cefb5e23", + "name": "张铭阳", + "email": "mingyoungcheung@gmail.com" + } + ], + "description": "The composer plugin for EasyWeChat", + "support": { + "issues": "https://github.com/mingyoung/easywechat-composer/issues", + "source": "https://github.com/mingyoung/easywechat-composer/tree/1.4.0" + }, + "time": "2020-07-23T11:06:47+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.11", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92dd169c32f6f55ba570c309d83f5209cefb5e23", "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23", "shasum": "", "mirrors": [ @@ -1022,25 +1076,172 @@ "homepage": "https://github.com/mtdowling" } ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "abandoned": "dragonmantank/cron-expression", - "time": "2017-01-23T04:29:33+00:00" + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "abandoned": "dragonmantank/cron-expression", + "time": "2017-01-23T04:29:33+00:00" + }, + { + "name": "overtrue/socialite", + "version": "2.0.22", + "source": { + "type": "git", + "url": "https://github.com/overtrue/socialite.git", + "reference": "0ce3285293026a639de317a70b01eeef051e9962" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overtrue/socialite/zipball/0ce3285293026a639de317a70b01eeef051e9962", + "reference": "0ce3285293026a639de317a70b01eeef051e9962", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^5.0|^6.0|^7.0", + "php": ">=5.6", + "symfony/http-foundation": "^2.7|^3.0|^4.0|^5.0" + }, + "conflict": { + "socialiteproviders/weixin": "*" + }, + "require-dev": { + "mockery/mockery": "~1.2", + "phpunit/phpunit": "~6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Overtrue\\Socialite\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.", + "keywords": [ + "login", + "oauth", + "qq", + "social", + "wechat", + "weibo" + ], + "support": { + "issues": "https://github.com/overtrue/socialite/issues", + "source": "https://github.com/overtrue/socialite/tree/2.0.22" + }, + "funding": [ + { + "url": "https://www.patreon.com/overtrue", + "type": "patreon" + } + ], + "time": "2020-11-12T23:23:15+00:00" + }, + { + "name": "overtrue/wechat", + "version": "4.3.3", + "source": { + "type": "git", + "url": "https://github.com/w7corp/easywechat.git", + "reference": "121607188e1cb1039a5ea0f49bcec011cb44dbdd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/w7corp/easywechat/zipball/121607188e1cb1039a5ea0f49bcec011cb44dbdd", + "reference": "121607188e1cb1039a5ea0f49bcec011cb44dbdd", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "easywechat-composer/easywechat-composer": "^1.1", + "ext-fileinfo": "*", + "ext-openssl": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.2 || ^7.0", + "monolog/monolog": "^1.22 || ^2.0", + "overtrue/socialite": "~2.0", + "php": ">=7.2", + "pimple/pimple": "^3.0", + "psr/simple-cache": "^1.0", + "symfony/cache": "^3.3 || ^4.3 || ^5.0", + "symfony/event-dispatcher": "^4.3 || ^5.0", + "symfony/http-foundation": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/psr-http-message-bridge": "^0.3 || ^1.0 || ^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.15", + "mikey179/vfsstream": "^1.6", + "mockery/mockery": "^1.2.3", + "phpstan/phpstan": "^0.12.0", + "phpunit/phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "EasyWeChat\\": "src/" }, + "files": [ + "src/Kernel/Support/Helpers.php", + "src/Kernel/Helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "name": "paragonie/random_compat", - "version": "v9.99.99", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "微信SDK", + "keywords": [ + "easywechat", + "sdk", + "wechat", + "weixin", + "weixin-sdk" + ], + "support": { + "issues": "https://github.com/w7corp/easywechat/issues", + "source": "https://github.com/w7corp/easywechat/tree/4.3.3" + }, + "time": "2020-12-07T08:20:11+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "shasum": "", "mirrors": [ @@ -1208,26 +1409,85 @@ "homepage": "https://github.com/phalcon/incubator/graphs/contributors" } ], - "description": "Adapters, prototypes or functionality that can be potentially incorporated to the C-framework.", - "homepage": "https://phalconphp.com", - "keywords": [ - "framework", - "incubator", - "phalcon" - ], - "time": "2019-09-16T13:54:24+00:00" + "description": "Adapters, prototypes or functionality that can be potentially incorporated to the C-framework.", + "homepage": "https://phalconphp.com", + "keywords": [ + "framework", + "incubator", + "phalcon" + ], + "time": "2019-09-16T13:54:24+00:00" }, + { + "name": "pimple/pimple", + "version": "v3.3.1", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "21e45061c3429b1e06233475cc0e1f6fc774d5b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/21e45061c3429b1e06233475cc0e1f6fc774d5b0", + "reference": "21e45061c3429b1e06233475cc0e1f6fc774d5b0", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.3.1" + }, + "time": "2020-11-24T20:35:42+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "", "mirrors": [ @@ -1457,27 +1717,27 @@ "php": ">=5.3.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.jp/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", "keywords": [ "cache", "caching", @@ -1775,26 +2035,212 @@ "email": "fabien@symfony.com" } ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "https://swiftmailer.symfony.com", - "keywords": [ - "email", - "mail", - "mailer" - ], - "time": "2019-04-21T09:21:45+00:00" + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2019-04-21T09:21:45+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", + "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "~1.0", + "psr/log": "^1.1", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "conflict": { + "doctrine/dbal": "<2.10", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0", + "symfony/cache-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6", + "doctrine/dbal": "^2.10|^3.0", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "name": "symfony/config", - "version": "v5.1.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/cf63f0613a6c6918e96db39c07a43b01e19a0773", + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v5.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-11-21T09:39:55+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/8034ca0b61d4dd967f3698aaa1da2507b631d0cb", + "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" + }, + { + "name": "symfony/config", + "version": "v5.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/cf63f0613a6c6918e96db39c07a43b01e19a0773", "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773", "shasum": "", "mirrors": [ @@ -1967,33 +2413,33 @@ ], "time": "2020-07-06T13:18:39+00:00" }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.1.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5e20b83385a77593259c9f8beb2c43cd03b2ac14", - "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.2-dev" }, "thanks": { "name": "symfony/contracts", @@ -2035,31 +2481,31 @@ "type": "tidelift" } ], - "time": "2020-06-06T08:49:21+00:00" + "time": "2020-09-07T11:33:47+00:00" }, - { - "name": "symfony/event-dispatcher", - "version": "v4.3.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "429d0a1451d4c9c4abe1959b2986b88794b9b7d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/429d0a1451d4c9c4abe1959b2986b88794b9b7d2", - "reference": "429d0a1451d4c9c4abe1959b2986b88794b9b7d2", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/event-dispatcher", + "version": "v4.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "f029d6f21eac61ab23198e7aca40e7638e8c8924" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f029d6f21eac61ab23198e7aca40e7638e8c8924", + "reference": "f029d6f21eac61ab23198e7aca40e7638e8c8924", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { - "php": "^7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" }, "conflict": { "symfony/dependency-injection": "<3.4" @@ -2069,24 +2515,20 @@ "symfony/event-dispatcher-implementation": "1.1" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/expression-language": "~3.4|~4.0", - "symfony/http-foundation": "^3.4|^4.0", - "symfony/service-contracts": "^1.1", - "symfony/stopwatch": "~3.4|~4.0" + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/dependency-injection": "", "symfony/http-kernel": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.3-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" @@ -2101,40 +2543,54 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2019-08-26T08:55:16+00:00" + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "c61766f4440ca687de1084a5c00b08e167a2575c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c61766f4440ca687de1084a5c00b08e167a2575c", - "reference": "c61766f4440ca687de1084a5c00b08e167a2575c", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-31T22:44:29+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "suggest": { "psr/event-dispatcher": "", @@ -2142,9 +2598,13 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } + "branch-alias": { + "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } }, "autoload": { "psr-4": { @@ -2165,18 +2625,32 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2019-06-20T06:46:26+00:00" + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:19:58+00:00" + }, { "name": "symfony/filesystem", "version": "v5.1.3", @@ -2247,26 +2721,26 @@ ], "time": "2020-05-30T20:35:19+00:00" }, - { - "name": "symfony/http-foundation", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "6cca6b2e4b69fc5bace160d14cf1ee5f71483db4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6cca6b2e4b69fc5bace160d14cf1ee5f71483db4", - "reference": "6cca6b2e4b69fc5bace160d14cf1ee5f71483db4", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/http-foundation", + "version": "v5.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e4576271ee99123aa59a40564c7b5405f0ebd1e6", + "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", @@ -2283,11 +2757,6 @@ "symfony/mime": "To use the file extension guesser" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" @@ -2326,7 +2795,7 @@ "type": "tidelift" } ], - "time": "2020-09-13T05:01:27+00:00" + "time": "2020-11-27T06:13:25+00:00" }, { "name": "symfony/polyfill-ctype", @@ -2653,28 +3122,28 @@ ], "time": "2020-07-14T12:35:20+00:00" }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-mbstring": "For best performance" @@ -2682,7 +3151,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.18-dev" + "dev-main": "1.20-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2734,7 +3203,7 @@ "type": "tidelift" } ], - "time": "2020-07-14T12:35:20+00:00" + "time": "2020-10-23T14:02:19+00:00" }, { "name": "symfony/polyfill-php70", @@ -2980,33 +3449,33 @@ ], "time": "2020-07-14T12:35:20+00:00" }, - { - "name": "symfony/polyfill-php80", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/polyfill-php80", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { - "php": ">=7.0.8" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.18-dev" + "dev-main": "1.20-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3055,37 +3524,125 @@ "url": "https://symfony.com/sponsor", "type": "custom" }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-14T12:35:20+00:00" + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "51a21cb3ba3927d4b4bf8f25cc55763351af5f2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/51a21cb3ba3927d4b4bf8f25cc55763351af5f2e", + "reference": "51a21cb3ba3927d4b4bf8f25cc55763351af5f2e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "symfony/phpunit-bridge": "^4.4 || ^5.0" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "name": "symfony/service-contracts", - "version": "v2.1.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/58c7475e5457c5492c26cc740cc0ad7464be9442", - "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-29T08:17:46+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { "php": ">=7.2.5", "psr/container": "^1.0" @@ -3096,7 +3653,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.2-dev" }, "thanks": { "name": "symfony/contracts", @@ -3137,26 +3694,105 @@ "url": "https://symfony.com/sponsor", "type": "custom" }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-06T13:23:11+00:00" + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v5.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "fbc3507f23d263d75417e09a12d77c009f39676c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/fbc3507f23d263d75417e09a12d77c009f39676c", + "reference": "fbc3507f23d263d75417e09a12d77c009f39676c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "symfony/var-dumper": "^4.4.9|^5.0.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "name": "tencentcloud/tencentcloud-sdk-php", - "version": "3.0.251", - "source": { - "type": "git", - "url": "https://github.com/TencentCloud/tencentcloud-sdk-php.git", - "reference": "a3b3054262e48776e8014d5e385a8932b0102f29" - }, - "dist": { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v5.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-28T21:31:18+00:00" + }, + { + "name": "tencentcloud/tencentcloud-sdk-php", + "version": "3.0.251", + "source": { + "type": "git", + "url": "https://github.com/TencentCloud/tencentcloud-sdk-php.git", + "reference": "a3b3054262e48776e8014d5e385a8932b0102f29" + }, + "dist": { "type": "zip", "url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/a3b3054262e48776e8014d5e385a8932b0102f29", "reference": "a3b3054262e48776e8014d5e385a8932b0102f29", @@ -3630,27 +4266,27 @@ "reference": "65144f2b0fad32b182ccb062b1efc1b4edea5d44", "shasum": "", "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } ] }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Phalcon Team", - "email": "team@phalconphp.com", - "homepage": "https://phalconphp.com/en/team" - }, - { + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "notification-url": "https://packagist.jp/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Phalcon Team", + "email": "team@phalconphp.com", + "homepage": "https://phalconphp.com/en/team" + }, + { "name": "Contributors", "homepage": "https://github.com/phalcon/ide-stubs/graphs/contributors" } @@ -3741,5 +4377,5 @@ "ext-fileinfo": "*" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.0.0" } -- Gitee From 9bde62e50470cc8d6bdf543a86a964b807994b72 Mon Sep 17 00:00:00 2001 From: koogua Date: Sat, 12 Dec 2020 17:04:50 +0800 Subject: [PATCH 04/89] =?UTF-8?q?=E5=9B=9E=E9=80=80=20'Pull=20Request=20!4?= =?UTF-8?q?8=20:=20=E5=85=AC=E4=BC=97=E5=A5=BD=E5=8A=9F=E8=83=BD=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E6=A1=86=E6=9E=B6'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Admin/Controllers/Controller.php | 11 + .../Admin/Controllers/SettingController.php | 25 - app/Http/Admin/Services/AuthNode.php | 6 - app/Http/Admin/Services/Setting.php | 18 +- app/Http/Admin/Views/setting/wechat.volt | 16 - app/Http/Admin/Views/setting/wechat_oa.volt | 53 - app/Http/Admin/Views/templates/main.volt | 6 + .../WeChatOfficialAccountController.php | 40 - .../Home/Services/WeChatOfficialAccount.php | 17 - app/Models/WeChatSubscribe.php | 79 - app/Services/WeChat.php | 59 - composer.json | 3 +- composer.lock | 1372 +++++------------ 13 files changed, 394 insertions(+), 1311 deletions(-) delete mode 100644 app/Http/Admin/Views/setting/wechat.volt delete mode 100644 app/Http/Admin/Views/setting/wechat_oa.volt delete mode 100644 app/Http/Home/Controllers/WeChatOfficialAccountController.php delete mode 100644 app/Http/Home/Services/WeChatOfficialAccount.php delete mode 100644 app/Models/WeChatSubscribe.php delete mode 100644 app/Services/WeChat.php diff --git a/app/Http/Admin/Controllers/Controller.php b/app/Http/Admin/Controllers/Controller.php index 058bfa77..25899d50 100644 --- a/app/Http/Admin/Controllers/Controller.php +++ b/app/Http/Admin/Controllers/Controller.php @@ -21,6 +21,17 @@ class Controller extends \Phalcon\Mvc\Controller public function beforeExecuteRoute(Dispatcher $dispatcher) { + /** + * demo分支拒绝数据提交 + */ + if ($this->isNotSafeRequest()) { + $dispatcher->forward([ + 'controller' => 'public', + 'action' => 'forbidden', + ]); + return false; + } + if ($this->isNotSafeRequest()) { $this->checkHttpReferer(); $this->checkCsrfToken(); diff --git a/app/Http/Admin/Controllers/SettingController.php b/app/Http/Admin/Controllers/SettingController.php index 7452c717..71e41fc0 100644 --- a/app/Http/Admin/Controllers/SettingController.php +++ b/app/Http/Admin/Controllers/SettingController.php @@ -327,29 +327,4 @@ class SettingController extends Controller } } - /** - * @Route("/wechat", name="admin.setting.wechat") - */ - public function wechatAction() - { - $settingService = new SettingService(); - - if ($this->request->isPost()) { - - $section = $this->request->getPost('section', 'string'); - - $data = $this->request->getPost(); - - $settingService->updateSettings($section, $data); - - return $this->jsonSuccess(['msg' => '更新配置成功']); - - } else { - - $oa = $settingService->getWeChatOASettings(); - - $this->view->setVar('oa', $oa); - } - } - } diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 52d6bf1e..427c9924 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -750,12 +750,6 @@ class AuthNode extends Service 'type' => 'menu', 'route' => 'admin.setting.oauth', ], - [ - 'id' => '5-1-13', - 'title' => '微信公众平台', - 'type' => 'menu', - 'route' => 'admin.setting.wechat', - ], ], ], ], diff --git a/app/Http/Admin/Services/Setting.php b/app/Http/Admin/Services/Setting.php index 3b744ad8..d6d46164 100644 --- a/app/Http/Admin/Services/Setting.php +++ b/app/Http/Admin/Services/Setting.php @@ -57,16 +57,6 @@ class Setting extends Service return $wxpay; } - public function getWeChatOASettings() - { - $oa = $this->getSettings('wechat.oa'); - - $oa['auth_url'] = $oa['auth_url'] ?: kg_full_url(['for' => 'home.wechat.oa.auth_callback']); - $oa['notify_url'] = $oa['notify_url'] ?: kg_full_url(['for' => 'home.wechat.oa.notify_callback']); - - return $oa; - } - public function getVipSettings() { $vipRepo = new VipRepo(); @@ -97,8 +87,16 @@ class Setting extends Service $result = []; + /** + * demo分支过滤敏感数据 + */ if ($items->count() > 0) { foreach ($items as $item) { + $case1 = preg_match('/(id|auth|key|secret|password|pwd)$/', $item->item_key); + $case2 = $this->dispatcher->getControllerName() == 'setting'; + if ($case1 && $case2) { + $item->item_value = '***'; + } $result[$item->item_key] = $item->item_value; } } diff --git a/app/Http/Admin/Views/setting/wechat.volt b/app/Http/Admin/Views/setting/wechat.volt deleted file mode 100644 index a37d7091..00000000 --- a/app/Http/Admin/Views/setting/wechat.volt +++ /dev/null @@ -1,16 +0,0 @@ -{% extends 'templates/main.volt' %} - -{% block content %} - -
-
    -
  • 公众号
  • -
-
-
- {{ partial('setting/wechat_oa') }} -
-
-
- -{% endblock %} \ No newline at end of file diff --git a/app/Http/Admin/Views/setting/wechat_oa.volt b/app/Http/Admin/Views/setting/wechat_oa.volt deleted file mode 100644 index c430775b..00000000 --- a/app/Http/Admin/Views/setting/wechat_oa.volt +++ /dev/null @@ -1,53 +0,0 @@ -
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- - - -
-
-
\ No newline at end of file diff --git a/app/Http/Admin/Views/templates/main.volt b/app/Http/Admin/Views/templates/main.volt index 6b70ff60..8803b2a0 100644 --- a/app/Http/Admin/Views/templates/main.volt +++ b/app/Http/Admin/Views/templates/main.volt @@ -23,5 +23,11 @@ {% block include_js %}{% endblock %} {% block inline_js %}{% endblock %} +{% set site = setting('site') %} + +{% if site['analytics_enabled'] == 1 %} + {{ site['analytics_script'] }} +{% endif %} + \ No newline at end of file diff --git a/app/Http/Home/Controllers/WeChatOfficialAccountController.php b/app/Http/Home/Controllers/WeChatOfficialAccountController.php deleted file mode 100644 index e62bddc9..00000000 --- a/app/Http/Home/Controllers/WeChatOfficialAccountController.php +++ /dev/null @@ -1,40 +0,0 @@ -getOfficialAccount(); - - $response = $app->server->serve(); - - $response->send(); - - exit; - } - - /** - * @Post("/notify", name="home.wechat.oa.notify") - */ - public function notifyAction() - { - - } - -} diff --git a/app/Http/Home/Services/WeChatOfficialAccount.php b/app/Http/Home/Services/WeChatOfficialAccount.php deleted file mode 100644 index a6173e16..00000000 --- a/app/Http/Home/Services/WeChatOfficialAccount.php +++ /dev/null @@ -1,17 +0,0 @@ -getOfficialAccount(); - } - -} diff --git a/app/Models/WeChatSubscribe.php b/app/Models/WeChatSubscribe.php deleted file mode 100644 index f1ce2201..00000000 --- a/app/Models/WeChatSubscribe.php +++ /dev/null @@ -1,79 +0,0 @@ -addBehavior( - new SoftDelete([ - 'field' => 'deleted', - 'value' => 1, - ]) - ); - } - - public function beforeCreate() - { - $this->create_time = time(); - } - - public function beforeUpdate() - { - $this->update_time = time(); - } - -} diff --git a/app/Services/WeChat.php b/app/Services/WeChat.php deleted file mode 100644 index 55f5ba9d..00000000 --- a/app/Services/WeChat.php +++ /dev/null @@ -1,59 +0,0 @@ -logger = $this->getLogger('wechat'); - } - - public function getOfficialAccount() - { - $settings = $this->getSettings('wechat.oa'); - - $config = [ - 'app_id' => $settings['app_id'], - 'secret' => $settings['app_secret'], - 'token' => $settings['app_token'], - 'aes_key' => $settings['aes_key'], - 'log' => $this->getLogOptions(), - ]; - - return Factory::officialAccount($config); - } - - protected function getLogOptions() - { - $config = $this->getConfig(); - - $default = $config->get('env') == ENV_DEV ? 'dev' : 'prod'; - - return [ - 'default' => $default, - 'channels' => [ - 'dev' => [ - 'driver' => 'daily', - 'path' => log_path('wechat.log'), - 'level' => 'debug', - ], - 'prod' => [ - 'driver' => 'daily', - 'path' => log_path('wechat.log'), - 'level' => 'info', - ], - ] - ]; - } - -} diff --git a/composer.json b/composer.json index fe283e37..bcd0e1cc 100644 --- a/composer.json +++ b/composer.json @@ -20,8 +20,7 @@ "aferrandini/phpqrcode": "1.0.1", "xiaochong0302/ip2region": "^1.0", "robmorgan/phinx": "^0.12", - "lcobucci/jwt": "^3.3", - "overtrue/wechat": "^4.2" + "lcobucci/jwt": "^3.3" }, "require-dev": { "odan/phinx-migrations-generator": "^5.1", diff --git a/composer.lock b/composer.lock index d6cb71b6..02109891 100644 --- a/composer.lock +++ b/composer.lock @@ -1,20 +1,20 @@ { - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "60ff0e1868be7414a1b31d397ced7fbd", - "packages": [ - { - "name": "aferrandini/phpqrcode", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/aferrandini/PHPQRCode.git", - "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46" - }, - "dist": { + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "cce345a8509cd31ff8492310a2a2332a", + "packages": [ + { + "name": "aferrandini/phpqrcode", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/aferrandini/PHPQRCode.git", + "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46" + }, + "dist": { "type": "zip", "url": "https://api.github.com/repos/aferrandini/PHPQRCode/zipball/3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", @@ -25,27 +25,27 @@ "preferred": true } ] - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "PHPQRCode": "lib/" - } - }, - "notification-url": "https://packagist.jp/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ariel Ferrandini", - "email": "arielferrandini@gmail.com", - "homepage": "http://www.ferrandini.com/", - "role": "Developer" - } + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "PHPQRCode": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ariel Ferrandini", + "email": "arielferrandini@gmail.com", + "homepage": "http://www.ferrandini.com/", + "role": "Developer" + } ], "description": "PHPQRCode porting and changed for PHP 5.3 compatibility", "homepage": "https://github.com/aferrandini/PHPQRCode", @@ -344,80 +344,26 @@ ], "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "time": "2019-07-30T19:33:28+00:00" + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2019-07-30T19:33:28+00:00" }, - { - "name": "easywechat-composer/easywechat-composer", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/mingyoung/easywechat-composer.git", - "reference": "93cfce1ec842b9a5b1b0791a52afd18b833f114a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mingyoung/easywechat-composer/zipball/93cfce1ec842b9a5b1b0791a52afd18b833f114a", - "reference": "93cfce1ec842b9a5b1b0791a52afd18b833f114a", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=7.0" - }, - "require-dev": { - "composer/composer": "^1.0 || ^2.0", - "phpunit/phpunit": "^6.5 || ^7.0" - }, - "type": "composer-plugin", - "extra": { - "class": "EasyWeChatComposer\\Plugin" - }, - "autoload": { - "psr-4": { - "EasyWeChatComposer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ { - "name": "张铭阳", - "email": "mingyoungcheung@gmail.com" - } - ], - "description": "The composer plugin for EasyWeChat", - "support": { - "issues": "https://github.com/mingyoung/easywechat-composer/issues", - "source": "https://github.com/mingyoung/easywechat-composer/tree/1.4.0" - }, - "time": "2020-07-23T11:06:47+00:00" - }, - { - "name": "egulias/email-validator", - "version": "2.1.11", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92dd169c32f6f55ba570c309d83f5209cefb5e23", + "name": "egulias/email-validator", + "version": "2.1.11", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92dd169c32f6f55ba570c309d83f5209cefb5e23", "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23", "shasum": "", "mirrors": [ @@ -1076,172 +1022,25 @@ "homepage": "https://github.com/mtdowling" } ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "abandoned": "dragonmantank/cron-expression", - "time": "2017-01-23T04:29:33+00:00" - }, - { - "name": "overtrue/socialite", - "version": "2.0.22", - "source": { - "type": "git", - "url": "https://github.com/overtrue/socialite.git", - "reference": "0ce3285293026a639de317a70b01eeef051e9962" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/overtrue/socialite/zipball/0ce3285293026a639de317a70b01eeef051e9962", - "reference": "0ce3285293026a639de317a70b01eeef051e9962", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "guzzlehttp/guzzle": "^5.0|^6.0|^7.0", - "php": ">=5.6", - "symfony/http-foundation": "^2.7|^3.0|^4.0|^5.0" - }, - "conflict": { - "socialiteproviders/weixin": "*" - }, - "require-dev": { - "mockery/mockery": "~1.2", - "phpunit/phpunit": "~6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Overtrue\\Socialite\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "overtrue", - "email": "anzhengchao@gmail.com" - } - ], - "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.", - "keywords": [ - "login", - "oauth", - "qq", - "social", - "wechat", - "weibo" - ], - "support": { - "issues": "https://github.com/overtrue/socialite/issues", - "source": "https://github.com/overtrue/socialite/tree/2.0.22" - }, - "funding": [ - { - "url": "https://www.patreon.com/overtrue", - "type": "patreon" - } - ], - "time": "2020-11-12T23:23:15+00:00" - }, - { - "name": "overtrue/wechat", - "version": "4.3.3", - "source": { - "type": "git", - "url": "https://github.com/w7corp/easywechat.git", - "reference": "121607188e1cb1039a5ea0f49bcec011cb44dbdd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/w7corp/easywechat/zipball/121607188e1cb1039a5ea0f49bcec011cb44dbdd", - "reference": "121607188e1cb1039a5ea0f49bcec011cb44dbdd", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "easywechat-composer/easywechat-composer": "^1.1", - "ext-fileinfo": "*", - "ext-openssl": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.2 || ^7.0", - "monolog/monolog": "^1.22 || ^2.0", - "overtrue/socialite": "~2.0", - "php": ">=7.2", - "pimple/pimple": "^3.0", - "psr/simple-cache": "^1.0", - "symfony/cache": "^3.3 || ^4.3 || ^5.0", - "symfony/event-dispatcher": "^4.3 || ^5.0", - "symfony/http-foundation": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/psr-http-message-bridge": "^0.3 || ^1.0 || ^2.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.15", - "mikey179/vfsstream": "^1.6", - "mockery/mockery": "^1.2.3", - "phpstan/phpstan": "^0.12.0", - "phpunit/phpunit": "^7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "EasyWeChat\\": "src/" + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "abandoned": "dragonmantank/cron-expression", + "time": "2017-01-23T04:29:33+00:00" }, - "files": [ - "src/Kernel/Support/Helpers.php", - "src/Kernel/Helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ { - "name": "overtrue", - "email": "anzhengchao@gmail.com" - } - ], - "description": "微信SDK", - "keywords": [ - "easywechat", - "sdk", - "wechat", - "weixin", - "weixin-sdk" - ], - "support": { - "issues": "https://github.com/w7corp/easywechat/issues", - "source": "https://github.com/w7corp/easywechat/tree/4.3.3" - }, - "time": "2020-12-07T08:20:11+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.99", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "shasum": "", "mirrors": [ @@ -1409,85 +1208,26 @@ "homepage": "https://github.com/phalcon/incubator/graphs/contributors" } ], - "description": "Adapters, prototypes or functionality that can be potentially incorporated to the C-framework.", - "homepage": "https://phalconphp.com", - "keywords": [ - "framework", - "incubator", - "phalcon" - ], - "time": "2019-09-16T13:54:24+00:00" + "description": "Adapters, prototypes or functionality that can be potentially incorporated to the C-framework.", + "homepage": "https://phalconphp.com", + "keywords": [ + "framework", + "incubator", + "phalcon" + ], + "time": "2019-09-16T13:54:24+00:00" }, - { - "name": "pimple/pimple", - "version": "v3.3.1", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "21e45061c3429b1e06233475cc0e1f6fc774d5b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/21e45061c3429b1e06233475cc0e1f6fc774d5b0", - "reference": "21e45061c3429b1e06233475cc0e1f6fc774d5b0", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev" - } - }, - "autoload": { - "psr-0": { - "Pimple": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Pimple, a simple Dependency Injection Container", - "homepage": "https://pimple.symfony.com", - "keywords": [ - "container", - "dependency injection" - ], - "support": { - "source": "https://github.com/silexphp/Pimple/tree/v3.3.1" - }, - "time": "2020-11-24T20:35:42+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "", "mirrors": [ @@ -1717,27 +1457,27 @@ "php": ">=5.3.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.jp/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", "keywords": [ "cache", "caching", @@ -2035,212 +1775,26 @@ "email": "fabien@symfony.com" } ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "https://swiftmailer.symfony.com", - "keywords": [ - "email", - "mail", - "mailer" - ], - "time": "2019-04-21T09:21:45+00:00" - }, - { - "name": "symfony/cache", - "version": "v5.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", - "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "~1.0", - "psr/log": "^1.1", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "conflict": { - "doctrine/dbal": "<2.10", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" - }, - "provide": { - "psr/cache-implementation": "1.0", - "psr/simple-cache-implementation": "1.0", - "symfony/cache-implementation": "1.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6", - "doctrine/dbal": "^2.10|^3.0", - "predis/predis": "^1.1", - "psr/simple-cache": "^1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/filesystem": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Cache component with PSR-6, PSR-16, and tags", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/v5.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-11-21T09:39:55+00:00" - }, - { - "name": "symfony/cache-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/8034ca0b61d4dd967f3698aaa1da2507b631d0cb", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0" - }, - "suggest": { - "symfony/cache-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Cache\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to caching", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2019-04-21T09:21:45+00:00" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/config", - "version": "v5.1.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/cf63f0613a6c6918e96db39c07a43b01e19a0773", + "name": "symfony/config", + "version": "v5.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/cf63f0613a6c6918e96db39c07a43b01e19a0773", "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773", "shasum": "", "mirrors": [ @@ -2413,33 +1967,33 @@ ], "time": "2020-07-06T13:18:39+00:00" }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5e20b83385a77593259c9f8beb2c43cd03b2ac14", + "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-master": "2.1-dev" }, "thanks": { "name": "symfony/contracts", @@ -2481,31 +2035,31 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2020-06-06T08:49:21+00:00" }, - { - "name": "symfony/event-dispatcher", - "version": "v4.4.17", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "f029d6f21eac61ab23198e7aca40e7638e8c8924" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f029d6f21eac61ab23198e7aca40e7638e8c8924", - "reference": "f029d6f21eac61ab23198e7aca40e7638e8c8924", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/event-dispatcher", + "version": "v4.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "429d0a1451d4c9c4abe1959b2986b88794b9b7d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/429d0a1451d4c9c4abe1959b2986b88794b9b7d2", + "reference": "429d0a1451d4c9c4abe1959b2986b88794b9b7d2", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" + "php": "^7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" }, "conflict": { "symfony/dependency-injection": "<3.4" @@ -2515,20 +2069,24 @@ "symfony/event-dispatcher-implementation": "1.1" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/error-handler": "~3.4|~4.4", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0" + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "^3.4|^4.0", + "symfony/service-contracts": "^1.1", + "symfony/stopwatch": "~3.4|~4.0" }, "suggest": { "symfony/dependency-injection": "", "symfony/http-kernel": "" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" @@ -2543,54 +2101,40 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2019-08-26T08:55:16+00:00" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-31T22:44:29+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "c61766f4440ca687de1084a5c00b08e167a2575c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c61766f4440ca687de1084a5c00b08e167a2575c", + "reference": "c61766f4440ca687de1084a5c00b08e167a2575c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { - "php": ">=7.1.3" + "php": "^7.1.3" }, "suggest": { "psr/event-dispatcher": "", @@ -2598,13 +2142,9 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "branch-alias": { + "dev-master": "1.1-dev" + } }, "autoload": { "psr-4": { @@ -2625,32 +2165,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-06-20T06:46:26+00:00" }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-06T13:19:58+00:00" - }, { "name": "symfony/filesystem", "version": "v5.1.3", @@ -2721,26 +2247,26 @@ ], "time": "2020-05-30T20:35:19+00:00" }, - { - "name": "symfony/http-foundation", - "version": "v5.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e4576271ee99123aa59a40564c7b5405f0ebd1e6", - "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/http-foundation", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "6cca6b2e4b69fc5bace160d14cf1ee5f71483db4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6cca6b2e4b69fc5bace160d14cf1ee5f71483db4", + "reference": "6cca6b2e4b69fc5bace160d14cf1ee5f71483db4", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", @@ -2757,6 +2283,11 @@ "symfony/mime": "To use the file extension guesser" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, "autoload": { "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" @@ -2795,7 +2326,7 @@ "type": "tidelift" } ], - "time": "2020-11-27T06:13:25+00:00" + "time": "2020-09-13T05:01:27+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3122,28 +2653,28 @@ ], "time": "2020-07-14T12:35:20+00:00" }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { - "php": ">=7.1" + "php": ">=5.3.3" }, "suggest": { "ext-mbstring": "For best performance" @@ -3151,7 +2682,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3203,7 +2734,7 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-php70", @@ -3449,33 +2980,33 @@ ], "time": "2020-07-14T12:35:20+00:00" }, - { - "name": "symfony/polyfill-php80", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "symfony/polyfill-php80", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { - "php": ">=7.1" + "php": ">=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3524,125 +3055,37 @@ "url": "https://symfony.com/sponsor", "type": "custom" }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/psr-http-message-bridge", - "version": "v2.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "51a21cb3ba3927d4b4bf8f25cc55763351af5f2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/51a21cb3ba3927d4b4bf8f25cc55763351af5f2e", - "reference": "51a21cb3ba3927d4b4bf8f25cc55763351af5f2e", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0", - "symfony/http-foundation": "^4.4 || ^5.0" - }, - "require-dev": { - "nyholm/psr7": "^1.1", - "symfony/phpunit-bridge": "^4.4 || ^5.0" - }, - "suggest": { - "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\PsrHttpMessage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "PSR HTTP message bridge", - "homepage": "http://symfony.com", - "keywords": [ - "http", - "http-message", - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.0.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-29T08:17:46+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + "name": "symfony/service-contracts", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/58c7475e5457c5492c26cc740cc0ad7464be9442", + "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { "php": ">=7.2.5", "psr/container": "^1.0" @@ -3653,7 +3096,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-master": "2.1-dev" }, "thanks": { "name": "symfony/contracts", @@ -3694,105 +3137,26 @@ "url": "https://symfony.com/sponsor", "type": "custom" }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v5.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "fbc3507f23d263d75417e09a12d77c009f39676c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/fbc3507f23d263d75417e09a12d77c009f39676c", - "reference": "fbc3507f23d263d75417e09a12d77c009f39676c", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:23:11+00:00" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-28T21:31:18+00:00" - }, - { - "name": "tencentcloud/tencentcloud-sdk-php", - "version": "3.0.251", - "source": { - "type": "git", - "url": "https://github.com/TencentCloud/tencentcloud-sdk-php.git", - "reference": "a3b3054262e48776e8014d5e385a8932b0102f29" - }, - "dist": { + "name": "tencentcloud/tencentcloud-sdk-php", + "version": "3.0.251", + "source": { + "type": "git", + "url": "https://github.com/TencentCloud/tencentcloud-sdk-php.git", + "reference": "a3b3054262e48776e8014d5e385a8932b0102f29" + }, + "dist": { "type": "zip", "url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/a3b3054262e48776e8014d5e385a8932b0102f29", "reference": "a3b3054262e48776e8014d5e385a8932b0102f29", @@ -4266,27 +3630,27 @@ "reference": "65144f2b0fad32b182ccb062b1efc1b4edea5d44", "shasum": "", "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } ] }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "notification-url": "https://packagist.jp/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Phalcon Team", - "email": "team@phalconphp.com", - "homepage": "https://phalconphp.com/en/team" - }, - { + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Phalcon Team", + "email": "team@phalconphp.com", + "homepage": "https://phalconphp.com/en/team" + }, + { "name": "Contributors", "homepage": "https://github.com/phalcon/ide-stubs/graphs/contributors" } @@ -4377,5 +3741,5 @@ "ext-fileinfo": "*" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "1.1.0" } -- Gitee From de839a44440300c6796a738c1c0779cd99edd8b9 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 12 Dec 2020 18:09:10 +0800 Subject: [PATCH 05/89] =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=9F=BA=E6=9C=AC=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Admin/Controllers/Controller.php | 11 +++++++++++ app/Http/Admin/Services/Setting.php | 8 ++++++++ app/Http/Admin/Views/templates/main.volt | 6 ++++++ 3 files changed, 25 insertions(+) diff --git a/app/Http/Admin/Controllers/Controller.php b/app/Http/Admin/Controllers/Controller.php index 058bfa77..25899d50 100644 --- a/app/Http/Admin/Controllers/Controller.php +++ b/app/Http/Admin/Controllers/Controller.php @@ -21,6 +21,17 @@ class Controller extends \Phalcon\Mvc\Controller public function beforeExecuteRoute(Dispatcher $dispatcher) { + /** + * demo分支拒绝数据提交 + */ + if ($this->isNotSafeRequest()) { + $dispatcher->forward([ + 'controller' => 'public', + 'action' => 'forbidden', + ]); + return false; + } + if ($this->isNotSafeRequest()) { $this->checkHttpReferer(); $this->checkCsrfToken(); diff --git a/app/Http/Admin/Services/Setting.php b/app/Http/Admin/Services/Setting.php index 3b744ad8..1c4b2b99 100644 --- a/app/Http/Admin/Services/Setting.php +++ b/app/Http/Admin/Services/Setting.php @@ -97,8 +97,16 @@ class Setting extends Service $result = []; + /** + * demo分支过滤敏感数据 + */ if ($items->count() > 0) { foreach ($items as $item) { + $case1 = preg_match('/(id|auth|key|secret|password|pwd)$/', $item->item_key); + $case2 = $this->dispatcher->getControllerName() == 'setting'; + if ($case1 && $case2) { + $item->item_value = '***'; + } $result[$item->item_key] = $item->item_value; } } diff --git a/app/Http/Admin/Views/templates/main.volt b/app/Http/Admin/Views/templates/main.volt index 6b70ff60..8803b2a0 100644 --- a/app/Http/Admin/Views/templates/main.volt +++ b/app/Http/Admin/Views/templates/main.volt @@ -23,5 +23,11 @@ {% block include_js %}{% endblock %} {% block inline_js %}{% endblock %} +{% set site = setting('site') %} + +{% if site['analytics_enabled'] == 1 %} + {{ site['analytics_script'] }} +{% endif %} + \ No newline at end of file -- Gitee From aa04c4c7a43ef161c9474fc1c3f291b5caecdbc6 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 12 Dec 2020 19:04:08 +0800 Subject: [PATCH 06/89] =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E5=85=B3?= =?UTF-8?q?=E6=B3=A8=E8=A1=A8=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20201212102844_schema_202012121830.php | 141 ++++++++++++++++++ .../20201212112717_data_202012121830.php | 53 +++++++ 2 files changed, 194 insertions(+) create mode 100644 db/migrations/20201212102844_schema_202012121830.php create mode 100644 db/migrations/20201212112717_data_202012121830.php diff --git a/db/migrations/20201212102844_schema_202012121830.php b/db/migrations/20201212102844_schema_202012121830.php new file mode 100644 index 00000000..6622a6ec --- /dev/null +++ b/db/migrations/20201212102844_schema_202012121830.php @@ -0,0 +1,141 @@ +table('kg_connect', [ + 'id' => false, + 'primary_key' => ['id'], + 'engine' => 'InnoDB', + 'encoding' => 'utf8mb4', + 'collation' => 'utf8mb4_general_ci', + 'comment' => '', + 'row_format' => 'DYNAMIC', + ]) + ->addColumn('union_id', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 50, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => 'union_id', + 'after' => 'user_id', + ]) + ->changeColumn('open_id', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 50, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '开放ID', + 'after' => 'union_id', + ]) + ->changeColumn('open_name', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 30, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '开放名称', + 'after' => 'open_id', + ]) + ->changeColumn('open_avatar', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 150, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '开放头像', + 'after' => 'open_name', + ]) + ->changeColumn('provider', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '提供方', + 'after' => 'open_avatar', + ]) + ->changeColumn('deleted', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '删除标识', + 'after' => 'provider', + ]) + ->changeColumn('create_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '创建时间', + 'after' => 'deleted', + ]) + ->changeColumn('update_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '更新时间', + 'after' => 'create_time', + ]) + ->addIndex(['user_id'], [ + 'name' => 'user_id', + 'unique' => false, + ]) + ->save(); + $this->table('kg_wechat_subscribe', [ + 'id' => false, + 'primary_key' => ['id'], + 'engine' => 'InnoDB', + 'encoding' => 'utf8mb4', + 'collation' => 'utf8mb4_general_ci', + 'comment' => '', + 'row_format' => 'DYNAMIC', + ]) + ->addColumn('id', 'integer', [ + 'null' => false, + 'limit' => MysqlAdapter::INT_REGULAR, + 'identity' => 'enable', + 'comment' => '主键编号', + ]) + ->addColumn('user_id', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '用户编号', + 'after' => 'id', + ]) + ->addColumn('open_id', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 50, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '开放ID', + 'after' => 'user_id', + ]) + ->addColumn('deleted', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '删除标识', + 'after' => 'open_id', + ]) + ->addColumn('create_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '创建时间', + 'after' => 'deleted', + ]) + ->addColumn('update_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '更新时间', + 'after' => 'create_time', + ]) + ->create(); + } +} diff --git a/db/migrations/20201212112717_data_202012121830.php b/db/migrations/20201212112717_data_202012121830.php new file mode 100644 index 00000000..53e7efb6 --- /dev/null +++ b/db/migrations/20201212112717_data_202012121830.php @@ -0,0 +1,53 @@ + 'wechat.oa', + 'item_key' => 'enabled', + 'item_value' => '0', + ], + [ + 'section' => 'wechat.oa', + 'item_key' => 'app_id', + 'item_value' => '', + ], + [ + 'section' => 'wechat.oa', + 'item_key' => 'app_secret', + 'item_value' => '', + ], + [ + 'section' => 'wechat.oa', + 'item_key' => 'app_token', + 'item_value' => '', + ], + [ + 'section' => 'wechat.oa', + 'item_key' => 'aes_key', + 'item_value' => '', + ], + [ + 'section' => 'wechat.oa', + 'item_key' => 'notify_url', + 'item_value' => '', + ], + ]; + + $this->table('kg_setting')->insert($rows)->save(); + } + + public function down() + { + $this->execute("DELETE FROM kg_setting WHERE section = 'wechat.oa'"); + } + +} \ No newline at end of file -- Gitee From 9ca0219a370b42b98d467eed17f1eb5792e7272d Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 12 Dec 2020 19:18:04 +0800 Subject: [PATCH 07/89] =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E5=85=B3?= =?UTF-8?q?=E6=B3=A8=E8=A1=A8=E7=BB=93=E6=9E=84=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrations/20201205091213_create_connect_table.php | 2 +- db/migrations/20201212102844_schema_202012121830.php | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/db/migrations/20201205091213_create_connect_table.php b/db/migrations/20201205091213_create_connect_table.php index 53041625..460b2c8e 100644 --- a/db/migrations/20201205091213_create_connect_table.php +++ b/db/migrations/20201205091213_create_connect_table.php @@ -84,7 +84,7 @@ class CreateConnectTable extends Phinx\Migration\AbstractMigration 'after' => 'create_time', ]) ->addIndex(['open_id', 'provider'], [ - 'name' => 'openid_provider', + 'name' => 'open_id_provider', 'unique' => false, ]) ->create(); diff --git a/db/migrations/20201212102844_schema_202012121830.php b/db/migrations/20201212102844_schema_202012121830.php index 6622a6ec..46f991ea 100644 --- a/db/migrations/20201212102844_schema_202012121830.php +++ b/db/migrations/20201212102844_schema_202012121830.php @@ -79,6 +79,10 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration 'comment' => '更新时间', 'after' => 'create_time', ]) + ->addIndex(['union_id', 'provider'], [ + 'name' => 'union_id_provider', + 'unique' => false, + ]) ->addIndex(['user_id'], [ 'name' => 'user_id', 'unique' => false, -- Gitee From 3bfc9ea89c97a34ac7a33f952435a4def786fcce Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 12 Dec 2020 19:52:09 +0800 Subject: [PATCH 08/89] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E7=9B=B8=E5=85=B3=E8=A1=A8=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Admin/Services/Setting.php | 3 +-- app/Http/Admin/Views/setting/wechat_oa.volt | 10 ++-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/app/Http/Admin/Services/Setting.php b/app/Http/Admin/Services/Setting.php index 3b744ad8..3abc1552 100644 --- a/app/Http/Admin/Services/Setting.php +++ b/app/Http/Admin/Services/Setting.php @@ -61,8 +61,7 @@ class Setting extends Service { $oa = $this->getSettings('wechat.oa'); - $oa['auth_url'] = $oa['auth_url'] ?: kg_full_url(['for' => 'home.wechat.oa.auth_callback']); - $oa['notify_url'] = $oa['notify_url'] ?: kg_full_url(['for' => 'home.wechat.oa.notify_callback']); + $oa['notify_url'] = $oa['notify_url'] ?: kg_full_url(['for' => 'home.wechat.oa.notify']); return $oa; } diff --git a/app/Http/Admin/Views/setting/wechat_oa.volt b/app/Http/Admin/Views/setting/wechat_oa.volt index c430775b..a142d43c 100644 --- a/app/Http/Admin/Views/setting/wechat_oa.volt +++ b/app/Http/Admin/Views/setting/wechat_oa.volt @@ -1,6 +1,6 @@
- +
@@ -31,13 +31,7 @@
- -
- -
-
-
- +
-- Gitee From 62f4d3548074ecc50a015273c7185d2f2aa66e50 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Mon, 14 Dec 2020 16:16:25 +0800 Subject: [PATCH 09/89] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E7=94=9F=E6=88=90MaxImGroupId=E7=9A=84=E9=97=AE=E9=A2=98,?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=BE=E7=A8=8B=E9=BB=98=E8=AE=A4=E7=BE=A4?= =?UTF-8?q?=E4=B8=BB=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Admin/Services/Course.php | 43 ++++++++++++++++++++++++++++++ app/Models/Course.php | 11 -------- app/Models/ImGroup.php | 8 ++++++ 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/app/Http/Admin/Services/Course.php b/app/Http/Admin/Services/Course.php index 7f644d0d..10eaf27e 100644 --- a/app/Http/Admin/Services/Course.php +++ b/app/Http/Admin/Services/Course.php @@ -15,12 +15,14 @@ use App\Models\CourseRating as CourseRatingModel; use App\Models\CourseRelated as CourseRelatedModel; use App\Models\CourseUser as CourseUserModel; use App\Models\ImGroup as ImGroupModel; +use App\Models\ImGroupUser as ImGroupUserModel; use App\Repos\Category as CategoryRepo; use App\Repos\Chapter as ChapterRepo; use App\Repos\Course as CourseRepo; use App\Repos\CourseCategory as CourseCategoryRepo; use App\Repos\CourseRelated as CourseRelatedRepo; use App\Repos\CourseUser as CourseUserRepo; +use App\Repos\ImGroup as ImGroupRepo; use App\Repos\User as UserRepo; use App\Services\Sync\CourseIndex as CourseIndexSync; use App\Validators\Course as CourseValidator; @@ -94,6 +96,7 @@ class Course extends Service $imGroup = new ImGroupModel(); + $imGroup->type = ImGroupModel::TYPE_COURSE; $imGroup->course_id = $course->id; $imGroup->name = $course->title; $imGroup->about = $course->summary; @@ -190,6 +193,8 @@ class Course extends Service $course->update($data); + $this->updateImGroup($course); + return $course; } @@ -199,6 +204,12 @@ class Course extends Service $course->deleted = 1; $course->update(); + $groupRepo = new ImGroupRepo(); + + $group = $groupRepo->findByCourseId($course->id); + $group->deleted = 1; + $group->update(); + return $course; } @@ -208,6 +219,12 @@ class Course extends Service $course->deleted = 0; $course->update(); + $groupRepo = new ImGroupRepo(); + + $group = $groupRepo->findByCourseId($course->id); + $group->deleted = 0; + $group->update(); + return $course; } @@ -545,6 +562,32 @@ class Course extends Service $cache->rebuild($course->id); } + protected function updateImGroup(CourseModel $course) + { + $groupRepo = new ImGroupRepo(); + + $group = $groupRepo->findByCourseId($course->id); + + $data = []; + + if ($course->title != $group->name) { + $data['name'] = $course->title; + } + + if ($course->teacher_id > 0 && $group->owner_id == 0) { + + $groupUser = new ImGroupUserModel(); + $groupUser->group_id = $group->id; + $groupUser->user_id = $course->teacher_id; + $groupUser->create(); + + $data['owner_id'] = $course->teacher_id; + $data['user_count'] = $group->user_count + 1; + } + + $group->update($data); + } + protected function handleCourses($pager) { if ($pager->total_items > 0) { diff --git a/app/Models/Course.php b/app/Models/Course.php index 324c1f1f..aaa22404 100644 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -326,17 +326,6 @@ class Course extends Model $cache->rebuild(); } - public function afterUpdate() - { - /** - * 群组名称和课程标题保持一致 - */ - if ($this->hasUpdated('title')) { - $imGroup = ImGroup::findFirst(['course_id' => $this->id]); - $imGroup->update(['name' => $this->title]); - } - } - public function afterFetch() { $this->market_price = (float)$this->market_price; diff --git a/app/Models/ImGroup.php b/app/Models/ImGroup.php index a8c42ea1..ec899cd0 100644 --- a/app/Models/ImGroup.php +++ b/app/Models/ImGroup.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Caches\MaxImGroupId as MaxImGroupIdCache; use App\Services\Sync\GroupIndex as GroupIndexSync; use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Text; @@ -153,6 +154,13 @@ class ImGroup extends Model $this->update_time = time(); } + public function afterCreate() + { + $cache = new MaxImGroupIdCache(); + + $cache->rebuild(); + } + public function afterFetch() { if (!Text::startsWith($this->avatar, 'http')) { -- Gitee From 69b0997a1548ea27dc913d550b25a9f01a5d404c Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 19 Dec 2020 15:38:57 +0800 Subject: [PATCH 10/89] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A7=92=E8=89=B2route?= =?UTF-8?q?s=E5=AD=97=E6=AE=B5=E5=A1=AB=E5=85=85=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 99cfb9bc9ba31f4312d74b0b5ca2216b49c517c9) --- app/Http/Admin/Services/Role.php | 11 +++++++---- app/Models/Role.php | 2 ++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/Http/Admin/Services/Role.php b/app/Http/Admin/Services/Role.php index 82fde39a..86bade39 100644 --- a/app/Http/Admin/Services/Role.php +++ b/app/Http/Admin/Services/Role.php @@ -61,8 +61,11 @@ class Role extends Service $data['name'] = $validator->checkName($post['name']); $data['summary'] = $validator->checkSummary($post['summary']); - $data['routes'] = $validator->checkRoutes($post['routes']); - $data['routes'] = $this->handleRoutes($data['routes']); + + if (isset($post['routes'])) { + $data['routes'] = $validator->checkRoutes($post['routes']); + $data['routes'] = $this->handleRoutes($data['routes']); + } $role->update($data); @@ -114,9 +117,9 @@ class Role extends Service * @param array $routes * @return array */ - protected function handleRoutes($routes) + protected function handleRoutes(array $routes) { - if (empty($routes)) { + if (count($routes) == 0) { return []; } diff --git a/app/Models/Role.php b/app/Models/Role.php index 827a368a..a30b573b 100644 --- a/app/Models/Role.php +++ b/app/Models/Role.php @@ -105,6 +105,8 @@ class Role extends Model { if (is_array($this->routes) && !empty($this->routes)) { $this->routes = kg_json_encode($this->routes); + } else { + $this->routes = ''; } $this->create_time = time(); -- Gitee From 6104c9a9bd76c57a0104c1fb5c488e3a4d5a0181 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sun, 20 Dec 2020 17:19:30 +0800 Subject: [PATCH 11/89] =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E4=BA=92?= =?UTF-8?q?=E5=8A=A8=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Builders/ConsultList.php | 5 +- app/Console/Tasks/CleanLogTask.php | 18 ++ app/Console/Tasks/DeliverTask.php | 10 +- app/Console/Tasks/LiveNotifyTask.php | 81 ------ app/Console/Tasks/MaintainTask.php | 2 +- app/Console/Tasks/NoticeTask.php | 137 ++++++++++ app/Console/Tasks/RefundTask.php | 10 +- app/Console/Tasks/Task.php | 2 +- .../Admin/Controllers/SettingController.php | 4 +- app/Http/Admin/Services/Consult.php | 19 ++ app/Http/Admin/Services/Session.php | 11 + app/Http/Admin/Services/Setting.php | 17 +- app/Http/Admin/Views/order/list.volt | 2 +- app/Http/Admin/Views/setting/sms.volt | 26 +- app/Http/Admin/Views/setting/wechat_oa.volt | 61 ++++- app/Http/Api/Services/Account.php | 13 + .../Controllers/UserConsoleController.php | 29 +++ .../WeChatOfficialAccountController.php | 40 --- .../WechatOfficialAccountController.php | 76 ++++++ app/Http/Home/Services/Account.php | 13 + .../Home/Services/WeChatOfficialAccount.php | 17 -- .../Home/Services/WechatOfficialAccount.php | 233 ++++++++++++++++++ app/Http/Home/Views/user/console/menu.volt | 3 + .../Home/Views/user/console/subscribe.volt | 33 +++ app/Models/Consult.php | 9 +- app/Models/Task.php | 6 + ...eChatSubscribe.php => WechatSubscribe.php} | 2 +- app/Repos/CourseUser.php | 12 + app/Repos/WechatSubscribe.php | 57 +++++ app/Services/Auth/Mobile.php | 44 ---- app/Services/LiveNotify.php | 30 ++- app/Services/Logic/Consult/ConsultInfo.php | 16 ++ app/Services/Logic/Consult/ConsultReply.php | 31 ++- app/Services/Logic/Notice/AccountLogin.php | 61 +++++ app/Services/Logic/Notice/ConsultReply.php | 91 +++++++ app/Services/Logic/Notice/LiveBegin.php | 99 ++++++++ app/Services/Logic/Notice/OrderFinish.php | 76 ++++++ app/Services/Logic/Notice/RefundFinish.php | 76 ++++++ app/Services/Sms/Live.php | 50 ---- app/Services/Sms/Notice/ConsultReply.php | 37 +++ app/Services/Sms/Notice/LiveBegin.php | 38 +++ app/Services/Sms/Notice/OrderFinish.php | 38 +++ app/Services/Sms/Notice/RefundFinish.php | 38 +++ app/Services/Sms/Order.php | 39 --- app/Services/Sms/Refund.php | 39 --- app/Services/{WeChat.php => Wechat.php} | 4 +- app/Services/Wechat/Notice/AccountLogin.php | 35 +++ app/Services/Wechat/Notice/ConsultReply.php | 37 +++ app/Services/Wechat/Notice/LiveBegin.php | 36 +++ app/Services/Wechat/Notice/OrderFinish.php | 37 +++ app/Services/Wechat/Notice/RefundFinish.php | 36 +++ app/Services/WechatNotice.php | 103 ++++++++ .../20201205091213_create_connect_table.php | 2 +- .../20201212102844_schema_202012121830.php | 84 ++----- .../20201212112717_data_202012121830.php | 30 ++- public/static/home/css/common.css | 18 ++ .../static/home/js/user.console.subscribe.js | 29 +++ scheduler.php | 4 +- 58 files changed, 1771 insertions(+), 435 deletions(-) delete mode 100644 app/Console/Tasks/LiveNotifyTask.php create mode 100644 app/Console/Tasks/NoticeTask.php delete mode 100644 app/Http/Home/Controllers/WeChatOfficialAccountController.php create mode 100644 app/Http/Home/Controllers/WechatOfficialAccountController.php delete mode 100644 app/Http/Home/Services/WeChatOfficialAccount.php create mode 100644 app/Http/Home/Services/WechatOfficialAccount.php create mode 100644 app/Http/Home/Views/user/console/subscribe.volt rename app/Models/{WeChatSubscribe.php => WechatSubscribe.php} (96%) create mode 100644 app/Repos/WechatSubscribe.php delete mode 100644 app/Services/Auth/Mobile.php create mode 100644 app/Services/Logic/Notice/AccountLogin.php create mode 100644 app/Services/Logic/Notice/ConsultReply.php create mode 100644 app/Services/Logic/Notice/LiveBegin.php create mode 100644 app/Services/Logic/Notice/OrderFinish.php create mode 100644 app/Services/Logic/Notice/RefundFinish.php delete mode 100644 app/Services/Sms/Live.php create mode 100644 app/Services/Sms/Notice/ConsultReply.php create mode 100644 app/Services/Sms/Notice/LiveBegin.php create mode 100644 app/Services/Sms/Notice/OrderFinish.php create mode 100644 app/Services/Sms/Notice/RefundFinish.php delete mode 100644 app/Services/Sms/Order.php delete mode 100644 app/Services/Sms/Refund.php rename app/Services/{WeChat.php => Wechat.php} (96%) create mode 100644 app/Services/Wechat/Notice/AccountLogin.php create mode 100644 app/Services/Wechat/Notice/ConsultReply.php create mode 100644 app/Services/Wechat/Notice/LiveBegin.php create mode 100644 app/Services/Wechat/Notice/OrderFinish.php create mode 100644 app/Services/Wechat/Notice/RefundFinish.php create mode 100644 app/Services/WechatNotice.php create mode 100644 public/static/home/js/user.console.subscribe.js diff --git a/app/Builders/ConsultList.php b/app/Builders/ConsultList.php index 44aa3f7e..55f27c0f 100644 --- a/app/Builders/ConsultList.php +++ b/app/Builders/ConsultList.php @@ -26,6 +26,7 @@ class ConsultList extends Builder foreach ($consults as $key => $consult) { $consults[$key]['owner'] = $users[$consult['owner_id']] ?? new \stdClass(); + $consults[$key]['replier'] = $users[$consult['replier_id']] ?? new \stdClass(); } return $consults; @@ -67,7 +68,9 @@ class ConsultList extends Builder public function getUsers(array $consults) { - $ids = kg_array_column($consults, 'owner_id'); + $ownerIds = kg_array_column($consults, 'owner_id'); + $replierIds = kg_array_column($consults, 'replier_id'); + $ids = array_merge($ownerIds, $replierIds); $userRepo = new UserRepo(); diff --git a/app/Console/Tasks/CleanLogTask.php b/app/Console/Tasks/CleanLogTask.php index b4dd7ee9..d4d532c7 100644 --- a/app/Console/Tasks/CleanLogTask.php +++ b/app/Console/Tasks/CleanLogTask.php @@ -13,6 +13,7 @@ class CleanLogTask extends Task $this->cleanSqlLog(); $this->cleanListenLog(); $this->cleanCaptchaLog(); + $this->cleanWechatLog(); $this->cleanMailLog(); $this->cleanSmsLog(); $this->cleanVodLog(); @@ -22,6 +23,7 @@ class CleanLogTask extends Task $this->cleanWxpayLog(); $this->cleanOrderLog(); $this->cleanRefundLog(); + $this->cleanNoticeLog(); } /** @@ -112,6 +114,14 @@ class CleanLogTask extends Task $this->cleanLog('mail', 7); } + /** + * 清理微信服务日志 + */ + protected function cleanWechatLog() + { + $this->cleanLog('wechat', 7); + } + /** * 清理阿里支付服务日志 */ @@ -144,6 +154,14 @@ class CleanLogTask extends Task $this->cleanLog('refund', 30); } + /** + * 清理通知日志 + */ + protected function cleanNoticeLog() + { + $this->cleanLog('notice', 7); + } + /** * 清理日志文件 * diff --git a/app/Console/Tasks/DeliverTask.php b/app/Console/Tasks/DeliverTask.php index 1895ce26..560c8449 100644 --- a/app/Console/Tasks/DeliverTask.php +++ b/app/Console/Tasks/DeliverTask.php @@ -12,7 +12,7 @@ use App\Repos\ImGroup as ImGroupRepo; use App\Repos\ImGroupUser as ImGroupUserRepo; use App\Repos\Order as OrderRepo; use App\Repos\User as UserRepo; -use App\Services\Sms\Order as OrderSms; +use App\Services\Logic\Notice\OrderFinish as OrderFinishNotice; use Phalcon\Mvc\Model; use Phalcon\Mvc\Model\Resultset; use Phalcon\Mvc\Model\ResultsetInterface; @@ -84,7 +84,7 @@ class DeliverTask extends Task } if ($task->status == TaskModel::STATUS_FINISHED) { - $this->handleOrderNotice($order); + $this->handleOrderFinishNotice($order); } elseif ($task->status == TaskModel::STATUS_FAILED) { $this->handleOrderRefund($order); } @@ -199,11 +199,11 @@ class DeliverTask extends Task } } - protected function handleOrderNotice(OrderModel $order) + protected function handleOrderFinishNotice(OrderModel $order) { - $sms = new OrderSms(); + $notice = new OrderFinishNotice(); - $sms->handle($order); + $notice->createTask($order); } protected function handleOrderRefund(OrderModel $order) diff --git a/app/Console/Tasks/LiveNotifyTask.php b/app/Console/Tasks/LiveNotifyTask.php deleted file mode 100644 index ab6e2241..00000000 --- a/app/Console/Tasks/LiveNotifyTask.php +++ /dev/null @@ -1,81 +0,0 @@ -getRedis(); - - $service = new LiveNotifyService(); - - $key = $service->getNotifyKey(); - - $chapterIds = $redis->sMembers($key); - - if (!$chapterIds) return; - - $sentKey = $service->getSentNotifyKey(); - - $sentChapterIds = $redis->sMembers($sentKey); - - foreach ($chapterIds as $chapterId) { - if (!in_array($chapterId, $sentChapterIds)) { - $this->sendNotification($chapterId); - } else { - $redis->sAdd($sentKey, $chapterId); - } - } - - if ($redis->sCard($sentKey) == 1) { - $redis->expire($sentKey, 86400); - } - } - - protected function sendNotification($chapterId) - { - $chapterRepo = new ChapterRepo(); - - $chapterLive = $chapterRepo->findChapterLive($chapterId); - - if (!$chapterLive) return; - - $targetUserIds = $this->findTargetUserIds($chapterLive->course_id); - - if (!$targetUserIds) return; - - $sms = new LiveSms(); - - foreach ($targetUserIds as $userId) { - $sms->handle($chapterId, $userId, $chapterLive->start_time); - } - } - - protected function findTargetUserIds($courseId) - { - $sourceTypes = [ - CourseUserModel::SOURCE_CHARGE, - CourseUserModel::SOURCE_VIP, - ]; - - $rows = CourseUserModel::query() - ->where('course_id = :course_id:', ['course_id' => $courseId]) - ->andWhere('role_type = :role_type:', ['role_type' => CourseUserModel::ROLE_STUDENT]) - ->inWhere('source_type', $sourceTypes) - ->execute(); - - if ($rows->count() == 0) { - return []; - } - - return kg_array_column($rows->toArray(), 'user_id'); - } - -} diff --git a/app/Console/Tasks/MaintainTask.php b/app/Console/Tasks/MaintainTask.php index 9ac60365..7f6d5898 100644 --- a/app/Console/Tasks/MaintainTask.php +++ b/app/Console/Tasks/MaintainTask.php @@ -19,7 +19,7 @@ class MaintainTask extends Task * 重建首页课程缓存 * * @param array $params - * @command: php console.php maintain reset_index_course_cache + * @command: php console.php maintain rebuild_index_course_cache */ public function rebuildIndexCourseCacheAction($params) { diff --git a/app/Console/Tasks/NoticeTask.php b/app/Console/Tasks/NoticeTask.php new file mode 100644 index 00000000..4c69fcf6 --- /dev/null +++ b/app/Console/Tasks/NoticeTask.php @@ -0,0 +1,137 @@ +getLogger('notice'); + + $tasks = $this->findTasks(500); + + if ($tasks->count() == 0) { + return; + } + + foreach ($tasks as $task) { + + try { + + switch ($task->item_type) { + case TaskModel::TYPE_NOTICE_ACCOUNT_LOGIN: + $this->handleAccountLoginNotice($task); + break; + case TaskModel::TYPE_NOTICE_LIVE_BEGIN: + $this->handleLiveBeginNotice($task); + break; + case TaskModel::TYPE_NOTICE_ORDER_FINISH: + $this->handleOrderFinishNotice($task); + break; + case TaskModel::TYPE_NOTICE_REFUND_FINISH: + $this->handleRefundFinishNotice($task); + break; + case TaskModel::TYPE_NOTICE_CONSULT_REPLY: + $this->handleConsultReplyNotice($task); + break; + } + + $task->status = TaskModel::STATUS_FINISHED; + + $task->update(); + + } catch (\Exception $e) { + + $task->try_count += 1; + $task->priority += 1; + + if ($task->try_count > self::TRY_COUNT) { + $task->status = TaskModel::STATUS_FAILED; + } + + $task->update(); + + $logger->info('Notice Process Exception ' . kg_json_encode([ + 'code' => $e->getCode(), + 'message' => $e->getMessage(), + 'task' => $task->toArray(), + ])); + } + } + } + + protected function handleAccountLoginNotice(TaskModel $task) + { + $notice = new AccountLoginNotice(); + + return $notice->handleTask($task); + } + + protected function handleLiveBeginNotice(TaskModel $task) + { + $notice = new LiveBeginNotice(); + + return $notice->handleTask($task); + } + + protected function handleOrderFinishNotice(TaskModel $task) + { + $notice = new OrderFinishNotice(); + + return $notice->handleTask($task); + } + + protected function handleRefundFinishNotice(TaskModel $task) + { + $notice = new RefundFinishNotice(); + + return $notice->handleTask($task); + } + + protected function handleConsultReplyNotice(TaskModel $task) + { + $notice = new ConsultReplyNotice(); + + return $notice->handleTask($task); + } + + /** + * @param int $limit + * @return ResultsetInterface|Resultset|TaskModel[] + */ + protected function findTasks($limit = 100) + { + $itemTypes = [ + TaskModel::TYPE_NOTICE_ACCOUNT_LOGIN, + TaskModel::TYPE_NOTICE_LIVE_BEGIN, + TaskModel::TYPE_NOTICE_ORDER_FINISH, + TaskModel::TYPE_NOTICE_REFUND_FINISH, + TaskModel::TYPE_NOTICE_CONSULT_REPLY, + ]; + + $status = TaskModel::STATUS_PENDING; + + $tryCount = self::TRY_COUNT; + + return TaskModel::query() + ->inWhere('item_type', $itemTypes) + ->andWhere('status = :status:', ['status' => $status]) + ->andWhere('try_count < :try_count:', ['try_count' => $tryCount + 1]) + ->orderBy('priority ASC') + ->limit($limit) + ->execute(); + } + +} diff --git a/app/Console/Tasks/RefundTask.php b/app/Console/Tasks/RefundTask.php index 0edf1a67..ad69ec3c 100644 --- a/app/Console/Tasks/RefundTask.php +++ b/app/Console/Tasks/RefundTask.php @@ -11,9 +11,9 @@ use App\Repos\Order as OrderRepo; use App\Repos\Refund as RefundRepo; use App\Repos\Trade as TradeRepo; use App\Repos\User as UserRepo; +use App\Services\Logic\Notice\RefundFinish as RefundFinishNotice; use App\Services\Pay\Alipay as AlipayService; use App\Services\Pay\Wxpay as WxpayService; -use App\Services\Sms\Refund as RefundSms; use Phalcon\Mvc\Model\Resultset; use Phalcon\Mvc\Model\ResultsetInterface; @@ -95,7 +95,7 @@ class RefundTask extends Task $this->db->commit(); - $this->handleRefundNotice($refund); + $this->handleRefundFinishNotice($refund); } catch (\Exception $e) { @@ -281,11 +281,11 @@ class RefundTask extends Task /** * @param RefundModel $refund */ - protected function handleRefundNotice(RefundModel $refund) + protected function handleRefundFinishNotice(RefundModel $refund) { - $sms = new RefundSms(); + $notice = new RefundFinishNotice(); - $sms->handle($refund); + $notice->createTask($refund); } /** diff --git a/app/Console/Tasks/Task.php b/app/Console/Tasks/Task.php index 350cb5ec..75944d41 100644 --- a/app/Console/Tasks/Task.php +++ b/app/Console/Tasks/Task.php @@ -30,7 +30,7 @@ class Task extends \Phalcon\Cli\Task return $appService->getRedis(); } - public function getLogger($channel = null) + public function getLogger($channel = 'console') { $appService = new AppService(); diff --git a/app/Http/Admin/Controllers/SettingController.php b/app/Http/Admin/Controllers/SettingController.php index 7452c717..309d6bd8 100644 --- a/app/Http/Admin/Controllers/SettingController.php +++ b/app/Http/Admin/Controllers/SettingController.php @@ -340,13 +340,13 @@ class SettingController extends Controller $data = $this->request->getPost(); - $settingService->updateSettings($section, $data); + $settingService->updateWechatSettings($section, $data); return $this->jsonSuccess(['msg' => '更新配置成功']); } else { - $oa = $settingService->getWeChatOASettings(); + $oa = $settingService->getWechatOASettings(); $this->view->setVar('oa', $oa); } diff --git a/app/Http/Admin/Services/Consult.php b/app/Http/Admin/Services/Consult.php index 8625cf86..667b99a7 100644 --- a/app/Http/Admin/Services/Consult.php +++ b/app/Http/Admin/Services/Consult.php @@ -4,8 +4,10 @@ namespace App\Http\Admin\Services; use App\Builders\ConsultList as ConsultListBuilder; use App\Library\Paginator\Query as PagerQuery; +use App\Models\Consult as ConsultModel; use App\Repos\Consult as ConsultRepo; use App\Repos\Course as CourseRepo; +use App\Services\Logic\Notice\ConsultReply as ConsultReplyNotice; use App\Validators\Consult as ConsultValidator; class Consult extends Service @@ -52,12 +54,18 @@ class Consult extends Service $data = []; + $firstReply = false; + if (!empty($post['question'])) { $data['question'] = $validator->checkQuestion($post['question']); } if (!empty($post['answer'])) { $data['answer'] = $validator->checkAnswer($post['answer']); + $data['reply_time'] = time(); + if ($consult->reply_time == 0) { + $firstReply = true; + } } if (isset($post['private'])) { @@ -70,6 +78,10 @@ class Consult extends Service $consult->update($data); + if ($firstReply) { + $this->handleReplyNotice($consult); + } + return $consult; } @@ -107,6 +119,13 @@ class Consult extends Service $course->update(); } + protected function handleReplyNotice(ConsultModel $consult) + { + $notice = new ConsultReplyNotice(); + + $notice->createTask($consult); + } + protected function findOrFail($id) { $validator = new ConsultValidator(); diff --git a/app/Http/Admin/Services/Session.php b/app/Http/Admin/Services/Session.php index 2bff96d1..fae5222b 100644 --- a/app/Http/Admin/Services/Session.php +++ b/app/Http/Admin/Services/Session.php @@ -2,7 +2,9 @@ namespace App\Http\Admin\Services; +use App\Models\User as UserModel; use App\Services\Auth\Admin as AdminAuth; +use App\Services\Logic\Notice\AccountLogin as AccountLoginNoticeService; use App\Validators\Account as AccountValidator; use App\Validators\Captcha as CaptchaValidator; @@ -45,6 +47,8 @@ class Session extends Service $captchaValidator->checkCode($post['ticket'], $post['rand']); } + $this->handleLoginNotice($user); + $this->auth->saveAuthInfo($user); } @@ -53,4 +57,11 @@ class Session extends Service $this->auth->clearAuthInfo(); } + protected function handleLoginNotice(UserModel $user) + { + $service = new AccountLoginNoticeService(); + + $service->createTask($user); + } + } diff --git a/app/Http/Admin/Services/Setting.php b/app/Http/Admin/Services/Setting.php index 935dda54..e8779d8e 100644 --- a/app/Http/Admin/Services/Setting.php +++ b/app/Http/Admin/Services/Setting.php @@ -57,7 +57,7 @@ class Setting extends Service return $wxpay; } - public function getWeChatOASettings() + public function getWechatOASettings() { $oa = $this->getSettings('wechat.oa'); @@ -161,7 +161,9 @@ class Setting extends Service public function updateSmsSettings($section, $settings) { - $settings['template'] = kg_json_encode($settings['template']); + if (isset($settings['template'])) { + $settings['template'] = kg_json_encode($settings['template']); + } $this->updateSettings($section, $settings); } @@ -177,4 +179,15 @@ class Setting extends Service } } + public function updateWechatSettings($section, $settings) + { + if ($section == 'wechat.oa') { + if (isset($settings['notice_template'])) { + $settings['notice_template'] = kg_json_encode($settings['notice_template']); + } + } + + $this->updateSettings($section, $settings); + } + } diff --git a/app/Http/Admin/Views/order/list.volt b/app/Http/Admin/Views/order/list.volt index fb154b05..8b6a39b3 100644 --- a/app/Http/Admin/Views/order/list.volt +++ b/app/Http/Admin/Views/order/list.volt @@ -36,7 +36,7 @@ {% set show_url = url({'for':'admin.order.show','id':item.id}) %} -

商品:{{ item.subject }} {{ item_type(item.item_type) }}

+

商品:{{ item.subject }}

单号:{{ item.sn }}

diff --git a/app/Http/Admin/Views/setting/sms.volt b/app/Http/Admin/Views/setting/sms.volt index dbddfc49..8601b0a2 100644 --- a/app/Http/Admin/Views/setting/sms.volt +++ b/app/Http/Admin/Views/setting/sms.volt @@ -53,21 +53,27 @@ 订单通知 - - - 复制 + + + 复制 退款通知 - - - 复制 + + + 复制 - 直播通知 - - - 复制 + 直播提醒 + + + 复制 + + + 回复通知 + + + 复制 diff --git a/app/Http/Admin/Views/setting/wechat_oa.volt b/app/Http/Admin/Views/setting/wechat_oa.volt index a142d43c..efc70be5 100644 --- a/app/Http/Admin/Views/setting/wechat_oa.volt +++ b/app/Http/Admin/Views/setting/wechat_oa.volt @@ -1,3 +1,5 @@ +{% set notice_template = oa.notice_template|json_decode %} +
@@ -31,7 +33,7 @@
- +
@@ -41,7 +43,62 @@
- + +
+
+
+
+ 模板配置 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称模板编号
登录提醒
订单通知
退款通知
直播提醒
回复通知
+
+
+ +
+ + +
\ No newline at end of file diff --git a/app/Http/Api/Services/Account.php b/app/Http/Api/Services/Account.php index baf537f8..9ce43137 100644 --- a/app/Http/Api/Services/Account.php +++ b/app/Http/Api/Services/Account.php @@ -2,9 +2,11 @@ namespace App\Http\Api\Services; +use App\Models\User as UserModel; use App\Repos\User as UserRepo; use App\Services\Auth\Api as AuthService; use App\Services\Logic\Account\Register as RegisterService; +use App\Services\Logic\Notice\AccountLogin as AccountLoginNoticeService; use App\Validators\Account as AccountValidator; class Account extends Service @@ -50,6 +52,8 @@ class Account extends Service $user = $validator->checkUserLogin($post['account'], $post['password']); + $this->handleLoginNotice($user); + return $this->auth->saveAuthInfo($user); } @@ -70,6 +74,8 @@ class Account extends Service $user = $validator->checkVerifyLogin($post['account'], $post['verify_code']); + $this->handleLoginNotice($user); + return $this->auth->saveAuthInfo($user); } @@ -78,4 +84,11 @@ class Account extends Service $this->auth->clearAuthInfo(); } + protected function handleLoginNotice(UserModel $user) + { + $service = new AccountLoginNoticeService(); + + $service->createTask($user); + } + } diff --git a/app/Http/Home/Controllers/UserConsoleController.php b/app/Http/Home/Controllers/UserConsoleController.php index 2b56c475..12ed2de5 100644 --- a/app/Http/Home/Controllers/UserConsoleController.php +++ b/app/Http/Home/Controllers/UserConsoleController.php @@ -2,6 +2,7 @@ namespace App\Http\Home\Controllers; +use App\Repos\WechatSubscribe as WechatSubscribeRepo; use App\Services\Logic\Account\OAuthProvider as OAuthProviderService; use App\Services\Logic\User\Console\AccountInfo as AccountInfoService; use App\Services\Logic\User\Console\ConnectDelete as ConnectDeleteService; @@ -36,6 +37,15 @@ class UserConsoleController extends Controller return true; } + public function initialize() + { + parent::initialize(); + + $wechatOA = $this->getSettings('wechat.oa'); + + $this->view->setVar('wechat_oa', $wechatOA); + } + /** * @Get("/", name="home.uc.index") */ @@ -201,6 +211,25 @@ class UserConsoleController extends Controller $this->view->setVar('pager', $pager); } + /** + * @Get("/subscribe", name="home.uc.subscribe") + */ + public function subscribeAction() + { + $subscribeRepo = new WechatSubscribeRepo(); + + $subscribe = $subscribeRepo->findByUserId($this->authUser->id); + + $subscribed = 0; + + if ($subscribe) { + $subscribed = $subscribe->deleted == 0 ? 1 : 0; + } + + $this->view->pick('user/console/subscribe'); + $this->view->setVar('subscribed', $subscribed); + } + /** * @Post("/profile/update", name="home.uc.update_profile") */ diff --git a/app/Http/Home/Controllers/WeChatOfficialAccountController.php b/app/Http/Home/Controllers/WeChatOfficialAccountController.php deleted file mode 100644 index e62bddc9..00000000 --- a/app/Http/Home/Controllers/WeChatOfficialAccountController.php +++ /dev/null @@ -1,40 +0,0 @@ -getOfficialAccount(); - - $response = $app->server->serve(); - - $response->send(); - - exit; - } - - /** - * @Post("/notify", name="home.wechat.oa.notify") - */ - public function notifyAction() - { - - } - -} diff --git a/app/Http/Home/Controllers/WechatOfficialAccountController.php b/app/Http/Home/Controllers/WechatOfficialAccountController.php new file mode 100644 index 00000000..223170e7 --- /dev/null +++ b/app/Http/Home/Controllers/WechatOfficialAccountController.php @@ -0,0 +1,76 @@ +getSubscribeStatus(); + + return $this->jsonSuccess(['status' => $status]); + } + + /** + * @Get("/subscribe/qrcode", name="home.wechat.oa.sub_qrcode") + */ + public function subscribeQrCodeAction() + { + $service = new WechatOAService(); + + $qrcode = $service->createSubscribeQrCode(); + + return $this->jsonSuccess(['qrcode' => $qrcode]); + } + + /** + * @Get("/notify", name="home.wechat.oa.verify") + */ + public function verifyAction() + { + $service = new WechatOAService(); + + $app = $service->getOfficialAccount(); + + $response = $app->server->serve(); + + $response->send(); + + exit; + } + + /** + * @Post("/notify", name="home.wechat.oa.notify") + */ + public function notifyAction() + { + $service = new WechatOAService(); + + $app = $service->getOfficialAccount(); + + $app->server->push(function ($message) use ($service) { + return $service->handleNotify($message); + }); + + $response = $app->server->serve(); + + $response->send(); + + exit; + } + +} diff --git a/app/Http/Home/Services/Account.php b/app/Http/Home/Services/Account.php index 38efb3b2..7f7fb06f 100644 --- a/app/Http/Home/Services/Account.php +++ b/app/Http/Home/Services/Account.php @@ -2,9 +2,11 @@ namespace App\Http\Home\Services; +use App\Models\User as UserModel; use App\Repos\User as UserRepo; use App\Services\Auth\Home as AuthService; use App\Services\Logic\Account\Register as RegisterService; +use App\Services\Logic\Notice\AccountLogin as AccountLoginNoticeService; use App\Validators\Account as AccountValidator; use App\Validators\Captcha as CaptchaValidator; @@ -48,6 +50,8 @@ class Account extends Service $validator->checkCode($post['ticket'], $post['rand']); + $this->handleLoginNotice($user); + $this->auth->saveAuthInfo($user); } @@ -59,6 +63,8 @@ class Account extends Service $user = $validator->checkVerifyLogin($post['account'], $post['verify_code']); + $this->handleLoginNotice($user); + $this->auth->saveAuthInfo($user); } @@ -67,4 +73,11 @@ class Account extends Service $this->auth->clearAuthInfo(); } + protected function handleLoginNotice(UserModel $user) + { + $service = new AccountLoginNoticeService(); + + $service->createTask($user); + } + } diff --git a/app/Http/Home/Services/WeChatOfficialAccount.php b/app/Http/Home/Services/WeChatOfficialAccount.php deleted file mode 100644 index a6173e16..00000000 --- a/app/Http/Home/Services/WeChatOfficialAccount.php +++ /dev/null @@ -1,17 +0,0 @@ -getOfficialAccount(); - } - -} diff --git a/app/Http/Home/Services/WechatOfficialAccount.php b/app/Http/Home/Services/WechatOfficialAccount.php new file mode 100644 index 00000000..b205ccee --- /dev/null +++ b/app/Http/Home/Services/WechatOfficialAccount.php @@ -0,0 +1,233 @@ +getOfficialAccount(); + } + + public function createSubscribeQrCode() + { + $user = $this->getLoginUser(); + + $app = $this->getOfficialAccount(); + + $result = $app->qrcode->temporary($user->id); + + return $app->qrcode->url($result['ticket']); + } + + public function getSubscribeStatus() + { + $user = $this->getLoginUser(); + + $subscribeRepo = new WechatSubscribeRepo(); + + $subscribe = $subscribeRepo->findByUserId($user->id); + + $status = 0; + + if ($subscribe) { + $status = $subscribe->deleted == 0 ? 1 : 0; + } + + return $status; + } + + public function handleNotify($message) + { + $service = new WechatService(); + + $service->logger->info('Received Message:' . json_encode($message)); + + switch ($message['MsgType']) { + case 'event': + switch ($message['Event']) { + case 'subscribe': + return $this->handleSubscribeEvent($message); + break; + case 'unsubscribe': + return $this->handleUnsubscribeEvent($message); + break; + case 'SCAN': + return $this->handleScanEvent($message); + break; + case 'CLICK': + return $this->handleClickEvent($message); + break; + case 'VIEW': + return $this->handleViewEvent($message); + break; + case 'LOCATION': + return $this->handleLocationEvent($message); + break; + default: + return $message['Event']; + break; + } + break; + case 'text': + return $this->handleTextReply($message); + break; + case 'image': + return $this->handleImageReply($message); + break; + case 'voice': + return $this->handleVoiceReply($message); + break; + case 'video': + return $this->handleVideoReply($message); + break; + case 'shortvideo': + return $this->handleShortVideoReply($message); + break; + case 'location': + return $this->handleLocationReply($message); + break; + case 'link': + return $this->handleLinkReply($message); + break; + default: + return $this->emptyReplyMessage(); + break; + } + } + + protected function handleSubscribeEvent($message) + { + $openId = $message['FromUserName'] ?? ''; + $eventKey = $message['EventKey'] ?? ''; + + if (!$eventKey) { + return $this->emptyReplyMessage(); + } + + $userId = str_replace('qrscene_', '', $eventKey); + + $this->handleSubscribeRelation($userId, $openId); + + return new TextMessage("欢迎您的光临!"); + } + + protected function handleUnsubscribeEvent($message) + { + $openId = $message['FromUserName'] ?? ''; + + $subscribeRepo = new WechatSubscribeRepo(); + + $subscribe = $subscribeRepo->findByOpenId($openId); + + if ($subscribe) { + $subscribe->deleted = 1; + $subscribe->update(); + } + + return new TextMessage("我们又少了一个可爱的小伙伴!"); + } + + protected function handleScanEvent($message) + { + /** + * 注意:当已关注过用户扫码时,"EventKey"没有带"qrscene_"前缀 + */ + $openId = $message['FromUserName'] ?? ''; + $eventKey = $message['EventKey'] ?? ''; + $userId = $eventKey; + + $this->handleSubscribeRelation($userId, $openId); + } + + protected function handleClickEvent($message) + { + } + + protected function handleViewEvent($message) + { + } + + protected function handleLocationEvent($message) + { + } + + protected function handleTextReply($message) + { + return $this->defaultReplyMessage(); + } + + protected function handleImageReply($message) + { + return $this->defaultReplyMessage(); + } + + protected function handleVoiceReply($message) + { + return $this->defaultReplyMessage(); + } + + protected function handleVideoReply($message) + { + return $this->defaultReplyMessage(); + } + + protected function handleShortVideoReply($message) + { + return $this->defaultReplyMessage(); + } + + protected function handleLocationReply($message) + { + return $this->defaultReplyMessage(); + } + + protected function handleLinkReply($message) + { + return $this->defaultReplyMessage(); + } + + protected function emptyReplyMessage() + { + return new TextMessage(""); + } + + protected function defaultReplyMessage() + { + return new TextMessage("没有匹配的服务,如有需要请联系客服!"); + } + + protected function handleSubscribeRelation($userId, $openId) + { + $validator = new UserValidator(); + $validator->checkUser($userId); + + $subscribeRepo = new WechatSubscribeRepo(); + $subscribe = $subscribeRepo->findByOpenId($openId); + + if ($subscribe) { + if ($subscribe->deleted == 1) { + $subscribe->deleted = 0; + $subscribe->update(); + } + } else { + $subscribe = $subscribeRepo->findSubscribe($userId, $openId); + if (!$subscribe) { + $subscribe = new WechatSubscribeModel(); + $subscribe->user_id = $userId; + $subscribe->open_id = $openId; + $subscribe->create(); + } + } + } + +} diff --git a/app/Http/Home/Views/user/console/menu.volt b/app/Http/Home/Views/user/console/menu.volt index cc8ed6ac..e670e951 100644 --- a/app/Http/Home/Views/user/console/menu.volt +++ b/app/Http/Home/Views/user/console/menu.volt @@ -52,6 +52,9 @@ \ No newline at end of file diff --git a/app/Http/Home/Views/user/console/subscribe.volt b/app/Http/Home/Views/user/console/subscribe.volt new file mode 100644 index 00000000..1fe6a2c7 --- /dev/null +++ b/app/Http/Home/Views/user/console/subscribe.volt @@ -0,0 +1,33 @@ +{% extends 'templates/main.volt' %} + +{% block content %} + +
+
{{ partial('user/console/menu') }}
+
+
+
+ 关注订阅 +
+
+ {% if subscribed == 0 %} +
+
订阅官方公众号,接收重要通知!
+ {% else %} +
你已经订阅官方公众号
+ {% endif %} +
+
+ +
+
+
+
+ +{% endblock %} + +{% block include_js %} + + {{ js_include('home/js/user.console.subscribe.js') }} + +{% endblock %} \ No newline at end of file diff --git a/app/Models/Consult.php b/app/Models/Consult.php index a790c650..31ea904d 100644 --- a/app/Models/Consult.php +++ b/app/Models/Consult.php @@ -36,12 +36,19 @@ class Consult extends Model public $chapter_id; /** - * 用户编号 + * 提主编号 * * @var int */ public $owner_id; + /** + * 答主编号 + * + * @var int + */ + public $replier_id; + /** * 提问 * diff --git a/app/Models/Task.php b/app/Models/Task.php index 45890752..dd85bb59 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -11,6 +11,12 @@ class Task extends Model const TYPE_DELIVER = 1; // 发货 const TYPE_REFUND = 2; // 退款 + const TYPE_NOTICE_ACCOUNT_LOGIN = 11; // 帐号登录通知 + const TYPE_NOTICE_LIVE_BEGIN = 12; // 直播开始通知 + const TYPE_NOTICE_ORDER_FINISH = 13; // 订单完成通知 + const TYPE_NOTICE_REFUND_FINISH = 14; // 退款完成通知 + const TYPE_NOTICE_CONSULT_REPLY = 15; // 咨询回复通知 + /** * 优先级 */ diff --git a/app/Models/WeChatSubscribe.php b/app/Models/WechatSubscribe.php similarity index 96% rename from app/Models/WeChatSubscribe.php rename to app/Models/WechatSubscribe.php index f1ce2201..e1633caa 100644 --- a/app/Models/WeChatSubscribe.php +++ b/app/Models/WechatSubscribe.php @@ -4,7 +4,7 @@ namespace App\Models; use Phalcon\Mvc\Model\Behavior\SoftDelete; -class WeChatSubscribe extends Model +class WechatSubscribe extends Model { /** diff --git a/app/Repos/CourseUser.php b/app/Repos/CourseUser.php index 12704ac5..01ece420 100644 --- a/app/Repos/CourseUser.php +++ b/app/Repos/CourseUser.php @@ -146,4 +146,16 @@ class CourseUser extends Repository ->execute(); } + /** + * @param int $courseId + * @return ResultsetInterface|Resultset|CourseUserModel[] + */ + public function findByCourseId($courseId) + { + return CourseUserModel::query() + ->where('course_id = :course_id:', ['course_id' => $courseId]) + ->andWhere('deleted = 0') + ->execute(); + } + } diff --git a/app/Repos/WechatSubscribe.php b/app/Repos/WechatSubscribe.php new file mode 100644 index 00000000..2043d889 --- /dev/null +++ b/app/Repos/WechatSubscribe.php @@ -0,0 +1,57 @@ + 'user_id= ?1 AND open_id = ?2', + 'bind' => [1 => $userId, 2 => $openId], + ]); + } + + /** + * @param int $id + * @return WechatSubscribeModel|Model|bool + */ + public function findById($id) + { + return WechatSubscribeModel::findFirst($id); + } + + /** + * @param int $userId + * @return WechatSubscribeModel|Model|bool + */ + public function findByUserId($userId) + { + return WechatSubscribeModel::findFirst([ + 'conditions' => 'user_id = :user_id:', + 'bind' => ['user_id' => $userId], + ]); + } + + /** + * @param string $openId + * @return WechatSubscribeModel|Model|bool + */ + public function findByOpenId($openId) + { + return WechatSubscribeModel::findFirst([ + 'conditions' => 'open_id = :open_id:', + 'bind' => ['open_id' => $openId], + ]); + } + +} diff --git a/app/Services/Auth/Mobile.php b/app/Services/Auth/Mobile.php deleted file mode 100644 index 5f94bcb4..00000000 --- a/app/Services/Auth/Mobile.php +++ /dev/null @@ -1,44 +0,0 @@ -getAuthKey(); - - $authInfo = [ - 'id' => $user->id, - 'name' => $user->name, - ]; - - $this->session->set($authKey, $authInfo); - } - - public function clearAuthInfo() - { - $authKey = $this->getAuthKey(); - - $this->session->remove($authKey); - } - - public function getAuthInfo() - { - $authKey = $this->getAuthKey(); - - $authInfo = $this->session->get($authKey); - - return $authInfo ?: null; - } - - public function getAuthKey() - { - return 'mobile_auth_info'; - } - -} diff --git a/app/Services/LiveNotify.php b/app/Services/LiveNotify.php index ef1fd11d..edf7982d 100644 --- a/app/Services/LiveNotify.php +++ b/app/Services/LiveNotify.php @@ -5,6 +5,8 @@ namespace App\Services; use App\Models\Chapter as ChapterModel; use App\Models\ChapterLive as ChapterLiveModel; use App\Repos\Chapter as ChapterRepo; +use App\Repos\CourseUser as CourseUserRepo; +use App\Services\Logic\Notice\LiveBegin as LiveBeginNotice; class LiveNotify extends Service { @@ -42,16 +44,6 @@ class LiveNotify extends Service return $result; } - public function getNotifyKey() - { - return 'live_notify'; - } - - public function getSentNotifyKey() - { - return 'live_notify_sent'; - } - /** * 推流 */ @@ -73,7 +65,7 @@ class LiveNotify extends Service $chapterLive->update(['status' => ChapterLiveModel::STATUS_ACTIVE]); - $this->sendBeginNotify($chapter); + $this->handleStreamBeginNotice($chapter); return true; } @@ -126,15 +118,21 @@ class LiveNotify extends Service } - protected function sendBeginNotify(ChapterModel $chapter) + protected function handleStreamBeginNotice(ChapterModel $chapter) { - $redis = $this->getRedis(); + $courseUserRepo = new CourseUserRepo(); + + $courseUsers = $courseUserRepo->findByCourseId($chapter->course_id); - $key = $this->getNotifyKey(); + if ($courseUsers->count() == 0) { + return; + } - $redis->sAdd($key, $chapter->id); + $notice = new LiveBeginNotice(); - $redis->expire($key, 86400); + foreach ($courseUsers as $courseUser) { + $notice->createTask($chapter, $courseUser); + } } protected function getChapter($streamName) diff --git a/app/Services/Logic/Consult/ConsultInfo.php b/app/Services/Logic/Consult/ConsultInfo.php index 52dcf335..f8b5590b 100644 --- a/app/Services/Logic/Consult/ConsultInfo.php +++ b/app/Services/Logic/Consult/ConsultInfo.php @@ -37,6 +37,7 @@ class ConsultInfo extends Service $result['course'] = $this->handleCourseInfo($consult); $result['chapter'] = $this->handleChapterInfo($consult); $result['owner'] = $this->handleOwnerInfo($consult); + $result['replier'] = $this->handleReplierInfo($consult); return $result; } @@ -85,4 +86,19 @@ class ConsultInfo extends Service ]; } + protected function handleReplierInfo(ConsultModel $consult) + { + $userRepo = new UserRepo(); + + $replier = $userRepo->findById($consult->replier_id); + + if (!$replier) return new \stdClass(); + + return [ + 'id' => $replier->id, + 'name' => $replier->name, + 'avatar' => $replier->avatar, + ]; + } + } diff --git a/app/Services/Logic/Consult/ConsultReply.php b/app/Services/Logic/Consult/ConsultReply.php index 1b0e457a..25e88371 100644 --- a/app/Services/Logic/Consult/ConsultReply.php +++ b/app/Services/Logic/Consult/ConsultReply.php @@ -2,11 +2,13 @@ namespace App\Services\Logic\Consult; +use App\Models\Consult as ConsultModel; use App\Services\Logic\ConsultTrait; -use App\Services\Logic\Service; +use App\Services\Logic\Notice\ConsultReply as ConsultReplyNotice; +use App\Services\Logic\Service as LogicService; use App\Validators\Consult as ConsultValidator; -class ConsultReply extends Service +class ConsultReply extends LogicService { use ConsultTrait; @@ -25,12 +27,29 @@ class ConsultReply extends Service $answer = $validator->checkAnswer($post['answer']); - $consult->update([ - 'answer' => $answer, - 'reply_time' => time(), - ]); + $firstReply = false; + + if ($consult->reply_time == 0) { + $firstReply = true; + } + + $consult->replier_id = $user->id; + $consult->reply_time = time(); + $consult->answer = $answer; + $consult->update(); + + if ($firstReply) { + $this->handleReplyNotice($consult); + } return $consult; } + protected function handleReplyNotice(ConsultModel $consult) + { + $notice = new ConsultReplyNotice(); + + $notice->createTask($consult); + } + } diff --git a/app/Services/Logic/Notice/AccountLogin.php b/app/Services/Logic/Notice/AccountLogin.php new file mode 100644 index 00000000..6ae4b18f --- /dev/null +++ b/app/Services/Logic/Notice/AccountLogin.php @@ -0,0 +1,61 @@ +item_info; + + $userId = $task->item_info['user']['id']; + + $subscribeRepo = new WechatSubscribeRepo(); + + $subscribe = $subscribeRepo->findByUserId($userId); + + if ($subscribe && $subscribe->deleted == 0) { + + $notice = new WechatAccountLoginNotice(); + + return $notice->handle($subscribe, $params); + } + } + + public function createTask(UserModel $user) + { + $task = new TaskModel(); + + $loginIp = $this->getClientIp(); + $loginRegion = kg_ip2region($loginIp); + + $itemInfo = [ + 'user' => [ + 'id' => $user->id, + 'name' => $user->name, + ], + 'login_ip' => $loginIp, + 'login_region' => $loginRegion, + 'login_time' => time(), + ]; + + $task->item_id = $user->id; + $task->item_info = $itemInfo; + $task->item_type = TaskModel::TYPE_NOTICE_ACCOUNT_LOGIN; + $task->priority = TaskModel::PRIORITY_LOW; + $task->status = TaskModel::STATUS_PENDING; + + $task->create(); + } + +} diff --git a/app/Services/Logic/Notice/ConsultReply.php b/app/Services/Logic/Notice/ConsultReply.php new file mode 100644 index 00000000..cdd3c34a --- /dev/null +++ b/app/Services/Logic/Notice/ConsultReply.php @@ -0,0 +1,91 @@ +item_info['consult']['id']; + + $consultRepo = new ConsultRepo(); + + $consult = $consultRepo->findById($consultId); + + $courseRepo = new CourseRepo(); + + $course = $courseRepo->findById($consult->course_id); + + $userRepo = new UserRepo(); + + $user = $userRepo->findById($consult->owner_id); + + $replier = $userRepo->findById($consult->replier_id); + + $params = [ + 'user' => [ + 'id' => $user->id, + 'name' => $user->name, + ], + 'replier' => [ + 'id' => $replier->id, + 'name' => $replier->name, + ], + 'consult' => [ + 'id' => $consult->id, + 'question' => $consult->question, + 'answer' => $consult->answer, + ], + 'course' => [ + 'id' => $course->id, + 'title' => $course->title, + ], + ]; + + $subscribeRepo = new WechatSubscribeRepo(); + + $subscribe = $subscribeRepo->findByUserId($consult->owner_id); + + if ($subscribe && $subscribe->deleted == 0) { + + $notice = new WechatConsultReplyNotice(); + + return $notice->handle($subscribe, $params); + + } else { + + $notice = new SmsConsultReplyNotice(); + + return $notice->handle($user, $params); + } + } + + public function createTask(ConsultModel $consult) + { + $task = new TaskModel(); + + $itemInfo = [ + 'consult' => ['id' => $consult->id], + ]; + + $task->item_id = $consult->id; + $task->item_info = $itemInfo; + $task->item_type = TaskModel::TYPE_NOTICE_CONSULT_REPLY; + $task->priority = TaskModel::PRIORITY_LOW; + $task->status = TaskModel::STATUS_PENDING; + + $task->create(); + } + +} diff --git a/app/Services/Logic/Notice/LiveBegin.php b/app/Services/Logic/Notice/LiveBegin.php new file mode 100644 index 00000000..f125c56c --- /dev/null +++ b/app/Services/Logic/Notice/LiveBegin.php @@ -0,0 +1,99 @@ +item_info['course_user']; + $chapterId = $task->item_info['chapter']['id']; + + $courseRepo = new CourseRepo(); + + $course = $courseRepo->findById($courseUser['course_id']); + + $userRepo = new UserRepo(); + + $user = $userRepo->findById($courseUser['user_id']); + + $chapterRepo = new ChapterRepo(); + + $chapter = $chapterRepo->findById($chapterId); + + $params = [ + 'user' => [ + 'id' => $user->id, + 'name' => $user->name, + ], + 'course' => [ + 'id' => $course->id, + 'title' => $course->title, + ], + 'chapter' => [ + 'id' => $chapter->id, + 'title' => $chapter->title, + ], + 'live' => [ + 'start_time' => $chapter->attrs['start_time'], + 'end_time' => $chapter->attrs['end_time'], + ], + 'course_user' => $courseUser, + ]; + + $subscribeRepo = new WechatSubscribeRepo(); + + $subscribe = $subscribeRepo->findByUserId($user->id); + + if ($subscribe && $subscribe->deleted == 0) { + + $notice = new WechatLiveBeginNotice(); + + return $notice->handle($subscribe, $params); + + } else { + + $notice = new SmsLiveBeginNotice(); + + return $notice->handle($user, $params); + } + } + + public function createTask(ChapterModel $chapter, CourseUserModel $courseUser) + { + $task = new TaskModel(); + + $itemInfo = [ + 'course_user' => [ + 'course_id' => $courseUser->course_id, + 'user_id' => $courseUser->user_id, + 'role_type' => $courseUser->role_type, + 'source_type' => $courseUser->role_type, + ], + 'chapter' => [ + 'id' => $chapter->id, + ], + ]; + + $task->item_id = $chapter->id; + $task->item_info = $itemInfo; + $task->item_type = TaskModel::TYPE_NOTICE_LIVE_BEGIN; + $task->priority = TaskModel::PRIORITY_LOW; + $task->status = TaskModel::STATUS_PENDING; + + $task->create(); + } + +} diff --git a/app/Services/Logic/Notice/OrderFinish.php b/app/Services/Logic/Notice/OrderFinish.php new file mode 100644 index 00000000..5b70e132 --- /dev/null +++ b/app/Services/Logic/Notice/OrderFinish.php @@ -0,0 +1,76 @@ +item_info['order']['id']; + + $orderRepo = new OrderRepo(); + + $order = $orderRepo->findById($orderId); + + $userRepo = new UserRepo(); + + $user = $userRepo->findById($order->owner_id); + + $params = [ + 'user' => [ + 'id' => $user->id, + 'name' => $user->name, + ], + 'order' => [ + 'sn' => $order->sn, + 'subject' => $order->subject, + 'amount' => $order->amount, + ], + ]; + + $subscribeRepo = new WechatSubscribeRepo(); + + $subscribe = $subscribeRepo->findByUserId($order->owner_id); + + if ($subscribe && $subscribe->deleted == 0) { + + $notice = new WechatOrderFinishNotice(); + + return $notice->handle($subscribe, $params); + + } else { + + $notice = new SmsOrderFinishNotice(); + + return $notice->handle($user, $params); + } + } + + public function createTask(OrderModel $order) + { + $task = new TaskModel(); + + $itemInfo = [ + 'order' => ['id' => $order->id], + ]; + + $task->item_id = $order->id; + $task->item_info = $itemInfo; + $task->item_type = TaskModel::TYPE_NOTICE_ORDER_FINISH; + $task->priority = TaskModel::PRIORITY_HIGH; + $task->status = TaskModel::STATUS_PENDING; + + $task->create(); + } + +} diff --git a/app/Services/Logic/Notice/RefundFinish.php b/app/Services/Logic/Notice/RefundFinish.php new file mode 100644 index 00000000..468f5539 --- /dev/null +++ b/app/Services/Logic/Notice/RefundFinish.php @@ -0,0 +1,76 @@ +item_info['refund']['id']; + + $refundRepo = new RefundRepo(); + + $refund = $refundRepo->findById($refundId); + + $userRepo = new UserRepo(); + + $user = $userRepo->findById($refund->owner_id); + + $params = [ + 'user' => [ + 'id' => $user->id, + 'name' => $user->name, + ], + 'order' => [ + 'sn' => $refund->sn, + 'subject' => $refund->subject, + 'amount' => $refund->amount, + ], + ]; + + $subscribeRepo = new WechatSubscribeRepo(); + + $subscribe = $subscribeRepo->findByUserId($refund->owner_id); + + if ($subscribe && $subscribe->deleted == 0) { + + $notice = new WechatRefundFinishNotice(); + + return $notice->handle($subscribe, $params); + + } else { + + $notice = new SmsRefundFinishNotice(); + + return $notice->handle($user, $params); + } + } + + public function createTask(RefundModel $refund) + { + $task = new TaskModel(); + + $itemInfo = [ + 'refund' => ['id' => $refund->id], + ]; + + $task->item_id = $refund->id; + $task->item_info = $itemInfo; + $task->item_type = TaskModel::TYPE_NOTICE_ORDER_FINISH; + $task->priority = TaskModel::PRIORITY_MIDDLE; + $task->status = TaskModel::STATUS_PENDING; + + $task->create(); + } + +} diff --git a/app/Services/Sms/Live.php b/app/Services/Sms/Live.php deleted file mode 100644 index 356f40f1..00000000 --- a/app/Services/Sms/Live.php +++ /dev/null @@ -1,50 +0,0 @@ -findById($userId); - - if (empty($account->phone)) { - return false; - } - - $chapterRepo = new ChapterRepo(); - - $chapter = $chapterRepo->findById($chapterId); - - $courseRepo = new CourseRepo(); - - $course = $courseRepo->findById($chapter->course_id); - - $params = [ - $course->title, - $chapter->title, - $startTime, - ]; - - $templateId = $this->getTemplateId($this->templateCode); - - return $this->send($account->phone, $templateId, $params); - } - -} diff --git a/app/Services/Sms/Notice/ConsultReply.php b/app/Services/Sms/Notice/ConsultReply.php new file mode 100644 index 00000000..85d21f21 --- /dev/null +++ b/app/Services/Sms/Notice/ConsultReply.php @@ -0,0 +1,37 @@ +findById($user->id); + + if (!$account->phone) return null; + + $templateId = $this->getTemplateId($this->templateCode); + + $params = [ + $params['replier']['name'], + $params['course']['title'], + ]; + + return $this->send($account->phone, $templateId, $params); + } + +} diff --git a/app/Services/Sms/Notice/LiveBegin.php b/app/Services/Sms/Notice/LiveBegin.php new file mode 100644 index 00000000..104b8f86 --- /dev/null +++ b/app/Services/Sms/Notice/LiveBegin.php @@ -0,0 +1,38 @@ +findById($user->id); + + if (!$account->phone) return null; + + $params = [ + $params['course']['title'], + $params['chapter']['title'], + date('H:i', $params['live']['start_time']), + ]; + + $templateId = $this->getTemplateId($this->templateCode); + + return $this->send($account->phone, $templateId, $params); + } + +} diff --git a/app/Services/Sms/Notice/OrderFinish.php b/app/Services/Sms/Notice/OrderFinish.php new file mode 100644 index 00000000..e67fd2a0 --- /dev/null +++ b/app/Services/Sms/Notice/OrderFinish.php @@ -0,0 +1,38 @@ +findById($user->id); + + if (!$account->phone) return null; + + $templateId = $this->getTemplateId($this->templateCode); + + $params = [ + $params['order']['subject'], + $params['order']['sn'], + $params['order']['amount'], + ]; + + return $this->send($account->phone, $templateId, $params); + } + +} diff --git a/app/Services/Sms/Notice/RefundFinish.php b/app/Services/Sms/Notice/RefundFinish.php new file mode 100644 index 00000000..f64d8908 --- /dev/null +++ b/app/Services/Sms/Notice/RefundFinish.php @@ -0,0 +1,38 @@ +findById($user->id); + + if (!$account->phone) return null; + + $templateId = $this->getTemplateId($this->templateCode); + + $params = [ + $params['refund']['subject'], + $params['refund']['sn'], + $params['refund']['amount'], + ]; + + return $this->send($account->phone, $templateId, $params); + } + +} diff --git a/app/Services/Sms/Order.php b/app/Services/Sms/Order.php deleted file mode 100644 index 64e4a6df..00000000 --- a/app/Services/Sms/Order.php +++ /dev/null @@ -1,39 +0,0 @@ -findById($order->owner_id); - - if (empty($account->phone)) { - return false; - } - - $templateId = $this->getTemplateId($this->templateCode); - - $params = [ - $order->subject, - $order->sn, - $order->amount, - ]; - - return $this->send($account->phone, $templateId, $params); - } - -} diff --git a/app/Services/Sms/Refund.php b/app/Services/Sms/Refund.php deleted file mode 100644 index 5796f82b..00000000 --- a/app/Services/Sms/Refund.php +++ /dev/null @@ -1,39 +0,0 @@ -findById($refund->owner_id); - - if (empty($account->phone)) { - return false; - } - - $templateId = $this->getTemplateId($this->templateCode); - - $params = [ - $refund->subject, - $refund->sn, - $refund->amount, - ]; - - return $this->send($account->phone, $templateId, $params); - } - -} diff --git a/app/Services/WeChat.php b/app/Services/Wechat.php similarity index 96% rename from app/Services/WeChat.php rename to app/Services/Wechat.php index 55f5ba9d..ed106111 100644 --- a/app/Services/WeChat.php +++ b/app/Services/Wechat.php @@ -5,13 +5,13 @@ namespace App\Services; use EasyWeChat\Factory; use Phalcon\Logger\Adapter\File as FileLogger; -class WeChat extends Service +class Wechat extends Service { /** * @var FileLogger */ - protected $logger; + public $logger; public function __construct() { diff --git a/app/Services/Wechat/Notice/AccountLogin.php b/app/Services/Wechat/Notice/AccountLogin.php new file mode 100644 index 00000000..f05b9191 --- /dev/null +++ b/app/Services/Wechat/Notice/AccountLogin.php @@ -0,0 +1,35 @@ + $first, + 'remark' => $remark, + 'keyword1' => $params['login_region'], + 'keyword2' => date('Y-m-d H:i', $params['login_time']), + ]; + + $templateId = $this->getTemplateId($this->templateCode); + + return $this->send($subscribe->open_id, $templateId, $params); + } + +} diff --git a/app/Services/Wechat/Notice/ConsultReply.php b/app/Services/Wechat/Notice/ConsultReply.php new file mode 100644 index 00000000..3fd1202a --- /dev/null +++ b/app/Services/Wechat/Notice/ConsultReply.php @@ -0,0 +1,37 @@ +open_id; + + $templateId = $this->getTemplateId($this->templateCode); + + $first = sprintf('%s 回复了你的咨询!', $params['replier']['name']); + + $remark = '如果还有其它疑问,请和我们保持联系哦!'; + + $params = [ + 'first' => $first, + 'remark' => $remark, + 'keyword1' => $params['course']['title'], + ]; + + return $this->send($openId, $templateId, $params); + } + +} diff --git a/app/Services/Wechat/Notice/LiveBegin.php b/app/Services/Wechat/Notice/LiveBegin.php new file mode 100644 index 00000000..83077f4d --- /dev/null +++ b/app/Services/Wechat/Notice/LiveBegin.php @@ -0,0 +1,36 @@ + $first, + 'remark' => $remark, + 'keyword1' => $params['course']['title'], + 'keyword2' => $params['chapter']['title'], + 'keyword3' => date('Y-m-d H:i', $params['live']['start_time']), + ]; + + $templateId = $this->getTemplateId($this->templateCode); + + return $this->send($subscribe->open_id, $templateId, $params); + } + +} diff --git a/app/Services/Wechat/Notice/OrderFinish.php b/app/Services/Wechat/Notice/OrderFinish.php new file mode 100644 index 00000000..c21ea2a9 --- /dev/null +++ b/app/Services/Wechat/Notice/OrderFinish.php @@ -0,0 +1,37 @@ + $first, + 'remark' => $remark, + 'keyword1' => $params['order']['subject'], + 'keyword2' => $params['order']['sn'], + 'keyword3' => $params['order']['amount'], + ]; + + $templateId = $this->getTemplateId($this->templateCode); + + return $this->send($subscribe->open_id, $templateId, $params); + } + +} diff --git a/app/Services/Wechat/Notice/RefundFinish.php b/app/Services/Wechat/Notice/RefundFinish.php new file mode 100644 index 00000000..6b2030fe --- /dev/null +++ b/app/Services/Wechat/Notice/RefundFinish.php @@ -0,0 +1,36 @@ + $first, + 'remark' => $remark, + 'keyword1' => $params['refund']['subject'], + 'keyword2' => $params['refund']['sn'], + 'keyword3' => $params['refund']['amount'], + ]; + + $templateId = $this->getTemplateId($this->templateCode); + + return $this->send($subscribe->open_id, $templateId, $params); + } + +} diff --git a/app/Services/WechatNotice.php b/app/Services/WechatNotice.php new file mode 100644 index 00000000..18c85ba4 --- /dev/null +++ b/app/Services/WechatNotice.php @@ -0,0 +1,103 @@ +settings = $this->getSettings('wechat.oa'); + + $this->logger = $this->getLogger('wechat'); + } + + /** + * 发送模板消息 + * + * @param string $openId + * @param string $templateId + * @param array $params + * @param string $url + * @param array $miniProgram + * @return bool + */ + public function send($openId, $templateId, $params, $url = null, $miniProgram = []) + { + $service = new WechatService(); + + $app = $service->getOfficialAccount(); + + $content = [ + 'touser' => $openId, + 'template_id' => $templateId, + 'data' => $this->formatParams($params), + ]; + + if ($url) { + $content['url'] = $url; + } + + if ($miniProgram) { + $content['miniprogram'] = $miniProgram; + } + + try { + + $this->logger->debug('Send Template Message Request ' . kg_json_encode($content)); + + $response = $app->template_message->send($content); + + $this->logger->debug('Send Template Message Response ' . kg_json_encode($response)); + + $result = $response['errcode'] == 0; + + if ($result == false) { + $this->logger->error('Send Template Message Failed ' . kg_json_encode($response)); + } + + } catch (\Exception $e) { + + $this->logger->error('Send Template Message Exception ' . kg_json_encode([ + 'code' => $e->getCode(), + 'message' => $e->getMessage(), + ])); + + $result = false; + } + + return $result; + } + + protected function formatParams($params) + { + if (!empty($params)) { + $params = array_map(function ($value) { + return strval($value); + }, $params); + } + + return $params; + } + + protected function getTemplateId($code) + { + $template = json_decode($this->settings['notice_template'], true); + + return $template[$code] ?? null; + } + +} diff --git a/db/migrations/20201205091213_create_connect_table.php b/db/migrations/20201205091213_create_connect_table.php index 460b2c8e..4e0419da 100644 --- a/db/migrations/20201205091213_create_connect_table.php +++ b/db/migrations/20201205091213_create_connect_table.php @@ -84,7 +84,7 @@ class CreateConnectTable extends Phinx\Migration\AbstractMigration 'after' => 'create_time', ]) ->addIndex(['open_id', 'provider'], [ - 'name' => 'open_id_provider', + 'name' => 'open_provider', 'unique' => false, ]) ->create(); diff --git a/db/migrations/20201212102844_schema_202012121830.php b/db/migrations/20201212102844_schema_202012121830.php index 46f991ea..90512438 100644 --- a/db/migrations/20201212102844_schema_202012121830.php +++ b/db/migrations/20201212102844_schema_202012121830.php @@ -6,15 +6,16 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration { public function change() { - $this->table('kg_connect', [ - 'id' => false, - 'primary_key' => ['id'], - 'engine' => 'InnoDB', - 'encoding' => 'utf8mb4', - 'collation' => 'utf8mb4_general_ci', - 'comment' => '', - 'row_format' => 'DYNAMIC', - ]) + $this->table('kg_consult') + ->addColumn('replier_id', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '回复者编号', + 'after' => 'owner_id', + ]) + ->save(); + $this->table('kg_connect') ->addColumn('union_id', 'string', [ 'null' => false, 'default' => '', @@ -24,63 +25,8 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration 'comment' => 'union_id', 'after' => 'user_id', ]) - ->changeColumn('open_id', 'string', [ - 'null' => false, - 'default' => '', - 'limit' => 50, - 'collation' => 'utf8mb4_general_ci', - 'encoding' => 'utf8mb4', - 'comment' => '开放ID', - 'after' => 'union_id', - ]) - ->changeColumn('open_name', 'string', [ - 'null' => false, - 'default' => '', - 'limit' => 30, - 'collation' => 'utf8mb4_general_ci', - 'encoding' => 'utf8mb4', - 'comment' => '开放名称', - 'after' => 'open_id', - ]) - ->changeColumn('open_avatar', 'string', [ - 'null' => false, - 'default' => '', - 'limit' => 150, - 'collation' => 'utf8mb4_general_ci', - 'encoding' => 'utf8mb4', - 'comment' => '开放头像', - 'after' => 'open_name', - ]) - ->changeColumn('provider', 'integer', [ - 'null' => false, - 'default' => '0', - 'limit' => MysqlAdapter::INT_REGULAR, - 'comment' => '提供方', - 'after' => 'open_avatar', - ]) - ->changeColumn('deleted', 'integer', [ - 'null' => false, - 'default' => '0', - 'limit' => MysqlAdapter::INT_REGULAR, - 'comment' => '删除标识', - 'after' => 'provider', - ]) - ->changeColumn('create_time', 'integer', [ - 'null' => false, - 'default' => '0', - 'limit' => MysqlAdapter::INT_REGULAR, - 'comment' => '创建时间', - 'after' => 'deleted', - ]) - ->changeColumn('update_time', 'integer', [ - 'null' => false, - 'default' => '0', - 'limit' => MysqlAdapter::INT_REGULAR, - 'comment' => '更新时间', - 'after' => 'create_time', - ]) ->addIndex(['union_id', 'provider'], [ - 'name' => 'union_id_provider', + 'name' => 'union_provider', 'unique' => false, ]) ->addIndex(['user_id'], [ @@ -140,6 +86,14 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration 'comment' => '更新时间', 'after' => 'create_time', ]) + ->addIndex(['open_id'], [ + 'name' => 'open_id', + 'unique' => false, + ]) + ->addIndex(['user_id'], [ + 'name' => 'user_id', + 'unique' => false, + ]) ->create(); } } diff --git a/db/migrations/20201212112717_data_202012121830.php b/db/migrations/20201212112717_data_202012121830.php index 53e7efb6..88f41687 100644 --- a/db/migrations/20201212112717_data_202012121830.php +++ b/db/migrations/20201212112717_data_202012121830.php @@ -40,14 +40,42 @@ final class Data202012121830 extends AbstractMigration 'item_key' => 'notify_url', 'item_value' => '', ], + [ + 'section' => 'wechat.oa', + 'item_key' => 'notice_template', + 'item_value' => '{"account_login":"","order_finish":"","refund_finish":"","live_begin":"","consult_reply":""}', + ], ]; $this->table('kg_setting')->insert($rows)->save(); + + $this->updateSmsTemplate(); } public function down() { - $this->execute("DELETE FROM kg_setting WHERE section = 'wechat.oa'"); + $this->getQueryBuilder()->delete('kg_setting')->where(['section' => 'wechat.oa'])->execute(); + } + + protected function updateSmsTemplate() + { + $table = 'kg_setting'; + + $where = ['section' => 'sms', 'item_key' => 'template']; + + $setting = $this->getQueryBuilder()->select('*')->from($table)->where($where)->execute()->fetch('assoc'); + + $itemValue = json_decode($setting['item_value'], true); + + $newItemValue = json_encode([ + 'verify' => $itemValue['verify'], + 'order_finish' => $itemValue['order'], + 'refund_finish' => $itemValue['refund'], + 'live_begin' => $itemValue['live'], + 'consult_reply' => '', + ]); + + $this->getQueryBuilder()->update($table)->where($where)->set('item_value', $newItemValue)->execute(); } } \ No newline at end of file diff --git a/public/static/home/css/common.css b/public/static/home/css/common.css index bf8478c5..aa001338 100644 --- a/public/static/home/css/common.css +++ b/public/static/home/css/common.css @@ -1609,6 +1609,24 @@ margin: 0 10px; } +.my-subscribe { + margin-bottom: 15px; +} + +.my-subscribe .qrcode { + margin: 30px auto; + width: 160px; + height: 160px; +} + +.my-subscribe .tips { + text-align: center; +} + +.my-subscribe .success { + color: green; +} + .order-filter { padding: 15px 20px; } diff --git a/public/static/home/js/user.console.subscribe.js b/public/static/home/js/user.console.subscribe.js new file mode 100644 index 00000000..14dc9fd2 --- /dev/null +++ b/public/static/home/js/user.console.subscribe.js @@ -0,0 +1,29 @@ +layui.use(['jquery'], function () { + + var $ = layui.jquery; + var subscribed = $('input[name=subscribed]').val(); + var interval = null; + + if (subscribed === '0') { + showQrCode(); + interval = setInterval(function () { + queryStatus(); + }, 5000); + } + + function showQrCode() { + $.get('/wechat/oa/subscribe/qrcode', function (res) { + $('#sub-qrcode').html('扫码关注'); + }); + } + + function queryStatus() { + $.get('/wechat/oa/subscribe/status', function (res) { + if (res.status === 1) { + clearInterval(interval); + $('#sub-tips').addClass('success').html('关注公众号成功'); + } + }); + } + +}); \ No newline at end of file diff --git a/scheduler.php b/scheduler.php index b5b27246..78fc9f8f 100644 --- a/scheduler.php +++ b/scheduler.php @@ -13,8 +13,8 @@ $bin = '/usr/local/bin/php'; $scheduler->php($script, $bin, ['--task' => 'deliver', '--action' => 'main']) ->at('*/3 * * * *'); -$scheduler->php($script, $bin, ['--task' => 'live_notify', '--action' => 'main']) - ->at('*/5 * * * *'); +$scheduler->php($script, $bin, ['--task' => 'notice', '--action' => 'main']) + ->at('*/3 * * * *'); $scheduler->php($script, $bin, ['--task' => 'sync_learning', '--action' => 'main']) ->at('*/7 * * * *'); -- Gitee From 64788106c8caee3ed542d2d400f2b500bf28cb9d Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Mon, 21 Dec 2020 16:03:25 +0800 Subject: [PATCH 12/89] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E5=BC=80?= =?UTF-8?q?=E6=94=BE=E7=99=BB=E5=BD=95=E5=A2=9E=E5=8A=A0=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Tasks/DeliverTask.php | 4 ++-- app/Console/Tasks/NoticeTask.php | 2 +- app/Console/Tasks/RefundTask.php | 4 ++-- app/Http/Home/Services/Connect.php | 14 ++++++++++++++ app/Http/Home/Services/WechatOfficialAccount.php | 14 ++++++++------ app/Services/Wechat/Notice/AccountLogin.php | 12 ++++++++++-- scheduler.php | 3 --- 7 files changed, 37 insertions(+), 16 deletions(-) diff --git a/app/Console/Tasks/DeliverTask.php b/app/Console/Tasks/DeliverTask.php index 560c8449..ad7c846b 100644 --- a/app/Console/Tasks/DeliverTask.php +++ b/app/Console/Tasks/DeliverTask.php @@ -26,7 +26,7 @@ class DeliverTask extends Task { $logger = $this->getLogger('order'); - $tasks = $this->findTasks(); + $tasks = $this->findTasks(30); if ($tasks->count() == 0) { return; @@ -244,7 +244,7 @@ class DeliverTask extends Task * @param int $limit * @return ResultsetInterface|Resultset|TaskModel[] */ - protected function findTasks($limit = 100) + protected function findTasks($limit = 30) { $itemType = TaskModel::TYPE_DELIVER; $status = TaskModel::STATUS_PENDING; diff --git a/app/Console/Tasks/NoticeTask.php b/app/Console/Tasks/NoticeTask.php index 4c69fcf6..c4a385d4 100644 --- a/app/Console/Tasks/NoticeTask.php +++ b/app/Console/Tasks/NoticeTask.php @@ -20,7 +20,7 @@ class NoticeTask extends Task { $logger = $this->getLogger('notice'); - $tasks = $this->findTasks(500); + $tasks = $this->findTasks(300); if ($tasks->count() == 0) { return; diff --git a/app/Console/Tasks/RefundTask.php b/app/Console/Tasks/RefundTask.php index ad69ec3c..1697a4e1 100644 --- a/app/Console/Tasks/RefundTask.php +++ b/app/Console/Tasks/RefundTask.php @@ -29,7 +29,7 @@ class RefundTask extends Task { $logger = $this->getLogger('refund'); - $tasks = $this->findTasks(); + $tasks = $this->findTasks(30); if ($tasks->count() == 0) { return; @@ -259,7 +259,7 @@ class RefundTask extends Task } /** - * 处理测试订单退款 + * 处理赞赏订单退款 * * @param OrderModel $order */ diff --git a/app/Http/Home/Services/Connect.php b/app/Http/Home/Services/Connect.php index 0cef8358..2e3a26f5 100644 --- a/app/Http/Home/Services/Connect.php +++ b/app/Http/Home/Services/Connect.php @@ -8,6 +8,7 @@ use App\Repos\Connect as ConnectRepo; use App\Repos\User as UserRepo; use App\Services\Auth\Home as AuthService; use App\Services\Logic\Account\Register as RegisterService; +use App\Services\Logic\Notice\AccountLogin as AccountLoginNoticeService; use App\Services\OAuth\QQ as QQAuth; use App\Services\OAuth\WeiBo as WeiBoAuth; use App\Services\OAuth\WeiXin as WeiXinAuth; @@ -32,6 +33,8 @@ class Connect extends Service $this->handleConnectRelation($user, $openUser); + $this->handleLoginNotice($user); + $auth = $this->getAppAuth(); $auth->saveAuthInfo($user); @@ -57,6 +60,8 @@ class Connect extends Service $this->handleConnectRelation($user, $openUser); + $this->handleLoginNotice($user); + $auth = $this->getAppAuth(); $auth->saveAuthInfo($user); @@ -75,6 +80,8 @@ class Connect extends Service $user = $userRepo->findById($connect->user_id); + $this->handleLoginNotice($user); + $auth = $this->getAppAuth(); $auth->saveAuthInfo($user); @@ -208,4 +215,11 @@ class Connect extends Service } } + protected function handleLoginNotice(UserModel $user) + { + $service = new AccountLoginNoticeService(); + + $service->createTask($user); + } + } diff --git a/app/Http/Home/Services/WechatOfficialAccount.php b/app/Http/Home/Services/WechatOfficialAccount.php index b205ccee..43514f80 100644 --- a/app/Http/Home/Services/WechatOfficialAccount.php +++ b/app/Http/Home/Services/WechatOfficialAccount.php @@ -50,7 +50,7 @@ class WechatOfficialAccount extends Service { $service = new WechatService(); - $service->logger->info('Received Message:' . json_encode($message)); + $service->logger->debug('Received Message ' . json_encode($message)); switch ($message['MsgType']) { case 'event': @@ -74,7 +74,7 @@ class WechatOfficialAccount extends Service return $this->handleLocationEvent($message); break; default: - return $message['Event']; + return $this->emptyReplyMessage(); break; } break; @@ -118,7 +118,7 @@ class WechatOfficialAccount extends Service $this->handleSubscribeRelation($userId, $openId); - return new TextMessage("欢迎您的光临!"); + return new TextMessage('开心呀,我们又多了一个小伙伴!'); } protected function handleUnsubscribeEvent($message) @@ -134,7 +134,7 @@ class WechatOfficialAccount extends Service $subscribe->update(); } - return new TextMessage("我们又少了一个可爱的小伙伴!"); + return new TextMessage('伤心呀,我们又少了一个小伙伴!'); } protected function handleScanEvent($message) @@ -198,20 +198,22 @@ class WechatOfficialAccount extends Service protected function emptyReplyMessage() { - return new TextMessage(""); + return new TextMessage(''); } protected function defaultReplyMessage() { - return new TextMessage("没有匹配的服务,如有需要请联系客服!"); + return new TextMessage('没有匹配的服务,如有需要请联系客服!'); } protected function handleSubscribeRelation($userId, $openId) { $validator = new UserValidator(); + $validator->checkUser($userId); $subscribeRepo = new WechatSubscribeRepo(); + $subscribe = $subscribeRepo->findByOpenId($openId); if ($subscribe) { diff --git a/app/Services/Wechat/Notice/AccountLogin.php b/app/Services/Wechat/Notice/AccountLogin.php index f05b9191..b4e901e7 100644 --- a/app/Services/Wechat/Notice/AccountLogin.php +++ b/app/Services/Wechat/Notice/AccountLogin.php @@ -20,11 +20,19 @@ class AccountLogin extends WechatNotice $first = '你好,登录系统成功!'; $remark = '如果非本人操作,请立即修改密码哦!'; + $loginRegion = implode('/', [ + $params['login_region']['country'], + $params['login_region']['province'], + $params['login_region']['city'], + ]); + + $loginTime = date('Y-m-d H:i:s', $params['login_time']); + $params = [ 'first' => $first, 'remark' => $remark, - 'keyword1' => $params['login_region'], - 'keyword2' => date('Y-m-d H:i', $params['login_time']), + 'keyword1' => $loginRegion, + 'keyword2' => $loginTime, ]; $templateId = $this->getTemplateId($this->templateCode); diff --git a/scheduler.php b/scheduler.php index 78fc9f8f..f363c2e7 100644 --- a/scheduler.php +++ b/scheduler.php @@ -49,9 +49,6 @@ $scheduler->php($script, $bin, ['--task' => 'unlock_user', '--action' => 'main'] $scheduler->php($script, $bin, ['--task' => 'revoke_vip', '--action' => 'main']) ->daily(3, 11); -$scheduler->php($script, $bin, ['--task' => 'clean_token', '--action' => 'main']) - ->daily(3, 17); - $scheduler->php($script, $bin, ['--task' => 'sitemap', '--action' => 'main']) ->daily(4, 3); -- Gitee From aab39aee938e50d503c36b87ede8fa06d773cb6d Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Mon, 21 Dec 2020 17:29:42 +0800 Subject: [PATCH 13/89] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E5=BC=80?= =?UTF-8?q?=E6=94=BE=E7=99=BB=E5=BD=95=E5=A2=9E=E5=8A=A0=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E9=80=9A=E7=9F=A5=20=E9=A1=BA=E5=BB=B6=E6=BC=94?= =?UTF-8?q?=E7=A4=BA=E7=9B=B4=E6=92=AD=E8=AF=BE=E7=A8=8B=E6=97=A5=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Tasks/RenewLiveCourseDemoTask.php | 65 +++++++++++++++++++ app/Http/Admin/Services/Setting.php | 2 +- scheduler.php | 3 + 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 app/Console/Tasks/RenewLiveCourseDemoTask.php diff --git a/app/Console/Tasks/RenewLiveCourseDemoTask.php b/app/Console/Tasks/RenewLiveCourseDemoTask.php new file mode 100644 index 00000000..18c9d516 --- /dev/null +++ b/app/Console/Tasks/RenewLiveCourseDemoTask.php @@ -0,0 +1,65 @@ +findById(1393); + + $chapters = $courseRepo->findLessons($course->id); + + $chapterRepo = new ChapterRepo(); + + foreach ($chapters as $chapter) { + + $live = $chapterRepo->findChapterLive($chapter->id); + + if ($live->start_time > time()) { + continue; + } + + $startTime = strtotime('+1 month', $live->start_time); + $endTime = strtotime('+1 month', $live->end_time); + + $live->start_time = $startTime; + $live->end_time = $endTime; + + $live->update(); + + $attrs = $chapter->attrs; + + $attrs['start_time'] = $startTime; + $attrs['end_time'] = $endTime; + + $chapter->attrs = $attrs; + + $chapter->update(); + } + + $statService = new CourseStatService(); + + $statService->updateLiveAttrs($course->id); + + $cache = new CourseChapterListCache(); + + $cache->rebuild($course->id); + } + +} diff --git a/app/Http/Admin/Services/Setting.php b/app/Http/Admin/Services/Setting.php index e8779d8e..6d2cce3a 100644 --- a/app/Http/Admin/Services/Setting.php +++ b/app/Http/Admin/Services/Setting.php @@ -101,7 +101,7 @@ class Setting extends Service */ if ($items->count() > 0) { foreach ($items as $item) { - $case1 = preg_match('/(id|auth|key|secret|password|pwd)$/', $item->item_key); + $case1 = preg_match('/(id|auth|key|secret|token|password|pwd)$/', $item->item_key); $case2 = $this->dispatcher->getControllerName() == 'setting'; if ($case1 && $case2) { $item->item_value = '***'; diff --git a/scheduler.php b/scheduler.php index f363c2e7..b1175a1b 100644 --- a/scheduler.php +++ b/scheduler.php @@ -52,4 +52,7 @@ $scheduler->php($script, $bin, ['--task' => 'revoke_vip', '--action' => 'main']) $scheduler->php($script, $bin, ['--task' => 'sitemap', '--action' => 'main']) ->daily(4, 3); +$scheduler->php($script, $bin, ['--task' => 'renew_live_course_demo', '--action' => 'main']) + ->daily(4, 7); + $scheduler->run(); \ No newline at end of file -- Gitee From 9650d9b10c8020d2feda3c6d689add51de76a5f2 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Mon, 21 Dec 2020 20:15:33 +0800 Subject: [PATCH 14/89] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=92=8C=E4=BD=8E=E5=93=81=E8=B4=A8=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=97=A0=E6=B3=95=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Admin/Services/AuthNode.php | 12 +++++++++--- app/Http/Admin/Services/Role.php | 21 +++++++++++++++++---- app/Services/ChapterVod.php | 5 ++++- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 52d6bf1e..db2ec7d8 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -34,14 +34,14 @@ class AuthNode extends Service 'title' => '分类列表', 'type' => 'button', 'route' => 'admin.category.list', - 'params' => ['type' => 'course'], + 'params' => ['type' => 1], ], [ 'id' => '1-2-2', 'title' => '添加分类', 'type' => 'button', 'route' => 'admin.category.add', - 'params' => ['type' => 'course'], + 'params' => ['type' => 1], ], [ 'id' => '1-2-3', @@ -90,7 +90,7 @@ class AuthNode extends Service 'id' => '1-1-5', 'title' => '删除课程', 'type' => 'button', - 'route' => 'admin.course.edit', + 'route' => 'admin.course.delete', ], [ 'id' => '1-1-6', @@ -529,6 +529,12 @@ class AuthNode extends Service ], [ 'id' => '3-2-3', + 'title' => '交易详情', + 'type' => 'button', + 'route' => 'admin.trade.show', + ], + [ + 'id' => '3-2-4', 'title' => '交易退款', 'type' => 'button', 'route' => 'admin.trade.refund', diff --git a/app/Http/Admin/Services/Role.php b/app/Http/Admin/Services/Role.php index 86bade39..c9459b33 100644 --- a/app/Http/Admin/Services/Role.php +++ b/app/Http/Admin/Services/Role.php @@ -143,23 +143,24 @@ class Role extends Service if (in_array('admin.course.list', $routes)) { $list[] = 'admin.course.chapters'; $list[] = 'admin.chapter.lessons'; + $list[] = 'admin.chapter.resources'; } if (array_intersect(['admin.course.add', 'admin.course.edit'], $routes)) { $list[] = 'admin.chapter.add'; $list[] = 'admin.chapter.edit'; + $list[] = 'admin.chapter.create'; + $list[] = 'admin.chapter.update'; $list[] = 'admin.chapter.content'; - } - - if (array_intersect(['admin.chapter.add', 'admin.chapter.edit'], $routes)) { $list[] = 'admin.resource.create'; $list[] = 'admin.resource.update'; - $list[] = 'admin.resource.delete'; } if (in_array('admin.course.delete', $routes)) { $list[] = 'admin.chapter.delete'; $list[] = 'admin.chapter.restore'; + $list[] = 'admin.resource.delete'; + $list[] = 'admin.resource.restore'; } if (in_array('admin.category.list', $routes)) { @@ -175,6 +176,18 @@ class Role extends Service $list[] = 'admin.category.list'; } + if (in_array('admin.order.show', $routes)) { + $list[] = 'admin.order.status_history'; + } + + if (in_array('admin.trade.show', $routes)) { + $list[] = 'admin.trade.status_history'; + } + + if (in_array('admin.refund.show', $routes)) { + $list[] = 'admin.refund.status_history'; + } + $list = array_unique($list); return array_values($list); diff --git a/app/Services/ChapterVod.php b/app/Services/ChapterVod.php index fe711dc6..89d6d292 100644 --- a/app/Services/ChapterVod.php +++ b/app/Services/ChapterVod.php @@ -41,9 +41,12 @@ class ChapterVod extends Service $vodTemplates = $this->getVodTemplates(); + /** + * 腾讯云播放器只支持[od|hd|sd],遇到fd替换为od + */ foreach ($vodTemplates as $key => $template) { if ($height >= $template['height']) { - return $key; + return $key == 'fd' ? $default : $key; } } -- Gitee From 966b6700b225e8dfa0f5dfb9aca467578bb79e7e Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Wed, 23 Dec 2020 11:44:21 +0800 Subject: [PATCH 15/89] =?UTF-8?q?=E5=A2=9E=E5=8A=A0v1.2.2=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 20 +++++++++++++++++++ README.md | 8 +++++--- .../Home/Services/WechatOfficialAccount.php | 5 ++++- app/Library/AppInfo.php | 2 +- app/Services/Wechat/Notice/ConsultReply.php | 8 +++----- 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50174e64..f42c92f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +### [v1.2.2](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.2)(2020-12-24) + +#### 增加 + +- 登录账户微信提醒 +- 购买成功微信提醒 +- 退款成功微信提醒 +- 开始直播微信提醒 +- 咨询回复微信提醒 +- 咨询回复短信提醒 + +#### 修复 + +- 创建章节,关联表数据没有生成 +- 创建群组,没有生成max_im_group_id缓存 +- 课程分类列表没有过滤掉帮助分类的内容 +- 创建角色字段routes MySQL text 类型报错 +- 低品质视频无法播放 +- 后台遗漏的权限 + ### [v1.2.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.1)(2020-12-10) - 增加QQ,微信,微博第三方登录 - 代码优化以及问题修复 diff --git a/README.md b/README.md index a6a49470..3a7b980b 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ 酷瓜云课堂,依托腾讯云基础服务架构,采用C扩展框架Phalcon开发,GPL-2.0开源协议,致力开源网课系统,开源网校系统,开源在线教育系统。 -![](https://img.shields.io/static/v1?label=release&message=1.2.1&color=blue) -![](https://img.shields.io/static/v1?label=stars&message=112&color=blue) -![](https://img.shields.io/static/v1?label=forks&message=41&color=blue) +![](https://img.shields.io/static/v1?label=release&message=1.2.2&color=blue) +![](https://img.shields.io/static/v1?label=stars&message=136&color=blue) +![](https://img.shields.io/static/v1?label=forks&message=50&color=blue) ![](https://img.shields.io/static/v1?label=license&message=GPL-2.0&color=blue) #### 系统功能 @@ -86,3 +86,5 @@ Tips: 测试支付请用手机号注册一个新账户,以便接收订单通 - 系统定制 - 企业授权 +毫无保留的真开源不容易,如果对你有帮助,请给我们 **STAR** !!! + diff --git a/app/Http/Home/Services/WechatOfficialAccount.php b/app/Http/Home/Services/WechatOfficialAccount.php index 43514f80..ea19fd02 100644 --- a/app/Http/Home/Services/WechatOfficialAccount.php +++ b/app/Http/Home/Services/WechatOfficialAccount.php @@ -6,7 +6,7 @@ use App\Models\WechatSubscribe as WechatSubscribeModel; use App\Repos\WechatSubscribe as WechatSubscribeRepo; use App\Services\Wechat as WechatService; use App\Validators\User as UserValidator; -use EasyWechat\Kernel\Messages\Text as TextMessage; +use EasyWeChat\Kernel\Messages\Text as TextMessage; class WechatOfficialAccount extends Service { @@ -151,14 +151,17 @@ class WechatOfficialAccount extends Service protected function handleClickEvent($message) { + $this->defaultReplyMessage(); } protected function handleViewEvent($message) { + $this->defaultReplyMessage(); } protected function handleLocationEvent($message) { + $this->defaultReplyMessage(); } protected function handleTextReply($message) diff --git a/app/Library/AppInfo.php b/app/Library/AppInfo.php index e0ab2ed3..44cf5878 100644 --- a/app/Library/AppInfo.php +++ b/app/Library/AppInfo.php @@ -11,7 +11,7 @@ class AppInfo protected $link = 'https://gitee.com/koogua'; - protected $version = '1.2.1'; + protected $version = '1.2.2'; public function __get($name) { diff --git a/app/Services/Wechat/Notice/ConsultReply.php b/app/Services/Wechat/Notice/ConsultReply.php index 3fd1202a..f33db7f9 100644 --- a/app/Services/Wechat/Notice/ConsultReply.php +++ b/app/Services/Wechat/Notice/ConsultReply.php @@ -17,10 +17,6 @@ class ConsultReply extends WechatNotice */ public function handle(WechatSubscribeModel $subscribe, array $params) { - $openId = $subscribe->open_id; - - $templateId = $this->getTemplateId($this->templateCode); - $first = sprintf('%s 回复了你的咨询!', $params['replier']['name']); $remark = '如果还有其它疑问,请和我们保持联系哦!'; @@ -31,7 +27,9 @@ class ConsultReply extends WechatNotice 'keyword1' => $params['course']['title'], ]; - return $this->send($openId, $templateId, $params); + $templateId = $this->getTemplateId($this->templateCode); + + return $this->send($subscribe->open_id, $templateId, $params); } } -- Gitee From d9967fcdf2ca23a5a7980764e456059a9776e5d4 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Wed, 23 Dec 2020 16:17:41 +0800 Subject: [PATCH 16/89] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3a7b980b..a0268755 100644 --- a/README.md +++ b/README.md @@ -86,5 +86,7 @@ Tips: 测试支付请用手机号注册一个新账户,以便接收订单通 - 系统定制 - 企业授权 +#### 开源助力 + 毫无保留的真开源不容易,如果对你有帮助,请给我们 **STAR** !!! -- Gitee From a633f74e55cf52cb5c636a0cbb1ef297f7ffd281 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Fri, 25 Dec 2020 12:16:02 +0800 Subject: [PATCH 17/89] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=94=9F=E6=88=90sitemap.xml=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Tasks/SitemapTask.php | 2 +- public/sitemap.xml | 10331 ---------------------------- 2 files changed, 1 insertion(+), 10332 deletions(-) delete mode 100644 public/sitemap.xml diff --git a/app/Console/Tasks/SitemapTask.php b/app/Console/Tasks/SitemapTask.php index e955055c..712e0c7a 100644 --- a/app/Console/Tasks/SitemapTask.php +++ b/app/Console/Tasks/SitemapTask.php @@ -31,7 +31,7 @@ class SitemapTask extends Task $this->sitemap = new Sitemap(); - $filename = public_path('sitemap.xml'); + $filename = tmp_path('sitemap.xml'); $this->addIndex(); $this->addCourses(); diff --git a/public/sitemap.xml b/public/sitemap.xml deleted file mode 100644 index f8dd1b64..00000000 --- a/public/sitemap.xml +++ /dev/null @@ -1,10331 +0,0 @@ - - - - https://ctc.koogua.com - 1 - - - https://ctc.koogua.com/course/5 - 0.8 - - - https://ctc.koogua.com/course/6 - 0.8 - - - https://ctc.koogua.com/course/8 - 0.8 - - - https://ctc.koogua.com/course/9 - 0.8 - - - https://ctc.koogua.com/course/10 - 0.8 - - - https://ctc.koogua.com/course/12 - 0.8 - - - https://ctc.koogua.com/course/14 - 0.8 - - - https://ctc.koogua.com/course/15 - 0.8 - - - https://ctc.koogua.com/course/17 - 0.8 - - - https://ctc.koogua.com/course/18 - 0.8 - - - https://ctc.koogua.com/course/20 - 0.8 - - - https://ctc.koogua.com/course/21 - 0.8 - - - https://ctc.koogua.com/course/22 - 0.8 - - - https://ctc.koogua.com/course/23 - 0.8 - - - https://ctc.koogua.com/course/24 - 0.8 - - - https://ctc.koogua.com/course/26 - 0.8 - - - https://ctc.koogua.com/course/30 - 0.8 - - - https://ctc.koogua.com/course/31 - 0.8 - - - https://ctc.koogua.com/course/32 - 0.8 - - - https://ctc.koogua.com/course/33 - 0.8 - - - https://ctc.koogua.com/course/34 - 0.8 - - - https://ctc.koogua.com/course/36 - 0.8 - - - https://ctc.koogua.com/course/37 - 0.8 - - - https://ctc.koogua.com/course/39 - 0.8 - - - https://ctc.koogua.com/course/40 - 0.8 - - - https://ctc.koogua.com/course/41 - 0.8 - - - https://ctc.koogua.com/course/42 - 0.8 - - - https://ctc.koogua.com/course/44 - 0.8 - - - https://ctc.koogua.com/course/46 - 0.8 - - - https://ctc.koogua.com/course/47 - 0.8 - - - https://ctc.koogua.com/course/48 - 0.8 - - - https://ctc.koogua.com/course/50 - 0.8 - - - https://ctc.koogua.com/course/52 - 0.8 - - - https://ctc.koogua.com/course/54 - 0.8 - - - https://ctc.koogua.com/course/56 - 0.8 - - - https://ctc.koogua.com/course/57 - 0.8 - - - https://ctc.koogua.com/course/58 - 0.8 - - - https://ctc.koogua.com/course/59 - 0.8 - - - https://ctc.koogua.com/course/60 - 0.8 - - - https://ctc.koogua.com/course/62 - 0.8 - - - https://ctc.koogua.com/course/65 - 0.8 - - - https://ctc.koogua.com/course/68 - 0.8 - - - https://ctc.koogua.com/course/69 - 0.8 - - - https://ctc.koogua.com/course/71 - 0.8 - - - https://ctc.koogua.com/course/72 - 0.8 - - - https://ctc.koogua.com/course/74 - 0.8 - - - https://ctc.koogua.com/course/76 - 0.8 - - - https://ctc.koogua.com/course/77 - 0.8 - - - https://ctc.koogua.com/course/80 - 0.8 - - - https://ctc.koogua.com/course/81 - 0.8 - - - https://ctc.koogua.com/course/85 - 0.8 - - - https://ctc.koogua.com/course/90 - 0.8 - - - https://ctc.koogua.com/course/91 - 0.8 - - - https://ctc.koogua.com/course/93 - 0.8 - - - https://ctc.koogua.com/course/94 - 0.8 - - - https://ctc.koogua.com/course/99 - 0.8 - - - https://ctc.koogua.com/course/100 - 0.8 - - - https://ctc.koogua.com/course/101 - 0.8 - - - https://ctc.koogua.com/course/102 - 0.8 - - - https://ctc.koogua.com/course/103 - 0.8 - - - https://ctc.koogua.com/course/104 - 0.8 - - - https://ctc.koogua.com/course/109 - 0.8 - - - https://ctc.koogua.com/course/110 - 0.8 - - - https://ctc.koogua.com/course/112 - 0.8 - - - https://ctc.koogua.com/course/114 - 0.8 - - - https://ctc.koogua.com/course/115 - 0.8 - - - https://ctc.koogua.com/course/117 - 0.8 - - - https://ctc.koogua.com/course/118 - 0.8 - - - https://ctc.koogua.com/course/119 - 0.8 - - - https://ctc.koogua.com/course/120 - 0.8 - - - https://ctc.koogua.com/course/121 - 0.8 - - - https://ctc.koogua.com/course/122 - 0.8 - - - https://ctc.koogua.com/course/123 - 0.8 - - - https://ctc.koogua.com/course/124 - 0.8 - - - https://ctc.koogua.com/course/125 - 0.8 - - - https://ctc.koogua.com/course/126 - 0.8 - - - https://ctc.koogua.com/course/127 - 0.8 - - - https://ctc.koogua.com/course/128 - 0.8 - - - https://ctc.koogua.com/course/130 - 0.8 - - - https://ctc.koogua.com/course/131 - 0.8 - - - https://ctc.koogua.com/course/132 - 0.8 - - - https://ctc.koogua.com/course/133 - 0.8 - - - https://ctc.koogua.com/course/134 - 0.8 - - - https://ctc.koogua.com/course/135 - 0.8 - - - https://ctc.koogua.com/course/136 - 0.8 - - - https://ctc.koogua.com/course/137 - 0.8 - - - https://ctc.koogua.com/course/138 - 0.8 - - - https://ctc.koogua.com/course/139 - 0.8 - - - https://ctc.koogua.com/course/140 - 0.8 - - - https://ctc.koogua.com/course/141 - 0.8 - - - https://ctc.koogua.com/course/143 - 0.8 - - - https://ctc.koogua.com/course/144 - 0.8 - - - https://ctc.koogua.com/course/145 - 0.8 - - - https://ctc.koogua.com/course/146 - 0.8 - - - https://ctc.koogua.com/course/147 - 0.8 - - - https://ctc.koogua.com/course/148 - 0.8 - - - https://ctc.koogua.com/course/150 - 0.8 - - - https://ctc.koogua.com/course/152 - 0.8 - - - https://ctc.koogua.com/course/153 - 0.8 - - - https://ctc.koogua.com/course/154 - 0.8 - - - https://ctc.koogua.com/course/155 - 0.8 - - - https://ctc.koogua.com/course/157 - 0.8 - - - https://ctc.koogua.com/course/158 - 0.8 - - - https://ctc.koogua.com/course/159 - 0.8 - - - https://ctc.koogua.com/course/160 - 0.8 - - - https://ctc.koogua.com/course/161 - 0.8 - - - https://ctc.koogua.com/course/162 - 0.8 - - - https://ctc.koogua.com/course/164 - 0.8 - - - https://ctc.koogua.com/course/165 - 0.8 - - - https://ctc.koogua.com/course/166 - 0.8 - - - https://ctc.koogua.com/course/167 - 0.8 - - - https://ctc.koogua.com/course/170 - 0.8 - - - https://ctc.koogua.com/course/171 - 0.8 - - - https://ctc.koogua.com/course/172 - 0.8 - - - https://ctc.koogua.com/course/174 - 0.8 - - - https://ctc.koogua.com/course/176 - 0.8 - - - https://ctc.koogua.com/course/177 - 0.8 - - - https://ctc.koogua.com/course/178 - 0.8 - - - https://ctc.koogua.com/course/180 - 0.8 - - - https://ctc.koogua.com/course/182 - 0.8 - - - https://ctc.koogua.com/course/184 - 0.8 - - - https://ctc.koogua.com/course/185 - 0.8 - - - https://ctc.koogua.com/course/186 - 0.8 - - - https://ctc.koogua.com/course/191 - 0.8 - - - https://ctc.koogua.com/course/192 - 0.8 - - - https://ctc.koogua.com/course/193 - 0.8 - - - https://ctc.koogua.com/course/194 - 0.8 - - - https://ctc.koogua.com/course/195 - 0.8 - - - https://ctc.koogua.com/course/196 - 0.8 - - - https://ctc.koogua.com/course/199 - 0.8 - - - https://ctc.koogua.com/course/201 - 0.8 - - - https://ctc.koogua.com/course/202 - 0.8 - - - https://ctc.koogua.com/course/204 - 0.8 - - - https://ctc.koogua.com/course/205 - 0.8 - - - https://ctc.koogua.com/course/207 - 0.8 - - - https://ctc.koogua.com/course/208 - 0.8 - - - https://ctc.koogua.com/course/213 - 0.8 - - - https://ctc.koogua.com/course/214 - 0.8 - - - https://ctc.koogua.com/course/217 - 0.8 - - - https://ctc.koogua.com/course/218 - 0.8 - - - https://ctc.koogua.com/course/219 - 0.8 - - - https://ctc.koogua.com/course/222 - 0.8 - - - https://ctc.koogua.com/course/223 - 0.8 - - - https://ctc.koogua.com/course/224 - 0.8 - - - https://ctc.koogua.com/course/225 - 0.8 - - - https://ctc.koogua.com/course/227 - 0.8 - - - https://ctc.koogua.com/course/229 - 0.8 - - - https://ctc.koogua.com/course/230 - 0.8 - - - https://ctc.koogua.com/course/236 - 0.8 - - - https://ctc.koogua.com/course/239 - 0.8 - - - https://ctc.koogua.com/course/240 - 0.8 - - - https://ctc.koogua.com/course/243 - 0.8 - - - https://ctc.koogua.com/course/244 - 0.8 - - - https://ctc.koogua.com/course/247 - 0.8 - - - https://ctc.koogua.com/course/248 - 0.8 - - - https://ctc.koogua.com/course/249 - 0.8 - - - https://ctc.koogua.com/course/250 - 0.8 - - - https://ctc.koogua.com/course/251 - 0.8 - - - https://ctc.koogua.com/course/252 - 0.8 - - - https://ctc.koogua.com/course/256 - 0.8 - - - https://ctc.koogua.com/course/257 - 0.8 - - - https://ctc.koogua.com/course/259 - 0.8 - - - https://ctc.koogua.com/course/260 - 0.8 - - - https://ctc.koogua.com/course/261 - 0.8 - - - https://ctc.koogua.com/course/262 - 0.8 - - - https://ctc.koogua.com/course/263 - 0.8 - - - https://ctc.koogua.com/course/265 - 0.8 - - - https://ctc.koogua.com/course/267 - 0.8 - - - https://ctc.koogua.com/course/268 - 0.8 - - - https://ctc.koogua.com/course/269 - 0.8 - - - https://ctc.koogua.com/course/271 - 0.8 - - - https://ctc.koogua.com/course/272 - 0.8 - - - https://ctc.koogua.com/course/277 - 0.8 - - - https://ctc.koogua.com/course/278 - 0.8 - - - https://ctc.koogua.com/course/282 - 0.8 - - - https://ctc.koogua.com/course/283 - 0.8 - - - https://ctc.koogua.com/course/284 - 0.8 - - - https://ctc.koogua.com/course/285 - 0.8 - - - https://ctc.koogua.com/course/286 - 0.8 - - - https://ctc.koogua.com/course/287 - 0.8 - - - https://ctc.koogua.com/course/288 - 0.8 - - - https://ctc.koogua.com/course/289 - 0.8 - - - https://ctc.koogua.com/course/291 - 0.8 - - - https://ctc.koogua.com/course/294 - 0.8 - - - https://ctc.koogua.com/course/297 - 0.8 - - - https://ctc.koogua.com/course/299 - 0.8 - - - https://ctc.koogua.com/course/300 - 0.8 - - - https://ctc.koogua.com/course/302 - 0.8 - - - https://ctc.koogua.com/course/303 - 0.8 - - - https://ctc.koogua.com/course/304 - 0.8 - - - https://ctc.koogua.com/course/308 - 0.8 - - - https://ctc.koogua.com/course/310 - 0.8 - - - https://ctc.koogua.com/course/311 - 0.8 - - - https://ctc.koogua.com/course/312 - 0.8 - - - https://ctc.koogua.com/course/313 - 0.8 - - - https://ctc.koogua.com/course/317 - 0.8 - - - https://ctc.koogua.com/course/329 - 0.8 - - - https://ctc.koogua.com/course/330 - 0.8 - - - https://ctc.koogua.com/course/331 - 0.8 - - - https://ctc.koogua.com/course/333 - 0.8 - - - https://ctc.koogua.com/course/334 - 0.8 - - - https://ctc.koogua.com/course/337 - 0.8 - - - https://ctc.koogua.com/course/338 - 0.8 - - - https://ctc.koogua.com/course/342 - 0.8 - - - https://ctc.koogua.com/course/343 - 0.8 - - - https://ctc.koogua.com/course/349 - 0.8 - - - https://ctc.koogua.com/course/350 - 0.8 - - - https://ctc.koogua.com/course/352 - 0.8 - - - https://ctc.koogua.com/course/354 - 0.8 - - - https://ctc.koogua.com/course/356 - 0.8 - - - https://ctc.koogua.com/course/357 - 0.8 - - - https://ctc.koogua.com/course/358 - 0.8 - - - https://ctc.koogua.com/course/360 - 0.8 - - - https://ctc.koogua.com/course/362 - 0.8 - - - https://ctc.koogua.com/course/363 - 0.8 - - - https://ctc.koogua.com/course/364 - 0.8 - - - https://ctc.koogua.com/course/365 - 0.8 - - - https://ctc.koogua.com/course/366 - 0.8 - - - https://ctc.koogua.com/course/368 - 0.8 - - - https://ctc.koogua.com/course/370 - 0.8 - - - https://ctc.koogua.com/course/371 - 0.8 - - - https://ctc.koogua.com/course/372 - 0.8 - - - https://ctc.koogua.com/course/373 - 0.8 - - - https://ctc.koogua.com/course/374 - 0.8 - - - https://ctc.koogua.com/course/375 - 0.8 - - - https://ctc.koogua.com/course/376 - 0.8 - - - https://ctc.koogua.com/course/377 - 0.8 - - - https://ctc.koogua.com/course/379 - 0.8 - - - https://ctc.koogua.com/course/380 - 0.8 - - - https://ctc.koogua.com/course/381 - 0.8 - - - https://ctc.koogua.com/course/382 - 0.8 - - - https://ctc.koogua.com/course/383 - 0.8 - - - https://ctc.koogua.com/course/384 - 0.8 - - - https://ctc.koogua.com/course/385 - 0.8 - - - https://ctc.koogua.com/course/386 - 0.8 - - - https://ctc.koogua.com/course/387 - 0.8 - - - https://ctc.koogua.com/course/388 - 0.8 - - - https://ctc.koogua.com/course/390 - 0.8 - - - https://ctc.koogua.com/course/391 - 0.8 - - - https://ctc.koogua.com/course/393 - 0.8 - - - https://ctc.koogua.com/course/394 - 0.8 - - - https://ctc.koogua.com/course/396 - 0.8 - - - https://ctc.koogua.com/course/398 - 0.8 - - - https://ctc.koogua.com/course/399 - 0.8 - - - https://ctc.koogua.com/course/400 - 0.8 - - - https://ctc.koogua.com/course/401 - 0.8 - - - https://ctc.koogua.com/course/402 - 0.8 - - - https://ctc.koogua.com/course/403 - 0.8 - - - https://ctc.koogua.com/course/404 - 0.8 - - - https://ctc.koogua.com/course/405 - 0.8 - - - https://ctc.koogua.com/course/406 - 0.8 - - - https://ctc.koogua.com/course/409 - 0.8 - - - https://ctc.koogua.com/course/410 - 0.8 - - - https://ctc.koogua.com/course/411 - 0.8 - - - https://ctc.koogua.com/course/412 - 0.8 - - - https://ctc.koogua.com/course/413 - 0.8 - - - https://ctc.koogua.com/course/414 - 0.8 - - - https://ctc.koogua.com/course/415 - 0.8 - - - https://ctc.koogua.com/course/416 - 0.8 - - - https://ctc.koogua.com/course/417 - 0.8 - - - https://ctc.koogua.com/course/418 - 0.8 - - - https://ctc.koogua.com/course/419 - 0.8 - - - https://ctc.koogua.com/course/420 - 0.8 - - - https://ctc.koogua.com/course/421 - 0.8 - - - https://ctc.koogua.com/course/422 - 0.8 - - - https://ctc.koogua.com/course/423 - 0.8 - - - https://ctc.koogua.com/course/424 - 0.8 - - - https://ctc.koogua.com/course/425 - 0.8 - - - https://ctc.koogua.com/course/426 - 0.8 - - - https://ctc.koogua.com/course/427 - 0.8 - - - https://ctc.koogua.com/course/428 - 0.8 - - - https://ctc.koogua.com/course/429 - 0.8 - - - https://ctc.koogua.com/course/430 - 0.8 - - - https://ctc.koogua.com/course/431 - 0.8 - - - https://ctc.koogua.com/course/433 - 0.8 - - - https://ctc.koogua.com/course/436 - 0.8 - - - https://ctc.koogua.com/course/437 - 0.8 - - - https://ctc.koogua.com/course/438 - 0.8 - - - https://ctc.koogua.com/course/440 - 0.8 - - - https://ctc.koogua.com/course/441 - 0.8 - - - https://ctc.koogua.com/course/443 - 0.8 - - - https://ctc.koogua.com/course/444 - 0.8 - - - https://ctc.koogua.com/course/446 - 0.8 - - - https://ctc.koogua.com/course/448 - 0.8 - - - https://ctc.koogua.com/course/449 - 0.8 - - - https://ctc.koogua.com/course/450 - 0.8 - - - https://ctc.koogua.com/course/451 - 0.8 - - - https://ctc.koogua.com/course/452 - 0.8 - - - https://ctc.koogua.com/course/453 - 0.8 - - - https://ctc.koogua.com/course/454 - 0.8 - - - https://ctc.koogua.com/course/456 - 0.8 - - - https://ctc.koogua.com/course/459 - 0.8 - - - https://ctc.koogua.com/course/460 - 0.8 - - - https://ctc.koogua.com/course/461 - 0.8 - - - https://ctc.koogua.com/course/462 - 0.8 - - - https://ctc.koogua.com/course/463 - 0.8 - - - https://ctc.koogua.com/course/464 - 0.8 - - - https://ctc.koogua.com/course/465 - 0.8 - - - https://ctc.koogua.com/course/466 - 0.8 - - - https://ctc.koogua.com/course/467 - 0.8 - - - https://ctc.koogua.com/course/468 - 0.8 - - - https://ctc.koogua.com/course/470 - 0.8 - - - https://ctc.koogua.com/course/471 - 0.8 - - - https://ctc.koogua.com/course/472 - 0.8 - - - https://ctc.koogua.com/course/473 - 0.8 - - - https://ctc.koogua.com/course/474 - 0.8 - - - https://ctc.koogua.com/course/476 - 0.8 - - - https://ctc.koogua.com/course/477 - 0.8 - - - https://ctc.koogua.com/course/478 - 0.8 - - - https://ctc.koogua.com/course/479 - 0.8 - - - https://ctc.koogua.com/course/480 - 0.8 - - - https://ctc.koogua.com/course/482 - 0.8 - - - https://ctc.koogua.com/course/483 - 0.8 - - - https://ctc.koogua.com/course/484 - 0.8 - - - https://ctc.koogua.com/course/485 - 0.8 - - - https://ctc.koogua.com/course/486 - 0.8 - - - https://ctc.koogua.com/course/487 - 0.8 - - - https://ctc.koogua.com/course/488 - 0.8 - - - https://ctc.koogua.com/course/489 - 0.8 - - - https://ctc.koogua.com/course/490 - 0.8 - - - https://ctc.koogua.com/course/491 - 0.8 - - - https://ctc.koogua.com/course/493 - 0.8 - - - https://ctc.koogua.com/course/494 - 0.8 - - - https://ctc.koogua.com/course/496 - 0.8 - - - https://ctc.koogua.com/course/497 - 0.8 - - - https://ctc.koogua.com/course/498 - 0.8 - - - https://ctc.koogua.com/course/501 - 0.8 - - - https://ctc.koogua.com/course/502 - 0.8 - - - https://ctc.koogua.com/course/506 - 0.8 - - - https://ctc.koogua.com/course/508 - 0.8 - - - https://ctc.koogua.com/course/509 - 0.8 - - - https://ctc.koogua.com/course/510 - 0.8 - - - https://ctc.koogua.com/course/514 - 0.8 - - - https://ctc.koogua.com/course/515 - 0.8 - - - https://ctc.koogua.com/course/516 - 0.8 - - - https://ctc.koogua.com/course/517 - 0.8 - - - https://ctc.koogua.com/course/518 - 0.8 - - - https://ctc.koogua.com/course/519 - 0.8 - - - https://ctc.koogua.com/course/520 - 0.8 - - - https://ctc.koogua.com/course/521 - 0.8 - - - https://ctc.koogua.com/course/523 - 0.8 - - - https://ctc.koogua.com/course/524 - 0.8 - - - https://ctc.koogua.com/course/525 - 0.8 - - - https://ctc.koogua.com/course/527 - 0.8 - - - https://ctc.koogua.com/course/528 - 0.8 - - - https://ctc.koogua.com/course/529 - 0.8 - - - https://ctc.koogua.com/course/530 - 0.8 - - - https://ctc.koogua.com/course/531 - 0.8 - - - https://ctc.koogua.com/course/533 - 0.8 - - - https://ctc.koogua.com/course/534 - 0.8 - - - https://ctc.koogua.com/course/536 - 0.8 - - - https://ctc.koogua.com/course/542 - 0.8 - - - https://ctc.koogua.com/course/543 - 0.8 - - - https://ctc.koogua.com/course/545 - 0.8 - - - https://ctc.koogua.com/course/546 - 0.8 - - - https://ctc.koogua.com/course/547 - 0.8 - - - https://ctc.koogua.com/course/550 - 0.8 - - - https://ctc.koogua.com/course/551 - 0.8 - - - https://ctc.koogua.com/course/552 - 0.8 - - - https://ctc.koogua.com/course/553 - 0.8 - - - https://ctc.koogua.com/course/554 - 0.8 - - - https://ctc.koogua.com/course/555 - 0.8 - - - https://ctc.koogua.com/course/557 - 0.8 - - - https://ctc.koogua.com/course/558 - 0.8 - - - https://ctc.koogua.com/course/563 - 0.8 - - - https://ctc.koogua.com/course/565 - 0.8 - - - https://ctc.koogua.com/course/567 - 0.8 - - - https://ctc.koogua.com/course/574 - 0.8 - - - https://ctc.koogua.com/course/575 - 0.8 - - - https://ctc.koogua.com/course/576 - 0.8 - - - https://ctc.koogua.com/course/578 - 0.8 - - - https://ctc.koogua.com/course/579 - 0.8 - - - https://ctc.koogua.com/course/580 - 0.8 - - - https://ctc.koogua.com/course/582 - 0.8 - - - https://ctc.koogua.com/course/584 - 0.8 - - - https://ctc.koogua.com/course/585 - 0.8 - - - https://ctc.koogua.com/course/586 - 0.8 - - - https://ctc.koogua.com/course/587 - 0.8 - - - https://ctc.koogua.com/course/588 - 0.8 - - - https://ctc.koogua.com/course/589 - 0.8 - - - https://ctc.koogua.com/course/591 - 0.8 - - - https://ctc.koogua.com/course/592 - 0.8 - - - https://ctc.koogua.com/course/593 - 0.8 - - - https://ctc.koogua.com/course/594 - 0.8 - - - https://ctc.koogua.com/course/595 - 0.8 - - - https://ctc.koogua.com/course/596 - 0.8 - - - https://ctc.koogua.com/course/597 - 0.8 - - - https://ctc.koogua.com/course/601 - 0.8 - - - https://ctc.koogua.com/course/603 - 0.8 - - - https://ctc.koogua.com/course/604 - 0.8 - - - https://ctc.koogua.com/course/606 - 0.8 - - - https://ctc.koogua.com/course/607 - 0.8 - - - https://ctc.koogua.com/course/608 - 0.8 - - - https://ctc.koogua.com/course/610 - 0.8 - - - https://ctc.koogua.com/course/611 - 0.8 - - - https://ctc.koogua.com/course/612 - 0.8 - - - https://ctc.koogua.com/course/613 - 0.8 - - - https://ctc.koogua.com/course/614 - 0.8 - - - https://ctc.koogua.com/course/615 - 0.8 - - - https://ctc.koogua.com/course/616 - 0.8 - - - https://ctc.koogua.com/course/617 - 0.8 - - - https://ctc.koogua.com/course/618 - 0.8 - - - https://ctc.koogua.com/course/619 - 0.8 - - - https://ctc.koogua.com/course/620 - 0.8 - - - https://ctc.koogua.com/course/621 - 0.8 - - - https://ctc.koogua.com/course/623 - 0.8 - - - https://ctc.koogua.com/course/629 - 0.8 - - - https://ctc.koogua.com/course/630 - 0.8 - - - https://ctc.koogua.com/course/631 - 0.8 - - - https://ctc.koogua.com/course/632 - 0.8 - - - https://ctc.koogua.com/course/633 - 0.8 - - - https://ctc.koogua.com/course/635 - 0.8 - - - https://ctc.koogua.com/course/636 - 0.8 - - - https://ctc.koogua.com/course/639 - 0.8 - - - https://ctc.koogua.com/course/640 - 0.8 - - - https://ctc.koogua.com/course/641 - 0.8 - - - https://ctc.koogua.com/course/642 - 0.8 - - - https://ctc.koogua.com/course/643 - 0.8 - - - https://ctc.koogua.com/course/644 - 0.8 - - - https://ctc.koogua.com/course/645 - 0.8 - - - https://ctc.koogua.com/course/646 - 0.8 - - - https://ctc.koogua.com/course/647 - 0.8 - - - https://ctc.koogua.com/course/648 - 0.8 - - - https://ctc.koogua.com/course/649 - 0.8 - - - https://ctc.koogua.com/course/651 - 0.8 - - - https://ctc.koogua.com/course/653 - 0.8 - - - https://ctc.koogua.com/course/654 - 0.8 - - - https://ctc.koogua.com/course/655 - 0.8 - - - https://ctc.koogua.com/course/657 - 0.8 - - - https://ctc.koogua.com/course/658 - 0.8 - - - https://ctc.koogua.com/course/659 - 0.8 - - - https://ctc.koogua.com/course/660 - 0.8 - - - https://ctc.koogua.com/course/661 - 0.8 - - - https://ctc.koogua.com/course/662 - 0.8 - - - https://ctc.koogua.com/course/663 - 0.8 - - - https://ctc.koogua.com/course/664 - 0.8 - - - https://ctc.koogua.com/course/665 - 0.8 - - - https://ctc.koogua.com/course/666 - 0.8 - - - https://ctc.koogua.com/course/667 - 0.8 - - - https://ctc.koogua.com/course/668 - 0.8 - - - https://ctc.koogua.com/course/669 - 0.8 - - - https://ctc.koogua.com/course/671 - 0.8 - - - https://ctc.koogua.com/course/672 - 0.8 - - - https://ctc.koogua.com/course/673 - 0.8 - - - https://ctc.koogua.com/course/674 - 0.8 - - - https://ctc.koogua.com/course/675 - 0.8 - - - https://ctc.koogua.com/course/676 - 0.8 - - - https://ctc.koogua.com/course/677 - 0.8 - - - https://ctc.koogua.com/course/678 - 0.8 - - - https://ctc.koogua.com/course/679 - 0.8 - - - https://ctc.koogua.com/course/680 - 0.8 - - - https://ctc.koogua.com/course/681 - 0.8 - - - https://ctc.koogua.com/course/682 - 0.8 - - - https://ctc.koogua.com/course/683 - 0.8 - - - https://ctc.koogua.com/course/684 - 0.8 - - - https://ctc.koogua.com/course/685 - 0.8 - - - https://ctc.koogua.com/course/686 - 0.8 - - - https://ctc.koogua.com/course/687 - 0.8 - - - https://ctc.koogua.com/course/689 - 0.8 - - - https://ctc.koogua.com/course/690 - 0.8 - - - https://ctc.koogua.com/course/693 - 0.8 - - - https://ctc.koogua.com/course/696 - 0.8 - - - https://ctc.koogua.com/course/697 - 0.8 - - - https://ctc.koogua.com/course/698 - 0.8 - - - https://ctc.koogua.com/course/699 - 0.8 - - - https://ctc.koogua.com/course/701 - 0.8 - - - https://ctc.koogua.com/course/702 - 0.8 - - - https://ctc.koogua.com/course/703 - 0.8 - - - https://ctc.koogua.com/course/706 - 0.8 - - - https://ctc.koogua.com/course/707 - 0.8 - - - https://ctc.koogua.com/course/708 - 0.8 - - - https://ctc.koogua.com/course/709 - 0.8 - - - https://ctc.koogua.com/course/710 - 0.8 - - - https://ctc.koogua.com/course/712 - 0.8 - - - https://ctc.koogua.com/course/713 - 0.8 - - - https://ctc.koogua.com/course/715 - 0.8 - - - https://ctc.koogua.com/course/716 - 0.8 - - - https://ctc.koogua.com/course/717 - 0.8 - - - https://ctc.koogua.com/course/718 - 0.8 - - - https://ctc.koogua.com/course/719 - 0.8 - - - https://ctc.koogua.com/course/720 - 0.8 - - - https://ctc.koogua.com/course/721 - 0.8 - - - https://ctc.koogua.com/course/722 - 0.8 - - - https://ctc.koogua.com/course/724 - 0.8 - - - https://ctc.koogua.com/course/725 - 0.8 - - - https://ctc.koogua.com/course/726 - 0.8 - - - https://ctc.koogua.com/course/729 - 0.8 - - - https://ctc.koogua.com/course/730 - 0.8 - - - https://ctc.koogua.com/course/731 - 0.8 - - - https://ctc.koogua.com/course/732 - 0.8 - - - https://ctc.koogua.com/course/734 - 0.8 - - - https://ctc.koogua.com/course/736 - 0.8 - - - https://ctc.koogua.com/course/737 - 0.8 - - - https://ctc.koogua.com/course/739 - 0.8 - - - https://ctc.koogua.com/course/740 - 0.8 - - - https://ctc.koogua.com/course/741 - 0.8 - - - https://ctc.koogua.com/course/742 - 0.8 - - - https://ctc.koogua.com/course/743 - 0.8 - - - https://ctc.koogua.com/course/745 - 0.8 - - - https://ctc.koogua.com/course/747 - 0.8 - - - https://ctc.koogua.com/course/748 - 0.8 - - - https://ctc.koogua.com/course/749 - 0.8 - - - https://ctc.koogua.com/course/751 - 0.8 - - - https://ctc.koogua.com/course/753 - 0.8 - - - https://ctc.koogua.com/course/754 - 0.8 - - - https://ctc.koogua.com/course/755 - 0.8 - - - https://ctc.koogua.com/course/756 - 0.8 - - - https://ctc.koogua.com/course/757 - 0.8 - - - https://ctc.koogua.com/course/758 - 0.8 - - - https://ctc.koogua.com/course/759 - 0.8 - - - https://ctc.koogua.com/course/760 - 0.8 - - - https://ctc.koogua.com/course/761 - 0.8 - - - https://ctc.koogua.com/course/762 - 0.8 - - - https://ctc.koogua.com/course/763 - 0.8 - - - https://ctc.koogua.com/course/764 - 0.8 - - - https://ctc.koogua.com/course/765 - 0.8 - - - https://ctc.koogua.com/course/766 - 0.8 - - - https://ctc.koogua.com/course/770 - 0.8 - - - https://ctc.koogua.com/course/771 - 0.8 - - - https://ctc.koogua.com/course/773 - 0.8 - - - https://ctc.koogua.com/course/775 - 0.8 - - - https://ctc.koogua.com/course/777 - 0.8 - - - https://ctc.koogua.com/course/778 - 0.8 - - - https://ctc.koogua.com/course/782 - 0.8 - - - https://ctc.koogua.com/course/784 - 0.8 - - - https://ctc.koogua.com/course/785 - 0.8 - - - https://ctc.koogua.com/course/786 - 0.8 - - - https://ctc.koogua.com/course/787 - 0.8 - - - https://ctc.koogua.com/course/788 - 0.8 - - - https://ctc.koogua.com/course/789 - 0.8 - - - https://ctc.koogua.com/course/790 - 0.8 - - - https://ctc.koogua.com/course/793 - 0.8 - - - https://ctc.koogua.com/course/794 - 0.8 - - - https://ctc.koogua.com/course/795 - 0.8 - - - https://ctc.koogua.com/course/796 - 0.8 - - - https://ctc.koogua.com/course/797 - 0.8 - - - https://ctc.koogua.com/course/798 - 0.8 - - - https://ctc.koogua.com/course/799 - 0.8 - - - https://ctc.koogua.com/course/800 - 0.8 - - - https://ctc.koogua.com/course/801 - 0.8 - - - https://ctc.koogua.com/course/802 - 0.8 - - - https://ctc.koogua.com/course/803 - 0.8 - - - https://ctc.koogua.com/course/805 - 0.8 - - - https://ctc.koogua.com/course/806 - 0.8 - - - https://ctc.koogua.com/course/807 - 0.8 - - - https://ctc.koogua.com/course/808 - 0.8 - - - https://ctc.koogua.com/course/809 - 0.8 - - - https://ctc.koogua.com/course/810 - 0.8 - - - https://ctc.koogua.com/course/811 - 0.8 - - - https://ctc.koogua.com/course/812 - 0.8 - - - https://ctc.koogua.com/course/813 - 0.8 - - - https://ctc.koogua.com/course/814 - 0.8 - - - https://ctc.koogua.com/course/815 - 0.8 - - - https://ctc.koogua.com/course/817 - 0.8 - - - https://ctc.koogua.com/course/818 - 0.8 - - - https://ctc.koogua.com/course/820 - 0.8 - - - https://ctc.koogua.com/course/821 - 0.8 - - - https://ctc.koogua.com/course/822 - 0.8 - - - https://ctc.koogua.com/course/823 - 0.8 - - - https://ctc.koogua.com/course/824 - 0.8 - - - https://ctc.koogua.com/course/825 - 0.8 - - - https://ctc.koogua.com/course/826 - 0.8 - - - https://ctc.koogua.com/course/827 - 0.8 - - - https://ctc.koogua.com/course/828 - 0.8 - - - https://ctc.koogua.com/course/829 - 0.8 - - - https://ctc.koogua.com/course/830 - 0.8 - - - https://ctc.koogua.com/course/831 - 0.8 - - - https://ctc.koogua.com/course/832 - 0.8 - - - https://ctc.koogua.com/course/833 - 0.8 - - - https://ctc.koogua.com/course/834 - 0.8 - - - https://ctc.koogua.com/course/835 - 0.8 - - - https://ctc.koogua.com/course/838 - 0.8 - - - https://ctc.koogua.com/course/839 - 0.8 - - - https://ctc.koogua.com/course/840 - 0.8 - - - https://ctc.koogua.com/course/841 - 0.8 - - - https://ctc.koogua.com/course/842 - 0.8 - - - https://ctc.koogua.com/course/843 - 0.8 - - - https://ctc.koogua.com/course/844 - 0.8 - - - https://ctc.koogua.com/course/845 - 0.8 - - - https://ctc.koogua.com/course/846 - 0.8 - - - https://ctc.koogua.com/course/847 - 0.8 - - - https://ctc.koogua.com/course/848 - 0.8 - - - https://ctc.koogua.com/course/849 - 0.8 - - - https://ctc.koogua.com/course/850 - 0.8 - - - https://ctc.koogua.com/course/851 - 0.8 - - - https://ctc.koogua.com/course/852 - 0.8 - - - https://ctc.koogua.com/course/853 - 0.8 - - - https://ctc.koogua.com/course/854 - 0.8 - - - https://ctc.koogua.com/course/855 - 0.8 - - - https://ctc.koogua.com/course/856 - 0.8 - - - https://ctc.koogua.com/course/857 - 0.8 - - - https://ctc.koogua.com/course/858 - 0.8 - - - https://ctc.koogua.com/course/859 - 0.8 - - - https://ctc.koogua.com/course/860 - 0.8 - - - https://ctc.koogua.com/course/861 - 0.8 - - - https://ctc.koogua.com/course/862 - 0.8 - - - https://ctc.koogua.com/course/863 - 0.8 - - - https://ctc.koogua.com/course/864 - 0.8 - - - https://ctc.koogua.com/course/865 - 0.8 - - - https://ctc.koogua.com/course/866 - 0.8 - - - https://ctc.koogua.com/course/869 - 0.8 - - - https://ctc.koogua.com/course/870 - 0.8 - - - https://ctc.koogua.com/course/871 - 0.8 - - - https://ctc.koogua.com/course/872 - 0.8 - - - https://ctc.koogua.com/course/873 - 0.8 - - - https://ctc.koogua.com/course/874 - 0.8 - - - https://ctc.koogua.com/course/875 - 0.8 - - - https://ctc.koogua.com/course/876 - 0.8 - - - https://ctc.koogua.com/course/877 - 0.8 - - - https://ctc.koogua.com/course/878 - 0.8 - - - https://ctc.koogua.com/course/879 - 0.8 - - - https://ctc.koogua.com/course/881 - 0.8 - - - https://ctc.koogua.com/course/882 - 0.8 - - - https://ctc.koogua.com/course/883 - 0.8 - - - https://ctc.koogua.com/course/885 - 0.8 - - - https://ctc.koogua.com/course/886 - 0.8 - - - https://ctc.koogua.com/course/887 - 0.8 - - - https://ctc.koogua.com/course/888 - 0.8 - - - https://ctc.koogua.com/course/889 - 0.8 - - - https://ctc.koogua.com/course/892 - 0.8 - - - https://ctc.koogua.com/course/893 - 0.8 - - - https://ctc.koogua.com/course/894 - 0.8 - - - https://ctc.koogua.com/course/895 - 0.8 - - - https://ctc.koogua.com/course/896 - 0.8 - - - https://ctc.koogua.com/course/897 - 0.8 - - - https://ctc.koogua.com/course/898 - 0.8 - - - https://ctc.koogua.com/course/899 - 0.8 - - - https://ctc.koogua.com/course/900 - 0.8 - - - https://ctc.koogua.com/course/901 - 0.8 - - - https://ctc.koogua.com/course/902 - 0.8 - - - https://ctc.koogua.com/course/903 - 0.8 - - - https://ctc.koogua.com/course/904 - 0.8 - - - https://ctc.koogua.com/course/905 - 0.8 - - - https://ctc.koogua.com/course/908 - 0.8 - - - https://ctc.koogua.com/course/910 - 0.8 - - - https://ctc.koogua.com/course/911 - 0.8 - - - https://ctc.koogua.com/course/912 - 0.8 - - - https://ctc.koogua.com/course/913 - 0.8 - - - https://ctc.koogua.com/course/914 - 0.8 - - - https://ctc.koogua.com/course/915 - 0.8 - - - https://ctc.koogua.com/course/916 - 0.8 - - - https://ctc.koogua.com/course/917 - 0.8 - - - https://ctc.koogua.com/course/918 - 0.8 - - - https://ctc.koogua.com/course/919 - 0.8 - - - https://ctc.koogua.com/course/920 - 0.8 - - - https://ctc.koogua.com/course/921 - 0.8 - - - https://ctc.koogua.com/course/922 - 0.8 - - - https://ctc.koogua.com/course/923 - 0.8 - - - https://ctc.koogua.com/course/924 - 0.8 - - - https://ctc.koogua.com/course/925 - 0.8 - - - https://ctc.koogua.com/course/926 - 0.8 - - - https://ctc.koogua.com/course/928 - 0.8 - - - https://ctc.koogua.com/course/929 - 0.8 - - - https://ctc.koogua.com/course/931 - 0.8 - - - https://ctc.koogua.com/course/932 - 0.8 - - - https://ctc.koogua.com/course/933 - 0.8 - - - https://ctc.koogua.com/course/934 - 0.8 - - - https://ctc.koogua.com/course/935 - 0.8 - - - https://ctc.koogua.com/course/936 - 0.8 - - - https://ctc.koogua.com/course/937 - 0.8 - - - https://ctc.koogua.com/course/938 - 0.8 - - - https://ctc.koogua.com/course/941 - 0.8 - - - https://ctc.koogua.com/course/942 - 0.8 - - - https://ctc.koogua.com/course/943 - 0.8 - - - https://ctc.koogua.com/course/944 - 0.8 - - - https://ctc.koogua.com/course/945 - 0.8 - - - https://ctc.koogua.com/course/947 - 0.8 - - - https://ctc.koogua.com/course/948 - 0.8 - - - https://ctc.koogua.com/course/949 - 0.8 - - - https://ctc.koogua.com/course/951 - 0.8 - - - https://ctc.koogua.com/course/953 - 0.8 - - - https://ctc.koogua.com/course/955 - 0.8 - - - https://ctc.koogua.com/course/956 - 0.8 - - - https://ctc.koogua.com/course/958 - 0.8 - - - https://ctc.koogua.com/course/959 - 0.8 - - - https://ctc.koogua.com/course/960 - 0.8 - - - https://ctc.koogua.com/course/963 - 0.8 - - - https://ctc.koogua.com/course/964 - 0.8 - - - https://ctc.koogua.com/course/969 - 0.8 - - - https://ctc.koogua.com/course/971 - 0.8 - - - https://ctc.koogua.com/course/972 - 0.8 - - - https://ctc.koogua.com/course/974 - 0.8 - - - https://ctc.koogua.com/course/975 - 0.8 - - - https://ctc.koogua.com/course/976 - 0.8 - - - https://ctc.koogua.com/course/977 - 0.8 - - - https://ctc.koogua.com/course/978 - 0.8 - - - https://ctc.koogua.com/course/979 - 0.8 - - - https://ctc.koogua.com/course/980 - 0.8 - - - https://ctc.koogua.com/course/981 - 0.8 - - - https://ctc.koogua.com/course/983 - 0.8 - - - https://ctc.koogua.com/course/984 - 0.8 - - - https://ctc.koogua.com/course/985 - 0.8 - - - https://ctc.koogua.com/course/986 - 0.8 - - - https://ctc.koogua.com/course/988 - 0.8 - - - https://ctc.koogua.com/course/989 - 0.8 - - - https://ctc.koogua.com/course/991 - 0.8 - - - https://ctc.koogua.com/course/993 - 0.8 - - - https://ctc.koogua.com/course/994 - 0.8 - - - https://ctc.koogua.com/course/996 - 0.8 - - - https://ctc.koogua.com/course/997 - 0.8 - - - https://ctc.koogua.com/course/998 - 0.8 - - - https://ctc.koogua.com/course/999 - 0.8 - - - https://ctc.koogua.com/course/1000 - 0.8 - - - https://ctc.koogua.com/course/1001 - 0.8 - - - https://ctc.koogua.com/course/1002 - 0.8 - - - https://ctc.koogua.com/course/1003 - 0.8 - - - https://ctc.koogua.com/course/1004 - 0.8 - - - https://ctc.koogua.com/course/1006 - 0.8 - - - https://ctc.koogua.com/course/1007 - 0.8 - - - https://ctc.koogua.com/course/1012 - 0.8 - - - https://ctc.koogua.com/course/1013 - 0.8 - - - https://ctc.koogua.com/course/1014 - 0.8 - - - https://ctc.koogua.com/course/1015 - 0.8 - - - https://ctc.koogua.com/course/1016 - 0.8 - - - https://ctc.koogua.com/course/1017 - 0.8 - - - https://ctc.koogua.com/course/1020 - 0.8 - - - https://ctc.koogua.com/course/1023 - 0.8 - - - https://ctc.koogua.com/course/1024 - 0.8 - - - https://ctc.koogua.com/course/1026 - 0.8 - - - https://ctc.koogua.com/course/1027 - 0.8 - - - https://ctc.koogua.com/course/1028 - 0.8 - - - https://ctc.koogua.com/course/1030 - 0.8 - - - https://ctc.koogua.com/course/1031 - 0.8 - - - https://ctc.koogua.com/course/1035 - 0.8 - - - https://ctc.koogua.com/course/1036 - 0.8 - - - https://ctc.koogua.com/course/1038 - 0.8 - - - https://ctc.koogua.com/course/1039 - 0.8 - - - https://ctc.koogua.com/course/1041 - 0.8 - - - https://ctc.koogua.com/course/1042 - 0.8 - - - https://ctc.koogua.com/course/1043 - 0.8 - - - https://ctc.koogua.com/course/1044 - 0.8 - - - https://ctc.koogua.com/course/1045 - 0.8 - - - https://ctc.koogua.com/course/1047 - 0.8 - - - https://ctc.koogua.com/course/1051 - 0.8 - - - https://ctc.koogua.com/course/1052 - 0.8 - - - https://ctc.koogua.com/course/1054 - 0.8 - - - https://ctc.koogua.com/course/1055 - 0.8 - - - https://ctc.koogua.com/course/1057 - 0.8 - - - https://ctc.koogua.com/course/1058 - 0.8 - - - https://ctc.koogua.com/course/1059 - 0.8 - - - https://ctc.koogua.com/course/1060 - 0.8 - - - https://ctc.koogua.com/course/1061 - 0.8 - - - https://ctc.koogua.com/course/1064 - 0.8 - - - https://ctc.koogua.com/course/1067 - 0.8 - - - https://ctc.koogua.com/course/1071 - 0.8 - - - https://ctc.koogua.com/course/1072 - 0.8 - - - https://ctc.koogua.com/course/1073 - 0.8 - - - https://ctc.koogua.com/course/1074 - 0.8 - - - https://ctc.koogua.com/course/1075 - 0.8 - - - https://ctc.koogua.com/course/1077 - 0.8 - - - https://ctc.koogua.com/course/1078 - 0.8 - - - https://ctc.koogua.com/course/1079 - 0.8 - - - https://ctc.koogua.com/course/1080 - 0.8 - - - https://ctc.koogua.com/course/1081 - 0.8 - - - https://ctc.koogua.com/course/1083 - 0.8 - - - https://ctc.koogua.com/course/1084 - 0.8 - - - https://ctc.koogua.com/course/1085 - 0.8 - - - https://ctc.koogua.com/course/1086 - 0.8 - - - https://ctc.koogua.com/course/1087 - 0.8 - - - https://ctc.koogua.com/course/1088 - 0.8 - - - https://ctc.koogua.com/course/1089 - 0.8 - - - https://ctc.koogua.com/course/1090 - 0.8 - - - https://ctc.koogua.com/course/1091 - 0.8 - - - https://ctc.koogua.com/course/1092 - 0.8 - - - https://ctc.koogua.com/course/1093 - 0.8 - - - https://ctc.koogua.com/course/1094 - 0.8 - - - https://ctc.koogua.com/course/1096 - 0.8 - - - https://ctc.koogua.com/course/1098 - 0.8 - - - https://ctc.koogua.com/course/1099 - 0.8 - - - https://ctc.koogua.com/course/1100 - 0.8 - - - https://ctc.koogua.com/course/1101 - 0.8 - - - https://ctc.koogua.com/course/1102 - 0.8 - - - https://ctc.koogua.com/course/1103 - 0.8 - - - https://ctc.koogua.com/course/1104 - 0.8 - - - https://ctc.koogua.com/course/1105 - 0.8 - - - https://ctc.koogua.com/course/1106 - 0.8 - - - https://ctc.koogua.com/course/1107 - 0.8 - - - https://ctc.koogua.com/course/1108 - 0.8 - - - https://ctc.koogua.com/course/1109 - 0.8 - - - https://ctc.koogua.com/course/1110 - 0.8 - - - https://ctc.koogua.com/course/1111 - 0.8 - - - https://ctc.koogua.com/course/1112 - 0.8 - - - https://ctc.koogua.com/course/1113 - 0.8 - - - https://ctc.koogua.com/course/1114 - 0.8 - - - https://ctc.koogua.com/course/1115 - 0.8 - - - https://ctc.koogua.com/course/1116 - 0.8 - - - https://ctc.koogua.com/course/1117 - 0.8 - - - https://ctc.koogua.com/course/1118 - 0.8 - - - https://ctc.koogua.com/course/1119 - 0.8 - - - https://ctc.koogua.com/course/1120 - 0.8 - - - https://ctc.koogua.com/course/1121 - 0.8 - - - https://ctc.koogua.com/course/1122 - 0.8 - - - https://ctc.koogua.com/course/1126 - 0.8 - - - https://ctc.koogua.com/course/1127 - 0.8 - - - https://ctc.koogua.com/course/1128 - 0.8 - - - https://ctc.koogua.com/course/1129 - 0.8 - - - https://ctc.koogua.com/course/1130 - 0.8 - - - https://ctc.koogua.com/course/1131 - 0.8 - - - https://ctc.koogua.com/course/1132 - 0.8 - - - https://ctc.koogua.com/course/1133 - 0.8 - - - https://ctc.koogua.com/course/1134 - 0.8 - - - https://ctc.koogua.com/course/1141 - 0.8 - - - https://ctc.koogua.com/course/1151 - 0.8 - - - https://ctc.koogua.com/course/1152 - 0.8 - - - https://ctc.koogua.com/course/1153 - 0.8 - - - https://ctc.koogua.com/course/1154 - 0.8 - - - https://ctc.koogua.com/course/1155 - 0.8 - - - https://ctc.koogua.com/course/1156 - 0.8 - - - https://ctc.koogua.com/course/1157 - 0.8 - - - https://ctc.koogua.com/course/1158 - 0.8 - - - https://ctc.koogua.com/course/1159 - 0.8 - - - https://ctc.koogua.com/course/1160 - 0.8 - - - https://ctc.koogua.com/course/1161 - 0.8 - - - https://ctc.koogua.com/course/1162 - 0.8 - - - https://ctc.koogua.com/course/1163 - 0.8 - - - https://ctc.koogua.com/course/1164 - 0.8 - - - https://ctc.koogua.com/course/1165 - 0.8 - - - https://ctc.koogua.com/course/1166 - 0.8 - - - https://ctc.koogua.com/course/1167 - 0.8 - - - https://ctc.koogua.com/course/1168 - 0.8 - - - https://ctc.koogua.com/course/1169 - 0.8 - - - https://ctc.koogua.com/course/1170 - 0.8 - - - https://ctc.koogua.com/course/1171 - 0.8 - - - https://ctc.koogua.com/course/1172 - 0.8 - - - https://ctc.koogua.com/course/1173 - 0.8 - - - https://ctc.koogua.com/course/1174 - 0.8 - - - https://ctc.koogua.com/course/1175 - 0.8 - - - https://ctc.koogua.com/course/1176 - 0.8 - - - https://ctc.koogua.com/course/1177 - 0.8 - - - https://ctc.koogua.com/course/1178 - 0.8 - - - https://ctc.koogua.com/course/1179 - 0.8 - - - https://ctc.koogua.com/course/1180 - 0.8 - - - https://ctc.koogua.com/course/1181 - 0.8 - - - https://ctc.koogua.com/course/1182 - 0.8 - - - https://ctc.koogua.com/course/1183 - 0.8 - - - https://ctc.koogua.com/course/1184 - 0.8 - - - https://ctc.koogua.com/course/1185 - 0.8 - - - https://ctc.koogua.com/course/1186 - 0.8 - - - https://ctc.koogua.com/course/1187 - 0.8 - - - https://ctc.koogua.com/course/1188 - 0.8 - - - https://ctc.koogua.com/course/1189 - 0.8 - - - https://ctc.koogua.com/course/1190 - 0.8 - - - https://ctc.koogua.com/course/1191 - 0.8 - - - https://ctc.koogua.com/course/1192 - 0.8 - - - https://ctc.koogua.com/course/1193 - 0.8 - - - https://ctc.koogua.com/course/1194 - 0.8 - - - https://ctc.koogua.com/course/1195 - 0.8 - - - https://ctc.koogua.com/course/1196 - 0.8 - - - https://ctc.koogua.com/course/1197 - 0.8 - - - https://ctc.koogua.com/course/1198 - 0.8 - - - https://ctc.koogua.com/course/1199 - 0.8 - - - https://ctc.koogua.com/course/1200 - 0.8 - - - https://ctc.koogua.com/course/1201 - 0.8 - - - https://ctc.koogua.com/course/1202 - 0.8 - - - https://ctc.koogua.com/course/1203 - 0.8 - - - https://ctc.koogua.com/course/1204 - 0.8 - - - https://ctc.koogua.com/course/1205 - 0.8 - - - https://ctc.koogua.com/course/1206 - 0.8 - - - https://ctc.koogua.com/course/1207 - 0.8 - - - https://ctc.koogua.com/course/1208 - 0.8 - - - https://ctc.koogua.com/course/1209 - 0.8 - - - https://ctc.koogua.com/course/1210 - 0.8 - - - https://ctc.koogua.com/course/1211 - 0.8 - - - https://ctc.koogua.com/course/1212 - 0.8 - - - https://ctc.koogua.com/course/1213 - 0.8 - - - https://ctc.koogua.com/course/1214 - 0.8 - - - https://ctc.koogua.com/course/1215 - 0.8 - - - https://ctc.koogua.com/course/1216 - 0.8 - - - https://ctc.koogua.com/course/1217 - 0.8 - - - https://ctc.koogua.com/course/1218 - 0.8 - - - https://ctc.koogua.com/course/1219 - 0.8 - - - https://ctc.koogua.com/course/1220 - 0.8 - - - https://ctc.koogua.com/course/1221 - 0.8 - - - https://ctc.koogua.com/course/1222 - 0.8 - - - https://ctc.koogua.com/course/1223 - 0.8 - - - https://ctc.koogua.com/course/1224 - 0.8 - - - https://ctc.koogua.com/course/1225 - 0.8 - - - https://ctc.koogua.com/course/1226 - 0.8 - - - https://ctc.koogua.com/course/1227 - 0.8 - - - https://ctc.koogua.com/course/1228 - 0.8 - - - https://ctc.koogua.com/course/1229 - 0.8 - - - https://ctc.koogua.com/course/1230 - 0.8 - - - https://ctc.koogua.com/course/1231 - 0.8 - - - https://ctc.koogua.com/course/1232 - 0.8 - - - https://ctc.koogua.com/course/1233 - 0.8 - - - https://ctc.koogua.com/course/1234 - 0.8 - - - https://ctc.koogua.com/course/1235 - 0.8 - - - https://ctc.koogua.com/course/1236 - 0.8 - - - https://ctc.koogua.com/course/1237 - 0.8 - - - https://ctc.koogua.com/course/1238 - 0.8 - - - https://ctc.koogua.com/course/1239 - 0.8 - - - https://ctc.koogua.com/course/1240 - 0.8 - - - https://ctc.koogua.com/course/1241 - 0.8 - - - https://ctc.koogua.com/course/1242 - 0.8 - - - https://ctc.koogua.com/course/1243 - 0.8 - - - https://ctc.koogua.com/course/1244 - 0.8 - - - https://ctc.koogua.com/course/1245 - 0.8 - - - https://ctc.koogua.com/course/1246 - 0.8 - - - https://ctc.koogua.com/course/1247 - 0.8 - - - https://ctc.koogua.com/course/1248 - 0.8 - - - https://ctc.koogua.com/course/1249 - 0.8 - - - https://ctc.koogua.com/course/1250 - 0.8 - - - https://ctc.koogua.com/course/1251 - 0.8 - - - https://ctc.koogua.com/course/1252 - 0.8 - - - https://ctc.koogua.com/course/1253 - 0.8 - - - https://ctc.koogua.com/course/1254 - 0.8 - - - https://ctc.koogua.com/course/1255 - 0.8 - - - https://ctc.koogua.com/course/1256 - 0.8 - - - https://ctc.koogua.com/course/1257 - 0.8 - - - https://ctc.koogua.com/course/1258 - 0.8 - - - https://ctc.koogua.com/course/1259 - 0.8 - - - https://ctc.koogua.com/course/1260 - 0.8 - - - https://ctc.koogua.com/course/1261 - 0.8 - - - https://ctc.koogua.com/course/1262 - 0.8 - - - https://ctc.koogua.com/course/1263 - 0.8 - - - https://ctc.koogua.com/course/1264 - 0.8 - - - https://ctc.koogua.com/course/1265 - 0.8 - - - https://ctc.koogua.com/course/1266 - 0.8 - - - https://ctc.koogua.com/course/1267 - 0.8 - - - https://ctc.koogua.com/course/1268 - 0.8 - - - https://ctc.koogua.com/course/1269 - 0.8 - - - https://ctc.koogua.com/course/1270 - 0.8 - - - https://ctc.koogua.com/course/1271 - 0.8 - - - https://ctc.koogua.com/course/1272 - 0.8 - - - https://ctc.koogua.com/course/1273 - 0.8 - - - https://ctc.koogua.com/course/1274 - 0.8 - - - https://ctc.koogua.com/course/1275 - 0.8 - - - https://ctc.koogua.com/course/1276 - 0.8 - - - https://ctc.koogua.com/course/1277 - 0.8 - - - https://ctc.koogua.com/course/1278 - 0.8 - - - https://ctc.koogua.com/course/1279 - 0.8 - - - https://ctc.koogua.com/course/1280 - 0.8 - - - https://ctc.koogua.com/course/1281 - 0.8 - - - https://ctc.koogua.com/course/1282 - 0.8 - - - https://ctc.koogua.com/course/1283 - 0.8 - - - https://ctc.koogua.com/course/1284 - 0.8 - - - https://ctc.koogua.com/course/1285 - 0.8 - - - https://ctc.koogua.com/course/1286 - 0.8 - - - https://ctc.koogua.com/course/1287 - 0.8 - - - https://ctc.koogua.com/course/1288 - 0.8 - - - https://ctc.koogua.com/course/1289 - 0.8 - - - https://ctc.koogua.com/course/1290 - 0.8 - - - https://ctc.koogua.com/course/1291 - 0.8 - - - https://ctc.koogua.com/course/1292 - 0.8 - - - https://ctc.koogua.com/course/1293 - 0.8 - - - https://ctc.koogua.com/course/1294 - 0.8 - - - https://ctc.koogua.com/course/1295 - 0.8 - - - https://ctc.koogua.com/course/1296 - 0.8 - - - https://ctc.koogua.com/course/1297 - 0.8 - - - https://ctc.koogua.com/course/1298 - 0.8 - - - https://ctc.koogua.com/course/1299 - 0.8 - - - https://ctc.koogua.com/course/1300 - 0.8 - - - https://ctc.koogua.com/course/1301 - 0.8 - - - https://ctc.koogua.com/course/1302 - 0.8 - - - https://ctc.koogua.com/course/1303 - 0.8 - - - https://ctc.koogua.com/course/1304 - 0.8 - - - https://ctc.koogua.com/course/1305 - 0.8 - - - https://ctc.koogua.com/course/1306 - 0.8 - - - https://ctc.koogua.com/course/1307 - 0.8 - - - https://ctc.koogua.com/course/1308 - 0.8 - - - https://ctc.koogua.com/course/1309 - 0.8 - - - https://ctc.koogua.com/course/1310 - 0.8 - - - https://ctc.koogua.com/course/1311 - 0.8 - - - https://ctc.koogua.com/course/1312 - 0.8 - - - https://ctc.koogua.com/course/1313 - 0.8 - - - https://ctc.koogua.com/course/1314 - 0.8 - - - https://ctc.koogua.com/course/1315 - 0.8 - - - https://ctc.koogua.com/course/1316 - 0.8 - - - https://ctc.koogua.com/course/1317 - 0.8 - - - https://ctc.koogua.com/course/1318 - 0.8 - - - https://ctc.koogua.com/course/1319 - 0.8 - - - https://ctc.koogua.com/course/1320 - 0.8 - - - https://ctc.koogua.com/course/1321 - 0.8 - - - https://ctc.koogua.com/course/1322 - 0.8 - - - https://ctc.koogua.com/course/1323 - 0.8 - - - https://ctc.koogua.com/course/1324 - 0.8 - - - https://ctc.koogua.com/course/1325 - 0.8 - - - https://ctc.koogua.com/course/1326 - 0.8 - - - https://ctc.koogua.com/course/1327 - 0.8 - - - https://ctc.koogua.com/course/1328 - 0.8 - - - https://ctc.koogua.com/course/1329 - 0.8 - - - https://ctc.koogua.com/course/1330 - 0.8 - - - https://ctc.koogua.com/course/1331 - 0.8 - - - https://ctc.koogua.com/course/1332 - 0.8 - - - https://ctc.koogua.com/course/1333 - 0.8 - - - https://ctc.koogua.com/course/1334 - 0.8 - - - https://ctc.koogua.com/course/1335 - 0.8 - - - https://ctc.koogua.com/course/1336 - 0.8 - - - https://ctc.koogua.com/course/1337 - 0.8 - - - https://ctc.koogua.com/course/1338 - 0.8 - - - https://ctc.koogua.com/course/1339 - 0.8 - - - https://ctc.koogua.com/course/1340 - 0.8 - - - https://ctc.koogua.com/course/1341 - 0.8 - - - https://ctc.koogua.com/course/1342 - 0.8 - - - https://ctc.koogua.com/course/1343 - 0.8 - - - https://ctc.koogua.com/course/1344 - 0.8 - - - https://ctc.koogua.com/course/1345 - 0.8 - - - https://ctc.koogua.com/course/1346 - 0.8 - - - https://ctc.koogua.com/course/1347 - 0.8 - - - https://ctc.koogua.com/course/1348 - 0.8 - - - https://ctc.koogua.com/course/1349 - 0.8 - - - https://ctc.koogua.com/course/1350 - 0.8 - - - https://ctc.koogua.com/course/1351 - 0.8 - - - https://ctc.koogua.com/course/1352 - 0.8 - - - https://ctc.koogua.com/course/1353 - 0.8 - - - https://ctc.koogua.com/course/1354 - 0.8 - - - https://ctc.koogua.com/course/1355 - 0.8 - - - https://ctc.koogua.com/course/1356 - 0.8 - - - https://ctc.koogua.com/course/1357 - 0.8 - - - https://ctc.koogua.com/course/1358 - 0.8 - - - https://ctc.koogua.com/course/1359 - 0.8 - - - https://ctc.koogua.com/course/1360 - 0.8 - - - https://ctc.koogua.com/course/1361 - 0.8 - - - https://ctc.koogua.com/course/1362 - 0.8 - - - https://ctc.koogua.com/course/1363 - 0.8 - - - https://ctc.koogua.com/course/1364 - 0.8 - - - https://ctc.koogua.com/course/1365 - 0.8 - - - https://ctc.koogua.com/course/1366 - 0.8 - - - https://ctc.koogua.com/course/1367 - 0.8 - - - https://ctc.koogua.com/course/1368 - 0.8 - - - https://ctc.koogua.com/course/1369 - 0.8 - - - https://ctc.koogua.com/course/1370 - 0.8 - - - https://ctc.koogua.com/course/1371 - 0.8 - - - https://ctc.koogua.com/course/1372 - 0.8 - - - https://ctc.koogua.com/course/1373 - 0.8 - - - https://ctc.koogua.com/course/1374 - 0.8 - - - https://ctc.koogua.com/course/1375 - 0.8 - - - https://ctc.koogua.com/course/1376 - 0.8 - - - https://ctc.koogua.com/course/1377 - 0.8 - - - https://ctc.koogua.com/course/1378 - 0.8 - - - https://ctc.koogua.com/course/1379 - 0.8 - - - https://ctc.koogua.com/course/1380 - 0.8 - - - https://ctc.koogua.com/course/1381 - 0.8 - - - https://ctc.koogua.com/course/1382 - 0.8 - - - https://ctc.koogua.com/course/1383 - 0.8 - - - https://ctc.koogua.com/course/1384 - 0.8 - - - https://ctc.koogua.com/course/1385 - 0.8 - - - https://ctc.koogua.com/course/1386 - 0.8 - - - https://ctc.koogua.com/course/1387 - 0.8 - - - https://ctc.koogua.com/course/1388 - 0.8 - - - https://ctc.koogua.com/course/1389 - 0.8 - - - https://ctc.koogua.com/course/1390 - 0.8 - - - https://ctc.koogua.com/course/1391 - 0.8 - - - https://ctc.koogua.com/course/1392 - 0.8 - - - https://ctc.koogua.com/course/1393 - 0.8 - - - https://ctc.koogua.com/teacher/100015 - 0.6 - - - https://ctc.koogua.com/teacher/100065 - 0.6 - - - https://ctc.koogua.com/teacher/100203 - 0.6 - - - https://ctc.koogua.com/teacher/100329 - 0.6 - - - https://ctc.koogua.com/teacher/100338 - 0.6 - - - https://ctc.koogua.com/teacher/100875 - 0.6 - - - https://ctc.koogua.com/teacher/101164 - 0.6 - - - https://ctc.koogua.com/teacher/101686 - 0.6 - - - https://ctc.koogua.com/teacher/101768 - 0.6 - - - https://ctc.koogua.com/teacher/101818 - 0.6 - - - https://ctc.koogua.com/teacher/101822 - 0.6 - - - https://ctc.koogua.com/teacher/102030 - 0.6 - - - https://ctc.koogua.com/teacher/102093 - 0.6 - - - https://ctc.koogua.com/teacher/102153 - 0.6 - - - https://ctc.koogua.com/teacher/102154 - 0.6 - - - https://ctc.koogua.com/teacher/103904 - 0.6 - - - https://ctc.koogua.com/teacher/104043 - 0.6 - - - https://ctc.koogua.com/teacher/104044 - 0.6 - - - https://ctc.koogua.com/teacher/104472 - 0.6 - - - https://ctc.koogua.com/teacher/104592 - 0.6 - - - https://ctc.koogua.com/teacher/104593 - 0.6 - - - https://ctc.koogua.com/teacher/105292 - 0.6 - - - https://ctc.koogua.com/teacher/106032 - 0.6 - - - https://ctc.koogua.com/teacher/106122 - 0.6 - - - https://ctc.koogua.com/teacher/106124 - 0.6 - - - https://ctc.koogua.com/teacher/106125 - 0.6 - - - https://ctc.koogua.com/teacher/106433 - 0.6 - - - https://ctc.koogua.com/teacher/106511 - 0.6 - - - https://ctc.koogua.com/teacher/108492 - 0.6 - - - https://ctc.koogua.com/teacher/108955 - 0.6 - - - https://ctc.koogua.com/teacher/110488 - 0.6 - - - https://ctc.koogua.com/teacher/110555 - 0.6 - - - https://ctc.koogua.com/teacher/111771 - 0.6 - - - https://ctc.koogua.com/teacher/111801 - 0.6 - - - https://ctc.koogua.com/teacher/112258 - 0.6 - - - https://ctc.koogua.com/teacher/112300 - 0.6 - - - https://ctc.koogua.com/teacher/112353 - 0.6 - - - https://ctc.koogua.com/teacher/112564 - 0.6 - - - https://ctc.koogua.com/teacher/114418 - 0.6 - - - https://ctc.koogua.com/teacher/114726 - 0.6 - - - https://ctc.koogua.com/teacher/114832 - 0.6 - - - https://ctc.koogua.com/teacher/117182 - 0.6 - - - https://ctc.koogua.com/teacher/117503 - 0.6 - - - https://ctc.koogua.com/teacher/126569 - 0.6 - - - https://ctc.koogua.com/teacher/135109 - 0.6 - - - https://ctc.koogua.com/teacher/135647 - 0.6 - - - https://ctc.koogua.com/teacher/139096 - 0.6 - - - https://ctc.koogua.com/teacher/139514 - 0.6 - - - https://ctc.koogua.com/teacher/141256 - 0.6 - - - https://ctc.koogua.com/teacher/168177 - 0.6 - - - https://ctc.koogua.com/teacher/170510 - 0.6 - - - https://ctc.koogua.com/teacher/184799 - 0.6 - - - https://ctc.koogua.com/teacher/188086 - 0.6 - - - https://ctc.koogua.com/teacher/190142 - 0.6 - - - https://ctc.koogua.com/teacher/193169 - 0.6 - - - https://ctc.koogua.com/teacher/193479 - 0.6 - - - https://ctc.koogua.com/teacher/194288 - 0.6 - - - https://ctc.koogua.com/teacher/194995 - 0.6 - - - https://ctc.koogua.com/teacher/197450 - 0.6 - - - https://ctc.koogua.com/teacher/197650 - 0.6 - - - https://ctc.koogua.com/teacher/198337 - 0.6 - - - https://ctc.koogua.com/teacher/198533 - 0.6 - - - https://ctc.koogua.com/teacher/218534 - 0.6 - - - https://ctc.koogua.com/teacher/218553 - 0.6 - - - https://ctc.koogua.com/teacher/220282 - 0.6 - - - https://ctc.koogua.com/teacher/222764 - 0.6 - - - https://ctc.koogua.com/teacher/223022 - 0.6 - - - https://ctc.koogua.com/teacher/225594 - 0.6 - - - https://ctc.koogua.com/teacher/229511 - 0.6 - - - https://ctc.koogua.com/teacher/231040 - 0.6 - - - https://ctc.koogua.com/teacher/232181 - 0.6 - - - https://ctc.koogua.com/teacher/232194 - 0.6 - - - https://ctc.koogua.com/teacher/235106 - 0.6 - - - https://ctc.koogua.com/teacher/239819 - 0.6 - - - https://ctc.koogua.com/teacher/248893 - 0.6 - - - https://ctc.koogua.com/teacher/249235 - 0.6 - - - https://ctc.koogua.com/teacher/250255 - 0.6 - - - https://ctc.koogua.com/teacher/252015 - 0.6 - - - https://ctc.koogua.com/teacher/255838 - 0.6 - - - https://ctc.koogua.com/teacher/256229 - 0.6 - - - https://ctc.koogua.com/teacher/260027 - 0.6 - - - https://ctc.koogua.com/teacher/264209 - 0.6 - - - https://ctc.koogua.com/teacher/268940 - 0.6 - - - https://ctc.koogua.com/teacher/278813 - 0.6 - - - https://ctc.koogua.com/teacher/278816 - 0.6 - - - https://ctc.koogua.com/teacher/278818 - 0.6 - - - https://ctc.koogua.com/teacher/286100 - 0.6 - - - https://ctc.koogua.com/teacher/290139 - 0.6 - - - https://ctc.koogua.com/teacher/292120 - 0.6 - - - https://ctc.koogua.com/teacher/293729 - 0.6 - - - https://ctc.koogua.com/teacher/295947 - 0.6 - - - https://ctc.koogua.com/teacher/299588 - 0.6 - - - https://ctc.koogua.com/teacher/300977 - 0.6 - - - https://ctc.koogua.com/teacher/304978 - 0.6 - - - https://ctc.koogua.com/teacher/307362 - 0.6 - - - https://ctc.koogua.com/teacher/313576 - 0.6 - - - https://ctc.koogua.com/teacher/315464 - 0.6 - - - https://ctc.koogua.com/teacher/320810 - 0.6 - - - https://ctc.koogua.com/teacher/320852 - 0.6 - - - https://ctc.koogua.com/teacher/321949 - 0.6 - - - https://ctc.koogua.com/teacher/347333 - 0.6 - - - https://ctc.koogua.com/teacher/350968 - 0.6 - - - https://ctc.koogua.com/teacher/434905 - 0.6 - - - https://ctc.koogua.com/teacher/436001 - 0.6 - - - https://ctc.koogua.com/teacher/442064 - 0.6 - - - https://ctc.koogua.com/teacher/442416 - 0.6 - - - https://ctc.koogua.com/teacher/445731 - 0.6 - - - https://ctc.koogua.com/teacher/457734 - 0.6 - - - https://ctc.koogua.com/teacher/461086 - 0.6 - - - https://ctc.koogua.com/teacher/468771 - 0.6 - - - https://ctc.koogua.com/teacher/476409 - 0.6 - - - https://ctc.koogua.com/teacher/479481 - 0.6 - - - https://ctc.koogua.com/teacher/480378 - 0.6 - - - https://ctc.koogua.com/teacher/484133 - 0.6 - - - https://ctc.koogua.com/teacher/484627 - 0.6 - - - https://ctc.koogua.com/teacher/486893 - 0.6 - - - https://ctc.koogua.com/teacher/497216 - 0.6 - - - https://ctc.koogua.com/teacher/497320 - 0.6 - - - https://ctc.koogua.com/teacher/1002064 - 0.6 - - - https://ctc.koogua.com/teacher/1033307 - 0.6 - - - https://ctc.koogua.com/teacher/1037791 - 0.6 - - - https://ctc.koogua.com/teacher/1049184 - 0.6 - - - https://ctc.koogua.com/teacher/1050387 - 0.6 - - - https://ctc.koogua.com/teacher/1050479 - 0.6 - - - https://ctc.koogua.com/teacher/1057916 - 0.6 - - - https://ctc.koogua.com/teacher/1101417 - 0.6 - - - https://ctc.koogua.com/teacher/1102391 - 0.6 - - - https://ctc.koogua.com/teacher/1107813 - 0.6 - - - https://ctc.koogua.com/teacher/1118193 - 0.6 - - - https://ctc.koogua.com/teacher/1132220 - 0.6 - - - https://ctc.koogua.com/teacher/1133441 - 0.6 - - - https://ctc.koogua.com/teacher/1159332 - 0.6 - - - https://ctc.koogua.com/teacher/1162828 - 0.6 - - - https://ctc.koogua.com/teacher/1165453 - 0.6 - - - https://ctc.koogua.com/teacher/1170998 - 0.6 - - - https://ctc.koogua.com/teacher/1171555 - 0.6 - - - https://ctc.koogua.com/teacher/1175646 - 0.6 - - - https://ctc.koogua.com/teacher/1187863 - 0.6 - - - https://ctc.koogua.com/teacher/1193871 - 0.6 - - - https://ctc.koogua.com/teacher/1196301 - 0.6 - - - https://ctc.koogua.com/teacher/1198744 - 0.6 - - - https://ctc.koogua.com/teacher/1199115 - 0.6 - - - https://ctc.koogua.com/teacher/1200677 - 0.6 - - - https://ctc.koogua.com/teacher/1201036 - 0.6 - - - https://ctc.koogua.com/teacher/1209902 - 0.6 - - - https://ctc.koogua.com/teacher/1212130 - 0.6 - - - https://ctc.koogua.com/teacher/1214875 - 0.6 - - - https://ctc.koogua.com/teacher/1223100 - 0.6 - - - https://ctc.koogua.com/teacher/1248487 - 0.6 - - - https://ctc.koogua.com/teacher/1272522 - 0.6 - - - https://ctc.koogua.com/teacher/1277440 - 0.6 - - - https://ctc.koogua.com/teacher/1277889 - 0.6 - - - https://ctc.koogua.com/teacher/1289460 - 0.6 - - - https://ctc.koogua.com/teacher/1291028 - 0.6 - - - https://ctc.koogua.com/teacher/1307837 - 0.6 - - - https://ctc.koogua.com/teacher/1315488 - 0.6 - - - https://ctc.koogua.com/teacher/1339513 - 0.6 - - - https://ctc.koogua.com/teacher/1341415 - 0.6 - - - https://ctc.koogua.com/teacher/1343480 - 0.6 - - - https://ctc.koogua.com/teacher/1344207 - 0.6 - - - https://ctc.koogua.com/teacher/1349694 - 0.6 - - - https://ctc.koogua.com/teacher/1352822 - 0.6 - - - https://ctc.koogua.com/teacher/1357695 - 0.6 - - - https://ctc.koogua.com/teacher/1358616 - 0.6 - - - https://ctc.koogua.com/teacher/1372547 - 0.6 - - - https://ctc.koogua.com/teacher/1377243 - 0.6 - - - https://ctc.koogua.com/teacher/1395824 - 0.6 - - - https://ctc.koogua.com/teacher/1798315 - 0.6 - - - https://ctc.koogua.com/teacher/1863086 - 0.6 - - - https://ctc.koogua.com/teacher/1867542 - 0.6 - - - https://ctc.koogua.com/teacher/1868292 - 0.6 - - - https://ctc.koogua.com/teacher/1870677 - 0.6 - - - https://ctc.koogua.com/teacher/1873089 - 0.6 - - - https://ctc.koogua.com/teacher/1931041 - 0.6 - - - https://ctc.koogua.com/teacher/1931433 - 0.6 - - - https://ctc.koogua.com/teacher/1943575 - 0.6 - - - https://ctc.koogua.com/teacher/1961093 - 0.6 - - - https://ctc.koogua.com/teacher/1970574 - 0.6 - - - https://ctc.koogua.com/teacher/1975036 - 0.6 - - - https://ctc.koogua.com/teacher/1975796 - 0.6 - - - https://ctc.koogua.com/teacher/1975992 - 0.6 - - - https://ctc.koogua.com/teacher/1987319 - 0.6 - - - https://ctc.koogua.com/teacher/1991142 - 0.6 - - - https://ctc.koogua.com/teacher/1991615 - 0.6 - - - https://ctc.koogua.com/teacher/2008992 - 0.6 - - - https://ctc.koogua.com/teacher/2009488 - 0.6 - - - https://ctc.koogua.com/teacher/2017563 - 0.6 - - - https://ctc.koogua.com/teacher/2020420 - 0.6 - - - https://ctc.koogua.com/teacher/2022616 - 0.6 - - - https://ctc.koogua.com/teacher/2041369 - 0.6 - - - https://ctc.koogua.com/teacher/2060833 - 0.6 - - - https://ctc.koogua.com/teacher/2075722 - 0.6 - - - https://ctc.koogua.com/teacher/2079070 - 0.6 - - - https://ctc.koogua.com/teacher/2081572 - 0.6 - - - https://ctc.koogua.com/teacher/2084853 - 0.6 - - - https://ctc.koogua.com/teacher/2088575 - 0.6 - - - https://ctc.koogua.com/teacher/2126138 - 0.6 - - - https://ctc.koogua.com/teacher/2130096 - 0.6 - - - https://ctc.koogua.com/teacher/2134188 - 0.6 - - - https://ctc.koogua.com/teacher/2137489 - 0.6 - - - https://ctc.koogua.com/teacher/2145618 - 0.6 - - - https://ctc.koogua.com/teacher/2146035 - 0.6 - - - https://ctc.koogua.com/teacher/2155343 - 0.6 - - - https://ctc.koogua.com/teacher/2206301 - 0.6 - - - https://ctc.koogua.com/teacher/2225574 - 0.6 - - - https://ctc.koogua.com/teacher/2255006 - 0.6 - - - https://ctc.koogua.com/teacher/2282747 - 0.6 - - - https://ctc.koogua.com/teacher/2286562 - 0.6 - - - https://ctc.koogua.com/teacher/2292277 - 0.6 - - - https://ctc.koogua.com/teacher/2301800 - 0.6 - - - https://ctc.koogua.com/teacher/2327155 - 0.6 - - - https://ctc.koogua.com/teacher/2359495 - 0.6 - - - https://ctc.koogua.com/teacher/2375888 - 0.6 - - - https://ctc.koogua.com/teacher/2432190 - 0.6 - - - https://ctc.koogua.com/teacher/2476209 - 0.6 - - - https://ctc.koogua.com/teacher/2483849 - 0.6 - - - https://ctc.koogua.com/teacher/2485906 - 0.6 - - - https://ctc.koogua.com/teacher/2505925 - 0.6 - - - https://ctc.koogua.com/teacher/2519662 - 0.6 - - - https://ctc.koogua.com/teacher/2535251 - 0.6 - - - https://ctc.koogua.com/teacher/2577144 - 0.6 - - - https://ctc.koogua.com/teacher/2642250 - 0.6 - - - https://ctc.koogua.com/teacher/2654886 - 0.6 - - - https://ctc.koogua.com/teacher/2674286 - 0.6 - - - https://ctc.koogua.com/teacher/2705746 - 0.6 - - - https://ctc.koogua.com/teacher/2726237 - 0.6 - - - https://ctc.koogua.com/teacher/2726958 - 0.6 - - - https://ctc.koogua.com/teacher/2728991 - 0.6 - - - https://ctc.koogua.com/teacher/2732474 - 0.6 - - - https://ctc.koogua.com/teacher/2764798 - 0.6 - - - https://ctc.koogua.com/teacher/2781843 - 0.6 - - - https://ctc.koogua.com/teacher/2795280 - 0.6 - - - https://ctc.koogua.com/teacher/2798145 - 0.6 - - - https://ctc.koogua.com/teacher/2818095 - 0.6 - - - https://ctc.koogua.com/teacher/2825333 - 0.6 - - - https://ctc.koogua.com/teacher/2854586 - 0.6 - - - https://ctc.koogua.com/teacher/2862917 - 0.6 - - - https://ctc.koogua.com/teacher/2913381 - 0.6 - - - https://ctc.koogua.com/teacher/2917629 - 0.6 - - - https://ctc.koogua.com/teacher/2924779 - 0.6 - - - https://ctc.koogua.com/teacher/2934463 - 0.6 - - - https://ctc.koogua.com/teacher/2942236 - 0.6 - - - https://ctc.koogua.com/teacher/2995425 - 0.6 - - - https://ctc.koogua.com/teacher/3017249 - 0.6 - - - https://ctc.koogua.com/teacher/3032949 - 0.6 - - - https://ctc.koogua.com/teacher/3036896 - 0.6 - - - https://ctc.koogua.com/teacher/3078817 - 0.6 - - - https://ctc.koogua.com/teacher/3083408 - 0.6 - - - https://ctc.koogua.com/teacher/3160662 - 0.6 - - - https://ctc.koogua.com/teacher/3169235 - 0.6 - - - https://ctc.koogua.com/teacher/3204155 - 0.6 - - - https://ctc.koogua.com/teacher/3205760 - 0.6 - - - https://ctc.koogua.com/teacher/3211033 - 0.6 - - - https://ctc.koogua.com/teacher/3234480 - 0.6 - - - https://ctc.koogua.com/teacher/3287827 - 0.6 - - - https://ctc.koogua.com/teacher/3303124 - 0.6 - - - https://ctc.koogua.com/teacher/3330348 - 0.6 - - - https://ctc.koogua.com/teacher/3402290 - 0.6 - - - https://ctc.koogua.com/teacher/3414982 - 0.6 - - - https://ctc.koogua.com/teacher/3469396 - 0.6 - - - https://ctc.koogua.com/teacher/3503821 - 0.6 - - - https://ctc.koogua.com/teacher/3545184 - 0.6 - - - https://ctc.koogua.com/teacher/3554172 - 0.6 - - - https://ctc.koogua.com/teacher/3571465 - 0.6 - - - https://ctc.koogua.com/teacher/3574330 - 0.6 - - - https://ctc.koogua.com/teacher/3577796 - 0.6 - - - https://ctc.koogua.com/teacher/3736287 - 0.6 - - - https://ctc.koogua.com/teacher/3741965 - 0.6 - - - https://ctc.koogua.com/teacher/3771512 - 0.6 - - - https://ctc.koogua.com/teacher/3778140 - 0.6 - - - https://ctc.koogua.com/teacher/3781805 - 0.6 - - - https://ctc.koogua.com/teacher/3783489 - 0.6 - - - https://ctc.koogua.com/teacher/3784635 - 0.6 - - - https://ctc.koogua.com/teacher/3789140 - 0.6 - - - https://ctc.koogua.com/teacher/3795928 - 0.6 - - - https://ctc.koogua.com/teacher/3806692 - 0.6 - - - https://ctc.koogua.com/teacher/3807331 - 0.6 - - - https://ctc.koogua.com/teacher/3807335 - 0.6 - - - https://ctc.koogua.com/teacher/3809350 - 0.6 - - - https://ctc.koogua.com/teacher/3814388 - 0.6 - - - https://ctc.koogua.com/teacher/3841732 - 0.6 - - - https://ctc.koogua.com/teacher/3871745 - 0.6 - - - https://ctc.koogua.com/teacher/3877520 - 0.6 - - - https://ctc.koogua.com/teacher/3880543 - 0.6 - - - https://ctc.koogua.com/teacher/3900384 - 0.6 - - - https://ctc.koogua.com/teacher/3900685 - 0.6 - - - https://ctc.koogua.com/teacher/3917588 - 0.6 - - - https://ctc.koogua.com/teacher/3924694 - 0.6 - - - https://ctc.koogua.com/teacher/3965254 - 0.6 - - - https://ctc.koogua.com/teacher/4072695 - 0.6 - - - https://ctc.koogua.com/teacher/4072697 - 0.6 - - - https://ctc.koogua.com/teacher/4072846 - 0.6 - - - https://ctc.koogua.com/teacher/4088539 - 0.6 - - - https://ctc.koogua.com/teacher/4114115 - 0.6 - - - https://ctc.koogua.com/teacher/4172577 - 0.6 - - - https://ctc.koogua.com/teacher/4172751 - 0.6 - - - https://ctc.koogua.com/teacher/4263601 - 0.6 - - - https://ctc.koogua.com/teacher/4264265 - 0.6 - - - https://ctc.koogua.com/teacher/4278625 - 0.6 - - - https://ctc.koogua.com/teacher/4294850 - 0.6 - - - https://ctc.koogua.com/teacher/4340920 - 0.6 - - - https://ctc.koogua.com/teacher/4341377 - 0.6 - - - https://ctc.koogua.com/teacher/4379042 - 0.6 - - - https://ctc.koogua.com/teacher/4427201 - 0.6 - - - https://ctc.koogua.com/teacher/4464425 - 0.6 - - - https://ctc.koogua.com/teacher/4559066 - 0.6 - - - https://ctc.koogua.com/teacher/4595625 - 0.6 - - - https://ctc.koogua.com/teacher/4636792 - 0.6 - - - https://ctc.koogua.com/teacher/4639317 - 0.6 - - - https://ctc.koogua.com/teacher/4653974 - 0.6 - - - https://ctc.koogua.com/teacher/4662028 - 0.6 - - - https://ctc.koogua.com/teacher/4691819 - 0.6 - - - https://ctc.koogua.com/teacher/4701730 - 0.6 - - - https://ctc.koogua.com/teacher/4702495 - 0.6 - - - https://ctc.koogua.com/teacher/4708058 - 0.6 - - - https://ctc.koogua.com/teacher/4751328 - 0.6 - - - https://ctc.koogua.com/teacher/4764432 - 0.6 - - - https://ctc.koogua.com/teacher/4819931 - 0.6 - - - https://ctc.koogua.com/teacher/4842271 - 0.6 - - - https://ctc.koogua.com/teacher/4873493 - 0.6 - - - https://ctc.koogua.com/teacher/4898742 - 0.6 - - - https://ctc.koogua.com/teacher/4946241 - 0.6 - - - https://ctc.koogua.com/teacher/4951150 - 0.6 - - - https://ctc.koogua.com/teacher/4974552 - 0.6 - - - https://ctc.koogua.com/teacher/5000909 - 0.6 - - - https://ctc.koogua.com/teacher/5027812 - 0.6 - - - https://ctc.koogua.com/teacher/5080414 - 0.6 - - - https://ctc.koogua.com/teacher/5113435 - 0.6 - - - https://ctc.koogua.com/teacher/5135129 - 0.6 - - - https://ctc.koogua.com/teacher/5163070 - 0.6 - - - https://ctc.koogua.com/teacher/5196782 - 0.6 - - - https://ctc.koogua.com/teacher/5208326 - 0.6 - - - https://ctc.koogua.com/teacher/5215097 - 0.6 - - - https://ctc.koogua.com/teacher/5218006 - 0.6 - - - https://ctc.koogua.com/teacher/5243395 - 0.6 - - - https://ctc.koogua.com/teacher/5263053 - 0.6 - - - https://ctc.koogua.com/teacher/5275541 - 0.6 - - - https://ctc.koogua.com/teacher/5297452 - 0.6 - - - https://ctc.koogua.com/teacher/5319263 - 0.6 - - - https://ctc.koogua.com/teacher/5344303 - 0.6 - - - https://ctc.koogua.com/teacher/5350288 - 0.6 - - - https://ctc.koogua.com/teacher/5370865 - 0.6 - - - https://ctc.koogua.com/teacher/5387391 - 0.6 - - - https://ctc.koogua.com/teacher/5389104 - 0.6 - - - https://ctc.koogua.com/teacher/5436416 - 0.6 - - - https://ctc.koogua.com/teacher/5478722 - 0.6 - - - https://ctc.koogua.com/teacher/5484964 - 0.6 - - - https://ctc.koogua.com/teacher/5542482 - 0.6 - - - https://ctc.koogua.com/teacher/5548193 - 0.6 - - - https://ctc.koogua.com/teacher/5572002 - 0.6 - - - https://ctc.koogua.com/teacher/5584841 - 0.6 - - - https://ctc.koogua.com/teacher/5634820 - 0.6 - - - https://ctc.koogua.com/teacher/5646367 - 0.6 - - - https://ctc.koogua.com/teacher/5691279 - 0.6 - - - https://ctc.koogua.com/teacher/5693238 - 0.6 - - - https://ctc.koogua.com/teacher/5707023 - 0.6 - - - https://ctc.koogua.com/teacher/5751319 - 0.6 - - - https://ctc.koogua.com/teacher/5953218 - 0.6 - - - https://ctc.koogua.com/teacher/5980627 - 0.6 - - - https://ctc.koogua.com/teacher/5998157 - 0.6 - - - https://ctc.koogua.com/teacher/6012904 - 0.6 - - - https://ctc.koogua.com/teacher/6018814 - 0.6 - - - https://ctc.koogua.com/teacher/6077482 - 0.6 - - - https://ctc.koogua.com/teacher/6089553 - 0.6 - - - https://ctc.koogua.com/teacher/6147352 - 0.6 - - - https://ctc.koogua.com/teacher/6167422 - 0.6 - - - https://ctc.koogua.com/teacher/6198190 - 0.6 - - - https://ctc.koogua.com/teacher/6199398 - 0.6 - - - https://ctc.koogua.com/teacher/6223315 - 0.6 - - - https://ctc.koogua.com/teacher/6224286 - 0.6 - - - https://ctc.koogua.com/teacher/6243398 - 0.6 - - - https://ctc.koogua.com/teacher/6288927 - 0.6 - - - https://ctc.koogua.com/teacher/6300745 - 0.6 - - - https://ctc.koogua.com/teacher/6319890 - 0.6 - - - https://ctc.koogua.com/teacher/6323500 - 0.6 - - - https://ctc.koogua.com/teacher/6328940 - 0.6 - - - https://ctc.koogua.com/teacher/6360139 - 0.6 - - - https://ctc.koogua.com/teacher/6370609 - 0.6 - - - https://ctc.koogua.com/teacher/6387238 - 0.6 - - - https://ctc.koogua.com/teacher/6397953 - 0.6 - - - https://ctc.koogua.com/teacher/6419539 - 0.6 - - - https://ctc.koogua.com/teacher/6433657 - 0.6 - - - https://ctc.koogua.com/teacher/6448320 - 0.6 - - - https://ctc.koogua.com/teacher/6448872 - 0.6 - - - https://ctc.koogua.com/teacher/6452294 - 0.6 - - - https://ctc.koogua.com/teacher/6462189 - 0.6 - - - https://ctc.koogua.com/teacher/6477932 - 0.6 - - - https://ctc.koogua.com/teacher/6488650 - 0.6 - - - https://ctc.koogua.com/teacher/6505121 - 0.6 - - - https://ctc.koogua.com/teacher/6512963 - 0.6 - - - https://ctc.koogua.com/teacher/6517619 - 0.6 - - - https://ctc.koogua.com/teacher/6527609 - 0.6 - - - https://ctc.koogua.com/teacher/6550132 - 0.6 - - - https://ctc.koogua.com/teacher/6552835 - 0.6 - - - https://ctc.koogua.com/teacher/6566755 - 0.6 - - - https://ctc.koogua.com/teacher/6571181 - 0.6 - - - https://ctc.koogua.com/teacher/6572321 - 0.6 - - - https://ctc.koogua.com/teacher/6581832 - 0.6 - - - https://ctc.koogua.com/teacher/6596972 - 0.6 - - - https://ctc.koogua.com/teacher/6604232 - 0.6 - - - https://ctc.koogua.com/teacher/6611189 - 0.6 - - - https://ctc.koogua.com/teacher/6634640 - 0.6 - - - https://ctc.koogua.com/teacher/6685330 - 0.6 - - - https://ctc.koogua.com/teacher/6689192 - 0.6 - - - https://ctc.koogua.com/teacher/6710361 - 0.6 - - - https://ctc.koogua.com/teacher/6721983 - 0.6 - - - https://ctc.koogua.com/teacher/6734702 - 0.6 - - - https://ctc.koogua.com/teacher/6742775 - 0.6 - - - https://ctc.koogua.com/teacher/6854697 - 0.6 - - - https://ctc.koogua.com/teacher/6859880 - 0.6 - - - https://ctc.koogua.com/teacher/6897192 - 0.6 - - - https://ctc.koogua.com/teacher/6920600 - 0.6 - - - https://ctc.koogua.com/teacher/6939456 - 0.6 - - - https://ctc.koogua.com/teacher/6994070 - 0.6 - - - https://ctc.koogua.com/teacher/7066345 - 0.6 - - - https://ctc.koogua.com/teacher/7143508 - 0.6 - - - https://ctc.koogua.com/teacher/7170043 - 0.6 - - - https://ctc.koogua.com/teacher/7376453 - 0.6 - - - https://ctc.koogua.com/teacher/7387112 - 0.6 - - - https://ctc.koogua.com/teacher/7420486 - 0.6 - - - https://ctc.koogua.com/teacher/7459484 - 0.6 - - - https://ctc.koogua.com/teacher/7463021 - 0.6 - - - https://ctc.koogua.com/teacher/7509254 - 0.6 - - - https://ctc.koogua.com/teacher/7537359 - 0.6 - - - https://ctc.koogua.com/teacher/7539222 - 0.6 - - - https://ctc.koogua.com/teacher/7558683 - 0.6 - - - https://ctc.koogua.com/teacher/7711623 - 0.6 - - - https://ctc.koogua.com/teacher/7714249 - 0.6 - - - https://ctc.koogua.com/teacher/7900275 - 0.6 - - - https://ctc.koogua.com/topic/6 - 0.6 - - - https://ctc.koogua.com/topic/7 - 0.6 - - - https://ctc.koogua.com/topic/8 - 0.6 - - - https://ctc.koogua.com/topic/9 - 0.6 - - - https://ctc.koogua.com/topic/10 - 0.6 - - - https://ctc.koogua.com/topic/11 - 0.6 - - - https://ctc.koogua.com/topic/12 - 0.6 - - - https://ctc.koogua.com/topic/13 - 0.6 - - - https://ctc.koogua.com/topic/14 - 0.6 - - - https://ctc.koogua.com/topic/15 - 0.6 - - - https://ctc.koogua.com/topic/17 - 0.6 - - - https://ctc.koogua.com/topic/18 - 0.6 - - - https://ctc.koogua.com/topic/19 - 0.6 - - - https://ctc.koogua.com/topic/20 - 0.6 - - - https://ctc.koogua.com/topic/21 - 0.6 - - - https://ctc.koogua.com/topic/22 - 0.6 - - - https://ctc.koogua.com/topic/23 - 0.6 - - - https://ctc.koogua.com/topic/24 - 0.6 - - - https://ctc.koogua.com/topic/25 - 0.6 - - - https://ctc.koogua.com/topic/26 - 0.6 - - - https://ctc.koogua.com/topic/27 - 0.6 - - - https://ctc.koogua.com/topic/28 - 0.6 - - - https://ctc.koogua.com/topic/29 - 0.6 - - - https://ctc.koogua.com/topic/40 - 0.6 - - - https://ctc.koogua.com/topic/41 - 0.6 - - - https://ctc.koogua.com/topic/42 - 0.6 - - - https://ctc.koogua.com/topic/43 - 0.6 - - - https://ctc.koogua.com/topic/44 - 0.6 - - - https://ctc.koogua.com/topic/45 - 0.6 - - - https://ctc.koogua.com/topic/46 - 0.6 - - - https://ctc.koogua.com/topic/50 - 0.6 - - - https://ctc.koogua.com/topic/51 - 0.6 - - - https://ctc.koogua.com/topic/52 - 0.6 - - - https://ctc.koogua.com/topic/53 - 0.6 - - - https://ctc.koogua.com/topic/54 - 0.6 - - - https://ctc.koogua.com/topic/55 - 0.6 - - - https://ctc.koogua.com/topic/56 - 0.6 - - - https://ctc.koogua.com/topic/86 - 0.6 - - - https://ctc.koogua.com/topic/110 - 0.6 - - - https://ctc.koogua.com/im/group/1 - 0.6 - - - https://ctc.koogua.com/im/group/2 - 0.6 - - - https://ctc.koogua.com/im/group/3 - 0.6 - - - https://ctc.koogua.com/im/group/4 - 0.6 - - - https://ctc.koogua.com/im/group/5 - 0.6 - - - https://ctc.koogua.com/im/group/6 - 0.6 - - - https://ctc.koogua.com/im/group/7 - 0.6 - - - https://ctc.koogua.com/im/group/8 - 0.6 - - - https://ctc.koogua.com/im/group/9 - 0.6 - - - https://ctc.koogua.com/im/group/10 - 0.6 - - - https://ctc.koogua.com/im/group/11 - 0.6 - - - https://ctc.koogua.com/im/group/12 - 0.6 - - - https://ctc.koogua.com/im/group/13 - 0.6 - - - https://ctc.koogua.com/im/group/14 - 0.6 - - - https://ctc.koogua.com/im/group/15 - 0.6 - - - https://ctc.koogua.com/im/group/16 - 0.6 - - - https://ctc.koogua.com/im/group/17 - 0.6 - - - https://ctc.koogua.com/im/group/18 - 0.6 - - - https://ctc.koogua.com/im/group/19 - 0.6 - - - https://ctc.koogua.com/im/group/20 - 0.6 - - - https://ctc.koogua.com/im/group/21 - 0.6 - - - https://ctc.koogua.com/im/group/22 - 0.6 - - - https://ctc.koogua.com/im/group/23 - 0.6 - - - https://ctc.koogua.com/im/group/24 - 0.6 - - - https://ctc.koogua.com/im/group/25 - 0.6 - - - https://ctc.koogua.com/im/group/26 - 0.6 - - - https://ctc.koogua.com/im/group/27 - 0.6 - - - https://ctc.koogua.com/im/group/28 - 0.6 - - - https://ctc.koogua.com/im/group/29 - 0.6 - - - https://ctc.koogua.com/im/group/30 - 0.6 - - - https://ctc.koogua.com/im/group/31 - 0.6 - - - https://ctc.koogua.com/im/group/32 - 0.6 - - - https://ctc.koogua.com/im/group/33 - 0.6 - - - https://ctc.koogua.com/im/group/34 - 0.6 - - - https://ctc.koogua.com/im/group/35 - 0.6 - - - https://ctc.koogua.com/im/group/36 - 0.6 - - - https://ctc.koogua.com/im/group/37 - 0.6 - - - https://ctc.koogua.com/im/group/38 - 0.6 - - - https://ctc.koogua.com/im/group/39 - 0.6 - - - https://ctc.koogua.com/im/group/40 - 0.6 - - - https://ctc.koogua.com/im/group/41 - 0.6 - - - https://ctc.koogua.com/im/group/42 - 0.6 - - - https://ctc.koogua.com/im/group/43 - 0.6 - - - https://ctc.koogua.com/im/group/44 - 0.6 - - - https://ctc.koogua.com/im/group/45 - 0.6 - - - https://ctc.koogua.com/im/group/46 - 0.6 - - - https://ctc.koogua.com/im/group/47 - 0.6 - - - https://ctc.koogua.com/im/group/48 - 0.6 - - - https://ctc.koogua.com/im/group/49 - 0.6 - - - https://ctc.koogua.com/im/group/50 - 0.6 - - - https://ctc.koogua.com/im/group/51 - 0.6 - - - https://ctc.koogua.com/im/group/52 - 0.6 - - - https://ctc.koogua.com/im/group/53 - 0.6 - - - https://ctc.koogua.com/im/group/54 - 0.6 - - - https://ctc.koogua.com/im/group/55 - 0.6 - - - https://ctc.koogua.com/im/group/56 - 0.6 - - - https://ctc.koogua.com/im/group/57 - 0.6 - - - https://ctc.koogua.com/im/group/58 - 0.6 - - - https://ctc.koogua.com/im/group/59 - 0.6 - - - https://ctc.koogua.com/im/group/60 - 0.6 - - - https://ctc.koogua.com/im/group/61 - 0.6 - - - https://ctc.koogua.com/im/group/62 - 0.6 - - - https://ctc.koogua.com/im/group/63 - 0.6 - - - https://ctc.koogua.com/im/group/64 - 0.6 - - - https://ctc.koogua.com/im/group/65 - 0.6 - - - https://ctc.koogua.com/im/group/66 - 0.6 - - - https://ctc.koogua.com/im/group/67 - 0.6 - - - https://ctc.koogua.com/im/group/68 - 0.6 - - - https://ctc.koogua.com/im/group/69 - 0.6 - - - https://ctc.koogua.com/im/group/70 - 0.6 - - - https://ctc.koogua.com/im/group/71 - 0.6 - - - https://ctc.koogua.com/im/group/72 - 0.6 - - - https://ctc.koogua.com/im/group/73 - 0.6 - - - https://ctc.koogua.com/im/group/74 - 0.6 - - - https://ctc.koogua.com/im/group/75 - 0.6 - - - https://ctc.koogua.com/im/group/76 - 0.6 - - - https://ctc.koogua.com/im/group/77 - 0.6 - - - https://ctc.koogua.com/im/group/78 - 0.6 - - - https://ctc.koogua.com/im/group/79 - 0.6 - - - https://ctc.koogua.com/im/group/80 - 0.6 - - - https://ctc.koogua.com/im/group/81 - 0.6 - - - https://ctc.koogua.com/im/group/82 - 0.6 - - - https://ctc.koogua.com/im/group/83 - 0.6 - - - https://ctc.koogua.com/im/group/84 - 0.6 - - - https://ctc.koogua.com/im/group/85 - 0.6 - - - https://ctc.koogua.com/im/group/86 - 0.6 - - - https://ctc.koogua.com/im/group/87 - 0.6 - - - https://ctc.koogua.com/im/group/88 - 0.6 - - - https://ctc.koogua.com/im/group/89 - 0.6 - - - https://ctc.koogua.com/im/group/90 - 0.6 - - - https://ctc.koogua.com/im/group/91 - 0.6 - - - https://ctc.koogua.com/im/group/92 - 0.6 - - - https://ctc.koogua.com/im/group/93 - 0.6 - - - https://ctc.koogua.com/im/group/94 - 0.6 - - - https://ctc.koogua.com/im/group/95 - 0.6 - - - https://ctc.koogua.com/im/group/96 - 0.6 - - - https://ctc.koogua.com/im/group/97 - 0.6 - - - https://ctc.koogua.com/im/group/98 - 0.6 - - - https://ctc.koogua.com/im/group/99 - 0.6 - - - https://ctc.koogua.com/im/group/100 - 0.6 - - - https://ctc.koogua.com/im/group/101 - 0.6 - - - https://ctc.koogua.com/im/group/102 - 0.6 - - - https://ctc.koogua.com/im/group/103 - 0.6 - - - https://ctc.koogua.com/im/group/104 - 0.6 - - - https://ctc.koogua.com/im/group/105 - 0.6 - - - https://ctc.koogua.com/im/group/106 - 0.6 - - - https://ctc.koogua.com/im/group/107 - 0.6 - - - https://ctc.koogua.com/im/group/108 - 0.6 - - - https://ctc.koogua.com/im/group/109 - 0.6 - - - https://ctc.koogua.com/im/group/110 - 0.6 - - - https://ctc.koogua.com/im/group/111 - 0.6 - - - https://ctc.koogua.com/im/group/112 - 0.6 - - - https://ctc.koogua.com/im/group/113 - 0.6 - - - https://ctc.koogua.com/im/group/114 - 0.6 - - - https://ctc.koogua.com/im/group/115 - 0.6 - - - https://ctc.koogua.com/im/group/116 - 0.6 - - - https://ctc.koogua.com/im/group/117 - 0.6 - - - https://ctc.koogua.com/im/group/118 - 0.6 - - - https://ctc.koogua.com/im/group/119 - 0.6 - - - https://ctc.koogua.com/im/group/120 - 0.6 - - - https://ctc.koogua.com/im/group/121 - 0.6 - - - https://ctc.koogua.com/im/group/122 - 0.6 - - - https://ctc.koogua.com/im/group/123 - 0.6 - - - https://ctc.koogua.com/im/group/124 - 0.6 - - - https://ctc.koogua.com/im/group/125 - 0.6 - - - https://ctc.koogua.com/im/group/126 - 0.6 - - - https://ctc.koogua.com/im/group/127 - 0.6 - - - https://ctc.koogua.com/im/group/128 - 0.6 - - - https://ctc.koogua.com/im/group/129 - 0.6 - - - https://ctc.koogua.com/im/group/130 - 0.6 - - - https://ctc.koogua.com/im/group/131 - 0.6 - - - https://ctc.koogua.com/im/group/132 - 0.6 - - - https://ctc.koogua.com/im/group/133 - 0.6 - - - https://ctc.koogua.com/im/group/134 - 0.6 - - - https://ctc.koogua.com/im/group/135 - 0.6 - - - https://ctc.koogua.com/im/group/136 - 0.6 - - - https://ctc.koogua.com/im/group/137 - 0.6 - - - https://ctc.koogua.com/im/group/138 - 0.6 - - - https://ctc.koogua.com/im/group/139 - 0.6 - - - https://ctc.koogua.com/im/group/140 - 0.6 - - - https://ctc.koogua.com/im/group/141 - 0.6 - - - https://ctc.koogua.com/im/group/142 - 0.6 - - - https://ctc.koogua.com/im/group/143 - 0.6 - - - https://ctc.koogua.com/im/group/144 - 0.6 - - - https://ctc.koogua.com/im/group/145 - 0.6 - - - https://ctc.koogua.com/im/group/146 - 0.6 - - - https://ctc.koogua.com/im/group/147 - 0.6 - - - https://ctc.koogua.com/im/group/148 - 0.6 - - - https://ctc.koogua.com/im/group/149 - 0.6 - - - https://ctc.koogua.com/im/group/150 - 0.6 - - - https://ctc.koogua.com/im/group/151 - 0.6 - - - https://ctc.koogua.com/im/group/152 - 0.6 - - - https://ctc.koogua.com/im/group/153 - 0.6 - - - https://ctc.koogua.com/im/group/154 - 0.6 - - - https://ctc.koogua.com/im/group/155 - 0.6 - - - https://ctc.koogua.com/im/group/156 - 0.6 - - - https://ctc.koogua.com/im/group/157 - 0.6 - - - https://ctc.koogua.com/im/group/158 - 0.6 - - - https://ctc.koogua.com/im/group/159 - 0.6 - - - https://ctc.koogua.com/im/group/160 - 0.6 - - - https://ctc.koogua.com/im/group/161 - 0.6 - - - https://ctc.koogua.com/im/group/162 - 0.6 - - - https://ctc.koogua.com/im/group/163 - 0.6 - - - https://ctc.koogua.com/im/group/164 - 0.6 - - - https://ctc.koogua.com/im/group/165 - 0.6 - - - https://ctc.koogua.com/im/group/166 - 0.6 - - - https://ctc.koogua.com/im/group/167 - 0.6 - - - https://ctc.koogua.com/im/group/168 - 0.6 - - - https://ctc.koogua.com/im/group/169 - 0.6 - - - https://ctc.koogua.com/im/group/170 - 0.6 - - - https://ctc.koogua.com/im/group/171 - 0.6 - - - https://ctc.koogua.com/im/group/172 - 0.6 - - - https://ctc.koogua.com/im/group/173 - 0.6 - - - https://ctc.koogua.com/im/group/174 - 0.6 - - - https://ctc.koogua.com/im/group/175 - 0.6 - - - https://ctc.koogua.com/im/group/176 - 0.6 - - - https://ctc.koogua.com/im/group/177 - 0.6 - - - https://ctc.koogua.com/im/group/178 - 0.6 - - - https://ctc.koogua.com/im/group/179 - 0.6 - - - https://ctc.koogua.com/im/group/180 - 0.6 - - - https://ctc.koogua.com/im/group/181 - 0.6 - - - https://ctc.koogua.com/im/group/182 - 0.6 - - - https://ctc.koogua.com/im/group/183 - 0.6 - - - https://ctc.koogua.com/im/group/184 - 0.6 - - - https://ctc.koogua.com/im/group/185 - 0.6 - - - https://ctc.koogua.com/im/group/186 - 0.6 - - - https://ctc.koogua.com/im/group/187 - 0.6 - - - https://ctc.koogua.com/im/group/188 - 0.6 - - - https://ctc.koogua.com/im/group/189 - 0.6 - - - https://ctc.koogua.com/im/group/190 - 0.6 - - - https://ctc.koogua.com/im/group/191 - 0.6 - - - https://ctc.koogua.com/im/group/192 - 0.6 - - - https://ctc.koogua.com/im/group/193 - 0.6 - - - https://ctc.koogua.com/im/group/194 - 0.6 - - - https://ctc.koogua.com/im/group/195 - 0.6 - - - https://ctc.koogua.com/im/group/196 - 0.6 - - - https://ctc.koogua.com/im/group/197 - 0.6 - - - https://ctc.koogua.com/im/group/198 - 0.6 - - - https://ctc.koogua.com/im/group/199 - 0.6 - - - https://ctc.koogua.com/im/group/200 - 0.6 - - - https://ctc.koogua.com/im/group/201 - 0.6 - - - https://ctc.koogua.com/im/group/202 - 0.6 - - - https://ctc.koogua.com/im/group/203 - 0.6 - - - https://ctc.koogua.com/im/group/204 - 0.6 - - - https://ctc.koogua.com/im/group/205 - 0.6 - - - https://ctc.koogua.com/im/group/206 - 0.6 - - - https://ctc.koogua.com/im/group/207 - 0.6 - - - https://ctc.koogua.com/im/group/208 - 0.6 - - - https://ctc.koogua.com/im/group/209 - 0.6 - - - https://ctc.koogua.com/im/group/210 - 0.6 - - - https://ctc.koogua.com/im/group/211 - 0.6 - - - https://ctc.koogua.com/im/group/212 - 0.6 - - - https://ctc.koogua.com/im/group/213 - 0.6 - - - https://ctc.koogua.com/im/group/214 - 0.6 - - - https://ctc.koogua.com/im/group/215 - 0.6 - - - https://ctc.koogua.com/im/group/216 - 0.6 - - - https://ctc.koogua.com/im/group/217 - 0.6 - - - https://ctc.koogua.com/im/group/218 - 0.6 - - - https://ctc.koogua.com/im/group/219 - 0.6 - - - https://ctc.koogua.com/im/group/220 - 0.6 - - - https://ctc.koogua.com/im/group/221 - 0.6 - - - https://ctc.koogua.com/im/group/222 - 0.6 - - - https://ctc.koogua.com/im/group/223 - 0.6 - - - https://ctc.koogua.com/im/group/224 - 0.6 - - - https://ctc.koogua.com/im/group/225 - 0.6 - - - https://ctc.koogua.com/im/group/226 - 0.6 - - - https://ctc.koogua.com/im/group/227 - 0.6 - - - https://ctc.koogua.com/im/group/228 - 0.6 - - - https://ctc.koogua.com/im/group/229 - 0.6 - - - https://ctc.koogua.com/im/group/230 - 0.6 - - - https://ctc.koogua.com/im/group/231 - 0.6 - - - https://ctc.koogua.com/im/group/232 - 0.6 - - - https://ctc.koogua.com/im/group/233 - 0.6 - - - https://ctc.koogua.com/im/group/234 - 0.6 - - - https://ctc.koogua.com/im/group/235 - 0.6 - - - https://ctc.koogua.com/im/group/236 - 0.6 - - - https://ctc.koogua.com/im/group/237 - 0.6 - - - https://ctc.koogua.com/im/group/238 - 0.6 - - - https://ctc.koogua.com/im/group/239 - 0.6 - - - https://ctc.koogua.com/im/group/240 - 0.6 - - - https://ctc.koogua.com/im/group/241 - 0.6 - - - https://ctc.koogua.com/im/group/242 - 0.6 - - - https://ctc.koogua.com/im/group/243 - 0.6 - - - https://ctc.koogua.com/im/group/244 - 0.6 - - - https://ctc.koogua.com/im/group/245 - 0.6 - - - https://ctc.koogua.com/im/group/246 - 0.6 - - - https://ctc.koogua.com/im/group/247 - 0.6 - - - https://ctc.koogua.com/im/group/248 - 0.6 - - - https://ctc.koogua.com/im/group/249 - 0.6 - - - https://ctc.koogua.com/im/group/250 - 0.6 - - - https://ctc.koogua.com/im/group/251 - 0.6 - - - https://ctc.koogua.com/im/group/252 - 0.6 - - - https://ctc.koogua.com/im/group/253 - 0.6 - - - https://ctc.koogua.com/im/group/254 - 0.6 - - - https://ctc.koogua.com/im/group/255 - 0.6 - - - https://ctc.koogua.com/im/group/256 - 0.6 - - - https://ctc.koogua.com/im/group/257 - 0.6 - - - https://ctc.koogua.com/im/group/258 - 0.6 - - - https://ctc.koogua.com/im/group/259 - 0.6 - - - https://ctc.koogua.com/im/group/260 - 0.6 - - - https://ctc.koogua.com/im/group/261 - 0.6 - - - https://ctc.koogua.com/im/group/262 - 0.6 - - - https://ctc.koogua.com/im/group/263 - 0.6 - - - https://ctc.koogua.com/im/group/264 - 0.6 - - - https://ctc.koogua.com/im/group/265 - 0.6 - - - https://ctc.koogua.com/im/group/266 - 0.6 - - - https://ctc.koogua.com/im/group/267 - 0.6 - - - https://ctc.koogua.com/im/group/268 - 0.6 - - - https://ctc.koogua.com/im/group/269 - 0.6 - - - https://ctc.koogua.com/im/group/270 - 0.6 - - - https://ctc.koogua.com/im/group/271 - 0.6 - - - https://ctc.koogua.com/im/group/272 - 0.6 - - - https://ctc.koogua.com/im/group/273 - 0.6 - - - https://ctc.koogua.com/im/group/274 - 0.6 - - - https://ctc.koogua.com/im/group/275 - 0.6 - - - https://ctc.koogua.com/im/group/276 - 0.6 - - - https://ctc.koogua.com/im/group/277 - 0.6 - - - https://ctc.koogua.com/im/group/278 - 0.6 - - - https://ctc.koogua.com/im/group/279 - 0.6 - - - https://ctc.koogua.com/im/group/280 - 0.6 - - - https://ctc.koogua.com/im/group/281 - 0.6 - - - https://ctc.koogua.com/im/group/282 - 0.6 - - - https://ctc.koogua.com/im/group/283 - 0.6 - - - https://ctc.koogua.com/im/group/284 - 0.6 - - - https://ctc.koogua.com/im/group/285 - 0.6 - - - https://ctc.koogua.com/im/group/286 - 0.6 - - - https://ctc.koogua.com/im/group/287 - 0.6 - - - https://ctc.koogua.com/im/group/288 - 0.6 - - - https://ctc.koogua.com/im/group/289 - 0.6 - - - https://ctc.koogua.com/im/group/290 - 0.6 - - - https://ctc.koogua.com/im/group/291 - 0.6 - - - https://ctc.koogua.com/im/group/292 - 0.6 - - - https://ctc.koogua.com/im/group/293 - 0.6 - - - https://ctc.koogua.com/im/group/294 - 0.6 - - - https://ctc.koogua.com/im/group/295 - 0.6 - - - https://ctc.koogua.com/im/group/296 - 0.6 - - - https://ctc.koogua.com/im/group/297 - 0.6 - - - https://ctc.koogua.com/im/group/298 - 0.6 - - - https://ctc.koogua.com/im/group/299 - 0.6 - - - https://ctc.koogua.com/im/group/300 - 0.6 - - - https://ctc.koogua.com/im/group/301 - 0.6 - - - https://ctc.koogua.com/im/group/302 - 0.6 - - - https://ctc.koogua.com/im/group/303 - 0.6 - - - https://ctc.koogua.com/im/group/304 - 0.6 - - - https://ctc.koogua.com/im/group/305 - 0.6 - - - https://ctc.koogua.com/im/group/306 - 0.6 - - - https://ctc.koogua.com/im/group/307 - 0.6 - - - https://ctc.koogua.com/im/group/308 - 0.6 - - - https://ctc.koogua.com/im/group/309 - 0.6 - - - https://ctc.koogua.com/im/group/310 - 0.6 - - - https://ctc.koogua.com/im/group/311 - 0.6 - - - https://ctc.koogua.com/im/group/312 - 0.6 - - - https://ctc.koogua.com/im/group/313 - 0.6 - - - https://ctc.koogua.com/im/group/314 - 0.6 - - - https://ctc.koogua.com/im/group/315 - 0.6 - - - https://ctc.koogua.com/im/group/316 - 0.6 - - - https://ctc.koogua.com/im/group/317 - 0.6 - - - https://ctc.koogua.com/im/group/318 - 0.6 - - - https://ctc.koogua.com/im/group/319 - 0.6 - - - https://ctc.koogua.com/im/group/320 - 0.6 - - - https://ctc.koogua.com/im/group/321 - 0.6 - - - https://ctc.koogua.com/im/group/322 - 0.6 - - - https://ctc.koogua.com/im/group/323 - 0.6 - - - https://ctc.koogua.com/im/group/324 - 0.6 - - - https://ctc.koogua.com/im/group/325 - 0.6 - - - https://ctc.koogua.com/im/group/326 - 0.6 - - - https://ctc.koogua.com/im/group/327 - 0.6 - - - https://ctc.koogua.com/im/group/328 - 0.6 - - - https://ctc.koogua.com/im/group/329 - 0.6 - - - https://ctc.koogua.com/im/group/330 - 0.6 - - - https://ctc.koogua.com/im/group/331 - 0.6 - - - https://ctc.koogua.com/im/group/332 - 0.6 - - - https://ctc.koogua.com/im/group/333 - 0.6 - - - https://ctc.koogua.com/im/group/334 - 0.6 - - - https://ctc.koogua.com/im/group/335 - 0.6 - - - https://ctc.koogua.com/im/group/336 - 0.6 - - - https://ctc.koogua.com/im/group/337 - 0.6 - - - https://ctc.koogua.com/im/group/338 - 0.6 - - - https://ctc.koogua.com/im/group/339 - 0.6 - - - https://ctc.koogua.com/im/group/340 - 0.6 - - - https://ctc.koogua.com/im/group/341 - 0.6 - - - https://ctc.koogua.com/im/group/342 - 0.6 - - - https://ctc.koogua.com/im/group/343 - 0.6 - - - https://ctc.koogua.com/im/group/344 - 0.6 - - - https://ctc.koogua.com/im/group/345 - 0.6 - - - https://ctc.koogua.com/im/group/346 - 0.6 - - - https://ctc.koogua.com/im/group/347 - 0.6 - - - https://ctc.koogua.com/im/group/348 - 0.6 - - - https://ctc.koogua.com/im/group/349 - 0.6 - - - https://ctc.koogua.com/im/group/350 - 0.6 - - - https://ctc.koogua.com/im/group/351 - 0.6 - - - https://ctc.koogua.com/im/group/352 - 0.6 - - - https://ctc.koogua.com/im/group/353 - 0.6 - - - https://ctc.koogua.com/im/group/354 - 0.6 - - - https://ctc.koogua.com/im/group/355 - 0.6 - - - https://ctc.koogua.com/im/group/356 - 0.6 - - - https://ctc.koogua.com/im/group/357 - 0.6 - - - https://ctc.koogua.com/im/group/358 - 0.6 - - - https://ctc.koogua.com/im/group/359 - 0.6 - - - https://ctc.koogua.com/im/group/360 - 0.6 - - - https://ctc.koogua.com/im/group/361 - 0.6 - - - https://ctc.koogua.com/im/group/362 - 0.6 - - - https://ctc.koogua.com/im/group/363 - 0.6 - - - https://ctc.koogua.com/im/group/364 - 0.6 - - - https://ctc.koogua.com/im/group/365 - 0.6 - - - https://ctc.koogua.com/im/group/366 - 0.6 - - - https://ctc.koogua.com/im/group/367 - 0.6 - - - https://ctc.koogua.com/im/group/368 - 0.6 - - - https://ctc.koogua.com/im/group/369 - 0.6 - - - https://ctc.koogua.com/im/group/370 - 0.6 - - - https://ctc.koogua.com/im/group/371 - 0.6 - - - https://ctc.koogua.com/im/group/372 - 0.6 - - - https://ctc.koogua.com/im/group/373 - 0.6 - - - https://ctc.koogua.com/im/group/374 - 0.6 - - - https://ctc.koogua.com/im/group/375 - 0.6 - - - https://ctc.koogua.com/im/group/376 - 0.6 - - - https://ctc.koogua.com/im/group/377 - 0.6 - - - https://ctc.koogua.com/im/group/378 - 0.6 - - - https://ctc.koogua.com/im/group/379 - 0.6 - - - https://ctc.koogua.com/im/group/380 - 0.6 - - - https://ctc.koogua.com/im/group/381 - 0.6 - - - https://ctc.koogua.com/im/group/382 - 0.6 - - - https://ctc.koogua.com/im/group/383 - 0.6 - - - https://ctc.koogua.com/im/group/384 - 0.6 - - - https://ctc.koogua.com/im/group/385 - 0.6 - - - https://ctc.koogua.com/im/group/386 - 0.6 - - - https://ctc.koogua.com/im/group/387 - 0.6 - - - https://ctc.koogua.com/im/group/388 - 0.6 - - - https://ctc.koogua.com/im/group/389 - 0.6 - - - https://ctc.koogua.com/im/group/390 - 0.6 - - - https://ctc.koogua.com/im/group/391 - 0.6 - - - https://ctc.koogua.com/im/group/392 - 0.6 - - - https://ctc.koogua.com/im/group/393 - 0.6 - - - https://ctc.koogua.com/im/group/394 - 0.6 - - - https://ctc.koogua.com/im/group/395 - 0.6 - - - https://ctc.koogua.com/im/group/396 - 0.6 - - - https://ctc.koogua.com/im/group/397 - 0.6 - - - https://ctc.koogua.com/im/group/398 - 0.6 - - - https://ctc.koogua.com/im/group/399 - 0.6 - - - https://ctc.koogua.com/im/group/400 - 0.6 - - - https://ctc.koogua.com/im/group/401 - 0.6 - - - https://ctc.koogua.com/im/group/402 - 0.6 - - - https://ctc.koogua.com/im/group/403 - 0.6 - - - https://ctc.koogua.com/im/group/404 - 0.6 - - - https://ctc.koogua.com/im/group/405 - 0.6 - - - https://ctc.koogua.com/im/group/406 - 0.6 - - - https://ctc.koogua.com/im/group/407 - 0.6 - - - https://ctc.koogua.com/im/group/408 - 0.6 - - - https://ctc.koogua.com/im/group/409 - 0.6 - - - https://ctc.koogua.com/im/group/410 - 0.6 - - - https://ctc.koogua.com/im/group/411 - 0.6 - - - https://ctc.koogua.com/im/group/412 - 0.6 - - - https://ctc.koogua.com/im/group/413 - 0.6 - - - https://ctc.koogua.com/im/group/414 - 0.6 - - - https://ctc.koogua.com/im/group/415 - 0.6 - - - https://ctc.koogua.com/im/group/416 - 0.6 - - - https://ctc.koogua.com/im/group/417 - 0.6 - - - https://ctc.koogua.com/im/group/418 - 0.6 - - - https://ctc.koogua.com/im/group/419 - 0.6 - - - https://ctc.koogua.com/im/group/420 - 0.6 - - - https://ctc.koogua.com/im/group/421 - 0.6 - - - https://ctc.koogua.com/im/group/422 - 0.6 - - - https://ctc.koogua.com/im/group/423 - 0.6 - - - https://ctc.koogua.com/im/group/424 - 0.6 - - - https://ctc.koogua.com/im/group/425 - 0.6 - - - https://ctc.koogua.com/im/group/426 - 0.6 - - - https://ctc.koogua.com/im/group/427 - 0.6 - - - https://ctc.koogua.com/im/group/428 - 0.6 - - - https://ctc.koogua.com/im/group/429 - 0.6 - - - https://ctc.koogua.com/im/group/430 - 0.6 - - - https://ctc.koogua.com/im/group/431 - 0.6 - - - https://ctc.koogua.com/im/group/432 - 0.6 - - - https://ctc.koogua.com/im/group/433 - 0.6 - - - https://ctc.koogua.com/im/group/434 - 0.6 - - - https://ctc.koogua.com/im/group/435 - 0.6 - - - https://ctc.koogua.com/im/group/436 - 0.6 - - - https://ctc.koogua.com/im/group/437 - 0.6 - - - https://ctc.koogua.com/im/group/438 - 0.6 - - - https://ctc.koogua.com/im/group/439 - 0.6 - - - https://ctc.koogua.com/im/group/440 - 0.6 - - - https://ctc.koogua.com/im/group/441 - 0.6 - - - https://ctc.koogua.com/im/group/442 - 0.6 - - - https://ctc.koogua.com/im/group/443 - 0.6 - - - https://ctc.koogua.com/im/group/444 - 0.6 - - - https://ctc.koogua.com/im/group/445 - 0.6 - - - https://ctc.koogua.com/im/group/446 - 0.6 - - - https://ctc.koogua.com/im/group/447 - 0.6 - - - https://ctc.koogua.com/im/group/448 - 0.6 - - - https://ctc.koogua.com/im/group/449 - 0.6 - - - https://ctc.koogua.com/im/group/450 - 0.6 - - - https://ctc.koogua.com/im/group/451 - 0.6 - - - https://ctc.koogua.com/im/group/452 - 0.6 - - - https://ctc.koogua.com/im/group/453 - 0.6 - - - https://ctc.koogua.com/im/group/454 - 0.6 - - - https://ctc.koogua.com/im/group/455 - 0.6 - - - https://ctc.koogua.com/im/group/456 - 0.6 - - - https://ctc.koogua.com/im/group/457 - 0.6 - - - https://ctc.koogua.com/im/group/458 - 0.6 - - - https://ctc.koogua.com/im/group/459 - 0.6 - - - https://ctc.koogua.com/im/group/460 - 0.6 - - - https://ctc.koogua.com/im/group/461 - 0.6 - - - https://ctc.koogua.com/im/group/462 - 0.6 - - - https://ctc.koogua.com/im/group/463 - 0.6 - - - https://ctc.koogua.com/im/group/464 - 0.6 - - - https://ctc.koogua.com/im/group/465 - 0.6 - - - https://ctc.koogua.com/im/group/466 - 0.6 - - - https://ctc.koogua.com/im/group/467 - 0.6 - - - https://ctc.koogua.com/im/group/468 - 0.6 - - - https://ctc.koogua.com/im/group/469 - 0.6 - - - https://ctc.koogua.com/im/group/470 - 0.6 - - - https://ctc.koogua.com/im/group/471 - 0.6 - - - https://ctc.koogua.com/im/group/472 - 0.6 - - - https://ctc.koogua.com/im/group/473 - 0.6 - - - https://ctc.koogua.com/im/group/474 - 0.6 - - - https://ctc.koogua.com/im/group/475 - 0.6 - - - https://ctc.koogua.com/im/group/476 - 0.6 - - - https://ctc.koogua.com/im/group/477 - 0.6 - - - https://ctc.koogua.com/im/group/478 - 0.6 - - - https://ctc.koogua.com/im/group/479 - 0.6 - - - https://ctc.koogua.com/im/group/480 - 0.6 - - - https://ctc.koogua.com/im/group/481 - 0.6 - - - https://ctc.koogua.com/im/group/482 - 0.6 - - - https://ctc.koogua.com/im/group/483 - 0.6 - - - https://ctc.koogua.com/im/group/484 - 0.6 - - - https://ctc.koogua.com/im/group/485 - 0.6 - - - https://ctc.koogua.com/im/group/486 - 0.6 - - - https://ctc.koogua.com/im/group/487 - 0.6 - - - https://ctc.koogua.com/im/group/488 - 0.6 - - - https://ctc.koogua.com/im/group/489 - 0.6 - - - https://ctc.koogua.com/im/group/490 - 0.6 - - - https://ctc.koogua.com/im/group/491 - 0.6 - - - https://ctc.koogua.com/im/group/492 - 0.6 - - - https://ctc.koogua.com/im/group/493 - 0.6 - - - https://ctc.koogua.com/im/group/494 - 0.6 - - - https://ctc.koogua.com/im/group/495 - 0.6 - - - https://ctc.koogua.com/im/group/496 - 0.6 - - - https://ctc.koogua.com/im/group/497 - 0.6 - - - https://ctc.koogua.com/im/group/498 - 0.6 - - - https://ctc.koogua.com/im/group/499 - 0.6 - - - https://ctc.koogua.com/im/group/500 - 0.6 - - - https://ctc.koogua.com/im/group/501 - 0.6 - - - https://ctc.koogua.com/im/group/502 - 0.6 - - - https://ctc.koogua.com/im/group/503 - 0.6 - - - https://ctc.koogua.com/im/group/504 - 0.6 - - - https://ctc.koogua.com/im/group/505 - 0.6 - - - https://ctc.koogua.com/im/group/506 - 0.6 - - - https://ctc.koogua.com/im/group/507 - 0.6 - - - https://ctc.koogua.com/im/group/508 - 0.6 - - - https://ctc.koogua.com/im/group/509 - 0.6 - - - https://ctc.koogua.com/im/group/510 - 0.6 - - - https://ctc.koogua.com/im/group/511 - 0.6 - - - https://ctc.koogua.com/im/group/512 - 0.6 - - - https://ctc.koogua.com/im/group/513 - 0.6 - - - https://ctc.koogua.com/im/group/514 - 0.6 - - - https://ctc.koogua.com/im/group/515 - 0.6 - - - https://ctc.koogua.com/im/group/516 - 0.6 - - - https://ctc.koogua.com/im/group/517 - 0.6 - - - https://ctc.koogua.com/im/group/518 - 0.6 - - - https://ctc.koogua.com/im/group/519 - 0.6 - - - https://ctc.koogua.com/im/group/520 - 0.6 - - - https://ctc.koogua.com/im/group/521 - 0.6 - - - https://ctc.koogua.com/im/group/522 - 0.6 - - - https://ctc.koogua.com/im/group/523 - 0.6 - - - https://ctc.koogua.com/im/group/524 - 0.6 - - - https://ctc.koogua.com/im/group/525 - 0.6 - - - https://ctc.koogua.com/im/group/526 - 0.6 - - - https://ctc.koogua.com/im/group/527 - 0.6 - - - https://ctc.koogua.com/im/group/528 - 0.6 - - - https://ctc.koogua.com/im/group/529 - 0.6 - - - https://ctc.koogua.com/im/group/530 - 0.6 - - - https://ctc.koogua.com/im/group/531 - 0.6 - - - https://ctc.koogua.com/im/group/532 - 0.6 - - - https://ctc.koogua.com/im/group/533 - 0.6 - - - https://ctc.koogua.com/im/group/534 - 0.6 - - - https://ctc.koogua.com/im/group/535 - 0.6 - - - https://ctc.koogua.com/im/group/536 - 0.6 - - - https://ctc.koogua.com/im/group/537 - 0.6 - - - https://ctc.koogua.com/im/group/538 - 0.6 - - - https://ctc.koogua.com/im/group/539 - 0.6 - - - https://ctc.koogua.com/im/group/540 - 0.6 - - - https://ctc.koogua.com/im/group/541 - 0.6 - - - https://ctc.koogua.com/im/group/542 - 0.6 - - - https://ctc.koogua.com/im/group/543 - 0.6 - - - https://ctc.koogua.com/im/group/544 - 0.6 - - - https://ctc.koogua.com/im/group/545 - 0.6 - - - https://ctc.koogua.com/im/group/546 - 0.6 - - - https://ctc.koogua.com/im/group/547 - 0.6 - - - https://ctc.koogua.com/im/group/548 - 0.6 - - - https://ctc.koogua.com/im/group/549 - 0.6 - - - https://ctc.koogua.com/im/group/550 - 0.6 - - - https://ctc.koogua.com/im/group/551 - 0.6 - - - https://ctc.koogua.com/im/group/552 - 0.6 - - - https://ctc.koogua.com/im/group/553 - 0.6 - - - https://ctc.koogua.com/im/group/554 - 0.6 - - - https://ctc.koogua.com/im/group/555 - 0.6 - - - https://ctc.koogua.com/im/group/556 - 0.6 - - - https://ctc.koogua.com/im/group/557 - 0.6 - - - https://ctc.koogua.com/im/group/558 - 0.6 - - - https://ctc.koogua.com/im/group/559 - 0.6 - - - https://ctc.koogua.com/im/group/560 - 0.6 - - - https://ctc.koogua.com/im/group/561 - 0.6 - - - https://ctc.koogua.com/im/group/562 - 0.6 - - - https://ctc.koogua.com/im/group/563 - 0.6 - - - https://ctc.koogua.com/im/group/564 - 0.6 - - - https://ctc.koogua.com/im/group/565 - 0.6 - - - https://ctc.koogua.com/im/group/566 - 0.6 - - - https://ctc.koogua.com/im/group/567 - 0.6 - - - https://ctc.koogua.com/im/group/568 - 0.6 - - - https://ctc.koogua.com/im/group/569 - 0.6 - - - https://ctc.koogua.com/im/group/570 - 0.6 - - - https://ctc.koogua.com/im/group/571 - 0.6 - - - https://ctc.koogua.com/im/group/572 - 0.6 - - - https://ctc.koogua.com/im/group/573 - 0.6 - - - https://ctc.koogua.com/im/group/574 - 0.6 - - - https://ctc.koogua.com/im/group/575 - 0.6 - - - https://ctc.koogua.com/im/group/576 - 0.6 - - - https://ctc.koogua.com/im/group/577 - 0.6 - - - https://ctc.koogua.com/im/group/578 - 0.6 - - - https://ctc.koogua.com/im/group/579 - 0.6 - - - https://ctc.koogua.com/im/group/580 - 0.6 - - - https://ctc.koogua.com/im/group/581 - 0.6 - - - https://ctc.koogua.com/im/group/582 - 0.6 - - - https://ctc.koogua.com/im/group/583 - 0.6 - - - https://ctc.koogua.com/im/group/584 - 0.6 - - - https://ctc.koogua.com/im/group/585 - 0.6 - - - https://ctc.koogua.com/im/group/586 - 0.6 - - - https://ctc.koogua.com/im/group/587 - 0.6 - - - https://ctc.koogua.com/im/group/588 - 0.6 - - - https://ctc.koogua.com/im/group/589 - 0.6 - - - https://ctc.koogua.com/im/group/590 - 0.6 - - - https://ctc.koogua.com/im/group/591 - 0.6 - - - https://ctc.koogua.com/im/group/592 - 0.6 - - - https://ctc.koogua.com/im/group/593 - 0.6 - - - https://ctc.koogua.com/im/group/594 - 0.6 - - - https://ctc.koogua.com/im/group/595 - 0.6 - - - https://ctc.koogua.com/im/group/596 - 0.6 - - - https://ctc.koogua.com/im/group/597 - 0.6 - - - https://ctc.koogua.com/im/group/598 - 0.6 - - - https://ctc.koogua.com/im/group/599 - 0.6 - - - https://ctc.koogua.com/im/group/600 - 0.6 - - - https://ctc.koogua.com/im/group/601 - 0.6 - - - https://ctc.koogua.com/im/group/602 - 0.6 - - - https://ctc.koogua.com/im/group/603 - 0.6 - - - https://ctc.koogua.com/im/group/604 - 0.6 - - - https://ctc.koogua.com/im/group/605 - 0.6 - - - https://ctc.koogua.com/im/group/606 - 0.6 - - - https://ctc.koogua.com/im/group/607 - 0.6 - - - https://ctc.koogua.com/im/group/608 - 0.6 - - - https://ctc.koogua.com/im/group/609 - 0.6 - - - https://ctc.koogua.com/im/group/610 - 0.6 - - - https://ctc.koogua.com/im/group/611 - 0.6 - - - https://ctc.koogua.com/im/group/612 - 0.6 - - - https://ctc.koogua.com/im/group/613 - 0.6 - - - https://ctc.koogua.com/im/group/614 - 0.6 - - - https://ctc.koogua.com/im/group/615 - 0.6 - - - https://ctc.koogua.com/im/group/616 - 0.6 - - - https://ctc.koogua.com/im/group/617 - 0.6 - - - https://ctc.koogua.com/im/group/618 - 0.6 - - - https://ctc.koogua.com/im/group/619 - 0.6 - - - https://ctc.koogua.com/im/group/620 - 0.6 - - - https://ctc.koogua.com/im/group/621 - 0.6 - - - https://ctc.koogua.com/im/group/622 - 0.6 - - - https://ctc.koogua.com/im/group/623 - 0.6 - - - https://ctc.koogua.com/im/group/624 - 0.6 - - - https://ctc.koogua.com/im/group/625 - 0.6 - - - https://ctc.koogua.com/im/group/626 - 0.6 - - - https://ctc.koogua.com/im/group/627 - 0.6 - - - https://ctc.koogua.com/im/group/628 - 0.6 - - - https://ctc.koogua.com/im/group/629 - 0.6 - - - https://ctc.koogua.com/im/group/630 - 0.6 - - - https://ctc.koogua.com/im/group/631 - 0.6 - - - https://ctc.koogua.com/im/group/632 - 0.6 - - - https://ctc.koogua.com/im/group/633 - 0.6 - - - https://ctc.koogua.com/im/group/634 - 0.6 - - - https://ctc.koogua.com/im/group/635 - 0.6 - - - https://ctc.koogua.com/im/group/636 - 0.6 - - - https://ctc.koogua.com/im/group/637 - 0.6 - - - https://ctc.koogua.com/im/group/638 - 0.6 - - - https://ctc.koogua.com/im/group/639 - 0.6 - - - https://ctc.koogua.com/im/group/640 - 0.6 - - - https://ctc.koogua.com/im/group/641 - 0.6 - - - https://ctc.koogua.com/im/group/642 - 0.6 - - - https://ctc.koogua.com/im/group/643 - 0.6 - - - https://ctc.koogua.com/im/group/644 - 0.6 - - - https://ctc.koogua.com/im/group/645 - 0.6 - - - https://ctc.koogua.com/im/group/646 - 0.6 - - - https://ctc.koogua.com/im/group/647 - 0.6 - - - https://ctc.koogua.com/im/group/648 - 0.6 - - - https://ctc.koogua.com/im/group/649 - 0.6 - - - https://ctc.koogua.com/im/group/650 - 0.6 - - - https://ctc.koogua.com/im/group/651 - 0.6 - - - https://ctc.koogua.com/im/group/652 - 0.6 - - - https://ctc.koogua.com/im/group/653 - 0.6 - - - https://ctc.koogua.com/im/group/654 - 0.6 - - - https://ctc.koogua.com/im/group/655 - 0.6 - - - https://ctc.koogua.com/im/group/656 - 0.6 - - - https://ctc.koogua.com/im/group/657 - 0.6 - - - https://ctc.koogua.com/im/group/658 - 0.6 - - - https://ctc.koogua.com/im/group/659 - 0.6 - - - https://ctc.koogua.com/im/group/660 - 0.6 - - - https://ctc.koogua.com/im/group/661 - 0.6 - - - https://ctc.koogua.com/im/group/662 - 0.6 - - - https://ctc.koogua.com/im/group/663 - 0.6 - - - https://ctc.koogua.com/im/group/664 - 0.6 - - - https://ctc.koogua.com/im/group/665 - 0.6 - - - https://ctc.koogua.com/im/group/666 - 0.6 - - - https://ctc.koogua.com/im/group/667 - 0.6 - - - https://ctc.koogua.com/im/group/668 - 0.6 - - - https://ctc.koogua.com/im/group/669 - 0.6 - - - https://ctc.koogua.com/im/group/670 - 0.6 - - - https://ctc.koogua.com/im/group/671 - 0.6 - - - https://ctc.koogua.com/im/group/672 - 0.6 - - - https://ctc.koogua.com/im/group/673 - 0.6 - - - https://ctc.koogua.com/im/group/674 - 0.6 - - - https://ctc.koogua.com/im/group/675 - 0.6 - - - https://ctc.koogua.com/im/group/676 - 0.6 - - - https://ctc.koogua.com/im/group/677 - 0.6 - - - https://ctc.koogua.com/im/group/678 - 0.6 - - - https://ctc.koogua.com/im/group/679 - 0.6 - - - https://ctc.koogua.com/im/group/680 - 0.6 - - - https://ctc.koogua.com/im/group/681 - 0.6 - - - https://ctc.koogua.com/im/group/682 - 0.6 - - - https://ctc.koogua.com/im/group/683 - 0.6 - - - https://ctc.koogua.com/im/group/684 - 0.6 - - - https://ctc.koogua.com/im/group/685 - 0.6 - - - https://ctc.koogua.com/im/group/686 - 0.6 - - - https://ctc.koogua.com/im/group/687 - 0.6 - - - https://ctc.koogua.com/im/group/688 - 0.6 - - - https://ctc.koogua.com/im/group/689 - 0.6 - - - https://ctc.koogua.com/im/group/690 - 0.6 - - - https://ctc.koogua.com/im/group/691 - 0.6 - - - https://ctc.koogua.com/im/group/692 - 0.6 - - - https://ctc.koogua.com/im/group/693 - 0.6 - - - https://ctc.koogua.com/im/group/694 - 0.6 - - - https://ctc.koogua.com/im/group/695 - 0.6 - - - https://ctc.koogua.com/im/group/696 - 0.6 - - - https://ctc.koogua.com/im/group/697 - 0.6 - - - https://ctc.koogua.com/im/group/698 - 0.6 - - - https://ctc.koogua.com/im/group/699 - 0.6 - - - https://ctc.koogua.com/im/group/700 - 0.6 - - - https://ctc.koogua.com/im/group/701 - 0.6 - - - https://ctc.koogua.com/im/group/702 - 0.6 - - - https://ctc.koogua.com/im/group/703 - 0.6 - - - https://ctc.koogua.com/im/group/704 - 0.6 - - - https://ctc.koogua.com/im/group/705 - 0.6 - - - https://ctc.koogua.com/im/group/706 - 0.6 - - - https://ctc.koogua.com/im/group/707 - 0.6 - - - https://ctc.koogua.com/im/group/708 - 0.6 - - - https://ctc.koogua.com/im/group/709 - 0.6 - - - https://ctc.koogua.com/im/group/710 - 0.6 - - - https://ctc.koogua.com/im/group/711 - 0.6 - - - https://ctc.koogua.com/im/group/712 - 0.6 - - - https://ctc.koogua.com/im/group/713 - 0.6 - - - https://ctc.koogua.com/im/group/714 - 0.6 - - - https://ctc.koogua.com/im/group/715 - 0.6 - - - https://ctc.koogua.com/im/group/716 - 0.6 - - - https://ctc.koogua.com/im/group/717 - 0.6 - - - https://ctc.koogua.com/im/group/718 - 0.6 - - - https://ctc.koogua.com/im/group/719 - 0.6 - - - https://ctc.koogua.com/im/group/720 - 0.6 - - - https://ctc.koogua.com/im/group/721 - 0.6 - - - https://ctc.koogua.com/im/group/722 - 0.6 - - - https://ctc.koogua.com/im/group/723 - 0.6 - - - https://ctc.koogua.com/im/group/724 - 0.6 - - - https://ctc.koogua.com/im/group/725 - 0.6 - - - https://ctc.koogua.com/im/group/726 - 0.6 - - - https://ctc.koogua.com/im/group/727 - 0.6 - - - https://ctc.koogua.com/im/group/728 - 0.6 - - - https://ctc.koogua.com/im/group/729 - 0.6 - - - https://ctc.koogua.com/im/group/730 - 0.6 - - - https://ctc.koogua.com/im/group/731 - 0.6 - - - https://ctc.koogua.com/im/group/732 - 0.6 - - - https://ctc.koogua.com/im/group/733 - 0.6 - - - https://ctc.koogua.com/im/group/734 - 0.6 - - - https://ctc.koogua.com/im/group/735 - 0.6 - - - https://ctc.koogua.com/im/group/736 - 0.6 - - - https://ctc.koogua.com/im/group/737 - 0.6 - - - https://ctc.koogua.com/im/group/738 - 0.6 - - - https://ctc.koogua.com/im/group/739 - 0.6 - - - https://ctc.koogua.com/im/group/740 - 0.6 - - - https://ctc.koogua.com/im/group/741 - 0.6 - - - https://ctc.koogua.com/im/group/742 - 0.6 - - - https://ctc.koogua.com/im/group/743 - 0.6 - - - https://ctc.koogua.com/im/group/744 - 0.6 - - - https://ctc.koogua.com/im/group/745 - 0.6 - - - https://ctc.koogua.com/im/group/746 - 0.6 - - - https://ctc.koogua.com/im/group/747 - 0.6 - - - https://ctc.koogua.com/im/group/748 - 0.6 - - - https://ctc.koogua.com/im/group/749 - 0.6 - - - https://ctc.koogua.com/im/group/750 - 0.6 - - - https://ctc.koogua.com/im/group/751 - 0.6 - - - https://ctc.koogua.com/im/group/752 - 0.6 - - - https://ctc.koogua.com/im/group/753 - 0.6 - - - https://ctc.koogua.com/im/group/754 - 0.6 - - - https://ctc.koogua.com/im/group/755 - 0.6 - - - https://ctc.koogua.com/im/group/756 - 0.6 - - - https://ctc.koogua.com/im/group/757 - 0.6 - - - https://ctc.koogua.com/im/group/758 - 0.6 - - - https://ctc.koogua.com/im/group/759 - 0.6 - - - https://ctc.koogua.com/im/group/760 - 0.6 - - - https://ctc.koogua.com/im/group/761 - 0.6 - - - https://ctc.koogua.com/im/group/762 - 0.6 - - - https://ctc.koogua.com/im/group/763 - 0.6 - - - https://ctc.koogua.com/im/group/764 - 0.6 - - - https://ctc.koogua.com/im/group/765 - 0.6 - - - https://ctc.koogua.com/im/group/766 - 0.6 - - - https://ctc.koogua.com/im/group/767 - 0.6 - - - https://ctc.koogua.com/im/group/768 - 0.6 - - - https://ctc.koogua.com/im/group/769 - 0.6 - - - https://ctc.koogua.com/im/group/770 - 0.6 - - - https://ctc.koogua.com/im/group/771 - 0.6 - - - https://ctc.koogua.com/im/group/772 - 0.6 - - - https://ctc.koogua.com/im/group/773 - 0.6 - - - https://ctc.koogua.com/im/group/774 - 0.6 - - - https://ctc.koogua.com/im/group/775 - 0.6 - - - https://ctc.koogua.com/im/group/776 - 0.6 - - - https://ctc.koogua.com/im/group/777 - 0.6 - - - https://ctc.koogua.com/im/group/778 - 0.6 - - - https://ctc.koogua.com/im/group/779 - 0.6 - - - https://ctc.koogua.com/im/group/780 - 0.6 - - - https://ctc.koogua.com/im/group/781 - 0.6 - - - https://ctc.koogua.com/im/group/782 - 0.6 - - - https://ctc.koogua.com/im/group/783 - 0.6 - - - https://ctc.koogua.com/im/group/784 - 0.6 - - - https://ctc.koogua.com/im/group/785 - 0.6 - - - https://ctc.koogua.com/im/group/786 - 0.6 - - - https://ctc.koogua.com/im/group/787 - 0.6 - - - https://ctc.koogua.com/im/group/788 - 0.6 - - - https://ctc.koogua.com/im/group/789 - 0.6 - - - https://ctc.koogua.com/im/group/790 - 0.6 - - - https://ctc.koogua.com/im/group/791 - 0.6 - - - https://ctc.koogua.com/im/group/792 - 0.6 - - - https://ctc.koogua.com/im/group/793 - 0.6 - - - https://ctc.koogua.com/im/group/794 - 0.6 - - - https://ctc.koogua.com/im/group/795 - 0.6 - - - https://ctc.koogua.com/im/group/796 - 0.6 - - - https://ctc.koogua.com/im/group/797 - 0.6 - - - https://ctc.koogua.com/im/group/798 - 0.6 - - - https://ctc.koogua.com/im/group/799 - 0.6 - - - https://ctc.koogua.com/im/group/800 - 0.6 - - - https://ctc.koogua.com/im/group/801 - 0.6 - - - https://ctc.koogua.com/im/group/802 - 0.6 - - - https://ctc.koogua.com/im/group/803 - 0.6 - - - https://ctc.koogua.com/im/group/804 - 0.6 - - - https://ctc.koogua.com/im/group/805 - 0.6 - - - https://ctc.koogua.com/im/group/806 - 0.6 - - - https://ctc.koogua.com/im/group/807 - 0.6 - - - https://ctc.koogua.com/im/group/808 - 0.6 - - - https://ctc.koogua.com/im/group/809 - 0.6 - - - https://ctc.koogua.com/im/group/810 - 0.6 - - - https://ctc.koogua.com/im/group/811 - 0.6 - - - https://ctc.koogua.com/im/group/812 - 0.6 - - - https://ctc.koogua.com/im/group/813 - 0.6 - - - https://ctc.koogua.com/im/group/814 - 0.6 - - - https://ctc.koogua.com/im/group/815 - 0.6 - - - https://ctc.koogua.com/im/group/816 - 0.6 - - - https://ctc.koogua.com/im/group/817 - 0.6 - - - https://ctc.koogua.com/im/group/818 - 0.6 - - - https://ctc.koogua.com/im/group/819 - 0.6 - - - https://ctc.koogua.com/im/group/820 - 0.6 - - - https://ctc.koogua.com/im/group/821 - 0.6 - - - https://ctc.koogua.com/im/group/822 - 0.6 - - - https://ctc.koogua.com/im/group/823 - 0.6 - - - https://ctc.koogua.com/im/group/824 - 0.6 - - - https://ctc.koogua.com/im/group/825 - 0.6 - - - https://ctc.koogua.com/im/group/826 - 0.6 - - - https://ctc.koogua.com/im/group/827 - 0.6 - - - https://ctc.koogua.com/im/group/828 - 0.6 - - - https://ctc.koogua.com/im/group/829 - 0.6 - - - https://ctc.koogua.com/im/group/830 - 0.6 - - - https://ctc.koogua.com/im/group/831 - 0.6 - - - https://ctc.koogua.com/im/group/832 - 0.6 - - - https://ctc.koogua.com/im/group/833 - 0.6 - - - https://ctc.koogua.com/im/group/834 - 0.6 - - - https://ctc.koogua.com/im/group/835 - 0.6 - - - https://ctc.koogua.com/im/group/836 - 0.6 - - - https://ctc.koogua.com/im/group/837 - 0.6 - - - https://ctc.koogua.com/im/group/838 - 0.6 - - - https://ctc.koogua.com/im/group/839 - 0.6 - - - https://ctc.koogua.com/im/group/840 - 0.6 - - - https://ctc.koogua.com/im/group/841 - 0.6 - - - https://ctc.koogua.com/im/group/842 - 0.6 - - - https://ctc.koogua.com/im/group/843 - 0.6 - - - https://ctc.koogua.com/im/group/844 - 0.6 - - - https://ctc.koogua.com/im/group/845 - 0.6 - - - https://ctc.koogua.com/im/group/846 - 0.6 - - - https://ctc.koogua.com/im/group/847 - 0.6 - - - https://ctc.koogua.com/im/group/848 - 0.6 - - - https://ctc.koogua.com/im/group/849 - 0.6 - - - https://ctc.koogua.com/im/group/850 - 0.6 - - - https://ctc.koogua.com/im/group/851 - 0.6 - - - https://ctc.koogua.com/im/group/852 - 0.6 - - - https://ctc.koogua.com/im/group/853 - 0.6 - - - https://ctc.koogua.com/im/group/854 - 0.6 - - - https://ctc.koogua.com/im/group/855 - 0.6 - - - https://ctc.koogua.com/im/group/856 - 0.6 - - - https://ctc.koogua.com/im/group/857 - 0.6 - - - https://ctc.koogua.com/im/group/858 - 0.6 - - - https://ctc.koogua.com/im/group/859 - 0.6 - - - https://ctc.koogua.com/im/group/860 - 0.6 - - - https://ctc.koogua.com/im/group/861 - 0.6 - - - https://ctc.koogua.com/im/group/862 - 0.6 - - - https://ctc.koogua.com/im/group/863 - 0.6 - - - https://ctc.koogua.com/im/group/864 - 0.6 - - - https://ctc.koogua.com/im/group/865 - 0.6 - - - https://ctc.koogua.com/im/group/866 - 0.6 - - - https://ctc.koogua.com/im/group/867 - 0.6 - - - https://ctc.koogua.com/im/group/868 - 0.6 - - - https://ctc.koogua.com/im/group/869 - 0.6 - - - https://ctc.koogua.com/im/group/870 - 0.6 - - - https://ctc.koogua.com/im/group/871 - 0.6 - - - https://ctc.koogua.com/im/group/872 - 0.6 - - - https://ctc.koogua.com/im/group/873 - 0.6 - - - https://ctc.koogua.com/im/group/874 - 0.6 - - - https://ctc.koogua.com/im/group/875 - 0.6 - - - https://ctc.koogua.com/im/group/876 - 0.6 - - - https://ctc.koogua.com/im/group/877 - 0.6 - - - https://ctc.koogua.com/im/group/878 - 0.6 - - - https://ctc.koogua.com/im/group/879 - 0.6 - - - https://ctc.koogua.com/im/group/880 - 0.6 - - - https://ctc.koogua.com/im/group/881 - 0.6 - - - https://ctc.koogua.com/im/group/882 - 0.6 - - - https://ctc.koogua.com/im/group/883 - 0.6 - - - https://ctc.koogua.com/im/group/884 - 0.6 - - - https://ctc.koogua.com/im/group/885 - 0.6 - - - https://ctc.koogua.com/im/group/886 - 0.6 - - - https://ctc.koogua.com/im/group/887 - 0.6 - - - https://ctc.koogua.com/im/group/888 - 0.6 - - - https://ctc.koogua.com/im/group/889 - 0.6 - - - https://ctc.koogua.com/im/group/890 - 0.6 - - - https://ctc.koogua.com/im/group/891 - 0.6 - - - https://ctc.koogua.com/im/group/892 - 0.6 - - - https://ctc.koogua.com/im/group/893 - 0.6 - - - https://ctc.koogua.com/im/group/894 - 0.6 - - - https://ctc.koogua.com/im/group/895 - 0.6 - - - https://ctc.koogua.com/im/group/896 - 0.6 - - - https://ctc.koogua.com/im/group/897 - 0.6 - - - https://ctc.koogua.com/im/group/898 - 0.6 - - - https://ctc.koogua.com/im/group/899 - 0.6 - - - https://ctc.koogua.com/im/group/900 - 0.6 - - - https://ctc.koogua.com/im/group/901 - 0.6 - - - https://ctc.koogua.com/im/group/902 - 0.6 - - - https://ctc.koogua.com/im/group/903 - 0.6 - - - https://ctc.koogua.com/im/group/904 - 0.6 - - - https://ctc.koogua.com/im/group/905 - 0.6 - - - https://ctc.koogua.com/im/group/906 - 0.6 - - - https://ctc.koogua.com/im/group/907 - 0.6 - - - https://ctc.koogua.com/im/group/908 - 0.6 - - - https://ctc.koogua.com/im/group/909 - 0.6 - - - https://ctc.koogua.com/im/group/910 - 0.6 - - - https://ctc.koogua.com/im/group/911 - 0.6 - - - https://ctc.koogua.com/im/group/912 - 0.6 - - - https://ctc.koogua.com/im/group/913 - 0.6 - - - https://ctc.koogua.com/im/group/914 - 0.6 - - - https://ctc.koogua.com/im/group/915 - 0.6 - - - https://ctc.koogua.com/im/group/916 - 0.6 - - - https://ctc.koogua.com/im/group/917 - 0.6 - - - https://ctc.koogua.com/im/group/918 - 0.6 - - - https://ctc.koogua.com/im/group/919 - 0.6 - - - https://ctc.koogua.com/im/group/920 - 0.6 - - - https://ctc.koogua.com/im/group/921 - 0.6 - - - https://ctc.koogua.com/im/group/922 - 0.6 - - - https://ctc.koogua.com/im/group/923 - 0.6 - - - https://ctc.koogua.com/im/group/924 - 0.6 - - - https://ctc.koogua.com/im/group/925 - 0.6 - - - https://ctc.koogua.com/im/group/926 - 0.6 - - - https://ctc.koogua.com/im/group/927 - 0.6 - - - https://ctc.koogua.com/im/group/928 - 0.6 - - - https://ctc.koogua.com/im/group/929 - 0.6 - - - https://ctc.koogua.com/im/group/930 - 0.6 - - - https://ctc.koogua.com/im/group/931 - 0.6 - - - https://ctc.koogua.com/im/group/932 - 0.6 - - - https://ctc.koogua.com/im/group/933 - 0.6 - - - https://ctc.koogua.com/im/group/934 - 0.6 - - - https://ctc.koogua.com/im/group/935 - 0.6 - - - https://ctc.koogua.com/im/group/936 - 0.6 - - - https://ctc.koogua.com/im/group/937 - 0.6 - - - https://ctc.koogua.com/im/group/938 - 0.6 - - - https://ctc.koogua.com/im/group/939 - 0.6 - - - https://ctc.koogua.com/im/group/940 - 0.6 - - - https://ctc.koogua.com/im/group/941 - 0.6 - - - https://ctc.koogua.com/im/group/942 - 0.6 - - - https://ctc.koogua.com/im/group/943 - 0.6 - - - https://ctc.koogua.com/im/group/944 - 0.6 - - - https://ctc.koogua.com/im/group/945 - 0.6 - - - https://ctc.koogua.com/im/group/946 - 0.6 - - - https://ctc.koogua.com/im/group/947 - 0.6 - - - https://ctc.koogua.com/im/group/948 - 0.6 - - - https://ctc.koogua.com/im/group/949 - 0.6 - - - https://ctc.koogua.com/im/group/950 - 0.6 - - - https://ctc.koogua.com/im/group/951 - 0.6 - - - https://ctc.koogua.com/im/group/952 - 0.6 - - - https://ctc.koogua.com/im/group/953 - 0.6 - - - https://ctc.koogua.com/im/group/954 - 0.6 - - - https://ctc.koogua.com/im/group/955 - 0.6 - - - https://ctc.koogua.com/im/group/956 - 0.6 - - - https://ctc.koogua.com/im/group/957 - 0.6 - - - https://ctc.koogua.com/im/group/958 - 0.6 - - - https://ctc.koogua.com/im/group/959 - 0.6 - - - https://ctc.koogua.com/im/group/960 - 0.6 - - - https://ctc.koogua.com/im/group/961 - 0.6 - - - https://ctc.koogua.com/im/group/962 - 0.6 - - - https://ctc.koogua.com/im/group/963 - 0.6 - - - https://ctc.koogua.com/im/group/964 - 0.6 - - - https://ctc.koogua.com/im/group/965 - 0.6 - - - https://ctc.koogua.com/im/group/966 - 0.6 - - - https://ctc.koogua.com/im/group/967 - 0.6 - - - https://ctc.koogua.com/im/group/968 - 0.6 - - - https://ctc.koogua.com/im/group/969 - 0.6 - - - https://ctc.koogua.com/im/group/970 - 0.6 - - - https://ctc.koogua.com/im/group/971 - 0.6 - - - https://ctc.koogua.com/im/group/972 - 0.6 - - - https://ctc.koogua.com/im/group/973 - 0.6 - - - https://ctc.koogua.com/im/group/974 - 0.6 - - - https://ctc.koogua.com/im/group/975 - 0.6 - - - https://ctc.koogua.com/im/group/976 - 0.6 - - - https://ctc.koogua.com/im/group/977 - 0.6 - - - https://ctc.koogua.com/im/group/978 - 0.6 - - - https://ctc.koogua.com/im/group/979 - 0.6 - - - https://ctc.koogua.com/im/group/980 - 0.6 - - - https://ctc.koogua.com/im/group/981 - 0.6 - - - https://ctc.koogua.com/im/group/982 - 0.6 - - - https://ctc.koogua.com/im/group/983 - 0.6 - - - https://ctc.koogua.com/im/group/984 - 0.6 - - - https://ctc.koogua.com/im/group/985 - 0.6 - - - https://ctc.koogua.com/im/group/986 - 0.6 - - - https://ctc.koogua.com/im/group/987 - 0.6 - - - https://ctc.koogua.com/im/group/988 - 0.6 - - - https://ctc.koogua.com/im/group/989 - 0.6 - - - https://ctc.koogua.com/im/group/990 - 0.6 - - - https://ctc.koogua.com/im/group/991 - 0.6 - - - https://ctc.koogua.com/im/group/992 - 0.6 - - - https://ctc.koogua.com/im/group/993 - 0.6 - - - https://ctc.koogua.com/im/group/994 - 0.6 - - - https://ctc.koogua.com/im/group/995 - 0.6 - - - https://ctc.koogua.com/im/group/996 - 0.6 - - - https://ctc.koogua.com/im/group/997 - 0.6 - - - https://ctc.koogua.com/im/group/998 - 0.6 - - - https://ctc.koogua.com/im/group/999 - 0.6 - - - https://ctc.koogua.com/im/group/1000 - 0.6 - - - https://ctc.koogua.com/im/group/1001 - 0.6 - - - https://ctc.koogua.com/im/group/1002 - 0.6 - - - https://ctc.koogua.com/im/group/1003 - 0.6 - - - https://ctc.koogua.com/im/group/1004 - 0.6 - - - https://ctc.koogua.com/im/group/1005 - 0.6 - - - https://ctc.koogua.com/im/group/1006 - 0.6 - - - https://ctc.koogua.com/im/group/1007 - 0.6 - - - https://ctc.koogua.com/im/group/1008 - 0.6 - - - https://ctc.koogua.com/im/group/1009 - 0.6 - - - https://ctc.koogua.com/im/group/1010 - 0.6 - - - https://ctc.koogua.com/im/group/1011 - 0.6 - - - https://ctc.koogua.com/im/group/1012 - 0.6 - - - https://ctc.koogua.com/im/group/1013 - 0.6 - - - https://ctc.koogua.com/im/group/1014 - 0.6 - - - https://ctc.koogua.com/im/group/1015 - 0.6 - - - https://ctc.koogua.com/im/group/1016 - 0.6 - - - https://ctc.koogua.com/im/group/1017 - 0.6 - - - https://ctc.koogua.com/im/group/1018 - 0.6 - - - https://ctc.koogua.com/im/group/1019 - 0.6 - - - https://ctc.koogua.com/im/group/1020 - 0.6 - - - https://ctc.koogua.com/im/group/1021 - 0.6 - - - https://ctc.koogua.com/im/group/1022 - 0.6 - - - https://ctc.koogua.com/im/group/1023 - 0.6 - - - https://ctc.koogua.com/im/group/1024 - 0.6 - - - https://ctc.koogua.com/im/group/1025 - 0.6 - - - https://ctc.koogua.com/im/group/1026 - 0.6 - - - https://ctc.koogua.com/im/group/1027 - 0.6 - - - https://ctc.koogua.com/im/group/1028 - 0.6 - - - https://ctc.koogua.com/im/group/1029 - 0.6 - - - https://ctc.koogua.com/im/group/1030 - 0.6 - - - https://ctc.koogua.com/im/group/1031 - 0.6 - - - https://ctc.koogua.com/im/group/1032 - 0.6 - - - https://ctc.koogua.com/im/group/1033 - 0.6 - - - https://ctc.koogua.com/im/group/1034 - 0.6 - - - https://ctc.koogua.com/im/group/1035 - 0.6 - - - https://ctc.koogua.com/im/group/1036 - 0.6 - - - https://ctc.koogua.com/im/group/1037 - 0.6 - - - https://ctc.koogua.com/im/group/1038 - 0.6 - - - https://ctc.koogua.com/im/group/1039 - 0.6 - - - https://ctc.koogua.com/im/group/1040 - 0.6 - - - https://ctc.koogua.com/im/group/1041 - 0.6 - - - https://ctc.koogua.com/im/group/1042 - 0.6 - - - https://ctc.koogua.com/im/group/1043 - 0.6 - - - https://ctc.koogua.com/im/group/1044 - 0.6 - - - https://ctc.koogua.com/im/group/1045 - 0.6 - - - https://ctc.koogua.com/im/group/1046 - 0.6 - - - https://ctc.koogua.com/help/1 - 0.7 - - - https://ctc.koogua.com/help/2 - 0.7 - - - https://ctc.koogua.com/help/3 - 0.7 - - - https://ctc.koogua.com/help/4 - 0.7 - - - https://ctc.koogua.com/help/5 - 0.7 - - - https://ctc.koogua.com/help/6 - 0.7 - - - https://ctc.koogua.com/help/7 - 0.7 - - - https://ctc.koogua.com/help/8 - 0.7 - - - https://ctc.koogua.com/page/1 - 0.7 - - - https://ctc.koogua.com/page/2 - 0.7 - - - https://ctc.koogua.com/page/3 - 0.7 - - - https://ctc.koogua.com/page/4 - 0.7 - - - https://ctc.koogua.com/page/5 - 0.7 - - - https://ctc.koogua.com/page/6 - 0.7 - - - https://ctc.koogua.com/page/7 - 0.7 - - - https://ctc.koogua.com/page/8 - 0.7 - - - /course/list - 0.6 - - - /im/group/list - 0.6 - - - /teacher/list - 0.6 - - - /vip - 0.6 - - - /help - 0.6 - - - /search - 0.6 - - -- Gitee From 0642d430ffff6f7964b66d1884a89f597161881f Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sun, 27 Dec 2020 17:55:27 +0800 Subject: [PATCH 18/89] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E6=8E=A8=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Caches/IndexFeaturedCourseList.php | 118 ++++++++++++++++++ app/Caches/IndexSimpleFeaturedCourseList.php | 70 +++++++++++ app/Http/Admin/Services/Course.php | 4 + app/Http/Admin/Views/course/list.volt | 44 +++++++ app/Http/Admin/Views/course/search.volt | 7 ++ app/Http/Api/Controllers/IndexController.php | 13 ++ app/Http/Home/Controllers/IndexController.php | 2 + app/Http/Home/Services/Index.php | 18 +++ app/Http/Home/Views/index/full.volt | 7 ++ app/Http/Home/Views/index/simple.volt | 7 ++ app/Models/Course.php | 8 ++ app/Repos/Course.php | 6 + app/Validators/Course.php | 9 ++ config/errors.php | 1 + .../20201227081614_schema_202012271615.php | 21 ++++ 15 files changed, 335 insertions(+) create mode 100644 app/Caches/IndexFeaturedCourseList.php create mode 100644 app/Caches/IndexSimpleFeaturedCourseList.php create mode 100644 db/migrations/20201227081614_schema_202012271615.php diff --git a/app/Caches/IndexFeaturedCourseList.php b/app/Caches/IndexFeaturedCourseList.php new file mode 100644 index 00000000..3f84919f --- /dev/null +++ b/app/Caches/IndexFeaturedCourseList.php @@ -0,0 +1,118 @@ +lifetime; + } + + public function getKey($id = null) + { + return 'index_featured_course_list'; + } + + public function getContent($id = null) + { + $categoryLimit = 5; + + $courseLimit = 8; + + $categories = $this->findCategories($categoryLimit); + + if ($categories->count() == 0) { + return []; + } + + $result = []; + + foreach ($categories as $category) { + + $item = []; + + $item['category'] = [ + 'id' => $category->id, + 'name' => $category->name, + ]; + + $item['courses'] = []; + + $courses = $this->findCategoryCourses($category->id, $courseLimit); + + if ($courses->count() == 0) { + continue; + } + + $categoryCourses = []; + + foreach ($courses as $course) { + $categoryCourses[] = [ + 'id' => $course->id, + 'title' => $course->title, + 'cover' => $course->cover, + 'market_price' => $course->market_price, + 'vip_price' => $course->vip_price, + 'model' => $course->model, + 'level' => $course->level, + 'user_count' => $course->user_count, + 'lesson_count' => $course->lesson_count, + ]; + } + + $item['courses'] = $categoryCourses; + + $result[] = $item; + } + + return $result; + } + + /** + * @param int $limit + * @return ResultsetInterface|Resultset|CategoryModel[] + */ + protected function findCategories($limit = 5) + { + return CategoryModel::query() + ->where('type = :type:', ['type' => CategoryModel::TYPE_COURSE]) + ->andWhere('level = 1 AND published = 1') + ->orderBy('priority ASC') + ->limit($limit) + ->execute(); + } + + /** + * @param int $categoryId + * @param int $limit + * @return ResultsetInterface|Resultset|CourseModel[] + */ + protected function findCategoryCourses($categoryId, $limit = 8) + { + $categoryService = new CategoryService(); + + $categoryIds = $categoryService->getChildCategoryIds($categoryId); + + return CourseModel::query() + ->inWhere('category_id', $categoryIds) + ->andWhere('published = 1') + ->andWhere('featured = 1') + ->orderBy('id DESC') + ->limit($limit) + ->execute(); + } + +} diff --git a/app/Caches/IndexSimpleFeaturedCourseList.php b/app/Caches/IndexSimpleFeaturedCourseList.php new file mode 100644 index 00000000..c7201cc7 --- /dev/null +++ b/app/Caches/IndexSimpleFeaturedCourseList.php @@ -0,0 +1,70 @@ +lifetime; + } + + public function getKey($id = null) + { + return 'index_simple_featured_course_list'; + } + + public function getContent($id = null) + { + $limit = 8; + + $courses = $this->findCourses($limit); + + if ($courses->count() == 0) { + return []; + } + + $result = []; + + foreach ($courses as $course) { + $result[] = [ + 'id' => $course->id, + 'title' => $course->title, + 'cover' => $course->cover, + 'market_price' => $course->market_price, + 'vip_price' => $course->vip_price, + 'model' => $course->model, + 'level' => $course->level, + 'user_count' => $course->user_count, + 'lesson_count' => $course->lesson_count, + ]; + } + + return $result; + } + + /** + * @param int $limit + * @return ResultsetInterface|Resultset|CourseModel[] + */ + protected function findCourses($limit = 8) + { + return CourseModel::query() + ->where('published = 1') + ->andWhere('featured = 1') + ->orderBy('id DESC') + ->limit($limit) + ->execute(); + } + +} diff --git a/app/Http/Admin/Services/Course.php b/app/Http/Admin/Services/Course.php index 10eaf27e..94525b17 100644 --- a/app/Http/Admin/Services/Course.php +++ b/app/Http/Admin/Services/Course.php @@ -172,6 +172,10 @@ class Course extends Service } } + if (isset($post['featured'])) { + $data['featured'] = $validator->checkFeatureStatus($post['featured']); + } + if (isset($post['published'])) { $data['published'] = $validator->checkPublishStatus($post['published']); if ($post['published'] == 1) { diff --git a/app/Http/Admin/Views/course/list.volt b/app/Http/Admin/Views/course/list.volt index b4ed45a7..4a2a84ce 100644 --- a/app/Http/Admin/Views/course/list.volt +++ b/app/Http/Admin/Views/course/list.volt @@ -59,6 +59,7 @@ + @@ -67,6 +68,7 @@ 课时数 用户数 价格 + 推荐 发布 操作 @@ -101,6 +103,7 @@

市场:{{ '¥%0.2f'|format(item.market_price) }}

会员:{{ '¥%0.2f'|format(item.vip_price) }}

+
@@ -129,4 +132,45 @@ {{ partial('partials/pager') }} +{% endblock %} + +{% block inline_js %} + + + {% endblock %} \ No newline at end of file diff --git a/app/Http/Admin/Views/course/search.volt b/app/Http/Admin/Views/course/search.volt index 9a8d0935..1076d9a4 100644 --- a/app/Http/Admin/Views/course/search.volt +++ b/app/Http/Admin/Views/course/search.volt @@ -54,6 +54,13 @@
+
+ +
+ + +
+
diff --git a/app/Http/Api/Controllers/IndexController.php b/app/Http/Api/Controllers/IndexController.php index 1aba3a64..d250857a 100644 --- a/app/Http/Api/Controllers/IndexController.php +++ b/app/Http/Api/Controllers/IndexController.php @@ -2,6 +2,7 @@ namespace App\Http\Api\Controllers; +use App\Caches\IndexSimpleFeaturedCourseList; use App\Caches\IndexSimpleFreeCourseList; use App\Caches\IndexSimpleNewCourseList; use App\Caches\IndexSimpleVipCourseList; @@ -25,6 +26,18 @@ class IndexController extends Controller return $this->jsonSuccess(['slides' => $slides]); } + /** + * @Get("/courses/featured", name="api.index.featured_courses") + */ + public function featuredCoursesAction() + { + $cache = new IndexSimpleFeaturedCourseList(); + + $courses = $cache->get(); + + return $this->jsonSuccess(['courses' => $courses]); + } + /** * @Get("/courses/new", name="api.index.new_courses") */ diff --git a/app/Http/Home/Controllers/IndexController.php b/app/Http/Home/Controllers/IndexController.php index ea099b71..04375285 100644 --- a/app/Http/Home/Controllers/IndexController.php +++ b/app/Http/Home/Controllers/IndexController.php @@ -47,6 +47,7 @@ class IndexController extends Controller $this->view->pick('index/full'); $this->view->setVar('lives', $service->getLives()); $this->view->setVar('slides', $service->getSlides()); + $this->view->setVar('featured_courses', $service->getFeaturedCourses()); $this->view->setVar('new_courses', $service->getNewCourses()); $this->view->setVar('free_courses', $service->getFreeCourses()); $this->view->setVar('vip_courses', $service->getVipCourses()); @@ -59,6 +60,7 @@ class IndexController extends Controller $this->view->pick('index/simple'); $this->view->setVar('lives', $service->getLives()); $this->view->setVar('slides', $service->getSlides()); + $this->view->setVar('featured_courses', $service->getSimpleFeaturedCourses()); $this->view->setVar('new_courses', $service->getSimpleNewCourses()); $this->view->setVar('free_courses', $service->getSimpleFreeCourses()); $this->view->setVar('vip_courses', $service->getSimpleVipCourses()); diff --git a/app/Http/Home/Services/Index.php b/app/Http/Home/Services/Index.php index fc46e91d..7e42cb72 100644 --- a/app/Http/Home/Services/Index.php +++ b/app/Http/Home/Services/Index.php @@ -2,9 +2,11 @@ namespace App\Http\Home\Services; +use App\Caches\IndexFeaturedCourseList; use App\Caches\IndexFreeCourseList; use App\Caches\IndexLiveList; use App\Caches\IndexNewCourseList; +use App\Caches\IndexSimpleFeaturedCourseList; use App\Caches\IndexSimpleFreeCourseList; use App\Caches\IndexSimpleNewCourseList; use App\Caches\IndexSimpleVipCourseList; @@ -61,6 +63,15 @@ class Index extends Service return $cache->get(); } + public function getFeaturedCourses() + { + $cache = new IndexFeaturedCourseList(); + + $courses = $cache->get(); + + return $this->handleCategoryCourses($courses); + } + public function getNewCourses() { $cache = new IndexNewCourseList(); @@ -95,6 +106,13 @@ class Index extends Service return $cache->get(); } + public function getSimpleFeaturedCourses() + { + $cache = new IndexSimpleFeaturedCourseList(); + + return $cache->get(); + } + public function getSimpleFreeCourses() { $cache = new IndexSimpleFreeCourseList(); diff --git a/app/Http/Home/Views/index/full.volt b/app/Http/Home/Views/index/full.volt index e80b6783..00786429 100644 --- a/app/Http/Home/Views/index/full.volt +++ b/app/Http/Home/Views/index/full.volt @@ -45,6 +45,13 @@
+
+
推荐课程
+
+ {{ category_courses(featured_courses) }} +
+
+
新上课程
diff --git a/app/Http/Home/Views/index/simple.volt b/app/Http/Home/Views/index/simple.volt index 1bf213b4..78857d29 100644 --- a/app/Http/Home/Views/index/simple.volt +++ b/app/Http/Home/Views/index/simple.volt @@ -30,6 +30,13 @@
+
+
推荐课程
+
+ {{ show_courses(featured_courses) }} +
+
+
新上课程
diff --git a/app/Models/Course.php b/app/Models/Course.php index aaa22404..282da552 100644 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -165,6 +165,13 @@ class Course extends Model */ public $attrs; + /** + * 推荐标识 + * + * @var int + */ + public $featured; + /** * 发布标识 * @@ -377,6 +384,7 @@ class Course extends Model 'rating' => '好评', 'latest' => '最新', 'popular' => '最热', + 'featured' => '推荐', 'free' => '免费', ]; } diff --git a/app/Repos/Course.php b/app/Repos/Course.php index 4dc5a34a..5b774458 100644 --- a/app/Repos/Course.php +++ b/app/Repos/Course.php @@ -67,6 +67,10 @@ class Course extends Repository } } + if (isset($where['featured'])) { + $builder->andWhere('featured = :featured:', ['featured' => $where['featured']]); + } + if (isset($where['published'])) { $builder->andWhere('published = :published:', ['published' => $where['published']]); } @@ -77,6 +81,8 @@ class Course extends Repository if ($sort == 'free') { $builder->andWhere('market_price = 0'); + } elseif ($sort == 'featured') { + $builder->andWhere('featured = 1'); } elseif ($sort == 'vip_discount') { $builder->andWhere('vip_price < market_price'); $builder->andWhere('vip_price > 0'); diff --git a/app/Validators/Course.php b/app/Validators/Course.php index 65b157a7..efa5288f 100644 --- a/app/Validators/Course.php +++ b/app/Validators/Course.php @@ -212,6 +212,15 @@ class Course extends Validator return $expiry; } + public function checkFeatureStatus($status) + { + if (!in_array($status, [0, 1])) { + throw new BadRequestException('course.invalid_feature_status'); + } + + return $status; + } + public function checkPublishStatus($status) { if (!in_array($status, [0, 1])) { diff --git a/config/errors.php b/config/errors.php index 4ccb1907..d599a268 100644 --- a/config/errors.php +++ b/config/errors.php @@ -114,6 +114,7 @@ $error['course.invalid_vip_price'] = '无效的会员价格(范围:0-10000 $error['course.invalid_compare_price'] = '无效的比较定价(会员价格高于市场价格)'; $error['course.invalid_study_expiry'] = '无效的学习期限'; $error['course.invalid_refund_expiry'] = '无效的退款期限'; +$error['course.invalid_feature_status'] = '无效的推荐状态'; $error['course.invalid_publish_status'] = '无效的发布状态'; $error['course.pub_chapter_not_found'] = '尚未发现已发布的课时'; $error['course.pub_chapter_not_enough'] = '已发布的课时太少(小于30%)'; diff --git a/db/migrations/20201227081614_schema_202012271615.php b/db/migrations/20201227081614_schema_202012271615.php new file mode 100644 index 00000000..d58b73ad --- /dev/null +++ b/db/migrations/20201227081614_schema_202012271615.php @@ -0,0 +1,21 @@ +table('kg_course') + ->addColumn('featured', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '推荐标识', + 'after' => 'attrs', + ]) + ->save(); + } + +} -- Gitee From 9974430f18f263cadb7336c7c4acee145a290729 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 26 Dec 2020 17:44:18 +0800 Subject: [PATCH 19/89] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E9=A6=96=E9=A1=B5=E7=BC=93=E5=AD=98=E5=B0=8F?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Tasks/MaintainTask.php | 41 +-------- app/Http/Admin/Controllers/UtilController.php | 30 +++++++ app/Http/Admin/Services/AuthNode.php | 24 +++++ app/Http/Admin/Services/Util.php | 40 +++++++++ app/Http/Admin/Views/util/index_cache.volt | 89 +++++++++++++++++++ app/Services/Utils/IndexCourseCache.php | 53 +++++++++++ 6 files changed, 239 insertions(+), 38 deletions(-) create mode 100644 app/Http/Admin/Controllers/UtilController.php create mode 100644 app/Http/Admin/Services/Util.php create mode 100644 app/Http/Admin/Views/util/index_cache.volt create mode 100644 app/Services/Utils/IndexCourseCache.php diff --git a/app/Console/Tasks/MaintainTask.php b/app/Console/Tasks/MaintainTask.php index 7f6d5898..bb915d46 100644 --- a/app/Console/Tasks/MaintainTask.php +++ b/app/Console/Tasks/MaintainTask.php @@ -2,14 +2,9 @@ namespace App\Console\Tasks; -use App\Caches\IndexFreeCourseList as IndexFreeCourseListCache; -use App\Caches\IndexNewCourseList as IndexNewCourseListCache; -use App\Caches\IndexSimpleFreeCourseList as IndexSimpleFreeCourseListCache; -use App\Caches\IndexSimpleNewCourseList as IndexSimpleNewCourseListCache; -use App\Caches\IndexSimpleVipCourseList as IndexSimpleVipCourseListCache; -use App\Caches\IndexVipCourseList as IndexVipCourseListCache; use App\Http\Admin\Services\Setting as SettingService; use App\Library\Utils\Password as PasswordUtil; +use App\Services\Utils\IndexCourseCache as IndexCourseCacheUtil; use App\Validators\Account as AccountValidator; class MaintainTask extends Task @@ -25,39 +20,9 @@ class MaintainTask extends Task { $section = $params[0] ?? null; - $site = $this->getSettings('site'); + $util = new IndexCourseCacheUtil(); - $type = $site['index_tpl_type'] ?: 'full'; - - if (!$section || $section == 'new_course') { - if ($type == 'full') { - $cache = new IndexNewCourseListCache(); - $cache->rebuild(); - } else { - $cache = new IndexSimpleNewCourseListCache(); - $cache->rebuild(); - } - } - - if (!$section || $section == 'free_course') { - if ($type == 'full') { - $cache = new IndexFreeCourseListCache(); - $cache->rebuild(); - } else { - $cache = new IndexSimpleFreeCourseListCache(); - $cache->rebuild(); - } - } - - if (!$section || $section == 'vip_course') { - if ($type == 'full') { - $cache = new IndexVipCourseListCache(); - $cache->rebuild(); - } else { - $cache = new IndexSimpleVipCourseListCache(); - $cache->rebuild(); - } - } + $util->rebuild($section); echo 'rebuild index course cache success' . PHP_EOL; } diff --git a/app/Http/Admin/Controllers/UtilController.php b/app/Http/Admin/Controllers/UtilController.php new file mode 100644 index 00000000..89dc1386 --- /dev/null +++ b/app/Http/Admin/Controllers/UtilController.php @@ -0,0 +1,30 @@ +request->isPost()) { + + $service->handleIndexCache(); + + return $this->jsonSuccess(['msg' => '更新缓存成功']); + } + + $this->view->pick('util/index_cache'); + } + +} diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index db2ec7d8..073058bc 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -14,6 +14,7 @@ class AuthNode extends Service $nodes[] = $this->getFinanceNodes(); $nodes[] = $this->getUserNodes(); $nodes[] = $this->getSettingNodes(); + $nodes[] = $this->getUtilNodes(); return $nodes; } @@ -768,4 +769,27 @@ class AuthNode extends Service ]; } + protected function getUtilNodes() + { + return [ + 'id' => '6', + 'title' => '实用工具', + 'children' => [ + [ + 'id' => '6-1', + 'title' => '常用工具', + 'type' => 'menu', + 'children' => [ + [ + 'id' => '6-1-1', + 'title' => '首页缓存', + 'type' => 'menu', + 'route' => 'admin.util.index_cache', + ], + ], + ], + ], + ]; + } + } diff --git a/app/Http/Admin/Services/Util.php b/app/Http/Admin/Services/Util.php new file mode 100644 index 00000000..42806b70 --- /dev/null +++ b/app/Http/Admin/Services/Util.php @@ -0,0 +1,40 @@ +request->getPost('items'); + + if ($items['slide'] == 1) { + $cache = new IndexSlideListCache(); + $cache->rebuild(); + } + + $util = new IndexCourseCacheUtil(); + + if ($items['featured_course'] == 1) { + $util->rebuild('featured_course'); + } + + if ($items['new_course'] == 1) { + $util->rebuild('new_course'); + } + + if ($items['free_course'] == 1) { + $util->rebuild('free_course'); + } + + if ($items['vip_course'] == 1) { + $util->rebuild('vip_course'); + } + + } + +} diff --git a/app/Http/Admin/Views/util/index_cache.volt b/app/Http/Admin/Views/util/index_cache.volt new file mode 100644 index 00000000..75278348 --- /dev/null +++ b/app/Http/Admin/Views/util/index_cache.volt @@ -0,0 +1,89 @@ +{% extends 'templates/main.volt' %} + +{% block content %} + +
+
+ 首页缓存 +
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +{% endblock %} + +{% block inline_js %} + + + +{% endblock %} \ No newline at end of file diff --git a/app/Services/Utils/IndexCourseCache.php b/app/Services/Utils/IndexCourseCache.php new file mode 100644 index 00000000..26e279cd --- /dev/null +++ b/app/Services/Utils/IndexCourseCache.php @@ -0,0 +1,53 @@ +getSettings('site'); + + $type = $site['index_tpl_type'] ?: 'full'; + + if (!$section || $section == 'new_course') { + if ($type == 'full') { + $cache = new IndexNewCourseListCache(); + $cache->rebuild(); + } else { + $cache = new IndexSimpleNewCourseListCache(); + $cache->rebuild(); + } + } + + if (!$section || $section == 'free_course') { + if ($type == 'full') { + $cache = new IndexFreeCourseListCache(); + $cache->rebuild(); + } else { + $cache = new IndexSimpleFreeCourseListCache(); + $cache->rebuild(); + } + } + + if (!$section || $section == 'vip_course') { + if ($type == 'full') { + $cache = new IndexVipCourseListCache(); + $cache->rebuild(); + } else { + $cache = new IndexSimpleVipCourseListCache(); + $cache->rebuild(); + } + } + } + +} \ No newline at end of file -- Gitee From f3f0ca4e5f3e8758df8045e57ae0c2790918007c Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Tue, 29 Dec 2020 15:19:29 +0800 Subject: [PATCH 20/89] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E6=A8=A1=E6=9D=BF=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Tasks/CleanLogTask.php | 136 +++++++++++++++++--- app/Console/Tasks/NoticeTask.php | 2 + app/Http/Admin/Services/AuthNode.php | 2 +- app/Http/Admin/Views/setting/sms.volt | 2 +- app/Http/Admin/Views/setting/wechat_oa.volt | 12 +- app/Listeners/Pay.php | 10 +- app/Services/LiveNotify.php | 46 +++++++ app/Services/Logic/Notice/ConsultReply.php | 2 + app/Services/Logic/Notice/OrderFinish.php | 2 + app/Services/Logic/Notice/RefundFinish.php | 6 +- app/Services/Logic/Refund/RefundCreate.php | 6 +- app/Services/Wechat/Notice/AccountLogin.php | 8 +- app/Services/Wechat/Notice/ConsultReply.php | 4 +- app/Services/Wechat/Notice/LiveBegin.php | 8 +- app/Services/Wechat/Notice/OrderFinish.php | 6 +- app/Services/Wechat/Notice/RefundFinish.php | 7 +- 16 files changed, 214 insertions(+), 45 deletions(-) diff --git a/app/Console/Tasks/CleanLogTask.php b/app/Console/Tasks/CleanLogTask.php index d4d532c7..725dfa6c 100644 --- a/app/Console/Tasks/CleanLogTask.php +++ b/app/Console/Tasks/CleanLogTask.php @@ -5,6 +5,8 @@ namespace App\Console\Tasks; class CleanLogTask extends Task { + protected $whitelist = []; + public function mainAction() { $this->cleanCommonLog(); @@ -24,6 +26,7 @@ class CleanLogTask extends Task $this->cleanOrderLog(); $this->cleanRefundLog(); $this->cleanNoticeLog(); + $this->cleanOtherLog(); } /** @@ -31,7 +34,11 @@ class CleanLogTask extends Task */ protected function cleanCommonLog() { - $this->cleanLog('common', 7); + $type = 'common'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -39,7 +46,11 @@ class CleanLogTask extends Task */ protected function cleanHttpLog() { - $this->cleanLog('http', 7); + $type = 'http'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -47,7 +58,11 @@ class CleanLogTask extends Task */ protected function cleanConsoleLog() { - $this->cleanLog('console', 7); + $type = 'console'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -55,7 +70,11 @@ class CleanLogTask extends Task */ protected function cleanSqlLog() { - $this->cleanLog('sql', 3); + $type = 'sql'; + + $this->cleanLog($type, 3); + + $this->whitelist[] = $type; } /** @@ -63,7 +82,11 @@ class CleanLogTask extends Task */ protected function cleanListenLog() { - $this->cleanLog('listen', 7); + $type = 'listen'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -71,7 +94,11 @@ class CleanLogTask extends Task */ protected function cleanCaptchaLog() { - $this->cleanLog('captcha', 7); + $type = 'captcha'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -79,7 +106,11 @@ class CleanLogTask extends Task */ protected function cleanVodLog() { - $this->cleanLog('vod', 7); + $type = 'vod'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -87,7 +118,11 @@ class CleanLogTask extends Task */ protected function cleanLiveLog() { - $this->cleanLog('live', 7); + $type = 'live'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -95,7 +130,11 @@ class CleanLogTask extends Task */ protected function cleanStorageLog() { - $this->cleanLog('storage', 7); + $type = 'storage'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -103,7 +142,11 @@ class CleanLogTask extends Task */ protected function cleanSmsLog() { - $this->cleanLog('sms', 7); + $type = 'sms'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -111,7 +154,11 @@ class CleanLogTask extends Task */ protected function cleanMailLog() { - $this->cleanLog('mail', 7); + $type = 'mail'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -119,7 +166,11 @@ class CleanLogTask extends Task */ protected function cleanWechatLog() { - $this->cleanLog('wechat', 7); + $type = 'wechat'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; } /** @@ -127,7 +178,11 @@ class CleanLogTask extends Task */ protected function cleanAlipayLog() { - $this->cleanLog('alipay', 30); + $type = 'alipay'; + + $this->cleanLog($type, 30); + + $this->whitelist[] = $type; } /** @@ -135,7 +190,11 @@ class CleanLogTask extends Task */ protected function cleanWxpayLog() { - $this->cleanLog('wxpay', 30); + $type = 'wxpay'; + + $this->cleanLog($type, 30); + + $this->whitelist[] = $type; } /** @@ -143,7 +202,11 @@ class CleanLogTask extends Task */ protected function cleanOrderLog() { - $this->cleanLog('order', 30); + $type = 'order'; + + $this->cleanLog($type, 30); + + $this->whitelist[] = $type; } /** @@ -151,7 +214,11 @@ class CleanLogTask extends Task */ protected function cleanRefundLog() { - $this->cleanLog('refund', 30); + $type = 'refund'; + + $this->cleanLog($type, 30); + + $this->whitelist[] = $type; } /** @@ -159,7 +226,42 @@ class CleanLogTask extends Task */ protected function cleanNoticeLog() { - $this->cleanLog('notice', 7); + $type = 'notice'; + + $this->cleanLog($type, 7); + + $this->whitelist[] = $type; + } + + /** + * 清理其它日志 + * + * @param int $keepDays + * @return mixed + */ + protected function cleanOtherLog($keepDays = 7) + { + $files = glob(log_path() . "/*.log"); + + if (!$files) return false; + + foreach ($files as $file) { + $name = str_replace(log_path() . '/', '', $file); + $type = substr($name, 0, -15); + $date = substr($name, -14, 10); + $today = date('Y-m-d'); + if (in_array($type, $this->whitelist)) { + continue; + } + if (strtotime($today) - strtotime($date) >= $keepDays * 86400) { + $deleted = unlink($file); + if ($deleted) { + echo "delete {$file} success" . PHP_EOL; + } else { + echo "delete {$file} failed" . PHP_EOL; + } + } + } } /** diff --git a/app/Console/Tasks/NoticeTask.php b/app/Console/Tasks/NoticeTask.php index c4a385d4..06841554 100644 --- a/app/Console/Tasks/NoticeTask.php +++ b/app/Console/Tasks/NoticeTask.php @@ -64,6 +64,8 @@ class NoticeTask extends Task $task->update(); $logger->info('Notice Process Exception ' . kg_json_encode([ + 'file' => $e->getFile(), + 'line' => $e->getLine(), 'code' => $e->getCode(), 'message' => $e->getMessage(), 'task' => $task->toArray(), diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 073058bc..89b75942 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -759,7 +759,7 @@ class AuthNode extends Service ], [ 'id' => '5-1-13', - 'title' => '微信公众平台', + 'title' => '微信平台', 'type' => 'menu', 'route' => 'admin.setting.wechat', ], diff --git a/app/Http/Admin/Views/setting/sms.volt b/app/Http/Admin/Views/setting/sms.volt index 8601b0a2..05a2acda 100644 --- a/app/Http/Admin/Views/setting/sms.volt +++ b/app/Http/Admin/Views/setting/sms.volt @@ -70,7 +70,7 @@ 复制 - 回复通知 + 咨询通知 复制 diff --git a/app/Http/Admin/Views/setting/wechat_oa.volt b/app/Http/Admin/Views/setting/wechat_oa.volt index efc70be5..97702aa3 100644 --- a/app/Http/Admin/Views/setting/wechat_oa.volt +++ b/app/Http/Admin/Views/setting/wechat_oa.volt @@ -54,7 +54,7 @@ - + @@ -66,27 +66,27 @@ - + - + - + - + - + diff --git a/app/Listeners/Pay.php b/app/Listeners/Pay.php index 2ee624a8..ac5b7d88 100644 --- a/app/Listeners/Pay.php +++ b/app/Listeners/Pay.php @@ -73,11 +73,11 @@ class Pay extends Listener 'message' => $e->getMessage(), ])); - $this->logger->debug('Event: {event}, Source: {source}, Data: {data}', [ - 'event' => $event->getType(), - 'source' => get_class($source), - 'data' => kg_json_encode($trade), - ]); + $this->logger->debug('After Pay Event Info ' . kg_json_encode([ + 'event' => $event->getType(), + 'source' => get_class($source), + 'data' => kg_json_encode($trade), + ])); throw new \RuntimeException('sys.trans_rollback'); } diff --git a/app/Services/LiveNotify.php b/app/Services/LiveNotify.php index edf7982d..82fcc768 100644 --- a/app/Services/LiveNotify.php +++ b/app/Services/LiveNotify.php @@ -2,21 +2,39 @@ namespace App\Services; +use App\Caches\CourseChapterList as CatalogCache; use App\Models\Chapter as ChapterModel; use App\Models\ChapterLive as ChapterLiveModel; use App\Repos\Chapter as ChapterRepo; use App\Repos\CourseUser as CourseUserRepo; use App\Services\Logic\Notice\LiveBegin as LiveBeginNotice; +use Phalcon\Logger\Adapter\File as FileLogger; class LiveNotify extends Service { + /** + * @var FileLogger + */ + protected $logger; + + public function __construct() + { + $this->logger = $this->getLogger('live'); + } + public function handle() { $time = $this->request->getPost('t', 'int'); $sign = $this->request->getPost('sign', 'string'); $action = $this->request->getQuery('action', 'string'); + $this->logger->debug('Received Live Notify Data: ' . kg_json_encode([ + 't' => $time, + 'sign' => $sign, + 'action' => $action, + ])); + if (!$this->checkSign($sign, $time)) { return false; } @@ -53,6 +71,8 @@ class LiveNotify extends Service $chapter = $this->getChapter($streamId); + $this->logger->debug("Chapter:{$chapter->id} Stream Begin"); + if (!$chapter) return false; $attrs = $chapter->attrs; @@ -65,6 +85,8 @@ class LiveNotify extends Service $chapterLive->update(['status' => ChapterLiveModel::STATUS_ACTIVE]); + $this->rebuildCatalogCache($chapter); + $this->handleStreamBeginNotice($chapter); return true; @@ -79,6 +101,8 @@ class LiveNotify extends Service $chapter = $this->getChapter($streamId); + $this->logger->info("Chapter:{$chapter->id} Stream End"); + if (!$chapter) return false; $attrs = $chapter->attrs; @@ -91,6 +115,8 @@ class LiveNotify extends Service $chapterLive->update(['status' => ChapterLiveModel::STATUS_INACTIVE]); + $this->rebuildCatalogCache($chapter); + return true; } @@ -120,6 +146,19 @@ class LiveNotify extends Service protected function handleStreamBeginNotice(ChapterModel $chapter) { + /** + * 防止发送多次通知 + */ + $cache = $this->getCache(); + + $keyName = "live_notify:{$chapter->id}"; + + if ($cache->get($keyName)) { + return; + } + + $cache->save($keyName, time(), 86400); + $courseUserRepo = new CourseUserRepo(); $courseUsers = $courseUserRepo->findByCourseId($chapter->course_id); @@ -135,6 +174,13 @@ class LiveNotify extends Service } } + protected function rebuildCatalogCache(ChapterModel $chapter) + { + $cache = new CatalogCache(); + + $cache->rebuild($chapter->course_id); + } + protected function getChapter($streamName) { $id = ChapterLiveModel::parseFromStreamName($streamName); diff --git a/app/Services/Logic/Notice/ConsultReply.php b/app/Services/Logic/Notice/ConsultReply.php index cdd3c34a..3b77f7c1 100644 --- a/app/Services/Logic/Notice/ConsultReply.php +++ b/app/Services/Logic/Notice/ConsultReply.php @@ -46,6 +46,8 @@ class ConsultReply extends LogicService 'id' => $consult->id, 'question' => $consult->question, 'answer' => $consult->answer, + 'create_time' => $consult->create_time, + 'reply_time' => $consult->reply_time, ], 'course' => [ 'id' => $course->id, diff --git a/app/Services/Logic/Notice/OrderFinish.php b/app/Services/Logic/Notice/OrderFinish.php index 5b70e132..206f231b 100644 --- a/app/Services/Logic/Notice/OrderFinish.php +++ b/app/Services/Logic/Notice/OrderFinish.php @@ -35,6 +35,8 @@ class OrderFinish extends LogicService 'sn' => $order->sn, 'subject' => $order->subject, 'amount' => $order->amount, + 'create_time' => $order->create_time, + 'update_time' => $order->update_time, ], ]; diff --git a/app/Services/Logic/Notice/RefundFinish.php b/app/Services/Logic/Notice/RefundFinish.php index 468f5539..833cd6dc 100644 --- a/app/Services/Logic/Notice/RefundFinish.php +++ b/app/Services/Logic/Notice/RefundFinish.php @@ -31,10 +31,12 @@ class RefundFinish extends LogicService 'id' => $user->id, 'name' => $user->name, ], - 'order' => [ + 'refund' => [ 'sn' => $refund->sn, 'subject' => $refund->subject, 'amount' => $refund->amount, + 'create_time' => $refund->create_time, + 'update_time' => $refund->update_time, ], ]; @@ -66,7 +68,7 @@ class RefundFinish extends LogicService $task->item_id = $refund->id; $task->item_info = $itemInfo; - $task->item_type = TaskModel::TYPE_NOTICE_ORDER_FINISH; + $task->item_type = TaskModel::TYPE_NOTICE_REFUND_FINISH; $task->priority = TaskModel::PRIORITY_MIDDLE; $task->status = TaskModel::STATUS_PENDING; diff --git a/app/Services/Logic/Refund/RefundCreate.php b/app/Services/Logic/Refund/RefundCreate.php index bb67fcc9..a3332928 100644 --- a/app/Services/Logic/Refund/RefundCreate.php +++ b/app/Services/Logic/Refund/RefundCreate.php @@ -66,7 +66,11 @@ class RefundCreate extends Service * 设定延迟,给取消退款一个调解机会 */ $itemInfo = [ - 'refund' => $refund->toArray(), + 'refund' => [ + 'id' => $refund->id, + 'order_id' => $refund->order_id, + 'trade_id' => $refund->trade_id, + ], 'deadline' => time() + 3600 * 24 * 2, ]; diff --git a/app/Services/Wechat/Notice/AccountLogin.php b/app/Services/Wechat/Notice/AccountLogin.php index b4e901e7..4bf761bc 100644 --- a/app/Services/Wechat/Notice/AccountLogin.php +++ b/app/Services/Wechat/Notice/AccountLogin.php @@ -26,13 +26,17 @@ class AccountLogin extends WechatNotice $params['login_region']['city'], ]); - $loginTime = date('Y-m-d H:i:s', $params['login_time']); + $loginTime = date('Y-m-d H:i', $params['login_time']); + $loginUser = $params['user']['name']; + $loginIp = $params['login_ip']; $params = [ 'first' => $first, 'remark' => $remark, - 'keyword1' => $loginRegion, + 'keyword1' => $loginUser, 'keyword2' => $loginTime, + 'keyword3' => $loginRegion, + 'keyword4' => $loginIp, ]; $templateId = $this->getTemplateId($this->templateCode); diff --git a/app/Services/Wechat/Notice/ConsultReply.php b/app/Services/Wechat/Notice/ConsultReply.php index f33db7f9..41b7562f 100644 --- a/app/Services/Wechat/Notice/ConsultReply.php +++ b/app/Services/Wechat/Notice/ConsultReply.php @@ -24,7 +24,9 @@ class ConsultReply extends WechatNotice $params = [ 'first' => $first, 'remark' => $remark, - 'keyword1' => $params['course']['title'], + 'keyword1' => kg_substr($params['consult']['question'], 0, 50), + 'keyword2' => date('Y-m-d H:i', $params['consult']['create_time']), + 'keyword3' => kg_substr($params['consult']['answer'], 0, 50), ]; $templateId = $this->getTemplateId($this->templateCode); diff --git a/app/Services/Wechat/Notice/LiveBegin.php b/app/Services/Wechat/Notice/LiveBegin.php index 83077f4d..96ab8250 100644 --- a/app/Services/Wechat/Notice/LiveBegin.php +++ b/app/Services/Wechat/Notice/LiveBegin.php @@ -18,14 +18,16 @@ class LiveBegin extends WechatNotice public function handle(WechatSubscribeModel $subscribe, array $params) { $first = '你参与的课程直播就要开始了!'; - $remark = '如果没能参与直播,记得观看直播录像哦!'; + + $startTime = date('H:i', $params['live']['start_time']); + + $remark = sprintf('课程直播:%s 即将在 %s 开始, 千万不要错过哦!', $params['chapter']['title'], $startTime); $params = [ 'first' => $first, 'remark' => $remark, 'keyword1' => $params['course']['title'], - 'keyword2' => $params['chapter']['title'], - 'keyword3' => date('Y-m-d H:i', $params['live']['start_time']), + 'keyword2' => $params['user']['name'], ]; $templateId = $this->getTemplateId($this->templateCode); diff --git a/app/Services/Wechat/Notice/OrderFinish.php b/app/Services/Wechat/Notice/OrderFinish.php index c21ea2a9..c4179b39 100644 --- a/app/Services/Wechat/Notice/OrderFinish.php +++ b/app/Services/Wechat/Notice/OrderFinish.php @@ -24,9 +24,9 @@ class OrderFinish extends WechatNotice $params = [ 'first' => $first, 'remark' => $remark, - 'keyword1' => $params['order']['subject'], - 'keyword2' => $params['order']['sn'], - 'keyword3' => $params['order']['amount'], + 'keyword1' => sprintf('%s元', $params['order']['amount']), + 'keyword2' => $params['order']['subject'], + 'keyword3' => date('Y-m-d H:i', $params['order']['update_time']), ]; $templateId = $this->getTemplateId($this->templateCode); diff --git a/app/Services/Wechat/Notice/RefundFinish.php b/app/Services/Wechat/Notice/RefundFinish.php index 6b2030fe..5d63b220 100644 --- a/app/Services/Wechat/Notice/RefundFinish.php +++ b/app/Services/Wechat/Notice/RefundFinish.php @@ -23,9 +23,10 @@ class RefundFinish extends WechatNotice $params = [ 'first' => $first, 'remark' => $remark, - 'keyword1' => $params['refund']['subject'], - 'keyword2' => $params['refund']['sn'], - 'keyword3' => $params['refund']['amount'], + 'keyword1' => $params['refund']['sn'], + 'keyword2' => $params['refund']['subject'], + 'keyword3' => sprintf('%s元', $params['refund']['amount']), + 'keyword4' => date('Y-m-d H:i', $params['refund']['update_time']), ]; $templateId = $this->getTemplateId($this->templateCode); -- Gitee From 1ff7aa3be6e09ee58c05db8346b3f77ec973779f Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Tue, 29 Dec 2020 15:52:45 +0800 Subject: [PATCH 21/89] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=8E=A8=E8=8D=90=E8=AF=BE=E7=A8=8B=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Services/Utils/IndexCourseCache.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/Services/Utils/IndexCourseCache.php b/app/Services/Utils/IndexCourseCache.php index 26e279cd..beedbd32 100644 --- a/app/Services/Utils/IndexCourseCache.php +++ b/app/Services/Utils/IndexCourseCache.php @@ -2,8 +2,10 @@ namespace App\Services\Utils; +use App\Caches\IndexFeaturedCourseList as IndexFeaturedCourseListCache; use App\Caches\IndexFreeCourseList as IndexFreeCourseListCache; use App\Caches\IndexNewCourseList as IndexNewCourseListCache; +use App\Caches\IndexSimpleFeaturedCourseList as IndexSimpleFeaturedCourseListCache; use App\Caches\IndexSimpleFreeCourseList as IndexSimpleFreeCourseListCache; use App\Caches\IndexSimpleNewCourseList as IndexSimpleNewCourseListCache; use App\Caches\IndexSimpleVipCourseList as IndexSimpleVipCourseListCache; @@ -19,6 +21,16 @@ class IndexCourseCache extends Service $type = $site['index_tpl_type'] ?: 'full'; + if (!$section || $section == 'featured_course') { + if ($type == 'full') { + $cache = new IndexFeaturedCourseListCache(); + $cache->rebuild(); + } else { + $cache = new IndexSimpleFeaturedCourseListCache(); + $cache->rebuild(); + } + } + if (!$section || $section == 'new_course') { if ($type == 'full') { $cache = new IndexNewCourseListCache(); -- Gitee From 281ec379701a357f14f983ff990d1d29f45b20fe Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Wed, 30 Dec 2020 17:49:32 +0800 Subject: [PATCH 22/89] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E7=BB=BC=E5=90=88=E8=AF=84=E5=88=86=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Tasks/SyncCourseScoreTask.php | 44 ++++++++++++ app/Models/Course.php | 4 ++ app/Services/CourseStat.php | 85 ++++++++++++++++++++++- app/Services/Sync/CourseScore.php | 33 +++++++++ scheduler.php | 3 + 5 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 app/Console/Tasks/SyncCourseScoreTask.php create mode 100644 app/Services/Sync/CourseScore.php diff --git a/app/Console/Tasks/SyncCourseScoreTask.php b/app/Console/Tasks/SyncCourseScoreTask.php new file mode 100644 index 00000000..3a789633 --- /dev/null +++ b/app/Console/Tasks/SyncCourseScoreTask.php @@ -0,0 +1,44 @@ +getRedis(); + + $key = $this->getSyncKey(); + + $courseIds = $redis->sRandMember($key, 1000); + + if (!$courseIds) return; + + $courseRepo = new CourseRepo(); + + $courses = $courseRepo->findByIds($courseIds); + + if ($courses->count() == 0) return; + + $statService = new CourseStatService(); + + foreach ($courses as $course) { + $statService->updateScore($course->id); + } + + $redis->sRem($key, ...$courseIds); + } + + protected function getSyncKey() + { + $sync = new CourseScoreSync(); + + return $sync->getSyncKey(); + } + +} diff --git a/app/Models/Course.php b/app/Models/Course.php index 282da552..474ae0d8 100644 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Caches\MaxCourseId as MaxCourseIdCache; use App\Services\Sync\CourseIndex as CourseIndexSync; +use App\Services\Sync\CourseScore as CourseScoreSync; use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Text; @@ -309,6 +310,9 @@ class Course extends Model if (time() - $this->update_time > 3 * 3600) { $sync = new CourseIndexSync(); $sync->addItem($this->id); + + $sync = new CourseScoreSync(); + $sync->addItem($this->id); } if (Text::startsWith($this->cover, 'http')) { diff --git a/app/Services/CourseStat.php b/app/Services/CourseStat.php index b5195e95..35639b3d 100644 --- a/app/Services/CourseStat.php +++ b/app/Services/CourseStat.php @@ -2,6 +2,7 @@ namespace App\Services; +use App\Models\Course as CourseModel; use App\Repos\Course as CourseRepo; use App\Repos\CourseRating as CourseRatingRepo; @@ -58,9 +59,19 @@ class CourseStat extends Service public function updateScore($courseId) { - /** - * @todo 计算综合评分 - */ + $courseRepo = new CourseRepo(); + + $course = $courseRepo->findById($courseId); + + if ($course->market_price == 0) { + $score = $this->calculateFreeCourseScore($course); + } else { + $score = $this->calculateChargeCourseScore($course); + } + + $course->score = $score; + + $course->update(); } public function updateReadAttrs($courseId) @@ -181,4 +192,72 @@ class CourseStat extends Service $course->update(['attrs' => $attrs]); } + protected function calculateFreeCourseScore(CourseModel $course) + { + $weight = [ + 'factor1' => 0.1, + 'factor2' => 0.25, + 'factor3' => 0.2, + 'factor4' => 0.1, + 'factor5' => 0.25, + 'factor6' => 0.1, + ]; + + return $this->calculateCourseScore($course, $weight); + } + + protected function calculateChargeCourseScore(CourseModel $course) + { + $weight = [ + 'factor1' => 0.1, + 'factor2' => 0.3, + 'factor3' => 0.15, + 'factor4' => 0.15, + 'factor5' => 0.2, + 'factor6' => 0.1, + ]; + + return $this->calculateCourseScore($course, $weight); + } + + protected function calculateCourseScore(CourseModel $course, $weight) + { + $items = [ + 'factor1' => 0.0, + 'factor2' => 0.0, + 'factor3' => 0.0, + 'factor4' => 0.0, + 'factor5' => 0.0, + 'factor6' => 0.0, + ]; + + $items['factor1'] = ($course->featured == 1 ? 1 : 0) * 10 * $weight['factor1']; + + if ($course->user_count > 0) { + $items['factor2'] = log($course->user_count) * $weight['factor2']; + } + + if ($course->favorite_count > 0) { + $items['factor3'] = log($course->favorite_count) * $weight['factor3']; + } + + if ($course->consult_count > 0) { + $items['factor4'] = log($course->consult_count) * $weight['factor4']; + } + + if ($course->review_count > 0 && $course->rating > 0) { + $items['factor5'] = log($course->review_count * $course->rating) * $weight['factor5']; + } + + $sumCount = $course->lesson_count + $course->package_count + $course->resource_count; + + if ($sumCount > 0) { + $items['factor6'] = log($sumCount) * $weight['factor6']; + } + + $score = array_sum($items) / log(time() - $course->create_time); + + return round($score, 4); + } + } diff --git a/app/Services/Sync/CourseScore.php b/app/Services/Sync/CourseScore.php new file mode 100644 index 00000000..506d27b8 --- /dev/null +++ b/app/Services/Sync/CourseScore.php @@ -0,0 +1,33 @@ +getRedis(); + + $key = $this->getSyncKey(); + + $redis->sAdd($key, $courseId); + + if ($redis->sCard($key) == 1) { + $redis->expire($key, $this->lifetime); + } + } + + public function getSyncKey() + { + return 'sync_course_score'; + } + +} diff --git a/scheduler.php b/scheduler.php index b1175a1b..2424b002 100644 --- a/scheduler.php +++ b/scheduler.php @@ -40,6 +40,9 @@ $scheduler->php($script, $bin, ['--task' => 'sync_group_index', '--action' => 'm $scheduler->php($script, $bin, ['--task' => 'sync_user_index', '--action' => 'main']) ->hourly(23); +$scheduler->php($script, $bin, ['--task' => 'sync_course_score', '--action' => 'main']) + ->hourly(29); + $scheduler->php($script, $bin, ['--task' => 'clean_log', '--action' => 'main']) ->daily(3, 3); -- Gitee From 15f9869557128ea215d434910d90e8578290476b Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Thu, 31 Dec 2020 11:09:11 +0800 Subject: [PATCH 23/89] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=B9=B6=E5=8F=91=E9=87=8D=E5=A4=8D=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Library/Utils/Lock.php | 79 ++++++++++++++++++++++++++++++++++++++ app/Listeners/User.php | 53 ++++++++++++++++++------- app/Repos/Online.php | 21 +++++----- 3 files changed, 128 insertions(+), 25 deletions(-) create mode 100644 app/Library/Utils/Lock.php diff --git a/app/Library/Utils/Lock.php b/app/Library/Utils/Lock.php new file mode 100644 index 00000000..f3fb6be4 --- /dev/null +++ b/app/Library/Utils/Lock.php @@ -0,0 +1,79 @@ +getShared('cache'); + + $redis = $cache->getRedis(); + + $lockId = Text::random(Text::RANDOM_ALNUM, 16); + + $keyName = self::getLockKey($itemId); + + $result = $redis->set($keyName, $lockId, ['nx', 'ex' => $expire]); + + return $result ? $lockId : false; + } + + /** + * @param string $itemId + * @param string $lockId + * @return bool + */ + public static function releaseLock($itemId, $lockId) + { + if (!$itemId || !$lockId) { + return false; + } + + /** + * @var RedisCache $cache + */ + $cache = Di::getDefault()->getShared('cache'); + + $redis = $cache->getRedis(); + + $keyName = self::getLockKey($itemId); + + $redis->watch($keyName); + + /** + * 监听key防止被修改或删除,提交事务后会自动取消监控,其他情况需手动解除监控 + */ + if ($lockId == $redis->get($keyName)) { + $redis->multi()->del($keyName)->exec(); + return true; + } + + $redis->unwatch(); + + return false; + } + + public static function getLockKey($itemId) + { + return sprintf('kg_lock:%s', $itemId); + } + +} \ No newline at end of file diff --git a/app/Listeners/User.php b/app/Listeners/User.php index 4d60f7a5..16ae1453 100644 --- a/app/Listeners/User.php +++ b/app/Listeners/User.php @@ -2,6 +2,7 @@ namespace App\Listeners; +use App\Library\Utils\Lock as LockUtil; use App\Models\Online as OnlineModel; use App\Models\User as UserModel; use App\Repos\Online as OnlineRepo; @@ -15,7 +16,13 @@ class User extends Listener public function online(Event $event, $source, UserModel $user) { + $itemId = "user:{$user->id}"; + + $lockId = LockUtil::addLock($itemId); + $now = time(); + $clientType = $this->getClientType(); + $clientIp = $this->getClientIp(); if ($now - $user->active_time > 600) { @@ -25,28 +32,46 @@ class User extends Listener $onlineRepo = new OnlineRepo(); - $online = $onlineRepo->findByUserDate($user->id, date('Y-m-d')); + $records = $onlineRepo->findByUserDate($user->id, date('Y-m-d')); + + if ($records->count() > 0) { - if ($online) { + $online = null; - $online->active_time = $now; - $online->client_type = $this->getClientType(); - $online->client_ip = $this->getClientIp(); + foreach ($records as $record) { + if ($record->client_type == $clientType && $record->client_ip == $clientIp) { + $online = $record; + break; + } + } - $online->update(); + if ($online) { + $online->active_time = $now; + $online->update(); + } else { + $this->createOnline($user->id, $clientType, $clientIp); + } } else { + $this->createOnline($user->id, $clientType, $clientIp); + } + } - $online = new OnlineModel(); + LockUtil::releaseLock($itemId, $lockId); + } - $online->user_id = $user->id; - $online->active_time = $now; - $online->client_type = $this->getClientType(); - $online->client_ip = $this->getClientIp(); + protected function createOnline($userId, $clientType, $clientIp) + { + $online = new OnlineModel(); - $online->create(); - } - } + $online->user_id = $userId; + $online->client_type = $clientType; + $online->client_ip = $clientIp; + $online->active_time = time(); + + $online->create(); + + return $online; } } \ No newline at end of file diff --git a/app/Repos/Online.php b/app/Repos/Online.php index 1d833cbf..7a16ce30 100644 --- a/app/Repos/Online.php +++ b/app/Repos/Online.php @@ -3,7 +3,8 @@ namespace App\Repos; use App\Models\Online as OnlineModel; -use Phalcon\Mvc\Model; +use Phalcon\Mvc\Model\Resultset; +use Phalcon\Mvc\Model\ResultsetInterface; class Online extends Repository { @@ -11,20 +12,18 @@ class Online extends Repository /** * @param int $userId * @param string $activeDate - * @return OnlineModel|Model|bool + * @return ResultsetInterface|Resultset|OnlineModel[] */ public function findByUserDate($userId, $activeDate) { - $activeTime = strtotime($activeDate); + $startTime = strtotime($activeDate); - return OnlineModel::findFirst([ - 'conditions' => 'user_id = ?1 AND active_time BETWEEN ?2 AND ?3', - 'bind' => [ - 1 => $userId, - 2 => $activeTime, - 3 => $activeTime + 86400, - ], - ]); + $endTime = $startTime + 86400; + + return OnlineModel::query() + ->where('user_id = :user_id:', ['user_id' => $userId]) + ->betweenWhere('active_time', $startTime, $endTime) + ->execute(); } } \ No newline at end of file -- Gitee From 26deccc36b4d6b48783a31540246be2c49ca991c Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 2 Jan 2021 13:31:13 +0800 Subject: [PATCH 24/89] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=99=90=E5=88=B6?= =?UTF-8?q?=E5=85=B1=E4=BA=AB=E5=B8=90=E5=8F=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Tasks/CleanSessionTask.php | 43 ----- app/Console/Tasks/UpgradeTask.php | 12 +- app/Models/Online.php | 7 - app/Models/UserSession.php | 93 +++++++++++ app/Models/UserToken.php | 93 +++++++++++ app/Providers/Annotation.php | 7 +- app/Providers/MetaData.php | 7 +- app/Providers/Session.php | 4 +- app/Repos/UserSession.php | 24 +++ app/Repos/UserToken.php | 24 +++ app/Services/Auth/Api.php | 106 ++++++++---- app/Services/Auth/Home.php | 48 ++++++ app/Traits/Client.php | 8 + config/config.default.php | 52 +----- .../20210102041941_schema_202101021220.php | 158 ++++++++++++++++++ 15 files changed, 541 insertions(+), 145 deletions(-) delete mode 100644 app/Console/Tasks/CleanSessionTask.php create mode 100644 app/Models/UserSession.php create mode 100644 app/Models/UserToken.php create mode 100644 app/Repos/UserSession.php create mode 100644 app/Repos/UserToken.php create mode 100644 db/migrations/20210102041941_schema_202101021220.php diff --git a/app/Console/Tasks/CleanSessionTask.php b/app/Console/Tasks/CleanSessionTask.php deleted file mode 100644 index 7adbff5a..00000000 --- a/app/Console/Tasks/CleanSessionTask.php +++ /dev/null @@ -1,43 +0,0 @@ -getConfig(); - $redis = $this->getRedis(); - - $redis->select($config->path('session.db')); - - $keys = $this->querySessionKeys(10000); - - if (count($keys) == 0) return; - - $lifetime = $config->path('session.lifetime'); - - foreach ($keys as $key) { - $ttl = $redis->ttl($key); - $content = $redis->get($key); - if (empty($content) && $ttl < $lifetime * 0.5) { - $redis->del($key); - } - } - } - - /** - * 查找待清理会话 - * - * @param int $limit - * @return array - */ - protected function querySessionKeys($limit) - { - $cache = $this->getCache(); - - return $cache->queryKeys('_PHCR', $limit); - } - -} diff --git a/app/Console/Tasks/UpgradeTask.php b/app/Console/Tasks/UpgradeTask.php index 8700703d..0dbfa0dc 100644 --- a/app/Console/Tasks/UpgradeTask.php +++ b/app/Console/Tasks/UpgradeTask.php @@ -42,13 +42,9 @@ class UpgradeTask extends Task */ public function resetAnnotationAction() { - $config = $this->getConfig(); $redis = $this->getRedis(); - $dbIndex = $config->path('annotation.db'); - $statsKey = $config->path('annotation.statsKey'); - - $redis->select($dbIndex); + $statsKey = '_ANNOTATION_'; $keys = $redis->sMembers($statsKey); @@ -70,13 +66,9 @@ class UpgradeTask extends Task */ public function resetMetadataAction() { - $config = $this->getConfig(); $redis = $this->getRedis(); - $dbIndex = $config->path('metadata.db'); - $statsKey = $config->path('metadata.statsKey'); - - $redis->select($dbIndex); + $statsKey = '_METADATA_'; $keys = $redis->sMembers($statsKey); diff --git a/app/Models/Online.php b/app/Models/Online.php index 8d181b09..e00c62a2 100644 --- a/app/Models/Online.php +++ b/app/Models/Online.php @@ -19,13 +19,6 @@ class Online extends Model */ public $user_id; - /** - * 计划编号 - * - * @var string - */ - public $date; - /** * 客户端类型 * diff --git a/app/Models/UserSession.php b/app/Models/UserSession.php new file mode 100644 index 00000000..1e50498e --- /dev/null +++ b/app/Models/UserSession.php @@ -0,0 +1,93 @@ +addBehavior( + new SoftDelete([ + 'field' => 'deleted', + 'value' => 1, + ]) + ); + } + + public function beforeCreate() + { + $this->create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} diff --git a/app/Models/UserToken.php b/app/Models/UserToken.php new file mode 100644 index 00000000..8a1ee4d3 --- /dev/null +++ b/app/Models/UserToken.php @@ -0,0 +1,93 @@ +addBehavior( + new SoftDelete([ + 'field' => 'deleted', + 'value' => 1, + ]) + ); + } + + public function beforeCreate() + { + $this->create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} diff --git a/app/Providers/Annotation.php b/app/Providers/Annotation.php index 3e524fcf..43e1e6b5 100644 --- a/app/Providers/Annotation.php +++ b/app/Providers/Annotation.php @@ -23,13 +23,14 @@ class Annotation extends Provider if ($config->get('env') == ENV_DEV) { $annotations = new MemoryAnnotations(); } else { + $statsKey = '_ANNOTATION_'; $annotations = new RedisAnnotations([ 'host' => $config->path('redis.host'), 'port' => $config->path('redis.port'), 'auth' => $config->path('redis.auth'), - 'index' => $config->path('annotation.db'), - 'lifetime' => $config->path('annotation.lifetime'), - 'statsKey' => $config->path('annotation.statsKey'), + 'lifetime' => $config->path('annotation.lifetime') ?: 30 * 86400, + 'prefix' => $statsKey . ':', + 'statsKey' => $statsKey, ]); } diff --git a/app/Providers/MetaData.php b/app/Providers/MetaData.php index 25a62363..cea48ce0 100644 --- a/app/Providers/MetaData.php +++ b/app/Providers/MetaData.php @@ -23,13 +23,14 @@ class MetaData extends Provider if ($config->get('env') == ENV_DEV) { $metaData = new MemoryMetaData(); } else { + $statsKey = '_METADATA_'; $metaData = new RedisMetaData([ 'host' => $config->path('redis.host'), 'port' => $config->path('redis.port'), 'auth' => $config->path('redis.auth'), - 'index' => $config->path('metadata.db'), - 'statsKey' => $config->path('metadata.statsKey'), - 'lifetime' => $config->path('metadata.lifetime'), + 'lifetime' => $config->path('metadata.lifetime') ?: 30 * 86400, + 'prefix' => $statsKey . ':', + 'statsKey' => $statsKey, ]); } diff --git a/app/Providers/Session.php b/app/Providers/Session.php index 995717e0..f8a11902 100644 --- a/app/Providers/Session.php +++ b/app/Providers/Session.php @@ -23,8 +23,8 @@ class Session extends Provider 'host' => $config->path('redis.host'), 'port' => $config->path('redis.port'), 'auth' => $config->path('redis.auth'), - 'index' => $config->path('session.db'), - 'lifetime' => $config->path('session.lifetime'), + 'lifetime' => $config->path('session.lifetime') ?: 24 * 3600, + 'prefix' => '_SESSION_:', ]); $session->start(); diff --git a/app/Repos/UserSession.php b/app/Repos/UserSession.php new file mode 100644 index 00000000..be56e73c --- /dev/null +++ b/app/Repos/UserSession.php @@ -0,0 +1,24 @@ +where('user_id = :user_id:', ['user_id' => $userId]) + ->andWhere('deleted = 0') + ->execute(); + } + +} diff --git a/app/Repos/UserToken.php b/app/Repos/UserToken.php new file mode 100644 index 00000000..70da5427 --- /dev/null +++ b/app/Repos/UserToken.php @@ -0,0 +1,24 @@ +where('user_id = :user_id:', ['user_id' => $userId]) + ->andWhere('deleted = 0') + ->execute(); + } + +} diff --git a/app/Services/Auth/Api.php b/app/Services/Auth/Api.php index fbc76eae..e1cf4a2c 100644 --- a/app/Services/Auth/Api.php +++ b/app/Services/Auth/Api.php @@ -3,70 +3,114 @@ namespace App\Services\Auth; use App\Models\User as UserModel; +use App\Models\UserToken as UserTokenModel; +use App\Repos\UserToken as UserTokenRepo; use App\Services\Auth as AuthService; -use Lcobucci\JWT\Builder as JwtBuilder; -use Lcobucci\JWT\Parser as JwtParser; -use Lcobucci\JWT\Signer\Hmac\Sha256 as JwtSingerSha256; -use Lcobucci\JWT\Signer\Key as JwtSingerKey; -use Lcobucci\JWT\ValidationData as JwtValidationData; +use App\Traits\Client as ClientTrait; class Api extends AuthService { + use ClientTrait; + public function saveAuthInfo(UserModel $user) { - $builder = new JwtBuilder(); + $token = $this->generateToken($user->id); - $config = $this->getConfig(); + $this->logoutOtherClients($user->id); - $expireTime = time() + $config->path('jwt.lifetime'); + $this->createUserToken($user->id, $token); - $builder->expiresAt($expireTime); - $builder->withClaim('user_id', $user->id); - $builder->withClaim('user_name', $user->name); + $cache = $this->getCache(); - $singer = new JwtSingerSha256(); + $key = $this->getTokenCacheKey($token); - $key = new JwtSingerKey($config->path('jwt.key')); + $authInfo = [ + 'id' => $user->id, + 'name' => $user->name, + ]; - $token = $builder->getToken($singer, $key); + $config = $this->getConfig(); - return $token->__toString(); + $lifetime = $config->path('token.lifetime') ?: 7 * 86400; + + $cache->save($key, $authInfo, $lifetime); + + return $token; } public function clearAuthInfo() { + $token = $this->request->getHeader('X-Token'); + + if (empty($token)) return null; + $cache = $this->getCache(); + + $key = $this->getTokenCacheKey($token); + + $cache->delete($key); } public function getAuthInfo() { - $authToken = $this->request->getHeader('X-Token'); + $token = $this->request->getHeader('X-Token'); - if (!$authToken) return null; + if (empty($token)) return null; - $config = $this->getConfig(); + $cache = $this->getCache(); - $parser = new JWTParser(); + $key = $this->getTokenCacheKey($token); - $token = $parser->parse($authToken); + $authInfo = $cache->get($key); - $data = new JWTValidationData(time(), $config->path('jwt.leeway')); + return $authInfo ?: null; + } - if (!$token->validate($data)) { - return null; - } + protected function createUserToken($userId, $token) + { + $userToken = new UserTokenModel(); + + $userToken->user_id = $userId; + $userToken->token = $token; + $userToken->client_type = $this->getClientType(); + $userToken->client_ip = $this->getClientIp(); - $singer = new JwtSingerSha256(); + $userToken->create(); + } + + protected function logoutOtherClients($userId) + { + $repo = new UserTokenRepo(); + + $records = $repo->findByUserId($userId); - if (!$token->verify($singer, $config->path('jwt.key'))) { - return null; + $cache = $this->getCache(); + + $clientType = $this->getClientType(); + + if ($records->count() == 0) { + return; } - return [ - 'id' => $token->getClaim('user_id'), - 'name' => $token->getClaim('user_name'), - ]; + foreach ($records as $record) { + if ($record->client_type == $clientType) { + $record->deleted = 1; + $record->update(); + $key = $this->getTokenCacheKey($record->token); + $cache->delete($key); + } + } + } + + protected function generateToken($userId) + { + return md5(uniqid() . time() . $userId); + } + + protected function getTokenCacheKey($token) + { + return "_PHCR_TOKEN_:{$token}"; } } diff --git a/app/Services/Auth/Home.php b/app/Services/Auth/Home.php index dd8452da..6cafc47d 100644 --- a/app/Services/Auth/Home.php +++ b/app/Services/Auth/Home.php @@ -3,13 +3,24 @@ namespace App\Services\Auth; use App\Models\User as UserModel; +use App\Models\UserSession as UserSessionModel; +use App\Repos\UserSession as UserSessionRepo; use App\Services\Auth as AuthService; +use App\Traits\Client as ClientTrait; class Home extends AuthService { + use ClientTrait; + public function saveAuthInfo(UserModel $user) { + $sessionId = $this->session->getId(); + + $this->logoutOtherClients($user->id); + + $this->createUserSession($user->id, $sessionId); + $authKey = $this->getAuthKey(); $authInfo = [ @@ -41,4 +52,41 @@ class Home extends AuthService return 'home_auth_info'; } + protected function createUserSession($userId, $sessionId) + { + $userSession = new UserSessionModel(); + + $userSession->user_id = $userId; + $userSession->session_id = $sessionId; + $userSession->client_type = $this->getClientType(); + $userSession->client_ip = $this->getClientIp(); + + $userSession->create(); + } + + protected function logoutOtherClients($userId) + { + $cache = $this->getCache(); + + $repo = new UserSessionRepo(); + + $records = $repo->findByUserId($userId); + + if ($records->count() == 0) { + return; + } + + foreach ($records as $record) { + $record->deleted = 1; + $record->update(); + $key = $this->getSessionCacheKey($record->session_id); + $cache->delete($key); + } + } + + protected function getSessionCacheKey($sessionId) + { + return "_PHCR_SESSION_:{$sessionId}"; + } + } diff --git a/app/Traits/Client.php b/app/Traits/Client.php index 678a3415..ee9bd93a 100644 --- a/app/Traits/Client.php +++ b/app/Traits/Client.php @@ -27,6 +27,14 @@ trait Client */ $request = Di::getDefault()->get('request'); + $platform = $request->getHeader('X-Platform'); + + $types = array_flip(ClientModel::types()); + + if (!empty($platform) && isset($types[$platform])) { + return $types[$platform]; + } + $userAgent = $request->getServer('HTTP_USER_AGENT'); $result = new BrowserParser($userAgent); diff --git a/config/config.default.php b/config/config.default.php index dcdf4097..403ef71e 100644 --- a/config/config.default.php +++ b/config/config.default.php @@ -83,70 +83,30 @@ $config['redis']['port'] = 6379; $config['redis']['auth'] = '1qaz2wsx3edc'; /** - * redis库编号 - */ -$config['cache']['db'] = 0; - -/** - * 有效期(秒) + * 缓存有效期(秒) */ $config['cache']['lifetime'] = 24 * 3600; /** - * redis库编号 - */ -$config['session']['db'] = 1; - -/** - * 有效期(秒) + * 会话有效期(秒) */ $config['session']['lifetime'] = 24 * 3600; /** - * redis库编号 + * 令牌有效期(秒) */ -$config['metadata']['db'] = 2; +$config['token']['lifetime'] = 7 * 86400; /** - * 有效期(秒) + * 元数据有效期(秒) */ $config['metadata']['lifetime'] = 7 * 86400; /** - * statsKey - */ -$config['metadata']['statsKey'] = '_METADATA_'; - -/** - * redis库编号 - */ -$config['annotation']['db'] = 2; - -/** - * 有效期(秒) + * 注解有效期(秒) */ $config['annotation']['lifetime'] = 7 * 86400; -/** - * statsKey - */ -$config['annotation']['statsKey'] = '_ANNOTATION_'; - -/** - * 密钥 - */ -$config['jwt']['key'] = 'fu6ckEc8pv8k5K7m'; - -/** - * 有效期(秒) - */ -$config['jwt']['lifetime'] = 7 * 86400; - -/** - * 回旋时间(秒) - */ -$config['jwt']['leeway'] = 30; - /** * 允许跨域 */ diff --git a/db/migrations/20210102041941_schema_202101021220.php b/db/migrations/20210102041941_schema_202101021220.php new file mode 100644 index 00000000..1483af11 --- /dev/null +++ b/db/migrations/20210102041941_schema_202101021220.php @@ -0,0 +1,158 @@ +table('kg_user_session', [ + 'id' => false, + 'primary_key' => ['id'], + 'engine' => 'InnoDB', + 'encoding' => 'utf8mb4', + 'collation' => 'utf8mb4_general_ci', + 'comment' => '', + 'row_format' => 'DYNAMIC', + ]) + ->addColumn('id', 'integer', [ + 'null' => false, + 'limit' => MysqlAdapter::INT_REGULAR, + 'identity' => 'enable', + 'comment' => '主键编号', + ]) + ->addColumn('user_id', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '用户编号', + 'after' => 'id', + ]) + ->addColumn('session_id', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 64, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '会话编号', + 'after' => 'user_id', + ]) + ->addColumn('client_type', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '终端类型', + 'after' => 'session_id', + ]) + ->addColumn('client_ip', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 64, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '终端IP', + 'after' => 'client_type', + ]) + ->addColumn('deleted', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '删除标识', + 'after' => 'client_ip', + ]) + ->addColumn('create_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '创建时间', + 'after' => 'deleted', + ]) + ->addColumn('update_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '更新时间', + 'after' => 'create_time', + ]) + ->addIndex(['user_id'], [ + 'name' => 'user_id', + 'unique' => false, + ]) + ->create(); + $this->table('kg_user_token', [ + 'id' => false, + 'primary_key' => ['id'], + 'engine' => 'InnoDB', + 'encoding' => 'utf8mb4', + 'collation' => 'utf8mb4_general_ci', + 'comment' => '', + 'row_format' => 'DYNAMIC', + ]) + ->addColumn('id', 'integer', [ + 'null' => false, + 'limit' => MysqlAdapter::INT_REGULAR, + 'identity' => 'enable', + 'comment' => '主键编号', + ]) + ->addColumn('user_id', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '用户编号', + 'after' => 'id', + ]) + ->addColumn('token', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 64, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '身份令牌', + 'after' => 'user_id', + ]) + ->addColumn('client_type', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '终端类型', + 'after' => 'token', + ]) + ->addColumn('client_ip', 'string', [ + 'null' => false, + 'default' => '', + 'limit' => 64, + 'collation' => 'utf8mb4_general_ci', + 'encoding' => 'utf8mb4', + 'comment' => '终端IP', + 'after' => 'client_type', + ]) + ->addColumn('deleted', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '删除标识', + 'after' => 'client_ip', + ]) + ->addColumn('create_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '创建时间', + 'after' => 'deleted', + ]) + ->addColumn('update_time', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'comment' => '更新时间', + 'after' => 'create_time', + ]) + ->addIndex(['user_id'], [ + 'name' => 'user_id', + 'unique' => false, + ]) + ->create(); + } + +} -- Gitee From ce86bc49a7cff81b8490007b1846b7dbbd9a07c8 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 2 Jan 2021 14:41:43 +0800 Subject: [PATCH 25/89] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=99=90=E5=88=B6?= =?UTF-8?q?=E5=85=B1=E4=BA=AB=E5=B8=90=E5=8F=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Services/Auth/Api.php | 5 ++++- app/Services/Auth/Home.php | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/Services/Auth/Api.php b/app/Services/Auth/Api.php index e1cf4a2c..6a13f3df 100644 --- a/app/Services/Auth/Api.php +++ b/app/Services/Auth/Api.php @@ -17,7 +17,10 @@ class Api extends AuthService { $token = $this->generateToken($user->id); - $this->logoutOtherClients($user->id); + /** + * demo版本不限制多人登录 + */ + // $this->logoutOtherClients($user->id); $this->createUserToken($user->id, $token); diff --git a/app/Services/Auth/Home.php b/app/Services/Auth/Home.php index 6cafc47d..be023728 100644 --- a/app/Services/Auth/Home.php +++ b/app/Services/Auth/Home.php @@ -17,7 +17,10 @@ class Home extends AuthService { $sessionId = $this->session->getId(); - $this->logoutOtherClients($user->id); + /** + * demo版本不限制多人登录 + */ + // $this->logoutOtherClients($user->id); $this->createUserSession($user->id, $sessionId); -- Gitee From 94affaddf6194d8eb45aa07434a24101a6cc3d0d Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 2 Jan 2021 16:51:47 +0800 Subject: [PATCH 26/89] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E4=B8=AD=E6=97=A0=E7=AC=A6=E5=8F=B7=E6=95=B4?= =?UTF-8?q?=E5=9E=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - composer.json | 2 +- composer.lock | 677 +- db/migrations/20200827063842_init_table.php | 381 +- .../20201004095647_create_online_table.php | 10 +- .../20201205091213_create_connect_table.php | 10 +- .../20201212102844_schema_202012121830.php | 12 +- .../20201227081614_schema_202012271615.php | 1 + .../20210102041941_schema_202101021220.php | 12 + db/migrations/schema.php | 16169 ++++++++++++++++ 10 files changed, 16928 insertions(+), 347 deletions(-) create mode 100644 db/migrations/schema.php diff --git a/.gitignore b/.gitignore index aff1e894..bf6d78e4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ /config/xs.user.ini /config/alipay/*.crt /config/wxpay/*.pem -/db/migrations/schema.php /public/robots.txt /public/sitemap.xml /public/h5 diff --git a/composer.json b/composer.json index fe283e37..47cf7fd2 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "overtrue/wechat": "^4.2" }, "require-dev": { - "odan/phinx-migrations-generator": "^5.1", + "odan/phinx-migrations-generator": "^5.3", "phalcon/ide-stubs": "^3.4" }, "repositories": { diff --git a/composer.lock b/composer.lock index d6cb71b6..ab593b73 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "60ff0e1868be7414a1b31d397ced7fbd", + "content-hash": "09a618cffed2c4cfb593c0a791c19b3f", "packages": [ { "name": "aferrandini/phpqrcode", @@ -15,16 +15,16 @@ "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46" }, "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aferrandini/PHPQRCode/zipball/3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", - "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "type": "zip", + "url": "https://api.github.com/repos/aferrandini/PHPQRCode/zipball/3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", + "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] }, "require": { "php": ">=5.3.0" @@ -46,16 +46,16 @@ "homepage": "http://www.ferrandini.com/", "role": "Developer" } - ], - "description": "PHPQRCode porting and changed for PHP 5.3 compatibility", - "homepage": "https://github.com/aferrandini/PHPQRCode", - "keywords": [ - "barcode", - "php", - "qrcode" - ], - "abandoned": "endroid/qr-code", - "time": "2013-07-08T09:39:08+00:00" + ], + "description": "PHPQRCode porting and changed for PHP 5.3 compatibility", + "homepage": "https://github.com/aferrandini/PHPQRCode", + "keywords": [ + "barcode", + "php", + "qrcode" + ], + "abandoned": "endroid/qr-code", + "time": "2013-07-08T09:39:08+00:00" }, { "name": "cakephp/core", @@ -334,16 +334,16 @@ "email": "guilhermeblanco@gmail.com" }, { - "name": "Roman Borschel", - "email": "roman@code-factory.org" + "name": "Roman Borschel", + "email": "roman@code-factory.org" }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", "keywords": [ "annotations", "docblock", @@ -418,16 +418,16 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92dd169c32f6f55ba570c309d83f5209cefb5e23", - "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { + "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { "doctrine/lexer": "^1.0.1", "php": ">= 5.5" }, @@ -1066,16 +1066,16 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", "keywords": [ "cron", @@ -1242,16 +1242,16 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { "php": "^7" }, "require-dev": { @@ -1399,15 +1399,15 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Phalcon Team", - "email": "team@phalconphp.com", - "homepage": "https://phalconphp.com/en/team" - }, - { - "name": "Contributors", - "homepage": "https://github.com/phalcon/incubator/graphs/contributors" - } + { + "name": "Phalcon Team", + "email": "team@phalconphp.com", + "homepage": "https://phalconphp.com/en/team" + }, + { + "name": "Contributors", + "homepage": "https://github.com/phalcon/incubator/graphs/contributors" + } ], "description": "Adapters, prototypes or functionality that can be potentially incorporated to the C-framework.", "homepage": "https://phalconphp.com", @@ -1488,16 +1488,16 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { "php": ">=5.3.0" }, "type": "library", @@ -1707,16 +1707,16 @@ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", "shasum": "", "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } ] }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", + "require": { + "php": ">=5.3.0" + }, + "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" @@ -1738,14 +1738,14 @@ } ], "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "time": "2017-10-23T01:57:42+00:00" + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" }, { "name": "qcloud/cos-sdk-v5", @@ -2026,15 +2026,15 @@ "license": [ "MIT" ], - "authors": [ - { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], "description": "Swiftmailer, free feature-rich PHP mailer", "homepage": "https://swiftmailer.symfony.com", "keywords": [ @@ -2241,16 +2241,16 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/config/zipball/cf63f0613a6c6918e96db39c07a43b01e19a0773", - "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { + "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", @@ -2403,15 +2403,15 @@ "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://github.com/fabpot", + "type": "github" }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2020-07-06T13:18:39+00:00" + "time": "2020-07-06T13:18:39+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2433,16 +2433,16 @@ } ] }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", "url": "https://github.com/symfony/contracts" } }, @@ -2473,16 +2473,16 @@ "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://github.com/fabpot", + "type": "github" }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], "time": "2020-09-07T11:33:47+00:00" - }, + }, { "name": "symfony/event-dispatcher", "version": "v4.4.17", @@ -2503,16 +2503,16 @@ } ] }, - "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" - }, - "conflict": { - "symfony/dependency-injection": "<3.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" + "require": { + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" }, "require-dev": { "psr/log": "~1.0", @@ -2541,16 +2541,16 @@ "license": [ "MIT" ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", "funding": [ @@ -2589,23 +2589,23 @@ } ] }, - "require": { - "php": ">=7.1.3" - }, - "suggest": { - "psr/event-dispatcher": "", - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, + "require": { + "php": ">=7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, "autoload": { "psr-4": { "Symfony\\Contracts\\EventDispatcher\\": "" @@ -2615,16 +2615,16 @@ "license": [ "MIT" ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], "description": "Generic abstractions related to dispatching event", "homepage": "https://symfony.com", "keywords": [ @@ -2651,16 +2651,16 @@ ], "time": "2020-07-06T13:19:58+00:00" }, - { - "name": "symfony/filesystem", - "version": "v5.1.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "6e4320f06d5f2cce0d96530162491f4465179157" - }, - "dist": { - "type": "zip", + { + "name": "symfony/filesystem", + "version": "v5.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "6e4320f06d5f2cce0d96530162491f4465179157" + }, + "dist": { + "type": "zip", "url": "https://api.github.com/repos/symfony/filesystem/zipball/6e4320f06d5f2cce0d96530162491f4465179157", "reference": "6e4320f06d5f2cce0d96530162491f4465179157", "shasum": "", @@ -2711,16 +2711,16 @@ "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://github.com/fabpot", + "type": "github" }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2020-05-30T20:35:19+00:00" - }, + "time": "2020-05-30T20:35:19+00:00" + }, { "name": "symfony/http-foundation", "version": "v5.2.0", @@ -2741,16 +2741,16 @@ } ] }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0" }, "suggest": { @@ -3112,15 +3112,15 @@ "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://github.com/fabpot", + "type": "github" }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2020-07-14T12:35:20+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -3142,16 +3142,16 @@ } ] }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3439,15 +3439,15 @@ "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://github.com/fabpot", + "type": "github" }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2020-07-14T12:35:20+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-php80", @@ -3469,16 +3469,16 @@ } ] }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, @@ -3520,10 +3520,10 @@ "shim" ], "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, { "url": "https://github.com/fabpot", "type": "github" @@ -3643,17 +3643,17 @@ } ] }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" }, "thanks": { "name": "symfony/contracts", @@ -3690,10 +3690,10 @@ "standards" ], "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, { "url": "https://github.com/fabpot", "type": "github" @@ -3793,16 +3793,16 @@ "reference": "a3b3054262e48776e8014d5e385a8932b0102f29" }, "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/a3b3054262e48776e8014d5e385a8932b0102f29", - "reference": "a3b3054262e48776e8014d5e385a8932b0102f29", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "type": "zip", + "url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/a3b3054262e48776e8014d5e385a8932b0102f29", + "reference": "a3b3054262e48776e8014d5e385a8932b0102f29", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] }, "require": { "guzzlehttp/guzzle": "^6.3", @@ -4192,40 +4192,41 @@ } ], "packages-dev": [ - { - "name": "odan/phinx-migrations-generator", - "version": "5.1.2", - "source": { - "type": "git", - "url": "https://github.com/odan/phinx-migrations-generator.git", - "reference": "f3cb7cc6bc7eb22e85f34f229b6d476e96d99c73" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/odan/phinx-migrations-generator/zipball/f3cb7cc6bc7eb22e85f34f229b6d476e96d99c73", - "reference": "f3cb7cc6bc7eb22e85f34f229b6d476e96d99c73", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, + { + "name": "odan/phinx-migrations-generator", + "version": "5.3.2", + "source": { + "type": "git", + "url": "https://github.com/odan/phinx-migrations-generator.git", + "reference": "2d3620f8251838b53717f7a43a348de31e9d451c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/odan/phinx-migrations-generator/zipball/2d3620f8251838b53717f7a43a348de31e9d451c", + "reference": "2d3620f8251838b53717f7a43a348de31e9d451c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, "require": { - "ext-json": "*", - "ext-pdo": "*", - "php": "^7.2", - "riimu/kit-phpencoder": "^2.4", - "robmorgan/phinx": "^0.12", - "symfony/console": "^2.8 || ^3.0 || ^4.0 || ^5.0" + "ext-json": "*", + "ext-pdo": "*", + "php": "^7.2", + "riimu/kit-phpencoder": "^2.4", + "robmorgan/phinx": "^0.12", + "symfony/console": "^2.8 || ^3.0 || ^4.0 || ^5.0", + "symfony/polyfill-php73": "^1.18" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16", - "overtrue/phplint": "^1.1", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^8 || ^9", - "squizlabs/php_codesniffer": "^3.4" + "friendsofphp/php-cs-fixer": "^2.16", + "overtrue/phplint": "^1.1 || ^2.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^8 || ^9", + "squizlabs/php_codesniffer": "^3.4" }, "bin": [ "./bin/phinx-migrations" @@ -4240,18 +4241,22 @@ "license": [ "MIT" ], - "description": "Migration generator for Phinx", - "homepage": "https://github.com/odan/phinx-migrations-generator", - "keywords": [ - "database", - "generator", - "migration", - "migrations", - "mysql", - "phinx" - ], - "time": "2020-06-15T19:36:35+00:00" + "description": "Migration generator for Phinx", + "homepage": "https://github.com/odan/phinx-migrations-generator", + "keywords": [ + "database", + "generator", + "migration", + "migrations", + "mysql", + "phinx" + ], + "support": { + "issues": "https://github.com/odan/phinx-migrations-generator/issues", + "source": "https://github.com/odan/phinx-migrations-generator/tree/5.3.2" }, + "time": "2020-12-30T23:59:57+00:00" + }, { "name": "phalcon/ide-stubs", "version": "v3.4.3", @@ -4262,15 +4267,15 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phalcon/ide-stubs/zipball/65144f2b0fad32b182ccb062b1efc1b4edea5d44", - "reference": "65144f2b0fad32b182ccb062b1efc1b4edea5d44", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "url": "https://api.github.com/repos/phalcon/ide-stubs/zipball/65144f2b0fad32b182ccb062b1efc1b4edea5d44", + "reference": "65144f2b0fad32b182ccb062b1efc1b4edea5d44", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] }, "require": { "php": ">=5.3.0" @@ -4287,16 +4292,16 @@ "homepage": "https://phalconphp.com/en/team" }, { - "name": "Contributors", - "homepage": "https://github.com/phalcon/ide-stubs/graphs/contributors" - } - ], - "description": "The most complete Phalcon Framework IDE stubs library which enables autocompletion in modern IDEs.", - "homepage": "https://phalconphp.com", - "keywords": [ - "Devtools", - "Eclipse", - "autocomplete", + "name": "Contributors", + "homepage": "https://github.com/phalcon/ide-stubs/graphs/contributors" + } + ], + "description": "The most complete Phalcon Framework IDE stubs library which enables autocompletion in modern IDEs.", + "homepage": "https://phalconphp.com", + "keywords": [ + "Devtools", + "Eclipse", + "autocomplete", "ide", "netbeans", "phalcon", diff --git a/db/migrations/20200827063842_init_table.php b/db/migrations/20200827063842_init_table.php index 34013cf5..456501ef 100644 --- a/db/migrations/20200827063842_init_table.php +++ b/db/migrations/20200827063842_init_table.php @@ -4,6 +4,7 @@ use Phinx\Db\Adapter\MysqlAdapter; class InitTable extends Phinx\Migration\AbstractMigration { + public function change() { $this->table('kg_account', [ @@ -18,6 +19,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -61,6 +63,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'salt', ]) @@ -68,6 +71,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -75,6 +79,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -99,6 +104,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键', ]) @@ -106,6 +112,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '3', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '类型', 'after' => 'id', ]) @@ -140,6 +147,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -147,6 +155,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) @@ -198,6 +207,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'req_data', ]) @@ -218,6 +228,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -225,6 +236,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '父级编号', 'after' => 'id', ]) @@ -232,6 +244,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '层级', 'after' => 'parent_id', ]) @@ -239,6 +252,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '类型', 'after' => 'level', ]) @@ -264,6 +278,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '30', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '优先级', 'after' => 'path', ]) @@ -271,6 +286,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'priority', ]) @@ -278,6 +294,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -285,6 +302,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '节点数', 'after' => 'deleted', ]) @@ -292,6 +310,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'child_count', ]) @@ -299,6 +318,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -315,6 +335,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -322,6 +343,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '父级编号', 'after' => 'id', ]) @@ -329,6 +351,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'parent_id', ]) @@ -354,6 +377,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '30', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '优先级', 'after' => 'summary', ]) @@ -361,6 +385,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '免费标识', 'after' => 'priority', ]) @@ -368,6 +393,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '模式类型', 'after' => 'free', ]) @@ -384,6 +410,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'attrs', ]) @@ -391,6 +418,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -398,6 +426,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课时数', 'after' => 'deleted', ]) @@ -405,6 +434,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '学员数', 'after' => 'lesson_count', ]) @@ -412,6 +442,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '咨询数', 'after' => 'user_count', ]) @@ -419,6 +450,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '点赞数', 'after' => 'consult_count', ]) @@ -426,6 +458,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'like_count', ]) @@ -433,6 +466,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -457,6 +491,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -464,6 +499,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -471,6 +507,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '标签编号', 'after' => 'chapter_id', ]) @@ -478,6 +515,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'user_id', ]) @@ -485,6 +523,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -492,6 +531,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -512,6 +552,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -519,6 +560,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -526,6 +568,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '章节编号', 'after' => 'course_id', ]) @@ -533,6 +576,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '开始时间', 'after' => 'chapter_id', ]) @@ -540,6 +584,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '结束时间', 'after' => 'start_time', ]) @@ -547,6 +592,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '100', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户限额', 'after' => 'end_time', ]) @@ -554,6 +600,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '2', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '状态标识', 'after' => 'user_limit', ]) @@ -561,6 +608,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'status', ]) @@ -568,6 +616,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -592,6 +641,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -599,6 +649,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -606,6 +657,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '章节编号', 'after' => 'course_id', ]) @@ -621,6 +673,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'content', ]) @@ -628,6 +681,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -652,6 +706,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -659,6 +714,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -666,6 +722,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '章节编号', 'after' => 'course_id', ]) @@ -673,6 +730,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '上传编号', 'after' => 'chapter_id', ]) @@ -680,6 +738,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -687,6 +746,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -711,6 +771,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -718,6 +779,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -725,6 +787,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '章节编号', 'after' => 'course_id', ]) @@ -732,6 +795,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'chapter_id', ]) @@ -739,6 +803,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '计划编号', 'after' => 'user_id', ]) @@ -746,6 +811,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '学习时长', 'after' => 'plan_id', ]) @@ -753,6 +819,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '播放位置', 'after' => 'duration', ]) @@ -760,6 +827,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '学习进度', 'after' => 'position', ]) @@ -767,6 +835,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '消费标识', 'after' => 'progress', ]) @@ -774,6 +843,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'consumed', ]) @@ -781,6 +851,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -788,6 +859,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -812,6 +884,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -819,6 +892,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -826,6 +900,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '章节编号', 'after' => 'course_id', ]) @@ -851,6 +926,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'file_transcode', ]) @@ -858,6 +934,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -886,6 +963,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -893,6 +971,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -900,6 +979,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '章节编号', 'after' => 'course_id', ]) @@ -907,6 +987,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'chapter_id', ]) @@ -932,6 +1013,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '评分', 'after' => 'answer', ]) @@ -939,6 +1021,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '优先级', 'after' => 'rating', ]) @@ -946,6 +1029,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '私密标识', 'after' => 'priority', ]) @@ -953,6 +1037,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'private', ]) @@ -960,6 +1045,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -967,6 +1053,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '点赞数', 'after' => 'deleted', ]) @@ -974,6 +1061,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '回复时间', 'after' => 'like_count', ]) @@ -981,6 +1069,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'reply_time', ]) @@ -988,6 +1077,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -1016,6 +1106,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1023,6 +1114,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '咨询编号', 'after' => 'id', ]) @@ -1030,6 +1122,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'consult_id', ]) @@ -1037,6 +1130,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'user_id', ]) @@ -1044,6 +1138,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -1051,6 +1146,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -1071,6 +1167,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1122,6 +1219,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '分类编号', 'after' => 'details', ]) @@ -1129,6 +1227,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '讲师编号', 'after' => 'category_id', ]) @@ -1152,6 +1251,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '12', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '学习期限', 'after' => 'vip_price', ]) @@ -1159,6 +1259,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '30', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '退款期限', 'after' => 'study_expiry', ]) @@ -1178,6 +1279,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '模型', 'after' => 'score', ]) @@ -1185,6 +1287,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '难度', 'after' => 'model', ]) @@ -1201,6 +1304,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'attrs', ]) @@ -1208,6 +1312,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -1215,6 +1320,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '学员数', 'after' => 'deleted', ]) @@ -1222,6 +1328,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课时数', 'after' => 'user_count', ]) @@ -1229,6 +1336,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '套餐数', 'after' => 'lesson_count', ]) @@ -1236,6 +1344,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '评价数', 'after' => 'package_count', ]) @@ -1243,6 +1352,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '咨询数', 'after' => 'review_count', ]) @@ -1250,6 +1360,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '收藏数', 'after' => 'consult_count', ]) @@ -1257,6 +1368,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'favorite_count', ]) @@ -1264,6 +1376,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -1280,6 +1393,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1287,6 +1401,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -1294,6 +1409,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '分类编号', 'after' => 'course_id', ]) @@ -1301,6 +1417,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'category_id', ]) @@ -1325,6 +1442,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1332,6 +1450,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -1339,6 +1458,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'course_id', ]) @@ -1346,6 +1466,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'user_id', ]) @@ -1353,6 +1474,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -1360,6 +1482,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -1384,6 +1507,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1391,6 +1515,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -1398,6 +1523,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '套餐编号', 'after' => 'course_id', ]) @@ -1405,6 +1531,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'package_id', ]) @@ -1429,6 +1556,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('course_id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '主键编号', ]) ->addColumn('rating', 'float', [ @@ -1459,6 +1587,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'rating3', ]) @@ -1466,6 +1595,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -1482,6 +1612,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1489,6 +1620,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -1496,6 +1628,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '相关编号', 'after' => 'course_id', ]) @@ -1503,6 +1636,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'related_id', ]) @@ -1523,6 +1657,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1530,6 +1665,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -1537,6 +1673,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '标签编号', 'after' => 'course_id', ]) @@ -1544,6 +1681,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'topic_id', ]) @@ -1568,6 +1706,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1575,6 +1714,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -1582,6 +1722,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'course_id', ]) @@ -1589,6 +1730,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '计划编号', 'after' => 'user_id', ]) @@ -1596,6 +1738,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '角色类型', 'after' => 'plan_id', ]) @@ -1603,6 +1746,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '来源类型', 'after' => 'role_type', ]) @@ -1610,6 +1754,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '学习时长', 'after' => 'source_type', ]) @@ -1617,6 +1762,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '学习进度', 'after' => 'duration', ]) @@ -1624,6 +1770,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '评价标识', 'after' => 'progress', ]) @@ -1631,6 +1778,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'reviewed', ]) @@ -1638,6 +1786,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '过期时间', 'after' => 'deleted', ]) @@ -1645,6 +1794,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'expiry_time', ]) @@ -1652,6 +1802,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -1680,6 +1831,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1687,6 +1839,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -1694,6 +1847,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '章节编号', 'after' => 'course_id', ]) @@ -1701,6 +1855,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'chapter_id', ]) @@ -1708,6 +1863,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '时间轴', 'after' => 'owner_id', ]) @@ -1733,6 +1889,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '字号', 'after' => 'color', ]) @@ -1740,6 +1897,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '位置', 'after' => 'size', ]) @@ -1747,6 +1905,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'position', ]) @@ -1754,6 +1913,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -1761,6 +1921,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -1768,6 +1929,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -1792,6 +1954,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1799,6 +1962,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '分类编号', 'after' => 'id', ]) @@ -1823,6 +1987,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '10', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '优先级', 'after' => 'content', ]) @@ -1830,6 +1995,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'priority', ]) @@ -1837,6 +2003,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -1844,6 +2011,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -1851,6 +2019,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -1867,6 +2036,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1874,6 +2044,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) @@ -1890,6 +2061,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '优先级', 'after' => 'name', ]) @@ -1897,6 +2069,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'priority', ]) @@ -1904,6 +2077,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '成员数', 'after' => 'deleted', ]) @@ -1911,6 +2085,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'user_count', ]) @@ -1918,6 +2093,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -1938,6 +2114,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -1945,6 +2122,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) @@ -1952,6 +2130,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '目标编号', 'after' => 'user_id', ]) @@ -1959,6 +2138,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '分组编号', 'after' => 'friend_id', ]) @@ -1966,6 +2146,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '消息数', 'after' => 'group_id', ]) @@ -1973,6 +2154,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'msg_count', ]) @@ -1980,6 +2162,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2000,6 +2183,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2007,6 +2191,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '群主编号', 'after' => 'id', ]) @@ -2014,15 +2199,15 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'owner_id', ]) - ->addColumn('type', 'string', [ + ->addColumn('type', 'integer', [ 'null' => false, - 'default' => 'course', - 'limit' => 30, - 'collation' => 'utf8mb4_general_ci', - 'encoding' => 'utf8mb4', + 'default' => '1', + 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '类型', 'after' => 'course_id', ]) @@ -2057,6 +2242,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'about', ]) @@ -2064,6 +2250,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -2071,6 +2258,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '成员数', 'after' => 'deleted', ]) @@ -2078,6 +2266,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '消息数', 'after' => 'user_count', ]) @@ -2085,6 +2274,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'msg_count', ]) @@ -2092,6 +2282,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2108,12 +2299,15 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', + 'comment' => '主键编号', ]) ->addColumn('group_id', 'integer', [ 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '群组编号', 'after' => 'id', ]) @@ -2121,6 +2315,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'group_id', ]) @@ -2128,6 +2323,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '优先级', 'after' => 'user_id', ]) @@ -2135,6 +2331,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'priority', ]) @@ -2142,6 +2339,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2170,6 +2368,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2186,6 +2385,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发送方', 'after' => 'chat_id', ]) @@ -2193,6 +2393,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '接收方', 'after' => 'sender_id', ]) @@ -2200,6 +2401,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '接收方类型', 'after' => 'receiver_id', ]) @@ -2216,6 +2418,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '已读标识', 'after' => 'content', ]) @@ -2223,6 +2426,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'viewed', ]) @@ -2230,6 +2434,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -2237,6 +2442,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2261,6 +2467,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2268,6 +2475,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发送方', 'after' => 'id', ]) @@ -2275,6 +2483,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '接收方', 'after' => 'sender_id', ]) @@ -2282,6 +2491,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '条目类型', 'after' => 'receiver_id', ]) @@ -2298,6 +2508,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '已读标识', 'after' => 'item_info', ]) @@ -2305,6 +2516,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'viewed', ]) @@ -2312,6 +2524,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -2319,6 +2532,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2344,6 +2558,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '主键编号', ]) ->addColumn('name', 'string', [ @@ -2395,6 +2610,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'status', ]) @@ -2402,6 +2618,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '好友数', 'after' => 'deleted', ]) @@ -2409,6 +2626,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '群组数', 'after' => 'friend_count', ]) @@ -2416,6 +2634,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'group_count', ]) @@ -2423,6 +2642,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2439,6 +2659,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2455,6 +2676,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'request_id', ]) @@ -2462,6 +2684,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课时编号', 'after' => 'course_id', ]) @@ -2469,6 +2692,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'chapter_id', ]) @@ -2476,6 +2700,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '计划编号', 'after' => 'user_id', ]) @@ -2483,6 +2708,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '学习时长', 'after' => 'plan_id', ]) @@ -2490,6 +2716,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '播放位置', 'after' => 'duration', ]) @@ -2497,6 +2724,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'position', ]) @@ -2504,6 +2732,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '终端类型', 'after' => 'deleted', ]) @@ -2520,6 +2749,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '活跃时间', 'after' => 'client_ip', ]) @@ -2527,6 +2757,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'active_time', ]) @@ -2534,6 +2765,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2558,6 +2790,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2565,6 +2798,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '父级编号', 'after' => 'id', ]) @@ -2572,6 +2806,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '层级', 'after' => 'parent_id', ]) @@ -2615,6 +2850,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '位置', 'after' => 'url', ]) @@ -2622,6 +2858,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '30', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '优先级', 'after' => 'position', ]) @@ -2629,6 +2866,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'priority', ]) @@ -2636,6 +2874,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -2643,6 +2882,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '子类数量', 'after' => 'deleted', ]) @@ -2650,6 +2890,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'child_count', ]) @@ -2657,6 +2898,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2673,6 +2915,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2706,6 +2949,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'amount', ]) @@ -2713,6 +2957,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '条目编号', 'after' => 'owner_id', ]) @@ -2720,6 +2965,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '条目类型', 'after' => 'item_id', ]) @@ -2736,6 +2982,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '终端类型', 'after' => 'item_info', ]) @@ -2752,6 +2999,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '状态标识', 'after' => 'client_ip', ]) @@ -2759,6 +3007,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'status', ]) @@ -2766,6 +3015,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -2773,6 +3023,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2801,6 +3052,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2808,6 +3060,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '订单编号', 'after' => 'id', ]) @@ -2815,6 +3068,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '订单状态', 'after' => 'order_id', ]) @@ -2822,6 +3076,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'status', ]) @@ -2842,6 +3097,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2883,6 +3139,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程数量', 'after' => 'vip_price', ]) @@ -2890,6 +3147,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'course_count', ]) @@ -2897,6 +3155,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -2904,6 +3163,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -2911,6 +3171,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2927,6 +3188,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2951,6 +3213,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'content', ]) @@ -2958,6 +3221,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -2965,6 +3229,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -2972,6 +3237,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -2988,6 +3254,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -2995,6 +3262,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) @@ -3002,6 +3270,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '订单编号', 'after' => 'owner_id', ]) @@ -3009,6 +3278,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '交易编号', 'after' => 'order_id', ]) @@ -3042,6 +3312,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '状态类型', 'after' => 'amount', ]) @@ -3049,6 +3320,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'status', ]) @@ -3074,6 +3346,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'review_note', ]) @@ -3081,6 +3354,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -3113,6 +3387,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3120,6 +3395,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '订单编号', 'after' => 'id', ]) @@ -3127,6 +3403,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '订单状态', 'after' => 'refund_id', ]) @@ -3134,6 +3411,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'status', ]) @@ -3154,6 +3432,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3161,6 +3440,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程编号', 'after' => 'id', ]) @@ -3168,6 +3448,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'course_id', ]) @@ -3217,6 +3498,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '匿名标识', 'after' => 'rating3', ]) @@ -3224,6 +3506,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'anonymous', ]) @@ -3231,6 +3514,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -3238,6 +3522,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '点赞数', 'after' => 'deleted', ]) @@ -3245,6 +3530,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'like_count', ]) @@ -3252,6 +3538,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -3276,6 +3563,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3283,6 +3571,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '评价编号', 'after' => 'id', ]) @@ -3290,6 +3579,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'review_id', ]) @@ -3297,6 +3587,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'user_id', ]) @@ -3304,6 +3595,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -3311,6 +3603,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -3354,6 +3647,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'price', ]) @@ -3361,6 +3655,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -3368,6 +3663,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -3384,6 +3680,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3391,6 +3688,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '2', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '类型', 'after' => 'id', ]) @@ -3424,6 +3722,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'routes', ]) @@ -3431,6 +3730,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '成员数量', 'after' => 'deleted', ]) @@ -3438,6 +3738,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'user_count', ]) @@ -3445,6 +3746,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -3461,6 +3763,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3507,6 +3810,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3550,6 +3854,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '平台类型', 'after' => 'content', ]) @@ -3557,6 +3862,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '目标类型', 'after' => 'platform', ]) @@ -3564,6 +3870,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '10', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '优先级', 'after' => 'target', ]) @@ -3571,6 +3878,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布状态', 'after' => 'priority', ]) @@ -3578,6 +3886,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -3585,6 +3894,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -3592,6 +3902,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -3608,12 +3919,15 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', + 'comment' => '主键编号', ]) ->addColumn('item_id', 'integer', [ 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '条目编号', 'after' => 'id', ]) @@ -3621,6 +3935,8 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, + 'comment' => '条目类型', 'after' => 'item_id', ]) ->addColumn('item_info', 'string', [ @@ -3629,36 +3945,47 @@ class InitTable extends Phinx\Migration\AbstractMigration 'limit' => 3000, 'collation' => 'utf8mb4_general_ci', 'encoding' => 'utf8mb4', + 'comment' => '条目内容', 'after' => 'item_type', ]) ->addColumn('status', 'integer', [ 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, + 'comment' => '状态', 'after' => 'item_info', ]) ->addColumn('priority', 'integer', [ 'null' => false, 'default' => '30', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, + 'comment' => '优先级', 'after' => 'status', ]) ->addColumn('try_count', 'integer', [ 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, + 'comment' => '重试数', 'after' => 'priority', ]) ->addColumn('create_time', 'integer', [ 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, + 'comment' => '创建时间', 'after' => 'try_count', ]) ->addColumn('update_time', 'integer', [ 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, + 'comment' => '更新时间', 'after' => 'create_time', ]) ->create(); @@ -3674,6 +4001,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3708,6 +4036,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程数量', 'after' => 'summary', ]) @@ -3715,6 +4044,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '发布标识', 'after' => 'course_count', ]) @@ -3722,6 +4052,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'published', ]) @@ -3729,6 +4060,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -3736,6 +4068,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -3752,6 +4085,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3759,6 +4093,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) @@ -3766,6 +4101,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '订单编号', 'after' => 'owner_id', ]) @@ -3799,6 +4135,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '平台类型', 'after' => 'amount', ]) @@ -3815,6 +4152,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '状态类型', 'after' => 'channel_sn', ]) @@ -3822,6 +4160,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'status', ]) @@ -3829,6 +4168,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -3836,6 +4176,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -3864,6 +4205,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3871,6 +4213,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '订单编号', 'after' => 'id', ]) @@ -3878,6 +4221,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '订单状态', 'after' => 'trade_id', ]) @@ -3885,6 +4229,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'status', ]) @@ -3905,6 +4250,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -3912,6 +4258,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '条目类型', 'after' => 'id', ]) @@ -3955,6 +4302,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '大小', 'after' => 'md5', ]) @@ -3962,6 +4310,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'size', ]) @@ -3969,6 +4318,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -3976,6 +4326,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -3997,6 +4348,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '主键编号', ]) ->addColumn('name', 'string', [ @@ -4048,6 +4400,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '3', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '性别', 'after' => 'area', ]) @@ -4055,6 +4408,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '会员标识', 'after' => 'gender', ]) @@ -4062,6 +4416,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '锁定标识', 'after' => 'vip', ]) @@ -4069,6 +4424,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'locked', ]) @@ -4076,6 +4432,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '教学角色', 'after' => 'deleted', ]) @@ -4083,6 +4440,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '后台角色', 'after' => 'edu_role', ]) @@ -4090,6 +4448,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '课程数', 'after' => 'admin_role', ]) @@ -4097,6 +4456,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '收藏数', 'after' => 'course_count', ]) @@ -4104,6 +4464,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '会员期限', 'after' => 'favorite_count', ]) @@ -4111,6 +4472,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '锁定期限', 'after' => 'vip_expiry_time', ]) @@ -4118,6 +4480,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '活跃时间', 'after' => 'lock_expiry_time', ]) @@ -4125,6 +4488,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'active_time', ]) @@ -4132,6 +4496,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -4152,6 +4517,7 @@ class InitTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -4168,6 +4534,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '有效期', 'after' => 'title', ]) @@ -4183,6 +4550,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'price', ]) @@ -4190,6 +4558,7 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -4197,9 +4566,11 @@ class InitTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) ->create(); } + } diff --git a/db/migrations/20201004095647_create_online_table.php b/db/migrations/20201004095647_create_online_table.php index 9a5e64fa..9f9438e7 100644 --- a/db/migrations/20201004095647_create_online_table.php +++ b/db/migrations/20201004095647_create_online_table.php @@ -4,6 +4,7 @@ use Phinx\Db\Adapter\MysqlAdapter; class CreateOnlineTable extends Phinx\Migration\AbstractMigration { + public function change() { $this->table('kg_online', [ @@ -18,6 +19,7 @@ class CreateOnlineTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -25,6 +27,7 @@ class CreateOnlineTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) @@ -32,6 +35,7 @@ class CreateOnlineTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '1', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '终端类型', 'after' => 'user_id', ]) @@ -48,6 +52,7 @@ class CreateOnlineTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '活跃时间', 'after' => 'client_ip', ]) @@ -55,6 +60,7 @@ class CreateOnlineTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'active_time', ]) @@ -62,6 +68,7 @@ class CreateOnlineTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -90,7 +97,7 @@ class CreateOnlineTable extends Phinx\Migration\AbstractMigration 'engine' => 'InnoDB', 'encoding' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', - 'comment' => '', + 'comment' => '主键编号', 'row_format' => 'DYNAMIC', ]) ->changeColumn('channel_sn', 'string', [ @@ -104,4 +111,5 @@ class CreateOnlineTable extends Phinx\Migration\AbstractMigration ]) ->save(); } + } diff --git a/db/migrations/20201205091213_create_connect_table.php b/db/migrations/20201205091213_create_connect_table.php index 4e0419da..4807e42e 100644 --- a/db/migrations/20201205091213_create_connect_table.php +++ b/db/migrations/20201205091213_create_connect_table.php @@ -4,6 +4,7 @@ use Phinx\Db\Adapter\MysqlAdapter; class CreateConnectTable extends Phinx\Migration\AbstractMigration { + public function change() { $this->table('kg_connect', [ @@ -18,6 +19,7 @@ class CreateConnectTable extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -25,13 +27,14 @@ class CreateConnectTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) ->addColumn('open_id', 'string', [ 'null' => false, 'default' => '', - 'limit' => 50, + 'limit' => 64, 'collation' => 'utf8mb4_general_ci', 'encoding' => 'utf8mb4', 'comment' => '开放ID', @@ -59,6 +62,7 @@ class CreateConnectTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '提供方', 'after' => 'open_avatar', ]) @@ -66,6 +70,7 @@ class CreateConnectTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'provider', ]) @@ -73,6 +78,7 @@ class CreateConnectTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -80,6 +86,7 @@ class CreateConnectTable extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -89,4 +96,5 @@ class CreateConnectTable extends Phinx\Migration\AbstractMigration ]) ->create(); } + } diff --git a/db/migrations/20201212102844_schema_202012121830.php b/db/migrations/20201212102844_schema_202012121830.php index 90512438..150219d3 100644 --- a/db/migrations/20201212102844_schema_202012121830.php +++ b/db/migrations/20201212102844_schema_202012121830.php @@ -4,6 +4,7 @@ use Phinx\Db\Adapter\MysqlAdapter; class Schema202012121830 extends Phinx\Migration\AbstractMigration { + public function change() { $this->table('kg_consult') @@ -11,6 +12,7 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '回复者编号', 'after' => 'owner_id', ]) @@ -19,7 +21,7 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration ->addColumn('union_id', 'string', [ 'null' => false, 'default' => '', - 'limit' => 50, + 'limit' => 64, 'collation' => 'utf8mb4_general_ci', 'encoding' => 'utf8mb4', 'comment' => 'union_id', @@ -46,6 +48,7 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -53,13 +56,14 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) ->addColumn('open_id', 'string', [ 'null' => false, 'default' => '', - 'limit' => 50, + 'limit' => 64, 'collation' => 'utf8mb4_general_ci', 'encoding' => 'utf8mb4', 'comment' => '开放ID', @@ -69,6 +73,7 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'open_id', ]) @@ -76,6 +81,7 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -83,6 +89,7 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -96,4 +103,5 @@ class Schema202012121830 extends Phinx\Migration\AbstractMigration ]) ->create(); } + } diff --git a/db/migrations/20201227081614_schema_202012271615.php b/db/migrations/20201227081614_schema_202012271615.php index d58b73ad..4624cd6d 100644 --- a/db/migrations/20201227081614_schema_202012271615.php +++ b/db/migrations/20201227081614_schema_202012271615.php @@ -12,6 +12,7 @@ class Schema202012271615 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '推荐标识', 'after' => 'attrs', ]) diff --git a/db/migrations/20210102041941_schema_202101021220.php b/db/migrations/20210102041941_schema_202101021220.php index 1483af11..62a38d8c 100644 --- a/db/migrations/20210102041941_schema_202101021220.php +++ b/db/migrations/20210102041941_schema_202101021220.php @@ -19,6 +19,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -26,6 +27,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) @@ -42,6 +44,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '终端类型', 'after' => 'session_id', ]) @@ -58,6 +61,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'client_ip', ]) @@ -65,6 +69,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -72,6 +77,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) @@ -92,6 +98,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration ->addColumn('id', 'integer', [ 'null' => false, 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'identity' => 'enable', 'comment' => '主键编号', ]) @@ -99,6 +106,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '用户编号', 'after' => 'id', ]) @@ -115,6 +123,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '终端类型', 'after' => 'token', ]) @@ -131,6 +140,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '删除标识', 'after' => 'client_ip', ]) @@ -138,6 +148,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '创建时间', 'after' => 'deleted', ]) @@ -145,6 +156,7 @@ class Schema202101021220 extends Phinx\Migration\AbstractMigration 'null' => false, 'default' => '0', 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, 'comment' => '更新时间', 'after' => 'create_time', ]) diff --git a/db/migrations/schema.php b/db/migrations/schema.php new file mode 100644 index 00000000..5dbbff50 --- /dev/null +++ b/db/migrations/schema.php @@ -0,0 +1,16169 @@ + + array( + 'DEFAULT_CHARACTER_SET_NAME' => 'utf8mb4', + 0 => 'utf8mb4', + 'DEFAULT_COLLATION_NAME' => 'utf8mb4_general_ci', + 1 => 'utf8mb4_general_ci', + ), + 'tables' => + array( + 'kg_account' => + array( + 'table' => + array( + 'table_name' => 'kg_account', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_account', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'email' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_account', + 'COLUMN_NAME' => 'email', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '邮箱', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'phone' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_account', + 'COLUMN_NAME' => 'phone', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '手机', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'password' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_account', + 'COLUMN_NAME' => 'password', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '32', + 'CHARACTER_OCTET_LENGTH' => '128', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(32)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '密码', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'salt' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_account', + 'COLUMN_NAME' => 'salt', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '32', + 'CHARACTER_OCTET_LENGTH' => '128', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(32)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '密盐', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_account', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_account', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_account', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_account', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'phone' => + array( + 1 => + array( + 'Table' => 'kg_account', + 'Non_unique' => '1', + 'Key_name' => 'phone', + 'Seq_in_index' => '1', + 'Column_name' => 'phone', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'email' => + array( + 1 => + array( + 'Table' => 'kg_account', + 'Non_unique' => '1', + 'Key_name' => 'email', + 'Seq_in_index' => '1', + 'Column_name' => 'email', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_area' => + array( + 'table' => + array( + 'table_name' => 'kg_area', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_area', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_area', + 'COLUMN_NAME' => 'type', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '3', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'code' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_area', + 'COLUMN_NAME' => 'code', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '编码', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_area', + 'COLUMN_NAME' => 'name', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_area', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_audit' => + array( + 'table' => + array( + 'table_name' => 'kg_audit', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_audit', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_audit', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_audit', + 'COLUMN_NAME' => 'user_name', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_ip' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_audit', + 'COLUMN_NAME' => 'user_ip', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户IP', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'req_route' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_audit', + 'COLUMN_NAME' => 'req_route', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '50', + 'CHARACTER_OCTET_LENGTH' => '200', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(50)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '请求路由', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'req_path' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_audit', + 'COLUMN_NAME' => 'req_path', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '请求路径', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'req_data' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_audit', + 'COLUMN_NAME' => 'req_data', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'text', + 'CHARACTER_MAXIMUM_LENGTH' => '65535', + 'CHARACTER_OCTET_LENGTH' => '65535', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'text', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '请求数据', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_audit', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_audit', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_audit', + 'Non_unique' => '1', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_category' => + array( + 'table' => + array( + 'table_name' => 'kg_category', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'parent_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'parent_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '父级编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'level' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'level', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '层级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'type', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'name', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'path' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'path', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '路径', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'priority' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'priority', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '30', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '优先级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'child_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'child_count', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '节点数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_category', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_category', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_chapter' => + array( + 'table' => + array( + 'table_name' => 'kg_chapter', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'parent_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'parent_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '父级编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'summary' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'summary', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '简介', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'priority' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'priority', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '30', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '优先级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'free' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'free', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '免费标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'model' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'model', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '模式类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'attrs' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'attrs', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '1000', + 'CHARACTER_OCTET_LENGTH' => '4000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(1000)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '扩展属性', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'resource_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'resource_count', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '资料数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'lesson_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'lesson_count', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课时数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'user_count', + 'ORDINAL_POSITION' => '14', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '学员数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'consult_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'consult_count', + 'ORDINAL_POSITION' => '15', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '咨询数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'like_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'like_count', + 'ORDINAL_POSITION' => '16', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '点赞数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '17', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '18', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_chapter', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_chapter', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'parent_id' => + array( + 1 => + array( + 'Table' => 'kg_chapter', + 'Non_unique' => '1', + 'Key_name' => 'parent_id', + 'Seq_in_index' => '1', + 'Column_name' => 'parent_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_chapter_like' => + array( + 'table' => + array( + 'table_name' => 'kg_chapter_like', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_like', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chapter_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_like', + 'COLUMN_NAME' => 'chapter_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_like', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标签编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_like', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_like', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_like', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_chapter_like', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chapter_user' => + array( + 1 => + array( + 'Table' => 'kg_chapter_like', + 'Non_unique' => '1', + 'Key_name' => 'chapter_user', + 'Seq_in_index' => '1', + 'Column_name' => 'chapter_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_chapter_like', + 'Non_unique' => '1', + 'Key_name' => 'chapter_user', + 'Seq_in_index' => '2', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_chapter_live' => + array( + 'table' => + array( + 'table_name' => 'kg_chapter_live', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_live', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_live', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chapter_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_live', + 'COLUMN_NAME' => 'chapter_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '章节编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'start_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_live', + 'COLUMN_NAME' => 'start_time', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '开始时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'end_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_live', + 'COLUMN_NAME' => 'end_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '结束时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_limit' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_live', + 'COLUMN_NAME' => 'user_limit', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '100', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户限额', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'status' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_live', + 'COLUMN_NAME' => 'status', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '2', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '状态标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_live', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_live', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_chapter_live', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_chapter_live', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chapter_id' => + array( + 1 => + array( + 'Table' => 'kg_chapter_live', + 'Non_unique' => '1', + 'Key_name' => 'chapter_id', + 'Seq_in_index' => '1', + 'Column_name' => 'chapter_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_chapter_read' => + array( + 'table' => + array( + 'table_name' => 'kg_chapter_read', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_read', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_read', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chapter_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_read', + 'COLUMN_NAME' => 'chapter_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '章节编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'content' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_read', + 'COLUMN_NAME' => 'content', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'text', + 'CHARACTER_MAXIMUM_LENGTH' => '65535', + 'CHARACTER_OCTET_LENGTH' => '65535', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'text', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_read', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_read', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_chapter_read', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chapter_id' => + array( + 1 => + array( + 'Table' => 'kg_chapter_read', + 'Non_unique' => '1', + 'Key_name' => 'chapter_id', + 'Seq_in_index' => '1', + 'Column_name' => 'chapter_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_chapter_read', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_chapter_user' => + array( + 'table' => + array( + 'table_name' => 'kg_chapter_user', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chapter_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'chapter_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '章节编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'plan_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'plan_id', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '计划编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'duration' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'duration', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '学习时长', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'position' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'position', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '播放位置', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'progress' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'progress', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '学习进度', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'consumed' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'consumed', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '消费标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_user', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_chapter_user', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chapter_user' => + array( + 1 => + array( + 'Table' => 'kg_chapter_user', + 'Non_unique' => '1', + 'Key_name' => 'chapter_user', + 'Seq_in_index' => '1', + 'Column_name' => 'chapter_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_chapter_user', + 'Non_unique' => '1', + 'Key_name' => 'chapter_user', + 'Seq_in_index' => '2', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_user' => + array( + 1 => + array( + 'Table' => 'kg_chapter_user', + 'Non_unique' => '1', + 'Key_name' => 'course_user', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_chapter_user', + 'Non_unique' => '1', + 'Key_name' => 'course_user', + 'Seq_in_index' => '2', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_chapter_vod' => + array( + 'table' => + array( + 'table_name' => 'kg_chapter_vod', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_vod', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_vod', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chapter_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_vod', + 'COLUMN_NAME' => 'chapter_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '章节编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'file_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_vod', + 'COLUMN_NAME' => 'file_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '32', + 'CHARACTER_OCTET_LENGTH' => '128', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(32)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '文件编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'file_transcode' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_vod', + 'COLUMN_NAME' => 'file_transcode', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '1500', + 'CHARACTER_OCTET_LENGTH' => '6000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(1500)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '文件属性', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_vod', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_chapter_vod', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_chapter_vod', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chapter_id' => + array( + 1 => + array( + 'Table' => 'kg_chapter_vod', + 'Non_unique' => '1', + 'Key_name' => 'chapter_id', + 'Seq_in_index' => '1', + 'Column_name' => 'chapter_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'file_id' => + array( + 1 => + array( + 'Table' => 'kg_chapter_vod', + 'Non_unique' => '1', + 'Key_name' => 'file_id', + 'Seq_in_index' => '1', + 'Column_name' => 'file_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_chapter_vod', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_connect' => + array( + 'table' => + array( + 'table_name' => 'kg_connect', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'union_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'union_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => 'union_id', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'open_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'open_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '开放ID', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'open_name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'open_name', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '开放名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'open_avatar' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'open_avatar', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '150', + 'CHARACTER_OCTET_LENGTH' => '600', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(150)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '开放头像', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'provider' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'provider', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '提供方', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_connect', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_connect', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'open_provider' => + array( + 1 => + array( + 'Table' => 'kg_connect', + 'Non_unique' => '1', + 'Key_name' => 'open_provider', + 'Seq_in_index' => '1', + 'Column_name' => 'open_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_connect', + 'Non_unique' => '1', + 'Key_name' => 'open_provider', + 'Seq_in_index' => '2', + 'Column_name' => 'provider', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'union_provider' => + array( + 1 => + array( + 'Table' => 'kg_connect', + 'Non_unique' => '1', + 'Key_name' => 'union_provider', + 'Seq_in_index' => '1', + 'Column_name' => 'union_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_connect', + 'Non_unique' => '1', + 'Key_name' => 'union_provider', + 'Seq_in_index' => '2', + 'Column_name' => 'provider', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_connect', + 'Non_unique' => '1', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_consult' => + array( + 'table' => + array( + 'table_name' => 'kg_consult', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chapter_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'chapter_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '章节编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'owner_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'owner_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'replier_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'replier_id', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '回复者编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'question' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'question', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '1500', + 'CHARACTER_OCTET_LENGTH' => '6000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(1500)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '问题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'answer' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'answer', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '1500', + 'CHARACTER_OCTET_LENGTH' => '6000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(1500)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '答案', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'rating', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'priority' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'priority', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '优先级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'private' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'private', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '私密标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'like_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'like_count', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '点赞数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'reply_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'reply_time', + 'ORDINAL_POSITION' => '14', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '回复时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '15', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '16', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_consult', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_consult', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chapter_id' => + array( + 1 => + array( + 'Table' => 'kg_consult', + 'Non_unique' => '1', + 'Key_name' => 'chapter_id', + 'Seq_in_index' => '1', + 'Column_name' => 'chapter_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'owner_id' => + array( + 1 => + array( + 'Table' => 'kg_consult', + 'Non_unique' => '1', + 'Key_name' => 'owner_id', + 'Seq_in_index' => '1', + 'Column_name' => 'owner_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_consult_like' => + array( + 'table' => + array( + 'table_name' => 'kg_consult_like', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult_like', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'consult_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult_like', + 'COLUMN_NAME' => 'consult_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '咨询编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult_like', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult_like', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult_like', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_consult_like', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_consult_like', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'consult_user' => + array( + 1 => + array( + 'Table' => 'kg_consult_like', + 'Non_unique' => '1', + 'Key_name' => 'consult_user', + 'Seq_in_index' => '1', + 'Column_name' => 'consult_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_consult_like', + 'Non_unique' => '1', + 'Key_name' => 'consult_user', + 'Seq_in_index' => '2', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_course' => + array( + 'table' => + array( + 'table_name' => 'kg_course', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'cover' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'cover', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '封面', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'summary' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'summary', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '简介', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'keywords' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'keywords', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '关键字', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'details' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'details', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'text', + 'CHARACTER_MAXIMUM_LENGTH' => '65535', + 'CHARACTER_OCTET_LENGTH' => '65535', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'text', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '详情', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'category_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'category_id', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '分类编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'teacher_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'teacher_id', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '讲师编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'market_price' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'market_price', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'decimal', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'decimal(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '市场价格', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'vip_price' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'vip_price', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'decimal', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'decimal(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '会员价格', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'study_expiry' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'study_expiry', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '12', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '学习期限', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'refund_expiry' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'refund_expiry', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '30', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '退款期限', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'rating', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '5.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'score' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'score', + 'ORDINAL_POSITION' => '14', + 'COLUMN_DEFAULT' => '0.0000', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '4', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,4) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '综合得分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'model' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'model', + 'ORDINAL_POSITION' => '15', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '模型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'level' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'level', + 'ORDINAL_POSITION' => '16', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '难度', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'attrs' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'attrs', + 'ORDINAL_POSITION' => '17', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '1000', + 'CHARACTER_OCTET_LENGTH' => '4000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(1000)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '扩展属性', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'featured' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'featured', + 'ORDINAL_POSITION' => '18', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '推荐标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '19', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '20', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'resource_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'resource_count', + 'ORDINAL_POSITION' => '21', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '资料数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'user_count', + 'ORDINAL_POSITION' => '22', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '学员数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'lesson_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'lesson_count', + 'ORDINAL_POSITION' => '23', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课时数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'package_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'package_count', + 'ORDINAL_POSITION' => '24', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '套餐数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'review_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'review_count', + 'ORDINAL_POSITION' => '25', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '评价数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'consult_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'consult_count', + 'ORDINAL_POSITION' => '26', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '咨询数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'favorite_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'favorite_count', + 'ORDINAL_POSITION' => '27', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '收藏数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '28', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '29', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_course', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_course_category' => + array( + 'table' => + array( + 'table_name' => 'kg_course_category', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_category', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_category', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'category_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_category', + 'COLUMN_NAME' => 'category_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '分类编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_category', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_course_category', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_course_category', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'category_id' => + array( + 1 => + array( + 'Table' => 'kg_course_category', + 'Non_unique' => '1', + 'Key_name' => 'category_id', + 'Seq_in_index' => '1', + 'Column_name' => 'category_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_course_favorite' => + array( + 'table' => + array( + 'table_name' => 'kg_course_favorite', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_favorite', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_favorite', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_favorite', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_favorite', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_favorite', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_favorite', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_course_favorite', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_course_favorite', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_course_favorite', + 'Non_unique' => '1', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_course_package' => + array( + 'table' => + array( + 'table_name' => 'kg_course_package', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_package', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_package', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'package_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_package', + 'COLUMN_NAME' => 'package_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '套餐编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_package', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_course_package', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_course_package', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'package_id' => + array( + 1 => + array( + 'Table' => 'kg_course_package', + 'Non_unique' => '1', + 'Key_name' => 'package_id', + 'Seq_in_index' => '1', + 'Column_name' => 'package_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_course_rating' => + array( + 'table' => + array( + 'table_name' => 'kg_course_rating', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_rating', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_rating', + 'COLUMN_NAME' => 'rating', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '5.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '综合评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating1' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_rating', + 'COLUMN_NAME' => 'rating1', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '5.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '维度1评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating2' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_rating', + 'COLUMN_NAME' => 'rating2', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '5.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '维度2评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating3' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_rating', + 'COLUMN_NAME' => 'rating3', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '5.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '维度3评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_rating', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_rating', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_course_rating', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_course_related' => + array( + 'table' => + array( + 'table_name' => 'kg_course_related', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_related', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_related', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'related_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_related', + 'COLUMN_NAME' => 'related_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '相关编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_related', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_course_related', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_course_related', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_course_topic' => + array( + 'table' => + array( + 'table_name' => 'kg_course_topic', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_topic', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_topic', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'topic_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_topic', + 'COLUMN_NAME' => 'topic_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标签编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_topic', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_course_topic', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'topic_id' => + array( + 1 => + array( + 'Table' => 'kg_course_topic', + 'Non_unique' => '1', + 'Key_name' => 'topic_id', + 'Seq_in_index' => '1', + 'Column_name' => 'topic_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_course_topic', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_course_user' => + array( + 'table' => + array( + 'table_name' => 'kg_course_user', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'plan_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'plan_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '计划编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'role_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'role_type', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '角色类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'source_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'source_type', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '来源类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'duration' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'duration', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '学习时长', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'progress' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'progress', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '学习进度', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'reviewed' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'reviewed', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '评价标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'expiry_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'expiry_time', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '过期时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_course_user', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_course_user', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_course_user', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_course_user', + 'Non_unique' => '1', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_user' => + array( + 1 => + array( + 'Table' => 'kg_course_user', + 'Non_unique' => '1', + 'Key_name' => 'course_user', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_course_user', + 'Non_unique' => '1', + 'Key_name' => 'course_user', + 'Seq_in_index' => '2', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_danmu' => + array( + 'table' => + array( + 'table_name' => 'kg_danmu', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chapter_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'chapter_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '章节编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'owner_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'owner_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '时间轴', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'text' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'text', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'color' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'color', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => 'white', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '颜色', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'size' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'size', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '字号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'position' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'position', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '位置', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_danmu', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_danmu', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chapter_id' => + array( + 1 => + array( + 'Table' => 'kg_danmu', + 'Non_unique' => '1', + 'Key_name' => 'chapter_id', + 'Seq_in_index' => '1', + 'Column_name' => 'chapter_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'owner_id' => + array( + 1 => + array( + 'Table' => 'kg_danmu', + 'Non_unique' => '1', + 'Key_name' => 'owner_id', + 'Seq_in_index' => '1', + 'Column_name' => 'owner_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_help' => + array( + 'table' => + array( + 'table_name' => 'kg_help', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_help', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'category_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_help', + 'COLUMN_NAME' => 'category_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '分类编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_help', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'content' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_help', + 'COLUMN_NAME' => 'content', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'text', + 'CHARACTER_MAXIMUM_LENGTH' => '65535', + 'CHARACTER_OCTET_LENGTH' => '65535', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'text', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'priority' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_help', + 'COLUMN_NAME' => 'priority', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '10', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '优先级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_help', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_help', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_help', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_help', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_help', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_im_friend_group' => + array( + 'table' => + array( + 'table_name' => 'kg_im_friend_group', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_group', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_group', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'UNI', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_group', + 'COLUMN_NAME' => 'name', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'priority' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_group', + 'COLUMN_NAME' => 'priority', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '优先级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_group', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_group', + 'COLUMN_NAME' => 'user_count', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '成员数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_group', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_group', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_im_friend_group', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_im_friend_group', + 'Non_unique' => '0', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_im_friend_user' => + array( + 'table' => + array( + 'table_name' => 'kg_im_friend_user', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_user', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_user', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'friend_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_user', + 'COLUMN_NAME' => 'friend_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '目标编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'group_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_user', + 'COLUMN_NAME' => 'group_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '分组编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'msg_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_user', + 'COLUMN_NAME' => 'msg_count', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '消息数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_user', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_friend_user', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_im_friend_user', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_friend' => + array( + 1 => + array( + 'Table' => 'kg_im_friend_user', + 'Non_unique' => '1', + 'Key_name' => 'user_friend', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_im_friend_user', + 'Non_unique' => '1', + 'Key_name' => 'user_friend', + 'Seq_in_index' => '2', + 'Column_name' => 'friend_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_im_group' => + array( + 'table' => + array( + 'table_name' => 'kg_im_group', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'owner_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'owner_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '群主编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'type', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'name', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'avatar' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'avatar', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '头像', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'about' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'about', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '简介', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'user_count', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '成员数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'msg_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'msg_count', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '消息数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_im_group', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_im_group_user' => + array( + 'table' => + array( + 'table_name' => 'kg_im_group_user', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group_user', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'group_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group_user', + 'COLUMN_NAME' => 'group_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '群组编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group_user', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'priority' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group_user', + 'COLUMN_NAME' => 'priority', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '优先级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group_user', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_group_user', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_im_group_user', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'group_id' => + array( + 1 => + array( + 'Table' => 'kg_im_group_user', + 'Non_unique' => '1', + 'Key_name' => 'group_id', + 'Seq_in_index' => '1', + 'Column_name' => 'group_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_im_group_user', + 'Non_unique' => '1', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'group_user' => + array( + 1 => + array( + 'Table' => 'kg_im_group_user', + 'Non_unique' => '1', + 'Key_name' => 'group_user', + 'Seq_in_index' => '1', + 'Column_name' => 'group_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_im_group_user', + 'Non_unique' => '1', + 'Key_name' => 'group_user', + 'Seq_in_index' => '2', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_im_message' => + array( + 'table' => + array( + 'table_name' => 'kg_im_message', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chat_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'chat_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '对话编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'sender_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'sender_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发送方', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'receiver_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'receiver_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '接收方', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'receiver_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'receiver_type', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '接收方类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'content' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'content', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '3000', + 'CHARACTER_OCTET_LENGTH' => '12000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(3000)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'viewed' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'viewed', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '已读标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_message', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_im_message', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chat_id' => + array( + 1 => + array( + 'Table' => 'kg_im_message', + 'Non_unique' => '1', + 'Key_name' => 'chat_id', + 'Seq_in_index' => '1', + 'Column_name' => 'chat_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'receiver' => + array( + 1 => + array( + 'Table' => 'kg_im_message', + 'Non_unique' => '1', + 'Key_name' => 'receiver', + 'Seq_in_index' => '1', + 'Column_name' => 'receiver_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_im_message', + 'Non_unique' => '1', + 'Key_name' => 'receiver', + 'Seq_in_index' => '2', + 'Column_name' => 'receiver_type', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_im_notice' => + array( + 'table' => + array( + 'table_name' => 'kg_im_notice', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_notice', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'sender_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_notice', + 'COLUMN_NAME' => 'sender_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发送方', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'receiver_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_notice', + 'COLUMN_NAME' => 'receiver_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '接收方', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_notice', + 'COLUMN_NAME' => 'item_type', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '条目类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_info' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_notice', + 'COLUMN_NAME' => 'item_info', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '1500', + 'CHARACTER_OCTET_LENGTH' => '6000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(1500)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '条目内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'viewed' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_notice', + 'COLUMN_NAME' => 'viewed', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '已读标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_notice', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_notice', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_notice', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_im_notice', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'sender_id' => + array( + 1 => + array( + 'Table' => 'kg_im_notice', + 'Non_unique' => '1', + 'Key_name' => 'sender_id', + 'Seq_in_index' => '1', + 'Column_name' => 'sender_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'receiver_id' => + array( + 1 => + array( + 'Table' => 'kg_im_notice', + 'Non_unique' => '1', + 'Key_name' => 'receiver_id', + 'Seq_in_index' => '1', + 'Column_name' => 'receiver_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_im_user' => + array( + 'table' => + array( + 'table_name' => 'kg_im_user', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'name', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'avatar' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'avatar', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '头像', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'sign' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'sign', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '签名', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'skin' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'skin', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '皮肤', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'status' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'status', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => 'hide', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '15', + 'CHARACTER_OCTET_LENGTH' => '60', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(15)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '在线状态', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'friend_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'friend_count', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '好友数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'group_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'group_count', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '群组数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_im_user', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_im_user', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_learning' => + array( + 'table' => + array( + 'table_name' => 'kg_learning', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'request_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'request_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '请求编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chapter_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'chapter_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课时编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'plan_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'plan_id', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '计划编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'duration' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'duration', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '学习时长', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'position' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'position', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '播放位置', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'client_type', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_ip' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'client_ip', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端IP', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'active_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'active_time', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '活跃时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_learning', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '14', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_learning', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'request_id' => + array( + 1 => + array( + 'Table' => 'kg_learning', + 'Non_unique' => '1', + 'Key_name' => 'request_id', + 'Seq_in_index' => '1', + 'Column_name' => 'request_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chapter_user' => + array( + 1 => + array( + 'Table' => 'kg_learning', + 'Non_unique' => '1', + 'Key_name' => 'chapter_user', + 'Seq_in_index' => '1', + 'Column_name' => 'chapter_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_learning', + 'Non_unique' => '1', + 'Key_name' => 'chapter_user', + 'Seq_in_index' => '2', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_migration' => + array( + 'table' => + array( + 'table_name' => 'kg_migration', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8_general_ci', + 'character_set_name' => 'utf8', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'version' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_migration', + 'COLUMN_NAME' => 'version', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'bigint', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '19', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'bigint', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'migration_name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_migration', + 'COLUMN_NAME' => 'migration_name', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'YES', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '300', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8', + 'COLLATION_NAME' => 'utf8_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'start_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_migration', + 'COLUMN_NAME' => 'start_time', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'YES', + 'DATA_TYPE' => 'timestamp', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => '0', + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'timestamp', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'end_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_migration', + 'COLUMN_NAME' => 'end_time', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'YES', + 'DATA_TYPE' => 'timestamp', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => '0', + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'timestamp', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'breakpoint' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_migration', + 'COLUMN_NAME' => 'breakpoint', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_migration', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'version', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_nav' => + array( + 'table' => + array( + 'table_name' => 'kg_nav', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'parent_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'parent_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '父级编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'level' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'level', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '层级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'name', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'path' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'path', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '路径', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'target' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'target', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '_blank', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '打开方式', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'url' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'url', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '链接地址', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'position' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'position', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '位置', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'priority' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'priority', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '30', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '优先级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'child_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'child_count', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '子类数量', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_nav', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '14', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_nav', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_online' => + array( + 'table' => + array( + 'table_name' => 'kg_online', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_online', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_online', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_online', + 'COLUMN_NAME' => 'client_type', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_ip' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_online', + 'COLUMN_NAME' => 'client_ip', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端IP', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'active_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_online', + 'COLUMN_NAME' => 'active_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '活跃时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_online', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_online', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_online', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_online', + 'Non_unique' => '1', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'active_time' => + array( + 1 => + array( + 'Table' => 'kg_online', + 'Non_unique' => '1', + 'Key_name' => 'active_time', + 'Seq_in_index' => '1', + 'Column_name' => 'active_time', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_order' => + array( + 'table' => + array( + 'table_name' => 'kg_order', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'sn' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'sn', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '32', + 'CHARACTER_OCTET_LENGTH' => '128', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(32)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'subject' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'subject', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'amount' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'amount', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'decimal', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'decimal(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单金额', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'owner_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'owner_id', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'item_id', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '条目编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'item_type', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '条目类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_info' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'item_info', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '3000', + 'CHARACTER_OCTET_LENGTH' => '12000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(3000)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '条目内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'client_type', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_ip' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'client_ip', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端IP', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'status' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'status', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '状态标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '14', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_order', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'sn' => + array( + 1 => + array( + 'Table' => 'kg_order', + 'Non_unique' => '1', + 'Key_name' => 'sn', + 'Seq_in_index' => '1', + 'Column_name' => 'sn', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'item' => + array( + 1 => + array( + 'Table' => 'kg_order', + 'Non_unique' => '1', + 'Key_name' => 'item', + 'Seq_in_index' => '1', + 'Column_name' => 'item_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_order', + 'Non_unique' => '1', + 'Key_name' => 'item', + 'Seq_in_index' => '2', + 'Column_name' => 'item_type', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'owner_id' => + array( + 1 => + array( + 'Table' => 'kg_order', + 'Non_unique' => '1', + 'Key_name' => 'owner_id', + 'Seq_in_index' => '1', + 'Column_name' => 'owner_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_order_status' => + array( + 'table' => + array( + 'table_name' => 'kg_order_status', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order_status', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'order_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order_status', + 'COLUMN_NAME' => 'order_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'status' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order_status', + 'COLUMN_NAME' => 'status', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单状态', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_order_status', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_order_status', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'order_id' => + array( + 1 => + array( + 'Table' => 'kg_order_status', + 'Non_unique' => '1', + 'Key_name' => 'order_id', + 'Seq_in_index' => '1', + 'Column_name' => 'order_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_package' => + array( + 'table' => + array( + 'table_name' => 'kg_package', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'summary' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'summary', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '简介', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'market_price' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'market_price', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'decimal', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'decimal(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '市场价格', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'vip_price' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'vip_price', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'decimal', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'decimal(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '会员价格', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'course_count', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程数量', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_package', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_package', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_page' => + array( + 'table' => + array( + 'table_name' => 'kg_page', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_page', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_page', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'content' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_page', + 'COLUMN_NAME' => 'content', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'text', + 'CHARACTER_MAXIMUM_LENGTH' => '65535', + 'CHARACTER_OCTET_LENGTH' => '65535', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'text', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_page', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_page', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_page', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_page', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_page', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_refund' => + array( + 'table' => + array( + 'table_name' => 'kg_refund', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'owner_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'owner_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'order_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'order_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'trade_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'trade_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '交易编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'sn' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'sn', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '32', + 'CHARACTER_OCTET_LENGTH' => '128', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(32)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '退款序号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'subject' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'subject', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '退款主题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'amount' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'amount', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'decimal', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'decimal(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '退款金额', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'status' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'status', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '状态类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'apply_note' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'apply_note', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '申请备注', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'review_note' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'review_note', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '审核备注', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_refund', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'sn' => + array( + 1 => + array( + 'Table' => 'kg_refund', + 'Non_unique' => '1', + 'Key_name' => 'sn', + 'Seq_in_index' => '1', + 'Column_name' => 'sn', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'owner_id' => + array( + 1 => + array( + 'Table' => 'kg_refund', + 'Non_unique' => '1', + 'Key_name' => 'owner_id', + 'Seq_in_index' => '1', + 'Column_name' => 'owner_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'order_id' => + array( + 1 => + array( + 'Table' => 'kg_refund', + 'Non_unique' => '1', + 'Key_name' => 'order_id', + 'Seq_in_index' => '1', + 'Column_name' => 'order_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'trade_id' => + array( + 1 => + array( + 'Table' => 'kg_refund', + 'Non_unique' => '1', + 'Key_name' => 'trade_id', + 'Seq_in_index' => '1', + 'Column_name' => 'trade_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_refund_status' => + array( + 'table' => + array( + 'table_name' => 'kg_refund_status', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund_status', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'refund_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund_status', + 'COLUMN_NAME' => 'refund_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'status' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund_status', + 'COLUMN_NAME' => 'status', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单状态', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_refund_status', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_refund_status', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'refund_id' => + array( + 1 => + array( + 'Table' => 'kg_refund_status', + 'Non_unique' => '1', + 'Key_name' => 'refund_id', + 'Seq_in_index' => '1', + 'Column_name' => 'refund_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_resource' => + array( + 'table' => + array( + 'table_name' => 'kg_resource', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_resource', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_resource', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'chapter_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_resource', + 'COLUMN_NAME' => 'chapter_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '章节编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'upload_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_resource', + 'COLUMN_NAME' => 'upload_id', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '上传编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_resource', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_resource', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_resource', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_resource', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'chapter_id' => + array( + 1 => + array( + 'Table' => 'kg_resource', + 'Non_unique' => '1', + 'Key_name' => 'chapter_id', + 'Seq_in_index' => '1', + 'Column_name' => 'chapter_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_review' => + array( + 'table' => + array( + 'table_name' => 'kg_review', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'course_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'owner_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'owner_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'content' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'content', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '1000', + 'CHARACTER_OCTET_LENGTH' => '4000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(1000)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'reply' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'reply', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '1000', + 'CHARACTER_OCTET_LENGTH' => '4000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(1000)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '回复', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'rating', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '5.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '综合评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating1' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'rating1', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '5.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '维度1评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating2' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'rating2', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '5.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '维度2评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'rating3' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'rating3', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '5.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'float', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'float(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '维度3评分', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'anonymous' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'anonymous', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '匿名标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'like_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'like_count', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '点赞数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '14', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '15', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_review', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'course_id' => + array( + 1 => + array( + 'Table' => 'kg_review', + 'Non_unique' => '1', + 'Key_name' => 'course_id', + 'Seq_in_index' => '1', + 'Column_name' => 'course_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'onwer_id' => + array( + 1 => + array( + 'Table' => 'kg_review', + 'Non_unique' => '1', + 'Key_name' => 'onwer_id', + 'Seq_in_index' => '1', + 'Column_name' => 'owner_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_review_like' => + array( + 'table' => + array( + 'table_name' => 'kg_review_like', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review_like', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'review_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review_like', + 'COLUMN_NAME' => 'review_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '评价编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review_like', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review_like', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review_like', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_review_like', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_review_like', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'review_user' => + array( + 1 => + array( + 'Table' => 'kg_review_like', + 'Non_unique' => '1', + 'Key_name' => 'review_user', + 'Seq_in_index' => '1', + 'Column_name' => 'review_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_review_like', + 'Non_unique' => '1', + 'Key_name' => 'review_user', + 'Seq_in_index' => '2', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_reward' => + array( + 'table' => + array( + 'table_name' => 'kg_reward', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_reward', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'smallint', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '5', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'smallint unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_reward', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'price' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_reward', + 'COLUMN_NAME' => 'price', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'decimal', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'decimal(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '价格', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_reward', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_reward', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_reward', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_reward', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_role' => + array( + 'table' => + array( + 'table_name' => 'kg_role', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_role', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_role', + 'COLUMN_NAME' => 'type', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '2', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_role', + 'COLUMN_NAME' => 'name', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'summary' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_role', + 'COLUMN_NAME' => 'summary', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '简介', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'routes' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_role', + 'COLUMN_NAME' => 'routes', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'text', + 'CHARACTER_MAXIMUM_LENGTH' => '65535', + 'CHARACTER_OCTET_LENGTH' => '65535', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'text', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '权限路由', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_role', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_role', + 'COLUMN_NAME' => 'user_count', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '成员数量', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_role', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_role', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_role', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_setting' => + array( + 'table' => + array( + 'table_name' => 'kg_setting', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_setting', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'section' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_setting', + 'COLUMN_NAME' => 'section', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '50', + 'CHARACTER_OCTET_LENGTH' => '200', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(50)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '配置组', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_key' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_setting', + 'COLUMN_NAME' => 'item_key', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '50', + 'CHARACTER_OCTET_LENGTH' => '200', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(50)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '配置项', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_value' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_setting', + 'COLUMN_NAME' => 'item_value', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'text', + 'CHARACTER_MAXIMUM_LENGTH' => '65535', + 'CHARACTER_OCTET_LENGTH' => '65535', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'text', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '配置值', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_setting', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'section_key' => + array( + 1 => + array( + 'Table' => 'kg_setting', + 'Non_unique' => '0', + 'Key_name' => 'section_key', + 'Seq_in_index' => '1', + 'Column_name' => 'section', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + 2 => + array( + 'Table' => 'kg_setting', + 'Non_unique' => '0', + 'Key_name' => 'section_key', + 'Seq_in_index' => '2', + 'Column_name' => 'item_key', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_slide' => + array( + 'table' => + array( + 'table_name' => 'kg_slide', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'cover' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'cover', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '封面', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'summary' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'summary', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '简介', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'content' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'content', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'platform' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'platform', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '平台类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'target' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'target', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '目标类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'priority' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'priority', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '10', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '优先级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布状态', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_slide', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_slide', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_task' => + array( + 'table' => + array( + 'table_name' => 'kg_task', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_task', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_task', + 'COLUMN_NAME' => 'item_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '条目编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_task', + 'COLUMN_NAME' => 'item_type', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '条目类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'item_info' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_task', + 'COLUMN_NAME' => 'item_info', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '3000', + 'CHARACTER_OCTET_LENGTH' => '12000', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(3000)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '条目内容', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'status' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_task', + 'COLUMN_NAME' => 'status', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '状态', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'priority' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_task', + 'COLUMN_NAME' => 'priority', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '30', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '优先级', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'try_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_task', + 'COLUMN_NAME' => 'try_count', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '重试数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_task', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_task', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_task', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_topic' => + array( + 'table' => + array( + 'table_name' => 'kg_topic', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Compact', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_topic', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_topic', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'keywords' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_topic', + 'COLUMN_NAME' => 'keywords', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '关键字', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'summary' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_topic', + 'COLUMN_NAME' => 'summary', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '简介', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_topic', + 'COLUMN_NAME' => 'course_count', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程数量', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'published' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_topic', + 'COLUMN_NAME' => 'published', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '发布标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_topic', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_topic', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_topic', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_topic', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_trade' => + array( + 'table' => + array( + 'table_name' => 'kg_trade', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'owner_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'owner_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'order_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'order_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'sn' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'sn', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '32', + 'CHARACTER_OCTET_LENGTH' => '128', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(32)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '交易序号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'subject' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'subject', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '交易主题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'amount' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'amount', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'decimal', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'decimal(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '交易金额', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'channel' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'channel', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '平台类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'channel_sn' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'channel_sn', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '平台序号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'status' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'status', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '状态类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_trade', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'sn' => + array( + 1 => + array( + 'Table' => 'kg_trade', + 'Non_unique' => '1', + 'Key_name' => 'sn', + 'Seq_in_index' => '1', + 'Column_name' => 'sn', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'owner_id' => + array( + 1 => + array( + 'Table' => 'kg_trade', + 'Non_unique' => '1', + 'Key_name' => 'owner_id', + 'Seq_in_index' => '1', + 'Column_name' => 'owner_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'order_id' => + array( + 1 => + array( + 'Table' => 'kg_trade', + 'Non_unique' => '1', + 'Key_name' => 'order_id', + 'Seq_in_index' => '1', + 'Column_name' => 'order_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_trade_status' => + array( + 'table' => + array( + 'table_name' => 'kg_trade_status', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade_status', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'trade_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade_status', + 'COLUMN_NAME' => 'trade_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'status' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade_status', + 'COLUMN_NAME' => 'status', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '订单状态', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_trade_status', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_trade_status', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'trade_id' => + array( + 1 => + array( + 'Table' => 'kg_trade_status', + 'Non_unique' => '1', + 'Key_name' => 'trade_id', + 'Seq_in_index' => '1', + 'Column_name' => 'trade_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_upload' => + array( + 'table' => + array( + 'table_name' => 'kg_upload', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'type', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '条目类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'name', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '文件名', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'path' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'path', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '路径', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'mime' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'mime', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => 'mime', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'md5' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'md5', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '32', + 'CHARACTER_OCTET_LENGTH' => '128', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(32)', + 'COLUMN_KEY' => 'UNI', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => 'md5', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'size' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'size', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '大小', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_upload', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_upload', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'md5' => + array( + 1 => + array( + 'Table' => 'kg_upload', + 'Non_unique' => '0', + 'Key_name' => 'md5', + 'Seq_in_index' => '1', + 'Column_name' => 'md5', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_user' => + array( + 'table' => + array( + 'table_name' => 'kg_user', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'name' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'name', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '名称', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'avatar' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'avatar', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '100', + 'CHARACTER_OCTET_LENGTH' => '400', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(100)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '头像', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '头衔', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'about' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'about', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '255', + 'CHARACTER_OCTET_LENGTH' => '1020', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(255)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '简介', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'area' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'area', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '地区', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'gender' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'gender', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '3', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '性别', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'vip' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'vip', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '会员标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'locked' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'locked', + 'ORDINAL_POSITION' => '9', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '锁定标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '10', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'edu_role' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'edu_role', + 'ORDINAL_POSITION' => '11', + 'COLUMN_DEFAULT' => '1', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '教学角色', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'admin_role' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'admin_role', + 'ORDINAL_POSITION' => '12', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '后台角色', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'course_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'course_count', + 'ORDINAL_POSITION' => '13', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '课程数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'favorite_count' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'favorite_count', + 'ORDINAL_POSITION' => '14', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '收藏数', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'vip_expiry_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'vip_expiry_time', + 'ORDINAL_POSITION' => '15', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '会员期限', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'lock_expiry_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'lock_expiry_time', + 'ORDINAL_POSITION' => '16', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '锁定期限', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'active_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'active_time', + 'ORDINAL_POSITION' => '17', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '活跃时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '18', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '19', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_user', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'name' => + array( + 1 => + array( + 'Table' => 'kg_user', + 'Non_unique' => '1', + 'Key_name' => 'name', + 'Seq_in_index' => '1', + 'Column_name' => 'name', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_user_session' => + array( + 'table' => + array( + 'table_name' => 'kg_user_session', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_session', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_session', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'session_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_session', + 'COLUMN_NAME' => 'session_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '会话编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_session', + 'COLUMN_NAME' => 'client_type', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_ip' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_session', + 'COLUMN_NAME' => 'client_ip', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端IP', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_session', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_session', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_session', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_user_session', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_user_session', + 'Non_unique' => '1', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_user_token' => + array( + 'table' => + array( + 'table_name' => 'kg_user_token', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_token', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_token', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'token' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_token', + 'COLUMN_NAME' => 'token', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '身份令牌', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_type' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_token', + 'COLUMN_NAME' => 'client_type', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端类型', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'client_ip' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_token', + 'COLUMN_NAME' => 'client_ip', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '终端IP', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_token', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_token', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_user_token', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '8', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_user_token', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_user_token', + 'Non_unique' => '1', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_vip' => + array( + 'table' => + array( + 'table_name' => 'kg_vip', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_vip', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'title' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_vip', + 'COLUMN_NAME' => 'title', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '30', + 'CHARACTER_OCTET_LENGTH' => '120', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(30)', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '标题', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'expiry' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_vip', + 'COLUMN_NAME' => 'expiry', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '有效期', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'price' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_vip', + 'COLUMN_NAME' => 'price', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0.00', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'decimal', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '2', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'decimal(10,2) unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '价格', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_vip', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_vip', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_vip', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '7', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_vip', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + 'kg_wechat_subscribe' => + array( + 'table' => + array( + 'table_name' => 'kg_wechat_subscribe', + 'engine' => 'InnoDB', + 'table_comment' => '', + 'table_collation' => 'utf8mb4_general_ci', + 'character_set_name' => 'utf8mb4', + 'row_format' => 'Dynamic', + ), + 'columns' => + array( + 'id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_wechat_subscribe', + 'COLUMN_NAME' => 'id', + 'ORDINAL_POSITION' => '1', + 'COLUMN_DEFAULT' => NULL, + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'PRI', + 'EXTRA' => 'auto_increment', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '主键编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'user_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_wechat_subscribe', + 'COLUMN_NAME' => 'user_id', + 'ORDINAL_POSITION' => '2', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '用户编号', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'open_id' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_wechat_subscribe', + 'COLUMN_NAME' => 'open_id', + 'ORDINAL_POSITION' => '3', + 'COLUMN_DEFAULT' => '', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'varchar', + 'CHARACTER_MAXIMUM_LENGTH' => '64', + 'CHARACTER_OCTET_LENGTH' => '256', + 'NUMERIC_PRECISION' => NULL, + 'NUMERIC_SCALE' => NULL, + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => 'utf8mb4', + 'COLLATION_NAME' => 'utf8mb4_general_ci', + 'COLUMN_TYPE' => 'varchar(64)', + 'COLUMN_KEY' => 'MUL', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '开放ID', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'deleted' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_wechat_subscribe', + 'COLUMN_NAME' => 'deleted', + 'ORDINAL_POSITION' => '4', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '删除标识', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'create_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_wechat_subscribe', + 'COLUMN_NAME' => 'create_time', + 'ORDINAL_POSITION' => '5', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '创建时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + 'update_time' => + array( + 'TABLE_CATALOG' => 'def', + 'TABLE_NAME' => 'kg_wechat_subscribe', + 'COLUMN_NAME' => 'update_time', + 'ORDINAL_POSITION' => '6', + 'COLUMN_DEFAULT' => '0', + 'IS_NULLABLE' => 'NO', + 'DATA_TYPE' => 'int', + 'CHARACTER_MAXIMUM_LENGTH' => NULL, + 'CHARACTER_OCTET_LENGTH' => NULL, + 'NUMERIC_PRECISION' => '10', + 'NUMERIC_SCALE' => '0', + 'DATETIME_PRECISION' => NULL, + 'CHARACTER_SET_NAME' => NULL, + 'COLLATION_NAME' => NULL, + 'COLUMN_TYPE' => 'int unsigned', + 'COLUMN_KEY' => '', + 'EXTRA' => '', + 'PRIVILEGES' => 'select,insert,update,references', + 'COLUMN_COMMENT' => '更新时间', + 'GENERATION_EXPRESSION' => '', + 'SRS_ID' => NULL, + ), + ), + 'indexes' => + array( + 'PRIMARY' => + array( + 1 => + array( + 'Table' => 'kg_wechat_subscribe', + 'Non_unique' => '0', + 'Key_name' => 'PRIMARY', + 'Seq_in_index' => '1', + 'Column_name' => 'id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'open_id' => + array( + 1 => + array( + 'Table' => 'kg_wechat_subscribe', + 'Non_unique' => '1', + 'Key_name' => 'open_id', + 'Seq_in_index' => '1', + 'Column_name' => 'open_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + 'user_id' => + array( + 1 => + array( + 'Table' => 'kg_wechat_subscribe', + 'Non_unique' => '1', + 'Key_name' => 'user_id', + 'Seq_in_index' => '1', + 'Column_name' => 'user_id', + 'Collation' => 'A', + 'Sub_part' => NULL, + 'Packed' => NULL, + 'Null' => '', + 'Index_type' => 'BTREE', + 'Comment' => '', + 'Index_comment' => '', + ), + ), + ), + 'foreign_keys' => NULL, + ), + ), +); \ No newline at end of file -- Gitee From a839db55b7f3bc06d8305c2bbcc95ed87f26bac8 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sun, 3 Jan 2021 14:38:33 +0800 Subject: [PATCH 27/89] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=BAv1.2.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 15 +++++++++++++++ README.md | 6 +++--- app/Library/AppInfo.php | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f42c92f8..44b3b1c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +### [v1.2.3](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.3)(2021-01-03) + +#### 增加 + +- 多人使用同一帐号防范机制 +- 首页缓存刷新工具 +- 课程综合评分 +- 课程推荐 + +#### 修复 + +- phinx-migration-generator 无符号问题 +- online表并发写入重复记录问题 +- 计划任务生成sitemap.xml失败 + ### [v1.2.2](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.2)(2020-12-24) #### 增加 diff --git a/README.md b/README.md index a0268755..c082a651 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ 酷瓜云课堂,依托腾讯云基础服务架构,采用C扩展框架Phalcon开发,GPL-2.0开源协议,致力开源网课系统,开源网校系统,开源在线教育系统。 -![](https://img.shields.io/static/v1?label=release&message=1.2.2&color=blue) -![](https://img.shields.io/static/v1?label=stars&message=136&color=blue) -![](https://img.shields.io/static/v1?label=forks&message=50&color=blue) +![](https://img.shields.io/static/v1?label=release&message=1.2.3&color=blue) +![](https://img.shields.io/static/v1?label=stars&message=160&color=blue) +![](https://img.shields.io/static/v1?label=forks&message=60&color=blue) ![](https://img.shields.io/static/v1?label=license&message=GPL-2.0&color=blue) #### 系统功能 diff --git a/app/Library/AppInfo.php b/app/Library/AppInfo.php index 44cf5878..deeafa92 100644 --- a/app/Library/AppInfo.php +++ b/app/Library/AppInfo.php @@ -11,7 +11,7 @@ class AppInfo protected $link = 'https://gitee.com/koogua'; - protected $version = '1.2.2'; + protected $version = '1.2.3'; public function __get($name) { -- Gitee From d8678716f38ffaf3cd5f099abd807ae0ee6727dc Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Mon, 4 Jan 2021 19:49:35 +0800 Subject: [PATCH 28/89] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E9=A1=B5=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=AF=BE=E7=A8=8B=E5=92=A8=E8=AF=A2=E6=8C=89=E9=92=AE?= =?UTF-8?q?=EF=BC=8C=E8=BF=87=E6=9C=9F=E7=9B=B4=E6=92=AD=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E8=B4=AD=E4=B9=B0=E6=8C=89=E9=92=AE=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=92=A8=E8=AF=A2=E8=AF=A6=E6=83=85=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Home/Views/consult/add.volt | 1 + app/Http/Home/Views/consult/show.volt | 10 +++++----- app/Http/Home/Views/course/show.volt | 6 +++++- app/Http/Home/Views/course/show_order.volt | 10 +++++++--- public/static/home/css/common.css | 2 -- public/static/home/js/course.show.js | 15 +++++++++++++++ 6 files changed, 33 insertions(+), 11 deletions(-) diff --git a/app/Http/Home/Views/consult/add.volt b/app/Http/Home/Views/consult/add.volt index 17b792ee..6e1f5706 100644 --- a/app/Http/Home/Views/consult/add.volt +++ b/app/Http/Home/Views/consult/add.volt @@ -21,6 +21,7 @@ + diff --git a/app/Http/Home/Views/consult/show.volt b/app/Http/Home/Views/consult/show.volt index 76a730b9..b9b6d0d5 100644 --- a/app/Http/Home/Views/consult/show.volt +++ b/app/Http/Home/Views/consult/show.volt @@ -4,24 +4,24 @@ {% set consult.answer = consult.answer ? consult.answer : '请耐心等待回复吧' %} -
+
{% if consult.course.id is defined %} -
+
课程:
{{ consult.course.title }}
{% endif %} {% if consult.chapter.id is defined %} -
+
章节:
{{ consult.chapter.title }}
{% endif %} -
+
咨询:
{{ consult.question }}
-
+
回复:
{{ consult.answer }}
diff --git a/app/Http/Home/Views/course/show.volt b/app/Http/Home/Views/course/show.volt index 6f24937c..c229a53b 100644 --- a/app/Http/Home/Views/course/show.volt +++ b/app/Http/Home/Views/course/show.volt @@ -4,10 +4,11 @@ {{ partial('macros/course') }} - {% set favorite_title = course.me.favorited ? '取消收藏' : '收藏' %} + {% set favorite_title = course.me.favorited ? '取消收藏' : '收藏课程' %} {% set favorite_star = course.me.favorited ? 'layui-icon-star-fill' : 'layui-icon-star' %} {% set full_course_url = full_url({'for':'home.course.show','id':course.id}) %} {% set favorite_url = url({'for':'home.course.favorite','id':course.id}) %} + {% set consult_url = url({'for':'home.consult.add'},{'course_id':course.id}) %} {% set qrcode_url = url({'for':'home.qrcode'},{'text':full_course_url}) %}
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+ +
+ +
+
+
+
+ +
+
+
@@ -120,10 +146,11 @@ diff --git a/app/Http/Home/Controllers/ErrorController.php b/app/Http/Home/Controllers/ErrorController.php index a0155342..dfa6f7e1 100644 --- a/app/Http/Home/Controllers/ErrorController.php +++ b/app/Http/Home/Controllers/ErrorController.php @@ -2,6 +2,8 @@ namespace App\Http\Home\Controllers; +use App\Models\User as UserModel; +use App\Services\Auth\Home as HomeAuth; use App\Services\Service as AppService; use App\Traits\Response as ResponseTrait; @@ -11,8 +13,27 @@ use App\Traits\Response as ResponseTrait; class ErrorController extends \Phalcon\Mvc\Controller { + /** + * @var array + */ + protected $siteInfo; + + /** + * @var UserModel + */ + protected $authUser; + use ResponseTrait; + public function initialize() + { + $this->siteInfo = $this->getSiteInfo(); + $this->authUser = $this->getAuthUser(); + + $this->view->setVar('site_info', $this->siteInfo); + $this->view->setVar('auth_user', $this->authUser); + } + /** * @Get("/400", name="home.error.400") */ @@ -82,4 +103,21 @@ class ErrorController extends \Phalcon\Mvc\Controller $this->view->setVar('message', $siteInfo['closed_tips']); } + protected function getSiteInfo() + { + $appService = new AppService(); + + return $appService->getSettings('site'); + } + + protected function getAuthUser() + { + /** + * @var HomeAuth $auth + */ + $auth = $this->getDI()->get('auth'); + + return $auth->getCurrentUser(); + } + } diff --git a/app/Http/Home/Controllers/LayerController.php b/app/Http/Home/Controllers/LayerController.php index 2d15d84b..7a57aacf 100644 --- a/app/Http/Home/Controllers/LayerController.php +++ b/app/Http/Home/Controllers/LayerController.php @@ -4,6 +4,7 @@ namespace App\Http\Home\Controllers; use App\Models\User as UserModel; use App\Services\Auth\Home as HomeAuth; +use App\Services\Service as AppService; use App\Traits\Response as ResponseTrait; use App\Traits\Security as SecurityTrait; use Phalcon\Mvc\Dispatcher; @@ -11,6 +12,11 @@ use Phalcon\Mvc\Dispatcher; class LayerController extends \Phalcon\Mvc\Controller { + /** + * @var array + */ + protected $siteInfo; + /** * @var UserModel */ @@ -33,11 +39,20 @@ class LayerController extends \Phalcon\Mvc\Controller public function initialize() { + $this->siteInfo = $this->getSiteInfo(); $this->authUser = $this->getAuthUser(); + $this->view->setVar('site_info', $this->siteInfo); $this->view->setVar('auth_user', $this->authUser); } + protected function getSiteInfo() + { + $appService = new AppService(); + + return $appService->getSettings('site'); + } + protected function getAuthUser() { /** diff --git a/app/Http/Home/Views/partials/header.volt b/app/Http/Home/Views/partials/header.volt index fbb2232b..8300003c 100644 --- a/app/Http/Home/Views/partials/header.volt +++ b/app/Http/Home/Views/partials/header.volt @@ -1,4 +1,10 @@ - +
    @@ -21,7 +27,7 @@ {% set s_query = request.get('query',['trim','striptags'],'') %} {% set s_url = url({'for':'home.search.index'}) %} -
    +
    • 搜索 diff --git a/app/Http/Home/Views/templates/error.volt b/app/Http/Home/Views/templates/error.volt index 72c38285..97bc86a7 100644 --- a/app/Http/Home/Views/templates/error.volt +++ b/app/Http/Home/Views/templates/error.volt @@ -4,8 +4,12 @@ - 出错啦 - {{ icon_link("favicon.ico") }} + 出错啦 - {{ site_info.title }} + {% if site_info.favicon %} + {{ icon_link(site_info.favicon,false) }} + {% else %} + {{ icon_link('favicon.ico') }} + {% endif %} {{ css_link("lib/layui/css/layui.css") }} {{ css_link("home/css/error.css") }} diff --git a/app/Http/Home/Views/templates/layer.volt b/app/Http/Home/Views/templates/layer.volt index 76533493..2ab29e47 100644 --- a/app/Http/Home/Views/templates/layer.volt +++ b/app/Http/Home/Views/templates/layer.volt @@ -5,8 +5,12 @@ - 酷瓜云课堂 - {{ icon_link('favicon.ico') }} + {{ site_info.title }} + {% if site_info.favicon %} + {{ icon_link(site_info.favicon,false) }} + {% else %} + {{ icon_link('favicon.ico') }} + {% endif %} {{ css_link('lib/layui/css/layui.css') }} {{ css_link('home/css/common.css') }} {% block link_css %}{% endblock %} diff --git a/app/Http/Home/Views/templates/main.volt b/app/Http/Home/Views/templates/main.volt index a7e06fc3..3f9a6253 100644 --- a/app/Http/Home/Views/templates/main.volt +++ b/app/Http/Home/Views/templates/main.volt @@ -8,7 +8,11 @@ {{ seo.getTitle() }} - {{ icon_link('favicon.ico') }} + {% if site_info.favicon %} + {{ icon_link(site_info.favicon,false) }} + {% else %} + {{ icon_link('favicon.ico') }} + {% endif %} {{ css_link('lib/layui/css/layui.css') }} {{ css_link('home/css/common.css') }} {% block link_css %}{% endblock %} diff --git a/app/Library/Utils/FileInfo.php b/app/Library/Utils/FileInfo.php index ac179386..694cb521 100644 --- a/app/Library/Utils/FileInfo.php +++ b/app/Library/Utils/FileInfo.php @@ -77,6 +77,7 @@ class FileInfo 'png' => 'image/png', 'webp' => 'image/webp', 'bmp' => 'image/bmp', + 'ico' => 'image/x-icon', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'svg' => 'image/svg+xml', diff --git a/db/migrations/20210105024511_data_202101051130.php b/db/migrations/20210105024511_data_202101051130.php new file mode 100644 index 00000000..40d613b5 --- /dev/null +++ b/db/migrations/20210105024511_data_202101051130.php @@ -0,0 +1,37 @@ + 'site', + 'item_key' => 'logo', + 'item_value' => '', + ], + [ + 'section' => 'site', + 'item_key' => 'favicon', + 'item_value' => '', + ], + ]; + + $this->table('kg_setting')->insert($rows)->save(); + } + + public function down() + { + $this->getQueryBuilder() + ->delete('kg_setting') + ->where(['section' => 'site', 'item_key' => 'logo']) + ->execute(); + + $this->getQueryBuilder() + ->delete('kg_setting') + ->where(['section' => 'site', 'item_key' => 'favicon']) + ->execute(); + } + +} diff --git a/public/static/home/css/common.css b/public/static/home/css/common.css index 30ba9113..012b786f 100644 --- a/public/static/home/css/common.css +++ b/public/static/home/css/common.css @@ -127,8 +127,21 @@ font-size: 12px; } +#header .logo { + top: 0; + left: 0; + position: absolute; + line-height: 60px; +} + .top-nav { - margin-left: 100px; + margin-left: 185px; +} + +#header .user { + top: 0; + right: 0; + position: absolute; } .layer-search input { diff --git a/public/static/logo.png b/public/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a94ca4b47184f3fc029bcda709583ed5bba0f99d GIT binary patch literal 1171 zcmeAS@N?(olHy`uVBq!ia0vp^CxF<7gBeJQw6ZP+QjEnx?oNz1PwLbIIh+L^k;M!Q z+`=Ht$S`Y;1W+(Mz$e5NNdLzR{{8z0ln0U!21G3y7p?%V=63e^?LebtOM?7@87AyE z5U@Yc@ZUipzW)CCf&l;i_X`p}JlJqye*XG@yhW@G49sghT^vIy=Ddx#-LzPNCv>4e z?CLz%wYmTQTbr{81f*{__P%eyAKLC+%+iv-MVo%GYAF2+49FZI= z{L{^*$LE&5{kK#3bw;gh-kG^u)-4X#Ufiz8$vKIgk&De*X~nts+xCWDEuCGw>D&Rm z*NHhF3e7@9xH>u~8Xi2;9g?AvBq$_echW_0qQgvA2ARs+wY33%s&Dgdm?JdtcreT6Vxa_yl74O*{po2<*1sexZ=SvgDgv9i(kEUIUp>l z9b3C@%VI^N&dljsS%selE}k#U=>0@uep`nvSN^_b+XM`*%c(g_+*+=BZ03>LCDwdO zhc@z5UGHLdR?2vKw}5$9${T^4l8&zPLNgo018n^}Om-=~u*$4j#5$`&rkLg5r|2ou z{`)P-GPe;Dj&xsIdUf619eV2vi(>Dk@~^vmO+@!?qn0;k@(trmB{S(65+4<}zt6cO z6vUE#J0=0d*b@lR^P&= zbu1FN@I1)bUDqe$*HjtqgNp(_u3I|c;A5X>+r3`zUSQMtqQgUW<)(=16Tf|x`?crO z-PJ7%sxPjdsb-_tZ<+K+Pjl|OjzzP*xRe|vZwRjRT_fBcSACP=daf*6$9}Q35AtJn z%<2vDpD}Sq(<$w09a~O+wX(Gx9fcb^ZB{J2vpdJG<=MBbJ+=quhw`o$RQq>;`EsQ9 z!P3iNQ8SK({Cf6fv&#mr3`?fRb7DWtGs^ht+vH@LSTob@z(LFD=X``;Z+RT}%k|WH z=Ue|=dP Date: Thu, 7 Jan 2021 15:08:28 +0800 Subject: [PATCH 32/89] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E8=87=AA=E5=AE=9A=E4=B9=89=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Tasks/UpgradeTask.php | 2 +- .../Admin/Controllers/SettingController.php | 7 +- app/Http/Admin/Controllers/TestController.php | 19 +++ app/Http/Admin/Services/AuthNode.php | 4 +- app/Http/Admin/Services/Setting.php | 53 +++++++- app/Http/Admin/Views/setting/wechat.volt | 16 --- app/Http/Admin/Views/setting/wechat_oa.volt | 122 +++--------------- .../Admin/Views/setting/wechat_oa_basic.volt | 66 ++++++++++ .../Admin/Views/setting/wechat_oa_menu.volt | 42 ++++++ .../Admin/Views/setting/wechat_oa_notice.volt | 47 +++++++ .../20210106112717_data_202101061830.php | 68 ++++++++++ public/static/admin/js/common.js | 5 +- 12 files changed, 322 insertions(+), 129 deletions(-) delete mode 100644 app/Http/Admin/Views/setting/wechat.volt create mode 100644 app/Http/Admin/Views/setting/wechat_oa_basic.volt create mode 100644 app/Http/Admin/Views/setting/wechat_oa_menu.volt create mode 100644 app/Http/Admin/Views/setting/wechat_oa_notice.volt create mode 100644 db/migrations/20210106112717_data_202101061830.php 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 6d2cce3a..1a28edaa 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; } @@ -179,15 +200,39 @@ 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'] = !empty($top['name']) ? $top['name'] : sprintf('菜单%s', $i + 1); + if (!empty($top['url'])) { + $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'; + } + } } + $settings['menu'] = kg_json_encode($settings['menu']); } $this->updateSettings($section, $settings); + + if (!empty($buttons)) { + $service = new WechatService(); + $oa = $service->getOfficialAccount(); + $oa->menu->create($buttons); + } } } diff --git a/app/Http/Admin/Views/setting/wechat.volt b/app/Http/Admin/Views/setting/wechat.volt deleted file mode 100644 index a37d7091..00000000 --- a/app/Http/Admin/Views/setting/wechat.volt +++ /dev/null @@ -1,16 +0,0 @@ -{% extends 'templates/main.volt' %} - -{% block content %} - -
      -
        -
      • 公众号
      • -
      -
      -
      - {{ partial('setting/wechat_oa') }} -
      -
      -
      - -{% endblock %} \ No newline at end of file diff --git a/app/Http/Admin/Views/setting/wechat_oa.volt b/app/Http/Admin/Views/setting/wechat_oa.volt index 97702aa3..faad9ad7 100644 --- a/app/Http/Admin/Views/setting/wechat_oa.volt +++ b/app/Http/Admin/Views/setting/wechat_oa.volt @@ -1,104 +1,24 @@ -{% set notice_template = oa.notice_template|json_decode %} +{% extends 'templates/main.volt' %} -
      -
      - -
      - - -
      -
      -
      - -
      - -
      -
      -
      - -
      - -
      -
      -
      - -
      - -
      -
      -
      - -
      - -
      -
      -
      - -
      - -
      -
      -
      - -
      - - - -
      -
      - -
      - 模板配置 -
      -
      -
登录提醒登录成功通知
订单通知购买成功提醒
退款通知退款成功通知
直播提醒课程直播提醒
回复通知咨询结果通知
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
名称模板编号
登录成功通知
购买成功提醒
退款成功通知
课程直播提醒
咨询结果通知
-
-
- -
- - - +{% block content %} + +
+
    +
  • 基本设置
  • +
  • 模板消息
  • +
  • 自定义菜单
  • +
+
+
+ {{ partial('setting/wechat_oa_basic') }} +
+
+ {{ partial('setting/wechat_oa_notice') }} +
+
+ {{ partial('setting/wechat_oa_menu') }} +
- \ No newline at end of file + +{% endblock %} \ No newline at end of file diff --git a/app/Http/Admin/Views/setting/wechat_oa_basic.volt b/app/Http/Admin/Views/setting/wechat_oa_basic.volt new file mode 100644 index 00000000..84e952c5 --- /dev/null +++ b/app/Http/Admin/Views/setting/wechat_oa_basic.volt @@ -0,0 +1,66 @@ +
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + + +
+
+
+ +
+
+ 接口测试 +
+
+ +
+ +
+
+
+ +
+ + +
+
+
\ No newline at end of file diff --git a/app/Http/Admin/Views/setting/wechat_oa_menu.volt b/app/Http/Admin/Views/setting/wechat_oa_menu.volt new file mode 100644 index 00000000..0c34b148 --- /dev/null +++ b/app/Http/Admin/Views/setting/wechat_oa_menu.volt @@ -0,0 +1,42 @@ +
+ + + + + + + + + + + + + + + {% for i,top in oa.menu %} + + + + + + {% for j,sub in top.children %} + + + + + + {% endfor %} + {% endfor %} + +
层级名称链接
├──
├──
+
+
+ +
+ + + +
+
+
+ diff --git a/app/Http/Admin/Views/setting/wechat_oa_notice.volt b/app/Http/Admin/Views/setting/wechat_oa_notice.volt new file mode 100644 index 00000000..0b7eee16 --- /dev/null +++ b/app/Http/Admin/Views/setting/wechat_oa_notice.volt @@ -0,0 +1,47 @@ +{% set notice_template = oa.notice_template|json_decode %} + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
模板名称模板编号
登录成功通知
购买成功提醒
退款成功通知
课程直播提醒
咨询结果通知
+
+
+ +
+ + + +
+
+
\ No newline at end of file diff --git a/db/migrations/20210106112717_data_202101061830.php b/db/migrations/20210106112717_data_202101061830.php new file mode 100644 index 00000000..c11aee46 --- /dev/null +++ b/db/migrations/20210106112717_data_202101061830.php @@ -0,0 +1,68 @@ + '菜单1', + 'url' => '', + 'children' => [ + [ + 'type' => 'view', + 'name' => '菜单1-1', + 'url' => 'https://gitee.com/koogua' + ], + ], + ], + [ + 'name' => '菜单2', + 'url' => '', + 'children' => [ + [ + 'type' => 'view', + 'name' => '菜单2-1', + 'url' => 'https://gitee.com/koogua' + ], + ], + ], + [ + 'name' => '菜单3', + 'url' => '', + 'children' => [ + [ + 'type' => 'view', + 'name' => '菜单3-1', + 'url' => 'https://gitee.com/koogua' + ], + ], + ], + ]; + + $rows = [ + [ + 'section' => 'wechat.oa', + 'item_key' => 'menu', + 'item_value' => json_encode($menu), + ], + ]; + + $this->table('kg_setting')->insert($rows)->save(); + + } + + public function down() + { + $this->getQueryBuilder() + ->delete('kg_setting') + ->where(['section' => 'wechat.oa', 'item_key' => 'menu']) + ->execute(); + } + +} \ No newline at end of file diff --git a/public/static/admin/js/common.js b/public/static/admin/js/common.js index 9ad972a9..145c6887 100644 --- a/public/static/admin/js/common.js +++ b/public/static/admin/js/common.js @@ -30,8 +30,9 @@ layui.use(['jquery', 'form', 'element', 'layer', 'dropdown'], function () { 404: function () { layer.msg('资源不存在', {icon: 2, anim: 6}); }, - 500: function () { - layer.msg('服务器内部错误', {icon: 2, anim: 6}); + 500: function (xhr) { + var res = JSON.parse(xhr.responseText); + layer.msg(res.msg, {icon: 2, anim: 6}); } } }); -- Gitee From f58a45a981073e70b633a7ff709880aff7de5ff7 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 9 Jan 2021 17:24:11 +0800 Subject: [PATCH 33/89] =?UTF-8?q?v1.2.4=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 16 + README.md | 61 +- app/Http/Admin/Services/Setting.php | 14 +- app/Http/Home/Controllers/HelpController.php | 13 +- app/Http/Home/Controllers/PageController.php | 13 +- .../Home/Services/WechatOfficialAccount.php | 107 +- app/Http/Home/Views/course/show.volt | 6 +- app/Http/Home/Views/help/show.volt | 33 +- app/Http/Home/Views/page/show.volt | 34 +- app/Http/Home/Views/partials/header.volt | 2 +- app/Http/Home/Views/teacher/pager.volt | 2 +- app/Library/AppInfo.php | 2 +- app/Library/Helper.php | 8 +- app/Services/OAuth.php | 13 +- composer.json | 3 +- composer.lock | 726 +++++++------ public/static/admin/js/vditor.js | 1 + public/static/home/css/markdown.css | 972 ++++++++++++++++++ 18 files changed, 1550 insertions(+), 476 deletions(-) create mode 100644 public/static/home/css/markdown.css 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 @@ ![酷瓜云网课GPL协议开源](https://images.gitee.com/uploads/images/2020/1127/092621_3805cf8f_23592.png) -#### 项目介绍 +### 项目介绍 酷瓜云课堂,依托腾讯云基础服务架构,采用C扩展框架Phalcon开发,GPL-2.0开源协议,致力开源网课系统,开源网校系统,开源在线教育系统。 -![](https://img.shields.io/static/v1?label=release&message=1.2.3&color=blue) -![](https://img.shields.io/static/v1?label=stars&message=160&color=blue) -![](https://img.shields.io/static/v1?label=forks&message=60&color=blue) +![](https://img.shields.io/static/v1?label=release&message=1.2.4&color=blue) +![](https://img.shields.io/static/v1?label=stars&message=168&color=blue) +![](https://img.shields.io/static/v1?label=forks&message=63&color=blue) ![](https://img.shields.io/static/v1?label=license&message=GPL-2.0&color=blue) -#### 系统功能 +### 系统功能 实现了点播、直播、专栏、会员、微聊等,是一个完整的产品,具体功能我也不想写一大堆,自己体验吧! @@ -21,17 +21,19 @@ - 课程数据来源于网络(无实质内容),切莫购买 - 管理后台已禁止数据提交,私密配置已过滤 -演示帐号:**13507083515 / 123456** (前后台通用) - 桌面端演示: - [前台演示](https://ctc.koogua.com) - [后台演示](https://ctc.koogua.com/admin) +演示帐号:100015@163.com / 123456 (前后台通用) + 移动端演示: ![移动端二维码](https://images.gitee.com/uploads/images/2020/1127/093203_265221a2_23592.png) +演示帐号: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/Http/Admin/Services/Setting.php b/app/Http/Admin/Services/Setting.php index 1a28edaa..3ce3f6ac 100644 --- a/app/Http/Admin/Services/Setting.php +++ b/app/Http/Admin/Services/Setting.php @@ -210,29 +210,29 @@ class Setting extends Service if (!empty($settings['menu'])) { foreach ($settings['menu'] as $i => $top) { - $buttons[$i]['name'] = !empty($top['name']) ? $top['name'] : sprintf('菜单%s', $i + 1); - if (!empty($top['url'])) { - $buttons[$i]['url'] = $top['url']; - $buttons[$i]['type'] = 'view'; - } + $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']); } - $this->updateSettings($section, $settings); - if (!empty($buttons)) { $service = new WechatService(); $oa = $service->getOfficialAccount(); $oa->menu->create($buttons); } + + $this->updateSettings($section, $settings); } } diff --git a/app/Http/Home/Controllers/HelpController.php b/app/Http/Home/Controllers/HelpController.php index d525a80a..22d7bc29 100644 --- a/app/Http/Home/Controllers/HelpController.php +++ b/app/Http/Home/Controllers/HelpController.php @@ -2,6 +2,7 @@ namespace App\Http\Home\Controllers; +use App\Http\Home\Services\Index as IndexService; use App\Services\Logic\Help\HelpInfo as HelpInfoService; use App\Services\Logic\Help\HelpList as HelpListService; @@ -12,7 +13,7 @@ class HelpController extends Controller { /** - * @Get("/index", name="home.help.index") + * @Get("/", name="home.help.index") */ public function indexAction() { @@ -34,9 +35,19 @@ class HelpController extends Controller $help = $service->handle($id); + $featuredCourses = $this->getFeaturedCourses(); + $this->seo->prependTitle(['帮助', $help['title']]); $this->view->setVar('help', $help); + $this->view->setVar('featured_courses', $featuredCourses); + } + + protected function getFeaturedCourses() + { + $service = new IndexService(); + + return $service->getSimpleFeaturedCourses(); } } diff --git a/app/Http/Home/Controllers/PageController.php b/app/Http/Home/Controllers/PageController.php index 6796d63d..38b31f97 100644 --- a/app/Http/Home/Controllers/PageController.php +++ b/app/Http/Home/Controllers/PageController.php @@ -2,6 +2,7 @@ namespace App\Http\Home\Controllers; +use App\Http\Home\Services\Index as IndexService; use App\Services\Logic\Page\PageInfo as PageInfoService; /** @@ -19,9 +20,19 @@ class PageController extends Controller $page = $service->handle($id); - $this->seo->prependTitle(['单页', $page['title']]); + $featuredCourses = $this->getFeaturedCourses(); + + $this->seo->prependTitle($page['title']); $this->view->setVar('page', $page); + $this->view->setVar('featured_courses', $featuredCourses); + } + + protected function getFeaturedCourses() + { + $service = new IndexService(); + + return $service->getSimpleFeaturedCourses(); } } diff --git a/app/Http/Home/Services/WechatOfficialAccount.php b/app/Http/Home/Services/WechatOfficialAccount.php index ea19fd02..6fd0e48c 100644 --- a/app/Http/Home/Services/WechatOfficialAccount.php +++ b/app/Http/Home/Services/WechatOfficialAccount.php @@ -3,9 +3,9 @@ namespace App\Http\Home\Services; use App\Models\WechatSubscribe as WechatSubscribeModel; +use App\Repos\User as UserRepo; use App\Repos\WechatSubscribe as WechatSubscribeRepo; use App\Services\Wechat as WechatService; -use App\Validators\User as UserValidator; use EasyWeChat\Kernel\Messages\Text as TextMessage; class WechatOfficialAccount extends Service @@ -50,7 +50,7 @@ class WechatOfficialAccount extends Service { $service = new WechatService(); - $service->logger->debug('Received Message ' . json_encode($message)); + $service->logger->info('Received Message ' . json_encode($message)); switch ($message['MsgType']) { case 'event': @@ -74,7 +74,7 @@ class WechatOfficialAccount extends Service return $this->handleLocationEvent($message); break; default: - return $this->emptyReplyMessage(); + return $this->noMatchReply(); break; } break; @@ -100,7 +100,7 @@ class WechatOfficialAccount extends Service return $this->handleLinkReply($message); break; default: - return $this->emptyReplyMessage(); + return $this->noMatchReply(); break; } } @@ -108,15 +108,15 @@ class WechatOfficialAccount extends Service protected function handleSubscribeEvent($message) { $openId = $message['FromUserName'] ?? ''; - $eventKey = $message['EventKey'] ?? ''; - if (!$eventKey) { - return $this->emptyReplyMessage(); - } + $subscribeRepo = new WechatSubscribeRepo(); - $userId = str_replace('qrscene_', '', $eventKey); + $subscribe = $subscribeRepo->findByOpenId($openId); - $this->handleSubscribeRelation($userId, $openId); + if ($subscribe && $subscribe->deleted == 1) { + $subscribe->deleted = 0; + $subscribe->update(); + } return new TextMessage('开心呀,我们又多了一个小伙伴!'); } @@ -129,7 +129,7 @@ class WechatOfficialAccount extends Service $subscribe = $subscribeRepo->findByOpenId($openId); - if ($subscribe) { + if ($subscribe && $subscribe->deleted == 0) { $subscribe->deleted = 1; $subscribe->update(); } @@ -139,100 +139,95 @@ class WechatOfficialAccount extends Service protected function handleScanEvent($message) { - /** - * 注意:当已关注过用户扫码时,"EventKey"没有带"qrscene_"前缀 - */ $openId = $message['FromUserName'] ?? ''; $eventKey = $message['EventKey'] ?? ''; - $userId = $eventKey; - $this->handleSubscribeRelation($userId, $openId); + $userId = str_replace('qrscene_', '', $eventKey); + + $userRepo = new UserRepo(); + + $user = $userRepo->findById($userId); + + if (!$user) return; + + $subscribeRepo = new WechatSubscribeRepo(); + + $subscribe = $subscribeRepo->findByOpenId($openId); + + if ($subscribe) { + if ($subscribe->user_id != $userId) { + $subscribe->user_id = $userId; + } + if ($subscribe->deleted == 1) { + $subscribe->deleted = 0; + } + $subscribe->update(); + } else { + $subscribe = new WechatSubscribeModel(); + $subscribe->user_id = $userId; + $subscribe->open_id = $openId; + $subscribe->create(); + } } protected function handleClickEvent($message) { - $this->defaultReplyMessage(); + return $this->emptyReply(); } protected function handleViewEvent($message) { - $this->defaultReplyMessage(); + return $this->emptyReply(); } protected function handleLocationEvent($message) { - $this->defaultReplyMessage(); + return $this->emptyReply(); } protected function handleTextReply($message) { - return $this->defaultReplyMessage(); + return $this->emptyReply(); } protected function handleImageReply($message) { - return $this->defaultReplyMessage(); + return $this->emptyReply(); } protected function handleVoiceReply($message) { - return $this->defaultReplyMessage(); + return $this->emptyReply(); } protected function handleVideoReply($message) { - return $this->defaultReplyMessage(); + return $this->emptyReply(); } protected function handleShortVideoReply($message) { - return $this->defaultReplyMessage(); + return $this->emptyReply(); } protected function handleLocationReply($message) { - return $this->defaultReplyMessage(); + return $this->emptyReply(); } protected function handleLinkReply($message) { - return $this->defaultReplyMessage(); + return $this->emptyReply(); } - protected function emptyReplyMessage() + protected function emptyReply() { - return new TextMessage(''); + return null; } - protected function defaultReplyMessage() + protected function noMatchReply() { - return new TextMessage('没有匹配的服务,如有需要请联系客服!'); - } - - protected function handleSubscribeRelation($userId, $openId) - { - $validator = new UserValidator(); - - $validator->checkUser($userId); - - $subscribeRepo = new WechatSubscribeRepo(); - - $subscribe = $subscribeRepo->findByOpenId($openId); - - if ($subscribe) { - if ($subscribe->deleted == 1) { - $subscribe->deleted = 0; - $subscribe->update(); - } - } else { - $subscribe = $subscribeRepo->findSubscribe($userId, $openId); - if (!$subscribe) { - $subscribe = new WechatSubscribeModel(); - $subscribe->user_id = $userId; - $subscribe->open_id = $openId; - $subscribe->create(); - } - } + return new TextMessage('没有匹配的服务哦!'); } } diff --git a/app/Http/Home/Views/course/show.volt b/app/Http/Home/Views/course/show.volt index c229a53b..e10584ed 100644 --- a/app/Http/Home/Views/course/show.volt +++ b/app/Http/Home/Views/course/show.volt @@ -58,7 +58,7 @@ {{ partial('course/show_catalog') }}
-
{{ course.details }}
+
{{ course.details }}
{% if show_tab_packages %} {% set packages_url = url({'for':'home.course.packages','id':course.id}) %} @@ -112,14 +112,12 @@ {% block link_css %} - {{ css_link('https://cdn.jsdelivr.net/npm/vditor/dist/index.css', false) }} + {{ css_link('home/css/markdown.css') }} {% endblock %} {% block include_js %} - {{ js_include('https://cdn.jsdelivr.net/npm/vditor/dist/method.min.js', false) }} - {{ js_include('home/js/markdown.preview.js') }} {{ js_include('home/js/course.show.js') }} {{ js_include('home/js/course.share.js') }} diff --git a/app/Http/Home/Views/help/show.volt b/app/Http/Home/Views/help/show.volt index 79acca71..b6682c6e 100644 --- a/app/Http/Home/Views/help/show.volt +++ b/app/Http/Home/Views/help/show.volt @@ -2,6 +2,8 @@ {% block content %} + {{ partial('macros/course') }} + -
-
{{ help.content }}
+
+
+
+
{{ help.content }}
+
+
+
+ {% if featured_courses %} + + {% endif %} +
{% endblock %} {% block link_css %} - {{ css_link('https://cdn.jsdelivr.net/npm/vditor/dist/index.css', false) }} - -{% endblock %} - -{% block include_js %} - - {{ js_include('https://cdn.jsdelivr.net/npm/vditor/dist/method.min.js', false) }} - {{ js_include('home/js/markdown.preview.js') }} + {{ css_link('home/css/markdown.css') }} {% endblock %} \ No newline at end of file diff --git a/app/Http/Home/Views/page/show.volt b/app/Http/Home/Views/page/show.volt index 231f2885..023dfa76 100644 --- a/app/Http/Home/Views/page/show.volt +++ b/app/Http/Home/Views/page/show.volt @@ -2,29 +2,41 @@ {% block content %} + {{ partial('macros/course') }} + -
-
{{ page.content }}
+
+
+
+
{{ page.content }}
+
+
+
+ {% if featured_courses %} + + {% endif %} +
{% endblock %} {% block link_css %} - {{ css_link('https://cdn.jsdelivr.net/npm/vditor/dist/index.css', false) }} - -{% endblock %} - -{% block include_js %} - - {{ js_include('https://cdn.jsdelivr.net/npm/vditor/dist/method.min.js', false) }} - {{ js_include('home/js/markdown.preview.js') }} + {{ css_link('home/css/markdown.css') }} {% endblock %} \ No newline at end of file diff --git a/app/Http/Home/Views/partials/header.volt b/app/Http/Home/Views/partials/header.volt index 8300003c..1222e867 100644 --- a/app/Http/Home/Views/partials/header.volt +++ b/app/Http/Home/Views/partials/header.volt @@ -1,4 +1,4 @@ -