diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d08a790..6cb084df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +### [v1.2.7](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.7)(2021-02-26) + +### 新增 + +- 钉钉机器人群消息通知 +- demo分支重置演示帐号计划任务 +- 添加学员自动加入相关课程群组 +- 后台查看积分记录 + +### 更新 + +- 路由重命名 admin.group -> admin.im_group +- 路由重命名 home.group -> home.im_group +- 样式重命名 sidebar-teacher-card -> sidebar-user-card +- 去除顶部积分导航 +- 用户中心部分样式调整 +- 后台部分导航调整 +- 不能删除课程教师问题 +- 积分模块可通过后台控制是否启用 +- 解除好友关系后好友数量未递减 + ### [v1.2.6](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.6)(2021-02-20) ### 新增 diff --git a/app/Console/Tasks/NoticeTask.php b/app/Console/Tasks/NoticeTask.php index 17613ae7..8d3abe45 100644 --- a/app/Console/Tasks/NoticeTask.php +++ b/app/Console/Tasks/NoticeTask.php @@ -91,63 +91,63 @@ class NoticeTask extends Task { $notice = new AccountLoginNotice(); - return $notice->handleTask($task); + $notice->handleTask($task); } protected function handleLiveBeginNotice(TaskModel $task) { $notice = new LiveBeginNotice(); - return $notice->handleTask($task); + $notice->handleTask($task); } protected function handleOrderFinishNotice(TaskModel $task) { $notice = new OrderFinishNotice(); - return $notice->handleTask($task); + $notice->handleTask($task); } protected function handleRefundFinishNotice(TaskModel $task) { $notice = new RefundFinishNotice(); - return $notice->handleTask($task); + $notice->handleTask($task); } protected function handleConsultReplyNotice(TaskModel $task) { $notice = new ConsultReplyNotice(); - return $notice->handleTask($task); + $notice->handleTask($task); } protected function handleConsultCreateNotice(TaskModel $task) { $notice = new ConsultCreateNotice(); - return $notice->handleTask($task); + $notice->handleTask($task); } protected function handleTeacherLiveNotice(TaskModel $task) { $notice = new TeacherLiveNotice(); - return $notice->handleTask($task); + $notice->handleTask($task); } protected function handleServerMonitorNotice(TaskModel $task) { $notice = new ServerMonitorNotice(); - return $notice->handleTask($task); + $notice->handleTask($task); } protected function handleCustomServiceNotice(TaskModel $task) { $notice = new CustomServiceNotice(); - return $notice->handleTask($task); + $notice->handleTask($task); } /** diff --git a/app/Console/Tasks/ServerMonitorTask.php b/app/Console/Tasks/ServerMonitorTask.php index 7c2f4486..7eff21ca 100644 --- a/app/Console/Tasks/ServerMonitorTask.php +++ b/app/Console/Tasks/ServerMonitorTask.php @@ -3,7 +3,6 @@ namespace App\Console\Tasks; use App\Library\Benchmark; -use App\Library\Utils\ServerInfo; use App\Models\User as UserModel; use App\Services\DingTalk\Notice\ServerMonitor as ServerMonitorNotice; use App\Services\Search\UserSearcher; @@ -19,12 +18,13 @@ class ServerMonitorTask extends Task if ($robot['enabled'] == 0) return; $items = [ - 'cpu' => $this->checkCPU(), + 'cpu' => $this->checkCpu(), + 'memory' => $this->checkMemory(), 'disk' => $this->checkDisk(), 'mysql' => $this->checkMysql(), 'redis' => $this->checkRedis(), - 'xunsearch' => $this->checkXunSearch(), - 'websocket' => $this->checkWebSocket(), + 'xunsearch' => $this->checkXunsearch(), + 'websocket' => $this->checkWebsocket(), ]; foreach ($items as $key => $value) { @@ -42,23 +42,53 @@ class ServerMonitorTask extends Task $notice->createTask($content); } - protected function checkCPU() + protected function checkCpu() { - $coreCount = $this->getCpuCount(); + $cpuCount = $this->getCpuCount(); - $cpu = ServerInfo::cpu(); + $load = sys_getloadavg(); - if ($cpu[1] > $coreCount * 0.8) { - return sprintf("cpu负载超过%s", $cpu[1]); + if ($load[1] > $cpuCount * 0.8) { + return sprintf("cpu负载超过%s", $load[1]); + } + } + + protected function checkMemory() + { + $memInfo = file_get_contents('/proc/meminfo'); + + $total = null; + + if (preg_match('/MemTotal\:\s+(\d+) kB/', $memInfo, $totalMatches)) { + $total = $totalMatches[1]; + } + + if ($total === null) return; + + $available = null; + + if (preg_match('/MemAvailable\:\s+(\d+) kB/', $memInfo, $avaMatches)) { + $available = $avaMatches[1]; + } + + if ($available === null) return; + + $left = 100 * ($available / $total); + + if ($left < 20) { + return sprintf("memory剩余不足%s%%", round($left)); } } protected function checkDisk() { - $disk = ServerInfo::disk(); + $free = disk_free_space('/'); + $total = disk_total_space('/'); - if ($disk['percent'] > 80) { - return sprintf("disk空间超过%s%%", $disk['percent']); + $left = 100 * $free / $total; + + if ($left < 20) { + return sprintf("disk剩余不足%s%%", round($left)); } } @@ -116,7 +146,7 @@ class ServerMonitorTask extends Task } } - protected function checkXunSearch() + protected function checkXunsearch() { try { @@ -145,7 +175,7 @@ class ServerMonitorTask extends Task } } - protected function checkWebSocket() + protected function checkWebsocket() { try { diff --git a/app/Http/Admin/Controllers/CourseController.php b/app/Http/Admin/Controllers/CourseController.php index 587e3e89..9b927b52 100644 --- a/app/Http/Admin/Controllers/CourseController.php +++ b/app/Http/Admin/Controllers/CourseController.php @@ -33,9 +33,13 @@ class CourseController extends Controller $xmCategories = $courseService->getXmCategories(0); $xmTeachers = $courseService->getXmTeachers(0); + $modelTypes = $courseService->getModelTypes(); + $levelTypes = $courseService->getLevelTypes(); $this->view->setVar('xm_categories', $xmCategories); $this->view->setVar('xm_teachers', $xmTeachers); + $this->view->setVar('model_types', $modelTypes); + $this->view->setVar('level_types', $levelTypes); } /** diff --git a/app/Http/Admin/Controllers/ImGroupController.php b/app/Http/Admin/Controllers/ImGroupController.php index 7be26303..e1f73991 100644 --- a/app/Http/Admin/Controllers/ImGroupController.php +++ b/app/Http/Admin/Controllers/ImGroupController.php @@ -11,7 +11,7 @@ class ImGroupController extends Controller { /** - * @Get("/list", name="admin.group.list") + * @Get("/list", name="admin.im_group.list") */ public function listAction() { @@ -25,15 +25,20 @@ class ImGroupController extends Controller } /** - * @Get("/search", name="admin.group.search") + * @Get("/search", name="admin.im_group.search") */ public function searchAction() { + $groupService = new ImGroupService(); + + $types = $groupService->getGroupTypes(); + $this->view->pick('im/group/search'); + $this->view->setVar('types', $types); } /** - * @Get("/add", name="admin.group.add") + * @Get("/add", name="admin.im_group.add") */ public function addAction() { @@ -41,7 +46,7 @@ class ImGroupController extends Controller } /** - * @Get("/{id:[0-9]+}/edit", name="admin.group.edit") + * @Get("/{id:[0-9]+}/edit", name="admin.im_group.edit") */ public function editAction($id) { @@ -55,7 +60,7 @@ class ImGroupController extends Controller } /** - * @Post("/create", name="admin.group.create") + * @Post("/create", name="admin.im_group.create") */ public function createAction() { @@ -64,7 +69,7 @@ class ImGroupController extends Controller $group = $groupService->createGroup(); $location = $this->url->get([ - 'for' => 'admin.group.edit', + 'for' => 'admin.im_group.edit', 'id' => $group->id, ]); @@ -77,7 +82,7 @@ class ImGroupController extends Controller } /** - * @Post("/{id:[0-9]+}/update", name="admin.group.update") + * @Post("/{id:[0-9]+}/update", name="admin.im_group.update") */ public function updateAction($id) { @@ -85,7 +90,7 @@ class ImGroupController extends Controller $groupService->updateGroup($id); - $location = $this->url->get(['for' => 'admin.group.list']); + $location = $this->url->get(['for' => 'admin.im_group.list']); $content = [ 'location' => $location, @@ -96,7 +101,7 @@ class ImGroupController extends Controller } /** - * @Post("/{id:[0-9]+}/delete", name="admin.group.delete") + * @Post("/{id:[0-9]+}/delete", name="admin.im_group.delete") */ public function deleteAction($id) { @@ -115,7 +120,7 @@ class ImGroupController extends Controller } /** - * @Post("/{id:[0-9]+}/restore", name="admin.group.restore") + * @Post("/{id:[0-9]+}/restore", name="admin.im_group.restore") */ public function restoreAction($id) { diff --git a/app/Http/Admin/Controllers/OrderController.php b/app/Http/Admin/Controllers/OrderController.php index 54597b42..c243e430 100644 --- a/app/Http/Admin/Controllers/OrderController.php +++ b/app/Http/Admin/Controllers/OrderController.php @@ -15,7 +15,13 @@ class OrderController extends Controller */ public function searchAction() { + $orderService = new OrderService(); + $itemTypes = $orderService->getItemTypes(); + $statusTypes = $orderService->getStatusTypes(); + + $this->view->setVar('item_types', $itemTypes); + $this->view->setVar('status_types', $statusTypes); } /** diff --git a/app/Http/Admin/Controllers/PointHistoryController.php b/app/Http/Admin/Controllers/PointHistoryController.php new file mode 100644 index 00000000..cce0f88c --- /dev/null +++ b/app/Http/Admin/Controllers/PointHistoryController.php @@ -0,0 +1,40 @@ +getEventTypes(); + + $this->view->pick('point/history/search'); + $this->view->setVar('event_types', $eventTypes); + } + + /** + * @Get("/list", name="admin.point_history.list") + */ + public function listAction() + { + $historyService = new PointHistoryService(); + + $pager = $historyService->getHistories(); + + $this->view->pick('point/history/list'); + + $this->view->setVar('pager', $pager); + } + +} \ No newline at end of file diff --git a/app/Http/Admin/Controllers/RefundController.php b/app/Http/Admin/Controllers/RefundController.php index 7271f416..3799e23e 100644 --- a/app/Http/Admin/Controllers/RefundController.php +++ b/app/Http/Admin/Controllers/RefundController.php @@ -15,7 +15,11 @@ class RefundController extends Controller */ public function searchAction() { + $refundService = new RefundService(); + $statusTypes = $refundService->getStatusTypes(); + + $this->view->setVar('status_types', $statusTypes); } /** diff --git a/app/Http/Admin/Controllers/StudentController.php b/app/Http/Admin/Controllers/StudentController.php index 9b2707fb..e72a01a3 100644 --- a/app/Http/Admin/Controllers/StudentController.php +++ b/app/Http/Admin/Controllers/StudentController.php @@ -15,7 +15,11 @@ class StudentController extends Controller */ public function searchAction() { + $studentService = new StudentService(); + $sourceTypes = $studentService->getSourceTypes(); + + $this->view->setVar('source_types', $sourceTypes); } /** diff --git a/app/Http/Admin/Controllers/TopicController.php b/app/Http/Admin/Controllers/TopicController.php index 02d08f30..087580e7 100644 --- a/app/Http/Admin/Controllers/TopicController.php +++ b/app/Http/Admin/Controllers/TopicController.php @@ -22,6 +22,14 @@ class TopicController extends Controller $this->view->setVar('pager', $pager); } + /** + * @Get("/search", name="admin.topic.search") + */ + public function searchAction() + { + + } + /** * @Get("/add", name="admin.topic.add") */ diff --git a/app/Http/Admin/Controllers/TradeController.php b/app/Http/Admin/Controllers/TradeController.php index b4781320..2600351f 100644 --- a/app/Http/Admin/Controllers/TradeController.php +++ b/app/Http/Admin/Controllers/TradeController.php @@ -15,7 +15,13 @@ class TradeController extends Controller */ public function searchAction() { + $tradeService = new TradeService(); + $channelTypes = $tradeService->getChannelTypes(); + $statusTypes = $tradeService->getStatusTypes(); + + $this->view->setVar('channel_types', $channelTypes); + $this->view->setVar('status_types', $statusTypes); } /** diff --git a/app/Http/Admin/Controllers/UserController.php b/app/Http/Admin/Controllers/UserController.php index d1482164..5d106768 100644 --- a/app/Http/Admin/Controllers/UserController.php +++ b/app/Http/Admin/Controllers/UserController.php @@ -18,9 +18,11 @@ class UserController extends Controller { $userService = new UserService(); - $roles = $userService->getRoles(); + $eduRoleTypes = $userService->getEduRoleTypes(); + $adminRoles = $userService->getAdminRoles(); - $this->view->setVar('roles', $roles); + $this->view->setVar('edu_role_types', $eduRoleTypes); + $this->view->setVar('admin_roles', $adminRoles); } /** @@ -42,9 +44,9 @@ class UserController extends Controller { $userService = new UserService(); - $roles = $userService->getRoles(); + $adminRoles = $userService->getAdminRoles(); - $this->view->setVar('roles', $roles); + $this->view->setVar('admin_roles', $adminRoles); } /** @@ -81,7 +83,7 @@ class UserController extends Controller $user = $userService->getUser($id); $account = $userService->getAccount($id); - $roles = $userService->getRoles(); + $adminRoles = $userService->getAdminRoles(); if ($user->admin_role == RoleModel::ROLE_ROOT) { $this->response->redirect(['for' => 'admin.user.list']); @@ -89,7 +91,7 @@ class UserController extends Controller $this->view->setVar('user', $user); $this->view->setVar('account', $account); - $this->view->setVar('roles', $roles); + $this->view->setVar('admin_roles', $adminRoles); } /** diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 374aa629..a0978c90 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -149,6 +149,12 @@ class AuthNode extends Service 'type' => 'menu', 'route' => 'admin.topic.list', ], + [ + 'id' => '1-4-5', + 'title' => '搜索话题', + 'type' => 'menu', + 'route' => 'admin.topic.search', + ], [ 'id' => '1-4-2', 'title' => '添加话题', @@ -349,31 +355,31 @@ class AuthNode extends Service 'id' => '2-4-1', 'title' => '群组列表', 'type' => 'menu', - 'route' => 'admin.group.list', + 'route' => 'admin.im_group.list', ], [ 'id' => '2-4-2', 'title' => '搜索群组', 'type' => 'menu', - 'route' => 'admin.group.search', + 'route' => 'admin.im_group.search', ], [ 'id' => '2-4-3', 'title' => '添加群组', 'type' => 'menu', - 'route' => 'admin.group.add', + 'route' => 'admin.im_group.add', ], [ 'id' => '2-4-4', 'title' => '编辑群组', 'type' => 'button', - 'route' => 'admin.group.edit', + 'route' => 'admin.im_group.edit', ], [ 'id' => '2-4-5', 'title' => '删除群组', 'type' => 'button', - 'route' => 'admin.group.delete', + 'route' => 'admin.im_group.delete', ], ], ], @@ -493,6 +499,12 @@ class AuthNode extends Service 'type' => 'menu', 'route' => 'admin.point_redeem.list', ], + [ + 'id' => '2-8-6', + 'title' => '积分记录', + 'type' => 'menu', + 'route' => 'admin.point_history.list', + ], [ 'id' => '2-8-3', 'title' => '添加礼品', diff --git a/app/Http/Admin/Services/Course.php b/app/Http/Admin/Services/Course.php index 1767f553..1768f428 100644 --- a/app/Http/Admin/Services/Course.php +++ b/app/Http/Admin/Services/Course.php @@ -232,6 +232,16 @@ class Course extends Service return $course; } + public function getModelTypes() + { + return CourseModel::modelTypes(); + } + + public function getLevelTypes() + { + return CourseModel::levelTypes(); + } + public function getStudyExpiryOptions() { return CourseModel::studyExpiryOptions(); diff --git a/app/Http/Admin/Services/ImGroup.php b/app/Http/Admin/Services/ImGroup.php index a24cd560..9f4af997 100644 --- a/app/Http/Admin/Services/ImGroup.php +++ b/app/Http/Admin/Services/ImGroup.php @@ -14,6 +14,11 @@ use App\Validators\ImGroup as ImGroupValidator; class ImGroup extends Service { + public function getGroupTypes() + { + return ImGroupModel::types(); + } + public function getGroups() { $pagerQuery = new PagerQuery(); diff --git a/app/Http/Admin/Services/Order.php b/app/Http/Admin/Services/Order.php index d43adf42..05ebb525 100644 --- a/app/Http/Admin/Services/Order.php +++ b/app/Http/Admin/Services/Order.php @@ -4,6 +4,7 @@ namespace App\Http\Admin\Services; use App\Builders\OrderList as OrderListBuilder; use App\Library\Paginator\Query as PaginateQuery; +use App\Models\Order as OrderModel; use App\Repos\Account as AccountRepo; use App\Repos\Order as OrderRepo; use App\Repos\User as UserRepo; @@ -12,6 +13,16 @@ use App\Validators\Order as OrderValidator; class Order extends Service { + public function getItemTypes() + { + return OrderModel::itemTypes(); + } + + public function getStatusTypes() + { + return OrderModel::statusTypes(); + } + public function getOrders() { $pageQuery = new PaginateQuery(); diff --git a/app/Http/Admin/Services/PointHistory.php b/app/Http/Admin/Services/PointHistory.php new file mode 100644 index 00000000..83b0bc99 --- /dev/null +++ b/app/Http/Admin/Services/PointHistory.php @@ -0,0 +1,32 @@ +getParams(); + + $sort = $pagerQuery->getSort(); + $page = $pagerQuery->getPage(); + $limit = $pagerQuery->getLimit(); + + $historyRepo = new PointHistoryRepo(); + + return $historyRepo->paginate($params, $sort, $page, $limit); + } + + public function getEventTypes() + { + return PointHistoryModel::eventTypes(); + } + +} \ No newline at end of file diff --git a/app/Http/Admin/Services/Refund.php b/app/Http/Admin/Services/Refund.php index 89efeb70..2617f4fa 100644 --- a/app/Http/Admin/Services/Refund.php +++ b/app/Http/Admin/Services/Refund.php @@ -16,6 +16,11 @@ use App\Validators\Refund as RefundValidator; class Refund extends Service { + public function getStatusTypes() + { + return RefundModel::statusTypes(); + } + public function getRefunds() { $pageQuery = new PaginateQuery(); diff --git a/app/Http/Admin/Services/Student.php b/app/Http/Admin/Services/Student.php index 9ecceade..2e8b9b4f 100644 --- a/app/Http/Admin/Services/Student.php +++ b/app/Http/Admin/Services/Student.php @@ -7,9 +7,11 @@ use App\Builders\LearningList as LearningListBuilder; use App\Library\Paginator\Query as PagerQuery; use App\Models\Course as CourseModel; use App\Models\CourseUser as CourseUserModel; +use App\Models\ImGroupUser as ImGroupUserModel; use App\Models\User as UserModel; use App\Repos\Course as CourseRepo; use App\Repos\CourseUser as CourseUserRepo; +use App\Repos\ImGroupUser as ImGroupUserRepo; use App\Repos\Learning as LearningRepo; use App\Repos\User as UserRepo; use App\Validators\CourseUser as CourseUserValidator; @@ -17,6 +19,11 @@ use App\Validators\CourseUser as CourseUserValidator; class Student extends Service { + public function getSourceTypes() + { + return CourseUserModel::sourceTypes(); + } + public function getCourse($id) { $repo = new CourseRepo(); @@ -100,9 +107,13 @@ class Student extends Service $courseUser->create($data); - $this->incrCourseUserCount($course); + $course->user_count += 1; + $course->update(); - $this->incrUserCourseCount($user); + $user->course_count += 1; + $user->update(); + + $this->handleImGroupUser($course, $user); return $courseUser; } @@ -126,18 +137,33 @@ class Student extends Service return $relation; } - protected function incrCourseUserCount(CourseModel $course) + protected function handleImGroupUser(CourseModel $course, UserModel $user) { - $course->user_count += 1; + $courseRepo = new CourseRepo(); - $course->update(); - } + $imGroup = $courseRepo->findImGroup($course->id); - protected function incrUserCourseCount(UserModel $user) - { - $user->course_count += 1; + $userRepo = new UserRepo(); - $user->update(); + $imUser = $userRepo->findImUser($user->id); + + $imGroupUserRepo = new ImGroupUserRepo(); + + $imGroupUser = $imGroupUserRepo->findGroupUser($imGroup->id, $user->id); + + if ($imGroupUser) return; + + $imGroupUser = new ImGroupUserModel(); + + $imGroupUser->group_id = $imGroup->id; + $imGroupUser->user_id = $imUser->id; + $imGroupUser->create(); + + $imUser->group_count += 1; + $imUser->update(); + + $imGroup->user_count += 1; + $imGroup->update(); } protected function findOrFail($id) diff --git a/app/Http/Admin/Services/Trade.php b/app/Http/Admin/Services/Trade.php index 7205ce6c..9b818a81 100644 --- a/app/Http/Admin/Services/Trade.php +++ b/app/Http/Admin/Services/Trade.php @@ -5,6 +5,7 @@ namespace App\Http\Admin\Services; use App\Builders\TradeList as TradeListBuilder; use App\Library\Paginator\Query as PaginateQuery; use App\Models\Refund as RefundModel; +use App\Models\Trade as TradeModel; use App\Repos\Account as AccountRepo; use App\Repos\Order as OrderRepo; use App\Repos\Trade as TradeRepo; @@ -14,6 +15,16 @@ use App\Validators\Trade as TradeValidator; class Trade extends Service { + public function getChannelTypes() + { + return TradeModel::channelTypes(); + } + + public function getStatusTypes() + { + return TradeModel::statusTypes(); + } + public function getTrades() { $pageQuery = new PaginateQuery(); diff --git a/app/Http/Admin/Services/User.php b/app/Http/Admin/Services/User.php index 91d2a06c..539fcb32 100644 --- a/app/Http/Admin/Services/User.php +++ b/app/Http/Admin/Services/User.php @@ -18,7 +18,12 @@ use App\Validators\User as UserValidator; class User extends Service { - public function getRoles() + public function getEduRoleTypes() + { + return UserModel::eduRoleTypes(); + } + + public function getAdminRoles() { $roleRepo = new RoleRepo(); diff --git a/app/Http/Admin/Views/audit/list.volt b/app/Http/Admin/Views/audit/list.volt index 6c43fbb5..b1b739d7 100644 --- a/app/Http/Admin/Views/audit/list.volt +++ b/app/Http/Admin/Views/audit/list.volt @@ -2,12 +2,19 @@ {% block content %} + {% set search_url = url({'for':'admin.audit.search'}) %} +