1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-07-29 19:30:40 +08:00

Compare commits

...

556 Commits

Author SHA1 Message Date
xiaochong0302
2c9f3b7577 补充course_user中教师来源类型 2025-06-19 10:02:10 +08:00
xiaochong0302
13b3327b2f 教师可访问其教授课程 2025-06-18 15:45:44 +08:00
xiaochong0302
247050f4ef Merge branch 'koogua/v1.7.8'
# Conflicts:
#	public/static/admin/js/avatar.upload.js
2025-06-15 16:51:20 +08:00
xiaochong0302
57409cb630 v1.7.8 2025-06-15 15:08:42 +08:00
xiaochong0302
4e1e8340b9 1.添加closeLiveTask
2.优化kg-back返回
3.优化统计分析代码位置
2025-06-11 15:01:23 +08:00
xiaochong0302
2ab6ae71cd 1.优化直播状态显示
2.优化关闭注册提示
2025-06-09 22:46:28 +08:00
xiaochong0302
303442f446 搜索结果中图片alt属性增加striptags过滤 2025-06-09 19:08:33 +08:00
xiaochong0302
7281029dd0 sitemap.xml直接写入public目录 2025-06-05 17:53:06 +08:00
xiaochong0302
f5ed2ce239 优化fixbar电话图标 2025-05-26 19:19:12 +08:00
xiaochong0302
2a1b4b69fd fixbar增加电话图标 2025-05-26 10:41:17 +08:00
xiaochong0302
123e1ec97f 后台重置头像->上传头像 2025-05-23 17:03:58 +08:00
xiaochong0302
b2f795eb3b 还原几个不能为空的腾讯云配置 2025-05-22 23:31:26 +08:00
xiaochong0302
12db90d9c1 还原几个不能为空的腾讯云配置 2025-05-22 23:31:12 +08:00
xiaochong0302
59bfe4a765 gitee webhook测试 2025-05-21 11:05:18 +08:00
xiaochong0302
fb0b760e2e 1.优化后台配置默认值
2.后台增加返回顶部功能
3.精简优化逻辑
2025-05-20 18:09:19 +08:00
xiaochong0302
e31b86580d 优化课时列表直播提示 2025-05-20 18:09:15 +08:00
xiaochong0302
f2a446a876 移除Throttle 2025-05-20 18:09:12 +08:00
xiaochong0302
27440fe679 1.优化后台配置默认值
2.后台增加返回顶部功能
3.精简优化逻辑
2025-05-20 18:06:11 +08:00
xiaochong0302
7a9fee5545 优化课时列表直播提示 2025-05-08 17:18:20 +08:00
xiaochong0302
d927e619e8 移除Throttle 2025-05-02 07:55:38 +08:00
xiaochong0302
77cdc594ff 优化layer窗口中表单的跳转 2025-04-20 17:05:30 +08:00
xiaochong0302
0d8b07033a 优化layer窗口中表单的跳转 2025-04-20 17:03:36 +08:00
xiaochong0302
9ad15b72cf 优化倒计时 2025-04-20 17:03:32 +08:00
xiaochong0302
12f0f6dc87 重命令若干路由 2025-04-20 17:03:28 +08:00
xiaochong0302
3efa081e81 LiveChapter -> LiveChat 2025-04-20 17:03:24 +08:00
xiaochong0302
47a6c5cce1 修正workerman中onMessage无法调用问题 2025-04-20 17:03:20 +08:00
xiaochong0302
328aea1e2d 1.优化章节列表UI
2.优化评价UI
2025-04-20 17:03:17 +08:00
xiaochong0302
e5869e1e8f 1.优化课程目录UI
2.优化收藏UI
3.修正收费课程试听问题
2025-04-20 17:03:14 +08:00
xiaochong0302
9fcea65989 1.优化vip页面
2.优化索引管理工具
2025-04-20 17:03:11 +08:00
xiaochong0302
08d3859e38 1.抽离refund.info.js
2.优化获取临时令牌日志
2025-04-03 19:02:48 +08:00
xiaochong0302
02983a27c9 优化微信公众号相关 2025-04-03 19:02:45 +08:00
xiaochong0302
72deb17daa 增强注册验证 2025-04-03 19:02:42 +08:00
xiaochong0302
76edeef591 v1.7.6 2025-03-19 22:09:45 +08:00
xiaochong0302
9c737c7241 更新layui-v2.9.25 2025-03-19 22:09:41 +08:00
xiaochong0302
21f9bdd4b1 去除不必要的deliver阻断 2025-03-19 22:09:36 +08:00
xiaochong0302
9b0700e5c1 统一支付和登录二维码样式 2025-03-19 22:09:23 +08:00
xiaochong0302
054ab77f08 去除多余的引入 2025-03-11 18:51:50 +08:00
xiaochong0302
90ab9bc018 修正文章和问题缓存 2025-03-11 18:48:58 +08:00
xiaochong0302
77b7224901 限制全文搜索长度为50 2025-03-11 18:48:55 +08:00
xiaochong0302
f5665bc94a 修正SiteVisit积分问题 2025-02-25 16:41:48 +08:00
xiaochong0302
2b08bf737d v1.7.5 2025-02-22 16:03:56 +08:00
xiaochong0302
fce99c2472 优化编辑器页 2025-02-20 20:10:24 +08:00
xiaochong0302
5854d86875 整理categoryId相关 2025-02-20 20:10:21 +08:00
xiaochong0302
e22f3b4bdc 精简优化错误处理机制 2025-02-17 20:16:15 +08:00
xiaochong0302
3070231ca8 优化错误处理机制 2025-02-17 12:42:11 +08:00
xiaochong0302
38f8e27c9c 修正用户注册时502 bad gateway 2025-02-16 13:14:34 +08:00
xiaochong0302
fb7301de4c 1.优化Nav导航
2.优化logo样式
2025-02-16 13:14:31 +08:00
xiaochong0302
9206166910 1.优化后台数据统计日期问题
2.优化内容图片放大查看
2025-02-16 13:14:17 +08:00
xiaochong0302
97af1081d3 修正root账号初始数据 2025-01-10 21:14:37 +08:00
xiaochong0302
2d26c2659b 统一规范$this->response->redirect 2025-01-08 17:42:39 +08:00
xiaochong0302
f273e874e7 Merge branch 'koogua/v1.7.5' 2025-01-05 21:34:33 +08:00
xiaochong0302
b919239308 v1.7.5 release 2025-01-05 21:33:29 +08:00
xiaochong0302
9d210deedf 去除过度设计的缓存 2025-01-05 20:51:54 +08:00
xiaochong0302
09723a9d34 优化积分兑换页 2025-01-05 09:21:45 +08:00
xiaochong0302
9d8ed0f863 还原分页中kg_array_object 2025-01-04 17:21:29 +08:00
xiaochong0302
e27a203ac8 精简整理代码 2025-01-02 11:29:06 +08:00
xiaochong0302
c3887845a9 更新QQ支持群 2024-12-28 14:40:18 +08:00
xiaochong0302
4d810eae98 更新QQ支持群 2024-12-28 14:39:29 +08:00
xiaochong0302
601c71b8a4 精简代码 2024-12-27 21:21:29 +08:00
xiaochong0302
3a6d295aa1 精简判断 2024-12-24 10:56:02 +08:00
xiaochong0302
6614cdc8d2 1.优化boostrap
2.优化logger
3.优化contact
2024-12-16 20:27:40 +08:00
xiaochong0302
0f38ce7d62 1.优化搜索索引
2.优化服务状态监控
3.优化ChapterUserTrait
2024-12-13 08:37:31 +08:00
xiaochong0302
6f005f741c Merge remote-tracking branch 'origin/master' 2024-12-08 16:00:41 +08:00
xiaochong0302
9a51f95d26 v1.7.4 release 2024-12-07 18:23:43 +08:00
xiaochong0302
41cb93d6d5 升级layui-v2.9.20 2024-12-07 11:35:57 +08:00
xiaochong0302
978b77a184 优化CourseUserTrait等 2024-12-06 21:56:49 +08:00
xiaochong0302
98cc8da285 1.精简AccountSearchTrait
2.优化CsrfToken
3.优化kg_setting
4.修正CommentInfo
2024-12-02 17:14:31 +08:00
xiaochong0302
a0e7bce18b 优化kg_h5_index_url() 2024-11-14 17:26:35 +08:00
xiaochong0302
9811186434 修正chapter详情页目录中当前课时高亮问题 2024-11-13 21:59:10 +08:00
xiaochong0302
cdc8074f88 联系方式增加抖音二维码 2024-11-10 22:26:37 +08:00
xiaochong0302
0f446fef10 优化课程期限 2024-11-09 20:38:29 +08:00
xiaochong0302
7ff6f470aa 优化定时自动提交 2024-11-09 20:38:15 +08:00
xiaochong0302
5b30d5d880 优化定时自动提交 2024-11-09 20:37:43 +08:00
xiaochong0302
f482a8ec9e 优化课程期限 2024-10-20 19:32:33 +08:00
xiaochong0302
2302f44c03 Merge branch 'koogua/v1.7.3' 2024-10-10 21:01:29 +08:00
xiaochong0302
4ec6f60b06 v1.7.3 release 2024-10-10 21:00:33 +08:00
xiaochong0302
fa8d27d668 v1.7.3 release 2024-10-10 20:59:23 +08:00
xiaochong0302
a24ea6149e 更新layui-v2.9.16 2024-09-21 11:09:49 +08:00
xiaochong0302
978f064e2b 增加编辑器内容自动提交 2024-09-18 10:23:02 +08:00
xiaochong0302
a360ce0f83 1.优化findUserActiveSessions
2.优化findUserActiveTokens
3.修改文章和提问可用tag数量
4.优化用户锁定相关
2024-09-14 08:32:33 +08:00
xiaochong0302
9b37570a78 1.优化默认文件上传
2.上传文件失败抛出异常
2024-08-13 19:47:38 +08:00
xiaochong0302
86efc64651 Merge branch 'koogua/v1.7.2' 2024-08-13 09:29:06 +08:00
xiaochong0302
d5353ff5d2 1.增加log.trace日志配置
2.migration抽象增加saveSetting方法
2024-08-13 09:27:26 +08:00
xiaochong0302
3a703dd0e1 1.redis增加expire()方法
2.精简代码
2024-07-30 20:06:17 +08:00
xiaochong0302
7c5ea7fe34 后台增加客户服务入口 2024-07-27 08:30:03 +08:00
xiaochong0302
17691a6a1b 修正课程列表分类筛选条件 2024-07-25 11:51:28 +08:00
xiaochong0302
759253cfc5 修正TeacherLiveNotice 2024-07-24 14:21:53 +08:00
xiaochong0302
0f5ed61158 更新layui-v2.9.14 2024-07-12 17:46:01 +08:00
xiaochong0302
e39c140d35 整理doc参数 2024-07-05 20:30:56 +08:00
xiaochong0302
91a878ba98 整理doc参数 2024-07-05 20:30:32 +08:00
xiaochong0302
56f94d3ea8 修正邮件内容格式化 2024-07-04 15:31:24 +08:00
xiaochong0302
36ee91c1cf 修正邮件内容格式化 2024-07-04 15:31:00 +08:00
xiaochong0302
8aaed108b9 Merge branch 'koogua/v1.7.1' 2024-07-01 10:03:35 +08:00
xiaochong0302
4a5cc68915 优化公众号关注订阅 2024-07-01 09:24:29 +08:00
xiaochong0302
f0470c027d 优化邮件发送格式化 2024-06-29 21:26:53 +08:00
xiaochong0302
703d5cbc3d 短信发送处理中增加描述对照 2024-06-28 20:41:45 +08:00
xiaochong0302
f04c23e90f 1.添加课程和章节事件监听
2.优化SEO类
2024-06-28 08:26:28 +08:00
xiaochong0302
b55350a9a4 整理文件,去除无用代码 2024-06-23 08:16:59 +08:00
xiaochong0302
0aa07da41b 整理文件,去除无用代码 2024-06-23 08:16:20 +08:00
xiaochong0302
f66dab48ec Merge branch 'koogua/v1.7.1' 2024-06-21 10:06:14 +08:00
xiaochong0302
2014d99c7e 更新layui-v2.9.10 2024-06-21 09:59:13 +08:00
xiaochong0302
3efdc0698e 课程增加是否能够发布检查 2024-06-12 15:52:24 +08:00
xiaochong0302
675ee63674 清理创建kindeditor默认语言文件 2024-06-12 12:37:59 +08:00
xiaochong0302
14534b8461 去除课程打赏 2024-06-08 15:40:09 +08:00
xiaochong0302
30d9b80ca8 更新文件mimeType 2024-06-02 16:50:35 +08:00
xiaochong0302
17b7f64de7 1.优化富文本内容显示样式
2.简化内容图片放大监听
2024-06-01 16:27:15 +08:00
xiaochong0302
8e618b5bc7 更新mimeTypes 2024-05-29 20:49:23 +08:00
xiaochong0302
4467f8748f 优化FileInfo中MimeType检查 2024-05-28 17:31:39 +08:00
xiaochong0302
45125453e0 iconfont资源本地化 2024-05-28 17:19:52 +08:00
xiaochong0302
200a0b0d16 1.优化storage上传mimeType检查
2.增加打开/关闭左侧菜单提示
2024-05-26 11:49:02 +08:00
xiaochong0302
272a3255d2 优化UploadController 2024-05-26 11:48:18 +08:00
xiaochong0302
dfb88ee09e 1.优化storage上传mimeType检查
2.增加打开/关闭左侧菜单提示
2024-05-25 21:55:04 +08:00
xiaochong0302
0c962920de connect_list增加过滤条件 2024-05-18 09:28:39 +08:00
xiaochong0302
b0b28117f5 connect_list增加过滤条件 2024-05-18 09:28:01 +08:00
xiaochong0302
e22a716aa5 1.调整微信公众号模板消息 2024-05-17 15:46:18 +08:00
xiaochong0302
dd469752e1 1.调整微信公众号模板消息 2024-05-17 15:45:58 +08:00
xiaochong0302
f5ba565f99 修正课程列表顶部过滤条件部分无法收缩问题 2024-05-16 21:29:26 +08:00
xiaochong0302
d0921a8afd 修正课程列表顶部过滤条件部分无法收缩问题 2024-05-16 21:29:02 +08:00
xiaochong0302
fba681a4b5 移除consult中多余的chapter_id属性 2024-05-16 16:46:33 +08:00
xiaochong0302
56f66c01bd 调整微信公众号模板消息 2024-05-16 11:29:19 +08:00
xiaochong0302
8a5aa01d1c 支付限额1w->10w 2024-05-13 18:52:57 +08:00
xiaochong0302
a31c991b1c 1.优化ShareUrl
2.第三方登录增加账号可用性判断
3.优化公众号关注相关
2024-05-12 19:17:57 +08:00
xiaochong0302
b2eb5d56d3 Merge branch 'koogua/v1.6.9' 2024-05-10 09:41:19 +08:00
xiaochong0302
0c30cda0c3 v1.7.0 2024-05-09 21:40:40 +08:00
xiaochong0302
a0e8e932e1 v1.7.0 2024-05-09 21:37:23 +08:00
xiaochong0302
bd14979e9b 调整编辑器htmlTags属性 2024-05-05 21:52:13 +08:00
xiaochong0302
4e80f3938a 登录后台同时登录前台 2024-05-02 11:04:21 +08:00
xiaochong0302
9addc3debe 调整编辑器条目 2024-04-29 16:26:59 +08:00
xiaochong0302
e24cf1bd1c 1.调整编辑器条目
2.增加代码块复制
2024-04-28 21:17:36 +08:00
xiaochong0302
c355709d03 Merge branch 'koogua/v1.6.9' 2024-04-24 15:42:19 +08:00
xiaochong0302
2b3372c8e8 更新layui-v2.9.8 2024-04-24 15:20:16 +08:00
xiaochong0302
a790cf878b 清理无用的Captcha配置 2024-04-23 22:52:35 +08:00
xiaochong0302
4171039f16 contact改QQ上传二维码图片 2024-04-23 22:12:34 +08:00
xiaochong0302
9a29e21441 contact改QQ上传二维码图片 2024-04-23 22:12:23 +08:00
xiaochong0302
502bd8588d 修正contact二维码图片上传上传 2024-04-23 20:59:15 +08:00
xiaochong0302
621123ee3d 修正contact二维码图片上传上传 2024-04-23 20:58:44 +08:00
xiaochong0302
0d6420ef16 修正logo,favicon上传 2024-04-20 10:50:02 +08:00
xiaochong0302
547bb72910 修正logo,favicon上传 2024-04-20 10:49:37 +08:00
xiaochong0302
046db8877c Merge branch 'koogua/v1.6.9'
# Conflicts:
#	app/Validators/Security.php
2024-04-13 08:05:15 +08:00
xiaochong0302
c968a3a69f v1.6.9 2024-04-10 19:42:48 +08:00
xiaochong0302
d31ae5b7be 1.修正chapter_user中duration重复计数的问题 2024-04-10 18:58:55 +08:00
xiaochong0302
65b0bf1678 补充缺失的CourseUserTrait 2024-04-10 17:10:18 +08:00
xiaochong0302
af4b570681 增加删除和还原用户功能 2024-04-08 10:59:19 +08:00
xiaochong0302
d95b218812 优化CourseUserTrait 2024-04-06 22:27:43 +08:00
xiaochong0302
d3623b2654 优化CategoryTreeList 2024-04-02 10:48:33 +08:00
xiaochong0302
b96c711a6f 更新layui-v2.9.7 2024-03-24 21:00:17 +08:00
xiaochong0302
89145284aa 1.Response增加unauthorized响应
2.open_avatar字段增加长度为255
3.清理无用的代码
2024-03-13 08:57:55 +08:00
xiaochong0302
00cb8bf963 1.拆解migration创建表脚本
2.增加post方式传递csrf_token
3.优化storage上传
2024-02-26 09:56:51 +08:00
xiaochong0302
c304fbd423 1.修正home模块编辑器图片上传
2.精简CsrfToken白名单
2024-02-04 16:59:08 +08:00
xiaochong0302
2506ea4078 1.优化文章和提问搜索条件
2.优化课程详情页排版
2024-02-04 16:57:13 +08:00
xiaochong0302
542e96846f 1.修正home模块编辑器图片上传
2.精简CsrfToken白名单
2024-02-02 20:58:22 +08:00
xiaochong0302
3b18267c6f 1.删除chapter中resource_count,consult_count属性
2.重新统计course中resource_count
2024-01-31 18:06:01 +08:00
xiaochong0302
c4259d78f3 1.删除chapter中resource_count,consult_count属性
2.重新统计course中resource_count
2024-01-31 18:01:25 +08:00
xiaochong0302
6a5c4845dc 修正首页缓存刷新问题 2024-01-30 17:54:32 +08:00
xiaochong0302
9b7a244fa3 修正首页缓存刷新问题 2024-01-30 17:54:09 +08:00
xiaochong0302
d0091f4695 Merge branch 'koogua/v1.6.8'
# Conflicts:
#	app/Http/Admin/Views/chapter/lessons.volt
#	app/Http/Admin/Views/chapter/lessons_live.volt
#	app/Http/Admin/Views/chapter/lessons_offline.volt
#	app/Http/Admin/Views/chapter/lessons_read.volt
#	app/Http/Admin/Views/chapter/lessons_vod.volt
2024-01-30 12:02:00 +08:00
xiaochong0302
01587189cb v1.6.8发布 2024-01-30 11:47:15 +08:00
xiaochong0302
45dfa0d269 去除league/commonmark包 2024-01-25 21:45:01 +08:00
xiaochong0302
56e04fc3a3 优化分类等必选判断 2024-01-22 12:37:58 +08:00
xiaochong0302
3079a9855a 修正course_user中active_time未更新问题 2024-01-11 20:42:54 +08:00
xiaochong0302
ebc609ac19 修正chapter_user表中plan_id=0问题 2024-01-11 20:31:09 +08:00
xiaochong0302
486ac7bd69 修正chapter_user表中plan_id=0问题 2024-01-11 20:30:28 +08:00
xiaochong0302
5e1ca229ec 修正课时评论管理链接 2024-01-11 18:51:52 +08:00
xiaochong0302
680f1cf1bc 修复sync_learning时,course_user未更新active_time问题 2024-01-11 13:00:24 +08:00
xiaochong0302
b67011c041 修复主页simple模式免费课程模块样式问题 2024-01-08 11:21:49 +08:00
xiaochong0302
fd2e8d2aee 1.优化错误处理
2.更新layui2.9.3
2024-01-07 09:31:50 +08:00
xiaochong0302
78d538c816 清理代码 2023-12-30 15:23:53 +08:00
xiaochong0302
5ce45971e6 优化AccountSearchTrait 2023-12-28 21:31:59 +08:00
xiaochong0302
33fc75b9f8 1.精简chapter/lessons.volt
2.使用ServiceTrait精简代码
2023-12-27 16:05:23 +08:00
xiaochong0302
59e27e1443 修正用户active_time搜索条件 2023-12-25 20:18:41 +08:00
xiaochong0302
ce9f0eade0 修正用户active_time搜索条件 2023-12-25 20:18:13 +08:00
xiaochong0302
411ffe8f1c 统一layui-skin=switch属性位置 2023-12-21 09:30:41 +08:00
xiaochong0302
decf80273a 统一layui-skin=switch属性位置 2023-12-21 09:26:48 +08:00
xiaochong0302
db82de6f35 修正plan_id格式问题 2023-12-20 21:54:01 +08:00
xiaochong0302
52aa85b2ae 修正plan_id格式问题 2023-12-20 21:53:47 +08:00
xiaochong0302
6c33dbc724 修正课时发布switch开关问题 2023-12-20 21:39:25 +08:00
xiaochong0302
2714a048f8 修正课时发布switch开关问题 2023-12-20 21:38:27 +08:00
xiaochong0302
dd0c26d6ad v1.6.8 start 2023-12-20 21:17:10 +08:00
xiaochong0302
8e40019939 Merge branch 'koogua/v1.6.7' 2023-12-13 20:54:01 +08:00
xiaochong0302
fb01e61332 去除分类必选限制 2023-12-13 20:20:51 +08:00
xiaochong0302
da0cc73c12 优化变量名和排版 2023-12-13 12:53:35 +08:00
xiaochong0302
b192760deb 优化相关文章和问题 2023-12-12 17:18:24 +08:00
xiaochong0302
e0da7b71b3 调整内容缓存时间 2023-12-12 16:19:04 +08:00
xiaochong0302
56f909b5d2 调整推荐课程缓存时间 2023-12-11 17:47:07 +08:00
xiaochong0302
c859deec44 vip.js -> vip.index.js 2023-12-11 12:56:43 +08:00
xiaochong0302
435bc12035 增加问题推荐 2023-12-11 12:23:42 +08:00
xiaochong0302
dca1ccf79a 优化排版 2023-12-10 20:55:26 +08:00
xiaochong0302
817b32b067 放弃部分地方缓存的使用 2023-12-09 19:02:05 +08:00
xiaochong0302
51428ac97a 补充遗漏的批量删除点击事件 2023-12-09 09:01:18 +08:00
xiaochong0302
8f22cab282 优化批量删除后的跳转 2023-12-08 20:17:39 +08:00
xiaochong0302
982b1d5ca7 删除多余文件 2023-12-07 20:57:25 +08:00
xiaochong0302
f3fcb6956a beta 2023-12-07 17:09:28 +08:00
xiaochong0302
3dd5490bdb 阶段性优化 2023-12-06 20:24:09 +08:00
xiaochong0302
5268e6370c Merge remote-tracking branch 'origin/koogua/v1.6.7' into koogua/v1.6.7 2023-12-04 19:47:11 +08:00
xiaochong0302
79a678fa54 阶段性优化 2023-12-04 19:46:54 +08:00
xiaochong0302
0072b4f5fe 精简代码 2023-10-29 22:30:14 +08:00
koogua
51de0ed94b 字数统计加上图片字数 2023-10-01 11:05:53 +08:00
xiaochong0302
26e3e94881 修正绑定邮箱password未定义错误 2023-09-22 20:42:13 +08:00
xiaochong0302
0a86fc3f05 修正绑定邮箱password未定义错误 2023-09-22 20:41:42 +08:00
xiaochong0302
e905e7cb96 修正课程课件资源列表权限 2023-09-18 06:53:05 +08:00
xiaochong0302
2c881547b4 修正课程课件资源列表权限 2023-09-18 06:52:57 +08:00
xiaochong0302
7d54f0e933 增加匿名评价 2023-09-16 21:44:23 +08:00
xiaochong0302
1bef24f217 1.kg_course表增加索引
2.优化错误页
3.优化富文本内容长度获取
4.优化layer关闭窗口后发布状态同步
2023-09-16 20:51:31 +08:00
xiaochong0302
0dec52806b 优化直播测试的streamName解析 2023-09-04 10:53:47 +08:00
xiaochong0302
241d802fe1 直播页分享地址:full_url->share_url 2023-09-04 10:38:10 +08:00
xiaochong0302
66bd0965d6 去除课时列表中的课件属性 2023-09-03 10:54:55 +08:00
xiaochong0302
40380132a2 Merge branch 'koogua/v1.6.6'
# Conflicts:
#	app/Http/Admin/Services/Resource.php
2023-08-31 17:41:09 +08:00
xiaochong0302
ebd310caa6 v1.6.6 2023-08-31 17:18:05 +08:00
xiaochong0302
138b9d45ce 日常优化 2023-08-28 15:55:40 +08:00
xiaochong0302
504bf6d8e6 去除删除远程COS课件的逻辑 2023-08-11 15:54:11 +08:00
xiaochong0302
65b5190a05 去除删除远程COS课件的逻辑 2023-08-11 15:53:41 +08:00
xiaochong0302
f284a8ef92 修正邮箱注册提交按钮不可用问题 2023-08-03 16:57:15 +08:00
xiaochong0302
c584f25455 修正邮箱注册提交按钮不可用问题 2023-08-03 16:56:18 +08:00
xiaochong0302
85ba7911ac 优化cleanDemoDataTask 2023-08-02 17:59:47 +08:00
xiaochong0302
190117146f 优化tag表migration 2023-08-02 17:18:25 +08:00
xiaochong0302
c0e44a76d0 v1.6.6开始 2023-07-23 18:56:49 +08:00
xiaochong0302
0c9256751d 优化AuthTrait 2023-07-11 09:55:21 +08:00
xiaochong0302
1c0af6fa1e 去除后台登录页的captcha检查 2023-07-10 17:40:18 +08:00
xiaochong0302
4f18d78356 去除后台登录页的无用captcha代码 2023-07-10 15:08:44 +08:00
xiaochong0302
621b921862 v1.6.5发布说明 2023-07-05 16:58:42 +08:00
xiaochong0302
e48d831ce3 1.清理无用代码
2.递归函数增加返回值
2023-07-03 18:51:20 +08:00
xiaochong0302
30ece511df 1.优化日志清理
2.增加cli下带色输出
2023-07-03 16:23:11 +08:00
xiaochong0302
b519fd4d6d 1.去除腾讯验证码
2.使用本地验证码
2023-06-25 18:48:55 +08:00
xiaochong0302
fca03feb35 清理layui扩展引入 2023-06-24 17:00:54 +08:00
xiaochong0302
71898bf5ec 清理无用的计划任务 2023-06-23 19:57:21 +08:00
xiaochong0302
cf80b3c878 更新layui-v2.8.8 2023-06-23 19:50:51 +08:00
xiaochong0302
44b5633f23 更新layui-v2.8.8 2023-06-20 21:16:59 +08:00
xiaochong0302
f0fdd6ebbb 修正图文分享链接参数问题 2023-06-19 14:05:41 +08:00
xiaochong0302
c9ddb0abab 修正钉钉机器人webhook配置 2023-06-17 18:51:06 +08:00
xiaochong0302
13ff32343d Merge branch 'koogua/v1.6.4' 2023-06-15 21:45:30 +08:00
xiaochong0302
41c4fc45b2 更新版本号v1.6.4 2023-06-15 19:45:15 +08:00
xiaochong0302
9159e28b51 v1.6.4 2023-06-15 19:40:44 +08:00
xiaochong0302
36ef6ca37b 优化课程章节handleMeInfo 2023-06-15 18:55:31 +08:00
xiaochong0302
a72f44225f 1.优化课程章节权限
2.优化钉钉机器人
2023-06-15 18:05:27 +08:00
xiaochong0302
f7a3c0d736 优化Providers 2023-06-15 11:39:26 +08:00
xiaochong0302
fb5feb0759 优化通知 2023-06-15 11:32:59 +08:00
xiaochong0302
ce2329a71c 优化用户课程查找 2023-06-15 10:55:17 +08:00
xiaochong0302
5985576065 1.优化语法层面
2.增加推荐课程|文章|考试widget
2023-05-23 17:27:14 +08:00
xiaochong0302
cced354b2a Merge branch 'koogua/v1.6.4' of https://gitee.com/koogua/course-tencent-cloud into koogua/v1.6.4 2023-05-22 21:14:00 +08:00
xiaochong0302
f094f10011 恢复误删的AnswerList 2023-05-22 21:13:50 +08:00
koogua
2a055d9ad4 更新composer包 2023-05-22 19:20:14 +08:00
xiaochong0302
e3e5d20a7c 纠正单词评选错误 2023-05-12 18:52:11 +08:00
xiaochong0302
7322d1fc0d 优化分享URL 2023-05-11 21:54:20 +08:00
koogua
84d21d80da 优化me相关信息 2023-05-10 21:08:15 +08:00
xiaochong0302
772380adcd 优化订单确认页样式 2023-05-09 11:29:47 +08:00
xiaochong0302
5405e1652e 优化订单确认页样式 2023-05-09 11:26:02 +08:00
xiaochong0302
259859fae6 修正验证登录空口令问题 2023-05-08 23:41:39 +08:00
xiaochong0302
251c1348fa 修正验证登录空口令问题 2023-05-08 23:38:10 +08:00
xiaochong0302
a581b0d493 Merge branch 'koogua/v1.6.3' 2023-05-07 21:00:31 +08:00
xiaochong0302
464527fe67 v1.6.3 2023-05-07 20:59:01 +08:00
xiaochong0302
1b1c048cca 优化htmlprufier处理 2023-05-07 18:12:00 +08:00
xiaochong0302
d59a63079a 过滤html实体编码xss 2023-05-07 16:25:16 +08:00
xiaochong0302
5ca47be92c 优化课程过滤分组条件样式 2023-05-06 14:48:13 +08:00
xiaochong0302
a343b3c5f5 更新layui-v2.8.2 2023-05-05 15:37:46 +08:00
xiaochong0302
c639f89c7b 替换xiaochong0302/ip2region 2023-05-03 17:23:08 +08:00
xiaochong0302
bba2842967 升级layui-v2.8.1 2023-05-03 15:52:44 +08:00
xiaochong0302
14b2e1df20 优化语法相关 2023-05-03 15:18:54 +08:00
xiaochong0302
56bbb7d6fe 优化排序条件,改善分页重复问题 2023-03-08 19:49:01 +08:00
xiaochong0302
5a061ad9fb 修正手续费率设置为0无效的问题 2023-03-05 17:03:48 +08:00
xiaochong0302
fcd15c1a5f 去除未支付“新鲜”订单检查 2023-03-03 19:40:59 +08:00
xiaochong0302
df9d77cad2 1.强化文章|提问|课程列表参数检查
2.优化课程学习时长同步
2023-02-26 19:07:54 +08:00
xiaochong0302
d65e4cab43 Merge branch 'master' of https://gitee.com/koogua/course-tencent-cloud 2023-02-16 14:05:53 +08:00
koogua
7355e8c625 Merge branch 'koogua/v1.6.2'
# Conflicts:
#	CHANGELOG.md
2023-02-15 20:38:46 +08:00
koogua
59b3edc1c0 Merge remote-tracking branch 'gitee/koogua/v1.6.2' into koogua/v1.6.2 2023-02-15 19:47:15 +08:00
koogua
f5753da68b v1.6.2发布 2023-02-15 19:47:00 +08:00
koogua
d560e62405 v1.6.2发布 2023-02-15 19:41:24 +08:00
xiaochong0302
2bc5cbf1a9 优化Repo查询 2023-02-15 00:10:11 +08:00
xiaochong0302
ecb20a14f4 优化条件判断 2023-02-14 22:30:02 +08:00
xiaochong0302
74c08316f1 修正记忆播放问题 2023-02-12 17:09:21 +08:00
xiaochong0302
a3d62c71bf 腾讯云短信模板规则更新,同步更新短信内容 2022-12-31 17:04:15 +08:00
xiaochong0302
254a78f246 ServerMonitor资源监控阀值可配置 2022-12-20 16:36:13 +08:00
xiaochong0302
2a20d1eb2e v1.6.2开始 2022-12-15 11:08:00 +08:00
xiaochong0302
db077346e1 补充发行说明 2022-12-15 10:52:01 +08:00
koogua
8b501d8757 v1.6.1发布 2022-12-12 16:22:09 +08:00
koogua
1f996ab384 修正通知标记为已读,计数不归零问题 2022-12-12 16:07:01 +08:00
koogua
2145316913 添加套餐页面去除summary,和商业版保持一致 2022-12-12 16:02:38 +08:00
koogua
77228b99f0 Merge branch 'koogua/v1.6.1' of gitee.com:koogua/course-tencent-cloud into koogua/v1.6.1 2022-12-12 15:58:33 +08:00
xiaochong0302
1b25ccc30d 优化语法结构 2022-11-28 19:28:07 +08:00
koogua
3d42389012 修正播放器中央播放按钮显示问题 2022-11-17 18:05:45 +08:00
xiaochong0302
46beccb67a 优化腾讯云播放地址鉴权参数 2022-11-13 17:08:52 +08:00
koogua
7f9a63886f 优化学员学习记录显示 2022-11-10 12:08:46 +08:00
koogua
bd4d340f53 Merge branch 'koogua/v1.6.1' of gitee.com:koogua/course-tencent-cloud into koogua/v1.6.1 2022-11-07 10:34:19 +08:00
xiaochong0302
05837d6c5f 简化单章节层级显示 2022-11-06 23:19:15 +08:00
xiaochong0302
46176071b8 优化热门作者,答主和问题 2022-11-06 12:55:12 +08:00
koogua
a941d1129a 富文本编辑器增加粘贴图片和远程图片本地化 2022-11-02 15:01:25 +08:00
koogua
301557abbc 优化表单数据提交体验 2022-10-31 20:18:34 +08:00
xiaochong0302
372b996365 精简代码 2022-10-31 09:53:24 +08:00
xiaochong0302
3c5310b5bd Merge branch 'master' of https://gitee.com/koogua/course-tencent-cloud 2022-10-30 23:38:24 +08:00
koogua
6edbcc4638 v1.6.1开工 2022-10-28 17:05:24 +08:00
koogua
3e7082b251 修正大播放图标不居中问题 2022-10-28 15:41:37 +08:00
koogua
1825f2346f Merge branch 'koogua/v1.6.0' 2022-10-27 19:05:22 +08:00
koogua
dd2c3009a4 v1.6.0 2022-10-27 19:04:21 +08:00
xiaochong0302
6b6ccea185 更新composer.json 2022-10-26 00:34:15 +08:00
xiaochong0302
fd1c209a1d 更新composer.json 2022-10-26 00:32:14 +08:00
koogua
04c0ac186f 优化热门答主 2022-10-21 21:00:07 +08:00
koogua
5032c0b432 优化热门问题和热门答主 2022-10-21 20:30:50 +08:00
koogua
d8c5a3d0a2 优化通知计数 2022-10-21 17:55:31 +08:00
koogua
a3cb6d757a 单页和帮助增加浏览属性 2022-10-21 15:09:41 +08:00
koogua
7153d4e5ef 1.导航教师->师资
2.播放器中间增加播放按钮
2022-10-10 17:58:25 +08:00
koogua
63a1f6eb1d 优化内容表格样式 2022-10-02 15:42:43 +08:00
koogua
810956cf36 logo添加首页链接 2022-09-29 18:29:45 +08:00
koogua
2ece258a67 调整退款收费费率范围 2022-09-29 18:13:37 +08:00
koogua
fc4ee4cf49 更新composer包 2022-09-22 11:10:58 +08:00
koogua
de38cc756d 调整layui-main样式更新导致的尺寸问题 2022-09-21 17:48:34 +08:00
koogua
d840f5fe71 更新包版本 2022-09-21 17:08:44 +08:00
koogua
1c42df299e Merge branch 'koogua/v1.5.9' 2022-09-20 17:58:22 +08:00
koogua
370ffa4250 优化错误日志 2022-09-20 17:55:49 +08:00
koogua
c17447784c 绑定页增加用户协议和隐私政策 2022-09-19 18:51:47 +08:00
koogua
79cc6b9c9e 增加用户协议和隐私政策 2022-09-19 17:58:52 +08:00
koogua
06607e7f2e 升级layui v2.7.6 2022-09-17 18:51:12 +08:00
koogua
9ebbf2cecc 优化router扫描规则 2022-09-16 18:44:33 +08:00
koogua
79a2253918 1.文章单页等增加关键字
2.专题增加封面上传
2022-09-15 20:39:49 +08:00
koogua
c801559b62 更新微博分享链接 2022-09-15 16:08:46 +08:00
koogua
3854a082d3 1.更新默认图片
2.更新直播名格式化
2022-09-15 16:08:04 +08:00
koogua
8d64969040 调整Notice目录结构 2022-09-08 20:01:11 +08:00
koogua
b79d6e5588 去除user全文索引相关 2022-09-06 17:30:06 +08:00
koogua
42f591173d 修正内容图片上传问题 2022-09-06 11:03:43 +08:00
koogua
93ec72faf6 修正内容图片上传问题 2022-09-06 11:03:19 +08:00
koogua
fbcc721828 去除group残留 2022-09-06 10:58:02 +08:00
koogua
bf3b84638a Merge branch 'koogua/v1.5.8' 2022-08-31 10:31:30 +08:00
koogua
1093f52350 Merge branch 'koogua/v1.5.8' into develop 2022-08-31 10:31:06 +08:00
koogua
a47e63340e 优化文章缩略图尺寸 2022-08-31 10:30:16 +08:00
koogua
73d04e3c63 Merge branch 'koogua/v1.5.8' 2022-08-31 10:28:38 +08:00
koogua
ea78fd3c5c 优化文章缩略图尺寸 2022-08-31 10:27:03 +08:00
koogua
6870380091 优化用户登录,用户注册,忘记密码 2022-08-28 10:32:25 +08:00
koogua
13873dcb0b sitemap条目增加过滤条件 2022-08-24 14:51:18 +08:00
koogua
b60f8fe485 优化登录/注册/忘记密码页 2022-08-22 15:06:52 +08:00
koogua
21f79dad80 整理migrations 2022-08-19 18:06:10 +08:00
koogua
923095700f 整理migrations 2022-08-19 17:10:30 +08:00
koogua
290fda610b 修复升级cos-sdk带来的参数检查错误 2022-08-19 15:31:45 +08:00
koogua
9b55b04e5f 修复升级cos-sdk带来的参数检查错误 2022-08-19 15:31:34 +08:00
koogua
4c9557c5c8 优化腾讯云短信错误日志 2022-08-17 17:17:25 +08:00
koogua
2628f6b7d7 1.整理查询构建语句
2.整理前台编辑器页面
2022-08-15 17:22:33 +08:00
koogua
20fb468f0d 整理优化css 2022-08-12 17:21:29 +08:00
koogua
cd9422afc1 1.清理群组残留
2.优化HtmlPurifier缓存目录自动创建
2022-08-09 16:43:55 +08:00
koogua
107c54dba9 v1.5.6 2022-08-08 17:11:28 +08:00
koogua
5d2a4b8b11 kindeditor替换vditor
markdown转html
2022-08-01 18:57:58 +08:00
koogua
cd3922e3dd 去除群组和微聊 2022-08-01 16:43:55 +08:00
koogua
0b161d52bb v1.5.5发布 2022-07-27 15:51:43 +08:00
koogua
dc85029241 1.优化CsrfToken
2.去除无实际作用的OptimizeTable脚本
2022-07-22 16:03:43 +08:00
koogua
f5719c2ee7 修正帐号锁定后还能登录的问题 2022-07-15 17:35:22 +08:00
koogua
175737f274 1.增加清理demo数据脚本
2.用户课程列表增加角色限定
3.精简模块加载和路由扫描
2022-07-15 10:28:08 +08:00
koogua
34da1deae6 1.修正问题分类列表查询条件
2.发货增加noMatchedHandler
2022-07-07 16:28:17 +08:00
koogua
d1917781fb Merge branch 'koogua/v1.5.4'
# Conflicts:
#	app/Library/AppInfo.php
2022-06-16 09:24:01 +08:00
koogua
21f92166d2 v1.5.4 2022-06-16 09:12:43 +08:00
koogua
35a8785177 优化视频文件上传页面 2022-06-09 20:32:17 +08:00
koogua
7945644f3a 优化VodEventTask 2022-06-09 10:26:02 +08:00
koogua
7f9314a111 改进上传转码流程 2022-06-08 21:47:47 +08:00
koogua
b5ceb155f3 增加迁移SettingTrait 2022-06-08 09:22:28 +08:00
koogua
83a39e5648 1.增加积分兑换会员
2.优化课程和套餐发货
3.增加isp和电子执照配置
2022-06-07 21:55:36 +08:00
koogua
d86ee20ced 修正获取子分类查询条件 2022-06-04 16:13:33 +08:00
koogua
23305e1738 增加获取视频时长补充机制 2022-06-04 16:12:06 +08:00
koogua
f1ceae2301 Merge branch 'koogua/v1.5.3' 2022-05-24 10:15:58 +08:00
koogua
e272bfc585 更新版本号 2022-05-24 10:15:43 +08:00
koogua
d57ed792a4 Merge branch 'koogua/v1.5.3' 2022-05-23 15:00:23 +08:00
koogua
a06edb6f4b vditor本地化 2022-05-23 14:56:24 +08:00
koogua
8fccecb372 vditor本地化 2022-05-23 14:52:31 +08:00
koogua
450b4c5210 Merge branch 'koogua/v1.5.2' 2022-04-30 11:39:53 +08:00
koogua
af65adaf94 1.补充话题列表课程数据结构
2.调整发送验证码相关样式
3.优化套餐和话题下拉课程数据显示
4.去除礼物详情中多出来的"}}"标签
5.修正关闭秒杀订单时没有回填库存的问题
6.vditor编辑器切换为七牛cdn加速
2022-04-30 11:23:33 +08:00
koogua
d59d52b771 修正验证码关闭后台逻辑 2022-03-23 09:55:38 +08:00
koogua
c77e1801ac 修正验证码关闭后台逻辑 2022-03-23 09:55:07 +08:00
koogua
70c8767789 修正验证码关闭后元素未定义问题 2022-03-23 09:45:39 +08:00
koogua
6f679e74e9 修正验证码关闭后元素未定义问题 2022-03-23 09:45:17 +08:00
koogua
f7c835b5ca Merge branch 'koogua/v1.5.1' 2022-03-22 19:39:14 +08:00
koogua
1597b2b968 优化每日登录积分 2022-03-22 19:35:12 +08:00
koogua
e5bcd500d3 调整积分兑换相关 2022-03-22 17:38:47 +08:00
koogua
4345bdeb26 v1.5.1 beta 2022-03-13 17:05:35 +08:00
koogua
d697a7bf97 增加验证码开关 2022-02-19 18:05:36 +08:00
koogua
d736b5ac61 Merge branch 'develop' 2022-02-17 11:09:57 +08:00
koogua
ba512b04c8 v.1.5.0 release 2022-02-17 11:07:42 +08:00
koogua
0155e55e4b 功能优化 2022-01-18 18:03:48 +08:00
koogua
87097afad3 Merge remote-tracking branch 'gitee/develop' into develop
# Conflicts:
#	CHANGELOG.md
#	app/Services/Logic/Notice/ConsultReply.php
#	app/Services/Logic/Notice/LiveBegin.php
#	app/Services/Logic/Notice/OrderFinish.php
#	app/Services/Logic/Notice/PointGoodsDeliver.php
#	app/Services/Logic/Notice/RefundFinish.php
2022-01-13 12:28:29 +08:00
koogua
e3e09a92ad 修正微信通知和短信不能同时发的问题 2022-01-13 12:27:36 +08:00
koogua
6e90d04da9 v1.5.0 2022-01-13 11:01:06 +08:00
koogua
5ff9ae51f0 v1.5.0 2022-01-13 11:00:16 +08:00
koogua
c13b45d991 补充课程分类 2021-12-31 14:14:02 +08:00
koogua
495057e8ce 补充课程分类 2021-12-31 14:13:42 +08:00
koogua
9c8882bac6 短信配置增加region选项 2021-12-31 09:43:46 +08:00
koogua
45863db645 短信配置增加region选项 2021-12-31 09:37:38 +08:00
koogua
a50889df71 Merge branch 'koogua/v1.4.9' 2021-12-30 20:07:56 +08:00
koogua
433b31e0ae v.1.4.9 2021-12-30 18:38:43 +08:00
koogua
b889569d77 Merge branch 'ctc/v1.4.8' 2021-11-28 17:33:12 +08:00
koogua
e7abda6daf v1.4.8 2021-11-28 17:24:03 +08:00
koogua
b1f09d4008 Merge branch 'koogua/v1.4.7' 2021-10-28 16:16:20 +08:00
koogua
402ae2468b 1.清理分享链接参数
2.增加账号泛滥登录检查
2021-10-28 16:16:15 +08:00
koogua
2564b1adc0 Merge branch 'koogua/v1.4.7' into develop 2021-10-28 16:13:33 +08:00
koogua
725e6fc261 1.清理分享链接参数
2.增加账号泛滥登录检查
2021-10-28 16:11:30 +08:00
koogua
5cc94b0c01 v.1.4.7 release 2021-10-28 16:10:16 +08:00
koogua
4628a272c8 v.1.4.7 beta1 2021-10-27 18:16:40 +08:00
koogua
3fbb68f713 修正首页缓存虚拟用户数问题 2021-10-18 18:57:58 +08:00
koogua
d03999ebf3 修正首页缓存虚拟用户数问题 2021-10-18 18:57:27 +08:00
koogua
e6fe4dabfb Merge branch 'koogua/v1.4.6' 2021-10-18 11:22:31 +08:00
koogua
7d2b9c87b7 v1.4.6 2021-10-18 11:20:44 +08:00
koogua
a699fdba1f 修复oauth登录code reused问题 2021-10-18 09:51:46 +08:00
koogua
d6da068320 修复oauth登录code reused问题 2021-10-18 09:50:49 +08:00
koogua
76c46348d7 增加虚假课程订阅数逻辑 2021-10-17 18:55:00 +08:00
koogua
3c774d2b89 修正咨询和评价点赞状态问题 2021-10-17 14:48:35 +08:00
koogua
dfe92dfb1b 优化PC页面到手机的自动跳转,修复管理后台若干问题 2021-10-16 16:16:45 +08:00
koogua
878b8c4e54 1.修正获取answer权限判断问题
2.order接口补充缺失权限判断
2021-10-09 09:50:54 +08:00
koogua
57c7d875ad 1.修正获取answer权限判断问题
2.order接口补充缺失权限判断
2021-10-09 09:49:16 +08:00
koogua
416a671f3f 修正进入直播间消息id缺失问题 2021-10-08 18:40:51 +08:00
koogua
525ac5d67a 修正进入直播间消息id缺失问题 2021-10-08 18:40:13 +08:00
koogua
fffb2c4e8e Merge branch 'koogua/v1.4.5' 2021-10-08 11:23:00 +08:00
koogua
3d1b8f1274 修正ImActiveGroupList缓存查询条件引发的错误 2021-10-08 11:20:58 +08:00
koogua
b29ae1ef2f Merge branch 'koogua/v1.4.5' 2021-10-08 08:41:15 +08:00
koogua
8abe4d1e8e 完善问题me信息 2021-10-07 15:58:06 +08:00
koogua
e2e3479851 用会退款列表中增加me属性 2021-10-07 14:48:32 +08:00
koogua
2a30589716 修正群组信息错误 2021-10-07 13:16:56 +08:00
koogua
febf7d9982 完善异常处理逻辑 2021-10-06 20:28:13 +08:00
koogua
93279a53e2 完善shallowUserInfo处理逻辑 2021-10-06 18:39:50 +08:00
koogua
d94001a4a4 1.去除模型中删除关联发布操作
2.整理查询逻辑
2021-10-06 17:01:49 +08:00
koogua
8cfcc74b2a 增加退出群组和解除好友接口 2021-10-04 18:56:08 +08:00
koogua
1fe8c289a5 修正websocket连接地址 2021-10-03 14:53:17 +08:00
koogua
6495cbfbe0 修正websocket连接地址 2021-10-03 11:55:22 +08:00
koogua
1f46f35a42 修正websocket连接地址 2021-10-03 09:49:40 +08:00
koogua
b64168120a 修正文章,提问,回答,课时评论查询参数 2021-10-01 17:30:58 +08:00
koogua
cebd2f09e6 格式化课程评分 2021-09-30 11:07:48 +08:00
koogua
acc25bb5dc 抽离文章评论和私有操作 2021-09-29 21:01:01 +08:00
koogua
5009ae36a0 修复评论列表查询条件 2021-09-28 21:14:15 +08:00
koogua
124b28856f 增加删除文章和提问接口 2021-09-28 17:33:52 +08:00
koogua
53295ed980 1.优化订单数据结构
2.无权限查看课时不返回播放地址
2021-09-28 15:07:34 +08:00
koogua
5617a5f1c1 v1.4.5 beta4 2021-09-26 22:31:28 +08:00
koogua
c7c9ab4f59 v1.4.5 beta3 2021-09-22 21:48:49 +08:00
koogua
616c7aa40d v1.4.5 beta2 2021-09-21 08:14:06 +08:00
koogua
b65c66d99c v1.4.5 beta1 2021-09-20 17:50:27 +08:00
koogua
15d822a934 修正课程列表直播状态 2021-09-17 16:53:11 +08:00
koogua
7134a2c666 修正课程列表直播状态 2021-09-17 16:51:16 +08:00
koogua
adeb4d530d Merge branch 'koogua/v1.4.4' 2021-09-17 10:27:45 +08:00
koogua
61b4e7696e Merge branch 'koogua/v1.4.4' into develop 2021-09-17 10:26:05 +08:00
koogua
645409c849 调整markdown安全级别 2021-09-17 10:05:25 +08:00
koogua
3fd3cb1fbe 增加登录选择配置 2021-09-16 22:31:41 +08:00
koogua
d0112d501e 优化公众号订阅事件 2021-09-13 17:30:40 +08:00
koogua
1c880d0c56 修正咨询published查询条件 2021-09-11 13:14:24 +08:00
koogua
7ac456bb67 修正微信支付验证浮点数精度丢失问题 2021-09-08 12:18:06 +08:00
koogua
b9d78da1ce v1.4.4 preview 2021-09-07 17:29:23 +08:00
koogua
4bba205420 Merge branch 'koogua/fix-vod-setting' 2021-09-03 13:10:23 +08:00
koogua
6b2b3891c6 修复视频清晰度配置序列化问题 2021-09-03 13:02:28 +08:00
koogua
c1d3a98620 v1.44 beta 2021-08-31 21:48:32 +08:00
koogua
a1fc1d4956 Merge branch 'koogua/v1.4.3' 2021-08-23 10:37:20 +08:00
koogua
74f34752e5 修正mp4转码模板hd清晰度 2021-08-23 10:35:16 +08:00
koogua
7c5b11e5c0 Merge branch 'koogua/v1.4.3' 2021-08-23 10:26:32 +08:00
koogua
ee6b90d18f 增加联系方式开启开关 2021-08-23 09:45:36 +08:00
koogua
9815f98ff9 v1.4.3 2021-08-22 18:01:47 +08:00
koogua
7bf5779878 Merge branch 'master' of github.com:xiaochong0302/course-tencent-cloud 2021-08-12 20:40:33 +08:00
koogua
33be4028b6 Merge branch 'koogua/v1.4.2' 2021-08-12 20:14:03 +08:00
koogua
bcc9979ef7 v1.4.2 beta2 2021-08-12 18:33:49 +08:00
koogua
de7fd43cd4 v1.4.2 beta1 2021-08-12 16:26:00 +08:00
jacky huang
6412c83671
Create SECURITY.md 2021-08-09 20:06:35 +08:00
koogua
b2efe1f61f Merge branch 'koogua/v1.4.1' 2021-08-08 21:05:22 +08:00
koogua
826040d19d v1.4.1 beta1 2021-08-08 17:19:15 +08:00
koogua
2102ee8e4a Merge branch 'koogua/v1.4.0' 2021-08-03 17:25:00 +08:00
koogua
351572e3df Merge branch 'koogua/v1.4.0' into develop 2021-08-03 17:24:16 +08:00
koogua
d55c51c425 v1.4.0 更新版本号 2021-08-03 15:52:17 +08:00
koogua
ce640342f2 v1.4.0 beta1 2021-08-03 15:47:55 +08:00
koogua
1e630967d1 恢复遗漏的数据迁移调用 2021-07-28 10:39:13 +08:00
koogua
6174b3fc7b 恢复遗漏的数据迁移调用 2021-07-28 10:37:57 +08:00
koogua
ef545c8155 Merge branch 'koogua/v1.3.9' 2021-07-26 09:29:32 +08:00
koogua
43be2ef310 修正数据迁移未导入包 2021-07-26 09:28:40 +08:00
koogua
698d0d963b Merge branch 'koogua/v1.3.9' 2021-07-25 21:40:48 +08:00
koogua
3cf1f51bb3 修正外连播放地址为空500错误 2021-07-25 21:39:18 +08:00
koogua
a86957f0b1 Merge branch 'koogua/v1.3.9'
# Conflicts:
#	app/Library/AppInfo.php
2021-07-25 17:07:45 +08:00
koogua
97e7db2c74 v1.3.9 beta4 2021-07-24 15:23:13 +08:00
koogua
76a558bab7 v1.3.9 beta3 2021-07-24 15:11:32 +08:00
koogua
25b935edeb v1.3.9 beta2 2021-07-23 20:12:44 +08:00
koogua
8d43d27523 v1.3.9 beta 2021-07-23 15:10:55 +08:00
koogua
69f41d71c7 热门问题增加过滤条件 2021-07-13 10:04:49 +08:00
koogua
a896856951 热门问题增加过滤条件 2021-07-13 10:04:38 +08:00
koogua
78079aeafb 修正版本号 2021-07-12 10:14:01 +08:00
koogua
a1d38eee9a 修正版本号 2021-07-12 10:11:28 +08:00
koogua
bf5686f6d9 Merge branch 'koogua/v1.3.8' 2021-07-11 16:14:50 +08:00
koogua
9f44ebda48 Merge branch 'koogua/v1.3.8' into develop 2021-07-11 16:14:08 +08:00
koogua
a41137580d v1.3.8发布 2021-07-11 16:12:50 +08:00
koogua
9b22fd6656 清理无用文件,处理记录逻辑删除后的浏览问题 2021-07-10 21:48:49 +08:00
koogua
c4bf67a616 Merge branch 'koogua/fix-live' 2021-06-23 15:48:35 +08:00
koogua
952051bf82 修正后台测试直播问题 2021-06-23 15:46:46 +08:00
koogua
c546e59f3f Merge branch 'fix-uc-review' 2021-06-23 12:52:48 +08:00
koogua
5c9e44f3d5 1.修复uc删除收藏问题
2.修复群员管理删除按钮问题
3.修复评价按钮单击问题
2021-06-23 12:51:16 +08:00
koogua
c55f071ebe Merge branch 'koogua/fix-comment-review' 2021-06-23 11:04:31 +08:00
koogua
44c5b0ce04 修复评论审核路由问题 2021-06-23 11:02:50 +08:00
koogua
c11fab7027 Merge branch 'koogua/fixed-teacher-consults' 2021-06-21 16:40:50 +08:00
koogua
31c87faeaf Merge branch 'koogua/fixed-teacher-consults' into develop 2021-06-21 16:40:33 +08:00
koogua
5900bb0f33 重写教师咨询获取方式 2021-06-21 16:37:14 +08:00
koogua
2366878113 Merge branch 'koogua/fix-layarea' 2021-06-21 11:31:38 +08:00
koogua
5f5532859e 修复layarea加载问题 2021-06-21 11:30:02 +08:00
koogua
e2a03515a2 Merge branch 'koogua/fixed-teacher-consults' 2021-06-19 18:09:04 +08:00
koogua
7c4b6fff82 修复记录为空分页问题 2021-06-19 18:07:20 +08:00
koogua
8215e4c18f Merge branch 'koogua/fix-vod-lesson' 2021-06-19 10:58:58 +08:00
koogua
10e99c818e 复原腾讯云点播的地址格式 2021-06-19 10:55:13 +08:00
koogua
1d09a2e005 Merge branch 'koogua/v1.3.7' 2021-06-15 16:24:34 +08:00
koogua
bbc88be3a3 修正小组成员跳转链接 2021-06-15 16:21:50 +08:00
koogua
12f76989f5 更新版本号 2021-06-13 16:43:00 +08:00
koogua
3bd4083a22 Merge branch 'koogua/v1.3.7' 2021-06-13 15:53:00 +08:00
koogua
0336a54911 1.源文件增加版权信息
2.群组状态和课程协同
2021-06-13 15:49:47 +08:00
koogua
6245897f4b 1.源文件增加版权信息 2021-06-13 15:48:32 +08:00
koogua
1d2f1dd266 1.更改模块继承基类
2.升级layui到2.6.8
3.升级腾讯云播放器
4.点播增加外链支持
2021-06-12 12:34:40 +08:00
koogua
c994c9e05e Merge branch 'koogua/v1.3.6' 2021-06-03 21:11:55 +08:00
koogua
72c5b7e77c 清理无用引用 2021-06-03 21:07:57 +08:00
koogua
57f587f4c4 v1.3.6阶段提交,cherry-pick 2021-06-03 12:11:34 +08:00
koogua
92c2225d47 v1.3.6阶段提交 2021-06-01 12:44:15 +08:00
koogua
a4d50205df Merge branch 'koogua/v1.3.5-hotfix' 2021-05-22 09:35:39 +08:00
koogua
51a20a12d6 忽略xs.question.ini 2021-05-22 09:35:10 +08:00
koogua
5597be84b2 Merge branch 'koogua/v1.3.5' 2021-05-20 19:52:51 +08:00
koogua
713a39314e 修正统计报表方法名单复数问题 2021-05-20 19:43:57 +08:00
koogua
57f5c0fe72 v1.3.5阶段提交 2021-05-20 19:30:32 +08:00
koogua
b58cb44f04 v1.3.5阶段提交 2021-05-20 18:50:50 +08:00
koogua
d9c4ffa7d7 Merge branch 'koogua/hotfix-1.3.4' into koogua/v1.3.5 2021-05-16 19:19:37 +08:00
koogua
6254ac94ca v1.3.5阶段提交 2021-05-16 19:19:20 +08:00
koogua
dc4d03762a Merge branch 'koogua/hotfix-1.3.4' 2021-05-15 15:47:36 +08:00
koogua
ca30c1732c 1.修复添加文章时未定义referer报错
2.修正后台添加文章未定义category_id
3.修正后台审核统计
2021-05-15 15:46:39 +08:00
koogua
c53d14c0c5 Merge branch 'koogua/hotfix-1.3.4' 2021-05-15 15:27:01 +08:00
koogua
141993a93c 1.修复添加文章时未定义referer报错
2.修正后台添加文章未定义category_id
2021-05-15 15:25:18 +08:00
koogua
d525116d9b Merge branch 'koogua/fix-add-tag' 2021-05-15 14:09:46 +08:00
koogua
cc19004c12 修复添加标签时的报错 2021-05-15 14:07:03 +08:00
koogua
253e09b79e 完善积分 2021-05-13 20:30:52 +08:00
koogua
aa40087bf1 完善积分 2021-05-13 20:30:20 +08:00
koogua
1fc2b93334 完善文章和提问浏览权限 2021-05-13 19:44:11 +08:00
koogua
1a15ad58c9 阶段提交 2021-05-13 17:50:39 +08:00
koogua
c7a84e60df 阶段提交 2021-05-12 20:43:10 +08:00
koogua
863505dcca 阶段提交 2021-05-12 20:41:24 +08:00
koogua
661034f3c1 阶段提交 2021-05-10 21:35:07 +08:00
koogua
caa34d2675 v1.3.4阶段提交 2021-05-07 19:34:31 +08:00
dongye
73a2e21cd6 !66 修复Tag添加错误的BUG
* 添加tag排序字段未添加问题
* update app/Http/Admin/Views/tag/add.volt. 增加是否发布选项,Fix 不能添加BUG
2021-04-30 10:46:01 +08:00
koogua
1ce43f6a75 Merge branch 'develop' 2021-04-29 18:41:00 +08:00
koogua
b38f094ed2 去除api中的无用方法 2021-04-29 18:03:35 +08:00
koogua
0cc2f10850 更新提交文章后跳转到用户中心 2021-04-29 17:22:24 +08:00
koogua
c7dfeed563 v1.3.3 fixed 2021-04-29 17:08:28 +08:00
koogua
f05ad4bb67 v1.3.3 preview 2021-04-28 20:40:18 +08:00
koogua
68b3b652a1 Merge branch 'koogua/v1.3.2' 2021-04-20 21:21:30 +08:00
koogua
1778b25c25 v1.3.2 2021-04-20 21:16:48 +08:00
koogua
6e4711e3bb Merge branch 'koogua/I3IBIU' into develop 2021-04-20 09:39:41 +08:00
koogua
d47ba77ea5 Merge branch 'koogua/I3IREK' into develop 2021-04-20 09:39:20 +08:00
koogua
f48f0c2545 Merge branch 'koogua/I3IVLN' into develop 2021-04-20 09:38:43 +08:00
koogua
8792688eed 评论功能阶段性提交 2021-04-19 20:16:41 +08:00
koogua
aef8e93fca Merge branch 'koogua/I3J723' 2021-04-16 18:16:25 +08:00
koogua
da943c3269 修复课程二级分类错位 2021-04-16 18:15:21 +08:00
koogua
bf2cbf305a Merge branch 'koogua/I3IVLN' 2021-04-15 10:37:26 +08:00
koogua
0f11248867 修复PageController中替换不充分导致的命名空间不存在 2021-04-15 10:36:37 +08:00
koogua
005e7df57b 修复轮播图无法保存数据 2021-04-14 15:01:54 +08:00
koogua
0f673dff3f 增加开启和关闭站点终端命令 2021-04-10 16:05:13 +08:00
koogua
8fdf9a77df xs.article.ini加入忽略 2021-04-10 15:08:04 +08:00
koogua
9173a1974d v1.3.1 2021-04-10 11:47:41 +08:00
koogua
35294379e3 Merge branch 'koogua/I3EBEO' into koogua/v1.3.1
# Conflicts:
#	app/Services/Logic/Consult/ConsultLike.php
#	app/Services/Logic/Review/ReviewLike.php
#	app/Services/Logic/User/Console/FavoriteList.php
#	app/Services/Logic/User/FavoriteList.php
2021-04-09 17:56:15 +08:00
koogua
9bb6946298 Merge branch 'koogua/I3E5UT' into koogua/v1.3.1
# Conflicts:
#	app/Services/Logic/Verify/EmailCode.php
2021-04-09 17:45:39 +08:00
koogua
c5ef9a2b2d 专栏阶段性提交2 2021-04-09 17:35:31 +08:00
koogua
d98b936969 专栏阶段性提交 2021-04-08 19:58:30 +08:00
koogua
51899d8c81 修正file_transcode 2021-03-30 20:07:54 +08:00
koogua
e7633cc723 修正邮件验证码命名空间 2021-03-30 11:20:27 +08:00
koogua
341168a9e1 调整命名空间别名 2021-03-30 11:05:07 +08:00
koogua
08b764c26c Merge branch 'koogua/I3E2LN' 2021-03-29 17:21:32 +08:00
koogua
ce84d79904 修正后台微信公众号设置路由不存在问题 2021-03-29 17:21:03 +08:00
koogua
0c964b85a6 修正im头像路径 2021-03-26 15:23:08 +08:00
koogua
f6ff5db852 Merge branch 'koogua/I3CC5N'
# Conflicts:
#	app/Models/ImGroup.php
#	app/Models/ImUser.php
2021-03-26 15:20:35 +08:00
koogua
6c86f914cc 增加面授模型,重构群组成员管理 2021-03-26 15:15:37 +08:00
koogua
4e69f1b43e 修正chapter attrs字段序列化问题 2021-03-23 10:43:15 +08:00
koogua
252d3e70c5 修正xm-select遗漏的问题 2021-03-22 20:01:57 +08:00
koogua
8849f706b9 修正IM用户和群组头像问题 2021-03-22 16:08:16 +08:00
1867 changed files with 78990 additions and 32083 deletions

