diff --git a/CHANGELOG.md b/CHANGELOG.md index c6d330de..3fbb9684 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +### [v1.3.9](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.9)(2021-07-24) + +### 更新 + +- 修正分类下无课程时会查询出所有课程问题 +- 修正sitemap中的部分路径问题 +- 修正课程套餐相关问题 +- 优化问答部分相关逻辑 +- 优化评论部分相关逻辑 +- 优化浏览器Title显示 +- 优化审核和举报相关逻辑 +- 优化命令行脚本执行输出 +- 优化API的分页返回结构 +- 增加文章,问答,评论相关API +- 增加重新统计tag中相关计数计划任务 +- 增加tag的使用范围,文章,问题,课程计数 +- 站点logo和favicon使用随机文件名 +- 增加评价审核 +- 去除编辑器中的酷瓜云课堂标识 +- 清理数据迁移文件 + ### [v1.3.8](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.8)(2021-07-11) ### 更新 diff --git a/README.md b/README.md index 0367f964..377dd248 100644 --- a/README.md +++ b/README.md @@ -64,9 +64,9 @@ Tips: 请用手机注册一个新账号,用户中心 -> 关注订阅,扫码 ### 项目文档 -- [运行环境搭建](https://gitee.com/koogua/course-tencent-cloud/wikis) -- [系统服务配置](https://gitee.com/koogua/course-tencent-cloud/wikis) -- [客户终端配置](https://gitee.com/koogua/course-tencent-cloud/wikis) +- [运行环境搭建](https://koogua.com/page/wiki) +- [系统服务配置](https://koogua.com/page/wiki) +- [客户终端配置](https://koogua.com/page/wiki) ### 意见反馈 diff --git a/app/Builders/CategoryTreeList.php b/app/Builders/CategoryTreeList.php index 7c8866a0..ab23e991 100644 --- a/app/Builders/CategoryTreeList.php +++ b/app/Builders/CategoryTreeList.php @@ -28,6 +28,8 @@ class CategoryTreeList extends Builder $list[] = [ 'id' => $category->id, 'name' => $category->name, + 'alias' => $category->alias, + 'icon' => $category->icon, 'children' => $this->handleChildren($category), ]; } @@ -49,6 +51,8 @@ class CategoryTreeList extends Builder $list[] = [ 'id' => $category->id, 'name' => $category->name, + 'alias' => $category->alias, + 'icon' => $category->icon, ]; } diff --git a/app/Console/Tasks/CleanLogTask.php b/app/Console/Tasks/CleanLogTask.php index 43cea2a4..2a874bf6 100644 --- a/app/Console/Tasks/CleanLogTask.php +++ b/app/Console/Tasks/CleanLogTask.php @@ -314,9 +314,9 @@ class CleanLogTask extends Task if (strtotime($today) - strtotime($date) >= $keepDays * 86400) { $deleted = unlink($file); if ($deleted) { - echo "delete {$file} success" . PHP_EOL; + echo "------ delete {$file} success ------" . PHP_EOL; } else { - echo "delete {$file} failed" . PHP_EOL; + echo "------ delete {$file} failed -------" . PHP_EOL; } } } diff --git a/app/Console/Tasks/CloseFlashSaleOrderTask.php b/app/Console/Tasks/CloseFlashSaleOrderTask.php index 77f54385..e51da67c 100644 --- a/app/Console/Tasks/CloseFlashSaleOrderTask.php +++ b/app/Console/Tasks/CloseFlashSaleOrderTask.php @@ -20,14 +20,20 @@ class CloseFlashSaleOrderTask extends Task { $orders = $this->findOrders(); + echo sprintf('pending orders: %s', $orders->count()) . PHP_EOL; + if ($orders->count() == 0) return; + echo '------ start close order task ------' . PHP_EOL; + foreach ($orders as $order) { $this->pushFlashSaleQueue($order->promotion_id); $this->deleteUserOrderCache($order->owner_id, $order->promotion_id); $order->status = OrderModel::STATUS_CLOSED; $order->update(); } + + echo '------ end close order task ------' . PHP_EOL; } protected function pushFlashSaleQueue($saleId) diff --git a/app/Console/Tasks/CloseOrderTask.php b/app/Console/Tasks/CloseOrderTask.php index f74433e9..f56c9077 100644 --- a/app/Console/Tasks/CloseOrderTask.php +++ b/app/Console/Tasks/CloseOrderTask.php @@ -18,12 +18,18 @@ class CloseOrderTask extends Task { $orders = $this->findOrders(); + echo sprintf('pending orders: %s', $orders->count()) . PHP_EOL; + if ($orders->count() == 0) return; + echo '------ start close order task ------' . PHP_EOL; + foreach ($orders as $order) { $order->status = OrderModel::STATUS_CLOSED; $order->update(); } + + echo '------ end close order task ------' . PHP_EOL; } /** diff --git a/app/Console/Tasks/CloseQuestionTask.php b/app/Console/Tasks/CloseQuestionTask.php new file mode 100644 index 00000000..34867713 --- /dev/null +++ b/app/Console/Tasks/CloseQuestionTask.php @@ -0,0 +1,52 @@ +findQuestions(); + + echo sprintf('pending questions: %s', $questions->count()) . PHP_EOL; + + if ($questions->count() == 0) return; + + echo '------ start close question task ------' . PHP_EOL; + + foreach ($questions as $question) { + $question->closed = 1; + $question->update(); + } + + echo '------ end close question task ------' . PHP_EOL; + } + + /** + * 查找待关闭问题 + * + * @param int $limit + * @return ResultsetInterface|Resultset|QuestionModel[] + */ + protected function findQuestions($limit = 1000) + { + $time = time() - 7 * 86400; + + return QuestionModel::query() + ->where('create_time < :time:', ['time' => $time]) + ->andWhere('answer_count = 0') + ->limit($limit) + ->execute(); + } + +} diff --git a/app/Console/Tasks/CloseTradeTask.php b/app/Console/Tasks/CloseTradeTask.php index de276cf3..4d35ba2c 100644 --- a/app/Console/Tasks/CloseTradeTask.php +++ b/app/Console/Tasks/CloseTradeTask.php @@ -20,8 +20,12 @@ class CloseTradeTask extends Task { $trades = $this->findTrades(); + echo sprintf('pending trades: %s', $trades->count()) . PHP_EOL; + if ($trades->count() == 0) return; + echo '------ start close trade ------' . PHP_EOL; + foreach ($trades as $trade) { if ($trade->channel == TradeModel::CHANNEL_ALIPAY) { $this->handleAlipayTrade($trade); @@ -29,6 +33,8 @@ class CloseTradeTask extends Task $this->handleWxpayTrade($trade); } } + + echo '------ end close trade ------' . PHP_EOL; } /** diff --git a/app/Console/Tasks/DeliverTask.php b/app/Console/Tasks/DeliverTask.php index 55d796a5..11b28b80 100644 --- a/app/Console/Tasks/DeliverTask.php +++ b/app/Console/Tasks/DeliverTask.php @@ -33,8 +33,12 @@ class DeliverTask extends Task $tasks = $this->findTasks(30); + echo sprintf('pending tasks: %s', $tasks->count()) . PHP_EOL; + if ($tasks->count() == 0) return; + echo '------ start deliver task ------' . PHP_EOL; + $orderRepo = new OrderRepo(); foreach ($tasks as $task) { @@ -107,6 +111,8 @@ class DeliverTask extends Task $this->handleOrderRefund($order); } } + + echo '------ end deliver task ------' . PHP_EOL; } protected function handleCourseOrder(OrderModel $order) diff --git a/app/Console/Tasks/OptimizeTableTask.php b/app/Console/Tasks/OptimizeTableTask.php index 603f5626..97f3e2ac 100644 --- a/app/Console/Tasks/OptimizeTableTask.php +++ b/app/Console/Tasks/OptimizeTableTask.php @@ -31,11 +31,20 @@ class OptimizeTableTask extends Task $tableName = $sessionModel->getSource(); + if (UserSessionModel::count() < 1000000) { + echo sprintf('no need to optimize table: %s', $tableName) . PHP_EOL; + return; + } + + echo sprintf('------ start optimize table: %s ------', $tableName) . PHP_EOL; + $this->db->delete($tableName, 'expire_time < :expire_time', [ 'expire_time' => strtotime('-3 days'), ]); $this->db->execute("OPTIMIZE TABLE {$tableName}"); + + echo sprintf('------ end optimize table: %s ------', $tableName) . PHP_EOL; } protected function optimizeUserTokenTable() @@ -44,63 +53,87 @@ class OptimizeTableTask extends Task $tableName = $tokenModel->getSource(); + if (UserTokenModel::count() < 1000000) { + echo sprintf('no need to optimize table: %s', $tableName) . PHP_EOL; + return; + } + + echo sprintf('------ start optimize table: %s ------', $tableName) . PHP_EOL; + $this->db->delete($tableName, 'expire_time < :expire_time', [ 'expire_time' => strtotime('-3 days'), ]); $this->db->execute("OPTIMIZE TABLE {$tableName}"); + + echo sprintf('------ end optimize table: %s ------', $tableName) . PHP_EOL; } protected function optimizeImMessageTable() { - $count = ImMessageModel::count(); - - if ($count < 1000000) return; - $messageModel = new ImMessageModel(); $tableName = $messageModel->getSource(); + if (ImMessageModel::count() < 1000000) { + echo sprintf('no need to optimize table: %s', $tableName) . PHP_EOL; + return; + } + + echo sprintf('------ start optimize table: %s ------', $tableName) . PHP_EOL; + $this->db->delete($tableName, 'create_time < :create_time', [ 'create_time' => strtotime('-6 months'), ]); $this->db->execute("OPTIMIZE TABLE {$tableName}"); + + echo sprintf('------ end optimize table: %s ------', $tableName) . PHP_EOL; } protected function optimizeLearningTable() { - $count = LearningModel::count(); - - if ($count < 1000000) return; - $learningModel = new LearningModel(); $tableName = $learningModel->getSource(); + if (LearningModel::count() < 1000000) { + echo sprintf('no need to optimize table: %s', $tableName) . PHP_EOL; + return; + } + + echo sprintf('------ start optimize table: %s ------', $tableName) . PHP_EOL; + $this->db->delete($tableName, 'create_time < :create_time', [ 'create_time' => strtotime('-6 months'), ]); $this->db->execute("OPTIMIZE TABLE {$tableName}"); + + echo sprintf('------ end optimize table: %s ------', $tableName) . PHP_EOL; } protected function optimizeTaskTable() { - $count = TaskModel::count(); - - if ($count < 1000000) return; - $taskModel = new TaskModel(); $tableName = $taskModel->getSource(); + if (TaskModel::count() < 1000000) { + echo sprintf('no need to optimize table: %s', $tableName) . PHP_EOL; + return; + } + + echo sprintf('------ start optimize table: %s ------', $tableName) . PHP_EOL; + $this->db->delete($tableName, 'create_time < :create_time AND status > :status', [ 'create_time' => strtotime('-6 months'), 'status' => TaskModel::STATUS_PENDING, ]); $this->db->execute("OPTIMIZE TABLE {$tableName}"); + + echo sprintf('------ end optimize table: %s ------', $tableName) . PHP_EOL; } } \ No newline at end of file diff --git a/app/Console/Tasks/PointGiftDeliverTask.php b/app/Console/Tasks/PointGiftDeliverTask.php index beb1c6aa..946945a2 100644 --- a/app/Console/Tasks/PointGiftDeliverTask.php +++ b/app/Console/Tasks/PointGiftDeliverTask.php @@ -32,8 +32,12 @@ class PointGiftDeliverTask extends Task $tasks = $this->findTasks(30); + echo sprintf('pending tasks: %s', $tasks->count()) . PHP_EOL; + if ($tasks->count() == 0) return; + echo '------ start deliver task ------' . PHP_EOL; + $redeemRepo = new PointRedeemRepo(); foreach ($tasks as $task) { @@ -94,6 +98,8 @@ class PointGiftDeliverTask extends Task $this->handlePointRefund($redeem); } } + + echo '------ end deliver task ------' . PHP_EOL; } protected function handleCourseRedeem(PointRedeemModel $redeem) diff --git a/app/Console/Tasks/RefundTask.php b/app/Console/Tasks/RefundTask.php index d9c4fab7..53386a5a 100644 --- a/app/Console/Tasks/RefundTask.php +++ b/app/Console/Tasks/RefundTask.php @@ -33,8 +33,12 @@ class RefundTask extends Task $tasks = $this->findTasks(30); + echo sprintf('pending tasks: %s', $tasks->count()) . PHP_EOL; + if ($tasks->count() == 0) return; + echo '------ start refund task ------' . PHP_EOL; + $tradeRepo = new TradeRepo(); $orderRepo = new OrderRepo(); $refundRepo = new RefundRepo(); @@ -115,6 +119,8 @@ class RefundTask extends Task $refund->update(); } } + + echo '------ end refund task ------' . PHP_EOL; } /** diff --git a/app/Console/Tasks/RevokeVipTask.php b/app/Console/Tasks/RevokeVipTask.php index d92a5677..d562dce0 100644 --- a/app/Console/Tasks/RevokeVipTask.php +++ b/app/Console/Tasks/RevokeVipTask.php @@ -18,14 +18,18 @@ class RevokeVipTask extends Task { $users = $this->findUsers(); - if ($users->count() == 0) { - return; - } + echo sprintf('pending users: %s', $users->count()) . PHP_EOL; + + if ($users->count() == 0) return; + + echo '------ start revoke vip task ------' . PHP_EOL; foreach ($users as $user) { $user->vip = 0; $user->update(); } + + echo '------ end revoke vip task ------' . PHP_EOL; } /** diff --git a/app/Console/Tasks/SitemapTask.php b/app/Console/Tasks/SitemapTask.php index 19499d58..8d7767e2 100644 --- a/app/Console/Tasks/SitemapTask.php +++ b/app/Console/Tasks/SitemapTask.php @@ -202,12 +202,11 @@ class SitemapTask extends Task protected function addOthers() { - $this->sitemap->addItem('/course/list', 0.6); - $this->sitemap->addItem('/im/group/list', 0.6); - $this->sitemap->addItem('/teacher/list', 0.6); - $this->sitemap->addItem('/vip', 0.6); - $this->sitemap->addItem('/help', 0.6); - $this->sitemap->addItem('/search', 0.6); + $this->sitemap->addItem("{$this->siteUrl}/course/list", 0.6); + $this->sitemap->addItem("{$this->siteUrl}/im/group/list", 0.6); + $this->sitemap->addItem("{$this->siteUrl}/teacher/list", 0.6); + $this->sitemap->addItem("{$this->siteUrl}/vip", 0.6); + $this->sitemap->addItem("{$this->siteUrl}/help", 0.6); } } diff --git a/app/Console/Tasks/SyncAppInfoTask.php b/app/Console/Tasks/SyncAppInfoTask.php new file mode 100644 index 00000000..7e118ed9 --- /dev/null +++ b/app/Console/Tasks/SyncAppInfoTask.php @@ -0,0 +1,42 @@ +getSettings('site'); + + $serverHost = parse_url($site['url'], PHP_URL_HOST); + + $serverIp = gethostbyname($serverHost); + + $appInfo = new AppInfo(); + + $params = [ + 'server_host' => $serverHost, + 'server_ip' => $serverIp, + 'app_name' => $appInfo->get('name'), + 'app_alias' => $appInfo->get('alias'), + 'app_version' => $appInfo->get('version'), + 'app_link' => $appInfo->get('link'), + ]; + + $client = new Client(); + + $client->request('POST', $url, ['form_params' => $params]); + } + +} diff --git a/app/Console/Tasks/SyncTagCountTask.php b/app/Console/Tasks/SyncTagCountTask.php new file mode 100644 index 00000000..e8147ce8 --- /dev/null +++ b/app/Console/Tasks/SyncTagCountTask.php @@ -0,0 +1,52 @@ +findTags(); + + echo sprintf('pending tags: %s', $tags->count()) . PHP_EOL; + + if ($tags->count() == 0) return; + + echo '------ start recount task ------' . PHP_EOL; + + foreach ($tags as $tag) { + $this->recountTaggedItems($tag); + } + + echo '------ end recount task ------' . PHP_EOL; + } + + protected function recountTaggedItems(TagModel $tag) + { + $tagRepo = new TagRepo(); + + $tag->follow_count = $tagRepo->countFollows($tag->id); + $tag->course_count = $tagRepo->countCourses($tag->id); + $tag->article_count = $tagRepo->countArticles($tag->id); + $tag->question_count = $tagRepo->countQuestions($tag->id); + + $tag->update(); + } + + protected function findTags() + { + return TagModel::query() + ->where('published = 1') + ->execute(); + } + +} diff --git a/app/Console/Tasks/UnlockUserTask.php b/app/Console/Tasks/UnlockUserTask.php index 4dc41589..037712ca 100644 --- a/app/Console/Tasks/UnlockUserTask.php +++ b/app/Console/Tasks/UnlockUserTask.php @@ -18,11 +18,17 @@ class UnlockUserTask extends Task { $users = $this->findUsers(); + echo sprintf('pending users: %s', $users->count()) . PHP_EOL; + if ($users->count() == 0) return; + echo '------ start unlock user task ------' . PHP_EOL; + foreach ($users as $user) { $user->update(['locked' => 0]); } + + echo '------ end unlock user task ------' . PHP_EOL; } /** diff --git a/app/Console/Tasks/UpgradeTask.php b/app/Console/Tasks/UpgradeTask.php index b199b03e..47533f97 100644 --- a/app/Console/Tasks/UpgradeTask.php +++ b/app/Console/Tasks/UpgradeTask.php @@ -9,6 +9,7 @@ namespace App\Console\Tasks; use App\Caches\NavTreeList as NavTreeListCache; use App\Caches\Setting as SettingCache; +use App\Caches\AppInfo as AppInfoCache; use App\Models\Setting as SettingModel; class UpgradeTask extends Task @@ -16,6 +17,7 @@ class UpgradeTask extends Task public function mainAction() { + $this->resetAppInfoAction(); $this->resetSettingAction(); $this->resetAnnotationAction(); $this->resetMetadataAction(); @@ -23,6 +25,22 @@ class UpgradeTask extends Task $this->resetNavAction(); } + /** + * 重置应用信息 + * + * @command: php console.php upgrade reset_app_info + */ + public function resetAppInfoAction() + { + echo '------ start reset app info ------' . PHP_EOL; + + $cache = new AppInfoCache(); + + $cache->rebuild(); + + echo '------ end reset app info ------' . PHP_EOL; + } + /** * 重置系统设置 * diff --git a/app/Http/Admin/Controllers/AnswerController.php b/app/Http/Admin/Controllers/AnswerController.php index 5da8b8de..0e1a1fec 100644 --- a/app/Http/Admin/Controllers/AnswerController.php +++ b/app/Http/Admin/Controllers/AnswerController.php @@ -164,15 +164,15 @@ class AnswerController extends Controller } /** - * @Route("/{id:[0-9]+}/publish/review", name="admin.answer.publish_review") + * @Route("/{id:[0-9]+}/moderate", name="admin.answer.moderate") */ - public function publishReviewAction($id) + public function moderateAction($id) { $answerService = new AnswerService(); if ($this->request->isPost()) { - $answerService->publishReview($id); + $answerService->moderate($id); $location = $this->url->get(['for' => 'admin.mod.answers']); @@ -187,27 +187,26 @@ class AnswerController extends Controller $reasons = $answerService->getReasons(); $answer = $answerService->getAnswerInfo($id); - $this->view->pick('answer/publish_review'); $this->view->setVar('reasons', $reasons); $this->view->setVar('answer', $answer); } /** - * @Route("/{id:[0-9]+}/report/review", name="admin.answer.report_review") + * @Route("/{id:[0-9]+}/report", name="admin.answer.report") */ - public function reportReviewAction($id) + public function reportAction($id) { $answerService = new AnswerService(); if ($this->request->isPost()) { - $answerService->reportReview($id); + $answerService->report($id); $location = $this->url->get(['for' => 'admin.report.answers']); $content = [ 'location' => $location, - 'msg' => '审核举报成功', + 'msg' => '处理举报成功', ]; return $this->jsonSuccess($content); @@ -216,7 +215,6 @@ class AnswerController extends Controller $answer = $answerService->getAnswerInfo($id); $reports = $answerService->getReports($id); - $this->view->pick('answer/report_review'); $this->view->setVar('answer', $answer); $this->view->setVar('reports', $reports); } diff --git a/app/Http/Admin/Controllers/ArticleController.php b/app/Http/Admin/Controllers/ArticleController.php index 7cfb7298..cc832423 100644 --- a/app/Http/Admin/Controllers/ArticleController.php +++ b/app/Http/Admin/Controllers/ArticleController.php @@ -174,15 +174,15 @@ class ArticleController extends Controller } /** - * @Route("/{id:[0-9]+}/publish/review", name="admin.article.publish_review") + * @Route("/{id:[0-9]+}/moderate", name="admin.article.moderate") */ - public function publishReviewAction($id) + public function moderateAction($id) { $articleService = new ArticleService(); if ($this->request->isPost()) { - $articleService->publishReview($id); + $articleService->moderate($id); $location = $this->url->get(['for' => 'admin.mod.articles']); @@ -197,27 +197,26 @@ class ArticleController extends Controller $reasons = $articleService->getReasons(); $article = $articleService->getArticleInfo($id); - $this->view->pick('article/publish_review'); $this->view->setVar('reasons', $reasons); $this->view->setVar('article', $article); } /** - * @Route("/{id:[0-9]+}/report/review", name="admin.article.report_review") + * @Route("/{id:[0-9]+}/report", name="admin.article.report") */ - public function reportReviewAction($id) + public function reportAction($id) { $articleService = new ArticleService(); if ($this->request->isPost()) { - $articleService->reportReview($id); + $articleService->report($id); $location = $this->url->get(['for' => 'admin.report.articles']); $content = [ 'location' => $location, - 'msg' => '审核举报成功', + 'msg' => '处理举报成功', ]; return $this->jsonSuccess($content); @@ -226,7 +225,6 @@ class ArticleController extends Controller $article = $articleService->getArticleInfo($id); $reports = $articleService->getReports($id); - $this->view->pick('article/report_review'); $this->view->setVar('reports', $reports); $this->view->setVar('article', $article); } diff --git a/app/Http/Admin/Controllers/CommentController.php b/app/Http/Admin/Controllers/CommentController.php index 0ba876c5..ec0ad6b0 100644 --- a/app/Http/Admin/Controllers/CommentController.php +++ b/app/Http/Admin/Controllers/CommentController.php @@ -84,21 +84,21 @@ class CommentController extends Controller } /** - * @Route("/{id:[0-9]+}/publish/review", name="admin.comment.publish_review") + * @Route("/{id:[0-9]+}/moderate", name="admin.comment.moderate") */ - public function publishReviewAction($id) + public function moderateAction($id) { $commentService = new CommentService(); if ($this->request->isPost()) { - $commentService->publishReview($id); + $commentService->moderate($id); $location = $this->url->get(['for' => 'admin.mod.comments']); $content = [ 'location' => $location, - 'msg' => '审核回答成功', + 'msg' => '审核评论成功', ]; return $this->jsonSuccess($content); @@ -107,27 +107,26 @@ class CommentController extends Controller $reasons = $commentService->getReasons(); $comment = $commentService->getCommentInfo($id); - $this->view->pick('comment/publish_review'); $this->view->setVar('reasons', $reasons); $this->view->setVar('comment', $comment); } /** - * @Route("/{id:[0-9]+}/report/review", name="admin.comment.report_review") + * @Route("/{id:[0-9]+}/report", name="admin.comment.report") */ - public function reportReviewAction($id) + public function reportAction($id) { $commentService = new CommentService(); if ($this->request->isPost()) { - $commentService->reportReview($id); + $commentService->report($id); $location = $this->url->get(['for' => 'admin.report.comments']); $content = [ 'location' => $location, - 'msg' => '审核举报成功', + 'msg' => '处理举报成功', ]; return $this->jsonSuccess($content); @@ -136,7 +135,6 @@ class CommentController extends Controller $comment = $commentService->getCommentInfo($id); $reports = $commentService->getReports($id); - $this->view->pick('comment/report_review'); $this->view->setVar('comment', $comment); $this->view->setVar('reports', $reports); } diff --git a/app/Http/Admin/Controllers/ModerationController.php b/app/Http/Admin/Controllers/ModerationController.php index 15fb74cb..597db5da 100644 --- a/app/Http/Admin/Controllers/ModerationController.php +++ b/app/Http/Admin/Controllers/ModerationController.php @@ -15,6 +15,18 @@ use App\Http\Admin\Services\Moderation as ModerationService; class ModerationController extends Controller { + /** + * @Get("/reviews", name="admin.mod.reviews") + */ + public function reviewsAction() + { + $modService = new ModerationService(); + + $pager = $modService->getReviews(); + + $this->view->setVar('pager', $pager); + } + /** * @Get("/articles", name="admin.mod.articles") */ diff --git a/app/Http/Admin/Controllers/QuestionController.php b/app/Http/Admin/Controllers/QuestionController.php index 03197127..4f28ed16 100644 --- a/app/Http/Admin/Controllers/QuestionController.php +++ b/app/Http/Admin/Controllers/QuestionController.php @@ -170,15 +170,15 @@ class QuestionController extends Controller } /** - * @Route("/{id:[0-9]+}/publish/review", name="admin.question.publish_review") + * @Route("/{id:[0-9]+}/moderate", name="admin.question.moderate") */ - public function publishReviewAction($id) + public function moderateAction($id) { $questionService = new QuestionService(); if ($this->request->isPost()) { - $questionService->publishReview($id); + $questionService->moderate($id); $location = $this->url->get(['for' => 'admin.mod.questions']); @@ -193,27 +193,26 @@ class QuestionController extends Controller $reasons = $questionService->getReasons(); $question = $questionService->getQuestionInfo($id); - $this->view->pick('question/publish_review'); $this->view->setVar('reasons', $reasons); $this->view->setVar('question', $question); } /** - * @Route("/{id:[0-9]+}/report/review", name="admin.question.report_review") + * @Route("/{id:[0-9]+}/report", name="admin.question.report") */ - public function reportReviewAction($id) + public function reportAction($id) { $questionService = new QuestionService(); if ($this->request->isPost()) { - $questionService->reportReview($id); + $questionService->report($id); $location = $this->url->get(['for' => 'admin.report.questions']); $content = [ 'location' => $location, - 'msg' => '审核举报成功', + 'msg' => '处理举报成功', ]; return $this->jsonSuccess($content); @@ -222,7 +221,6 @@ class QuestionController extends Controller $question = $questionService->getQuestionInfo($id); $reports = $questionService->getReports($id); - $this->view->pick('question/report_review'); $this->view->setVar('question', $question); $this->view->setVar('reports', $reports); } diff --git a/app/Http/Admin/Controllers/ReviewController.php b/app/Http/Admin/Controllers/ReviewController.php index 07c17933..b76c569e 100644 --- a/app/Http/Admin/Controllers/ReviewController.php +++ b/app/Http/Admin/Controllers/ReviewController.php @@ -20,7 +20,11 @@ class ReviewController extends Controller */ public function searchAction() { + $reviewService = new ReviewService(); + $publishTypes = $reviewService->getPublishTypes(); + + $this->view->setVar('publish_types', $publishTypes); } /** @@ -110,4 +114,30 @@ class ReviewController extends Controller return $this->jsonSuccess($content); } + /** + * @Route("/{id:[0-9]+}/moderate", name="admin.review.moderate") + */ + public function moderateAction($id) + { + $reviewService = new ReviewService(); + + if ($this->request->isPost()) { + + $reviewService->moderate($id); + + $location = $this->url->get(['for' => 'admin.mod.reviews']); + + $content = [ + 'location' => $location, + 'msg' => '审核评价成功', + ]; + + return $this->jsonSuccess($content); + } + + $review = $reviewService->getReviewInfo($id); + + $this->view->setVar('review', $review); + } + } diff --git a/app/Http/Admin/Controllers/TagController.php b/app/Http/Admin/Controllers/TagController.php index 28aeb82c..9f74784d 100644 --- a/app/Http/Admin/Controllers/TagController.php +++ b/app/Http/Admin/Controllers/TagController.php @@ -51,11 +51,13 @@ class TagController extends Controller $tagService = new TagService; $tag2 = $tagService->getTag($id); + $scopeTypes = $tagService->getScopeTypes(); /** * 注意:"tag"变量被volt引擎内置占用,另取名字避免冲突 */ $this->view->setVar('tag2', $tag2); + $this->view->setVar('scope_types', $scopeTypes); } /** diff --git a/app/Http/Admin/Services/Answer.php b/app/Http/Admin/Services/Answer.php index e8a8833a..7a1cf0aa 100644 --- a/app/Http/Admin/Services/Answer.php +++ b/app/Http/Admin/Services/Answer.php @@ -100,22 +100,30 @@ class Answer extends Service $question = $validator->checkQuestion($post['question_id']); + $data = $this->handlePostData($post); + $answer = new AnswerModel(); - $answer->published = AnswerModel::PUBLISH_APPROVED; - $answer->client_type = $this->getClientType(); - $answer->client_ip = $this->getClientIp(); - $answer->content = $validator->checkContent($post['content']); - $answer->question_id = $question->id; - $answer->owner_id = $user->id; + $data['published'] = AnswerModel::PUBLISH_APPROVED; + $data['question_id'] = $question->id; + $data['owner_id'] = $user->id; - $answer->create(); + $answer->create($data); + + $question->last_answer_id = $answer->id; + $question->last_replier_id = $answer->owner_id; + $question->last_reply_time = $answer->create_time; + + $question->update(); $this->saveDynamicAttrs($answer); $this->recountQuestionAnswers($question); $this->recountUserAnswers($user); - $this->handleAnswerPostPoint($answer); - $this->handleQuestionAnsweredNotice($answer); + + if ($answer->owner_id != $question->owner_id) { + $this->handleAnswerPostPoint($answer); + $this->handleQuestionAnsweredNotice($answer); + } $this->eventsManager->fire('Answer:afterCreate', $this, $answer); @@ -199,7 +207,7 @@ class Answer extends Service return $answer; } - public function publishReview($id) + public function moderate($id) { $type = $this->request->getPost('type', ['trim', 'string']); $reason = $this->request->getPost('reason', ['trim', 'string']); @@ -229,7 +237,11 @@ class Answer extends Service if ($type == 'approve') { - $this->handleAnswerPostPoint($answer); + if ($answer->owner_id != $question->owner_id) { + $this->handleAnswerPostPoint($answer); + $this->handleQuestionAnsweredNotice($answer); + } + $this->handleAnswerApprovedNotice($answer, $sender); $this->eventsManager->fire('Answer:afterApprove', $this, $answer); @@ -250,7 +262,7 @@ class Answer extends Service return $answer; } - public function reportReview($id) + public function report($id) { $accepted = $this->request->getPost('accepted', 'int', 0); $deleted = $this->request->getPost('deleted', 'int', 0); diff --git a/app/Http/Admin/Services/Article.php b/app/Http/Admin/Services/Article.php index 23947463..e1855fdc 100644 --- a/app/Http/Admin/Services/Article.php +++ b/app/Http/Admin/Services/Article.php @@ -257,7 +257,7 @@ class Article extends Service return $article; } - public function publishReview($id) + public function moderate($id) { $type = $this->request->getPost('type', ['trim', 'string']); $reason = $this->request->getPost('reason', ['trim', 'string']); @@ -309,7 +309,7 @@ class Article extends Service return $article; } - public function reportReview($id) + public function report($id) { $accepted = $this->request->getPost('accepted', 'int', 0); $deleted = $this->request->getPost('deleted', 'int', 0); diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 51d0811b..a87fff5a 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -330,13 +330,13 @@ class AuthNode extends Service 'id' => '1-7-10', 'title' => '审核文章', 'type' => 'button', - 'route' => 'admin.article.publish_review', + 'route' => 'admin.article.moderate', ], [ 'id' => '1-7-11', 'title' => '审核举报', 'type' => 'button', - 'route' => 'admin.article.report_review', + 'route' => 'admin.article.report', ], ], ], @@ -385,13 +385,13 @@ class AuthNode extends Service 'id' => '1-10-10', 'title' => '审核问题', 'type' => 'button', - 'route' => 'admin.question.publish_review', + 'route' => 'admin.question.moderate', ], [ 'id' => '1-10-11', 'title' => '审核举报', 'type' => 'button', - 'route' => 'admin.question.report_review', + 'route' => 'admin.question.report', ], ], ], @@ -440,13 +440,13 @@ class AuthNode extends Service 'id' => '1-11-10', 'title' => '审核回答', 'type' => 'button', - 'route' => 'admin.answer.publish_review', + 'route' => 'admin.answer.moderate', ], [ 'id' => '1-11-11', 'title' => '审核举报', 'type' => 'button', - 'route' => 'admin.answer.report_review', + 'route' => 'admin.answer.report', ], ], ], @@ -483,13 +483,13 @@ class AuthNode extends Service 'id' => '1-9-5', 'title' => '评论审核', 'type' => 'button', - 'route' => 'admin.comment.publish_review', + 'route' => 'admin.comment.moderate', ], [ 'id' => '1-9-6', 'title' => '举报审核', 'type' => 'button', - 'route' => 'admin.comment.report_review', + 'route' => 'admin.comment.report', ], ], ], @@ -508,6 +508,12 @@ class AuthNode extends Service 'title' => '审核队列', 'type' => 'menu', 'children' => [ + [ + 'id' => '2-10-5', + 'title' => '评价审核', + 'type' => 'menu', + 'route' => 'admin.mod.reviews', + ], [ 'id' => '2-10-1', 'title' => '文章审核', @@ -656,6 +662,12 @@ class AuthNode extends Service 'type' => 'button', 'route' => 'admin.review.delete', ], + [ + 'id' => '2-3-5', + 'title' => '审核评价', + 'type' => 'button', + 'route' => 'admin.review.moderate', + ], ], ], [ diff --git a/app/Http/Admin/Services/Category.php b/app/Http/Admin/Services/Category.php index 2185ad52..e5750e6c 100644 --- a/app/Http/Admin/Services/Category.php +++ b/app/Http/Admin/Services/Category.php @@ -115,6 +115,10 @@ class Category extends Service $data['name'] = $validator->checkName($post['name']); } + if (isset($post['icon'])) { + $data['icon'] = $validator->checkIcon($post['icon']); + } + if (isset($post['priority'])) { $data['priority'] = $validator->checkPriority($post['priority']); } diff --git a/app/Http/Admin/Services/Comment.php b/app/Http/Admin/Services/Comment.php index c3bc2aa5..b97f29cd 100644 --- a/app/Http/Admin/Services/Comment.php +++ b/app/Http/Admin/Services/Comment.php @@ -15,12 +15,18 @@ use App\Models\Reason as ReasonModel; use App\Models\Report as ReportModel; use App\Repos\Comment as CommentRepo; use App\Repos\Report as ReportRepo; +use App\Repos\User as UserRepo; +use App\Services\Logic\Comment\AfterCreateTrait; use App\Services\Logic\Comment\CommentInfo as CommentInfoService; +use App\Services\Logic\Comment\CountTrait; use App\Validators\Comment as CommentValidator; class Comment extends Service { + use AfterCreateTrait; + use CountTrait; + public function getReasons() { return ReasonModel::commentRejectOptions(); @@ -99,27 +105,57 @@ class Comment extends Service public function deleteComment($id) { - $page = $this->findOrFail($id); + $comment = $this->findOrFail($id); - $page->deleted = 1; + $comment->deleted = 1; - $page->update(); + $comment->update(); - return $page; + $validator = new CommentValidator(); + + if ($comment->parent_id > 0) { + $parent = $validator->checkParent($comment->parent_id); + $this->decrCommentReplyCount($parent); + } + + $item = $validator->checkItem($comment->item_id, $comment->item_type); + + $this->decrItemCommentCount($item); + + $owner = $this->findUser($comment->owner_id); + + $this->decrUserCommentCount($owner); + + return $comment; } public function restoreComment($id) { - $page = $this->findOrFail($id); + $comment = $this->findOrFail($id); - $page->deleted = 0; + $comment->deleted = 0; - $page->update(); + $comment->update(); - return $page; + $validator = new CommentValidator(); + + if ($comment->parent_id > 0) { + $parent = $validator->checkParent($comment->parent_id); + $this->incrCommentReplyCount($parent); + } + + $item = $validator->checkItem($comment->item_id, $comment->item_type); + + $this->incrItemCommentCount($item); + + $owner = $this->findUser($comment->owner_id); + + $this->incrUserCommentCount($owner); + + return $comment; } - public function publishReview($id) + public function moderate($id) { $type = $this->request->getPost('type', ['trim', 'string']); $reason = $this->request->getPost('reason', ['trim', 'string']); @@ -143,6 +179,25 @@ class Comment extends Service if ($type == 'approve') { + $owner = $this->findUser($comment->owner_id); + + $item = $validator->checkItem($comment->item_id, $comment->item_type); + + $this->incrItemCommentCount($item); + $this->incrUserCommentCount($owner); + + if ($comment->parent_id == 0) { + $this->handleItemCommentedNotice($item, $comment); + } + + if ($comment->parent_id > 0) { + $parent = $validator->checkParent($comment->parent_id); + $this->incrCommentReplyCount($parent); + $this->handleCommentRepliedNotice($comment); + } + + $this->handleCommentPostPoint($comment); + $this->eventsManager->fire('Comment:afterApprove', $this, $comment); } elseif ($type == 'reject') { @@ -153,7 +208,7 @@ class Comment extends Service return $comment; } - public function reportReview($id) + public function report($id) { $accepted = $this->request->getPost('accepted', 'int', 0); $deleted = $this->request->getPost('deleted', 'int', 0); @@ -188,6 +243,13 @@ class Comment extends Service return $validator->checkComment($id); } + protected function findUser($id) + { + $userRepo = new UserRepo(); + + return $userRepo->findById($id); + } + protected function handleComments($pager) { if ($pager->total_items > 0) { diff --git a/app/Http/Admin/Services/Index.php b/app/Http/Admin/Services/Index.php index b9d5bae3..7228290d 100644 --- a/app/Http/Admin/Services/Index.php +++ b/app/Http/Admin/Services/Index.php @@ -40,7 +40,7 @@ class Index extends Service $appInfo = new AppInfo(); - if ($appInfo->version != $content['version']) { + if (empty($content) || $appInfo->get('version') != $content['version']) { $cache->rebuild(); } @@ -79,12 +79,14 @@ class Index extends Service { $statRepo = new StatRepo(); + $reviewCount = $statRepo->countPendingReviews(); $articleCount = $statRepo->countPendingArticles(); $questionCount = $statRepo->countPendingQuestions(); $answerCount = $statRepo->countPendingAnswers(); $commentCount = $statRepo->countPendingComments(); return [ + 'review_count' => $reviewCount, 'article_count' => $articleCount, 'question_count' => $questionCount, 'answer_count' => $answerCount, @@ -111,7 +113,7 @@ class Index extends Service public function getReleases() { - $url = 'https://koogua.com/api-releases.json'; + $url = 'https://koogua.com/api/releases'; $client = new Client(); diff --git a/app/Http/Admin/Services/Moderation.php b/app/Http/Admin/Services/Moderation.php index a6bc7b42..b9f64501 100644 --- a/app/Http/Admin/Services/Moderation.php +++ b/app/Http/Admin/Services/Moderation.php @@ -10,19 +10,42 @@ namespace App\Http\Admin\Services; use App\Builders\AnswerList as AnswerListBuilder; use App\Builders\ArticleList as ArticleListBuilder; use App\Builders\QuestionList as QuestionListBuilder; +use App\Builders\ReviewList as ReviewListBuilder; use App\Library\Paginator\Query as PagerQuery; use App\Models\Answer as AnswerModel; use App\Models\Article as ArticleModel; use App\Models\Comment as CommentModel; use App\Models\Question as QuestionModel; +use App\Models\Review as ReviewModel; use App\Repos\Answer as AnswerRepo; use App\Repos\Article as ArticleRepo; use App\Repos\Comment as CommentRepo; use App\Repos\Question as QuestionRepo; +use App\Repos\Review as ReviewRepo; class Moderation extends Service { + public function getReviews() + { + $pagerQuery = new PagerQuery(); + + $params = $pagerQuery->getParams(); + + $params['published'] = ReviewModel::PUBLISH_PENDING; + $params['deleted'] = 0; + + $sort = $pagerQuery->getSort(); + $page = $pagerQuery->getPage(); + $limit = $pagerQuery->getLimit(); + + $reviewRepo = new ReviewRepo(); + + $pager = $reviewRepo->paginate($params, $sort, $page, $limit); + + return $this->handleReviews($pager); + } + public function getArticles() { $pagerQuery = new PagerQuery(); @@ -103,6 +126,23 @@ class Moderation extends Service return $this->handleComments($pager); } + protected function handleReviews($pager) + { + if ($pager->total_items > 0) { + + $builder = new ReviewListBuilder(); + + $pipeA = $pager->items->toArray(); + $pipeB = $builder->handleCourses($pipeA); + $pipeC = $builder->handleUsers($pipeB); + $pipeD = $builder->objects($pipeC); + + $pager->items = $pipeD; + } + + return $pager; + } + protected function handleArticles($pager) { if ($pager->total_items > 0) { diff --git a/app/Http/Admin/Services/Package.php b/app/Http/Admin/Services/Package.php index 28a6af93..e8ce12c4 100644 --- a/app/Http/Admin/Services/Package.php +++ b/app/Http/Admin/Services/Package.php @@ -150,8 +150,8 @@ class Package extends Service $package->update($data); + $this->handlePackagedCourses($package); $this->updatePackageCourseCount($package); - $this->rebuildPackageCache($package); return $package; @@ -165,6 +165,7 @@ class Package extends Service $package->update(); + $this->handlePackagedCourses($package); $this->rebuildPackageCache($package); return $package; @@ -178,6 +179,7 @@ class Package extends Service $package->update(); + $this->handlePackagedCourses($package); $this->rebuildPackageCache($package); return $package; @@ -225,6 +227,20 @@ class Package extends Service } } + protected function handlePackagedCourses(PackageModel $package) + { + $packageRepo = new PackageRepo(); + + $courses = $packageRepo->findCourses($package->id); + + if ($courses->count() == 0) return; + + foreach ($courses as $course) { + $this->rebuildCoursePackageCache($course); + $this->recountCoursePackages($course); + } + } + protected function updatePackageCourseCount(PackageModel $package) { $packageRepo = new PackageRepo(); @@ -260,11 +276,20 @@ class Package extends Service $cache->rebuild($package->id); } - protected function rebuildCoursePackageCache($courseId) + protected function rebuildCoursePackageCache(CourseModel $course) { $cache = new CoursePackageListCache(); - $cache->rebuild($courseId); + $cache->rebuild($course->id); + } + + protected function recountCoursePackages(CourseModel $course) + { + $courseRepo = new CourseRepo(); + + $course->package_count = $courseRepo->countPackages($course->id); + + $course->update(); } protected function findOrFail($id) diff --git a/app/Http/Admin/Services/Question.php b/app/Http/Admin/Services/Question.php index abbd8f1b..58c8386c 100644 --- a/app/Http/Admin/Services/Question.php +++ b/app/Http/Admin/Services/Question.php @@ -237,7 +237,7 @@ class Question extends Service return $question; } - public function publishReview($id) + public function moderate($id) { $type = $this->request->getPost('type', ['trim', 'string']); $reason = $this->request->getPost('reason', ['trim', 'string']); @@ -285,7 +285,7 @@ class Question extends Service return $question; } - public function reportReview($id) + public function report($id) { $accepted = $this->request->getPost('accepted', 'int', 0); $deleted = $this->request->getPost('deleted', 'int', 0); diff --git a/app/Http/Admin/Services/Resource.php b/app/Http/Admin/Services/Resource.php index a68e2bd8..d64319bc 100644 --- a/app/Http/Admin/Services/Resource.php +++ b/app/Http/Admin/Services/Resource.php @@ -7,8 +7,12 @@ namespace App\Http\Admin\Services; +use App\Models\Chapter as ChapterModel; +use App\Models\Course as CourseModel; use App\Models\Resource as ResourceModel; use App\Models\Upload as UploadModel; +use App\Repos\Chapter as ChapterRepo; +use App\Repos\Course as CourseRepo; use App\Repos\Upload as UploadRepo; use App\Services\Storage as StorageService; use App\Validators\Chapter as ChapterValidator; @@ -25,7 +29,6 @@ class Resource extends Service $validator = new ChapterValidator(); $chapter = $validator->checkChapter($post['chapter_id']); - $course = $validator->checkCourse($chapter->course_id); $uploadRepo = new UploadRepo(); @@ -54,11 +57,8 @@ class Resource extends Service $resource->create(); - $chapter->resource_count += 1; - $chapter->update(); - - $course->resource_count += 1; - $course->update(); + $this->recountChapterResources($chapter); + $this->recountCourseResources($course); return $upload; } @@ -103,15 +103,8 @@ class Resource extends Service $resource->delete(); - if ($course->resource_count > 1) { - $course->resource_count -= 1; - $course->update(); - } - - if ($chapter->resource_count > 1) { - $chapter->resource_count -= 1; - $chapter->update(); - } + $this->recountChapterResources($chapter); + $this->recountCourseResources($course); } protected function findOrFail($id) @@ -121,4 +114,22 @@ class Resource extends Service return $validator->checkResource($id); } + protected function recountChapterResources(ChapterModel $chapter) + { + $chapterRepo = new ChapterRepo(); + + $chapter->resource_count = $chapterRepo->countResources($chapter->id); + + $chapter->update(); + } + + protected function recountCourseResources(CourseModel $course) + { + $courseRepo = new CourseRepo(); + + $course->resource_count = $courseRepo->countResources($course->id); + + $course->update(); + } + } diff --git a/app/Http/Admin/Services/Review.php b/app/Http/Admin/Services/Review.php index 9f030dda..14bc5aa7 100644 --- a/app/Http/Admin/Services/Review.php +++ b/app/Http/Admin/Services/Review.php @@ -10,14 +10,21 @@ namespace App\Http\Admin\Services; use App\Builders\ReviewList as ReviewListBuilder; use App\Library\Paginator\Query as PagerQuery; use App\Models\Course as CourseModel; +use App\Models\Review as ReviewModel; use App\Repos\Course as CourseRepo; use App\Repos\Review as ReviewRepo; use App\Services\CourseStat as CourseStatService; +use App\Services\Logic\Review\ReviewInfo as ReviewInfoService; use App\Validators\Review as ReviewValidator; class Review extends Service { + public function getPublishTypes() + { + return ReviewModel::publishTypes(); + } + public function getReviews() { $pagerQuery = new PagerQuery(); @@ -49,6 +56,13 @@ class Review extends Service return $this->findOrFail($id); } + public function getReviewInfo($id) + { + $service = new ReviewInfoService(); + + return $service->handle($id); + } + public function updateReview($id) { $review = $this->findOrFail($id); @@ -86,6 +100,8 @@ class Review extends Service $this->updateCourseRating($course); + $this->eventsManager->fire('Review:afterUpdate', $this, $review); + return $review; } @@ -100,6 +116,8 @@ class Review extends Service $course = $this->findCourse($review->course_id); $this->recountCourseReviews($course); + + $this->eventsManager->fire('Review:afterReview', $this, $review); } public function restoreReview($id) @@ -113,6 +131,35 @@ class Review extends Service $course = $this->findCourse($review->course_id); $this->recountCourseReviews($course); + + $this->eventsManager->fire('Review:afterRestore', $this, $review); + } + + public function moderate($id) + { + $type = $this->request->getPost('type', ['trim', 'string']); + + $review = $this->findOrFail($id); + + if ($type == 'approve') { + $review->published = ReviewModel::PUBLISH_APPROVED; + } elseif ($type == 'reject') { + $review->published = ReviewModel::PUBLISH_REJECTED; + } + + $review->update(); + + $course = $this->findCourse($review->course_id); + + $this->recountCourseReviews($course); + + if ($type == 'approve') { + $this->eventsManager->fire('Review:afterApprove', $this, $review); + } elseif ($type == 'reject') { + $this->eventsManager->fire('Review:afterReject', $this, $review); + } + + return $review; } protected function findOrFail($id) diff --git a/app/Http/Admin/Services/Tag.php b/app/Http/Admin/Services/Tag.php index 5317f8b3..e54fd5d7 100644 --- a/app/Http/Admin/Services/Tag.php +++ b/app/Http/Admin/Services/Tag.php @@ -16,6 +16,11 @@ use App\Validators\Tag as TagValidator; class Tag extends Service { + public function getScopeTypes() + { + return TagModel::scopeTypes(); + } + public function getTags() { $pagerQuery = new PagerQuery(); @@ -84,6 +89,14 @@ class Tag extends Service $data['published'] = $validator->checkPublishStatus($post['published']); } + if (isset($post['scope_type'])) { + if ($post['scope_type'] == 'all') { + $data['scopes'] = 'all'; + }else { + $data['scopes'] = $post['scopes'] ?? []; + } + } + $tag->update($data); $this->rebuildTagCache($tag); diff --git a/app/Http/Admin/Views/answer/list.volt b/app/Http/Admin/Views/answer/list.volt index 113b3510..bb4393a7 100644 --- a/app/Http/Admin/Views/answer/list.volt +++ b/app/Http/Admin/Views/answer/list.volt @@ -44,7 +44,7 @@ {% set edit_url = url({'for':'admin.answer.edit','id':item.id}) %} {% set delete_url = url({'for':'admin.answer.delete','id':item.id}) %} {% set restore_url = url({'for':'admin.answer.restore','id':item.id}) %} - {% set review_url = url({'for':'admin.answer.publish_review','id':item.id}) %} + {% set review_url = url({'for':'admin.answer.moderate','id':item.id}) %}