1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-18 18:16:55 +08:00

Compare commits

..

No commits in common. "master" and "v1.7.4" have entirely different histories.

282 changed files with 3102 additions and 2061 deletions

View File

@ -1,53 +1,3 @@
### [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) ### [v1.7.4](https://gitee.com/koogua/course-tencent-cloud/releases/v1.7.4)(2024-12-10)
- 更新layui-v2.9.20 - 更新layui-v2.9.20

View File

@ -1,6 +1,6 @@
## 酷瓜云课堂 ## 酷瓜云课堂
[![酷瓜云课堂-开源知识付费解决方案](https://portal-1255691183.file.myqcloud.com/img/content/63ec392618bd5.png)](https://www.koogua.com) ![酷瓜云课堂](https://portal-1255691183.file.myqcloud.com/img/content/61dd395c053e5.png)
### 系统介绍 ### 系统介绍
@ -48,9 +48,9 @@ Tips: 请用手机注册一个新账号,用户中心 -> 关注订阅,扫码
### 项目组件 ### 项目组件
- 后台框架:[phalcon 3.4](https://phalcon.io) - 后台框架:[phalcon 3.4.5](https://phalcon.io)
- 前端框架:[layui 2.9](https://layui.dev) - 前端框架:[layui 2.9.10](https://layui.dev)
- 全文检索:[xunsearch 1.4](http://www.xunsearch.com) - 全文检索:[xunsearch 1.4.17](http://www.xunsearch.com)
- 基础依赖:[php7.3](https://php.net) [mysql5.7](https://mysql.com) [redis5.0](https://redis.io) - 基础依赖:[php7.3](https://php.net) [mysql5.7](https://mysql.com) [redis5.0](https://redis.io)
### 项目文档 ### 项目文档

View File

@ -8,6 +8,7 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\Question as QuestionRepo; use App\Repos\Question as QuestionRepo;
use App\Repos\User as UserRepo;
class AnswerList extends Builder class AnswerList extends Builder
{ {
@ -17,7 +18,7 @@ class AnswerList extends Builder
$questions = $this->getQuestions($answers); $questions = $this->getQuestions($answers);
foreach ($answers as $key => $answer) { foreach ($answers as $key => $answer) {
$answers[$key]['question'] = $questions[$answer['question_id']] ?? null; $answers[$key]['question'] = $questions[$answer['question_id']] ?? new \stdClass();
} }
return $answers; return $answers;
@ -28,7 +29,7 @@ class AnswerList extends Builder
$users = $this->getUsers($answers); $users = $this->getUsers($answers);
foreach ($answers as $key => $answer) { foreach ($answers as $key => $answer) {
$answers[$key]['owner'] = $users[$answer['owner_id']] ?? null; $answers[$key]['owner'] = $users[$answer['owner_id']] ?? new \stdClass();
} }
return $answers; return $answers;
@ -55,7 +56,20 @@ class AnswerList extends Builder
{ {
$ids = kg_array_column($answers, 'owner_id'); $ids = kg_array_column($answers, 'owner_id');
return $this->getShallowUserByIds($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

@ -8,6 +8,7 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\Article as ArticleRepo; use App\Repos\Article as ArticleRepo;
use App\Repos\User as UserRepo;
use Phalcon\Text; use Phalcon\Text;
class ArticleFavoriteList extends Builder class ArticleFavoriteList extends Builder
@ -18,7 +19,7 @@ class ArticleFavoriteList extends Builder
$articles = $this->getArticles($relations); $articles = $this->getArticles($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['article'] = $articles[$value['article_id']] ?? null; $relations[$key]['article'] = $articles[$value['article_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -29,7 +30,7 @@ class ArticleFavoriteList extends Builder
$users = $this->getUsers($relations); $users = $this->getUsers($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? null; $relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -69,7 +70,20 @@ class ArticleFavoriteList extends Builder
{ {
$ids = kg_array_column($relations, 'user_id'); $ids = kg_array_column($relations, 'user_id');
return $this->getShallowUserByIds($ids); $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

@ -9,6 +9,7 @@ namespace App\Builders;
use App\Caches\CategoryAllList as CategoryAllListCache; use App\Caches\CategoryAllList as CategoryAllListCache;
use App\Models\Category as CategoryModel; use App\Models\Category as CategoryModel;
use App\Repos\User as UserRepo;
class ArticleList extends Builder class ArticleList extends Builder
{ {
@ -27,7 +28,7 @@ class ArticleList extends Builder
$categories = $this->getCategories(); $categories = $this->getCategories();
foreach ($articles as $key => $article) { foreach ($articles as $key => $article) {
$articles[$key]['category'] = $categories[$article['category_id']] ?? null; $articles[$key]['category'] = $categories[$article['category_id']] ?? new \stdClass();
} }
return $articles; return $articles;
@ -38,7 +39,7 @@ class ArticleList extends Builder
$users = $this->getUsers($articles); $users = $this->getUsers($articles);
foreach ($articles as $key => $article) { foreach ($articles as $key => $article) {
$articles[$key]['owner'] = $users[$article['owner_id']] ?? null; $articles[$key]['owner'] = $users[$article['owner_id']] ?? new \stdClass();
} }
return $articles; return $articles;
@ -68,7 +69,20 @@ class ArticleList extends Builder
{ {
$ids = kg_array_column($articles, 'owner_id'); $ids = kg_array_column($articles, 'owner_id');
return $this->getShallowUserByIds($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

@ -7,7 +7,6 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\User as UserRepo;
use Phalcon\Di\Injectable; use Phalcon\Di\Injectable;
class Builder extends Injectable class Builder extends Injectable
@ -18,22 +17,4 @@ class Builder extends Injectable
return kg_array_object($items); 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

@ -7,6 +7,8 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\User as UserRepo;
class CommentList extends Builder class CommentList extends Builder
{ {
@ -15,8 +17,8 @@ class CommentList extends Builder
$users = $this->getUsers($comments); $users = $this->getUsers($comments);
foreach ($comments as $key => $comment) { foreach ($comments as $key => $comment) {
$comments[$key]['owner'] = $users[$comment['owner_id']] ?? null; $comments[$key]['owner'] = $users[$comment['owner_id']] ?? new \stdClass();
$comments[$key]['to_user'] = $users[$comment['to_user_id']] ?? null; $comments[$key]['to_user'] = $users[$comment['to_user_id']] ?? new \stdClass();
} }
return $comments; return $comments;
@ -28,7 +30,20 @@ class CommentList extends Builder
$toUserIds = kg_array_column($comments, 'to_user_id'); $toUserIds = kg_array_column($comments, 'to_user_id');
$ids = array_merge($ownerIds, $toUserIds); $ids = array_merge($ownerIds, $toUserIds);
return $this->getShallowUserByIds($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

@ -8,6 +8,7 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\Course as CourseRepo; use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class ConsultList extends Builder class ConsultList extends Builder
{ {
@ -17,7 +18,7 @@ class ConsultList extends Builder
$courses = $this->getCourses($consults); $courses = $this->getCourses($consults);
foreach ($consults as $key => $consult) { foreach ($consults as $key => $consult) {
$consults[$key]['course'] = $courses[$consult['course_id']] ?? null; $consults[$key]['course'] = $courses[$consult['course_id']] ?? new \stdClass();
} }
return $consults; return $consults;
@ -28,8 +29,8 @@ class ConsultList extends Builder
$users = $this->getUsers($consults); $users = $this->getUsers($consults);
foreach ($consults as $key => $consult) { foreach ($consults as $key => $consult) {
$consults[$key]['owner'] = $users[$consult['owner_id']] ?? null; $consults[$key]['owner'] = $users[$consult['owner_id']] ?? new \stdClass();
$consults[$key]['replier'] = $users[$consult['replier_id']] ?? null; $consults[$key]['replier'] = $users[$consult['replier_id']] ?? new \stdClass();
} }
return $consults; return $consults;
@ -58,7 +59,20 @@ class ConsultList extends Builder
$replierIds = kg_array_column($consults, 'replier_id'); $replierIds = kg_array_column($consults, 'replier_id');
$ids = array_merge($ownerIds, $replierIds); $ids = array_merge($ownerIds, $replierIds);
return $this->getShallowUserByIds($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

@ -8,6 +8,7 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\Course as CourseRepo; use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class CourseFavoriteList extends Builder class CourseFavoriteList extends Builder
{ {
@ -17,7 +18,7 @@ class CourseFavoriteList extends Builder
$courses = $this->getCourses($relations); $courses = $this->getCourses($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['course'] = $courses[$value['course_id']] ?? null; $relations[$key]['course'] = $courses[$value['course_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -28,7 +29,7 @@ class CourseFavoriteList extends Builder
$users = $this->getUsers($relations); $users = $this->getUsers($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? null; $relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -69,7 +70,20 @@ class CourseFavoriteList extends Builder
{ {
$ids = kg_array_column($relations, 'user_id'); $ids = kg_array_column($relations, 'user_id');
return $this->getShallowUserByIds($ids); $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

@ -9,6 +9,7 @@ namespace App\Builders;
use App\Caches\CategoryAllList as CategoryAllListCache; use App\Caches\CategoryAllList as CategoryAllListCache;
use App\Models\Category as CategoryModel; use App\Models\Category as CategoryModel;
use App\Repos\User as UserRepo;
class CourseList extends Builder class CourseList extends Builder
{ {
@ -18,7 +19,7 @@ class CourseList extends Builder
$categories = $this->getCategories(); $categories = $this->getCategories();
foreach ($courses as $key => $course) { foreach ($courses as $key => $course) {
$courses[$key]['category'] = $categories[$course['category_id']] ?? null; $courses[$key]['category'] = $categories[$course['category_id']] ?? new \stdClass();
} }
return $courses; return $courses;
@ -29,7 +30,7 @@ class CourseList extends Builder
$teachers = $this->getTeachers($courses); $teachers = $this->getTeachers($courses);
foreach ($courses as $key => $course) { foreach ($courses as $key => $course) {
$courses[$key]['teacher'] = $teachers[$course['teacher_id']] ?? null; $courses[$key]['teacher'] = $teachers[$course['teacher_id']] ?? new \stdClass();
} }
return $courses; return $courses;
@ -59,7 +60,20 @@ class CourseList extends Builder
{ {
$ids = kg_array_column($courses, 'teacher_id'); $ids = kg_array_column($courses, 'teacher_id');
return $this->getShallowUserByIds($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

@ -18,7 +18,7 @@ class CourseTopicList extends Builder
$courses = $this->getCourses($relations); $courses = $this->getCourses($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['course'] = $courses[$value['course_id']] ?? null; $relations[$key]['course'] = $courses[$value['course_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -29,7 +29,7 @@ class CourseTopicList extends Builder
$topics = $this->getTopics($relations); $topics = $this->getTopics($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['topic'] = $topics[$value['topic_id']] ?? null; $relations[$key]['topic'] = $topics[$value['topic_id']] ?? new \stdClass();
} }
return $relations; return $relations;

View File

@ -8,6 +8,7 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\Course as CourseRepo; use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class CourseUserList extends Builder class CourseUserList extends Builder
{ {
@ -17,7 +18,7 @@ class CourseUserList extends Builder
$courses = $this->getCourses($relations); $courses = $this->getCourses($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['course'] = $courses[$value['course_id']] ?? null; $relations[$key]['course'] = $courses[$value['course_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -28,7 +29,7 @@ class CourseUserList extends Builder
$users = $this->getUsers($relations); $users = $this->getUsers($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? null; $relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -73,7 +74,20 @@ class CourseUserList extends Builder
{ {
$ids = kg_array_column($relations, 'user_id'); $ids = kg_array_column($relations, 'user_id');
return $this->getShallowUserByIds($ids); $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

@ -18,7 +18,7 @@ class HelpList extends Builder
$categories = $this->getCategories(); $categories = $this->getCategories();
foreach ($helps as $key => $help) { foreach ($helps as $key => $help) {
$helps[$key]['category'] = $categories[$help['category_id']] ?? null; $helps[$key]['category'] = $categories[$help['category_id']] ?? new \stdClass();
} }
return $helps; return $helps;

View File

@ -9,6 +9,7 @@ namespace App\Builders;
use App\Repos\Chapter as ChapterRepo; use App\Repos\Chapter as ChapterRepo;
use App\Repos\Course as CourseRepo; use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class LearningList extends Builder class LearningList extends Builder
{ {
@ -18,7 +19,7 @@ class LearningList extends Builder
$courses = $this->getCourses($relations); $courses = $this->getCourses($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['course'] = $courses[$value['course_id']] ?? null; $relations[$key]['course'] = $courses[$value['course_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -29,7 +30,7 @@ class LearningList extends Builder
$chapters = $this->getChapters($relations); $chapters = $this->getChapters($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['chapter'] = $chapters[$value['chapter_id']] ?? null; $relations[$key]['chapter'] = $chapters[$value['chapter_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -40,7 +41,7 @@ class LearningList extends Builder
$users = $this->getUsers($relations); $users = $this->getUsers($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? null; $relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -84,7 +85,17 @@ class LearningList extends Builder
{ {
$ids = kg_array_column($relations, 'user_id'); $ids = kg_array_column($relations, 'user_id');
return $this->getShallowUserByIds($ids); $userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name']);
$result = [];
foreach ($users->toArray() as $user) {
$result[$user['id']] = $user;
}
return $result;
} }
} }

View File

@ -19,7 +19,7 @@ class LiveList extends Builder
$courses = $this->getCourses($lives); $courses = $this->getCourses($lives);
foreach ($lives as $key => $live) { foreach ($lives as $key => $live) {
$lives[$key]['course'] = $courses[$live['course_id']] ?? null; $lives[$key]['course'] = $courses[$live['course_id']] ?? new \stdClass();
} }
return $lives; return $lives;
@ -30,7 +30,7 @@ class LiveList extends Builder
$chapters = $this->getChapters($lives); $chapters = $this->getChapters($lives);
foreach ($lives as $key => $live) { foreach ($lives as $key => $live) {
$lives[$key]['chapter'] = $chapters[$live['chapter_id']] ?? null; $lives[$key]['chapter'] = $chapters[$live['chapter_id']] ?? new \stdClass();
} }
return $lives; return $lives;
@ -63,7 +63,7 @@ class LiveList extends Builder
foreach ($courses->toArray() as $course) { foreach ($courses->toArray() as $course) {
$course['cover'] = $baseUrl . $course['cover']; $course['cover'] = $baseUrl . $course['cover'];
$course['teacher'] = $teachers[$course['teacher_id']] ?? null; $course['teacher'] = $teachers[$course['teacher_id']] ?? new \stdClass();
$result[$course['id']] = [ $result[$course['id']] = [
'id' => $course['id'], 'id' => $course['id'],
'title' => $course['title'], 'title' => $course['title'],

View File

@ -7,6 +7,8 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\User as UserRepo;
class NotificationList extends Builder class NotificationList extends Builder
{ {
@ -15,8 +17,8 @@ class NotificationList extends Builder
$users = $this->getUsers($notifications); $users = $this->getUsers($notifications);
foreach ($notifications as $key => $notification) { foreach ($notifications as $key => $notification) {
$notifications[$key]['sender'] = $users[$notification['sender_id']] ?? null; $notifications[$key]['sender'] = $users[$notification['sender_id']] ?? new \stdClass();
$notifications[$key]['receiver'] = $users[$notification['receiver_id']] ?? null; $notifications[$key]['receiver'] = $users[$notification['receiver_id']] ?? new \stdClass();
} }
return $notifications; return $notifications;
@ -28,7 +30,20 @@ class NotificationList extends Builder
$receiverIds = kg_array_column($notifications, 'receiver_id'); $receiverIds = kg_array_column($notifications, 'receiver_id');
$ids = array_merge($senderIds, $receiverIds); $ids = array_merge($senderIds, $receiverIds);
return $this->getShallowUserByIds($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

@ -9,6 +9,7 @@ namespace App\Builders;
use App\Models\Course as CourseModel; use App\Models\Course as CourseModel;
use App\Models\Order as OrderModel; use App\Models\Order as OrderModel;
use App\Repos\User as UserRepo;
class OrderList extends Builder class OrderList extends Builder
{ {
@ -29,7 +30,7 @@ class OrderList extends Builder
$users = $this->getUsers($orders); $users = $this->getUsers($orders);
foreach ($orders as $key => $order) { foreach ($orders as $key => $order) {
$orders[$key]['owner'] = $users[$order['owner_id']] ?? null; $orders[$key]['owner'] = $users[$order['owner_id']] ?? new \stdClass();
} }
return $orders; return $orders;
@ -174,7 +175,17 @@ class OrderList extends Builder
{ {
$ids = kg_array_column($orders, 'owner_id'); $ids = kg_array_column($orders, 'owner_id');
return $this->getShallowUserByIds($ids); $userRepo = new UserRepo();
$users = $userRepo->findShallowUserByIds($ids);
$result = [];
foreach ($users->toArray() as $user) {
$result[$user['id']] = $user;
}
return $result;
} }
} }

View File

@ -8,6 +8,7 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\Question as QuestionRepo; use App\Repos\Question as QuestionRepo;
use App\Repos\User as UserRepo;
use Phalcon\Text; use Phalcon\Text;
class QuestionFavoriteList extends Builder class QuestionFavoriteList extends Builder
@ -18,7 +19,7 @@ class QuestionFavoriteList extends Builder
$questions = $this->getQuestions($relations); $questions = $this->getQuestions($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['question'] = $questions[$value['question_id']] ?? null; $relations[$key]['question'] = $questions[$value['question_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -29,7 +30,7 @@ class QuestionFavoriteList extends Builder
$users = $this->getUsers($relations); $users = $this->getUsers($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? null; $relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -69,7 +70,20 @@ class QuestionFavoriteList extends Builder
{ {
$ids = kg_array_column($relations, 'user_id'); $ids = kg_array_column($relations, 'user_id');
return $this->getShallowUserByIds($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

@ -9,6 +9,7 @@ namespace App\Builders;
use App\Caches\CategoryAllList as CategoryAllListCache; use App\Caches\CategoryAllList as CategoryAllListCache;
use App\Models\Category as CategoryModel; use App\Models\Category as CategoryModel;
use App\Repos\User as UserRepo;
class QuestionList extends Builder class QuestionList extends Builder
{ {
@ -27,7 +28,7 @@ class QuestionList extends Builder
$categories = $this->getCategories(); $categories = $this->getCategories();
foreach ($questions as $key => $question) { foreach ($questions as $key => $question) {
$questions[$key]['category'] = $categories[$question['category_id']] ?? null; $questions[$key]['category'] = $categories[$question['category_id']] ?? new \stdClass();
} }
return $questions; return $questions;
@ -38,8 +39,8 @@ class QuestionList extends Builder
$users = $this->getUsers($questions); $users = $this->getUsers($questions);
foreach ($questions as $key => $question) { foreach ($questions as $key => $question) {
$questions[$key]['owner'] = $users[$question['owner_id']] ?? null; $questions[$key]['owner'] = $users[$question['owner_id']] ?? new \stdClass();
$questions[$key]['last_replier'] = $users[$question['last_replier_id']] ?? null; $questions[$key]['last_replier'] = $users[$question['last_replier_id']] ?? new \stdClass();
} }
return $questions; return $questions;
@ -71,7 +72,20 @@ class QuestionList extends Builder
$lastReplierIds = kg_array_column($questions, 'last_replier_id'); $lastReplierIds = kg_array_column($questions, 'last_replier_id');
$ids = array_merge($ownerIds, $lastReplierIds); $ids = array_merge($ownerIds, $lastReplierIds);
return $this->getShallowUserByIds($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

@ -9,6 +9,7 @@ namespace App\Builders;
use App\Models\Refund as RefundModel; use App\Models\Refund as RefundModel;
use App\Repos\Order as OrderRepo; use App\Repos\Order as OrderRepo;
use App\Repos\User as UserRepo;
class RefundList extends Builder class RefundList extends Builder
{ {
@ -18,7 +19,7 @@ class RefundList extends Builder
$orders = $this->getOrders($trades); $orders = $this->getOrders($trades);
foreach ($trades as $key => $trade) { foreach ($trades as $key => $trade) {
$trades[$key]['order'] = $orders[$trade['order_id']] ?? null; $trades[$key]['order'] = $orders[$trade['order_id']] ?? new \stdClass();
} }
return $trades; return $trades;
@ -29,7 +30,7 @@ class RefundList extends Builder
$users = $this->getUsers($refunds); $users = $this->getUsers($refunds);
foreach ($refunds as $key => $refund) { foreach ($refunds as $key => $refund) {
$refunds[$key]['owner'] = $users[$refund['owner_id']] ?? null; $refunds[$key]['owner'] = $users[$refund['owner_id']] ?? new \stdClass();
} }
return $refunds; return $refunds;
@ -74,7 +75,20 @@ class RefundList extends Builder
{ {
$ids = kg_array_column($refunds, 'owner_id'); $ids = kg_array_column($refunds, 'owner_id');
return $this->getShallowUserByIds($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

@ -7,6 +7,8 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\User as UserRepo;
class ReportList extends Builder class ReportList extends Builder
{ {
@ -15,7 +17,7 @@ class ReportList extends Builder
$users = $this->getUsers($reports); $users = $this->getUsers($reports);
foreach ($reports as $key => $report) { foreach ($reports as $key => $report) {
$reports[$key]['owner'] = $users[$report['owner_id']] ?? null; $reports[$key]['owner'] = $users[$report['owner_id']] ?? new \stdClass();
} }
return $reports; return $reports;
@ -25,7 +27,20 @@ class ReportList extends Builder
{ {
$ids = kg_array_column($reports, 'owner_id'); $ids = kg_array_column($reports, 'owner_id');
return $this->getShallowUserByIds($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

@ -17,7 +17,7 @@ class ResourceList extends Builder
$uploads = $this->getUploads($relations); $uploads = $this->getUploads($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['upload'] = $uploads[$value['upload_id']] ?? null; $relations[$key]['upload'] = $uploads[$value['upload_id']] ?? new \stdClass();
} }
return $relations; return $relations;

View File

@ -8,6 +8,7 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\Course as CourseRepo; use App\Repos\Course as CourseRepo;
use App\Repos\User as UserRepo;
class ReviewList extends Builder class ReviewList extends Builder
{ {
@ -17,7 +18,7 @@ class ReviewList extends Builder
$courses = $this->getCourses($reviews); $courses = $this->getCourses($reviews);
foreach ($reviews as $key => $review) { foreach ($reviews as $key => $review) {
$reviews[$key]['course'] = $courses[$review['course_id']] ?? null; $reviews[$key]['course'] = $courses[$review['course_id']] ?? new \stdClass();
} }
return $reviews; return $reviews;
@ -28,7 +29,7 @@ class ReviewList extends Builder
$users = $this->getUsers($reviews); $users = $this->getUsers($reviews);
foreach ($reviews as $key => $review) { foreach ($reviews as $key => $review) {
$reviews[$key]['owner'] = $users[$review['owner_id']] ?? null; $reviews[$key]['owner'] = $users[$review['owner_id']] ?? new \stdClass();
} }
return $reviews; return $reviews;
@ -55,7 +56,20 @@ class ReviewList extends Builder
{ {
$ids = kg_array_column($reviews, 'owner_id'); $ids = kg_array_column($reviews, 'owner_id');
return $this->getShallowUserByIds($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

@ -8,6 +8,7 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\Tag as TagRepo; use App\Repos\Tag as TagRepo;
use App\Repos\User as UserRepo;
class TagFollowList extends Builder class TagFollowList extends Builder
{ {
@ -17,7 +18,7 @@ class TagFollowList extends Builder
$tags = $this->getTags($relations); $tags = $this->getTags($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['tag'] = $tags[$value['tag_id']] ?? null; $relations[$key]['tag'] = $tags[$value['tag_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -28,7 +29,7 @@ class TagFollowList extends Builder
$users = $this->getUsers($relations); $users = $this->getUsers($relations);
foreach ($relations as $key => $value) { foreach ($relations as $key => $value) {
$relations[$key]['user'] = $users[$value['user_id']] ?? null; $relations[$key]['user'] = $users[$value['user_id']] ?? new \stdClass();
} }
return $relations; return $relations;
@ -60,7 +61,20 @@ class TagFollowList extends Builder
{ {
$ids = kg_array_column($relations, 'user_id'); $ids = kg_array_column($relations, 'user_id');
return $this->getShallowUserByIds($ids); $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

@ -8,6 +8,7 @@
namespace App\Builders; namespace App\Builders;
use App\Repos\Order as OrderRepo; use App\Repos\Order as OrderRepo;
use App\Repos\User as UserRepo;
class TradeList extends Builder class TradeList extends Builder
{ {
@ -17,7 +18,7 @@ class TradeList extends Builder
$orders = $this->getOrders($trades); $orders = $this->getOrders($trades);
foreach ($trades as $key => $trade) { foreach ($trades as $key => $trade) {
$trades[$key]['order'] = $orders[$trade['order_id']] ?? null; $trades[$key]['order'] = $orders[$trade['order_id']] ?? new \stdClass();
} }
return $trades; return $trades;
@ -28,7 +29,7 @@ class TradeList extends Builder
$users = $this->getUsers($trades); $users = $this->getUsers($trades);
foreach ($trades as $key => $trade) { foreach ($trades as $key => $trade) {
$trades[$key]['owner'] = $users[$trade['owner_id']] ?? null; $trades[$key]['owner'] = $users[$trade['owner_id']] ?? new \stdClass();
} }
return $trades; return $trades;
@ -55,7 +56,20 @@ class TradeList extends Builder
{ {
$ids = kg_array_column($trades, 'owner_id'); $ids = kg_array_column($trades, 'owner_id');
return $this->getShallowUserByIds($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

@ -30,7 +30,7 @@ class UserList extends Builder
$accounts = $this->getAccounts($users); $accounts = $this->getAccounts($users);
foreach ($users as $key => $user) { foreach ($users as $key => $user) {
$users[$key]['account'] = $accounts[$user['id']] ?? null; $users[$key]['account'] = $accounts[$user['id']] ?? new \stdClass();
} }
return $users; return $users;

36
app/Caches/Article.php Normal file
View File

@ -0,0 +1,36 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Repos\Article as ArticleRepo;
class Article extends Cache
{
protected $lifetime = 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "article:{$id}";
}
public function getContent($id = null)
{
$articleRepo = new ArticleRepo();
$article = $articleRepo->findById($id);
return $article ?: null;
}
}

36
app/Caches/Help.php Normal file
View File

@ -0,0 +1,36 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
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;
}
}

97
app/Caches/HelpList.php Normal file
View File

@ -0,0 +1,97 @@
<?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 App\Models\Help as HelpModel;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class HelpList extends Cache
{
protected $lifetime = 7 * 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')
->andWhere('published = 1')
->andWhere('deleted = 0')
->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')
->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\Caches;
use App\Models\Answer as AnswerModel;
class MaxAnswerId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_answer_id';
}
public function getContent($id = null)
{
$answer = AnswerModel::findFirst(['order' => 'id DESC']);
return $answer->id ?? 0;
}
}

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\Article as ArticleModel;
class MaxArticleId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_article_id';
}
public function getContent($id = null)
{
$article = ArticleModel::findFirst(['order' => 'id DESC']);
return $article->id ?? 0;
}
}

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\Comment as CommentModel;
class MaxCommentId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_comment_id';
}
public function getContent($id = null)
{
$comment = CommentModel::findFirst(['order' => 'id DESC']);
return $comment->id ?? 0;
}
}

34
app/Caches/MaxHelpId.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\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;
}
}

34
app/Caches/MaxPageId.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\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

@ -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\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;
}
}

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\Question as QuestionModel;
class MaxQuestionId extends Cache
{
protected $lifetime = 365 * 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return 'max_question_id';
}
public function getContent($id = null)
{
$question = QuestionModel::findFirst(['order' => 'id DESC']);
return $question->id ?? 0;
}
}

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\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;
}
}

36
app/Caches/Page.php Normal file
View File

@ -0,0 +1,36 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
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;
}
}

36
app/Caches/PointGift.php Normal file
View File

@ -0,0 +1,36 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Repos\PointGift as PointGiftRepo;
class PointGift extends Cache
{
protected $lifetime = 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;
}
}

36
app/Caches/Question.php Normal file
View File

@ -0,0 +1,36 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Caches;
use App\Repos\Question as QuestionRepo;
class Question extends Cache
{
protected $lifetime = 86400;
public function getLifetime()
{
return $this->lifetime;
}
public function getKey($id = null)
{
return "question:{$id}";
}
public function getContent($id = null)
{
$questionRepo = new QuestionRepo();
$question = $questionRepo->findById($id);
return $question ?: null;
}
}

View File

@ -18,13 +18,6 @@ abstract class Migration
abstract public function run(); abstract public function run();
protected function saveSettings(array $settings)
{
foreach ($settings as $setting) {
$this->saveSetting($setting);
}
}
protected function saveSetting(array $setting) protected function saveSetting(array $setting)
{ {
$settingRepo = new SettingRepo(); $settingRepo = new SettingRepo();
@ -39,4 +32,4 @@ abstract class Migration
} }
} }
} }

View File

@ -1,41 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2025 深圳市酷瓜软件有限公司
* @license https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* @link https://www.koogua.com
*/
namespace App\Console\Migrations;
use App\Models\UserBalance;
use App\Repos\User as UserRepo;
class V20250110191618 extends Migration
{
public function run()
{
$this->handleRootUserBalance();
}
/**
* 之前migration初始化root账号缺少user_balance数据
*/
protected function handleRootUserBalance()
{
$userId = 10000;
$userRepo = new UserRepo();
$userBalance = $userRepo->findUserBalance($userId);
if ($userBalance) return;
$userBalance = new UserBalance();
$userBalance->user_id = $userId;
$userBalance->create();
}
}

View File

@ -20,6 +20,8 @@ class ArticleIndexTask extends Task
* 搜索测试 * 搜索测试
* *
* @command: php console.php article_index search {query} * @command: php console.php article_index search {query}
* @param array $params
* @throws \XSException
*/ */
public function searchAction($params) public function searchAction($params)
{ {
@ -29,9 +31,7 @@ class ArticleIndexTask extends Task
exit('please special a query word' . PHP_EOL); exit('please special a query word' . PHP_EOL);
} }
$handler = new ArticleSearcher(); $result = $this->searchArticles($query);
$result = $handler->search($query);
var_export($result); var_export($result);
} }
@ -42,6 +42,24 @@ class ArticleIndexTask extends Task
* @command: php console.php article_index clean * @command: php console.php article_index clean
*/ */
public function cleanAction() public function cleanAction()
{
$this->cleanArticleIndex();
}
/**
* 重建索引
*
* @command: php console.php article_index rebuild
*/
public function rebuildAction()
{
$this->rebuildArticleIndex();
}
/**
* 清空索引
*/
protected function cleanArticleIndex()
{ {
$handler = new ArticleSearcher(); $handler = new ArticleSearcher();
@ -56,10 +74,8 @@ class ArticleIndexTask extends Task
/** /**
* 重建索引 * 重建索引
*
* @command: php console.php article_index rebuild
*/ */
public function rebuildAction() protected function rebuildArticleIndex()
{ {
$articles = $this->findArticles(); $articles = $this->findArticles();
@ -67,7 +83,7 @@ class ArticleIndexTask extends Task
$handler = new ArticleSearcher(); $handler = new ArticleSearcher();
$doc = new ArticleDocument(); $documenter = new ArticleDocument();
$index = $handler->getXS()->getIndex(); $index = $handler->getXS()->getIndex();
@ -76,7 +92,7 @@ class ArticleIndexTask extends Task
$index->beginRebuild(); $index->beginRebuild();
foreach ($articles as $article) { foreach ($articles as $article) {
$document = $doc->setDocument($article); $document = $documenter->setDocument($article);
$index->add($document); $index->add($document);
} }
@ -86,39 +102,17 @@ class ArticleIndexTask extends Task
} }
/** /**
* 刷新索引缓存 * 搜索文章
* *
* @command: php console.php article_index flush_index * @param string $query
* @return array
* @throws \XSException
*/ */
public function flushIndexAction() protected function searchArticles($query)
{ {
$handler = new ArticleSearcher(); $handler = new ArticleSearcher();
$index = $handler->getXS()->getIndex(); return $handler->search($query);
echo '------ start flush article index ------' . PHP_EOL;
$index->flushIndex();
echo '------ end flush article index ------' . PHP_EOL;
}
/**
* 刷新搜索日志
*
* @command: php console.php article_index flush_logging
*/
public function flushLoggingAction()
{
$handler = new ArticleSearcher();
$index = $handler->getXS()->getIndex();
echo '------ start flush article logging ------' . PHP_EOL;
$index->flushLogging();
echo '------ end flush article logging ------' . PHP_EOL;
} }
/** /**

View File

@ -1,72 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2024 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Console\Tasks;
use App\Caches\CourseChapterList as CourseChapterListCache;
use App\Models\Chapter as ChapterModel;
use App\Models\ChapterLive as ChapterLiveModel;
use App\Repos\Chapter as ChapterRepo;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class CloseLiveTask extends Task
{
public function mainAction()
{
$chapterLives = $this->findChapterLives();
echo sprintf('pending lives: %s', $chapterLives->count()) . PHP_EOL;
if ($chapterLives->count() == 0) return;
echo '------ start close live task ------' . PHP_EOL;
foreach ($chapterLives as $chapterLive) {
$chapterLive->status = ChapterLiveModel::STATUS_INACTIVE;
$chapterLive->update();
$chapterRepo = new ChapterRepo();
$chapter = $chapterRepo->findById($chapterLive->chapter_id);
$attrs = $chapter->attrs;
$attrs['stream']['status'] = ChapterModel::SS_INACTIVE;
$chapter->attrs = $attrs;
$chapter->update();
$cache = new CourseChapterListCache();
$cache->rebuild($chapterLive->course_id);
}
echo '------ end close live task ------' . PHP_EOL;
}
/**
* 查找待关闭直播
*
* @param int $limit
* @return ResultsetInterface|Resultset|ChapterLiveModel[]
*/
protected function findChapterLives(int $limit = 100)
{
$status = ChapterLiveModel::STATUS_ACTIVE;
$endTime = time() - 3600;
return ChapterLiveModel::query()
->where('status = :status:', ['status' => $status])
->andWhere('end_time < :end_time:', ['end_time' => $endTime])
->limit($limit)
->execute();
}
}

View File

@ -20,6 +20,8 @@ class CourseIndexTask extends Task
* 搜索测试 * 搜索测试
* *
* @command: php console.php course_index search {query} * @command: php console.php course_index search {query}
* @param array $params
* @throws \XSException
*/ */
public function searchAction($params) public function searchAction($params)
{ {
@ -29,9 +31,7 @@ class CourseIndexTask extends Task
exit('please special a query word' . PHP_EOL); exit('please special a query word' . PHP_EOL);
} }
$handler = new CourseSearcher(); $result = $this->searchCourses($query);
$result = $handler->search($query);
var_export($result); var_export($result);
} }
@ -42,6 +42,24 @@ class CourseIndexTask extends Task
* @command: php console.php course_index clean * @command: php console.php course_index clean
*/ */
public function cleanAction() public function cleanAction()
{
$this->cleanCourseIndex();
}
/**
* 重建索引
*
* @command: php console.php course_index rebuild
*/
public function rebuildAction()
{
$this->rebuildCourseIndex();
}
/**
* 清空索引
*/
protected function cleanCourseIndex()
{ {
$handler = new CourseSearcher(); $handler = new CourseSearcher();
@ -56,10 +74,8 @@ class CourseIndexTask extends Task
/** /**
* 重建索引 * 重建索引
*
* @command: php console.php course_index rebuild
*/ */
public function rebuildAction() protected function rebuildCourseIndex()
{ {
$courses = $this->findCourses(); $courses = $this->findCourses();
@ -67,7 +83,7 @@ class CourseIndexTask extends Task
$handler = new CourseSearcher(); $handler = new CourseSearcher();
$doc = new CourseDocument(); $documenter = new CourseDocument();
$index = $handler->getXS()->getIndex(); $index = $handler->getXS()->getIndex();
@ -76,7 +92,7 @@ class CourseIndexTask extends Task
$index->beginRebuild(); $index->beginRebuild();
foreach ($courses as $course) { foreach ($courses as $course) {
$document = $doc->setDocument($course); $document = $documenter->setDocument($course);
$index->add($document); $index->add($document);
} }
@ -86,39 +102,17 @@ class CourseIndexTask extends Task
} }
/** /**
* 刷新索引缓存 * 搜索课程
* *
* @command: php console.php course_index flush_index * @param string $query
* @return array
* @throws \XSException
*/ */
public function flushIndexAction() protected function searchCourses($query)
{ {
$handler = new CourseSearcher(); $handler = new CourseSearcher();
$index = $handler->getXS()->getIndex(); return $handler->search($query);
echo '------ start flush course index ------' . PHP_EOL;
$index->flushIndex();
echo '------ end flush course index ------' . PHP_EOL;
}
/**
* 刷新搜索日志
*
* @command: php console.php course_index flush_logging
*/
public function flushLoggingAction()
{
$handler = new CourseSearcher();
$index = $handler->getXS()->getIndex();
echo '------ start flush course logging ------' . PHP_EOL;
$index->flushLogging();
echo '------ end flush course logging ------' . PHP_EOL;
} }
/** /**
@ -130,7 +124,7 @@ class CourseIndexTask extends Task
{ {
return CourseModel::query() return CourseModel::query()
->where('published = 1') ->where('published = 1')
->andWhere('deleted = 0') ->where('deleted = 0')
->execute(); ->execute();
} }

View File

@ -58,6 +58,8 @@ class DeliverTask extends Task
case OrderModel::ITEM_VIP: case OrderModel::ITEM_VIP:
$this->handleVipOrder($order); $this->handleVipOrder($order);
break; break;
default:
$this->noMatchedHandler($order);
} }
$order->status = OrderModel::STATUS_FINISHED; $order->status = OrderModel::STATUS_FINISHED;
@ -153,6 +155,11 @@ class DeliverTask extends Task
$this->closePendingOrders($user->id); $this->closePendingOrders($user->id);
} }
protected function noMatchedHandler(OrderModel $order)
{
throw new \RuntimeException("No Matched Handler For Order: {$order->id}");
}
protected function closePendingOrders($userId) protected function closePendingOrders($userId)
{ {
$orders = $this->findUserPendingOrders($userId); $orders = $this->findUserPendingOrders($userId);

View File

@ -20,6 +20,8 @@ class QuestionIndexTask extends Task
* 搜索测试 * 搜索测试
* *
* @command: php console.php question_index search {query} * @command: php console.php question_index search {query}
* @param array $params
* @throws \XSException
*/ */
public function searchAction($params) public function searchAction($params)
{ {
@ -29,9 +31,7 @@ class QuestionIndexTask extends Task
exit('please special a query word' . PHP_EOL); exit('please special a query word' . PHP_EOL);
} }
$handler = new QuestionSearcher(); $result = $this->searchQuestions($query);
$result = $handler->search($query);
var_export($result); var_export($result);
} }
@ -42,6 +42,24 @@ class QuestionIndexTask extends Task
* @command: php console.php question_index clean * @command: php console.php question_index clean
*/ */
public function cleanAction() public function cleanAction()
{
$this->cleanQuestionIndex();
}
/**
* 重建索引
*
* @command: php console.php question_index rebuild
*/
public function rebuildAction()
{
$this->rebuildQuestionIndex();
}
/**
* 清空索引
*/
protected function cleanQuestionIndex()
{ {
$handler = new QuestionSearcher(); $handler = new QuestionSearcher();
@ -56,10 +74,8 @@ class QuestionIndexTask extends Task
/** /**
* 重建索引 * 重建索引
*
* @command: php console.php question_index rebuild
*/ */
public function rebuildAction() protected function rebuildQuestionIndex()
{ {
$questions = $this->findQuestions(); $questions = $this->findQuestions();
@ -67,7 +83,7 @@ class QuestionIndexTask extends Task
$handler = new QuestionSearcher(); $handler = new QuestionSearcher();
$doc = new QuestionDocument(); $documenter = new QuestionDocument();
$index = $handler->getXS()->getIndex(); $index = $handler->getXS()->getIndex();
@ -76,7 +92,7 @@ class QuestionIndexTask extends Task
$index->beginRebuild(); $index->beginRebuild();
foreach ($questions as $question) { foreach ($questions as $question) {
$document = $doc->setDocument($question); $document = $documenter->setDocument($question);
$index->add($document); $index->add($document);
} }
@ -86,39 +102,17 @@ class QuestionIndexTask extends Task
} }
/** /**
* 刷新索引缓存 * 搜索文章
* *
* @command: php console.php question_index flush_index * @param string $query
* @return array
* @throws \XSException
*/ */
public function flushIndexAction() protected function searchQuestions($query)
{ {
$handler = new QuestionSearcher(); $handler = new QuestionSearcher();
$index = $handler->getXS()->getIndex(); return $handler->search($query);
echo '------ start flush question index ------' . PHP_EOL;
$index->flushIndex();
echo '------ end flush question index ------' . PHP_EOL;
}
/**
* 刷新搜索日志
*
* @command: php console.php question_index flush_logging
*/
public function flushLoggingAction()
{
$handler = new QuestionSearcher();
$index = $handler->getXS()->getIndex();
echo '------ start flush question logging ------' . PHP_EOL;
$index->flushLogging();
echo '------ end flush question logging ------' . PHP_EOL;
} }
/** /**

View File

@ -177,13 +177,13 @@ class ServerMonitorTask extends Task
$searcher = new CourseSearcher(); $searcher = new CourseSearcher();
$course = $searcher->search('id:1'); $user = $searcher->search('id:1');
$benchmark->stop(); $benchmark->stop();
$elapsedTime = $benchmark->getElapsedTime(); $elapsedTime = $benchmark->getElapsedTime();
if (empty($course)) { if (empty($user)) {
return "xunsearch搜索失败"; return "xunsearch搜索失败";
} }
@ -242,4 +242,4 @@ class ServerMonitorTask extends Task
return $coreCount * $processorCount; return $coreCount * $processorCount;
} }
} }

View File

@ -37,7 +37,7 @@ class SitemapTask extends Task
$this->sitemap = new Sitemap(); $this->sitemap = new Sitemap();
$filename = public_path('sitemap.xml'); $filename = tmp_path('sitemap.xml');
echo '------ start sitemap task ------' . PHP_EOL; echo '------ start sitemap task ------' . PHP_EOL;

View File

@ -13,12 +13,12 @@ use GuzzleHttp\Client;
class SyncAppInfoTask extends Task class SyncAppInfoTask extends Task
{ {
const API_BASE_URL = 'https://www.koogua.com/api';
public function mainAction() public function mainAction()
{ {
echo '------ start sync app info ------' . PHP_EOL; echo '------ start sync app info ------' . PHP_EOL;
$url = 'https://www.koogua.com/api/instance/collect';
$site = $this->getSettings('site'); $site = $this->getSettings('site');
$serverHost = parse_url($site['url'], PHP_URL_HOST); $serverHost = parse_url($site['url'], PHP_URL_HOST);
@ -38,8 +38,6 @@ class SyncAppInfoTask extends Task
$client = new Client(); $client = new Client();
$url = sprintf('%s/instance/collect', self::API_BASE_URL);
$client->request('POST', $url, ['form_params' => $params]); $client->request('POST', $url, ['form_params' => $params]);
echo '------ end sync app info ------' . PHP_EOL; echo '------ end sync app info ------' . PHP_EOL;

View File

@ -71,6 +71,28 @@ class UploadController extends Controller
return $this->jsonSuccess(['data' => $data]); return $this->jsonSuccess(['data' => $data]);
} }
/**
* @Post("/avatar/img", name="admin.upload.avatar_img")
*/
public function uploadAvatarImageAction()
{
$service = new StorageService();
$file = $service->uploadAvatarImage();
if (!$file) {
return $this->jsonError(['msg' => '上传文件失败']);
}
$data = [
'id' => $file->id,
'name' => $file->name,
'url' => $service->getImageUrl($file->path),
];
return $this->jsonSuccess(['data' => $data]);
}
/** /**
* @Post("/content/img", name="admin.upload.content_img") * @Post("/content/img", name="admin.upload.content_img")
*/ */

View File

@ -9,8 +9,10 @@ namespace App\Http\Admin\Services;
use App\Builders\ArticleList as ArticleListBuilder; use App\Builders\ArticleList as ArticleListBuilder;
use App\Builders\ReportList as ReportListBuilder; use App\Builders\ReportList as ReportListBuilder;
use App\Caches\Article as ArticleCache;
use App\Http\Admin\Services\Traits\AccountSearchTrait; use App\Http\Admin\Services\Traits\AccountSearchTrait;
use App\Library\Paginator\Query as PagerQuery; use App\Library\Paginator\Query as PagerQuery;
use App\Library\Utils\Word as WordUtil;
use App\Models\Article as ArticleModel; use App\Models\Article as ArticleModel;
use App\Models\Category as CategoryModel; use App\Models\Category as CategoryModel;
use App\Models\Reason as ReasonModel; use App\Models\Reason as ReasonModel;
@ -72,6 +74,10 @@ class Article extends Service
$params = $this->handleAccountSearchParams($params); $params = $this->handleAccountSearchParams($params);
if (!empty($params['xm_tag_ids'])) {
$params['tag_id'] = explode(',', $params['xm_tag_ids']);
}
$params['deleted'] = $params['deleted'] ?? 0; $params['deleted'] = $params['deleted'] ?? 0;
$sort = $pagerQuery->getSort(); $sort = $pagerQuery->getSort();
@ -135,6 +141,7 @@ class Article extends Service
$article->create(); $article->create();
$this->saveDynamicAttrs($article); $this->saveDynamicAttrs($article);
$this->rebuildArticleCache($article);
$this->rebuildArticleIndex($article); $this->rebuildArticleIndex($article);
$this->recountUserArticles($user); $this->recountUserArticles($user);
@ -192,8 +199,9 @@ class Article extends Service
$data['published'] = $validator->checkPublishStatus($post['published']); $data['published'] = $validator->checkPublishStatus($post['published']);
} }
if (isset($post['category_id'])) { if (isset($post['category_id']) && !empty($post['category_id'])) {
$data['category_id'] = $validator->checkCategoryId($post['category_id']); $category = $validator->checkCategory($post['category_id']);
$data['category_id'] = $category->id;
} }
if (isset($post['xm_tag_ids'])) { if (isset($post['xm_tag_ids'])) {
@ -205,6 +213,7 @@ class Article extends Service
$owner = $this->findUser($article->owner_id); $owner = $this->findUser($article->owner_id);
$this->saveDynamicAttrs($article); $this->saveDynamicAttrs($article);
$this->rebuildArticleCache($article);
$this->rebuildArticleIndex($article); $this->rebuildArticleIndex($article);
$this->recountUserArticles($owner); $this->recountUserArticles($owner);
@ -224,6 +233,7 @@ class Article extends Service
$owner = $this->findUser($article->owner_id); $owner = $this->findUser($article->owner_id);
$this->saveDynamicAttrs($article); $this->saveDynamicAttrs($article);
$this->rebuildArticleCache($article);
$this->rebuildArticleIndex($article); $this->rebuildArticleIndex($article);
$this->recountUserArticles($owner); $this->recountUserArticles($owner);
@ -243,6 +253,7 @@ class Article extends Service
$owner = $this->findUser($article->owner_id); $owner = $this->findUser($article->owner_id);
$this->saveDynamicAttrs($article); $this->saveDynamicAttrs($article);
$this->rebuildArticleCache($article);
$this->rebuildArticleIndex($article); $this->rebuildArticleIndex($article);
$this->recountUserArticles($owner); $this->recountUserArticles($owner);
@ -281,6 +292,7 @@ class Article extends Service
$owner = $this->findUser($article->owner_id); $owner = $this->findUser($article->owner_id);
$this->rebuildArticleCache($article);
$this->rebuildArticleIndex($article); $this->rebuildArticleIndex($article);
$this->recountUserArticles($owner); $this->recountUserArticles($owner);
@ -316,6 +328,7 @@ class Article extends Service
$owner = $this->findUser($article->owner_id); $owner = $this->findUser($article->owner_id);
$this->rebuildArticleCache($article);
$this->rebuildArticleIndex($article); $this->rebuildArticleIndex($article);
$this->recountUserArticles($owner); $this->recountUserArticles($owner);
} }
@ -354,6 +367,7 @@ class Article extends Service
$owner = $this->findUser($article->owner_id); $owner = $this->findUser($article->owner_id);
$this->recountUserArticles($owner); $this->recountUserArticles($owner);
$this->rebuildArticleCache($article);
$this->rebuildArticleIndex($article); $this->rebuildArticleIndex($article);
} }
} }
@ -380,6 +394,7 @@ class Article extends Service
$owner = $this->findUser($article->owner_id); $owner = $this->findUser($article->owner_id);
$this->recountUserArticles($owner); $this->recountUserArticles($owner);
$this->rebuildArticleCache($article);
$this->rebuildArticleIndex($article); $this->rebuildArticleIndex($article);
} }
} }
@ -398,6 +413,13 @@ class Article extends Service
return $userRepo->findById($id); return $userRepo->findById($id);
} }
protected function rebuildArticleCache(ArticleModel $article)
{
$cache = new ArticleCache();
$cache->rebuild($article->id);
}
protected function rebuildArticleIndex(ArticleModel $article) protected function rebuildArticleIndex(ArticleModel $article)
{ {
$sync = new ArticleIndexSync(); $sync = new ArticleIndexSync();

View File

@ -251,16 +251,14 @@ class ChapterContent extends Service
$content = $validator->checkContent($post['content']); $content = $validator->checkContent($post['content']);
$read->content = $content; $read->update(['content' => $content]);
$read->update();
$attrs = $chapter->attrs; $attrs = $chapter->attrs;
$attrs['word_count'] = WordUtil::getWordCount($content); $attrs['word_count'] = WordUtil::getWordCount($content);
$attrs['duration'] = WordUtil::getWordDuration($content); $attrs['duration'] = WordUtil::getWordDuration($content);
$chapter->attrs = $attrs;
$chapter->update(); $chapter->update(['attrs' => $attrs]);
$this->updateCourseReadAttrs($read->course_id); $this->updateCourseReadAttrs($read->course_id);
} }

View File

@ -37,6 +37,10 @@ class Course extends Service
$params = $pagerQuery->getParams(); $params = $pagerQuery->getParams();
if (!empty($params['xm_tag_ids'])) {
$params['tag_id'] = explode(',', $params['xm_tag_ids']);
}
$params['deleted'] = $params['deleted'] ?? 0; $params['deleted'] = $params['deleted'] ?? 0;
$sort = $pagerQuery->getSort(); $sort = $pagerQuery->getSort();
@ -164,12 +168,14 @@ class Course extends Service
} }
} }
if (isset($post['category_id'])) { if (isset($post['category_id']) && !empty($post['category_id'])) {
$data['category_id'] = $validator->checkCategoryId($post['category_id']); $category = $validator->checkCategory($post['category_id']);
$data['category_id'] = $category->id;
} }
if (isset($post['teacher_id'])) { if (isset($post['teacher_id']) && !empty($post['teacher_id'])) {
$data['teacher_id'] = $validator->checkTeacherId($post['teacher_id']); $teacher = $validator->checkTeacher($post['teacher_id']);
$data['teacher_id'] = $teacher->id;
} }
if (isset($post['xm_tag_ids'])) { if (isset($post['xm_tag_ids'])) {

View File

@ -8,6 +8,8 @@
namespace App\Http\Admin\Services; namespace App\Http\Admin\Services;
use App\Builders\HelpList as HelpListBuilder; use App\Builders\HelpList as HelpListBuilder;
use App\Caches\Help as HelpCache;
use App\Caches\HelpList as HelpListCache;
use App\Models\Category as CategoryModel; use App\Models\Category as CategoryModel;
use App\Models\Help as HelpModel; use App\Models\Help as HelpModel;
use App\Repos\Category as CategoryRepo; use App\Repos\Category as CategoryRepo;
@ -63,15 +65,20 @@ class Help extends Service
$data = []; $data = [];
$category = $validator->checkCategory($post['category_id']);
$data['title'] = $validator->checkTitle($post['title']); $data['title'] = $validator->checkTitle($post['title']);
$data['content'] = $validator->checkContent($post['content']); $data['content'] = $validator->checkContent($post['content']);
$data['priority'] = $validator->checkPriority($post['priority']); $data['priority'] = $validator->checkPriority($post['priority']);
$data['category_id'] = $validator->checkCategoryId($post['category_id']); $data['category_id'] = $category->id;
$help = new HelpModel(); $help = new HelpModel();
$help->create($data); $help->create($data);
$this->rebuildHelpCache($help);
$this->rebuildHelpListCache();
return $help; return $help;
} }
@ -86,7 +93,8 @@ class Help extends Service
$data = []; $data = [];
if (isset($post['category_id'])) { if (isset($post['category_id'])) {
$data['category_id'] = $validator->checkCategoryId($post['category_id']); $category = $validator->checkCategory($post['category_id']);
$data['category_id'] = $category->id;
} }
if (isset($post['title'])) { if (isset($post['title'])) {
@ -111,6 +119,9 @@ class Help extends Service
$help->update($data); $help->update($data);
$this->rebuildHelpCache($help);
$this->rebuildHelpListCache();
return $help; return $help;
} }
@ -122,6 +133,9 @@ class Help extends Service
$help->update(); $help->update();
$this->rebuildHelpCache($help);
$this->rebuildHelpListCache();
return $help; return $help;
} }
@ -133,6 +147,9 @@ class Help extends Service
$help->update(); $help->update();
$this->rebuildHelpCache($help);
$this->rebuildHelpListCache();
return $help; return $help;
} }
@ -143,6 +160,20 @@ class Help extends Service
return $validator->checkHelp($id); return $validator->checkHelp($id);
} }
protected function rebuildHelpCache(HelpModel $help)
{
$cache = new HelpCache();
$cache->rebuild($help->id);
}
protected function rebuildHelpListCache()
{
$cache = new HelpListCache();
$cache->rebuild();
}
/** /**
* @param Resultset $helps * @param Resultset $helps
* @return array|object * @return array|object

View File

@ -85,7 +85,6 @@ class Nav extends Service
if ($parent) { if ($parent) {
$nav->path = $parent->path . $nav->id . ','; $nav->path = $parent->path . $nav->id . ',';
$nav->level = $parent->level + 1; $nav->level = $parent->level + 1;
$nav->position = $parent->position;
} else { } else {
$nav->path = ',' . $nav->id . ','; $nav->path = ',' . $nav->id . ',';
$nav->level = 1; $nav->level = 1;
@ -141,11 +140,6 @@ class Nav extends Service
} }
} }
if ($nav->parent_id > 0) {
$parent = $this->findOrFail($nav->parent_id);
$data['position'] = $parent->position;
}
$nav->update($data); $nav->update($data);
$this->updateNavStats($nav); $this->updateNavStats($nav);

View File

@ -59,8 +59,9 @@ class Package extends Service
$result = []; $result = [];
foreach ($items as $item) { foreach ($items as $item) {
$price = $item->market_price > 0 ? sprintf("¥%0.2f", $item->market_price) : '免费';
$result[] = [ $result[] = [
'name' => sprintf('%s - %s¥%0.2f', $item->id, $item->title, $item->market_price), 'name' => sprintf('%s - %s¥%0.2f', $item->id, $item->title, $price),
'value' => $item->id, 'value' => $item->id,
'selected' => in_array($item->id, $courseIds), 'selected' => in_array($item->id, $courseIds),
]; ];
@ -151,7 +152,7 @@ class Package extends Service
$package->update($data); $package->update($data);
$this->handlePackagedCourses($package->id); $this->handlePackagedCourses($package->id);
$this->recountPackageCourses($package->id); $this->updatePackageCourseCount($package->id);
$this->rebuildPackageCache($package->id); $this->rebuildPackageCache($package->id);
return $package; return $package;
@ -216,7 +217,7 @@ class Package extends Service
'course_id' => $courseId, 'course_id' => $courseId,
'package_id' => $package->id, 'package_id' => $package->id,
]); ]);
$this->recountCoursePackages($courseId); $this->updateCoursePackageCount($courseId);
$this->rebuildCoursePackageCache($courseId); $this->rebuildCoursePackageCache($courseId);
} }
} }
@ -228,7 +229,7 @@ class Package extends Service
foreach ($deletedCourseIds as $courseId) { foreach ($deletedCourseIds as $courseId) {
$coursePackage = $coursePackageRepo->findCoursePackage($courseId, $package->id); $coursePackage = $coursePackageRepo->findCoursePackage($courseId, $package->id);
$coursePackage->delete(); $coursePackage->delete();
$this->recountCoursePackages($courseId); $this->updateCoursePackageCount($courseId);
$this->rebuildCoursePackageCache($courseId); $this->rebuildCoursePackageCache($courseId);
} }
} }
@ -248,7 +249,7 @@ class Package extends Service
} }
} }
protected function recountPackageCourses($packageId) protected function updatePackageCourseCount($packageId)
{ {
$packageRepo = new PackageRepo(); $packageRepo = new PackageRepo();
@ -261,7 +262,7 @@ class Package extends Service
$package->update(); $package->update();
} }
protected function recountCoursePackages($courseId) protected function updateCoursePackageCount($courseId)
{ {
$courseRepo = new CourseRepo(); $courseRepo = new CourseRepo();
@ -292,4 +293,15 @@ class Package extends Service
$cache->rebuild($courseId); $cache->rebuild($courseId);
} }
protected function recountCoursePackages($courseId)
{
$courseRepo = new CourseRepo();
$course = $courseRepo->findById($courseId);
$course->package_count = $courseRepo->countPackages($courseId);
$course->update();
}
} }

View File

@ -7,6 +7,7 @@
namespace App\Http\Admin\Services; namespace App\Http\Admin\Services;
use App\Caches\Page as PageCache;
use App\Library\Paginator\Query as PagerQuery; use App\Library\Paginator\Query as PagerQuery;
use App\Models\Page as PageModel; use App\Models\Page as PageModel;
use App\Repos\Page as PageRepo; use App\Repos\Page as PageRepo;
@ -52,6 +53,8 @@ class Page extends Service
$page->create($data); $page->create($data);
$this->rebuildPageCache($page);
return $page; return $page;
} }
@ -93,6 +96,8 @@ class Page extends Service
$page->update($data); $page->update($data);
$this->rebuildPageCache($page);
return $page; return $page;
} }
@ -104,6 +109,8 @@ class Page extends Service
$page->update(); $page->update();
$this->rebuildPageCache($page);
return $page; return $page;
} }
@ -115,6 +122,8 @@ class Page extends Service
$page->update(); $page->update();
$this->rebuildPageCache($page);
return $page; return $page;
} }
@ -125,4 +134,11 @@ class Page extends Service
return $validator->checkPage($id); return $validator->checkPage($id);
} }
protected function rebuildPageCache(PageModel $page)
{
$cache = new PageCache();
$cache->rebuild($page->id);
}
} }

View File

@ -7,6 +7,7 @@
namespace App\Http\Admin\Services; namespace App\Http\Admin\Services;
use App\Caches\PointGift as PointGiftCache;
use App\Library\Paginator\Query as PagerQuery; use App\Library\Paginator\Query as PagerQuery;
use App\Models\PointGift as PointGiftModel; use App\Models\PointGift as PointGiftModel;
use App\Repos\Course as CourseRepo; use App\Repos\Course as CourseRepo;
@ -115,6 +116,8 @@ class PointGift extends Service
break; break;
} }
$this->rebuildPointGiftCache($gift);
return $gift; return $gift;
} }
@ -162,6 +165,8 @@ class PointGift extends Service
$gift->update($data); $gift->update($data);
$this->rebuildPointGiftCache($gift);
return $gift; return $gift;
} }
@ -173,6 +178,8 @@ class PointGift extends Service
$gift->update(); $gift->update();
$this->rebuildPointGiftCache($gift);
return $gift; return $gift;
} }
@ -184,6 +191,8 @@ class PointGift extends Service
$gift->update(); $gift->update();
$this->rebuildPointGiftCache($gift);
return $gift; return $gift;
} }
@ -194,6 +203,13 @@ class PointGift extends Service
return $validator->checkPointGift($id); return $validator->checkPointGift($id);
} }
protected function rebuildPointGiftCache(PointGiftModel $gift)
{
$cache = new PointGiftCache();
$cache->rebuild($gift->id);
}
protected function createCoursePointGift($post) protected function createCoursePointGift($post)
{ {
$validator = new PointGiftValidator(); $validator = new PointGiftValidator();

View File

@ -9,6 +9,7 @@ namespace App\Http\Admin\Services;
use App\Builders\QuestionList as QuestionListBuilder; use App\Builders\QuestionList as QuestionListBuilder;
use App\Builders\ReportList as ReportListBuilder; use App\Builders\ReportList as ReportListBuilder;
use App\Caches\Question as QuestionCache;
use App\Http\Admin\Services\Traits\AccountSearchTrait; use App\Http\Admin\Services\Traits\AccountSearchTrait;
use App\Library\Paginator\Query as PagerQuery; use App\Library\Paginator\Query as PagerQuery;
use App\Models\Category as CategoryModel; use App\Models\Category as CategoryModel;
@ -67,6 +68,10 @@ class Question extends Service
$params = $this->handleAccountSearchParams($params); $params = $this->handleAccountSearchParams($params);
if (!empty($params['xm_tag_ids'])) {
$params['tag_id'] = explode(',', $params['xm_tag_ids']);
}
$params['deleted'] = $params['deleted'] ?? 0; $params['deleted'] = $params['deleted'] ?? 0;
$sort = $pagerQuery->getSort(); $sort = $pagerQuery->getSort();
@ -130,6 +135,7 @@ class Question extends Service
$question->create(); $question->create();
$this->saveDynamicAttrs($question); $this->saveDynamicAttrs($question);
$this->rebuildQuestionCache($question);
$this->rebuildQuestionIndex($question); $this->rebuildQuestionIndex($question);
$this->recountUserQuestions($user); $this->recountUserQuestions($user);
@ -180,8 +186,9 @@ class Question extends Service
$data['published'] = $validator->checkPublishStatus($post['published']); $data['published'] = $validator->checkPublishStatus($post['published']);
} }
if (isset($post['category_id'])) { if (isset($post['category_id']) && !empty($post['category_id'])) {
$data['category_id'] = $validator->checkCategoryId($post['category_id']); $category = $validator->checkCategory($post['category_id']);
$data['category_id'] = $category->id;
} }
if (isset($post['xm_tag_ids'])) { if (isset($post['xm_tag_ids'])) {
@ -193,6 +200,7 @@ class Question extends Service
$owner = $this->findUser($question->owner_id); $owner = $this->findUser($question->owner_id);
$this->saveDynamicAttrs($question); $this->saveDynamicAttrs($question);
$this->rebuildQuestionCache($question);
$this->rebuildQuestionIndex($question); $this->rebuildQuestionIndex($question);
$this->recountUserQuestions($owner); $this->recountUserQuestions($owner);
@ -216,6 +224,7 @@ class Question extends Service
$owner = $this->findUser($question->owner_id); $owner = $this->findUser($question->owner_id);
$this->saveDynamicAttrs($question); $this->saveDynamicAttrs($question);
$this->rebuildQuestionCache($question);
$this->rebuildQuestionIndex($question); $this->rebuildQuestionIndex($question);
$this->recountUserQuestions($owner); $this->recountUserQuestions($owner);
@ -234,6 +243,7 @@ class Question extends Service
$owner = $this->findUser($question->owner_id); $owner = $this->findUser($question->owner_id);
$this->rebuildQuestionCache($question);
$this->rebuildQuestionIndex($question); $this->rebuildQuestionIndex($question);
$this->recountUserQuestions($owner); $this->recountUserQuestions($owner);
@ -273,6 +283,7 @@ class Question extends Service
$owner = $this->findUser($question->owner_id); $owner = $this->findUser($question->owner_id);
$this->recountUserQuestions($owner); $this->recountUserQuestions($owner);
$this->rebuildQuestionCache($question);
$this->rebuildQuestionIndex($question); $this->rebuildQuestionIndex($question);
return $question; return $question;
@ -307,6 +318,7 @@ class Question extends Service
$owner = $this->findUser($question->owner_id); $owner = $this->findUser($question->owner_id);
$this->rebuildQuestionCache($question);
$this->rebuildQuestionIndex($question); $this->rebuildQuestionIndex($question);
$this->recountUserQuestions($owner); $this->recountUserQuestions($owner);
} }
@ -345,6 +357,7 @@ class Question extends Service
$owner = $this->findUser($question->owner_id); $owner = $this->findUser($question->owner_id);
$this->recountUserQuestions($owner); $this->recountUserQuestions($owner);
$this->rebuildQuestionCache($question);
$this->rebuildQuestionIndex($question); $this->rebuildQuestionIndex($question);
} }
} }
@ -371,6 +384,7 @@ class Question extends Service
$owner = $this->findUser($question->owner_id); $owner = $this->findUser($question->owner_id);
$this->recountUserQuestions($owner); $this->recountUserQuestions($owner);
$this->rebuildQuestionCache($question);
$this->rebuildQuestionIndex($question); $this->rebuildQuestionIndex($question);
} }
} }
@ -389,6 +403,13 @@ class Question extends Service
return $userRepo->findById($id); return $userRepo->findById($id);
} }
protected function rebuildQuestionCache(QuestionModel $question)
{
$cache = new QuestionCache();
$cache->rebuild($question->id);
}
protected function rebuildQuestionIndex(QuestionModel $question) protected function rebuildQuestionIndex(QuestionModel $question)
{ {
$sync = new QuestionIndexSync(); $sync = new QuestionIndexSync();

View File

@ -52,8 +52,8 @@ class Setting extends Service
{ {
$alipay = $this->getSettings('pay.alipay'); $alipay = $this->getSettings('pay.alipay');
$alipay['return_url'] = $alipay['return_url'] ?: kg_full_url(['for' => 'home.alipay.callback']); $alipay['return_url'] = $alipay['return_url'] ?: kg_full_url(['for' => 'home.alipay_callback']);
$alipay['notify_url'] = $alipay['notify_url'] ?: kg_full_url(['for' => 'home.alipay.notify']); $alipay['notify_url'] = $alipay['notify_url'] ?: kg_full_url(['for' => 'home.alipay_notify']);
return $alipay; return $alipay;
} }
@ -62,8 +62,8 @@ class Setting extends Service
{ {
$wxpay = $this->getSettings('pay.wxpay'); $wxpay = $this->getSettings('pay.wxpay');
$wxpay['return_url'] = $wxpay['return_url'] ?: kg_full_url(['for' => 'home.wxpay.callback']); $wxpay['return_url'] = $wxpay['return_url'] ?: kg_full_url(['for' => 'home.wxpay_callback']);
$wxpay['notify_url'] = $wxpay['notify_url'] ?: kg_full_url(['for' => 'home.wxpay.notify']); $wxpay['notify_url'] = $wxpay['notify_url'] ?: kg_full_url(['for' => 'home.wxpay_notify']);
return $wxpay; return $wxpay;
} }
@ -109,11 +109,11 @@ class Setting extends Service
$result = $this->getSettings($section); $result = $this->getSettings($section);
if ($section == 'live.notify') { if ($section == 'live.notify') {
$result['stream_begin_url'] = $result['stream_begin_url'] ?: kg_full_url(['for' => 'home.live.notify'], ['action' => 'streamBegin']); $result['stream_begin_url'] = $result['stream_begin_url'] ?: kg_full_url(['for' => 'home.live_notify'], ['action' => 'streamBegin']);
$result['stream_end_url'] = $result['stream_end_url'] ?: kg_full_url(['for' => 'home.live.notify'], ['action' => 'streamEnd']); $result['stream_end_url'] = $result['stream_end_url'] ?: kg_full_url(['for' => 'home.live_notify'], ['action' => 'streamEnd']);
$result['record_url'] = $result['record_url'] ?: kg_full_url(['for' => 'home.live.notify'], ['action' => 'record']); $result['record_url'] = $result['record_url'] ?: kg_full_url(['for' => 'home.live_notify'], ['action' => 'record']);
$result['snapshot_url'] = $result['snapshot_url'] ?: kg_full_url(['for' => 'home.live.notify'], ['action' => 'snapshot']); $result['snapshot_url'] = $result['snapshot_url'] ?: kg_full_url(['for' => 'home.live_notify'], ['action' => 'snapshot']);
$result['porn_url'] = $result['porn_url'] ?: kg_full_url(['for' => 'home.live.notify'], ['action' => 'porn']); $result['porn_url'] = $result['porn_url'] ?: kg_full_url(['for' => 'home.live_notify'], ['action' => 'porn']);
} }
return $result; return $result;

View File

@ -23,11 +23,11 @@ class Stat extends Service
return [ return [
[ [
'title' => sprintf('%02d-%02d', $year, $month), 'title' => "{$year}-{$month}",
'sales' => $this->handleHotSales($type, $year, $month), 'sales' => $this->handleHotSales($type, $year, $month),
], ],
[ [
'title' => sprintf('%02d-%02d', $prev['year'], $prev['month']), 'title' => "{$prev['year']}-{$prev['month']}",
'sales' => $this->handleHotSales($type, $prev['year'], $prev['month']), 'sales' => $this->handleHotSales($type, $prev['year'], $prev['month']),
], ],
]; ];
@ -42,13 +42,12 @@ class Stat extends Service
$currSales = $this->handleSales($year, $month); $currSales = $this->handleSales($year, $month);
$prevSales = $this->handleSales($prev['year'], $prev['month']); $prevSales = $this->handleSales($prev['year'], $prev['month']);
$currMonth = sprintf('%02d-%02d', $year, $month);
$prevMonth = sprintf('%02d-%02d', $prev['year'], $prev['month']);
$items = []; $items = [];
foreach (range(1, 31) as $day) { foreach (range(1, 31) as $day) {
$date = sprintf('%02d', $day); $date = sprintf('%02d', $day);
$prevMonth = "{$prev['year']}-{$prev['month']}";
$currMonth = "{$year}-{$month}";
$items[] = [ $items[] = [
'date' => $date, 'date' => $date,
$currMonth => $currSales[$date] ?? 0, $currMonth => $currSales[$date] ?? 0,
@ -68,13 +67,12 @@ class Stat extends Service
$currRefunds = $this->handleRefunds($year, $month); $currRefunds = $this->handleRefunds($year, $month);
$prevRefunds = $this->handleRefunds($prev['year'], $prev['month']); $prevRefunds = $this->handleRefunds($prev['year'], $prev['month']);
$currMonth = sprintf('%02d-%02d', $year, $month);
$prevMonth = sprintf('%02d-%02d', $prev['year'], $prev['month']);
$items = []; $items = [];
foreach (range(1, 31) as $day) { foreach (range(1, 31) as $day) {
$date = sprintf('%02d', $day); $date = sprintf('%02d', $day);
$prevMonth = "{$prev['year']}-{$prev['month']}";
$currMonth = "{$year}-{$month}";
$items[] = [ $items[] = [
'date' => $date, 'date' => $date,
$currMonth => $currRefunds[$date] ?? 0, $currMonth => $currRefunds[$date] ?? 0,
@ -94,13 +92,12 @@ class Stat extends Service
$currUsers = $this->handleRegisteredUsers($year, $month); $currUsers = $this->handleRegisteredUsers($year, $month);
$prevUsers = $this->handleRegisteredUsers($prev['year'], $prev['month']); $prevUsers = $this->handleRegisteredUsers($prev['year'], $prev['month']);
$currMonth = sprintf('%02d-%02d', $year, $month);
$prevMonth = sprintf('%02d-%02d', $prev['year'], $prev['month']);
$items = []; $items = [];
foreach (range(1, 31) as $day) { foreach (range(1, 31) as $day) {
$date = sprintf('%02d', $day); $date = sprintf('%02d', $day);
$prevMonth = "{$prev['year']}-{$prev['month']}";
$currMonth = "{$year}-{$month}";
$items[] = [ $items[] = [
'date' => $date, 'date' => $date,
$currMonth => $currUsers[$date] ?? 0, $currMonth => $currUsers[$date] ?? 0,
@ -120,13 +117,12 @@ class Stat extends Service
$currUsers = $this->handleOnlineUsers($year, $month); $currUsers = $this->handleOnlineUsers($year, $month);
$prevUsers = $this->handleOnlineUsers($prev['year'], $prev['month']); $prevUsers = $this->handleOnlineUsers($prev['year'], $prev['month']);
$currMonth = sprintf('%02d-%02d', $year, $month);
$prevMonth = sprintf('%02d-%02d', $prev['year'], $prev['month']);
$items = []; $items = [];
foreach (range(1, 31) as $day) { foreach (range(1, 31) as $day) {
$date = sprintf('%02d', $day); $date = sprintf('%02d', $day);
$prevMonth = "{$prev['year']}-{$prev['month']}";
$currMonth = "{$year}-{$month}";
$items[] = [ $items[] = [
'date' => $date, 'date' => $date,
$currMonth => $currUsers[$date] ?? 0, $currMonth => $currUsers[$date] ?? 0,
@ -158,10 +154,7 @@ class Stat extends Service
protected function isCurrMonth($year, $month) protected function isCurrMonth($year, $month)
{ {
$yearOk = date('Y') == $year; return date('Y-m') == "{$year}-{$month}";
$monthOk = date('m') == $month;
return $yearOk && $monthOk;
} }
protected function getLifetime() protected function getLifetime()

View File

@ -204,22 +204,16 @@ class User extends Service
$data['vip'] = $validator->checkVipStatus($post['vip']); $data['vip'] = $validator->checkVipStatus($post['vip']);
} }
if (!empty($post['vip_expiry_time'])) {
$data['vip_expiry_time'] = $validator->checkVipExpiryTime($post['vip_expiry_time']);
}
if (isset($post['locked'])) { if (isset($post['locked'])) {
$data['locked'] = $validator->checkLockStatus($post['locked']); $data['locked'] = $validator->checkLockStatus($post['locked']);
} }
if (!empty($post['vip_expiry_time'])) {
$data['vip_expiry_time'] = $validator->checkVipExpiryTime($post['vip_expiry_time']);
if ($data['vip_expiry_time'] < time()) {
$data['vip'] = 0;
}
}
if (!empty($post['lock_expiry_time'])) { if (!empty($post['lock_expiry_time'])) {
$data['lock_expiry_time'] = $validator->checkLockExpiryTime($post['lock_expiry_time']); $data['lock_expiry_time'] = $validator->checkLockExpiryTime($post['lock_expiry_time']);
if ($data['lock_expiry_time'] < time()) {
$data['locked'] = 0;
}
} }
$oldAdminRole = $user->admin_role; $oldAdminRole = $user->admin_role;

View File

@ -49,7 +49,7 @@
name: 'xm_tag_ids', name: 'xm_tag_ids',
max: 5, max: 5,
filterable: true, filterable: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_tags|json_encode }} data: {{ xm_tags|json_encode }}
@ -71,4 +71,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -34,8 +34,8 @@
<th>用户IP</th> <th>用户IP</th>
<th>请求路由</th> <th>请求路由</th>
<th>请求路径</th> <th>请求路径</th>
<th>创建时间</th> <th>请求时间</th>
<th>操作</th> <th>请求内容</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -91,4 +91,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -13,9 +13,9 @@
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">用户IP</label> <label class="layui-form-label">用户名称</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="user_ip" placeholder="用户IP精确匹配"> <input class="layui-input" type="text" name="user_name" placeholder="用户名称精确匹配">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -31,7 +31,7 @@
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">创建时间</label> <label class="layui-form-label">请求时间</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<input class="layui-input time-range" type="text" name="start_time" autocomplete="off"> <input class="layui-input time-range" type="text" name="start_time" autocomplete="off">
</div> </div>
@ -70,4 +70,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -9,7 +9,7 @@
<div class="kg-nav-left"> <div class="kg-nav-left">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
{% if parent.id > 0 %} {% if parent.id > 0 %}
<a href="{{ back_url }}"><i class="layui-icon layui-icon-return"></i>返回</a> <a class="kg-back" href="{{ back_url }}"><i class="layui-icon layui-icon-return"></i>返回</a>
<a><cite>{{ parent.name }}</cite></a> <a><cite>{{ parent.name }}</cite></a>
{% endif %} {% endif %}
<a><cite>分类管理</cite></a> <a><cite>分类管理</cite></a>
@ -87,4 +87,4 @@
</tbody> </tbody>
</table> </table>
{% endblock %} {% endblock %}

View File

@ -88,7 +88,7 @@
layer.open({ layer.open({
type: 2, type: 2,
title: '推流测试', title: '推流测试',
area: ['720px', '540px'], area: ['720px', '500px'],
content: [url, 'no'] content: [url, 'no']
}); });
}); });
@ -97,4 +97,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -43,7 +43,7 @@
<div class="kg-nav"> <div class="kg-nav">
<div class="kg-nav-left"> <div class="kg-nav-left">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
<a href="{{ back_url }}"><i class="layui-icon layui-icon-return"></i>返回</a> <a class="kg-back" href="{{ back_url }}"><i class="layui-icon layui-icon-return"></i>返回</a>
<a><cite>{{ course.title }}</cite></a> <a><cite>{{ course.title }}</cite></a>
<a><cite>{{ chapter.title }}</cite></a> <a><cite>{{ chapter.title }}</cite></a>
<a><cite>课时管理</cite></a> <a><cite>课时管理</cite></a>
@ -126,4 +126,4 @@
</tbody> </tbody>
</table> </table>
{% endblock %} {% endblock %}

View File

@ -84,7 +84,7 @@
name: 'course_id', name: 'course_id',
filterable: true, filterable: true,
radio: true, radio: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_courses|json_encode }} data: {{ xm_courses|json_encode }}
@ -102,4 +102,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -9,7 +9,7 @@
<div class="kg-nav"> <div class="kg-nav">
<div class="kg-nav-left"> <div class="kg-nav-left">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
<a href="{{ back_url }}"><i class="layui-icon layui-icon-return"></i>返回</a> <a class="kg-back" href="{{ back_url }}"><i class="layui-icon layui-icon-return"></i>返回</a>
<a><cite>{{ course.title }}</cite></a> <a><cite>{{ course.title }}</cite></a>
<a><cite>章节管理</cite></a> <a><cite>章节管理</cite></a>
</span> </span>
@ -79,4 +79,4 @@
</tbody> </tbody>
</table> </table>
{% endblock %} {% endblock %}

View File

@ -65,7 +65,7 @@
name: 'xm_tag_ids', name: 'xm_tag_ids',
max: 5, max: 5,
filterable: true, filterable: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_tags|json_encode }} data: {{ xm_tags|json_encode }}
@ -77,7 +77,7 @@
max: 10, max: 10,
autoRow: true, autoRow: true,
filterable: true, filterable: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_courses|json_encode }} data: {{ xm_courses|json_encode }}
@ -107,4 +107,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="kg-nav-right"> <div class="kg-nav-right">
<a class="layui-btn layui-btn-sm" href="{{ category_url }}"> <a class="layui-btn layui-btn-sm" href="{{ category_url }}">
<i class="layui-icon layui-icon-add-1"></i>课程分类 <i class="layui-icon layui-icon-add-1"></i>分类管理
</a> </a>
<a class="layui-btn layui-btn-sm" href="{{ add_url }}"> <a class="layui-btn layui-btn-sm" href="{{ add_url }}">
<i class="layui-icon layui-icon-add-1"></i>添加课程 <i class="layui-icon layui-icon-add-1"></i>添加课程
@ -124,4 +124,4 @@
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
{% endblock %} {% endblock %}

View File

@ -3,6 +3,7 @@
<table class="kg-table layui-table"> <table class="kg-table layui-table">
<tr> <tr>
<th>名称</th> <th>名称</th>
<th>类型</th>
<th>大小</th> <th>大小</th>
<th>日期</th> <th>日期</th>
<th width="15%">操作</th> <th width="15%">操作</th>
@ -12,6 +13,7 @@
{% set delete_url = url({'for':'admin.resource.delete','id':item.id}) %} {% set delete_url = url({'for':'admin.resource.delete','id':item.id}) %}
<tr> <tr>
<td><input class="layui-input res-name" type="text" value="{{ item.upload.name }}" data-url="{{ update_url }}"></td> <td><input class="layui-input res-name" type="text" value="{{ item.upload.name }}" data-url="{{ update_url }}"></td>
<td>{{ item.upload.mime }}</td>
<td>{{ item.upload.size|human_size }}</td> <td>{{ item.upload.size|human_size }}</td>
<td>{{ date('Y-m-d H:i:s',item.create_time) }}</td> <td>{{ date('Y-m-d H:i:s',item.create_time) }}</td>
<td> <td>
@ -25,4 +27,4 @@
{% else %} {% else %}
<div class="kg-center">没有相关资料</div> <div class="kg-center">没有相关资料</div>
<br> <br>
{% endif %} {% endif %}

View File

@ -6,7 +6,7 @@
<div class="layui-card-body"> <div class="layui-card-body">
<table class="layui-table"> <table class="layui-table">
<colgroup> <colgroup>
<col width="25%"> <col width="100">
<col> <col>
</colgroup> </colgroup>
<tbody> <tbody>
@ -24,4 +24,4 @@
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>

View File

@ -1,9 +1,9 @@
<div class="layui-card layui-text"> <div class="layui-card layui-text" xmlns="http://www.w3.org/1999/html">
<div class="layui-card-header">服务器信息</div> <div class="layui-card-header">服务器信息</div>
<div class="layui-card-body"> <div class="layui-card-body">
<table class="layui-table"> <table class="layui-table">
<colgroup> <colgroup>
<col width="25%"> <col width="100">
<col> <col>
</colgroup> </colgroup>
<tbody> <tbody>
@ -22,4 +22,4 @@
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>

View File

@ -3,7 +3,7 @@
<div class="layui-card-body"> <div class="layui-card-body">
<table class="layui-table"> <table class="layui-table">
<colgroup> <colgroup>
<col width="25%"> <col width="100">
<col> <col>
</colgroup> </colgroup>
<tbody> <tbody>
@ -26,4 +26,4 @@
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>

View File

@ -0,0 +1,31 @@
{%- macro item_type_info(value) %}
{% if value == 1 %}
课程
{% elseif value == 2 %}
套餐
{% elseif value == 3 %}
会员
{% endif %}
{%- endmacro %}
{%- macro item_full_info(item_type,item_info) %}
{% if item_type == 1 %}
{% set course = item_info.course %}
<p>名称:{{ course.title }}{{ course.id }}</p>
<p>类型:{{ item_type_info(item_type) }} 价格:{{ '¥%0.2f'|format(course.market_price) }}</p>
{% elseif item_type == 2 %}
{% set package = item_info.package %}
<p>名称:{{ package.title }}{{ package.id }}</p>
<p>类型:{{ item_type_info(item_type) }} 价格:{{ '¥%0.2f'|format(package.market_price) }}</p>
{% elseif item_type == 3 %}
{% set vip = item_info.vip %}
<p>期限:{{ '%d个月'|format(vip.expiry) }}{{ vip.id }}</p>
<p>类型:{{ item_type_info(item_type) }} 价格:{{ '¥%0.2f'|format(vip.price) }}</p>
{% endif %}
{%- endmacro %}
{%- macro schedules_info(schedules) %}
{% for value in schedules %}
<span class="layui-badge layui-bg-gray">{{ value }}点</span>
{% endfor %}
{%- endmacro %}

View File

@ -37,15 +37,13 @@
<input class="layui-input" type="text" name="priority" value="10" lay-verify="number"> <input class="layui-input" type="text" name="priority" value="10" lay-verify="number">
</div> </div>
</div> </div>
{% if parent_id == 0 %} <div class="layui-form-item">
<div class="layui-form-item"> <label class="layui-form-label">位置</label>
<label class="layui-form-label">位置</label> <div class="layui-input-block">
<div class="layui-input-block"> <input type="radio" name="position" value="1" title="顶部" checked="checked">
<input type="radio" name="position" value="1" title="顶部" checked="checked"> <input type="radio" name="position" value="2" title="底部">
<input type="radio" name="position" value="2" title="底部">
</div>
</div> </div>
{% endif %} </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">目标</label> <label class="layui-form-label">目标</label>
<div class="layui-input-block"> <div class="layui-input-block">
@ -63,4 +61,4 @@
</div> </div>
</form> </form>
{% endblock %} {% endblock %}

View File

@ -24,15 +24,13 @@
<input class="layui-input" type="text" name="priority" value="{{ nav.priority }}" lay-verify="number"> <input class="layui-input" type="text" name="priority" value="{{ nav.priority }}" lay-verify="number">
</div> </div>
</div> </div>
{% if nav.parent_id == 0 %} <div class="layui-form-item">
<div class="layui-form-item"> <label class="layui-form-label">位置</label>
<label class="layui-form-label">位置</label> <div class="layui-input-block">
<div class="layui-input-block"> <input type="radio" name="position" value="1" title="顶部" {% if nav.position == 1 %}checked="checked"{% endif %}>
<input type="radio" name="position" value="1" title="顶部" {% if nav.position == 1 %}checked="checked"{% endif %}> <input type="radio" name="position" value="2" title="底部" {% if nav.position == 2 %}checked="checked"{% endif %}>
<input type="radio" name="position" value="2" title="底部" {% if nav.position == 2 %}checked="checked"{% endif %}>
</div>
</div> </div>
{% endif %} </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">目标</label> <label class="layui-form-label">目标</label>
<div class="layui-input-block"> <div class="layui-input-block">
@ -56,4 +54,4 @@
</div> </div>
</form> </form>
{% endblock %} {% endblock %}

View File

@ -25,7 +25,9 @@
<div class="kg-nav-left"> <div class="kg-nav-left">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
{% if parent.id > 0 %} {% if parent.id > 0 %}
<a href="{{ back_url }}"><i class="layui-icon layui-icon-return"></i>返回</a> <a class="kg-back" href="{{ back_url }}">
<i class="layui-icon layui-icon-return"></i> 返回
</a>
<a><cite>{{ parent.name }}</cite></a> <a><cite>{{ parent.name }}</cite></a>
{% endif %} {% endif %}
<a><cite>导航管理</cite></a> <a><cite>导航管理</cite></a>
@ -70,8 +72,8 @@
{% set restore_url = url({'for':'admin.nav.restore','id':item.id}) %} {% set restore_url = url({'for':'admin.nav.restore','id':item.id}) %}
<tr> <tr>
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
{% if item.position == 1 and item.level == 1 %} {% if item.position == 1 and item.level < 2 %}
<td><a href="{{ child_url }}"><i class="layui-icon layui-icon-add-circle"></i> {{ item.name }}</a></td> <td><a href="{{ child_url }}">{{ item.name }}</a></td>
{% else %} {% else %}
<td><a href="{{ edit_url }}">{{ item.name }}</a></td> <td><a href="{{ edit_url }}">{{ item.name }}</a></td>
{% endif %} {% endif %}
@ -100,4 +102,4 @@
</tbody> </tbody>
</table> </table>
{% endblock %} {% endblock %}

View File

@ -82,7 +82,7 @@
max: 15, max: 15,
autoRow: true, autoRow: true,
filterable: true, filterable: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_courses|json_encode }} data: {{ xm_courses|json_encode }}
@ -92,4 +92,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -69,7 +69,7 @@
name: 'xm_course_id', name: 'xm_course_id',
radio: true, radio: true,
filterable: true, filterable: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_courses|json_encode }} data: {{ xm_courses|json_encode }}
@ -91,4 +91,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -48,7 +48,7 @@
name: 'xm_tag_ids', name: 'xm_tag_ids',
max: 5, max: 5,
filterable: true, filterable: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_tags|json_encode }} data: {{ xm_tags|json_encode }}
@ -58,4 +58,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -84,7 +84,7 @@
name: 'course_id', name: 'course_id',
filterable: true, filterable: true,
radio: true, radio: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_courses|json_encode }} data: {{ xm_courses|json_encode }}
@ -102,4 +102,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -65,7 +65,7 @@
layer.open({ layer.open({
type: 2, type: 2,
title: '推流测试', title: '推流测试',
area: ['720px', '540px'], area: ['720px', '500px'],
content: [url, 'no'] content: [url, 'no']
}); });
}); });
@ -85,4 +85,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -34,7 +34,7 @@
type: 2, type: 2,
title: '支付宝 - 支付测试', title: '支付宝 - 支付测试',
resize: false, resize: false,
area: ['640px', '320px'], area: ['640px', '300px'],
content: [url, 'no'] content: [url, 'no']
}); });
}); });
@ -45,7 +45,7 @@
type: 2, type: 2,
title: '微信 - 支付测试', title: '微信 - 支付测试',
resize: false, resize: false,
area: ['640px', '320px'], area: ['640px', '300px'],
content: [url, 'no'] content: [url, 'no']
}); });
}); });
@ -54,4 +54,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -75,7 +75,7 @@
name: 'xm_course_id', name: 'xm_course_id',
radio: true, radio: true,
filterable: true, filterable: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_courses|json_encode }} data: {{ xm_courses|json_encode }}
@ -86,7 +86,7 @@
name: 'xm_page_id', name: 'xm_page_id',
radio: true, radio: true,
filterable: true, filterable: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_pages|json_encode }} data: {{ xm_pages|json_encode }}
@ -101,4 +101,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -20,10 +20,9 @@
{{ js_include('lib/layui/layui.js') }} {{ js_include('lib/layui/layui.js') }}
{{ js_include('admin/js/common.js') }} {{ js_include('admin/js/common.js') }}
{{ js_include('admin/js/fixbar.js') }}
{% block include_js %}{% endblock %} {% block include_js %}{% endblock %}
{% block inline_js %}{% endblock %} {% block inline_js %}{% endblock %}
</body> </body>
</html> </html>

View File

@ -44,7 +44,7 @@
max: 15, max: 15,
autoRow: true, autoRow: true,
filterable: true, filterable: true,
filterMethod: function (val, item) { filterMethod: function (val, item, index, prop) {
return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1; return item.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;
}, },
data: {{ xm_courses|json_encode }} data: {{ xm_courses|json_encode }}
@ -55,3 +55,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -21,11 +21,12 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label" style="padding-top:30px;">头像</label> <label class="layui-form-label" style="padding-top:30px;">头像</label>
<div class="layui-input-inline" style="width:80px;"> <div class="layui-input-inline" style="width:80px;">
<img id="img-avatar" class="kg-avatar" src="{{ user.avatar }}"> <img id="avatar" class="kg-avatar" src="{{ user.avatar }}">
<input type="hidden" name="avatar" value="{{ user.avatar }}"> <input type="hidden" name="avatar" value="{{ user.avatar }}">
<input type="hidden" name="default_avatar" value="{{ default_avatar }}">
</div> </div>
<div class="layui-input-inline" style="padding-top:25px;"> <div class="layui-input-inline" style="padding-top:25px;">
<button id="change-avatar" class="layui-btn layui-btn-sm" type="button">更换</button> <button id="clear-avatar" class="layui-btn layui-btn-sm" type="button">清空</button>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -152,12 +153,6 @@
{% endblock %} {% endblock %}
{% block include_js %}
{{ js_include('admin/js/avatar.upload.js') }}
{% endblock %}
{% block inline_js %} {% block inline_js %}
<script> <script>
@ -168,6 +163,12 @@
var form = layui.form; var form = layui.form;
var laydate = layui.laydate; var laydate = layui.laydate;
$('#clear-avatar').on('click', function () {
var defaultAvatar = $('input[name=default_avatar]').val();
$('input[name=avatar]').val(defaultAvatar);
$('#avatar').attr('src', defaultAvatar);
});
laydate.render({ laydate.render({
elem: 'input[name=vip_expiry_time]', elem: 'input[name=vip_expiry_time]',
type: 'datetime' type: 'datetime'
@ -200,4 +201,4 @@
</script> </script>
{% endblock %} {% endblock %}

View File

@ -30,6 +30,8 @@ class Controller extends \Phalcon\Mvc\Controller
$this->setCors(); $this->setCors();
} }
$this->checkRateLimit();
return true; return true;
} }

View File

@ -7,7 +7,7 @@
namespace App\Http\Api\Controllers; namespace App\Http\Api\Controllers;
use App\Services\Logic\Live\LiveChat as LiveChatService; use App\Services\Logic\Live\LiveChapter as LiveChapterService;
use App\Services\Logic\Live\LiveList as LiveListService; use App\Services\Logic\Live\LiveList as LiveListService;
/** /**
@ -33,7 +33,7 @@ class LiveController extends Controller
*/ */
public function chatsAction($id) public function chatsAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$chats = $service->getRecentChats($id); $chats = $service->getRecentChats($id);
@ -45,7 +45,7 @@ class LiveController extends Controller
*/ */
public function statsAction($id) public function statsAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$stats = $service->getStats($id); $stats = $service->getStats($id);
@ -57,7 +57,7 @@ class LiveController extends Controller
*/ */
public function statusAction($id) public function statusAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$status = $service->getStatus($id); $status = $service->getStatus($id);
@ -69,7 +69,7 @@ class LiveController extends Controller
*/ */
public function bindUserAction($id) public function bindUserAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$service->bindUser($id); $service->bindUser($id);
@ -81,7 +81,7 @@ class LiveController extends Controller
*/ */
public function sendMessageAction($id) public function sendMessageAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$message = $service->sendMessage($id); $message = $service->sendMessage($id);

View File

@ -34,7 +34,7 @@ class AccountController extends Controller
} }
if ($this->authUser->id > 0) { if ($this->authUser->id > 0) {
return $this->response->redirect(['for' => 'home.index']); return $this->response->redirect('/');
} }
$returnUrl = $this->request->getHTTPReferer(); $returnUrl = $this->request->getHTTPReferer();
@ -62,7 +62,7 @@ class AccountController extends Controller
} }
if ($this->authUser->id > 0) { if ($this->authUser->id > 0) {
return $this->response->redirect(['for' => 'home.index']); return $this->response->redirect('/');
} }
$service = new OAuthProviderService(); $service = new OAuthProviderService();
@ -105,7 +105,7 @@ class AccountController extends Controller
return $this->response->redirect(['for' => 'home.index']); return $this->response->redirect(['for' => 'home.index']);
} }
$this->seo->prependTitle('忘记密码'); $this->seo->prependTitle('重置密码');
} }
/** /**
@ -119,11 +119,9 @@ class AccountController extends Controller
$returnUrl = $this->request->getPost('return_url', 'string'); $returnUrl = $this->request->getPost('return_url', 'string');
$location = $returnUrl ?: $this->url->get(['for' => 'home.index']);
$content = [ $content = [
'location' => $location, 'location' => $returnUrl ?: '/',
'msg' => '注册账号成功', 'msg' => '注册成功',
]; ];
return $this->jsonSuccess($content); return $this->jsonSuccess($content);
@ -142,12 +140,7 @@ class AccountController extends Controller
$location = $returnUrl ?: $this->url->get(['for' => 'home.index']); $location = $returnUrl ?: $this->url->get(['for' => 'home.index']);
$content = [ return $this->jsonSuccess(['location' => $location]);
'location' => $location,
'msg' => '登录账号成功',
];
return $this->jsonSuccess($content);
} }
/** /**
@ -163,12 +156,7 @@ class AccountController extends Controller
$location = $returnUrl ?: $this->url->get(['for' => 'home.index']); $location = $returnUrl ?: $this->url->get(['for' => 'home.index']);
$content = [ return $this->jsonSuccess(['location' => $location]);
'location' => $location,
'msg' => '登录账号成功',
];
return $this->jsonSuccess($content);
} }
/** /**

View File

@ -120,21 +120,27 @@ class ConnectController extends Controller
$service = new ConnectService(); $service = new ConnectService();
$openUser = $service->getOpenUserInfo($code, $state, $provider); $openUser = $service->getOpenUserInfo($code, $state, $provider);
$connect = $service->getConnectRelation($openUser['id'], $openUser['provider']); $connect = $service->getConnectRelation($openUser['id'], $openUser['provider']);
if ($this->authUser->id > 0 && $openUser) { if ($this->authUser->id > 0) {
$service->bindUser($openUser); if ($openUser) {
return $this->response->redirect(['for' => 'home.uc.account']); $service->bindUser($openUser);
return $this->response->redirect(['for' => 'home.uc.account']);
}
} else {
if ($connect) {
$service->authConnectLogin($connect);
return $this->response->redirect(['for' => 'home.index']);
}
} }
if ($this->authUser->id == 0 && $connect) { $captcha = $service->getSettings('captcha');
$service->authConnectLogin($connect);
return $this->response->redirect(['for' => 'home.index']);
}
$this->seo->prependTitle('绑定帐号'); $this->seo->prependTitle('绑定帐号');
$this->view->pick('connect/bind'); $this->view->pick('connect/bind');
$this->view->setVar('captcha', $captcha);
$this->view->setVar('provider', $provider); $this->view->setVar('provider', $provider);
$this->view->setVar('open_user', $openUser); $this->view->setVar('open_user', $openUser);
} }

View File

@ -77,14 +77,8 @@ class ConsultController extends Controller
$consult = $service->handle($consult->id); $consult = $service->handle($consult->id);
$location = $this->url->get([
'for' => 'home.course.show',
'id' => $consult['course']['id'],
]);
$content = [ $content = [
'location' => $location, 'consult' => $consult,
'target' => 'parent',
'msg' => '提交咨询成功', 'msg' => '提交咨询成功',
]; ];
@ -98,13 +92,14 @@ class ConsultController extends Controller
{ {
$service = new ConsultUpdateService(); $service = new ConsultUpdateService();
$service->handle($id); $consult = $service->handle($id);
$location = $this->url->get(['for' => 'home.uc.consults']); $service = new ConsultInfoService();
$consult = $service->handle($consult->id);
$content = [ $content = [
'location' => $location, 'consult' => $consult,
'target' => 'parent',
'msg' => '更新咨询成功', 'msg' => '更新咨询成功',
]; ];
@ -132,13 +127,14 @@ class ConsultController extends Controller
$service = new ConsultReplyService(); $service = new ConsultReplyService();
$service->handle($id); $consult = $service->handle($id);
$location = $this->url->get(['for' => 'home.tc.consults']); $service = new ConsultInfoService();
$consult = $service->handle($consult->id);
$content = [ $content = [
'location' => $location, 'consult' => $consult,
'target' => 'parent',
'msg' => '回复咨询成功', 'msg' => '回复咨询成功',
]; ];

View File

@ -77,6 +77,8 @@ class Controller extends \Phalcon\Mvc\Controller
$this->checkCsrfToken(); $this->checkCsrfToken();
} }
$this->checkRateLimit();
return true; return true;
} }

View File

@ -37,6 +37,8 @@ class LayerController extends \Phalcon\Mvc\Controller
$this->checkCsrfToken(); $this->checkCsrfToken();
} }
$this->checkRateLimit();
return true; return true;
} }

View File

@ -7,7 +7,7 @@
namespace App\Http\Home\Controllers; namespace App\Http\Home\Controllers;
use App\Services\Logic\Live\LiveChat as LiveChatService; use App\Services\Logic\Live\LiveChapter as LiveChapterService;
use Phalcon\Mvc\View; use Phalcon\Mvc\View;
/** /**
@ -21,7 +21,7 @@ class LiveController extends Controller
*/ */
public function chatsAction($id) public function chatsAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$chats = $service->getRecentChats($id); $chats = $service->getRecentChats($id);
@ -35,7 +35,7 @@ class LiveController extends Controller
*/ */
public function statsAction($id) public function statsAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$stats = $service->getStats($id); $stats = $service->getStats($id);
@ -47,7 +47,7 @@ class LiveController extends Controller
*/ */
public function statusAction($id) public function statusAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$status = $service->getStatus($id); $status = $service->getStatus($id);
@ -59,7 +59,7 @@ class LiveController extends Controller
*/ */
public function bindUserAction($id) public function bindUserAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$service->bindUser($id); $service->bindUser($id);
@ -71,7 +71,7 @@ class LiveController extends Controller
*/ */
public function sendMessageAction($id) public function sendMessageAction($id)
{ {
$service = new LiveChatService(); $service = new LiveChapterService();
$response = $service->sendMessage($id); $response = $service->sendMessage($id);

View File

@ -27,10 +27,7 @@ class OrderController extends Controller
parent::beforeExecuteRoute($dispatcher); parent::beforeExecuteRoute($dispatcher);
if ($this->authUser->id == 0) { if ($this->authUser->id == 0) {
$dispatcher->forward([ $this->response->redirect(['for' => 'home.account.login']);
'controller' => 'account',
'action' => 'login',
]);
return false; return false;
} }

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