6
.gitignore vendored
View File

@ -1,13 +1,15 @@
/.git
/.idea
/vendor
/config/config.php
/config/xs.course.ini
/config/xs.group.ini
/config/xs.user.ini
/config/xs.article.ini
/config/xs.question.ini
/config/alipay/*.crt
/config/wxpay/*.pem
/db/migrations/schema.php
/public/robots.txt
/public/sitemap.xml
/public/h5
/storage/cache/purifier
*KgTest*

View File

@ -1,3 +1,669 @@
### [v1.7.8](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.8)(2025-06-20)
- 移除ThrottleLimit
- 增加CloseLiveTask
- 增加搜索页图片alt属性striptags过滤
- 后台增加返回顶部快捷方式
- 前台fixbar增加联系电话
- 优化安装脚本
- 优化课时列表直播提示
- 优化后台返回链接
- 优化统计分析代码位置
- 直播回调后更新课时缓存
- 后台清空头像->上传头像
- sitemap.xml直接写入网站根目录
### [v1.7.7](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.7)(2025-04-20)
- 优化索引管理工具
- 优化章节等页面UI
- 修正workerman中onMessage问题
- 修正非免费课程试听问题
- 优化layer窗口中的表单跳转
- 文件清理以及命名优化
- 优化倒计时
### [v1.7.6](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.6)(2025-03-22)
- 升级layui-v2.9.25
- 去除发货中不必要的异常抛出
- 去除文章和问题缓存重建
- 去除多余的文件引用
- 修正每日访问站点积分问题
- 限制全文搜索关键字长度
- 统一规划二维码样式
### [v1.7.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.5)(2025-02-22)
- 优化后台统计图表
- 优化图片放大查看
- 优化错误处理机制
- 优化前台编辑器页面
- 去除一些过度的设计
- 精简属性空判断
- 规整redirect
- 优化bootstrap
- 优化logger
- 优化contact
- 优化logo
- 优化nav
### [v1.7.4](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.4)(2024-12-10)
- 更新layui-v2.9.20
- 优化编辑器内容自动提交
- 修正课时详情页目录高亮问题
- 修正CommentInfo中点赞判断
- 精简AccountSearchTrait
- 优化kg_h5_index_url()
- 优化CourseUserTrait
- 优化kg_setting()
- 优化CsrfToken
### [v1.7.3](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.3)(2024-10-10)
- 更新layui-v2.9.16
- 增加编辑器内容自动提交
- 修改文章和提问可用tag数量
- 优化findUserActiveSessions
- 优化findUserActiveTokens
- 优化上传文件失败抛出异常
- 优化默认文件上传
- 优化用户锁定相关
### [v1.7.2](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.2)(2024-07-31)
- 更新layui-v2.9.14
- 优化docker自动化脚本
- 修正教师直播通知
- 修正课程分类删选问题
- 后台增加客户服务入口
- redis增加expire方法
- 日志记录增加log.trace参数
- 精简代码
### [v1.7.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.1)(2024-06-31)
- 更新layui-v2.9.10
- 更新docker国内镜像地址
- 增加导入镜像构建容器的方式
- 调整微信公众号模板消息
- 移除加载富文本编辑器初始化的语言文件
- 移除consult中多余的chapter_id属性
- 修正课程列表顶部过滤条件区块不能收缩问题
- 用户中心第三方登录列表增加过滤条件
- 后台增加打开/关闭左侧菜单提示
- 优化整理文件mimeType
- iconfont资源本地化
- 优化UploadController
- 优化富文本内容显示样式
- 简化内容图片放大监听
- 去除课程打赏相关内容
- 课程增加能否发布检查
### [v1.7.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.0)(2024-05-15)
- 升级layui-2.9.8
- 调整html编辑器属性
- 增加代码块内容复制
- 清理无用的Captcha配置
- 联系人QQ改为上传二维码图片
- 修正logo,favicon上传路径
- 登录后台同时登录前台
- 移动端修正评论发表
### [v1.6.9](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.9)(2024-04-15)
- 增加用户删除和还原功能
- 增加unauthorized响应
- 增加post方式传递csrf_token
- 删除chapter中resource_count,consult_count属性
- 精简csrf_token白名单
- 拆解优化migrations创建表脚本
- 修正chapter_user时长重复计数问题
- 修正后台刷新首页缓存问题
- 修正home模块中编辑器图片上传
- 优化文章和提问搜索条件
- 优化课程详情页排版
- 优化storage上传
- 优化CategoryTreeList
- 优化CourseUserTrait
- 更新layui-v2.9.7
### [v1.6.8](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.8)(2024-01-30)
- 修正course_user中active_time未更新问题
- 修正主页simple模式免费课程模块样式问题
- 修正chapter_user中plan_id=0问题
- 修正课时评论管理链接
- 修正用户active_time搜索条件
- 修正课时发布switch开关
- 精简chapter/lessons.volt
- 去除league/commonmark包
- 去除分类等必选判断
- 更新layui-v2.9.3
- 使用ServiceTrait精简代码
- 优化AccountTrait
- 优化错误处理
### [v1.6.7](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.7)(2023-12-15)
- 增加文章分类功能
- 增加问题分类功能
- 增加审核等批量功能
- 增加若干业务插件埋点
- 精简重构大量业务逻辑
- 移除秒杀营销功能
- 已发现的问题修复
### [v1.6.6](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.6)(2023-08-30)
- 还原意外删除的AnswerList.php文件
- 修正邮箱注册提交按钮不可用问题
- 去除删除远程课件逻辑
- 增加课程课件资料总览
- 优化cleanDemoDataTask脚本
- 优化tag表migration脚本
- 命名结构等常规优化
### [v1.6.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.5)(2023-07-15)
- 升级layui-v2.8.8
- 使用本地图像验证码
- 优化计划任务脚本
- 优化日志清理脚本
- 优化钉钉webhook
- 修正图文分享参数问题
### [v1.6.4](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.4)(2023-06-15)
- 增加推荐课程等Widget
- 更新Composer包
- 修正验证空口令问题
- 优化订单确认页样式
- 优化课程等Me相关信息
- 优化分享URL
- 优化用户课程查找
- 优化通知相关
- 优化Providers
- 优化课程章节权限
- 优化钉钉机器人
### [v1.6.3](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.3)(2023-05-08)
- 强化文章|提问|课程列表参数检查
- 优化HtmlPurifier内容过滤
- 优化排序条件和分页重复问题
- 优化课程搜索分组条件样式
- 优化课程学习时长同步
- 优化程序语法层面
- 更新Layui-v2.8.2
- 替换ip2region包
- 去除未支付“新鲜”订单检查
- 修正手续费率设置为0无效问题
### [v1.6.2](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.2)(2023-02-12)
- 增加ServerMonitor监控指标配置
- 同步更新腾讯云短信内容规则
- 文章和问答增加评论开关属性
- 修正视频记忆播放无效问题
- 升级composer包版本
- 优化Repo查询默认排序
- 优化管理后台细节
- 优化二维码输出
- 优化评分检查
### [v1.6.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.1)(2022-12-12)
- 富文本编辑器增加粘贴图片和远程图片本地化
- 修正用户通知标记为已读,计数不归零问题
- 修正播放器中央按钮显示问题
- 优化腾讯云播放地址鉴权参数
- 优化热门作者,答主和问题
- 优化学员学习记录显示
- 优化表单数据提交体验
- 优化单章节层级显示
- 优化ServerInfo类
### [v1.6.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.6.0)(2022-10-26)
- 播放器中间增加大号播放按钮
- 单页和帮助增加浏览计数属性
- logo上增加首页链接
- 修正分类默认图标问题
- 修正layui-main样式更新带来的问题
- 更新composer包
- 调整退款手续费范围
- 导航部分,教师->师资
- 优化分页组件参数
- 优化内容表格样式
- 优化热门问题和热门答主
- 优化通知计数方式
### [v1.5.9](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.9)(2022-09-20)
- 修正内容图片上传问题
- 去除user全文索引
- 调整notice目录结构
- 更新默认图片
- 更新直播名格式化
- 更新微博分享链接
- 文章单页等增加SEO关键字
- 专题增加封面上传
- 优化router扫描规则
- 升级layui至v2.7.6
- 增加用户协议和隐私政策
- 优化错误日志
### [v1.5.8](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.8)(2022-08-28)
- 整理migrations
- 更新自动安装脚本
- 优化登录/注册/忘记密码页
- 修复移动端首页课程缓存刷新
- sitemap条目增加过滤条件
### [v1.5.7](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.7)(2022-08-18)
- 清理群组残留
- 升级腾讯云存储SDK到v2.5.6
- GuzzleHttp升级到v6.5.7
- 优化HtmlPurifier缓存目录自动创建
- 优化问题回答排序问题
- 优化腾讯云短信错误日志
- 整理查询构建语句
- 整理优化CSS
### [v1.5.6](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.6)(2022-08-08)
- 增加应用内命令行migrations
- 移除群组和微聊模块
- kindeditor替换vditor
- markdown转html
### [v1.5.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.5)(2022-07-27)
- 修正获分类查询条件
- 修正锁定账户还能登录的问题
- 发货增加noMatchedHandler
- 增加demo数据清理脚本
- 用户课程列表增加角色限定条件
- 精简模块加载和路由扫描
- 优化CsrfToken
- 去除无实质作用的数据表优化
### [v1.5.4](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.4)(2022-06-15)
- 增加migration助手SettingTrait
- 增加积分兑换会员
- 增加ISP备案和电子执照配置
- 增加获取视频时长补偿机制
- 优化课程和套餐发货
- 优化验证码
- 优化视频点播回调处理任务
- 优化章节排序初始值和步长
- 优化后台视频上传和转码
- 修正获取子分类查询条件
### [v1.5.3](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.3)(2022-05-30)
- 优化章节排序初始值和步长
- 修复删除群组前台列表仍然显示问题
- 设置360浏览器的默认模式为webkit
- 修复首页简单模式课程项顶部缺少空白
- vditor本地化彻底弃用cdn.jsdelivr.net
- 调整markdown样式
### [v1.5.2](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.2)(2022-04-17)
- 补充话题列表课程数据结构
- 调整发送验证码相关样式
- 优化套餐和话题下拉课程数据显示
- 去除礼物详情中多出来的"}}"标签
- 修正关闭秒杀订单时没有回填库存的问题
- vditor编辑器切换为七牛cdn加速
### [v1.5.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.1)(2022-03-17)
- 推荐课程等列表补充属性
- 修正后台评价列表中的搜索链接
- 修正后台点播设置视频码率后500错误问题
- 修正多码率远程播放地址部分为空播放问题
- 修正更新套餐课程缓存传参数据类型问题
- 修正第三方登录解除绑定失败问题
- 使用ServiceTrait归纳获取服务代码
- 优化anonymous隐藏部分字符函数
- 调整积分兑换相关定义命名
- 去除js_vars中关于IM客服的配置
- 增加验证码开关
### [v1.5.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.0)(2022-02-17)
- 调整对内部人员通知任务类型的前缀
- 调整微信和短信通知发送判断逻辑
- 清理后台实用工具的无用文件内容
- 支付后解除秒杀商品锁定
- 加强支付流程数据验证
- 加强退款流程数据验证
- 优化账户创建数据流
- 优化课程创建数据流
- 优化章节创建数据流
- 优化积分商品兑换
- 优化发货逻辑
### [v1.4.9](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.9)(2022-01-01)
- 修正订单消费未奖励积分问题
- 修正前台课程分类排序无效问题
- 修正后台点播防盗链配置显隐藏状态问题
- 修正分享链接非h5环境也会跳转到h5问题
- 修正后台钉钉配置调用错误
- 使用腾讯云新SDK发送短信
- 优化show400错误输出页
- 优化下单时产品检查逻辑
- 优化上传文件筛选限制
- 优化后台配置更新
### [v1.4.8](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.8)(2021-11-28)
- 修正后台下载课程附件问题
- 修正后台登录检查跳转地址
- 修正公众号关注二维码样式问题
- 优化发货失败自动退款逻辑
- 创建交易时增加订单支付检查
- H5增加底部tab图标
### [v1.4.7](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.7)(2021-10-28)
- 更新README.md
- 优化分页查询参数过滤
- 优化后台学员添加和搜索
- 优化后台学员课程过期管理
- 增加编辑会员特权功能
- 增加清空用户头像功能
- 增加编辑器内站外图片自动保存到本地
- 增加CSRF放行白名单
- 完善订单|交易|退款序号
### [v1.4.6](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.6)(2021-10-18)
- 完善首页文章缓存的获取条件
- 完善热门专题的获取条件
- 优化课程章节列表逻辑
- 更新教学中心我的课程获取逻辑
- 修正后台点播和面授类型课时列表宽度未100%铺满问题
- 完善添加积分礼品的逻辑
- 修正编辑课程类型礼品时编辑器初始化js报错
- 修正非root用户后台添加用户时报错
- 修正微信等第三方登录code被重用问题
- 手机端访问web端地址自动跳转到手机端
- 增加锁定用户逻辑(会自动登出锁定用户)
- 增加虚假课程订阅数(用于营销效果)
### [v1.4.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.5)(2021-09-27)
- 修正点击内容分享到微信会额外出现公众号二维码的问题
- 修正后台首页提问和回答的数量统计
- 调整登录限制(邮箱|手机)为注册限制
- 调整订单发货为每一分钟执行一次
- 增强课时安全性,无权限时不返回播放地址或内容
- 抽离出文章关闭,仅我可见操作
- 增加退出群组和解除好友接口
- 增加删除文章和提问接口
- 增加首页推荐教师接口
- 增加微信公众号支付处理
- 增加取消订单功能
- 优化订单API结构
- 优化计划任务
### [v1.4.4](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.4)(2021-09-17)
- 后台增加邮件手机登录选择配置
- 增加移动端支付选项配置
- 首页增加秒杀,直播,提问,文章接口
- 增加秒杀列表列表接口
- 调整markdown解析安全级别
- 精简取消点赞以及取消收藏逻辑
- 修复浮点转整型精度丢失造成的支付回调失败
- 修复竖屏直播时造成的位置错乱
- 修复视频清晰度配置序列化问题
- 修复评论取消点赞数量不变问题
- 修复章节资源数量问题
- 修复删除课程后引发的用户课程列表错误问题
- 修正课程咨询列表查询条件
- 修正回答,兑换礼品说明重复转译的问题
- 资源下载查询主键由md5改为加密的ID
- 去除上传文件md5唯一索引
- 去除课程发布对章节的要求
- 去除点播回调中的处理数量限制
- 优化文章,课程,提问,群组全文搜索
- 优化直播列表数据结构
- 优化章节目录交互呈现
- 优化后台添加学员重复检查
- 优化订单发货逻辑
- 优化公众号订阅逻辑
### [v1.4.3](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.3)(2021-08-23)
- 优化邮件验证码
- 优化logo和favicon上传
- 优化api验证码中使用的ticket和rand
- 优化点播和直播地址获取
- 修复部分清晰度外链播放地址为空时切换卡死问题
- 增加QQ微信微博邮件电话等联系配置
- 用户控制台文章和提问列表增加删除过滤
- 去除layim在线客服
- 提高视频转码分辨率
### [v1.4.2](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.2)(2021-08-13)
- 后台增加转码码率配置选项
- 后台增加微聊配置开关
- 优化外链播放地址逻辑
- 访问课程文章等未发布资源404处理
- 优化课件上传不返回md5值的处理
- 优化用户中心内容数据展示
- 前台暂时屏蔽文章仅我可见和关闭评论功能
- 直播增加极速码率选项
- 调整码率标签对应
- 修复后台数据统计中心Hash缓存问题
- 修复未发布的课程仍然可购买问题
- 修复购买课程后学员人数未增加问题
- 增加同步课程数据统计脚本
### [v1.4.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.1)(2021-08-08)
- AnswerInfo结构补充遗漏的comment_count字段
- AnswerList结构去除deleted字段
- ChapterList结构补充published字段
- 使用开源的播放器DPlayer替换腾讯TcPlayer
- 修正第三方登录开关的判断
- 修正课程方向过滤问题
- 修正教师主页会显示未发布课程问题
- 修正评论删除点击无效问题
- 优化课时列表可点击权限判断
- 优化来源检查域名带端口问题
- 优化微信公众号业务处理类
### [v1.4.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.0)(2021-08-03)
### 更新
- 单页增加自定义别名访问
- 回答增加评论功能
- 顶部导航微聊增加开关控制
- 更新默认的ICP备案链接指向
- 更正部分model定义中字段的类型申明
- 优化章节过多导致页面过长问题
- 优化评论前端部分相关逻辑和交互
- 优化403错误页面使用forward代替redirect
- 优化播放地址中带queryString的扩展名检查
- 修正解除第三登录绑定500错误问题
- 修正教师教授课程未过滤已删除课程问题
- 修正咨询编辑500错误问题
- 修正后台列表中restore_url未定义问题
### [v1.3.9](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.9)(2021-07-24)
### 更新
- 修正分类下无课程时会查询出所有课程问题
- 修正sitemap中的部分路径问题
- 修正课程套餐相关问题
- 优化问答部分相关逻辑
- 优化评论部分相关逻辑
- 优化浏览器Title显示
- 优化审核和举报相关逻辑
- 优化命令行脚本执行输出
- 优化API的分页返回结构
- 增加文章问答评论相关API
- 增加重新统计tag中相关计数计划任务
- 增加tag的使用范围文章问题课程计数
- 站点logo和favicon使用随机文件名
- 增加评价,咨询审核
- 去除编辑器中的酷瓜云课堂标识
- 清理数据迁移文件
### [v1.3.8](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.8)(2021-07-11)
### 更新
- 更正readme中github仓库信息
- 增加清除点播地址缓存命令
- 若干缓存键名重命名 后台站点名称修改为用户站点名称
- 标签名称比较忽略大小写
- 重新设计前后台登录界面
- 更正后台存储设置中图片样式的参数描述
- 记录逻辑删除后浏览重定向到404
- 修正图文类型的章节markdown解析问题
- 优化文章和提问不必要的标签数据提交
- 图文中图片增加点击放大预览功能
- 各数据结构中增加若干业务字段
- COS存储中去除多余的年月目录结构
- 清理优化css
- 修正直播地址问题
- 修正评论审核路由问题
- 修正取消收藏问题
### [v1.3.7](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.7)(2021-06-14)
### 更新
- 升级layui到v2.6.8
- 升级腾讯云播放器到v2.4.0
- 点播增加外链支持
- 源文件增加版权信息
- 优化模块继承基类
- 优化评论审核机制
- 优化课程和群组状态协同逻辑
- 优化用户索引重建逻辑
### [v1.3.6](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.6)(2021-06-04)
### 更新
- 清理没有用到的引用
- 优化界面和CSS样式
- 优化视频无法获取时长处理逻辑
- 优化视频无法转码处理逻辑
- 优化评论审核机制
- 优化评论相关数据更新逻辑
- 优化文章,问答,评论数据更新
- 优化内容标签的更新逻辑
- 优化首页H5的跳转判断
- 优化单页的浏览权限
- 优化Model中的事件方法
- 优化kg_parse_summary函数
- 用户主页加入问答列表
- 修复无法关闭问题讨论
- 修复编辑群组的路由
- 直播去除FLV方式拉流
- xs.question.ini加入忽略列表
- kg_user表增加comment_count字段
### [v1.3.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.5)(2021-05-20)
### 更新
- 更新演示数据
- 优化安装脚本install.sh
- 升级脚本upgrade.sh中加入更新导航缓存
- 撰写文章和提问markdown编辑器通栏显示
- 完善文章和问题的浏览权限
- 优化通用ajax表单提交
- 文章,提问,回答点赞作者有提醒和积分奖励
- 前台增加针对回答的预览访问地址
- 前台增加文章,问题,回答,评论加入举报功能
- 后台增加文章,问题,回答,评论的举报审核功能
- 后台首页增加审核队列统计
### [v1.3.4](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.4)(2021-05-13)
### 更新
- 增加问答功能
- 增加标签关注功能
- 优化标签功能
- 优化文章功能以及全文搜索
- 优化课程评价,咨询,文章等相关统计
- 优化前台界面
- 后台增加提问和回答审核功能
- 后台增加查看用户在线记录
- 修正后台编辑角色权限错误
### [v1.3.3](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.3)(2021-04-30)
### 更新
- 前台增加文章发布功能
- 增加文章,咨询,评价,评论相关事件站内提醒
- 增加文章,咨询,评价,评论事件埋点
- 后台首页增加若干统计项目
- 后台增加文章审核功能
- 重构积分历史记录
- 优化在线统计方式
- 优化前台界面
### [v1.3.2](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.2)(2021-04-20)
### 更新
- 前台增文章和章节评论功能
- 后台增加评论相关管理功能
- 优化课程,章节,文章等前台界面
- 优化分享链接的生成和跳转方式
- 优化课程章节文章相关js
- 优化后台数据展示
- 修正后台分类二级分类错位问题
- 修正文章命名空间问题
- 修正后台轮播没有保存问题
### [v1.3.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.1)(2021-04-09)
### 更新
- 后台增加文章功能
- 后台增加标签功能
- 增加文章全文检索
- 整理命名空间别名
- 更新部分链接打开方式
- xm-select搜索忽略大小写
- 补充遗漏的面授模型章节相关迁移文件
- 修正上次字段整理导致的字段不存在问题
- 修正上次整理发布字段导致的添加单页和帮助错误
- 增加开启/关闭站点终端命令
### [v1.3.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.0)(2021-03-26)
### 更新
- 课程增加面授模型
- 重构前台群组成员管理
- 后台增加群组成员管理
- 重构订单存储商品详情数据结构
- 调整用户和群组列表等UI
### [v1.2.9](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.9)(2021-03-22)
### 更新

View File

@ -1,25 +1,24 @@
## 酷瓜云课堂
![酷瓜云网课GPL协议开源](https://images.gitee.com/uploads/images/2020/1127/092621_3805cf8f_23592.png)
[![酷瓜云课堂-开源知识付费解决方案](https://portal-1255691183.file.myqcloud.com/img/content/63ec392618bd5.png)](https://www.koogua.com)
### 项目介绍
### 系统介绍
酷瓜云课堂依托腾讯云基础服务架构采用C扩展框架Phalcon开发GPL-2.0开源协议,致力开源网课系统,开源网校系统,开源在线教育系统。
酷瓜云课堂依托腾讯云基础服务架构采用C扩展框架Phalcon开发GPL-2.0开源协议,致力开源网课系统,开源网校系统,开源知识付费系统,开源在线教育系统。
[![Gitee star](https://gitee.com/koogua/course-tencent-cloud/badge/star.svg?theme=gitee)](https://gitee.com/koogua/course-tencent-cloud)
[![Gitee fork](https://gitee.com/koogua/course-tencent-cloud/badge/fork.svg?theme=gitee)](https://gitee.com/koogua/course-tencent-cloud)
[![Github stars](https://img.shields.io/github/stars/mindskip/xzs-mysql?logo=github)](https://github.com/xiaochong0302/course-tencent-cloud)
[![Github forks](https://img.shields.io/github/forks/mindskip/xzs-mysql?logo=github)](https://github.com/xiaochong0302/course-tencent-cloud)
![GPL-2.0](https://img.shields.io/static/v1?label=license&message=GPL-2.0&color=blue)
![star](https://www.koogua.com/gitee/badge?user=koogua&project=course-tencent-cloud&type=star)
![fork](https://www.koogua.com/gitee/badge?user=koogua&project=course-tencent-cloud&type=fork)
![license](https://www.koogua.com/gitee/badge?user=koogua&project=course-tencent-cloud&type=license)
![release](https://www.koogua.com/gitee/badge?user=koogua&project=course-tencent-cloud&type=release)
### 系统功能
实现了点播、直播、专栏、会员、微聊等,是一个完整的产品,具体功能我也不想写一大堆,自己体验吧!
实现了点播、直播、专栏、问答、会员、积分等。
友情提示:
- 系统配置低1核 1G 1M 跑多个容器),切莫压测
- 课程数据来源于网络(无实质内容)切莫购买
- 演示系统配置低2核2G1M 跑多个容器)切莫压测
- 课程数据来源于网络(无实质内容)切莫购买
- 管理后台已禁止数据提交,私密配置已过滤
桌面端演示:
@ -27,13 +26,13 @@
- [前台演示](https://ctc.koogua.com)
- [后台演示](https://ctc.koogua.com/admin)
演示100015@163.com / 123456 (前后台通用)
演示100015@163.com / 123456 (前后台通用)
移动端演示:
H5手机端演示:
![移动端二维码](https://images.gitee.com/uploads/images/2020/1127/093203_265221a2_23592.png)
![H5二维码](https://portal-1255691183.file.myqcloud.com/img/content/616fc238895b7.png)
演示13507083515 / 123456
演示13507083515 / 123456
支付流程演示:
@ -42,13 +41,6 @@
- [数据库与中间件的基础必修课0.02元)](https://ctc.koogua.com/order/confirm?item_id=80&item_type=2)
Tips: 测试支付请用手机号注册一个新账户,以便接收订单通知,以及避免课程无法购买
即时通讯演示:
请使用以下两个帐号在不同终端或者浏览器登录,打开微聊界面
- 帐号A100015@163.com / 123456
- 帐号B100065@163.com / 123456
微信推送演示:
@ -56,33 +48,19 @@ Tips: 请用手机注册一个新账号,用户中心 -> 关注订阅,扫码
### 项目组件
- 后台框架:[phalcon 3.4.5](https://phalcon.io)
- 前端框架:[layui 2.5.6](https://layui.com) [layim 3.9.5](https://www.layui.com/layim)(已授权)
- 全文检索:[xunsearch 1.4.9](http://www.xunsearch.com)
- 即时通讯:[workerman 3.5.22](https://workerman.net)
- 后台框架:[phalcon 3.4](https://phalcon.io)
- 前端框架:[layui 2.9](https://layui.dev)
- 全文检索:[xunsearch 1.4](http://www.xunsearch.com)
- 基础依赖:[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://www.koogua.com/page/wiki)
- [系统服务配置](https://www.koogua.com/page/wiki)
- [客户终端配置](https://www.koogua.com/page/wiki)
### 意见反馈
- [在线反馈](https://gitee.com/koogua/course-tencent-cloud/issues)(推荐)
- [官方论坛](https://koogua.com/forum)(推荐)
- [码云平台](https://gitee.com/koogua/course-tencent-cloud/issues)
- [官方社区](https://www.koogua.com/community)
- QQ交流群: 787363898
### 有阿里云版吗?
阿里云版规划中,之前阿里云服务过期未续费,所以腾讯云版本先出。
### 代码有加密吗?
所有代码都公开授权代码除外例如layim没有所谓的商业版和付费插件。
### 开源助力
毫无保留的真开源不容易,如果对你有帮助,请给我们 **STAR**

5
SECURITY.md Normal file
View File

@ -0,0 +1,5 @@
# Security Policy
## Reporting a Vulnerability
Please report security issues to `xiaochong0302@gmail.com`

View File

@ -0,0 +1,61 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Question as QuestionRepo;
class AnswerList extends Builder
{
public function handleQuestions(array $answers)
{
$questions = $this->getQuestions($answers);
foreach ($answers as $key => $answer) {
$answers[$key]['question'] = $questions[$answer['question_id']] ?? null;
}
return $answers;
}
public function handleUsers(array $answers)
{
$users = $this->getUsers($answers);
foreach ($answers as $key => $answer) {
$answers[$key]['owner'] = $users[$answer['owner_id']] ?? null;
}
return $answers;
}
public function getQuestions(array $answers)
{
$ids = kg_array_column($answers, 'question_id');
$questionRepo = new QuestionRepo();
$questions = $questionRepo->findByIds($ids, ['id', 'title']);
$result = [];
foreach ($questions->toArray() as $question) {
$result[$question['id']] = $question;
}
return $result;
}
public function getUsers(array $answers)
{
$ids = kg_array_column($answers, 'owner_id');
return $this->getShallowUserByIds($ids);
}
}

View File

@ -0,0 +1,75 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Article as ArticleRepo;
use Phalcon\Text;
class ArticleFavoriteList extends Builder
{
public function handleArticles(array $relations)
{
$articles = $this->getArticles($relations);
foreach ($relations as $key => $value) {
$relations[$key]['article'] = $articles[$value['article_id']] ?? null;
}
return $relations;
}
public function handleUsers(array $relations)
{
$users = $this->getUsers($relations);
foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? null;
}
return $relations;
}
public function getArticles(array $relations)
{
$ids = kg_array_column($relations, 'article_id');
$articleRepo = new ArticleRepo();
$columns = [
'id', 'title', 'cover',
'view_count', 'like_count',
'comment_count', 'favorite_count',
];
$articles = $articleRepo->findByIds($ids, $columns);
$baseUrl = kg_cos_url();
$result = [];
foreach ($articles->toArray() as $article) {
if (!empty($article['cover']) && !Text::startsWith($article['cover'], 'http')) {
$article['cover'] = $baseUrl . $article['cover'];
}
$result[$article['id']] = $article;
}
return $result;
}
public function getUsers(array $relations)
{
$ids = kg_array_column($relations, 'user_id');
return $this->getShallowUserByIds($ids);
}
}

View File

@ -0,0 +1,74 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Caches\CategoryAllList as CategoryAllListCache;
use App\Models\Category as CategoryModel;
class ArticleList extends Builder
{
public function handleArticles(array $articles)
{
foreach ($articles as $key => $article) {
$articles[$key]['tags'] = json_decode($article['tags'], true);
}
return $articles;
}
public function handleCategories(array $articles)
{
$categories = $this->getCategories();
foreach ($articles as $key => $article) {
$articles[$key]['category'] = $categories[$article['category_id']] ?? null;
}
return $articles;
}
public function handleUsers(array $articles)
{
$users = $this->getUsers($articles);
foreach ($articles as $key => $article) {
$articles[$key]['owner'] = $users[$article['owner_id']] ?? null;
}
return $articles;
}
public function getCategories()
{
$cache = new CategoryAllListCache();
$items = $cache->get(CategoryModel::TYPE_ARTICLE);
if (empty($items)) return [];
$result = [];
foreach ($items as $item) {
$result[$item['id']] = [
'id' => $item['id'],
'name' => $item['name'],
];
}
return $result;
}
public function getUsers($articles)
{
$ids = kg_array_column($articles, 'owner_id');
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,10 +1,16 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use Phalcon\Mvc\User\Component;
use App\Repos\User as UserRepo;
use Phalcon\Di\Injectable;
class Builder extends Component
class Builder extends Injectable
{
public function objects(array $items)
@ -12,4 +18,22 @@ class Builder extends Component
return kg_array_object($items);
}
protected function getShallowUserByIds(array $ids)
{
$userRepo = new UserRepo();
$users = $userRepo->findShallowUserByIds($ids);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
}
}

View File

@ -1,17 +1,23 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Models\Category as CategoryModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
use App\Repos\Category as CategoryRepo;
class CategoryTreeList extends Builder
{
public function handle($type)
{
$topCategories = $this->findTopCategories($type);
$categoryRepo = new CategoryRepo();
$topCategories = $categoryRepo->findTopCategories($type);
if ($topCategories->count() == 0) {
return [];
@ -23,6 +29,8 @@ class CategoryTreeList extends Builder
$list[] = [
'id' => $category->id,
'name' => $category->name,
'alias' => $category->alias,
'icon' => $category->icon,
'children' => $this->handleChildren($category),
];
}
@ -32,7 +40,9 @@ class CategoryTreeList extends Builder
protected function handleChildren(CategoryModel $category)
{
$subCategories = $this->findChildCategories($category->id);
$categoryRepo = new CategoryRepo();
$subCategories = $categoryRepo->findChildCategories($category->id);
if ($subCategories->count() == 0) {
return [];
@ -44,41 +54,12 @@ class CategoryTreeList extends Builder
$list[] = [
'id' => $category->id,
'name' => $category->name,
'alias' => $category->alias,
'icon' => $category->icon,
];
}
return $list;
}
/**
* @param int $type
* @return ResultsetInterface|Resultset|CategoryModel[]
*/
protected function findTopCategories($type)
{
$query = CategoryModel::query();
$query->where('parent_id = 0');
$query->andWhere('published = 1');
$query->andWhere('type = :type:', ['type' => $type]);
$query->orderBy('priority ASC');
return $query->execute();
}
/**
* @param int $parentId
* @return ResultsetInterface|Resultset|CategoryModel[]
*/
protected function findChildCategories($parentId)
{
$query = CategoryModel::query();
$query->where('published = 1');
$query->andWhere('parent_id = :parent_id:', ['parent_id' => $parentId]);
$query->orderBy('priority ASC');
return $query->execute();
}
}

View File

@ -0,0 +1,34 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
class CommentList extends Builder
{
public function handleUsers(array $comments)
{
$users = $this->getUsers($comments);
foreach ($comments as $key => $comment) {
$comments[$key]['owner'] = $users[$comment['owner_id']] ?? null;
$comments[$key]['to_user'] = $users[$comment['to_user_id']] ?? null;
}
return $comments;
}
public function getUsers(array $comments)
{
$ownerIds = kg_array_column($comments, 'owner_id');
$toUserIds = kg_array_column($comments, 'to_user_id');
$ids = array_merge($ownerIds, $toUserIds);
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,10 +1,13 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Chapter as ChapterRepo;
use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class ConsultList extends Builder
{
@ -14,7 +17,7 @@ class ConsultList extends Builder
$courses = $this->getCourses($consults);
foreach ($consults as $key => $consult) {
$consults[$key]['course'] = $courses[$consult['course_id']] ?? new \stdClass();
$consults[$key]['course'] = $courses[$consult['course_id']] ?? null;
}
return $consults;
@ -25,8 +28,8 @@ class ConsultList extends Builder
$users = $this->getUsers($consults);
foreach ($consults as $key => $consult) {
$consults[$key]['owner'] = $users[$consult['owner_id']] ?? new \stdClass();
$consults[$key]['replier'] = $users[$consult['replier_id']] ?? new \stdClass();
$consults[$key]['owner'] = $users[$consult['owner_id']] ?? null;
$consults[$key]['replier'] = $users[$consult['replier_id']] ?? null;
}
return $consults;
@ -49,43 +52,13 @@ class ConsultList extends Builder
return $result;
}
public function getChapters(array $consults)
{
$ids = kg_array_column($consults, 'chapter_id');
$chapterRepo = new ChapterRepo();
$chapters = $chapterRepo->findByIds($ids, ['id', 'title']);
$result = [];
foreach ($chapters->toArray() as $chapter) {
$result[$chapter['id']] = $chapter;
}
return $result;
}
public function getUsers(array $consults)
{
$ownerIds = kg_array_column($consults, 'owner_id');
$replierIds = kg_array_column($consults, 'replier_id');
$ids = array_merge($ownerIds, $replierIds);
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar']);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
@ -29,6 +34,7 @@ class CourseChapterList extends Builder
'id' => $chapter->id,
'title' => $chapter->title,
'model' => $chapter->model,
'published' => $chapter->published,
'children' => $this->handleChildren($chapter),
];
}
@ -65,6 +71,7 @@ class CourseChapterList extends Builder
'id' => $lesson->id,
'title' => $lesson->title,
'model' => $lesson->model,
'published' => $lesson->published,
'free' => $lesson->free,
'attrs' => $attrs,
];

View File

@ -1,9 +1,13 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class CourseFavoriteList extends Builder
{
@ -13,7 +17,7 @@ class CourseFavoriteList extends Builder
$courses = $this->getCourses($relations);
foreach ($relations as $key => $value) {
$relations[$key]['course'] = $courses[$value['course_id']] ?? new \stdClass();
$relations[$key]['course'] = $courses[$value['course_id']] ?? null;
}
return $relations;
@ -24,7 +28,7 @@ class CourseFavoriteList extends Builder
$users = $this->getUsers($relations);
foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
$relations[$key]['user'] = $users[$value['user_id']] ?? null;
}
return $relations;
@ -65,20 +69,7 @@ class CourseFavoriteList extends Builder
{
$ids = kg_array_column($relations, 'user_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar']);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,10 +1,14 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Caches\CategoryList as CategoryListCache;
use App\Caches\CategoryAllList as CategoryAllListCache;
use App\Models\Category as CategoryModel;
use App\Repos\User as UserRepo;
class CourseList extends Builder
{
@ -14,7 +18,7 @@ class CourseList extends Builder
$categories = $this->getCategories();
foreach ($courses as $key => $course) {
$courses[$key]['category'] = $categories[$course['category_id']] ?? new \stdClass();
$courses[$key]['category'] = $categories[$course['category_id']] ?? null;
}
return $courses;
@ -25,7 +29,7 @@ class CourseList extends Builder
$teachers = $this->getTeachers($courses);
foreach ($courses as $key => $course) {
$courses[$key]['teacher'] = $teachers[$course['teacher_id']] ?? new \stdClass();
$courses[$key]['teacher'] = $teachers[$course['teacher_id']] ?? null;
}
return $courses;
@ -33,13 +37,11 @@ class CourseList extends Builder
public function getCategories()
{
$cache = new CategoryListCache();
$cache = new CategoryAllListCache();
$items = $cache->get(CategoryModel::TYPE_COURSE);
if (empty($items)) {
return [];
}
if (empty($items)) return [];
$result = [];
@ -57,20 +59,7 @@ class CourseList extends Builder
{
$ids = kg_array_column($courses, 'teacher_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar']);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
@ -13,7 +18,7 @@ class CourseTopicList extends Builder
$courses = $this->getCourses($relations);
foreach ($relations as $key => $value) {
$relations[$key]['course'] = $courses[$value['course_id']] ?? new \stdClass();
$relations[$key]['course'] = $courses[$value['course_id']] ?? null;
}
return $relations;
@ -24,7 +29,7 @@ class CourseTopicList extends Builder
$topics = $this->getTopics($relations);
foreach ($relations as $key => $value) {
$relations[$key]['topic'] = $topics[$value['topic_id']] ?? new \stdClass();
$relations[$key]['topic'] = $topics[$value['topic_id']] ?? null;
}
return $relations;
@ -40,7 +45,7 @@ class CourseTopicList extends Builder
'id', 'title', 'cover',
'market_price', 'vip_price',
'rating', 'model', 'level', 'attrs',
'user_count', 'lesson_count',
'user_count', 'lesson_count', 'review_count', 'favorite_count',
];
$courses = $courseRepo->findByIds($ids, $columns);

View File

@ -1,9 +1,13 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class CourseUserList extends Builder
{
@ -13,7 +17,7 @@ class CourseUserList extends Builder
$courses = $this->getCourses($relations);
foreach ($relations as $key => $value) {
$relations[$key]['course'] = $courses[$value['course_id']] ?? new \stdClass();
$relations[$key]['course'] = $courses[$value['course_id']] ?? null;
}
return $relations;
@ -24,7 +28,7 @@ class CourseUserList extends Builder
$users = $this->getUsers($relations);
foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
$relations[$key]['user'] = $users[$value['user_id']] ?? null;
}
return $relations;
@ -39,8 +43,8 @@ class CourseUserList extends Builder
$columns = [
'id', 'title', 'cover',
'market_price', 'vip_price',
'rating', 'model', 'level', 'attrs',
'user_count', 'lesson_count', 'review_count', 'favorite_count',
'rating', 'model', 'level', 'attrs', 'published', 'deleted',
'user_count', 'fake_user_count', 'lesson_count', 'review_count', 'favorite_count',
];
$courses = $courseRepo->findByIds($ids, $columns);
@ -50,8 +54,15 @@ class CourseUserList extends Builder
$result = [];
foreach ($courses->toArray() as $course) {
if ($course['fake_user_count'] > $course['user_count']) {
$course['user_count'] = $course['fake_user_count'];
}
$course['cover'] = $baseUrl . $course['cover'];
$course['attrs'] = json_decode($course['attrs'], true);
$result[$course['id']] = $course;
}
@ -62,20 +73,7 @@ class CourseUserList extends Builder
{
$ids = kg_array_column($relations, 'user_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar']);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,99 +0,0 @@
<?php
namespace App\Builders;
use App\Repos\Chapter as ChapterRepo;
use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class DanmuList extends Builder
{
public function handleCourses(array $danmus)
{
$courses = $this->getCourses($danmus);
foreach ($danmus as $key => $danmu) {
$danmus[$key]['course'] = $courses[$danmu['course_id']] ?? new \stdClass();
}
return $danmus;
}
public function handleChapters(array $danmus)
{
$chapters = $this->getChapters($danmus);
foreach ($danmus as $key => $danmu) {
$danmus[$key]['chapter'] = $chapters[$danmu['chapter_id']] ?? new \stdClass();
}
return $danmus;
}
public function handleUsers(array $danmus)
{
$users = $this->getUsers($danmus);
foreach ($danmus as $key => $danmu) {
$danmus[$key]['owner'] = $users[$danmu['owner_id']] ?? new \stdClass();
}
return $danmus;
}
public function getCourses(array $danmus)
{
$ids = kg_array_column($danmus, 'course_id');
$courseRepo = new CourseRepo();
$courses = $courseRepo->findByIds($ids, ['id', 'title']);
$result = [];
foreach ($courses->toArray() as $course) {
$result[$course['id']] = $course;
}
return $result;
}
public function getChapters(array $danmus)
{
$ids = kg_array_column($danmus, 'chapter_id');
$chapterRepo = new ChapterRepo();
$chapters = $chapterRepo->findByIds($ids, ['id', 'title']);
$result = [];
foreach ($chapters->toArray() as $chapter) {
$result[$chapter['id']] = $chapter;
}
return $result;
}
public function getUsers(array $danmus)
{
$ids = kg_array_column($danmus, 'owner_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar']);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
}
}

View File

@ -1,8 +1,13 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Caches\CategoryList as CategoryListCache;
use App\Caches\CategoryAllList as CategoryAllListCache;
use App\Models\Category as CategoryModel;
class HelpList extends Builder
@ -13,7 +18,7 @@ class HelpList extends Builder
$categories = $this->getCategories();
foreach ($helps as $key => $help) {
$helps[$key]['category'] = $categories[$help['category_id']] ?? new \stdClass();
$helps[$key]['category'] = $categories[$help['category_id']] ?? null;
}
return $helps;
@ -21,7 +26,7 @@ class HelpList extends Builder
public function getCategories()
{
$cache = new CategoryListCache();
$cache = new CategoryAllListCache();
$items = $cache->get(CategoryModel::TYPE_HELP);

View File

@ -1,46 +0,0 @@
<?php
namespace App\Builders;
use App\Repos\User as UserRepo;
class ImFriendUserList extends Builder
{
public function handleFriends(array $relations)
{
$users = $this->getFriends($relations);
foreach ($relations as $key => $value) {
$relations[$key]['friend'] = $users[$value['friend_id']] ?? new \stdClass();
}
return $relations;
}
public function getFriends(array $relations)
{
$ids = kg_array_column($relations, 'friend_id');
$userRepo = new UserRepo();
$columns = [
'id', 'name', 'avatar', 'title', 'about', 'vip',
'gender', 'area', 'active_time',
];
$users = $userRepo->findByIds($ids, $columns);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
}
}

View File

@ -1,70 +0,0 @@
<?php
namespace App\Builders;
use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class ImGroupList extends Builder
{
public function handleCourses(array $groups)
{
$courses = $this->getCourses($groups);
foreach ($groups as $key => $group) {
$groups[$key]['course'] = $courses[$group['course_id']] ?? new \stdClass();
}
return $groups;
}
public function handleUsers(array $groups)
{
$users = $this->getUsers($groups);
foreach ($groups as $key => $group) {
$groups[$key]['owner'] = $users[$group['owner_id']] ?? new \stdClass();
}
return $groups;
}
public function getCourses(array $groups)
{
$ids = kg_array_column($groups, 'course_id');
$courseRepo = new CourseRepo();
$courses = $courseRepo->findByIds($ids, ['id', 'title']);
$result = [];
foreach ($courses->toArray() as $course) {
$result[$course['id']] = $course;
}
return $result;
}
public function getUsers(array $groups)
{
$ids = kg_array_column($groups, 'owner_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar']);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
}
}

View File

@ -1,100 +0,0 @@
<?php
namespace App\Builders;
use App\Repos\ImGroup as ImGroupRepo;
use App\Repos\User as UserRepo;
class ImGroupUserList extends Builder
{
public function handleGroups(array $relations)
{
$groups = $this->getGroups($relations);
foreach ($relations as $key => $value) {
$relations[$key]['group'] = $groups[$value['group_id']] ?? new \stdClass();
}
return $relations;
}
public function handleUsers(array $relations)
{
$users = $this->getUsers($relations);
foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
}
return $relations;
}
public function getUsers(array $relations)
{
$ids = kg_array_column($relations, 'user_id');
$userRepo = new UserRepo();
$columns = ['id', 'name', 'avatar', 'title', 'about', 'vip', 'gender', 'area'];
$users = $userRepo->findByIds($ids, $columns);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
}
public function getGroups(array $relations)
{
$ids = kg_array_column($relations, 'group_id');
$groupRepo = new ImGroupRepo();
$columns = ['id', 'type', 'name', 'avatar', 'about', 'owner_id', 'user_count', 'msg_count'];
$groups = $groupRepo->findByIds($ids, $columns);
$users = $this->getGroupOwners($groups->toArray());
$baseUrl = kg_cos_url();
$result = [];
foreach ($groups->toArray() as $group) {
$group['avatar'] = $baseUrl . $group['avatar'];
$group['owner'] = $users[$group['owner_id']] ?? new \stdClass();
unset($group['owner_id']);
$result[$group['id']] = $group;
}
return $result;
}
protected function getGroupOwners(array $groups)
{
$ids = kg_array_column($groups, 'owner_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name']);
$result = [];
if ($users->count() > 0) {
foreach ($users->toArray() as $user) {
$result[$user['id']] = $user;
}
}
return $result;
}
}

View File

@ -1,41 +0,0 @@
<?php
namespace App\Builders;
use App\Repos\User as UserRepo;
class ImMessageList extends Builder
{
public function handleSenders(array $messages)
{
$users = $this->getSenders($messages);
foreach ($messages as $key => $message) {
$messages[$key]['sender'] = $users[$message['sender_id']] ?? new \stdClass();
}
return $messages;
}
public function getSenders(array $messages)
{
$ids = kg_array_column($messages, 'sender_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar']);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
}
}

View File

@ -1,10 +1,14 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Chapter as ChapterRepo;
use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class LearningList extends Builder
{
@ -14,7 +18,7 @@ class LearningList extends Builder
$courses = $this->getCourses($relations);
foreach ($relations as $key => $value) {
$relations[$key]['course'] = $courses[$value['course_id']] ?? new \stdClass();
$relations[$key]['course'] = $courses[$value['course_id']] ?? null;
}
return $relations;
@ -25,7 +29,7 @@ class LearningList extends Builder
$chapters = $this->getChapters($relations);
foreach ($relations as $key => $value) {
$relations[$key]['chapter'] = $chapters[$value['chapter_id']] ?? new \stdClass();
$relations[$key]['chapter'] = $chapters[$value['chapter_id']] ?? null;
}
return $relations;
@ -36,7 +40,7 @@ class LearningList extends Builder
$users = $this->getUsers($relations);
foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
$relations[$key]['user'] = $users[$value['user_id']] ?? null;
}
return $relations;
@ -80,17 +84,7 @@ class LearningList extends Builder
{
$ids = kg_array_column($relations, 'user_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name']);
$result = [];
foreach ($users->toArray() as $user) {
$result[$user['id']] = $user;
}
return $result;
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
@ -14,7 +19,7 @@ class LiveList extends Builder
$courses = $this->getCourses($lives);
foreach ($lives as $key => $live) {
$lives[$key]['course'] = $courses[$live['course_id']] ?? new \stdClass();
$lives[$key]['course'] = $courses[$live['course_id']] ?? null;
}
return $lives;
@ -25,7 +30,7 @@ class LiveList extends Builder
$chapters = $this->getChapters($lives);
foreach ($lives as $key => $live) {
$lives[$key]['chapter'] = $chapters[$live['chapter_id']] ?? new \stdClass();
$lives[$key]['chapter'] = $chapters[$live['chapter_id']] ?? null;
}
return $lives;
@ -43,7 +48,7 @@ class LiveList extends Builder
$userRepo = new UserRepo();
$users = $userRepo->findByIds($teacherIds, ['id', 'name', 'title', 'avatar', 'about']);
$users = $userRepo->findShallowUserByIds($teacherIds);
$baseUrl = kg_cos_url();
@ -58,7 +63,7 @@ class LiveList extends Builder
foreach ($courses->toArray() as $course) {
$course['cover'] = $baseUrl . $course['cover'];
$course['teacher'] = $teachers[$course['teacher_id']] ?? new \stdClass();
$course['teacher'] = $teachers[$course['teacher_id']] ?? null;
$result[$course['id']] = [
'id' => $course['id'],
'title' => $course['title'],

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
@ -63,6 +68,7 @@ class NavTreeList extends Builder
return NavModel::query()
->where('parent_id = :parent_id:', ['parent_id' => $navId])
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('priority ASC')
->execute();
}
@ -75,7 +81,9 @@ class NavTreeList extends Builder
{
return NavModel::query()
->where('position = :position:', ['position' => $position])
->andWhere('level = 1 AND published = 1')
->andWhere('level = 1')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('priority ASC')
->execute();
}

View File

@ -0,0 +1,34 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
class NotificationList extends Builder
{
public function handleUsers(array $notifications)
{
$users = $this->getUsers($notifications);
foreach ($notifications as $key => $notification) {
$notifications[$key]['sender'] = $users[$notification['sender_id']] ?? null;
$notifications[$key]['receiver'] = $users[$notification['receiver_id']] ?? null;
}
return $notifications;
}
public function getUsers(array $notifications)
{
$senderIds = kg_array_column($notifications, 'sender_id');
$receiverIds = kg_array_column($notifications, 'receiver_id');
$ids = array_merge($senderIds, $receiverIds);
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,9 +1,14 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Models\Course as CourseModel;
use App\Models\Order as OrderModel;
use App\Repos\User as UserRepo;
class OrderList extends Builder
{
@ -24,7 +29,7 @@ class OrderList extends Builder
$users = $this->getUsers($orders);
foreach ($orders as $key => $order) {
$orders[$key]['owner'] = $users[$order['owner_id']] ?? new \stdClass();
$orders[$key]['owner'] = $users[$order['owner_id']] ?? null;
}
return $orders;
@ -37,7 +42,7 @@ class OrderList extends Builder
public function handleItems(array $orders)
{
foreach ($orders as $key => $order) {
$itemInfo = $this->handleItem($order);
$itemInfo = $this->handleItemInfo($order);
$orders[$key]['item_info'] = $itemInfo;
}
@ -48,7 +53,7 @@ class OrderList extends Builder
* @param array $order
* @return array|mixed
*/
public function handleItem(array $order)
public function handleItemInfo(array $order)
{
$itemInfo = [];
@ -67,6 +72,57 @@ class OrderList extends Builder
return $itemInfo;
}
/**
* @param array $order
* @return array|mixed
*/
public function handleMeInfo(array $order)
{
$me = [
'allow_pay' => 0,
'allow_cancel' => 0,
'allow_refund' => 0,
];
$payStatusOk = $order['status'] == OrderModel::STATUS_PENDING ? 1 : 0;
$cancelStatusOk = $order['status'] == OrderModel::STATUS_PENDING ? 1 : 0;
$refundStatusOk = $order['status'] == OrderModel::STATUS_FINISHED ? 1 : 0;
if ($order['item_type'] == OrderModel::ITEM_COURSE) {
$course = $order['item_info']['course'];
$courseModelOk = $course['model'] != CourseModel::MODEL_OFFLINE;
$refundTimeOk = $course['refund_expiry_time'] > time();
$me['allow_refund'] = $courseModelOk && $refundStatusOk && $refundTimeOk ? 1 : 0;
} elseif ($order['item_type'] == OrderModel::ITEM_PACKAGE) {
$courses = $order['item_info']['courses'];
$refundTimeOk = false;
foreach ($courses as $course) {
if ($course['refund_expiry_time'] > time()) {
$refundTimeOk = true;
}
}
$me['allow_refund'] = $refundStatusOk && $refundTimeOk ? 1 : 0;
}
if ($payStatusOk == 1) {
$me['allow_pay'] = 1;
}
if ($cancelStatusOk == 1) {
$me['allow_cancel'] = 1;
}
return $me;
}
/**
* @param string $itemInfo
* @return mixed
@ -97,20 +153,6 @@ class OrderList extends Builder
return $itemInfo;
}
/**
* @param string $itemInfo
* @return mixed
*/
protected function handleRewardInfo($itemInfo)
{
if (!empty($itemInfo) && is_string($itemInfo)) {
$itemInfo = json_decode($itemInfo, true);
$itemInfo['course']['cover'] = $this->imgBaseUrl . $itemInfo['course']['cover'];
}
return $itemInfo;
}
/**
* @param string $itemInfo
* @return mixed
@ -132,17 +174,7 @@ class OrderList extends Builder
{
$ids = kg_array_column($orders, 'owner_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name']);
$result = [];
foreach ($users->toArray() as $user) {
$result[$user['id']] = $user;
}
return $result;
return $this->getShallowUserByIds($ids);
}
}

View File

@ -0,0 +1,75 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Question as QuestionRepo;
use Phalcon\Text;
class QuestionFavoriteList extends Builder
{
public function handleQuestions(array $relations)
{
$questions = $this->getQuestions($relations);
foreach ($relations as $key => $value) {
$relations[$key]['question'] = $questions[$value['question_id']] ?? null;
}
return $relations;
}
public function handleUsers(array $relations)
{
$users = $this->getUsers($relations);
foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? null;
}
return $relations;
}
public function getQuestions(array $relations)
{
$ids = kg_array_column($relations, 'question_id');
$questionRepo = new QuestionRepo();
$columns = [
'id', 'title', 'cover',
'view_count', 'like_count',
'answer_count', 'favorite_count',
];
$questions = $questionRepo->findByIds($ids, $columns);
$baseUrl = kg_cos_url();
$result = [];
foreach ($questions->toArray() as $question) {
if (!empty($question['cover']) && !Text::startsWith($question['cover'], 'http')) {
$question['cover'] = $baseUrl . $question['cover'];
}
$result[$question['id']] = $question;
}
return $result;
}
public function getUsers(array $relations)
{
$ids = kg_array_column($relations, 'user_id');
return $this->getShallowUserByIds($ids);
}
}

View File

@ -0,0 +1,77 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Caches\CategoryAllList as CategoryAllListCache;
use App\Models\Category as CategoryModel;
class QuestionList extends Builder
{
public function handleQuestions(array $questions)
{
foreach ($questions as $key => $question) {
$questions[$key]['tags'] = json_decode($question['tags'], true);
}
return $questions;
}
public function handleCategories(array $questions)
{
$categories = $this->getCategories();
foreach ($questions as $key => $question) {
$questions[$key]['category'] = $categories[$question['category_id']] ?? null;
}
return $questions;
}
public function handleUsers(array $questions)
{
$users = $this->getUsers($questions);
foreach ($questions as $key => $question) {
$questions[$key]['owner'] = $users[$question['owner_id']] ?? null;
$questions[$key]['last_replier'] = $users[$question['last_replier_id']] ?? null;
}
return $questions;
}
public function getCategories()
{
$cache = new CategoryAllListCache();
$items = $cache->get(CategoryModel::TYPE_QUESTION);
if (empty($items)) return [];
$result = [];
foreach ($items as $item) {
$result[$item['id']] = [
'id' => $item['id'],
'name' => $item['name'],
];
}
return $result;
}
public function getUsers($questions)
{
$ownerIds = kg_array_column($questions, 'owner_id');
$lastReplierIds = kg_array_column($questions, 'last_replier_id');
$ids = array_merge($ownerIds, $lastReplierIds);
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,9 +1,14 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Models\Refund as RefundModel;
use App\Repos\Order as OrderRepo;
use App\Repos\User as UserRepo;
class RefundList extends Builder
{
@ -13,7 +18,7 @@ class RefundList extends Builder
$orders = $this->getOrders($trades);
foreach ($trades as $key => $trade) {
$trades[$key]['order'] = $orders[$trade['order_id']] ?? new \stdClass();
$trades[$key]['order'] = $orders[$trade['order_id']] ?? null;
}
return $trades;
@ -24,12 +29,30 @@ class RefundList extends Builder
$users = $this->getUsers($refunds);
foreach ($refunds as $key => $refund) {
$refunds[$key]['owner'] = $users[$refund['owner_id']] ?? new \stdClass();
$refunds[$key]['owner'] = $users[$refund['owner_id']] ?? null;
}
return $refunds;
}
public function handleMeInfo(array $refund)
{
$me = [
'allow_cancel' => 0,
];
$statusTypes = [
RefundModel::STATUS_PENDING,
RefundModel::STATUS_APPROVED,
];
if (in_array($refund['status'], $statusTypes)) {
$me['allow_cancel'] = 1;
}
return $me;
}
public function getOrders(array $trades)
{
$ids = kg_array_column($trades, 'order_id');
@ -51,17 +74,7 @@ class RefundList extends Builder
{
$ids = kg_array_column($refunds, 'owner_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name']);
$result = [];
foreach ($users->toArray() as $user) {
$result[$user['id']] = $user;
}
return $result;
return $this->getShallowUserByIds($ids);
}
}

View File

@ -0,0 +1,31 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
class ReportList extends Builder
{
public function handleUsers(array $reports)
{
$users = $this->getUsers($reports);
foreach ($reports as $key => $report) {
$reports[$key]['owner'] = $users[$report['owner_id']] ?? null;
}
return $reports;
}
public function getUsers(array $reports)
{
$ids = kg_array_column($reports, 'owner_id');
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
@ -12,7 +17,7 @@ class ResourceList extends Builder
$uploads = $this->getUploads($relations);
foreach ($relations as $key => $value) {
$relations[$key]['upload'] = $uploads[$value['upload_id']] ?? new \stdClass();
$relations[$key]['upload'] = $uploads[$value['upload_id']] ?? null;
}
return $relations;
@ -31,6 +36,11 @@ class ResourceList extends Builder
$result = [];
foreach ($uploads->toArray() as $upload) {
$id = $this->crypt->encryptBase64($upload['id'], null, true);
$upload['url'] = $this->url->get(['for' => 'home.download', 'id' => $id]);
$result[$upload['id']] = $upload;
}

View File

@ -1,9 +1,13 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class ReviewList extends Builder
{
@ -13,7 +17,7 @@ class ReviewList extends Builder
$courses = $this->getCourses($reviews);
foreach ($reviews as $key => $review) {
$reviews[$key]['course'] = $courses[$review['course_id']] ?? new \stdClass();
$reviews[$key]['course'] = $courses[$review['course_id']] ?? null;
}
return $reviews;
@ -24,7 +28,7 @@ class ReviewList extends Builder
$users = $this->getUsers($reviews);
foreach ($reviews as $key => $review) {
$reviews[$key]['owner'] = $users[$review['owner_id']] ?? new \stdClass();
$reviews[$key]['owner'] = $users[$review['owner_id']] ?? null;
}
return $reviews;
@ -51,20 +55,7 @@ class ReviewList extends Builder
{
$ids = kg_array_column($reviews, 'owner_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar']);
$baseUrl = kg_cos_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
return $this->getShallowUserByIds($ids);
}
}

View File

@ -0,0 +1,66 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Tag as TagRepo;
class TagFollowList extends Builder
{
public function handleTags(array $relations)
{
$tags = $this->getTags($relations);
foreach ($relations as $key => $value) {
$relations[$key]['tag'] = $tags[$value['tag_id']] ?? null;
}
return $relations;
}
public function handleUsers(array $relations)
{
$users = $this->getUsers($relations);
foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? null;
}
return $relations;
}
public function getTags(array $relations)
{
$ids = kg_array_column($relations, 'tag_id');
$tagRepo = new TagRepo();
$columns = ['id', 'name', 'alias', 'icon', 'follow_count'];
$tags = $tagRepo->findByIds($ids, $columns);
$baseUrl = kg_cos_url();
$result = [];
foreach ($tags->toArray() as $tag) {
$tag['icon'] = $baseUrl . $tag['icon'];
$result[$tag['id']] = $tag;
}
return $result;
}
public function getUsers(array $relations)
{
$ids = kg_array_column($relations, 'user_id');
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,9 +1,13 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Repos\Order as OrderRepo;
use App\Repos\User as UserRepo;
class TradeList extends Builder
{
@ -13,7 +17,7 @@ class TradeList extends Builder
$orders = $this->getOrders($trades);
foreach ($trades as $key => $trade) {
$trades[$key]['order'] = $orders[$trade['order_id']] ?? new \stdClass();
$trades[$key]['order'] = $orders[$trade['order_id']] ?? null;
}
return $trades;
@ -24,7 +28,7 @@ class TradeList extends Builder
$users = $this->getUsers($trades);
foreach ($trades as $key => $trade) {
$trades[$key]['owner'] = $users[$trade['owner_id']] ?? new \stdClass();
$trades[$key]['owner'] = $users[$trade['owner_id']] ?? null;
}
return $trades;
@ -51,17 +55,7 @@ class TradeList extends Builder
{
$ids = kg_array_column($trades, 'owner_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name']);
$result = [];
foreach ($users->toArray() as $user) {
$result[$user['id']] = $user;
}
return $result;
return $this->getShallowUserByIds($ids);
}
}

View File

@ -1,8 +1,14 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Builders;
use App\Models\User as UserModel;
use App\Repos\Account as AccountRepo;
use App\Repos\Role as RoleRepo;
class UserList extends Builder
@ -19,6 +25,17 @@ class UserList extends Builder
return $users;
}
public function handleAccounts(array $users)
{
$accounts = $this->getAccounts($users);
foreach ($users as $key => $user) {
$users[$key]['account'] = $accounts[$user['id']] ?? null;
}
return $users;
}
public function handleAdminRoles(array $users)
{
$roles = $this->getAdminRoles($users);
@ -41,6 +58,26 @@ class UserList extends Builder
return $users;
}
protected function getAccounts(array $users)
{
$ids = kg_array_column($users, 'id');
$accountRepo = new AccountRepo();
$accounts = $accountRepo->findByIds($ids);
$result = [];
foreach ($accounts as $account) {
$result[$account->id] = [
'phone' => $account->phone,
'email' => $account->email,
];
}
return $result;
}
protected function getAdminRoles(array $users)
{
$ids = kg_array_column($users, 'admin_role');

View File

@ -1,31 +0,0 @@
<?php
namespace App\Caches;
use App\Repos\App as AppRepo;
class App extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "app:{$id}";
}
public function getContent($id = null)
{
$appRepo = new AppRepo();
$result = $appRepo->findByAppKey($id);
return $result ?: null;
}
}

37
app/Caches/AppInfo.php Normal file
View File

@ -0,0 +1,37 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
class AppInfo extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "_APP_INFO_";
}
public function getContent($id = null)
{
$appInfo = new \App\Library\AppInfo();
return [
'name' => $appInfo->get('name'),
'alias' => $appInfo->get('alias'),
'link' => $appInfo->get('link'),
'version' => $appInfo->get('version'),
];
}
}

View File

@ -1,11 +1,16 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use Phalcon\Cache\Backend\Redis as RedisCache;
use Phalcon\Mvc\User\Component;
use Phalcon\Di\Injectable;
abstract class Cache extends Component
abstract class Cache extends Injectable
{
/**

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -0,0 +1,46 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Models\Category as CategoryModel;
use Phalcon\Mvc\Model\Resultset;
class CategoryAllList extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "category_all_list:{$id}";
}
public function getContent($id = null)
{
/**
* @var Resultset $categories
*/
$categories = CategoryModel::query()
->columns(['id', 'parent_id', 'name', 'priority', 'level', 'path'])
->where('type = :type:', ['type' => $id])
->orderBy('level ASC, priority ASC')
->execute();
if ($categories->count() == 0) {
return [];
}
return $categories->toArray();
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -15,24 +20,22 @@ class CategoryList extends Cache
return $this->lifetime;
}
public function getKey($type = null)
public function getKey($id = null)
{
return "category_list:{$type}";
return "category_list:{$id}";
}
/**
* @param null $type
* @return array
*/
public function getContent($type = null)
public function getContent($id = null)
{
/**
* @var Resultset $categories
*/
$categories = CategoryModel::query()
->columns(['id', 'parent_id', 'name', 'priority', 'level', 'path'])
->where('type = :type:', ['type' => $type])
->where('type = :type:', ['type' => $id])
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('level ASC, priority ASC')
->execute();
if ($categories->count() == 0) {

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -14,16 +19,16 @@ class CategoryTreeList extends Cache
return $this->lifetime;
}
public function getKey($type = null)
public function getKey($id = null)
{
return "category_tree_list:{$type}";
return "category_tree_list:{$id}";
}
public function getContent($type = null)
public function getContent($id = null)
{
$builder = new CategoryTreeListBuilder();
$list = $builder->handle($type);
$list = $builder->handle($id);
return $list ?: [];
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -7,7 +12,7 @@ use App\Repos\Chapter as ChapterRepo;
class Chapter extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 86400;
public function getLifetime()
{

View File

@ -1,11 +1,17 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Library\Cache\Backend\Redis as RedisCache;
use Phalcon\Mvc\User\Component;
use Phalcon\Di\Injectable;
use Redis;
abstract class Counter extends Component
abstract class Counter extends Injectable
{
/**
@ -14,7 +20,7 @@ abstract class Counter extends Component
protected $cache;
/**
* @var \Redis
* @var Redis
*/
protected $redis;
@ -25,19 +31,13 @@ abstract class Counter extends Component
$this->redis = $this->cache->getRedis();
}
/**
* 获取缓存内容
*
* @param mixed $id
* @return array
*/
public function get($id = null)
{
$key = $this->getKey($id);
$content = $this->redis->hGetAll($key);
if (!$this->cache->exists($key)) {
if (!$this->redis->exists($key)) {
$content = $this->getContent($id);
$lifetime = $this->getLifetime();
@ -49,23 +49,13 @@ abstract class Counter extends Component
return $content;
}
/**
* 删除缓存内容
*
* @param mixed $id
*/
public function delete($id = null)
{
$key = $this->getKey($id);
$this->cache->delete($key);
$this->redis->del($key);
}
/**
* 重建缓存内容
*
* @param mixed $id
*/
public function rebuild($id = null)
{
$this->delete($id);

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -7,7 +12,7 @@ use App\Repos\Course as CourseRepo;
class Course extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 86400;
public function getLifetime()
{

View File

@ -1,54 +0,0 @@
<?php
namespace App\Caches;
use App\Models\Category as CategoryModel;
use App\Repos\Course as CourseRepo;
class CourseCategoryList extends Cache
{
protected $lifetime = 1 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "course_category_list:{$id}";
}
public function getContent($id = null)
{
$courseRepo = new CourseRepo();
$categories = $courseRepo->findCategories($id);
if ($categories->count() == 0) {
return [];
}
return $this->handleContent($categories);
}
/**
* @param CategoryModel[] $categories
* @return array
*/
public function handleContent($categories)
{
$result = [];
foreach ($categories as $category) {
$result[] = [
'id' => $category->id,
'name' => $category->name,
];
}
return $result;
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -8,7 +13,7 @@ use App\Repos\Course as CourseRepo;
class CoursePackageList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 86400;
public function getLifetime()
{

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -8,7 +13,7 @@ use App\Repos\Course as CourseRepo;
class CourseRelatedList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 86400;
public function getLifetime()
{
@ -43,16 +48,25 @@ class CourseRelatedList extends Cache
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}

View File

@ -1,57 +0,0 @@
<?php
namespace App\Caches;
use App\Models\User as UserModel;
use App\Repos\Course as CourseRepo;
class CourseTeacherList extends Cache
{
protected $lifetime = 1 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "course_teacher_list:{$id}";
}
public function getContent($id = null)
{
$courseRepo = new CourseRepo();
$users = $courseRepo->findTeachers($id);
if ($users->count() == 0) {
return [];
}
return $this->handleContent($users);
}
/**
* @param UserModel[] $users
* @return array
*/
public function handleContent($users)
{
$result = [];
foreach ($users as $user) {
$result[] = [
'id' => $user->id,
'name' => $user->name,
'avatar' => $user->avatar,
'title' => $user->title,
'about' => $user->about,
];
}
return $result;
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -9,7 +14,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class CourseTopicList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 86400;
public function getLifetime()
{
@ -59,6 +64,7 @@ class CourseTopicList extends Cache
{
return TopicModel::query()
->where('published = 1')
->andWhere('deleted = 0')
->orderBy('RAND()')
->limit($limit)
->execute();

View File

@ -0,0 +1,71 @@
<?php
/**
* @copyright Copyright (c) 2023 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Models\Article as ArticleModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class FeaturedArticleList extends Cache
{
protected $lifetime = 3600;
protected $limit = 5;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'featured_article_list';
}
public function getContent($id = null)
{
$articles = $this->findArticles($this->limit);
if ($articles->count() == 0) {
return [];
}
$result = [];
foreach ($articles as $article) {
$result[] = [
'id' => $article->id,
'title' => $article->title,
'cover' => $article->cover,
'favorite_count' => $article->favorite_count,
'comment_count' => $article->comment_count,
'view_count' => $article->view_count,
'like_count' => $article->like_count,
];
}
return $result;
}
/**
* @param int $limit
* @return ResultsetInterface|Resultset|ArticleModel[]
*/
protected function findArticles($limit = 5)
{
return ArticleModel::query()
->where('featured = 1')
->andWhere('published = :published:', ['published' => ArticleModel::PUBLISH_APPROVED])
->andWhere('deleted = 0')
->orderBy('RAND()')
->limit($limit)
->execute();
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2023 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -6,10 +11,12 @@ use App\Models\Course as CourseModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class CourseRecommendedList extends Cache
class FeaturedCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
protected $limit = 5;
public function getLifetime()
{
@ -18,40 +25,40 @@ class CourseRecommendedList extends Cache
public function getKey($id = null)
{
return "course_recommended_list:{$id}";
return 'featured_course_list';
}
public function getContent($id = null)
{
$courses = $this->findCourses(5);
$courses = $this->findCourses($this->limit);
if ($courses->count() == 0) {
return [];
}
return $this->handleContent($courses);
}
/**
* @param CourseModel[] $courses
* @return array
*/
public function handleContent($courses)
{
$result = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
@ -62,10 +69,12 @@ class CourseRecommendedList extends Cache
* @param int $limit
* @return ResultsetInterface|Resultset|CourseModel[]
*/
public function findCourses($limit = 5)
protected function findCourses($limit = 5)
{
return CourseModel::query()
->where('published = 1 AND market_price > 0')
->where('featured = 1')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('RAND()')
->limit($limit)
->execute();

View File

@ -0,0 +1,72 @@
<?php
/**
* @copyright Copyright (c) 2023 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Models\Question as QuestionModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class FeaturedQuestionList extends Cache
{
protected $lifetime = 3600;
protected $limit = 5;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'featured_question_list';
}
public function getContent($id = null)
{
$questions = $this->findQuestions($this->limit);
if ($questions->count() == 0) {
return [];
}
$result = [];
foreach ($questions as $question) {
$result[] = [
'id' => $question->id,
'title' => $question->title,
'cover' => $question->cover,
'favorite_count' => $question->favorite_count,
'answer_count' => $question->answer_count,
'view_count' => $question->view_count,
'like_count' => $question->like_count,
];
}
return $result;
}
/**
* @param int $limit
* @return ResultsetInterface|Resultset|QuestionModel[]
*/
protected function findQuestions($limit = 5)
{
return QuestionModel::query()
->where('featured = 1')
->andWhere('published = :published:', ['published' => QuestionModel::PUBLISH_APPROVED])
->andWhere('deleted = 0')
->orderBy('RAND()')
->limit($limit)
->execute();
}
}

View File

@ -1,31 +0,0 @@
<?php
namespace App\Caches;
use App\Repos\FlashSale as FlashSaleRepo;
class FlashSale extends Cache
{
protected $lifetime = 1 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "flash_sale:{$id}";
}
public function getContent($id = null)
{
$saleRepo = new FlashSaleRepo();
$sale = $saleRepo->findById($id);
return $sale ?: null;
}
}

View File

@ -1,31 +0,0 @@
<?php
namespace App\Caches;
use App\Repos\Help as HelpRepo;
class Help extends Cache
{
protected $lifetime = 7 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "help:{$id}";
}
public function getContent($id = null)
{
$helpRepo = new HelpRepo();
$help = $helpRepo->findById($id);
return $help ?: null;
}
}

View File

@ -1,89 +0,0 @@
<?php
namespace App\Caches;
use App\Models\Category as CategoryModel;
use App\Models\Help as HelpModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class HelpList extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'help_list';
}
public function getContent($id = null)
{
$categories = $this->findCategories();
if ($categories->count() == 0) {
return [];
}
$result = [];
foreach ($categories as $category) {
$item = [];
$item['category'] = [
'id' => $category->id,
'name' => $category->name,
];
$item['helps'] = [];
$helps = $this->findHelps($category->id);
if ($helps->count() > 0) {
foreach ($helps as $help) {
$item['helps'][] = [
'id' => $help->id,
'title' => $help->title,
];
}
}
$result[] = $item;
}
return $result;
}
/**
* @return ResultsetInterface|Resultset|CategoryModel[]
*/
protected function findCategories()
{
return CategoryModel::query()
->where('type = :type:', ['type' => CategoryModel::TYPE_HELP])
->andWhere('level = 1 AND published = 1')
->orderBy('priority ASC')
->execute();
}
/**
* @param int $categoryId
* @return ResultsetInterface|Resultset|CategoryModel[]
*/
protected function findHelps($categoryId)
{
return HelpModel::query()
->where('category_id = :category_id:', ['category_id' => $categoryId])
->andWhere('published = 1')
->orderBy('priority ASC')
->execute();
}
}

View File

@ -0,0 +1,136 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Models\Question as QuestionModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class HotQuestionList extends Cache
{
protected $lifetime = 3600;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'hot_question_list';
}
public function getContent($id = null)
{
$questions = $this->findWeeklyHotQuestions();
if ($questions->count() > 0) {
return $this->handleQuestions($questions);
}
$questions = $this->findMonthlyHotQuestions();
if ($questions->count() > 0) {
return $this->handleQuestions($questions);
}
$questions = $this->findYearlyHotQuestions();
if ($questions->count() > 0) {
return $this->handleQuestions($questions);
}
$questions = $this->findFullyHotQuestions();
if ($questions->count() > 0) {
return $this->handleQuestions($questions);
}
return [];
}
/**
* @param QuestionModel[] $questions
* @return array
*/
protected function handleQuestions($questions)
{
$result = [];
foreach ($questions as $question) {
$result[] = [
'id' => $question->id,
'title' => $question->title,
];
}
return $result;
}
/**
* @param int $limit
* @return ResultsetInterface|Resultset|QuestionModel[]
*/
protected function findWeeklyHotQuestions($limit = 10)
{
$createTime = strtotime('monday this week');
return $this->findHotQuestions($createTime, $limit);
}
/**
* @param int $limit
* @return ResultsetInterface|Resultset|QuestionModel[]
*/
protected function findMonthlyHotQuestions($limit = 10)
{
$createTime = strtotime(date('Y-m-01'));
return $this->findHotQuestions($createTime, $limit);
}
/**
* @param int $limit
* @return ResultsetInterface|Resultset|QuestionModel[]
*/
protected function findYearlyHotQuestions($limit = 10)
{
$createTime = strtotime(date('Y-01-01'));
return $this->findHotQuestions($createTime, $limit);
}
/**
* @param int $limit
* @return ResultsetInterface|Resultset|QuestionModel[]
*/
protected function findFullyHotQuestions($limit = 10)
{
$createTime = 0;
return $this->findHotQuestions($createTime, $limit);
}
/**
* @param int $createTime
* @param int $limit
* @return ResultsetInterface|Resultset|QuestionModel[]
*/
protected function findHotQuestions($createTime, $limit = 10)
{
return QuestionModel::query()
->where('create_time > :create_time:', ['create_time' => $createTime])
->andWhere('published = :published:', ['published' => QuestionModel::PUBLISH_APPROVED])
->andWhere('deleted = 0')
->orderBy('score DESC')
->limit($limit)
->execute();
}
}

View File

@ -1,85 +0,0 @@
<?php
namespace App\Caches;
use App\Models\ImMessage;
use App\Models\ImMessage as ImMessageModel;
use App\Models\User as UserModel;
use App\Repos\ImGroup as ImGroupRepo;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class ImActiveGroupList extends Cache
{
protected $lifetime = 1 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'im_active_group_list';
}
public function getContent($id = null)
{
$groups = $this->findGroups();
if (empty($groups)) {
return [];
}
$result = [];
foreach ($groups as $group) {
$result[] = [
'id' => $group->id,
'type' => $group->type,
'name' => $group->name,
'avatar' => $group->avatar,
'about' => $group->about,
'user_count' => $group->user_count,
'msg_count' => $group->msg_count,
];
}
return $result;
}
/**
* @param int $days
* @param int $limit
* @return ResultsetInterface|Resultset|UserModel[]
*/
protected function findGroups($days = 7, $limit = 12)
{
$result = [];
$startTime = strtotime("-{$days} days");
$endTime = time();
$rows = ImMessageModel::query()
->columns(['receiver_id', 'total_count' => 'count(receiver_id)'])
->groupBy('receiver_id')
->orderBy('total_count DESC')
->where('receiver_type = :type:', ['type' => ImMessageModel::TYPE_GROUP])
->betweenWhere('create_time', $startTime, $endTime)
->limit($limit)
->execute();
if ($rows->count() > 0) {
$ids = kg_array_column($rows->toArray(), 'receiver_id');
$groupRepo = new ImGroupRepo();
$result = $groupRepo->findByIds($ids);
}
return $result;
}
}

View File

@ -1,82 +0,0 @@
<?php
namespace App\Caches;
use App\Models\ImMessage as ImMessageModel;
use App\Models\User as UserModel;
use App\Repos\User as UserRepo;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class ImActiveUserList extends Cache
{
protected $lifetime = 1 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'im_active_user_list';
}
public function getContent($id = null)
{
$users = $this->findUsers($id);
if (empty($users)) {
return [];
}
$result = [];
foreach ($users as $user) {
$result[] = [
'id' => $user->id,
'name' => $user->name,
'avatar' => $user->avatar,
'title' => $user->title,
'about' => $user->about,
'vip' => $user->vip,
];
}
return $result;
}
/**
* @param int $days
* @param int $limit
* @return ResultsetInterface|Resultset|UserModel[]
*/
protected function findUsers($days = 7, $limit = 12)
{
$result = [];
$startTime = strtotime("-{$days} days");
$endTime = time();
$rows = ImMessageModel::query()
->columns(['sender_id', 'total_count' => 'count(sender_id)'])
->groupBy('sender_id')
->orderBy('total_count DESC')
->betweenWhere('create_time', $startTime, $endTime)
->limit($limit)
->execute();
if ($rows->count() > 0) {
$ids = kg_array_column($rows->toArray(), 'sender_id');
$userRepo = new UserRepo();
$result = $userRepo->findByIds($ids);
}
return $result;
}
}

View File

@ -1,31 +0,0 @@
<?php
namespace App\Caches;
use App\Repos\ImGroup as ImGroupRepo;
class ImGroup extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "im_group:{$id}";
}
public function getContent($id = null)
{
$groupRepo = new ImGroupRepo();
$group = $groupRepo->findById($id);
return $group ?: null;
}
}

View File

@ -1,85 +0,0 @@
<?php
namespace App\Caches;
use App\Models\ImMessage as ImMessageModel;
use App\Models\User as UserModel;
use App\Repos\User as UserRepo;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class ImGroupActiveUserList extends Cache
{
protected $lifetime = 1 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "im_group_active_user_list:{$id}";
}
public function getContent($id = null)
{
$users = $this->findUsers($id);
if (empty($users)) {
return [];
}
$result = [];
foreach ($users as $user) {
$result[] = [
'id' => $user->id,
'name' => $user->name,
'avatar' => $user->avatar,
'title' => $user->title,
'about' => $user->about,
'vip' => $user->vip,
];
}
return $result;
}
/**
* @param int $groupId
* @param int $days
* @param int $limit
* @return ResultsetInterface|Resultset|UserModel[]
*/
protected function findUsers($groupId, $days = 7, $limit = 5)
{
$result = [];
$startTime = strtotime("-{$days} days");
$endTime = time();
$rows = ImMessageModel::query()
->columns(['sender_id', 'total_count' => 'count(sender_id)'])
->groupBy('sender_id')
->orderBy('total_count DESC')
->where('receiver_id = :group_id:', ['group_id' => $groupId])
->andWhere('receiver_type = :type:', ['type' => ImMessageModel::TYPE_GROUP])
->betweenWhere('create_time', $startTime, $endTime)
->limit($limit)
->execute();
if ($rows->count() > 0) {
$ids = kg_array_column($rows->toArray(), 'sender_id');
$userRepo = new UserRepo();
$result = $userRepo->findByIds($ids);
}
return $result;
}
}

View File

@ -1,73 +0,0 @@
<?php
namespace App\Caches;
use App\Models\ImGroup as ImGroupModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class ImNewGroupList extends Cache
{
protected $lifetime = 1 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'im_new_group_list';
}
public function getContent($id = null)
{
$limit = 12;
$groups = $this->findGroups($limit);
if ($groups->count() == 0) {
return [];
}
return $this->handleContent($groups);
}
/**
* @param ImGroupModel[] $groups
* @return array
*/
protected function handleContent($groups)
{
$result = [];
foreach ($groups as $group) {
$result[] = [
'id' => $group->id,
'type' => $group->type,
'name' => $group->name,
'avatar' => $group->avatar,
'about' => $group->about,
'user_count' => $group->user_count,
'msg_count' => $group->msg_count,
];
}
return $result;
}
/**
* @param int $limit
* @return ResultsetInterface|Resultset|ImGroupModel[]
*/
public function findGroups($limit = 12)
{
return ImGroupModel::query()
->where('published = 1')
->orderBy('id DESC')
->limit($limit)
->execute();
}
}

View File

@ -1,72 +0,0 @@
<?php
namespace App\Caches;
use App\Models\User as UserModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class ImNewUserList extends Cache
{
protected $lifetime = 1 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'im_new_user_list';
}
public function getContent($id = null)
{
$limit = 12;
$users = $this->findUsers($limit);
if ($users->count() == 0) {
return [];
}
return $this->handleContent($users);
}
/**
* @param UserModel[] $users
* @return array
*/
protected function handleContent($users)
{
$result = [];
foreach ($users as $user) {
$result[] = [
'id' => $user->id,
'name' => $user->name,
'avatar' => $user->avatar,
'title' => $user->title,
'about' => $user->about,
'vip' => $user->vip,
];
}
return $result;
}
/**
* @param int $limit
* @return ResultsetInterface|Resultset|UserModel[]
*/
public function findUsers($limit = 12)
{
return UserModel::query()
->where('deleted = 0')
->orderBy('id DESC')
->limit($limit)
->execute();
}
}

View File

@ -0,0 +1,48 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Models\Article as ArticleModel;
use App\Repos\Article as ArticleRepo;
use App\Services\Logic\Article\ArticleList as ArticleListService;
class IndexArticleList extends Cache
{
protected $lifetime = 3600;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'index_article_list';
}
public function getContent($id = null)
{
$articleRepo = new ArticleRepo();
$where = [
'published' => ArticleModel::PUBLISH_APPROVED,
'private' => 0,
'deleted' => 0,
];
$pager = $articleRepo->paginate($where, 'latest', 1, 10);
$service = new ArticleListService();
$pager = $service->handleArticles($pager);
return $pager->items ?: [];
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -14,7 +19,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class IndexFeaturedCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -60,16 +65,26 @@ class IndexFeaturedCourseList extends Cache
$categoryCourses = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
@ -89,7 +104,9 @@ class IndexFeaturedCourseList extends Cache
{
return CategoryModel::query()
->where('type = :type:', ['type' => CategoryModel::TYPE_COURSE])
->andWhere('level = 1 AND published = 1')
->andWhere('level = 1')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('priority ASC')
->limit($limit)
->execute();
@ -108,8 +125,9 @@ class IndexFeaturedCourseList extends Cache
return CourseModel::query()
->inWhere('category_id', $categoryIds)
->andWhere('published = 1')
->andWhere('featured = 1')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('id DESC')
->limit($limit)
->execute();

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -14,7 +19,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class IndexFreeCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -60,16 +65,26 @@ class IndexFreeCourseList extends Cache
$categoryCourses = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
@ -89,7 +104,9 @@ class IndexFreeCourseList extends Cache
{
return CategoryModel::query()
->where('type = :type:', ['type' => CategoryModel::TYPE_COURSE])
->andWhere('level = 1 AND published = 1')
->andWhere('level = 1')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('priority ASC')
->limit($limit)
->execute();
@ -108,8 +125,9 @@ class IndexFreeCourseList extends Cache
return CourseModel::query()
->inWhere('category_id', $categoryIds)
->andWhere('published = 1')
->andWhere('market_price = 0')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('score DESC')
->limit($limit)
->execute();

View File

@ -1,19 +1,24 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Models\Chapter as ChapterModel;
use App\Models\ChapterLive as ChapterLiveModel;
use App\Repos\Chapter as ChapterRepo;
use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
/**
* 直播课程
*/
class IndexLiveList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -27,32 +32,11 @@ class IndexLiveList extends Cache
public function getContent($id = null)
{
/**
* 限制输出多少天数(一维限额)
*/
$dayLimit = 3;
$limit = 8;
/**
* 限制每天维度下的输出数(二维限额)
*/
$perDayLimit = 10;
$lives = $this->findChapterLives();
$beginTime = strtotime('today');
$endTime = strtotime("+30 days");
/**
* @var Resultset|ChapterLiveModel[] $lives
*/
$lives = ChapterLiveModel::query()
->betweenWhere('start_time', $beginTime, $endTime)
->orderBy('start_time ASC')
->execute();
if ($lives->count() == 0) {
return [];
}
$result = [];
if ($lives->count() == 0) return [];
$chapterIds = kg_array_column($lives->toArray(), 'chapter_id');
@ -72,53 +56,87 @@ class IndexLiveList extends Cache
$courses = $courseRepo->findByIds($courseIds);
$teacherIds = kg_array_column($courses->toArray(), 'teacher_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($teacherIds);
$courseMapping = [];
foreach ($courses as $course) {
$courseMapping[$course->id] = $course;
}
$userMapping = [];
foreach ($users as $user) {
$userMapping[$user->id] = $user;
}
$result = [];
$flag = [];
foreach ($lives as $live) {
if (count($result) >= $dayLimit) {
break;
}
$day = date('y-m-d', $live->start_time);
if (isset($result[$day]) && count($result[$day]) >= $perDayLimit) {
continue;
}
$chapter = $chapterMapping[$live->chapter_id];
$course = $courseMapping[$chapter->course_id];
$teacher = $userMapping[$course->teacher_id];
$teacherInfo = [
'id' => $teacher->id,
'name' => $teacher->name,
'title' => $teacher->title,
'avatar' => $teacher->avatar,
];
$chapterInfo = [
'id' => $chapter->id,
'title' => $chapter->title,
'start_time' => $live->start_time,
'end_time' => $live->end_time,
];
$courseInfo = [
'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,
'teacher' => $teacherInfo,
];
$result[$day][] = [
'course' => $courseInfo,
'chapter' => $chapterInfo,
];
if (!isset($flag[$course->id]) && count($flag) < $limit) {
$flag[$course->id] = 1;
$result[] = [
'id' => $live->id,
'status' => $live->status,
'start_time' => $live->start_time,
'end_time' => $live->end_time,
'course' => $courseInfo,
'chapter' => $chapterInfo,
];
}
}
return $result;
}
/**
* @return ResultsetInterface|Resultset|ChapterLiveModel[]
*/
protected function findChapterLives()
{
$startTime = strtotime('today');
$endTime = strtotime('+30 days');
return $this->modelsManager->createBuilder()
->columns('cl.*')
->addFrom(ChapterLiveModel::class, 'cl')
->join(ChapterModel::class, 'cl.chapter_id = c.id', 'c')
->betweenWhere('start_time', $startTime, $endTime)
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('start_time ASC')
->getQuery()
->execute();
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -14,7 +19,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class IndexNewCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -60,16 +65,26 @@ class IndexNewCourseList extends Cache
$categoryCourses = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
@ -89,7 +104,9 @@ class IndexNewCourseList extends Cache
{
return CategoryModel::query()
->where('type = :type:', ['type' => CategoryModel::TYPE_COURSE])
->andWhere('level = 1 AND published = 1')
->andWhere('level = 1')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('priority ASC')
->limit($limit)
->execute();
@ -109,6 +126,7 @@ class IndexNewCourseList extends Cache
return CourseModel::query()
->inWhere('category_id', $categoryIds)
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('id DESC')
->limit($limit)
->execute();

View File

@ -0,0 +1,47 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Models\Question as QuestionModel;
use App\Repos\Question as QuestionRepo;
use App\Services\Logic\Question\QuestionList as QuestionListService;
class IndexQuestionList extends Cache
{
protected $lifetime = 3600;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'index_question_list';
}
public function getContent($id = null)
{
$questionRepo = new QuestionRepo();
$where = [
'published' => QuestionModel::PUBLISH_APPROVED,
'deleted' => 0,
];
$pager = $questionRepo->paginate($where, 'latest', 1, 10);
$service = new QuestionListService();
$pager = $service->handleQuestions($pager);
return $pager->items ?: [];
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -12,7 +17,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class IndexSimpleFeaturedCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -37,16 +42,26 @@ class IndexSimpleFeaturedCourseList extends Cache
$result = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
@ -60,8 +75,9 @@ class IndexSimpleFeaturedCourseList extends Cache
protected function findCourses($limit = 8)
{
return CourseModel::query()
->where('published = 1')
->andWhere('featured = 1')
->where('featured = 1')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('id DESC')
->limit($limit)
->execute();

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -12,7 +17,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class IndexSimpleFreeCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -37,16 +42,26 @@ class IndexSimpleFreeCourseList extends Cache
$result = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
@ -60,8 +75,9 @@ class IndexSimpleFreeCourseList extends Cache
protected function findCourses($limit = 8)
{
return CourseModel::query()
->where('published = 1')
->andWhere('market_price = 0')
->where('market_price = 0')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('score DESC')
->limit($limit)
->execute();

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -12,7 +17,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class IndexSimpleNewCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -37,16 +42,26 @@ class IndexSimpleNewCourseList extends Cache
$result = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
@ -61,6 +76,7 @@ class IndexSimpleNewCourseList extends Cache
{
return CourseModel::query()
->where('published = 1')
->andWhere('deleted = 0')
->orderBy('id DESC')
->limit($limit)
->execute();

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -12,7 +17,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class IndexSimpleVipCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -37,16 +42,26 @@ class IndexSimpleVipCourseList extends Cache
$result = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
@ -60,8 +75,10 @@ class IndexSimpleVipCourseList extends Cache
protected function findCourses($limit = 8)
{
return CourseModel::query()
->where('published = 1')
->where('market_price > vip_price')
->andWhere('vip_price >= 0')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('score DESC')
->limit($limit)
->execute();

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -9,7 +14,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class IndexSlideList extends Cache
{
protected $lifetime = 365 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -63,6 +68,7 @@ class IndexSlideList extends Cache
{
return SlideModel::query()
->where('published = 1')
->andWhere('deleted = 0')
->orderBy('priority ASC')
->limit($limit)
->execute();

View File

@ -0,0 +1,69 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Models\User as UserModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class IndexTeacherList extends Cache
{
protected $lifetime = 3600;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'index_teacher_list';
}
public function getContent($id = null)
{
$teachers = $this->findTeachers();
if ($teachers->count() == 0) return [];
$result = [];
$baseUrl = kg_cos_url();
foreach ($teachers->toArray() as $teacher) {
$teacher['avatar'] = $baseUrl . $teacher['avatar'];
$result[] = [
'id' => $teacher['id'],
'name' => $teacher['name'],
'title' => $teacher['title'],
'avatar' => $teacher['avatar'],
'about' => $teacher['about'],
];
}
return $result;
}
/**
* @param int $limit
* @return ResultsetInterface|Resultset|UserModel[]
*/
protected function findTeachers($limit = 8)
{
return UserModel::query()
->where('edu_role = :edu_role:', ['edu_role' => UserModel::EDU_ROLE_TEACHER])
->andWhere('deleted = 0')
->orderBy('RAND()')
->limit($limit)
->execute();
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -14,7 +19,7 @@ use Phalcon\Mvc\Model\ResultsetInterface;
class IndexVipCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 3600;
public function getLifetime()
{
@ -60,16 +65,26 @@ class IndexVipCourseList extends Cache
$categoryCourses = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$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,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
@ -89,7 +104,9 @@ class IndexVipCourseList extends Cache
{
return CategoryModel::query()
->where('type = :type:', ['type' => CategoryModel::TYPE_COURSE])
->andWhere('level = 1 AND published = 1')
->andWhere('level = 1')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('priority ASC')
->limit($limit)
->execute();
@ -108,8 +125,10 @@ class IndexVipCourseList extends Cache
return CourseModel::query()
->inWhere('category_id', $categoryIds)
->andWhere('published = 1')
->andWhere('market_price > vip_price')
->andWhere('vip_price >= 0')
->andWhere('published = 1')
->andWhere('deleted = 0')
->orderBy('score DESC')
->limit($limit)
->execute();

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,29 +0,0 @@
<?php
namespace App\Caches;
use App\Models\FlashSale as FlashSaleModel;
class MaxFlashSaleId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_flash_sale_id';
}
public function getContent($id = null)
{
$sale = FlashSaleModel::findFirst(['order' => 'id DESC']);
return $sale->id ?? 0;
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace App\Caches;
use App\Models\Help as HelpModel;
class MaxHelpId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_help_id';
}
public function getContent($id = null)
{
$help = HelpModel::findFirst(['order' => 'id DESC']);
return $help->id ?? 0;
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace App\Caches;
use App\Models\ImGroup as ImGroupModel;
class MaxImGroupId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_im_group_id';
}
public function getContent($id = null)
{
$group = ImGroupModel::findFirst(['order' => 'id DESC']);
return $group->id ?? 0;
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,29 +0,0 @@
<?php
namespace App\Caches;
use App\Models\Page as PageModel;
class MaxPageId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_page_id';
}
public function getContent($id = null)
{
$page = PageModel::findFirst(['order' => 'id DESC']);
return $page->id ?? 0;
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace App\Caches;
use App\Models\PointGift as PointGiftModel;
class MaxPointGiftId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_point_gift_id';
}
public function getContent($id = null)
{
$gift = PointGiftModel::findFirst(['order' => 'id DESC']);
return $gift->id ?? 0;
}
}

34
app/Caches/MaxTagId.php Normal file
View File

@ -0,0 +1,34 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Models\Tag as TagModel;
class MaxTagId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_tag_id';
}
public function getContent($id = null)
{
$tag = TagModel::findFirst(['order' => 'id DESC']);
return $tag->id ?? 0;
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,29 +0,0 @@
<?php
namespace App\Caches;
use App\Models\Upload as UploadModel;
class MaxUploadId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_upload_id';
}
public function getContent($id = null)
{
$upload = UploadModel::findFirst(['order' => 'id DESC']);
return $upload->id ?? 0;
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -8,7 +13,7 @@ use App\Repos\Package as PackageRepo;
class PackageCourseList extends Cache
{
protected $lifetime = 1 * 86400;
protected $lifetime = 86400;
public function getLifetime()
{
@ -42,17 +47,26 @@ class PackageCourseList extends Cache
$result = [];
foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$result[] = [
'id' => $course->id,
'title' => $course->title,
'cover' => $course->cover,
'origin_price' => $course->origin_price,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model,
'level' => $course->level,
'user_count' => $course->user_count,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount,
'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}

View File

@ -1,31 +0,0 @@
<?php
namespace App\Caches;
use App\Repos\Page as PageRepo;
class Page extends Cache
{
protected $lifetime = 7 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "page:{$id}";
}
public function getContent($id = null)
{
$pageRepo = new PageRepo();
$page = $pageRepo->findById($id);
return $page ?: null;
}
}

View File

@ -1,31 +0,0 @@
<?php
namespace App\Caches;
use App\Repos\PointGift as PointGiftRepo;
class PointGift extends Cache
{
protected $lifetime = 1 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "point_gift:{$id}";
}
public function getContent($id = null)
{
$giftRepo = new PointGiftRepo();
$gift = $giftRepo->findById($id);
return $gift ?: null;
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
@ -14,7 +19,7 @@ class PointHotGiftList extends Cache
*
* @var int
*/
protected $lifetime = 1 * 86400;
protected $lifetime = 86400;
/**
* 显示个数
@ -71,6 +76,7 @@ class PointHotGiftList extends Cache
{
return PointGiftModel::query()
->where('published = 1')
->andWhere('deleted = 0')
->orderBy('redeem_count DESC')
->limit($limit)
->execute();

View File

@ -1,65 +0,0 @@
<?php
namespace App\Caches;
use App\Models\Order as OrderModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class SaleTrend extends Cache
{
protected $lifetime = 2 * 3600;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'sale_trend';
}
public function getContent($id = null)
{
}
/**
* @param OrderModel[] $sales
* @param int $days
* @return array
*/
protected function handleSales($sales, $days = 7)
{
$result = [];
foreach (array_reverse(range(1, $days)) as $num) {
$date = date('Y-m-d', strtotime("-{$num} days"));
$result[$date] = 0;
}
foreach ($sales as $sale) {
$date = date('Y-m-d', $sale->create_time);
$result[$date] += $sale->amount;
}
return $result;
}
/**
* @param int $days
* @return ResultsetInterface|Resultset|OrderModel[]
*/
protected function findSales($days = 7)
{
$time = strtotime("-{$days} days");
return OrderModel::query()
->where('status = :status:', ['status' => OrderModel::STATUS_FINISHED])
->andWhere('create_time > :time:', ['time' => $time])
->execute();
}
}

View File

@ -1,4 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;

View File

@ -1,12 +1,19 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Repos\Answer as AnswerRepo;
use App\Repos\Article as ArticleRepo;
use App\Repos\Comment as CommentRepo;
use App\Repos\Consult as ConsultRepo;
use App\Repos\Course as CourseRepo;
use App\Repos\ImGroup as GroupRepo;
use App\Repos\Order as OrderRepo;
use App\Repos\Package as PackageRepo;
use App\Repos\Question as QuestionRepo;
use App\Repos\Review as ReviewRepo;
use App\Repos\Topic as TopicRepo;
use App\Repos\User as UserRepo;
@ -14,7 +21,7 @@ use App\Repos\User as UserRepo;
class SiteGlobalStat extends Cache
{
protected $lifetime = 2 * 3600;
protected $lifetime = 15 * 60;
public function getLifetime()
{
@ -29,9 +36,11 @@ class SiteGlobalStat extends Cache
public function getContent($id = null)
{
$courseRepo = new CourseRepo();
$articleRepo = new ArticleRepo();
$questionRepo = new QuestionRepo();
$answerRepo = new AnswerRepo();
$commentRepo = new CommentRepo();
$consultRepo = new ConsultRepo();
$groupRepo = new GroupRepo();
$orderRepo = new OrderRepo();
$packageRepo = new PackageRepo();
$reviewRepo = new ReviewRepo();
$topicRepo = new TopicRepo();
@ -39,9 +48,12 @@ class SiteGlobalStat extends Cache
return [
'course_count' => $courseRepo->countCourses(),
'article_count' => $articleRepo->countArticles(),
'question_count' => $questionRepo->countQuestions(),
'answer_count' => $answerRepo->countAnswers(),
'comment_count' => $commentRepo->countComments(),
'consult_count' => $consultRepo->countConsults(),
'group_count' => $groupRepo->countGroups(),
'order_count' => $orderRepo->countOrders(),
'vip_count' => $userRepo->countVipUsers(),
'package_count' => $packageRepo->countPackages(),
'review_count' => $reviewRepo->countReviews(),
'topic_count' => $topicRepo->countTopics(),

Some files were not shown because too many files have changed in this diff Show More