mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-24 12:05:39 +08:00
Merge branch 'koogua/v1.3.5'
This commit is contained in:
commit
5597be84b2
16
CHANGELOG.md
16
CHANGELOG.md
@ -1,3 +1,19 @@
|
||||
### [v1.3.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.5)(2021-05-20)
|
||||
|
||||
### 更新
|
||||
|
||||
- 更新演示数据
|
||||
- 优化安装脚本install.sh
|
||||
- 升级脚本upgrade.sh中加入更新导航缓存
|
||||
- 撰写文章和提问markdown编辑器通栏显示
|
||||
- 完善文章和问题的浏览权限
|
||||
- 优化通用ajax表单提交
|
||||
- 文章,提问,回答点赞作者有提醒和积分奖励
|
||||
- 前台增加针对回答的预览访问地址
|
||||
- 前台增加文章,问题,回答,评论加入举报功能
|
||||
- 后台增加文章,问题,回答,评论的举报审核功能
|
||||
- 后台首页增加审核队列统计
|
||||
|
||||
### [v1.3.4](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.4)(2021-05-13)
|
||||
|
||||
### 更新
|
||||
|
@ -1,6 +1,6 @@
|
||||
## 酷瓜云课堂
|
||||
|
||||

|
||||

|
||||
|
||||
### 项目介绍
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
|
||||
### 系统功能
|
||||
|
||||
实现了点播、直播、专栏、面授、会员、群组、积分、秒杀等,全功能无阉割,100%真开源在线教育解决方案。
|
||||
实现了点播、直播、专栏、面授、问答、会员、群组、积分、秒杀等,100%真开源在线教育解决方案。
|
||||
|
||||
友情提示:
|
||||
|
||||
|
41
app/Builders/ReportList.php
Normal file
41
app/Builders/ReportList.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace App\Builders;
|
||||
|
||||
use App\Repos\User as UserRepo;
|
||||
|
||||
class ReportList extends Builder
|
||||
{
|
||||
|
||||
public function handleUsers(array $reports)
|
||||
{
|
||||
$users = $this->getUsers($reports);
|
||||
|
||||
foreach ($reports as $key => $report) {
|
||||
$reports[$key]['owner'] = $users[$report['owner_id']] ?? new \stdClass();
|
||||
}
|
||||
|
||||
return $reports;
|
||||
}
|
||||
|
||||
public function getUsers(array $reports)
|
||||
{
|
||||
$ids = kg_array_column($reports, 'owner_id');
|
||||
|
||||
$userRepo = new UserRepo();
|
||||
|
||||
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar']);
|
||||
|
||||
$baseUrl = kg_cos_url();
|
||||
|
||||
$result = [];
|
||||
|
||||
foreach ($users->toArray() as $user) {
|
||||
$user['avatar'] = $baseUrl . $user['avatar'];
|
||||
$result[$user['id']] = $user;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
}
|
@ -22,13 +22,18 @@ class UserDailyCounter extends Counter
|
||||
public function getContent($id = null)
|
||||
{
|
||||
return [
|
||||
'danmu_count' => 0,
|
||||
'article_count' => 0,
|
||||
'question_count' => 0,
|
||||
'answer_count' => 0,
|
||||
'comment_count' => 0,
|
||||
'consult_count' => 0,
|
||||
'order_count' => 0,
|
||||
'chapter_like_count' => 0,
|
||||
'consult_like_count' => 0,
|
||||
'review_like_count' => 0,
|
||||
'article_like_count' => 0,
|
||||
'question_like_count' => 0,
|
||||
'answer_like_count' => 0,
|
||||
'comment_like_count' => 0,
|
||||
];
|
||||
}
|
||||
|
@ -46,10 +46,7 @@ class AnswerController extends Controller
|
||||
|
||||
$question = $questionService->getQuestion($id);
|
||||
|
||||
$referer = $this->request->getHTTPReferer();
|
||||
|
||||
$this->view->setVar('question', $question);
|
||||
$this->view->setVar('referer', $referer);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -65,9 +62,6 @@ class AnswerController extends Controller
|
||||
|
||||
$question = $questionService->getQuestion($answer->question_id);
|
||||
|
||||
$referer = $this->request->getHTTPReferer();
|
||||
|
||||
$this->view->setVar('referer', $referer);
|
||||
$this->view->setVar('question', $question);
|
||||
$this->view->setVar('answer', $answer);
|
||||
}
|
||||
@ -165,15 +159,15 @@ class AnswerController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id:[0-9]+}/review", name="admin.answer.review")
|
||||
* @Route("/{id:[0-9]+}/publish/review", name="admin.answer.publish_review")
|
||||
*/
|
||||
public function reviewAction($id)
|
||||
public function publishReviewAction($id)
|
||||
{
|
||||
$answerService = new AnswerService();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$answerService->reviewAnswer($id);
|
||||
$answerService->publishReview($id);
|
||||
|
||||
$location = $this->url->get(['for' => 'admin.mod.answers']);
|
||||
|
||||
@ -188,8 +182,38 @@ 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")
|
||||
*/
|
||||
public function reportReviewAction($id)
|
||||
{
|
||||
$answerService = new AnswerService();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$answerService->reportReview($id);
|
||||
|
||||
$location = $this->url->get(['for' => 'admin.report.answers']);
|
||||
|
||||
$content = [
|
||||
'location' => $location,
|
||||
'msg' => '审核举报成功',
|
||||
];
|
||||
|
||||
return $this->jsonSuccess($content);
|
||||
}
|
||||
|
||||
$answer = $answerService->getAnswerInfo($id);
|
||||
$reports = $answerService->getReports($id);
|
||||
|
||||
$this->view->pick('answer/report_review');
|
||||
$this->view->setVar('answer', $answer);
|
||||
$this->view->setVar('reports', $reports);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -169,15 +169,15 @@ class ArticleController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id:[0-9]+}/review", name="admin.article.review")
|
||||
* @Route("/{id:[0-9]+}/publish/review", name="admin.article.publish_review")
|
||||
*/
|
||||
public function reviewAction($id)
|
||||
public function publishReviewAction($id)
|
||||
{
|
||||
$articleService = new ArticleService();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$articleService->reviewArticle($id);
|
||||
$articleService->publishReview($id);
|
||||
|
||||
$location = $this->url->get(['for' => 'admin.mod.articles']);
|
||||
|
||||
@ -192,8 +192,38 @@ 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")
|
||||
*/
|
||||
public function reportReviewAction($id)
|
||||
{
|
||||
$articleService = new ArticleService();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$articleService->reportReview($id);
|
||||
|
||||
$location = $this->url->get(['for' => 'admin.report.articles']);
|
||||
|
||||
$content = [
|
||||
'location' => $location,
|
||||
'msg' => '审核举报成功',
|
||||
];
|
||||
|
||||
return $this->jsonSuccess($content);
|
||||
}
|
||||
|
||||
$article = $articleService->getArticleInfo($id);
|
||||
$reports = $articleService->getReports($id);
|
||||
|
||||
$this->view->pick('article/report_review');
|
||||
$this->view->setVar('reports', $reports);
|
||||
$this->view->setVar('article', $article);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -78,4 +78,62 @@ class CommentController extends Controller
|
||||
return $this->jsonSuccess($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id:[0-9]+}/publish/review", name="admin.comment.publish_review")
|
||||
*/
|
||||
public function publishReviewAction($id)
|
||||
{
|
||||
$commentService = new CommentService();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$commentService->publishReview($id);
|
||||
|
||||
$location = $this->url->get(['for' => 'admin.mod.comments']);
|
||||
|
||||
$content = [
|
||||
'location' => $location,
|
||||
'msg' => '审核回答成功',
|
||||
];
|
||||
|
||||
return $this->jsonSuccess($content);
|
||||
}
|
||||
|
||||
$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")
|
||||
*/
|
||||
public function reportReviewAction($id)
|
||||
{
|
||||
$commentService = new CommentService();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$commentService->reportReview($id);
|
||||
|
||||
$location = $this->url->get(['for' => 'admin.report.comments']);
|
||||
|
||||
$content = [
|
||||
'location' => $location,
|
||||
'msg' => '审核举报成功',
|
||||
];
|
||||
|
||||
return $this->jsonSuccess($content);
|
||||
}
|
||||
|
||||
$comment = $commentService->getCommentInfo($id);
|
||||
$reports = $commentService->getReports($id);
|
||||
|
||||
$this->view->pick('comment/report_review');
|
||||
$this->view->setVar('comment', $comment);
|
||||
$this->view->setVar('reports', $reports);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -38,11 +38,13 @@ class IndexController extends Controller
|
||||
$globalStat = $indexService->getGlobalStat();
|
||||
$todayStat = $indexService->getTodayStat();
|
||||
$modStat = $indexService->getModerationStat();
|
||||
$reportStat = $indexService->getReportStat();
|
||||
$appInfo = $indexService->getAppInfo();
|
||||
$serverInfo = $indexService->getServerInfo();
|
||||
|
||||
$this->view->setVar('global_stat', $globalStat);
|
||||
$this->view->setVar('today_stat', $todayStat);
|
||||
$this->view->setVar('report_stat', $reportStat);
|
||||
$this->view->setVar('mod_stat', $modStat);
|
||||
$this->view->setVar('app_info', $appInfo);
|
||||
$this->view->setVar('server_info', $serverInfo);
|
||||
|
@ -46,4 +46,16 @@ class ModerationController extends Controller
|
||||
$this->view->setVar('pager', $pager);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/comments", name="admin.mod.comments")
|
||||
*/
|
||||
public function commentsAction()
|
||||
{
|
||||
$modService = new ModerationService();
|
||||
|
||||
$pager = $modService->getComments();
|
||||
|
||||
$this->view->setVar('pager', $pager);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -165,15 +165,15 @@ class QuestionController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id:[0-9]+}/review", name="admin.question.review")
|
||||
* @Route("/{id:[0-9]+}/publish/review", name="admin.question.publish_review")
|
||||
*/
|
||||
public function reviewAction($id)
|
||||
public function publishReviewAction($id)
|
||||
{
|
||||
$questionService = new QuestionService();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$questionService->reviewQuestion($id);
|
||||
$questionService->publishReview($id);
|
||||
|
||||
$location = $this->url->get(['for' => 'admin.mod.questions']);
|
||||
|
||||
@ -188,8 +188,38 @@ 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")
|
||||
*/
|
||||
public function reportReviewAction($id)
|
||||
{
|
||||
$questionService = new QuestionService();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$questionService->reportReview($id);
|
||||
|
||||
$location = $this->url->get(['for' => 'admin.report.questions']);
|
||||
|
||||
$content = [
|
||||
'location' => $location,
|
||||
'msg' => '审核举报成功',
|
||||
];
|
||||
|
||||
return $this->jsonSuccess($content);
|
||||
}
|
||||
|
||||
$question = $questionService->getQuestionInfo($id);
|
||||
$reports = $questionService->getReports($id);
|
||||
|
||||
$this->view->pick('question/report_review');
|
||||
$this->view->setVar('question', $question);
|
||||
$this->view->setVar('reports', $reports);
|
||||
}
|
||||
|
||||
}
|
||||
|
61
app/Http/Admin/Controllers/ReportController.php
Normal file
61
app/Http/Admin/Controllers/ReportController.php
Normal file
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Admin\Controllers;
|
||||
|
||||
use App\Http\Admin\Services\Report as ReportService;
|
||||
|
||||
/**
|
||||
* @RoutePrefix("/admin/report")
|
||||
*/
|
||||
class ReportController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* @Get("/articles", name="admin.report.articles")
|
||||
*/
|
||||
public function articlesAction()
|
||||
{
|
||||
$reportService = new ReportService();
|
||||
|
||||
$pager = $reportService->getArticles();
|
||||
|
||||
$this->view->setVar('pager', $pager);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/questions", name="admin.report.questions")
|
||||
*/
|
||||
public function questionsAction()
|
||||
{
|
||||
$reportService = new ReportService();
|
||||
|
||||
$pager = $reportService->getQuestions();
|
||||
|
||||
$this->view->setVar('pager', $pager);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/answers", name="admin.report.answers")
|
||||
*/
|
||||
public function answersAction()
|
||||
{
|
||||
$reportService = new ReportService();
|
||||
|
||||
$pager = $reportService->getAnswers();
|
||||
|
||||
$this->view->setVar('pager', $pager);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/comments", name="admin.report.comments")
|
||||
*/
|
||||
public function commentsAction()
|
||||
{
|
||||
$reportService = new ReportService();
|
||||
|
||||
$pager = $reportService->getComments();
|
||||
|
||||
$this->view->setVar('pager', $pager);
|
||||
}
|
||||
|
||||
}
|
@ -3,13 +3,16 @@
|
||||
namespace App\Http\Admin\Services;
|
||||
|
||||
use App\Builders\AnswerList as AnswerListBuilder;
|
||||
use App\Builders\ReportList as ReportListBuilder;
|
||||
use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Models\Answer as AnswerModel;
|
||||
use App\Models\Question as QuestionModel;
|
||||
use App\Models\Reason as ReasonModel;
|
||||
use App\Models\Report as ReportModel;
|
||||
use App\Models\User as UserModel;
|
||||
use App\Repos\Answer as AnswerRepo;
|
||||
use App\Repos\Question as QuestionRepo;
|
||||
use App\Repos\Report as ReportRepo;
|
||||
use App\Repos\User as UserRepo;
|
||||
use App\Services\Logic\Answer\AnswerInfo as AnswerInfoService;
|
||||
use App\Services\Logic\Notice\System\AnswerApproved as AnswerApprovedNotice;
|
||||
@ -62,6 +65,23 @@ class Answer extends Service
|
||||
return $service->handle($id);
|
||||
}
|
||||
|
||||
public function getReports($id)
|
||||
{
|
||||
$reportRepo = new ReportRepo();
|
||||
|
||||
$where = [
|
||||
'item_id' => $id,
|
||||
'item_type' => ReportModel::ITEM_ANSWER,
|
||||
'reviewed' => 0,
|
||||
];
|
||||
|
||||
$pager = $reportRepo->paginate($where);
|
||||
|
||||
$pager = $this->handleReports($pager);
|
||||
|
||||
return $pager->items;
|
||||
}
|
||||
|
||||
public function createAnswer()
|
||||
{
|
||||
$post = $this->request->getPost();
|
||||
@ -167,7 +187,7 @@ class Answer extends Service
|
||||
return $answer;
|
||||
}
|
||||
|
||||
public function reviewAnswer($id)
|
||||
public function publishReview($id)
|
||||
{
|
||||
$type = $this->request->getPost('type', ['trim', 'string']);
|
||||
$reason = $this->request->getPost('reason', ['trim', 'string']);
|
||||
@ -218,6 +238,42 @@ class Answer extends Service
|
||||
return $answer;
|
||||
}
|
||||
|
||||
public function reportReview($id)
|
||||
{
|
||||
$accepted = $this->request->getPost('accepted', 'int', 0);
|
||||
$deleted = $this->request->getPost('deleted', 'int', 0);
|
||||
|
||||
$answer = $this->findOrFail($id);
|
||||
|
||||
$reportRepo = new ReportRepo();
|
||||
|
||||
$reports = $reportRepo->findItemPendingReports($answer->id, ReportModel::ITEM_ANSWER);
|
||||
|
||||
if ($reports->count() > 0) {
|
||||
foreach ($reports as $report) {
|
||||
$report->accepted = $accepted;
|
||||
$report->reviewed = 1;
|
||||
$report->update();
|
||||
}
|
||||
}
|
||||
|
||||
$answer->report_count = 0;
|
||||
|
||||
if ($deleted == 1) {
|
||||
$answer->deleted = 1;
|
||||
}
|
||||
|
||||
$answer->update();
|
||||
|
||||
$question = $this->findQuestion($answer->question_id);
|
||||
|
||||
$this->recountQuestionAnswers($question);
|
||||
|
||||
$user = $this->findUser($answer->owner_id);
|
||||
|
||||
$this->recountUserAnswers($user);
|
||||
}
|
||||
|
||||
protected function findOrFail($id)
|
||||
{
|
||||
$validator = new AnswerValidator();
|
||||
@ -257,6 +313,23 @@ class Answer extends Service
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function handleReports($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
|
||||
$builder = new ReportListBuilder();
|
||||
|
||||
$items = $pager->items->toArray();
|
||||
|
||||
$pipeA = $builder->handleUsers($items);
|
||||
$pipeB = $builder->objects($pipeA);
|
||||
|
||||
$pager->items = $pipeB;
|
||||
}
|
||||
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function recountQuestionAnswers(QuestionModel $question)
|
||||
{
|
||||
$questionRepo = new QuestionRepo();
|
||||
|
@ -3,15 +3,18 @@
|
||||
namespace App\Http\Admin\Services;
|
||||
|
||||
use App\Builders\ArticleList as ArticleListBuilder;
|
||||
use App\Builders\ReportList as ReportListBuilder;
|
||||
use App\Caches\Article as ArticleCache;
|
||||
use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Library\Utils\Word as WordUtil;
|
||||
use App\Models\Article as ArticleModel;
|
||||
use App\Models\Category as CategoryModel;
|
||||
use App\Models\Reason as ReasonModel;
|
||||
use App\Models\Report as ReportModel;
|
||||
use App\Models\User as UserModel;
|
||||
use App\Repos\Article as ArticleRepo;
|
||||
use App\Repos\Category as CategoryRepo;
|
||||
use App\Repos\Report as ReportRepo;
|
||||
use App\Repos\Tag as TagRepo;
|
||||
use App\Repos\User as UserRepo;
|
||||
use App\Services\Logic\Article\ArticleDataTrait;
|
||||
@ -119,6 +122,23 @@ class Article extends Service
|
||||
return $service->handle($id);
|
||||
}
|
||||
|
||||
public function getReports($id)
|
||||
{
|
||||
$reportRepo = new ReportRepo();
|
||||
|
||||
$where = [
|
||||
'item_id' => $id,
|
||||
'item_type' => ReportModel::ITEM_ARTICLE,
|
||||
'reviewed' => 0,
|
||||
];
|
||||
|
||||
$pager = $reportRepo->paginate($where);
|
||||
|
||||
$pager = $this->handleReports($pager);
|
||||
|
||||
return $pager->items;
|
||||
}
|
||||
|
||||
public function createArticle()
|
||||
{
|
||||
$post = $this->request->getPost();
|
||||
@ -251,7 +271,7 @@ class Article extends Service
|
||||
return $article;
|
||||
}
|
||||
|
||||
public function reviewArticle($id)
|
||||
public function publishReview($id)
|
||||
{
|
||||
$type = $this->request->getPost('type', ['trim', 'string']);
|
||||
$reason = $this->request->getPost('reason', ['trim', 'string']);
|
||||
@ -282,12 +302,8 @@ class Article extends Service
|
||||
if ($type == 'approve') {
|
||||
|
||||
$this->rebuildArticleIndex($article);
|
||||
|
||||
$this->handlePostPoint($article);
|
||||
|
||||
$notice = new ArticleApprovedNotice();
|
||||
|
||||
$notice->handle($article, $sender);
|
||||
$this->handleArticlePostPoint($article);
|
||||
$this->handleArticleApprovedNotice($article, $sender);
|
||||
|
||||
$this->eventsManager->fire('Article:afterApprove', $this, $article);
|
||||
|
||||
@ -299,9 +315,7 @@ class Article extends Service
|
||||
$reason = $options[$reason];
|
||||
}
|
||||
|
||||
$notice = new ArticleRejectedNotice();
|
||||
|
||||
$notice->handle($article, $sender, $reason);
|
||||
$this->handleArticleRejectedNotice($article, $sender, $reason);
|
||||
|
||||
$this->eventsManager->fire('Article:afterReject', $this, $article);
|
||||
}
|
||||
@ -309,6 +323,34 @@ class Article extends Service
|
||||
return $article;
|
||||
}
|
||||
|
||||
public function reportReview($id)
|
||||
{
|
||||
$accepted = $this->request->getPost('accepted', 'int', 0);
|
||||
$deleted = $this->request->getPost('deleted', 'int', 0);
|
||||
|
||||
$article = $this->findOrFail($id);
|
||||
|
||||
$reportRepo = new ReportRepo();
|
||||
|
||||
$reports = $reportRepo->findItemPendingReports($article->id, ReportModel::ITEM_ARTICLE);
|
||||
|
||||
if ($reports->count() > 0) {
|
||||
foreach ($reports as $report) {
|
||||
$report->accepted = $accepted;
|
||||
$report->reviewed = 1;
|
||||
$report->update();
|
||||
}
|
||||
}
|
||||
|
||||
$article->report_count = 0;
|
||||
|
||||
if ($deleted == 1) {
|
||||
$article->deleted = 1;
|
||||
}
|
||||
|
||||
$article->update();
|
||||
}
|
||||
|
||||
protected function findOrFail($id)
|
||||
{
|
||||
$validator = new ArticleValidator();
|
||||
@ -342,6 +384,23 @@ class Article extends Service
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function handleReports($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
|
||||
$builder = new ReportListBuilder();
|
||||
|
||||
$items = $pager->items->toArray();
|
||||
|
||||
$pipeA = $builder->handleUsers($items);
|
||||
$pipeB = $builder->objects($pipeA);
|
||||
|
||||
$pager->items = $pipeB;
|
||||
}
|
||||
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function recountUserArticles(UserModel $user)
|
||||
{
|
||||
$userRepo = new UserRepo();
|
||||
@ -367,7 +426,7 @@ class Article extends Service
|
||||
$sync->addItem($article->id);
|
||||
}
|
||||
|
||||
protected function handlePostPoint(ArticleModel $article)
|
||||
protected function handleArticlePostPoint(ArticleModel $article)
|
||||
{
|
||||
if ($article->published != ArticleModel::PUBLISH_APPROVED) return;
|
||||
|
||||
@ -376,4 +435,18 @@ class Article extends Service
|
||||
$service->handle($article);
|
||||
}
|
||||
|
||||
protected function handleArticleApprovedNotice(ArticleModel $article, UserModel $sender)
|
||||
{
|
||||
$notice = new ArticleApprovedNotice();
|
||||
|
||||
$notice->handle($article, $sender);
|
||||
}
|
||||
|
||||
protected function handleArticleRejectedNotice(ArticleModel $article, UserModel $sender, $reason)
|
||||
{
|
||||
$notice = new ArticleRejectedNotice();
|
||||
|
||||
$notice->handle($article, $sender, $reason);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -325,7 +325,13 @@ class AuthNode extends Service
|
||||
'id' => '1-7-10',
|
||||
'title' => '审核文章',
|
||||
'type' => 'button',
|
||||
'route' => 'admin.article.review',
|
||||
'route' => 'admin.article.publish_review',
|
||||
],
|
||||
[
|
||||
'id' => '1-7-11',
|
||||
'title' => '审核举报',
|
||||
'type' => 'button',
|
||||
'route' => 'admin.article.report_review',
|
||||
],
|
||||
],
|
||||
],
|
||||
@ -374,7 +380,13 @@ class AuthNode extends Service
|
||||
'id' => '1-10-10',
|
||||
'title' => '审核问题',
|
||||
'type' => 'button',
|
||||
'route' => 'admin.question.review',
|
||||
'route' => 'admin.question.publish_review',
|
||||
],
|
||||
[
|
||||
'id' => '1-10-11',
|
||||
'title' => '审核举报',
|
||||
'type' => 'button',
|
||||
'route' => 'admin.question.report_review',
|
||||
],
|
||||
],
|
||||
],
|
||||
@ -423,7 +435,13 @@ class AuthNode extends Service
|
||||
'id' => '1-11-10',
|
||||
'title' => '审核回答',
|
||||
'type' => 'button',
|
||||
'route' => 'admin.answer.review',
|
||||
'route' => 'admin.answer.publish_review',
|
||||
],
|
||||
[
|
||||
'id' => '1-11-11',
|
||||
'title' => '审核举报',
|
||||
'type' => 'button',
|
||||
'route' => 'admin.answer.report_review',
|
||||
],
|
||||
],
|
||||
],
|
||||
@ -456,6 +474,18 @@ class AuthNode extends Service
|
||||
'type' => 'button',
|
||||
'route' => 'admin.comment.delete',
|
||||
],
|
||||
[
|
||||
'id' => '1-9-5',
|
||||
'title' => '评论审核',
|
||||
'type' => 'button',
|
||||
'route' => 'admin.comment.publish_review',
|
||||
],
|
||||
[
|
||||
'id' => '1-9-6',
|
||||
'title' => '举报审核',
|
||||
'type' => 'button',
|
||||
'route' => 'admin.comment.report_review',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
@ -491,6 +521,43 @@ class AuthNode extends Service
|
||||
'type' => 'menu',
|
||||
'route' => 'admin.mod.answers',
|
||||
],
|
||||
[
|
||||
'id' => '2-10-4',
|
||||
'title' => '评论审核',
|
||||
'type' => 'menu',
|
||||
'route' => 'admin.mod.comments',
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'id' => '2-10',
|
||||
'title' => '举报队列',
|
||||
'type' => 'menu',
|
||||
'children' => [
|
||||
[
|
||||
'id' => '2-11-1',
|
||||
'title' => '文章举报',
|
||||
'type' => 'menu',
|
||||
'route' => 'admin.report.articles',
|
||||
],
|
||||
[
|
||||
'id' => '2-11-2',
|
||||
'title' => '问题举报',
|
||||
'type' => 'menu',
|
||||
'route' => 'admin.report.questions',
|
||||
],
|
||||
[
|
||||
'id' => '2-11-3',
|
||||
'title' => '回答举报',
|
||||
'type' => 'menu',
|
||||
'route' => 'admin.report.answers',
|
||||
],
|
||||
[
|
||||
'id' => '2-11-4',
|
||||
'title' => '评论举报',
|
||||
'type' => 'menu',
|
||||
'route' => 'admin.report.comments',
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
|
@ -3,13 +3,24 @@
|
||||
namespace App\Http\Admin\Services;
|
||||
|
||||
use App\Builders\CommentList as CommentListBuilder;
|
||||
use App\Builders\ReportList as ReportListBuilder;
|
||||
use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Models\Comment as CommentModel;
|
||||
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\Services\Logic\Comment\CommentInfo as CommentInfoService;
|
||||
use App\Validators\Comment as CommentValidator;
|
||||
|
||||
class Comment extends Service
|
||||
{
|
||||
|
||||
public function getReasons()
|
||||
{
|
||||
return ReasonModel::commentRejectOptions();
|
||||
}
|
||||
|
||||
public function getComments()
|
||||
{
|
||||
$pagerQuery = new PagerQuery();
|
||||
@ -34,6 +45,30 @@ class Comment extends Service
|
||||
return $this->findOrFail($id);
|
||||
}
|
||||
|
||||
public function getCommentInfo($id)
|
||||
{
|
||||
$service = new CommentInfoService();
|
||||
|
||||
return $service->handle($id);
|
||||
}
|
||||
|
||||
public function getReports($id)
|
||||
{
|
||||
$reportRepo = new ReportRepo();
|
||||
|
||||
$where = [
|
||||
'item_id' => $id,
|
||||
'item_type' => ReportModel::ITEM_COMMENT,
|
||||
'reviewed' => 0,
|
||||
];
|
||||
|
||||
$pager = $reportRepo->paginate($where);
|
||||
|
||||
$pager = $this->handleReports($pager);
|
||||
|
||||
return $pager->items;
|
||||
}
|
||||
|
||||
public function updateComment($id)
|
||||
{
|
||||
$comment = $this->findOrFail($id);
|
||||
@ -79,6 +114,68 @@ class Comment extends Service
|
||||
return $page;
|
||||
}
|
||||
|
||||
public function publishReview($id)
|
||||
{
|
||||
$type = $this->request->getPost('type', ['trim', 'string']);
|
||||
$reason = $this->request->getPost('reason', ['trim', 'string']);
|
||||
|
||||
$comment = $this->findOrFail($id);
|
||||
|
||||
$validator = new CommentValidator();
|
||||
|
||||
if ($type == 'approve') {
|
||||
|
||||
$comment->published = CommentModel::PUBLISH_APPROVED;
|
||||
|
||||
} elseif ($type == 'reject') {
|
||||
|
||||
$validator->checkRejectReason($reason);
|
||||
|
||||
$comment->published = CommentModel::PUBLISH_REJECTED;
|
||||
}
|
||||
|
||||
$comment->update();
|
||||
|
||||
if ($type == 'approve') {
|
||||
|
||||
$this->eventsManager->fire('Comment:afterApprove', $this, $comment);
|
||||
|
||||
} elseif ($type == 'reject') {
|
||||
|
||||
$this->eventsManager->fire('Comment:afterReject', $this, $comment);
|
||||
}
|
||||
|
||||
return $comment;
|
||||
}
|
||||
|
||||
public function reportReview($id)
|
||||
{
|
||||
$accepted = $this->request->getPost('accepted', 'int', 0);
|
||||
$deleted = $this->request->getPost('deleted', 'int', 0);
|
||||
|
||||
$comment = $this->findOrFail($id);
|
||||
|
||||
$reportRepo = new ReportRepo();
|
||||
|
||||
$reports = $reportRepo->findItemPendingReports($comment->id, ReportModel::ITEM_COMMENT);
|
||||
|
||||
if ($reports->count() > 0) {
|
||||
foreach ($reports as $report) {
|
||||
$report->accepted = $accepted;
|
||||
$report->reviewed = 1;
|
||||
$report->update();
|
||||
}
|
||||
}
|
||||
|
||||
$comment->report_count = 0;
|
||||
|
||||
if ($deleted == 1) {
|
||||
$comment->deleted = 1;
|
||||
}
|
||||
|
||||
$comment->update();
|
||||
}
|
||||
|
||||
protected function findOrFail($id)
|
||||
{
|
||||
$validator = new CommentValidator();
|
||||
@ -102,4 +199,21 @@ class Comment extends Service
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function handleReports($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
|
||||
$builder = new ReportListBuilder();
|
||||
|
||||
$items = $pager->items->toArray();
|
||||
|
||||
$pipeA = $builder->handleUsers($items);
|
||||
$pipeB = $builder->objects($pipeA);
|
||||
|
||||
$pager->items = $pipeB;
|
||||
}
|
||||
|
||||
return $pager;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -71,6 +71,23 @@ class Index extends Service
|
||||
];
|
||||
}
|
||||
|
||||
public function getReportStat()
|
||||
{
|
||||
$statRepo = new StatRepo();
|
||||
|
||||
$articleCount = $statRepo->countReportedArticles();
|
||||
$questionCount = $statRepo->countReportedQuestions();
|
||||
$answerCount = $statRepo->countReportedAnswers();
|
||||
$commentCount = $statRepo->countReportedComments();
|
||||
|
||||
return [
|
||||
'article_count' => $articleCount,
|
||||
'question_count' => $questionCount,
|
||||
'answer_count' => $answerCount,
|
||||
'comment_count' => $commentCount,
|
||||
];
|
||||
}
|
||||
|
||||
public function getReleases()
|
||||
{
|
||||
$url = 'https://koogua.com/api-releases.json';
|
||||
|
@ -8,9 +8,11 @@ use App\Builders\QuestionList as QuestionListBuilder;
|
||||
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\Repos\Answer as AnswerRepo;
|
||||
use App\Repos\Article as ArticleRepo;
|
||||
use App\Repos\Comment as CommentRepo;
|
||||
use App\Repos\Question as QuestionRepo;
|
||||
|
||||
class Moderation extends Service
|
||||
@ -76,6 +78,26 @@ class Moderation extends Service
|
||||
return $this->handleAnswers($pager);
|
||||
}
|
||||
|
||||
public function getComments()
|
||||
{
|
||||
$pagerQuery = new PagerQuery();
|
||||
|
||||
$params = $pagerQuery->getParams();
|
||||
|
||||
$params['published'] = CommentModel::PUBLISH_PENDING;
|
||||
$params['deleted'] = 0;
|
||||
|
||||
$sort = $pagerQuery->getSort();
|
||||
$page = $pagerQuery->getPage();
|
||||
$limit = $pagerQuery->getLimit();
|
||||
|
||||
$commentRepo = new CommentRepo();
|
||||
|
||||
$pager = $commentRepo->paginate($params, $sort, $page, $limit);
|
||||
|
||||
return $this->handleComments($pager);
|
||||
}
|
||||
|
||||
protected function handleArticles($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
@ -132,4 +154,21 @@ class Moderation extends Service
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function handleComments($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
|
||||
$builder = new AnswerListBuilder();
|
||||
|
||||
$items = $pager->items->toArray();
|
||||
|
||||
$pipeA = $builder->handleUsers($items);
|
||||
$pipeB = $builder->objects($pipeA);
|
||||
|
||||
$pager->items = $pipeB;
|
||||
}
|
||||
|
||||
return $pager;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,14 +3,17 @@
|
||||
namespace App\Http\Admin\Services;
|
||||
|
||||
use App\Builders\QuestionList as QuestionListBuilder;
|
||||
use App\Builders\ReportList as ReportListBuilder;
|
||||
use App\Caches\Question as QuestionCache;
|
||||
use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Models\Category as CategoryModel;
|
||||
use App\Models\Question as QuestionModel;
|
||||
use App\Models\Reason as ReasonModel;
|
||||
use App\Models\Report as ReportModel;
|
||||
use App\Models\User as UserModel;
|
||||
use App\Repos\Category as CategoryRepo;
|
||||
use App\Repos\Question as QuestionRepo;
|
||||
use App\Repos\Report as ReportRepo;
|
||||
use App\Repos\Tag as TagRepo;
|
||||
use App\Repos\User as UserRepo;
|
||||
use App\Services\Logic\Notice\System\QuestionApproved as QuestionApprovedNotice;
|
||||
@ -113,6 +116,23 @@ class Question extends Service
|
||||
return $service->handle($id);
|
||||
}
|
||||
|
||||
public function getReports($id)
|
||||
{
|
||||
$reportRepo = new ReportRepo();
|
||||
|
||||
$where = [
|
||||
'item_id' => $id,
|
||||
'item_type' => ReportModel::ITEM_QUESTION,
|
||||
'reviewed' => 0,
|
||||
];
|
||||
|
||||
$pager = $reportRepo->paginate($where);
|
||||
|
||||
$pager = $this->handleReports($pager);
|
||||
|
||||
return $pager->items;
|
||||
}
|
||||
|
||||
public function createQuestion()
|
||||
{
|
||||
$post = $this->request->getPost();
|
||||
@ -233,7 +253,7 @@ class Question extends Service
|
||||
return $question;
|
||||
}
|
||||
|
||||
public function reviewQuestion($id)
|
||||
public function publishReview($id)
|
||||
{
|
||||
$type = $this->request->getPost('type', ['trim', 'string']);
|
||||
$reason = $this->request->getPost('reason', ['trim', 'string']);
|
||||
@ -260,12 +280,8 @@ class Question extends Service
|
||||
if ($type == 'approve') {
|
||||
|
||||
$this->rebuildQuestionIndex($question);
|
||||
|
||||
$this->handlePostPoint($question);
|
||||
|
||||
$notice = new QuestionApprovedNotice();
|
||||
|
||||
$notice->handle($question, $sender);
|
||||
$this->handleQuestionPostPoint($question);
|
||||
$this->handleQuestionApprovedNotice($question, $sender);
|
||||
|
||||
$this->eventsManager->fire('Question:afterApprove', $this, $question);
|
||||
|
||||
@ -277,9 +293,7 @@ class Question extends Service
|
||||
$reason = $options[$reason];
|
||||
}
|
||||
|
||||
$notice = new QuestionRejectedNotice();
|
||||
|
||||
$notice->handle($question, $sender, $reason);
|
||||
$this->handleQuestionRejectedNotice($question, $sender, $reason);
|
||||
|
||||
$this->eventsManager->fire('Question:afterReject', $this, $question);
|
||||
}
|
||||
@ -287,6 +301,34 @@ class Question extends Service
|
||||
return $question;
|
||||
}
|
||||
|
||||
public function reportReview($id)
|
||||
{
|
||||
$accepted = $this->request->getPost('accepted', 'int', 0);
|
||||
$deleted = $this->request->getPost('deleted', 'int', 0);
|
||||
|
||||
$question = $this->findOrFail($id);
|
||||
|
||||
$reportRepo = new ReportRepo();
|
||||
|
||||
$reports = $reportRepo->findItemPendingReports($question->id, ReportModel::ITEM_QUESTION);
|
||||
|
||||
if ($reports->count() > 0) {
|
||||
foreach ($reports as $report) {
|
||||
$report->accepted = $accepted;
|
||||
$report->reviewed = 1;
|
||||
$report->update();
|
||||
}
|
||||
}
|
||||
|
||||
$question->report_count = 0;
|
||||
|
||||
if ($deleted == 1) {
|
||||
$question->deleted = 1;
|
||||
}
|
||||
|
||||
$question->update();
|
||||
}
|
||||
|
||||
protected function findOrFail($id)
|
||||
{
|
||||
$validator = new QuestionValidator();
|
||||
@ -320,6 +362,23 @@ class Question extends Service
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function handleReports($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
|
||||
$builder = new ReportListBuilder();
|
||||
|
||||
$items = $pager->items->toArray();
|
||||
|
||||
$pipeA = $builder->handleUsers($items);
|
||||
$pipeB = $builder->objects($pipeA);
|
||||
|
||||
$pager->items = $pipeB;
|
||||
}
|
||||
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function recountUserQuestions(UserModel $user)
|
||||
{
|
||||
$userRepo = new UserRepo();
|
||||
@ -345,7 +404,7 @@ class Question extends Service
|
||||
$sync->addItem($question->id);
|
||||
}
|
||||
|
||||
protected function handlePostPoint(QuestionModel $question)
|
||||
protected function handleQuestionPostPoint(QuestionModel $question)
|
||||
{
|
||||
if ($question->published != QuestionModel::PUBLISH_APPROVED) return;
|
||||
|
||||
@ -354,4 +413,18 @@ class Question extends Service
|
||||
$service->handle($question);
|
||||
}
|
||||
|
||||
protected function handleQuestionApprovedNotice(QuestionModel $question, UserModel $sender)
|
||||
{
|
||||
$notice = new QuestionApprovedNotice();
|
||||
|
||||
$notice->handle($question, $sender);
|
||||
}
|
||||
|
||||
protected function handleQuestionRejectedNotice(QuestionModel $question, UserModel $sender, $reason)
|
||||
{
|
||||
$notice = new QuestionRejectedNotice();
|
||||
|
||||
$notice->handle($question, $sender, $reason);
|
||||
}
|
||||
|
||||
}
|
||||
|
162
app/Http/Admin/Services/Report.php
Normal file
162
app/Http/Admin/Services/Report.php
Normal file
@ -0,0 +1,162 @@
|
||||
<?php
|
||||
|
||||
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\Library\Paginator\Query as PagerQuery;
|
||||
use App\Repos\Answer as AnswerRepo;
|
||||
use App\Repos\Article as ArticleRepo;
|
||||
use App\Repos\Comment as CommentRepo;
|
||||
use App\Repos\Question as QuestionRepo;
|
||||
|
||||
class Report extends Service
|
||||
{
|
||||
|
||||
public function getArticles()
|
||||
{
|
||||
$pagerQuery = new PagerQuery();
|
||||
|
||||
$params = $pagerQuery->getParams();
|
||||
|
||||
$params['deleted'] = 0;
|
||||
|
||||
$page = $pagerQuery->getPage();
|
||||
$limit = $pagerQuery->getLimit();
|
||||
|
||||
$articleRepo = new ArticleRepo();
|
||||
|
||||
$pager = $articleRepo->paginate($params, 'reported', $page, $limit);
|
||||
|
||||
return $this->handleArticles($pager);
|
||||
}
|
||||
|
||||
public function getQuestions()
|
||||
{
|
||||
$pagerQuery = new PagerQuery();
|
||||
|
||||
$params = $pagerQuery->getParams();
|
||||
|
||||
$params['deleted'] = 0;
|
||||
|
||||
$page = $pagerQuery->getPage();
|
||||
$limit = $pagerQuery->getLimit();
|
||||
|
||||
$questionRepo = new QuestionRepo();
|
||||
|
||||
$pager = $questionRepo->paginate($params, 'reported', $page, $limit);
|
||||
|
||||
return $this->handleQuestions($pager);
|
||||
}
|
||||
|
||||
public function getAnswers()
|
||||
{
|
||||
$pagerQuery = new PagerQuery();
|
||||
|
||||
$params = $pagerQuery->getParams();
|
||||
|
||||
$params['deleted'] = 0;
|
||||
|
||||
$page = $pagerQuery->getPage();
|
||||
$limit = $pagerQuery->getLimit();
|
||||
|
||||
$answerRepo = new AnswerRepo();
|
||||
|
||||
$pager = $answerRepo->paginate($params, 'reported', $page, $limit);
|
||||
|
||||
return $this->handleAnswers($pager);
|
||||
}
|
||||
|
||||
public function getComments()
|
||||
{
|
||||
$pagerQuery = new PagerQuery();
|
||||
|
||||
$params = $pagerQuery->getParams();
|
||||
|
||||
$params['deleted'] = 0;
|
||||
|
||||
$page = $pagerQuery->getPage();
|
||||
$limit = $pagerQuery->getLimit();
|
||||
|
||||
$commentRepo = new CommentRepo();
|
||||
|
||||
$pager = $commentRepo->paginate($params, 'reported', $page, $limit);
|
||||
|
||||
return $this->handleComments($pager);
|
||||
}
|
||||
|
||||
protected function handleArticles($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
|
||||
$builder = new ArticleListBuilder();
|
||||
|
||||
$items = $pager->items->toArray();
|
||||
|
||||
$pipeA = $builder->handleArticles($items);
|
||||
$pipeB = $builder->handleCategories($pipeA);
|
||||
$pipeC = $builder->handleUsers($pipeB);
|
||||
$pipeD = $builder->objects($pipeC);
|
||||
|
||||
$pager->items = $pipeD;
|
||||
}
|
||||
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function handleQuestions($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
|
||||
$builder = new QuestionListBuilder();
|
||||
|
||||
$items = $pager->items->toArray();
|
||||
|
||||
$pipeA = $builder->handleQuestions($items);
|
||||
$pipeB = $builder->handleCategories($pipeA);
|
||||
$pipeC = $builder->handleUsers($pipeB);
|
||||
$pipeD = $builder->objects($pipeC);
|
||||
|
||||
$pager->items = $pipeD;
|
||||
}
|
||||
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function handleAnswers($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
|
||||
$builder = new AnswerListBuilder();
|
||||
|
||||
$items = $pager->items->toArray();
|
||||
|
||||
$pipeA = $builder->handleQuestions($items);
|
||||
$pipeB = $builder->handleUsers($pipeA);
|
||||
$pipeC = $builder->objects($pipeB);
|
||||
|
||||
$pager->items = $pipeC;
|
||||
}
|
||||
|
||||
return $pager;
|
||||
}
|
||||
|
||||
protected function handleComments($pager)
|
||||
{
|
||||
if ($pager->total_items > 0) {
|
||||
|
||||
$builder = new AnswerListBuilder();
|
||||
|
||||
$items = $pager->items->toArray();
|
||||
|
||||
$pipeA = $builder->handleUsers($items);
|
||||
$pipeB = $builder->objects($pipeA);
|
||||
|
||||
$pager->items = $pipeB;
|
||||
}
|
||||
|
||||
return $pager;
|
||||
}
|
||||
|
||||
}
|
@ -334,7 +334,7 @@ class Stat extends Service
|
||||
foreach ($dates as $date) {
|
||||
$key = substr($date, -2);
|
||||
if ($date < $currDate) {
|
||||
$list[$key] = $statRepo->countDailyRegisteredUser($date);
|
||||
$list[$key] = $statRepo->countDailyRegisteredUsers($date);
|
||||
} elseif ($date == $currDate) {
|
||||
$list[$key] = -999;
|
||||
} else {
|
||||
@ -347,13 +347,13 @@ class Stat extends Service
|
||||
|
||||
foreach ($list as $key => $value) {
|
||||
if ($value < 0) {
|
||||
$list[$key] = $statRepo->countDailyRegisteredUser("{$year}-{$month}-{$key}");
|
||||
$list[$key] = $statRepo->countDailyRegisteredUsers("{$year}-{$month}-{$key}");
|
||||
$redis->hSet($keyName, $key, $list[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->isCurrMonth($year, $month)) {
|
||||
$list[$currDay] = $statRepo->countDailyRegisteredUser($currDate);
|
||||
$list[$currDay] = $statRepo->countDailyRegisteredUsers($currDate);
|
||||
}
|
||||
|
||||
return $list;
|
||||
@ -377,7 +377,7 @@ class Stat extends Service
|
||||
foreach ($dates as $date) {
|
||||
$key = substr($date, -2);
|
||||
if ($date < $currDate) {
|
||||
$list[$key] = $statRepo->countDailyOnlineUser($date);
|
||||
$list[$key] = $statRepo->countDailyOnlineUsers($date);
|
||||
} elseif ($date == $currDate) {
|
||||
$list[$key] = -999;
|
||||
} else {
|
||||
@ -390,13 +390,13 @@ class Stat extends Service
|
||||
|
||||
foreach ($list as $key => $value) {
|
||||
if ($value < 0) {
|
||||
$list[$key] = $statRepo->countDailyOnlineUser("{$year}-{$month}-{$key}");
|
||||
$list[$key] = $statRepo->countDailyOnlineUsers("{$year}-{$month}-{$key}");
|
||||
$redis->hSet($keyName, $key, $list[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->isCurrMonth($year, $month)) {
|
||||
$list[$currDay] = $statRepo->countDailyOnlineUser($currDate);
|
||||
$list[$currDay] = $statRepo->countDailyOnlineUsers($currDate);
|
||||
}
|
||||
|
||||
return $list;
|
||||
|
@ -20,7 +20,7 @@
|
||||
<div class="layui-input-block kg-center" style="margin:0;">
|
||||
<button class="layui-btn kg-submit" lay-submit="true" lay-filter="go">提交</button>
|
||||
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
|
||||
<input type="hidden" name="referer" value="{{ referer }}">
|
||||
<input type="hidden" name="referer" value="{{ request.getHTTPReferer() }}">
|
||||
<input type="hidden" name="question_id" value="{{ question.id }}">
|
||||
</div>
|
||||
</form>
|
||||
|
@ -20,7 +20,7 @@
|
||||
<div class="layui-input-block kg-center" style="margin:0;">
|
||||
<button class="layui-btn kg-submit" lay-submit="true" lay-filter="go">提交</button>
|
||||
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
|
||||
<input type="hidden" name="referer" value="{{ referer }}">
|
||||
<input type="hidden" name="referer" value="{{ request.getHTTPReferer() }}">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
@ -24,15 +24,16 @@
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set question_url = url({'for':'home.question.show','id':item.question.id}) %}
|
||||
{% set answer_url = url({'for':'home.answer.show','id':item.id}) %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.answer.review','id':item.id}) %}
|
||||
{% 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}) %}
|
||||
<tr>
|
||||
<td>
|
||||
<P>问题:<a href="{{ question_url }}" target="_blank">{{ item.question.title }}</a></P>
|
||||
<p>回答:{{ item.summary }}</p>
|
||||
<p>回答:<a href="{{ answer_url }}" title="{{ item.summary }}" target="_blank">{{ substr(item.summary,0,32) }}</a></p>
|
||||
<p>作者:<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a> 创建:{{ date('Y-m-d',item.create_time) }}</p>
|
||||
</td>
|
||||
<td>{{ item.comment_count }}</td>
|
||||
@ -42,6 +43,7 @@
|
||||
<div class="layui-dropdown">
|
||||
<button class="layui-btn layui-btn-sm">操作 <i class="layui-icon layui-icon-triangle-d"></i></button>
|
||||
<ul>
|
||||
<li><a href="{{ answer_url }}" target="_blank">预览回答</a></li>
|
||||
{% if item.published == 1 %}
|
||||
<li><a href="{{ review_url }}">审核回答</a></li>
|
||||
{% endif %}
|
||||
|
@ -21,7 +21,9 @@
|
||||
<legend>审核意见</legend>
|
||||
</fieldset>
|
||||
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ url({'for':'admin.answer.review','id':answer.id}) }}">
|
||||
{% set review_url = url({'for':'admin.answer.publish_review','id':answer.id}) %}
|
||||
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ review_url }}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">审核</label>
|
||||
<div class="layui-input-block">
|
115
app/Http/Admin/Views/answer/report_review.volt
Normal file
115
app/Http/Admin/Views/answer/report_review.volt
Normal file
@ -0,0 +1,115 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/question') }}
|
||||
|
||||
{% set owner_url = url({'for':'home.user.show','id':answer.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.answer.report_review','id':answer.id}) %}
|
||||
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend>审核举报</legend>
|
||||
</fieldset>
|
||||
|
||||
<div class="layui-tab layui-tab-brief">
|
||||
<ul class="layui-tab-title kg-tab-title">
|
||||
<li class="layui-this">问答信息</li>
|
||||
<li>举报信息</li>
|
||||
<li>审核意见</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="kg-mod-preview">
|
||||
<div class="title">{{ answer.question.title }}</div>
|
||||
<div class="meta">
|
||||
<span><a href="{{ owner_url }}" target="_blank">{{ answer.owner.name }}</a></span>
|
||||
<span>{{ date('Y-m-d H:i',answer.create_time) }}</span>
|
||||
</div>
|
||||
<div class="content markdown-body">{{ answer.content }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<table class="layui-table kg-table" style="width:80%;">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>举报用户</th>
|
||||
<th>举报理由</th>
|
||||
<th>举报时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in reports %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
<tr>
|
||||
<td><a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></td>
|
||||
<td>{{ item.reason }}</td>
|
||||
<td>{{ date('Y-m-d',item.create_time) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ review_url }}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">有效举报</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="accepted" value="1" title="是" lay-filter="accepted">
|
||||
<input type="radio" name="accepted" value="0" title="否" lay-filter="accepted">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="delete-block" style="display:none;">
|
||||
<label class="layui-form-label">删除回答</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="deleted" value="1" title="是" lay-filter="deleted">
|
||||
<input type="radio" name="deleted" value="0" title="否" lay-filter="deleted">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button id="kg-submit" class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
|
||||
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block link_css %}
|
||||
|
||||
{{ css_link('home/css/markdown.css') }}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block inline_js %}
|
||||
|
||||
<script>
|
||||
|
||||
layui.use(['jquery', 'form'], function () {
|
||||
|
||||
var $ = layui.jquery;
|
||||
var form = layui.form;
|
||||
|
||||
form.on('radio(accepted)', function (data) {
|
||||
var $block = $('#delete-block');
|
||||
if (data.value === '1') {
|
||||
$block.show();
|
||||
} else {
|
||||
$block.hide();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
@ -50,13 +50,13 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set preview_url = url({'for':'home.article.show','id':item.id}) %}
|
||||
{% set review_url = url({'for':'admin.article.review','id':item.id}) %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set edit_url = url({'for':'admin.article.edit','id':item.id}) %}
|
||||
{% set update_url = url({'for':'admin.article.update','id':item.id}) %}
|
||||
{% set delete_url = url({'for':'admin.article.delete','id':item.id}) %}
|
||||
{% set restore_url = url({'for':'admin.article.restore','id':item.id}) %}
|
||||
{% set review_url = url({'for':'admin.article.publish_review','id':item.id}) %}
|
||||
{% set comment_url = url({'for':'admin.comment.list'},{'item_id':item.id,'item_type':2}) %}
|
||||
<tr>
|
||||
<td>
|
||||
|
@ -36,7 +36,9 @@
|
||||
<legend>审核意见</legend>
|
||||
</fieldset>
|
||||
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ url({'for':'admin.article.review','id':article.id}) }}">
|
||||
{% set review_url = url({'for':'admin.article.publish_review','id':article.id}) %}
|
||||
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ review_url }}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">审核</label>
|
||||
<div class="layui-input-block">
|
||||
@ -44,8 +46,7 @@
|
||||
<input type="radio" name="type" value="reject" title="拒绝" lay-filter="review">
|
||||
</div>
|
||||
</div>
|
||||
<div id="reason-block" style="display:none;">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-form-item" id="reason-block" style="display:none;">
|
||||
<label class="layui-form-label">理由</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="reason">
|
||||
@ -56,7 +57,6 @@
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
128
app/Http/Admin/Views/article/report_review.volt
Normal file
128
app/Http/Admin/Views/article/report_review.volt
Normal file
@ -0,0 +1,128 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/article') }}
|
||||
|
||||
{% set owner_url = url({'for':'home.user.show','id':article.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.article.report_review','id':article.id}) %}
|
||||
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend>审核举报</legend>
|
||||
</fieldset>
|
||||
|
||||
<div class="layui-tab layui-tab-brief">
|
||||
<ul class="layui-tab-title kg-tab-title">
|
||||
<li class="layui-this">文章信息</li>
|
||||
<li>举报信息</li>
|
||||
<li>审核意见</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="kg-mod-preview">
|
||||
<div class="title">{{ article.title }}</div>
|
||||
<div class="meta">
|
||||
<span class="layui-badge layui-bg-green">{{ source_type(article.source_type) }}</span>
|
||||
<span><a href="{{ owner_url }}" target="_blank">{{ article.owner.name }}</a></span>
|
||||
<span>{{ date('Y-m-d H:i',article.create_time) }}</span>
|
||||
</div>
|
||||
<div class="content markdown-body">{{ article.content }}</div>
|
||||
{% if article.tags %}
|
||||
<div class="tags">
|
||||
{% for item in article.tags %}
|
||||
<span class="layui-btn layui-btn-xs">{{ item.name }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if article.source_url %}
|
||||
<div class="source-tips kg-center">
|
||||
<a href="{{ article.source_url }}" target="_blank">查看原文</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<table class="layui-table kg-table" style="width:80%;">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>举报用户</th>
|
||||
<th>举报理由</th>
|
||||
<th>举报时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in reports %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
<tr>
|
||||
<td><a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></td>
|
||||
<td>{{ item.reason }}</td>
|
||||
<td>{{ date('Y-m-d',item.create_time) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ review_url }}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">有效举报</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="accepted" value="1" title="是" lay-filter="accepted">
|
||||
<input type="radio" name="accepted" value="0" title="否" lay-filter="accepted">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="delete-block" style="display:none;">
|
||||
<label class="layui-form-label">删除问题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="deleted" value="1" title="是" lay-filter="deleted">
|
||||
<input type="radio" name="deleted" value="0" title="否" lay-filter="deleted">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button id="kg-submit" class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
|
||||
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block link_css %}
|
||||
|
||||
{{ css_link('home/css/markdown.css') }}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block inline_js %}
|
||||
|
||||
<script>
|
||||
|
||||
layui.use(['jquery', 'form'], function () {
|
||||
|
||||
var $ = layui.jquery;
|
||||
var form = layui.form;
|
||||
|
||||
form.on('radio(accepted)', function (data) {
|
||||
var $block = $('#delete-block');
|
||||
if (data.value === '1') {
|
||||
$block.show();
|
||||
} else {
|
||||
$block.hide();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
84
app/Http/Admin/Views/comment/publish_review.volt
Normal file
84
app/Http/Admin/Views/comment/publish_review.volt
Normal file
@ -0,0 +1,84 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/comment') }}
|
||||
|
||||
{% set owner_url = url({'for':'home.user.show','id':comment.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.comment.publish_review','id':comment.id}) %}
|
||||
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend>审核内容</legend>
|
||||
</fieldset>
|
||||
|
||||
<div class="kg-mod-preview">
|
||||
<div class="meta">
|
||||
<span><a href="{{ owner_url }}" target="_blank">{{ comment.owner.name }}</a></span>
|
||||
<span>{{ date('Y-m-d H:i',comment.create_time) }}</span>
|
||||
</div>
|
||||
<div class="content markdown-body">{{ comment.content }}</div>
|
||||
</div>
|
||||
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend>审核意见</legend>
|
||||
</fieldset>
|
||||
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ review_url }}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">审核</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="type" value="approve" title="通过" lay-filter="review">
|
||||
<input type="radio" name="type" value="reject" title="拒绝" lay-filter="review">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="reason-block" style="display:none;">
|
||||
<label class="layui-form-label">理由</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="reason">
|
||||
<option value="">请选择</option>
|
||||
{% for value,name in reasons %}
|
||||
<option value="{{ value }}">{{ name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button id="kg-submit" class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
|
||||
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block link_css %}
|
||||
|
||||
{{ css_link('home/css/markdown.css') }}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block inline_js %}
|
||||
|
||||
<script>
|
||||
|
||||
layui.use(['jquery', 'form'], function () {
|
||||
|
||||
var $ = layui.jquery;
|
||||
var form = layui.form;
|
||||
|
||||
form.on('radio(review)', function (data) {
|
||||
var block = $('#reason-block');
|
||||
if (data.value === 'approve') {
|
||||
block.hide();
|
||||
} else {
|
||||
block.show();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
114
app/Http/Admin/Views/comment/report_review.volt
Normal file
114
app/Http/Admin/Views/comment/report_review.volt
Normal file
@ -0,0 +1,114 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/comment') }}
|
||||
|
||||
{% set owner_url = url({'for':'home.user.show','id':comment.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.comment.report_review','id':comment.id}) %}
|
||||
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend>审核举报</legend>
|
||||
</fieldset>
|
||||
|
||||
<div class="layui-tab layui-tab-brief">
|
||||
<ul class="layui-tab-title kg-tab-title">
|
||||
<li class="layui-this">评论信息</li>
|
||||
<li>举报信息</li>
|
||||
<li>审核意见</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="kg-mod-preview">
|
||||
<div class="meta">
|
||||
<span><a href="{{ owner_url }}" target="_blank">{{ comment.owner.name }}</a></span>
|
||||
<span>{{ date('Y-m-d H:i',comment.create_time) }}</span>
|
||||
</div>
|
||||
<div class="content markdown-body">{{ comment.content }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<table class="layui-table kg-table" style="width:80%;">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>举报用户</th>
|
||||
<th>举报理由</th>
|
||||
<th>举报时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in reports %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
<tr>
|
||||
<td><a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></td>
|
||||
<td>{{ item.reason }}</td>
|
||||
<td>{{ date('Y-m-d',item.create_time) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ review_url }}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">有效举报</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="accepted" value="1" title="是" lay-filter="accepted">
|
||||
<input type="radio" name="accepted" value="0" title="否" lay-filter="accepted">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="delete-block" style="display:none;">
|
||||
<label class="layui-form-label">删除评论</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="deleted" value="1" title="是" lay-filter="deleted">
|
||||
<input type="radio" name="deleted" value="0" title="否" lay-filter="deleted">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button id="kg-submit" class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
|
||||
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block link_css %}
|
||||
|
||||
{{ css_link('home/css/markdown.css') }}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block inline_js %}
|
||||
|
||||
<script>
|
||||
|
||||
layui.use(['jquery', 'form'], function () {
|
||||
|
||||
var $ = layui.jquery;
|
||||
var form = layui.form;
|
||||
|
||||
form.on('radio(accepted)', function (data) {
|
||||
var $block = $('#delete-block');
|
||||
if (data.value === '1') {
|
||||
$block.show();
|
||||
} else {
|
||||
$block.hide();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
@ -6,11 +6,12 @@
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md8">
|
||||
{{ partial('index/main_global_stat') }}
|
||||
{{ partial('index/main_today_stat') }}
|
||||
{{ partial('index/main_mod_stat') }}
|
||||
{{ partial('index/main_report_stat') }}
|
||||
{{ partial('index/main_app_trend') }}
|
||||
</div>
|
||||
<div class="layui-col-md4">
|
||||
{{ partial('index/main_today_stat') }}
|
||||
{{ partial('index/main_app_info') }}
|
||||
{{ partial('index/main_server_info') }}
|
||||
{{ partial('index/main_team_info') }}
|
||||
|
@ -30,7 +30,7 @@
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">评论</div>
|
||||
<div class="count">
|
||||
<a href="javascript:">0</a>
|
||||
<a href="{{ url({'for':'admin.mod.comments'}) }}">{{ mod_stat.comment_count }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
39
app/Http/Admin/Views/index/main_report_stat.volt
Normal file
39
app/Http/Admin/Views/index/main_report_stat.volt
Normal file
@ -0,0 +1,39 @@
|
||||
<div class="layui-card layui-text kg-stats">
|
||||
<div class="layui-card-header">举报队列</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md3">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">文章</div>
|
||||
<div class="count">
|
||||
<a href="{{ url({'for':'admin.report.articles'}) }}">{{ report_stat.article_count }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">提问</div>
|
||||
<div class="count">
|
||||
<a href="{{ url({'for':'admin.report.questions'}) }}">{{ report_stat.question_count }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">回答</div>
|
||||
<div class="count">
|
||||
<a href="{{ url({'for':'admin.report.answers'}) }}">{{ report_stat.answer_count }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">评论</div>
|
||||
<div class="count">
|
||||
<a href="{{ url({'for':'admin.report.comments'}) }}">{{ report_stat.comment_count }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -2,37 +2,37 @@
|
||||
<div class="layui-card-header">今日统计</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-col-md4">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">用户注册</div>
|
||||
<div class="count">{{ today_stat.register_count }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-col-md4">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">积分兑换</div>
|
||||
<div class="count">{{ today_stat.point_redeem_count }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-col-md4">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">成交订单</div>
|
||||
<div class="count">{{ today_stat.sale_count }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-col-md4">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">成功退款</div>
|
||||
<div class="count">{{ today_stat.refund_count }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-col-md4">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">销售金额</div>
|
||||
<div class="count">{{ '¥%0.2f'|format(today_stat.sale_amount) }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-col-md4">
|
||||
<div class="kg-stat-card">
|
||||
<div class="name">退款金额</div>
|
||||
<div class="count">{{ '¥%0.2f'|format(today_stat.refund_amount) }}</div>
|
||||
|
11
app/Http/Admin/Views/macros/comment.volt
Normal file
11
app/Http/Admin/Views/macros/comment.volt
Normal file
@ -0,0 +1,11 @@
|
||||
{%- macro publish_status(type) %}
|
||||
{% if type == 1 %}
|
||||
审核中
|
||||
{% elseif type == 2 %}
|
||||
已发布
|
||||
{% elseif type == 3 %}
|
||||
未通过
|
||||
{% else %}
|
||||
未知
|
||||
{% endif %}
|
||||
{%- endmacro %}
|
@ -31,7 +31,7 @@
|
||||
{% for item in pager.items %}
|
||||
{% set question_url = url({'for':'home.question.show','id':item.question.id}) %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.answer.review','id':item.id}) %}
|
||||
{% set review_url = url({'for':'admin.answer.publish_review','id':item.id}) %}
|
||||
<tr>
|
||||
<td>
|
||||
<P>问题:<a href="{{ question_url }}" target="_blank">{{ item.question.title }}</a></P>
|
||||
|
@ -30,7 +30,7 @@
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.article.review','id':item.id}) %}
|
||||
{% set review_url = url({'for':'admin.article.publish_review','id':item.id}) %}
|
||||
<tr>
|
||||
<td>
|
||||
<p>标题:{{ item.title }}</p>
|
||||
|
51
app/Http/Admin/Views/moderation/comments.volt
Normal file
51
app/Http/Admin/Views/moderation/comments.volt
Normal file
@ -0,0 +1,51 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/comment') }}
|
||||
|
||||
<div class="kg-nav">
|
||||
<div class="kg-nav-left">
|
||||
<span class="layui-breadcrumb">
|
||||
<a><cite>评论审核</cite></a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="layui-table kg-table layui-form">
|
||||
<colgroup>
|
||||
<col width="50%">
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>评论</th>
|
||||
<th>作者</th>
|
||||
<th>时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.answer.publish_review','id':item.id}) %}
|
||||
<tr>
|
||||
<td>{{ substr(item.content,0,32) }}</td>
|
||||
<td>
|
||||
<p>昵称:<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></p>
|
||||
<p>编号:{{ item.owner.id }}</p>
|
||||
</td>
|
||||
<td>{{ date('Y-m-d H:i',item.create_time) }}</td>
|
||||
<td class="center">
|
||||
<a href="{{ review_url }}" class="layui-btn layui-btn-sm">详情</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{{ partial('partials/pager') }}
|
||||
|
||||
{% endblock %}
|
@ -30,7 +30,7 @@
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.question.review','id':item.id}) %}
|
||||
{% set review_url = url({'for':'admin.question.publish_review','id':item.id}) %}
|
||||
<tr>
|
||||
<td>
|
||||
<p>标题:{{ item.title }}</p>
|
||||
|
@ -48,13 +48,13 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set preview_url = url({'for':'home.question.show','id':item.id}) %}
|
||||
{% set review_url = url({'for':'admin.question.review','id':item.id}) %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set edit_url = url({'for':'admin.question.edit','id':item.id}) %}
|
||||
{% set update_url = url({'for':'admin.question.update','id':item.id}) %}
|
||||
{% set delete_url = url({'for':'admin.question.delete','id':item.id}) %}
|
||||
{% set restore_url = url({'for':'admin.question.restore','id':item.id}) %}
|
||||
{% set review_url = url({'for':'admin.question.publish_review','id':item.id}) %}
|
||||
{% set answer_add_url = url({'for':'admin.answer.add'},{'question_id':item.id}) %}
|
||||
{% set answer_list_url = url({'for':'admin.answer.list'},{'question_id':item.id}) %}
|
||||
<tr>
|
||||
|
@ -28,7 +28,9 @@
|
||||
<legend>审核意见</legend>
|
||||
</fieldset>
|
||||
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ url({'for':'admin.question.review','id':question.id}) }}">
|
||||
{% set review_url = url({'for':'admin.question.publish_review','id':question.id}) %}
|
||||
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ review_url }}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">审核</label>
|
||||
<div class="layui-input-block">
|
122
app/Http/Admin/Views/question/report_review.volt
Normal file
122
app/Http/Admin/Views/question/report_review.volt
Normal file
@ -0,0 +1,122 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/question') }}
|
||||
|
||||
{% set owner_url = url({'for':'home.user.show','id':question.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.question.report_review','id':question.id}) %}
|
||||
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend>审核举报</legend>
|
||||
</fieldset>
|
||||
|
||||
<div class="layui-tab layui-tab-brief">
|
||||
<ul class="layui-tab-title kg-tab-title">
|
||||
<li class="layui-this">问题信息</li>
|
||||
<li>举报信息</li>
|
||||
<li>审核意见</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="kg-mod-preview">
|
||||
<div class="title">{{ question.title }}</div>
|
||||
<div class="meta">
|
||||
<span><a href="{{ owner_url }}" target="_blank">{{ question.owner.name }}</a></span>
|
||||
<span>{{ date('Y-m-d H:i',question.create_time) }}</span>
|
||||
</div>
|
||||
<div class="content markdown-body">{{ question.content }}</div>
|
||||
{% if question.tags %}
|
||||
<div class="tags">
|
||||
{% for item in question.tags %}
|
||||
<span class="layui-btn layui-btn-xs">{{ item.name }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<table class="layui-table kg-table" style="width:80%;">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>举报用户</th>
|
||||
<th>举报理由</th>
|
||||
<th>举报时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in reports %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
<tr>
|
||||
<td><a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></td>
|
||||
<td>{{ item.reason }}</td>
|
||||
<td>{{ date('Y-m-d',item.create_time) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<form class="layui-form kg-form kg-review-form" method="POST" action="{{ review_url }}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">有效举报</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="accepted" value="1" title="是" lay-filter="accepted">
|
||||
<input type="radio" name="accepted" value="0" title="否" lay-filter="accepted">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="delete-block" style="display:none;">
|
||||
<label class="layui-form-label">删除问题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="deleted" value="1" title="是" lay-filter="deleted">
|
||||
<input type="radio" name="deleted" value="0" title="否" lay-filter="deleted">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button id="kg-submit" class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
|
||||
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block link_css %}
|
||||
|
||||
{{ css_link('home/css/markdown.css') }}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block inline_js %}
|
||||
|
||||
<script>
|
||||
|
||||
layui.use(['jquery', 'form'], function () {
|
||||
|
||||
var $ = layui.jquery;
|
||||
var form = layui.form;
|
||||
|
||||
form.on('radio(accepted)', function (data) {
|
||||
var $block = $('#delete-block');
|
||||
if (data.value === '1') {
|
||||
$block.show();
|
||||
} else {
|
||||
$block.hide();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
58
app/Http/Admin/Views/report/answers.volt
Normal file
58
app/Http/Admin/Views/report/answers.volt
Normal file
@ -0,0 +1,58 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/answer') }}
|
||||
|
||||
<div class="kg-nav">
|
||||
<div class="kg-nav-left">
|
||||
<span class="layui-breadcrumb">
|
||||
<a><cite>回答举报</cite></a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="layui-table kg-table layui-form">
|
||||
<colgroup>
|
||||
<col width="50%">
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>回答信息</th>
|
||||
<th>作者信息</th>
|
||||
<th>举报人次</th>
|
||||
<th>创建时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set question_url = url({'for':'home.question.show','id':item.question.id}) %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.answer.report_review','id':item.id}) %}
|
||||
<tr>
|
||||
<td>
|
||||
<P>问题:<a href="{{ question_url }}" target="_blank">{{ item.question.title }}</a></P>
|
||||
<p class="layui-elip">回答:{{ substr(item.summary,0,32) }}</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>昵称:<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></p>
|
||||
<p>编号:{{ item.owner.id }}</p>
|
||||
</td>
|
||||
<td>{{ item.report_count }}</td>
|
||||
<td>{{ date('Y-m-d H:i',item.create_time) }}</td>
|
||||
<td class="center">
|
||||
<a href="{{ review_url }}" class="layui-btn layui-btn-sm">详情</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{{ partial('partials/pager') }}
|
||||
|
||||
{% endblock %}
|
63
app/Http/Admin/Views/report/articles.volt
Normal file
63
app/Http/Admin/Views/report/articles.volt
Normal file
@ -0,0 +1,63 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/article') }}
|
||||
|
||||
<div class="kg-nav">
|
||||
<div class="kg-nav-left">
|
||||
<span class="layui-breadcrumb">
|
||||
<a><cite>文章举报</cite></a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="layui-table kg-table layui-form">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>文章信息</th>
|
||||
<th>作者信息</th>
|
||||
<th>举报人次</th>
|
||||
<th>创建时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set article_url = url({'for':'home.article.show','id':item.id}) %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.article.report_review','id':item.id}) %}
|
||||
<tr>
|
||||
<td>
|
||||
<p>标题:<a href="{{ article_url }}" target="_blank">{{ item.title }}</a></p>
|
||||
<p class="meta">
|
||||
<span>来源:{{ source_type(item.source_type) }}</span>
|
||||
{% if item.tags %}
|
||||
<span>标签:{{ tags_info(item.tags) }}</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>昵称:<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></p>
|
||||
<p>编号:{{ item.owner.id }}</p>
|
||||
</td>
|
||||
<td>{{ item.report_count }}</td>
|
||||
<td>{{ date('Y-m-d H:i',item.create_time) }}</td>
|
||||
<td class="center">
|
||||
<a href="{{ review_url }}" class="layui-btn layui-btn-sm">详情</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{{ partial('partials/pager') }}
|
||||
|
||||
{% endblock %}
|
54
app/Http/Admin/Views/report/comments.volt
Normal file
54
app/Http/Admin/Views/report/comments.volt
Normal file
@ -0,0 +1,54 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/comment') }}
|
||||
|
||||
<div class="kg-nav">
|
||||
<div class="kg-nav-left">
|
||||
<span class="layui-breadcrumb">
|
||||
<a><cite>评论举报</cite></a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="layui-table kg-table layui-form">
|
||||
<colgroup>
|
||||
<col width="50%">
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>评论信息</th>
|
||||
<th>作者信息</th>
|
||||
<th>举报人次</th>
|
||||
<th>创建时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.comment.report_review','id':item.id}) %}
|
||||
<tr>
|
||||
<td>{{ substr(item.content,0,120) }}</td>
|
||||
<td>
|
||||
<p>昵称:<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></p>
|
||||
<p>编号:{{ item.owner.id }}</p>
|
||||
</td>
|
||||
<td>{{ item.report_count }}</td>
|
||||
<td>{{ date('Y-m-d H:i',item.create_time) }}</td>
|
||||
<td class="center">
|
||||
<a href="{{ review_url }}" class="layui-btn layui-btn-sm">详情</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{{ partial('partials/pager') }}
|
||||
|
||||
{% endblock %}
|
62
app/Http/Admin/Views/report/questions.volt
Normal file
62
app/Http/Admin/Views/report/questions.volt
Normal file
@ -0,0 +1,62 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/question') }}
|
||||
|
||||
<div class="kg-nav">
|
||||
<div class="kg-nav-left">
|
||||
<span class="layui-breadcrumb">
|
||||
<a><cite>问题审核</cite></a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="layui-table kg-table layui-form">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>问题信息</th>
|
||||
<th>作者信息</th>
|
||||
<th>举报人次</th>
|
||||
<th>创建时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set question_url = url({'for':'home.question.show','id':item.id}) %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set review_url = url({'for':'admin.question.report_review','id':item.id}) %}
|
||||
<tr>
|
||||
<td>
|
||||
<p>标题:<a href="{{ question_url }}" target="_blank">{{ item.title }}</a></p>
|
||||
<p class="meta">
|
||||
{% if item.tags %}
|
||||
<span>标签:{{ tags_info(item.tags) }}</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>昵称:<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></p>
|
||||
<p>编号:{{ item.owner.id }}</p>
|
||||
</td>
|
||||
<td>{{ item.report_count }}</td>
|
||||
<td>{{ date('Y-m-d H:i',item.create_time) }}</td>
|
||||
<td class="center">
|
||||
<a href="{{ review_url }}" class="layui-btn layui-btn-sm">详情</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{{ partial('partials/pager') }}
|
||||
|
||||
{% endblock %}
|
@ -133,6 +133,33 @@
|
||||
<td><input class="layui-input" type="text" name="event_rule[answer_post][point]" value="{{ event_rule.answer_post.point }}" lay-verify="required"></td>
|
||||
<td><input class="layui-input" type="text" name="event_rule[answer_post][limit]" value="{{ event_rule.answer_post.limit }}" lay-verify="required"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>文章被赞</td>
|
||||
<td>
|
||||
<input type="radio" name="event_rule[article_liked][enabled]" value="1" title="是" {% if event_rule.article_liked.enabled == "1" %}checked="checked"{% endif %}>
|
||||
<input type="radio" name="event_rule[article_liked][enabled]" value="0" title="否" {% if event_rule.article_liked.enabled == "0" %}checked="checked"{% endif %}>
|
||||
</td>
|
||||
<td><input class="layui-input" type="text" name="event_rule[article_liked][point]" value="{{ event_rule.article_liked.point }}" lay-verify="required"></td>
|
||||
<td><input class="layui-input" type="text" name="event_rule[article_liked][limit]" value="{{ event_rule.article_liked.limit }}" lay-verify="required"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>问题被赞</td>
|
||||
<td>
|
||||
<input type="radio" name="event_rule[question_liked][enabled]" value="1" title="是" {% if event_rule.question_liked.enabled == "1" %}checked="checked"{% endif %}>
|
||||
<input type="radio" name="event_rule[question_liked][enabled]" value="0" title="否" {% if event_rule.question_liked.enabled == "0" %}checked="checked"{% endif %}>
|
||||
</td>
|
||||
<td><input class="layui-input" type="text" name="event_rule[question_liked][point]" value="{{ event_rule.question_liked.point }}" lay-verify="required"></td>
|
||||
<td><input class="layui-input" type="text" name="event_rule[question_liked][limit]" value="{{ event_rule.question_liked.limit }}" lay-verify="required"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>回答被赞</td>
|
||||
<td>
|
||||
<input type="radio" name="event_rule[answer_liked][enabled]" value="1" title="是" {% if event_rule.answer_liked.enabled == "1" %}checked="checked"{% endif %}>
|
||||
<input type="radio" name="event_rule[answer_liked][enabled]" value="0" title="否" {% if event_rule.answer_liked.enabled == "0" %}checked="checked"{% endif %}>
|
||||
</td>
|
||||
<td><input class="layui-input" type="text" name="event_rule[answer_liked][point]" value="{{ event_rule.answer_liked.point }}" lay-verify="required"></td>
|
||||
<td><input class="layui-input" type="text" name="event_rule[answer_liked][limit]" value="{{ event_rule.answer_liked.limit }}" lay-verify="required"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<br>
|
||||
|
@ -16,16 +16,14 @@
|
||||
<th>终端类型</th>
|
||||
<th>终端地址</th>
|
||||
<th>活跃时间</th>
|
||||
<th>创建时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
<tr>
|
||||
<td>{{ client_type(item.client_type) }}</td>
|
||||
<td><a href="javascript:" title="查看位置" class="layui-badge layui-bg-gray kg-ip2region">{{ item.client_ip }}</a></td>
|
||||
<td><a href="javascript:" class="kg-ip2region" title="查看位置" data-ip="{{ item.client_ip }}">{{ item.client_ip }}</a></td>
|
||||
<td>{{ date('Y-m-d H:i',item.active_time) }}</td>
|
||||
<td>{{ date('Y-m-d H:i',item.create_time) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
@ -42,6 +42,37 @@ class AnswerController extends Controller
|
||||
$this->view->setVar('question', $question);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}", name="home.answer.show")
|
||||
*/
|
||||
public function showAction($id)
|
||||
{
|
||||
$service = new AnswerService();
|
||||
|
||||
$answer = $service->getAnswer($id);
|
||||
|
||||
$location = $this->url->get(
|
||||
['for' => 'home.question.show', 'id' => $answer->question_id],
|
||||
['answer_id' => $answer->id],
|
||||
);
|
||||
|
||||
$this->response->redirect($location);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/info", name="home.answer.info")
|
||||
*/
|
||||
public function infoAction($id)
|
||||
{
|
||||
$service = new AnswerInfoService();
|
||||
|
||||
$answer = $service->handle($id);
|
||||
|
||||
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||
|
||||
$this->view->setVar('answer', $answer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/edit", name="home.answer.edit")
|
||||
*/
|
||||
@ -57,23 +88,8 @@ class AnswerController extends Controller
|
||||
|
||||
$this->seo->prependTitle('编辑回答');
|
||||
|
||||
$referer = $this->request->getHTTPReferer();
|
||||
|
||||
$this->view->setVar('question', $question);
|
||||
$this->view->setVar('answer', $answer);
|
||||
$this->view->setVar('referer', $referer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}", name="home.answer.show")
|
||||
*/
|
||||
public function showAction($id)
|
||||
{
|
||||
$service = new AnswerInfoService();
|
||||
|
||||
$answer = $service->handle($id);
|
||||
|
||||
$this->view->setVar('answer', $answer);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -86,8 +102,8 @@ class AnswerController extends Controller
|
||||
$answer = $service->handle();
|
||||
|
||||
$location = $this->url->get([
|
||||
'for' => 'home.question.show',
|
||||
'id' => $answer->question_id,
|
||||
'for' => 'home.answer.show',
|
||||
'id' => $answer->id,
|
||||
]);
|
||||
|
||||
$content = [
|
||||
@ -105,13 +121,12 @@ class AnswerController extends Controller
|
||||
{
|
||||
$service = new AnswerUpdateService();
|
||||
|
||||
$service->handle($id);
|
||||
$answer = $service->handle($id);
|
||||
|
||||
$location = $this->request->getPost('referer');
|
||||
|
||||
if (empty($location)) {
|
||||
$location = $this->url->get(['for' => 'home.uc.answers']);
|
||||
}
|
||||
$location = $this->url->get([
|
||||
'for' => 'home.answer.show',
|
||||
'id' => $answer->id,
|
||||
]);
|
||||
|
||||
$content = [
|
||||
'location' => $location,
|
||||
@ -168,12 +183,4 @@ class AnswerController extends Controller
|
||||
return $this->jsonSuccess(['data' => $data, 'msg' => $msg]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id:[0-9]+}/report", name="home.answer.report")
|
||||
*/
|
||||
public function reportAction($id)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -64,13 +64,10 @@ class ArticleController extends Controller
|
||||
|
||||
$this->seo->prependTitle('写文章');
|
||||
|
||||
$referer = $this->request->getHTTPReferer();
|
||||
|
||||
$this->view->pick('article/edit');
|
||||
$this->view->setVar('source_types', $sourceTypes);
|
||||
$this->view->setVar('xm_tags', $xmTags);
|
||||
$this->view->setVar('article', $article);
|
||||
$this->view->setVar('referer', $referer);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -86,10 +83,7 @@ class ArticleController extends Controller
|
||||
|
||||
$this->seo->prependTitle('编辑文章');
|
||||
|
||||
$referer = $this->request->getHTTPReferer();
|
||||
|
||||
$this->view->setVar('source_types', $sourceTypes);
|
||||
$this->view->setVar('referer', $referer);
|
||||
$this->view->setVar('article', $article);
|
||||
$this->view->setVar('xm_tags', $xmTags);
|
||||
}
|
||||
@ -155,13 +149,12 @@ class ArticleController extends Controller
|
||||
{
|
||||
$service = new ArticleUpdateService();
|
||||
|
||||
$service->handle($id);
|
||||
$article = $service->handle($id);
|
||||
|
||||
$location = $this->request->getPost('referer');
|
||||
|
||||
if (empty($location)) {
|
||||
$location = $this->url->get(['for' => 'home.uc.articles']);
|
||||
}
|
||||
$location = $this->url->get([
|
||||
'for' => 'home.article.show',
|
||||
'id' => $article->id,
|
||||
]);
|
||||
|
||||
$content = [
|
||||
'location' => $location,
|
||||
@ -218,12 +211,4 @@ class ArticleController extends Controller
|
||||
return $this->jsonSuccess(['data' => $data, 'msg' => $msg]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id:[0-9]+}/report", name="home.article.report")
|
||||
*/
|
||||
public function reportAction($id)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -121,12 +121,4 @@ class CommentController extends Controller
|
||||
return $this->jsonSuccess(['msg' => '删除评论成功']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id:[0-9]+}/report", name="home.comment.report")
|
||||
*/
|
||||
public function reportAction($id)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -65,10 +65,7 @@ class QuestionController extends Controller
|
||||
|
||||
$this->seo->prependTitle('提问题');
|
||||
|
||||
$referer = $this->request->getHTTPReferer();
|
||||
|
||||
$this->view->pick('question/edit');
|
||||
$this->view->setVar('referer', $referer);
|
||||
$this->view->setVar('question', $question);
|
||||
$this->view->setVar('xm_tags', $xmTags);
|
||||
}
|
||||
@ -86,9 +83,6 @@ class QuestionController extends Controller
|
||||
|
||||
$this->seo->prependTitle('编辑问题');
|
||||
|
||||
$referer = $this->request->getHTTPReferer();
|
||||
|
||||
$this->view->setVar('referer', $referer);
|
||||
$this->view->setVar('question', $question);
|
||||
$this->view->setVar('xm_tags', $xmTags);
|
||||
}
|
||||
@ -174,13 +168,12 @@ class QuestionController extends Controller
|
||||
{
|
||||
$service = new QuestionUpdateService();
|
||||
|
||||
$service->handle($id);
|
||||
$question = $service->handle($id);
|
||||
|
||||
$location = $this->request->getPost('referer');
|
||||
|
||||
if (empty($location)) {
|
||||
$location = $this->url->get(['for' => 'home.uc.questions']);
|
||||
}
|
||||
$location = $this->url->get([
|
||||
'for' => 'home.question.show',
|
||||
'id' => $question->id,
|
||||
]);
|
||||
|
||||
$content = [
|
||||
'location' => $location,
|
||||
@ -237,12 +230,4 @@ class QuestionController extends Controller
|
||||
return $this->jsonSuccess(['data' => $data, 'msg' => $msg]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id:[0-9]+}/report", name="home.question.report")
|
||||
*/
|
||||
public function reportAction($id)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
41
app/Http/Home/Controllers/ReportController.php
Normal file
41
app/Http/Home/Controllers/ReportController.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Home\Controllers;
|
||||
|
||||
use App\Services\Logic\Report\ReasonList as ReasonListService;
|
||||
use App\Services\Logic\Report\ReportCreate as ReportCreateService;
|
||||
use Phalcon\Mvc\View;
|
||||
|
||||
/**
|
||||
* @RoutePrefix("/report")
|
||||
*/
|
||||
class ReportController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* @Get("/add", name="home.report.add")
|
||||
*/
|
||||
public function addAction()
|
||||
{
|
||||
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||
|
||||
$service = new ReasonListService();
|
||||
|
||||
$reasons = $service->handle();
|
||||
|
||||
$this->view->setVar('reasons', $reasons);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Post("/create", name="home.report.create")
|
||||
*/
|
||||
public function createAction()
|
||||
{
|
||||
$service = new ReportCreateService();
|
||||
|
||||
$service->handle();
|
||||
|
||||
return $this->jsonSuccess(['msg' => '举报成功']);
|
||||
}
|
||||
|
||||
}
|
@ -4,6 +4,7 @@ namespace App\Http\Home\Services;
|
||||
|
||||
use App\Models\Article as ArticleModel;
|
||||
use App\Models\Category as CategoryModel;
|
||||
use App\Models\Reason as ReasonModel;
|
||||
use App\Repos\Category as CategoryRepo;
|
||||
use App\Repos\Tag as TagRepo;
|
||||
use App\Services\Logic\ArticleTrait;
|
||||
@ -69,6 +70,11 @@ class Article extends Service
|
||||
return ArticleModel::sourceTypes();
|
||||
}
|
||||
|
||||
public function getReportReasons()
|
||||
{
|
||||
return ReasonModel::reportOptions();
|
||||
}
|
||||
|
||||
public function getArticle($id)
|
||||
{
|
||||
return $this->checkArticle($id);
|
||||
|
@ -33,7 +33,9 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if auth_user.answer_count < 3 %}
|
||||
<div id="tips" data-url="{{ url({'for':'home.answer.tips'}) }}"></div>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@ -46,31 +48,7 @@
|
||||
{% block include_js %}
|
||||
|
||||
{{ js_include('https://cdn.jsdelivr.net/npm/vditor/dist/index.min.js', false) }}
|
||||
{{ js_include('home/js/answer.js') }}
|
||||
{{ js_include('home/js/answer.edit.js') }}
|
||||
{{ js_include('home/js/vditor.js') }}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block inline_js %}
|
||||
|
||||
<script>
|
||||
|
||||
layui.use(['jquery', 'layer'], function () {
|
||||
|
||||
var $ = layui.jquery;
|
||||
var layer = layui.layer;
|
||||
var $tips = $('#tips');
|
||||
|
||||
if ($tips.length > 0) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '答题指南',
|
||||
content: $tips.data('url'),
|
||||
area: ['600px', '320px'],
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
@ -26,7 +26,6 @@
|
||||
<div class="layui-form-item center">
|
||||
<div class="layui-input-block" style="margin:0;">
|
||||
<button class="layui-btn kg-submit" lay-submit="true" lay-filter="go">发布回答</button>
|
||||
<input type="hidden" name="referer" value="{{ referer }}">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@ -44,7 +43,7 @@
|
||||
{% block include_js %}
|
||||
|
||||
{{ js_include('https://cdn.jsdelivr.net/npm/vditor/dist/index.min.js', false) }}
|
||||
{{ js_include('home/js/answer.js') }}
|
||||
{{ js_include('home/js/answer.edit.js') }}
|
||||
{{ js_include('home/js/vditor.js') }}
|
||||
|
||||
{% endblock %}
|
3
app/Http/Home/Views/answer/info.volt
Normal file
3
app/Http/Home/Views/answer/info.volt
Normal file
@ -0,0 +1,3 @@
|
||||
{{ partial('macros/answer') }}
|
||||
|
||||
{{ answer_card(answer,auth_user) }}
|
@ -4,18 +4,20 @@
|
||||
|
||||
{% set title = article.id > 0 ? '编辑文章' : '写文章' %}
|
||||
{% set action_url = article.id > 0 ? url({'for':'home.article.update','id':article.id}) : url({'for':'home.article.create'}) %}
|
||||
{% set source_url_display = article.source_type == 1 ? 'display:none' : 'display:block' %}
|
||||
{% set source_url_display = article.source_type == 1 ? 'display:none;' : 'display:block;' %}
|
||||
|
||||
<div class="breadcrumb">
|
||||
<div class="writer-breadcrumb">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="/">首页</a>
|
||||
<a><cite>{{ title }}</cite></a>
|
||||
</span>
|
||||
<span class="publish">
|
||||
<a href="javascript:" class="layui-btn layui-btn-sm">发布文章 <i class="layui-icon layui-icon-triangle-d"></i></a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<form class="layui-form" method="POST" action="{{ action_url }}">
|
||||
<div class="layout-main clearfix">
|
||||
<div class="layout-content">
|
||||
<div class="layout-main">
|
||||
<div class="writer-content wrap">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
@ -28,21 +30,12 @@
|
||||
<textarea name="content" class="layui-hide" id="vditor-textarea">{{ article.content }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item center">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn kg-submit" lay-submit="true" lay-filter="go">发布文章</button>
|
||||
<input type="hidden" name="referer" value="{{ referer }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layout-sidebar">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">基本信息</div>
|
||||
<div class="layui-card-body">
|
||||
<div id="layer-publish" style="display:none;">
|
||||
<div class="writer-sidebar">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">标签</label>
|
||||
<label class="layui-form-label">分类标签</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="xm-tag-ids"></div>
|
||||
<input type="hidden" name="xm_tags" value='{{ xm_tags|json_encode }}'>
|
||||
@ -81,7 +74,9 @@
|
||||
<input type="radio" name="private" value="0" title="否" {% if article.private == 0 %}checked="checked"{% endif %}>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item last-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn layui-btn-fluid kg-submit" lay-submit="true" lay-filter="go">确认发布</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -5,11 +5,11 @@
|
||||
{{ partial('macros/article') }}
|
||||
|
||||
{% set article_list_url = url({'for':'home.article.list'}) %}
|
||||
{% set article_report_url = url({'for':'home.article.report','id':article.id}) %}
|
||||
{% set article_edit_url = url({'for':'home.article.edit','id':article.id}) %}
|
||||
{% set article_delete_url = url({'for':'home.article.delete','id':article.id}) %}
|
||||
{% set article_owner_url = url({'for':'home.user.show','id':article.owner.id}) %}
|
||||
{% set article_related_url = url({'for':'home.article.related','id':article.id}) %}
|
||||
{% set article_report_url = url({'for':'home.report.add'},{'item_id':article.id,'item_type':106}) %}
|
||||
|
||||
<div class="breadcrumb">
|
||||
<span class="layui-breadcrumb">
|
||||
@ -43,7 +43,7 @@
|
||||
<span class="comment">{{ article.comment_count }} 评论</span>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span class="article-report" data-url="{{ article_report_url }}">举报</span>
|
||||
<span class="kg-report" data-url="{{ article_report_url }}">举报</span>
|
||||
{% if auth_user.id == article.owner.id %}
|
||||
<span class="article-edit" data-url="{{ article_edit_url }}">编辑</span>
|
||||
<span class="kg-delete" data-url="{{ article_delete_url }}">删除</span>
|
||||
@ -63,7 +63,7 @@
|
||||
<div class="source-tips">本作品系原创,转载请注明出处</div>
|
||||
{% elseif article.source_url %}
|
||||
<div class="source-tips">
|
||||
<a href="{{ article.source_url }}" target="_blank">阅读原文</a>
|
||||
<a href="{{ article.source_url }}" target="_blank">前往阅读原文</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
@ -73,27 +73,14 @@
|
||||
{{ partial('article/comment') }}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="wrap center gray">评论已关闭</div>
|
||||
<div class="wrap center gray">
|
||||
<i class="layui-icon layui-icon-close-fill"></i> 评论已关闭
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="layout-sidebar">
|
||||
<div class="sidebar">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">关于作者</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="sidebar-user-card clearfix">
|
||||
<div class="avatar">
|
||||
<img src="{{ article.owner.avatar }}!avatar_160" alt="{{ article.owner.name }}">
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ article_owner_url }}" title="{{ article.owner.about }}">{{ article.owner.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ article.owner.title|default('初出江湖') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ partial('article/show_owner') }}
|
||||
</div>
|
||||
<div class="sidebar" id="sidebar-related" data-url="{{ article_related_url }}"></div>
|
||||
</div>
|
||||
|
16
app/Http/Home/Views/article/show_owner.volt
Normal file
16
app/Http/Home/Views/article/show_owner.volt
Normal file
@ -0,0 +1,16 @@
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">关于作者</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="sidebar-user-card clearfix">
|
||||
<div class="avatar">
|
||||
<img src="{{ article.owner.avatar }}!avatar_160" alt="{{ article.owner.name }}">
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ article_owner_url }}" title="{{ article.owner.about }}">{{ article.owner.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ article.owner.title|default('初出江湖') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -3,7 +3,7 @@
|
||||
|
||||
{% if comment.parent_id == 0 %}
|
||||
<div class="comment-box" id="comment-{{ comment.id }}">
|
||||
<div class="comment-card clearfix">
|
||||
<div class="comment-card">
|
||||
<div class="avatar">
|
||||
<a href="{{ owner_url }}" title="{{ comment.owner.name }}" target="_blank">
|
||||
<img src="{{ comment.owner.avatar }}!avatar_160" alt="{{ comment.owner.name }}">
|
||||
@ -17,7 +17,7 @@
|
||||
<div class="footer">
|
||||
<div class="left">
|
||||
<div class="column">
|
||||
<span class="time" title="{{ date('Y-m-d H:i:s',comment.create_time) }}">{{ comment.create_time|time_ago }}</span>
|
||||
<span class="time">{{ comment.create_time|time_ago }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
@ -50,7 +50,7 @@
|
||||
<div class="content">{{ comment.content }}</div>
|
||||
<div class="footer">
|
||||
<div class="left">
|
||||
<span class="column" title="{{ date('Y-m-d H:i:s',comment.create_time) }}">{{ comment.create_time|time_ago }}</span>
|
||||
<span class="column">{{ comment.create_time|time_ago }}</span>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span class="column">
|
||||
|
@ -1,10 +1,10 @@
|
||||
{% if pager.total_pages > 0 %}
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set report_url = url({'for':'home.comment.report','id':item.id}) %}
|
||||
{% set like_url = url({'for':'home.comment.like','id':item.id}) %}
|
||||
{% set delete_url = url({'for':'home.comment.delete','id':item.id}) %}
|
||||
{% set reply_url = url({'for':'home.comment.reply','id':item.id}) %}
|
||||
{% set report_url = url({'for':'home.report.add'},{'item_id':item.id,'item_type':109}) %}
|
||||
{% set reply_list_url = url({'for':'home.comment.replies','id':item.id},{'limit':5}) %}
|
||||
<div class="comment-box" id="comment-{{ item.id }}">
|
||||
<div class="comment-card">
|
||||
@ -21,7 +21,7 @@
|
||||
<div class="footer">
|
||||
<div class="left">
|
||||
<div class="column">
|
||||
<span class="time" title="{{ date('Y-m-d H:i',item.create_time) }}">{{ item.create_time|time_ago }}</span>
|
||||
<span class="time">{{ item.create_time|time_ago }}</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<span class="like-count" data-count="{{ item.like_count }}">{{ item.like_count }}</span>
|
||||
@ -41,7 +41,7 @@
|
||||
<span class="action comment-reply" data-id="{{ item.id }}">回复</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<span class="action comment-report" data-url="{{ report_url }}">举报</span>
|
||||
<span class="action kg-report" data-url="{{ report_url }}">举报</span>
|
||||
</div>
|
||||
{% if item.owner.id == auth_user.id %}
|
||||
<div class="column">
|
||||
|
@ -4,6 +4,7 @@
|
||||
{% set like_url = url({'for':'home.comment.like','id':item.id}) %}
|
||||
{% set delete_url = url({'for':'home.comment.delete','id':item.id}) %}
|
||||
{% set reply_url = url({'for':'home.comment.reply','id':item.id}) %}
|
||||
{% set report_url = url({'for':'home.report.add'},{'item_id':item.id,'item_type':109}) %}
|
||||
<div class="comment-box" id="comment-{{ item.id }}">
|
||||
<div class="comment-card">
|
||||
<div class="avatar">
|
||||
@ -24,7 +25,7 @@
|
||||
<div class="footer">
|
||||
<div class="left">
|
||||
<div class="column">
|
||||
<span class="time" title="{{ date('Y-m-d H:i',item.create_time) }}">{{ item.create_time|time_ago }}</span>
|
||||
<span class="time">{{ item.create_time|time_ago }}</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<span class="like-count" data-count="{{ item.like_count }}">{{ item.like_count }}</span>
|
||||
@ -40,7 +41,7 @@
|
||||
<span class="action comment-reply" data-id="{{ item.id }}">回复</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<span class="action comment-report" data-id="{{ item.id }}">举报</span>
|
||||
<span class="action kg-report" data-url="{{ report_url }}">举报</span>
|
||||
</div>
|
||||
{% if item.owner.id == auth_user.id %}
|
||||
<div class="column">
|
||||
|
@ -9,3 +9,56 @@
|
||||
未知
|
||||
{% endif %}
|
||||
{%- endmacro %}
|
||||
|
||||
{%- macro answer_card(item,auth_user) %}
|
||||
{% set show_url = full_url({'for':'home.answer.show','id':item.id}) %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set report_url = url({'for':'home.report.add'},{'item_id':item.id,'item_type':108}) %}
|
||||
{% set like_url = url({'for':'home.answer.like','id':item.id}) %}
|
||||
{% set edit_url = url({'for':'home.answer.edit','id':item.id}) %}
|
||||
{% set delete_url = url({'for':'home.answer.delete','id':item.id}) %}
|
||||
<div class="answer-card" id="answer-{{ item.id }}">
|
||||
<div class="header">
|
||||
<span class="avatar">
|
||||
<a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank">
|
||||
<img src="{{ item.owner.avatar }}!avatar_160" alt="{{ item.owner.name }}">
|
||||
</a>
|
||||
</span>
|
||||
<span class="name">
|
||||
<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="content markdown-body">{{ item.content }}</div>
|
||||
<div class="footer">
|
||||
<div class="left">
|
||||
<div class="column">
|
||||
<span class="time" title="{{ date('Y-m-d H:i',item.create_time) }}">{{ item.create_time|time_ago }}</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<span class="like-count" data-count="{{ item.like_count }}">{{ item.like_count }}</span>
|
||||
{% if item.me.liked == 1 %}
|
||||
<span class="action answer-like liked" title="取消点赞" data-url="{{ like_url }}">已赞</span>
|
||||
{% else %}
|
||||
<span class="action answer-like" title="点赞支持" data-url="{{ like_url }}">点赞</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="column">
|
||||
<span class="action kg-copy" title="复制链接" data-clipboard-text="{{ show_url }}">链接</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<span class="action kg-report" data-url="{{ report_url }}">举报</span>
|
||||
</div>
|
||||
{% if auth_user.id == item.owner.id %}
|
||||
<div class="column">
|
||||
<span class="action answer-edit" data-url="{{ edit_url }}">编辑</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<span class="action kg-delete" data-url="{{ delete_url }}">删除</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{%- endmacro %}
|
@ -51,6 +51,12 @@
|
||||
<span class="type">发布问题</span>
|
||||
{% elseif value == 12 %}
|
||||
<span class="type">发布回答</span>
|
||||
{% elseif value == 13 %}
|
||||
<span class="type">文章被赞</span>
|
||||
{% elseif value == 14 %}
|
||||
<span class="type">提问被赞</span>
|
||||
{% elseif value == 15 %}
|
||||
<span class="type">回答被赞</span>
|
||||
{% endif %}
|
||||
{%- endmacro %}
|
||||
|
||||
@ -86,7 +92,16 @@
|
||||
{% set question_url = url({'for':'home.question.show','id':info.question.id}) %}
|
||||
<p class="question"><a href="{{ question_url }}" target="_blank">{{ info.question.title }}</a></p>
|
||||
{% elseif type == 12 %}
|
||||
{% set question_url = url({'for':'home.question.show','id':info.question.id}) %}
|
||||
<p class="answer"><a href="{{ question_url }}" target="_blank">{{ info.question.title }}</a></p>
|
||||
{% elseif type == 13 %}
|
||||
{% set article_url = url({'for':'home.article.show','id':info.article.id}) %}
|
||||
<p class="article"><a href="{{ article_url }}" target="_blank">{{ info.article.title }}</a></p>
|
||||
{% elseif type == 14 %}
|
||||
{% set question_url = url({'for':'home.question.show','id':info.question.id}) %}
|
||||
<p class="question"><a href="{{ question_url }}" target="_blank">{{ info.question.title }}</a></p>
|
||||
{% elseif type == 15 %}
|
||||
{% set question_url = url({'for':'home.question.show','id':info.question.id}) %}
|
||||
<p class="answer"><a href="{{ question_url }}" target="_blank">{{ info.question.title }}</a></p>
|
||||
{% endif %}
|
||||
{%- endmacro %}
|
@ -1,49 +1,8 @@
|
||||
{{ partial('macros/answer') }}
|
||||
|
||||
{% if pager.total_pages > 0 %}
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set like_url = url({'for':'home.answer.like','id':item.id}) %}
|
||||
{% set report_url = url({'for':'home.answer.report','id':item.id}) %}
|
||||
{% set edit_url = url({'for':'home.answer.edit','id':item.id}) %}
|
||||
{% set delete_url = url({'for':'home.answer.delete','id':item.id}) %}
|
||||
<div class="answer-card" id="answer-{{ item.id }}">
|
||||
<div class="header">
|
||||
<span class="avatar">
|
||||
<a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank">
|
||||
<img src="{{ item.owner.avatar }}!avatar_160" alt="{{ item.owner.name }}">
|
||||
</a>
|
||||
</span>
|
||||
<span class="name">{{ item.owner.name }}</span>
|
||||
</div>
|
||||
<div class="content markdown-body">{{ item.content }}</div>
|
||||
<div class="footer">
|
||||
<div class="left">
|
||||
<div class="column">
|
||||
<span class="time" title="{{ date('Y-m-d H:i',item.create_time) }}">{{ item.create_time|time_ago }}</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<span class="like-count" data-count="{{ item.like_count }}">{{ item.like_count }}</span>
|
||||
{% if item.me.liked == 1 %}
|
||||
<span class="action answer-like liked" title="取消点赞" data-url="{{ like_url }}">已赞</span>
|
||||
{% else %}
|
||||
<span class="action answer-like" title="点赞支持" data-url="{{ like_url }}">点赞</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="column">
|
||||
<span class="action answer-report" data-url="{{ report_url }}">举报</span>
|
||||
</div>
|
||||
{% if auth_user.id == item.owner.id %}
|
||||
<div class="column">
|
||||
<span class="action answer-edit" data-url="{{ edit_url }}">编辑</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<span class="action kg-delete" data-url="{{ delete_url }}">删除</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ answer_card(item,auth_user) }}
|
||||
{% endfor %}
|
||||
{{ partial('partials/pager_ajax') }}
|
||||
{% endif %}
|
@ -5,16 +5,18 @@
|
||||
{% set title = question.id > 0 ? '编辑问题' : '提问题' %}
|
||||
{% set action_url = question.id > 0 ? url({'for':'home.question.update','id':question.id}) : url({'for':'home.question.create'}) %}
|
||||
|
||||
<div class="breadcrumb">
|
||||
<div class="writer-breadcrumb">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="/">首页</a>
|
||||
<a><cite>{{ title }}</cite></a>
|
||||
</span>
|
||||
<span class="publish">
|
||||
<a href="javascript:" class="layui-btn layui-btn-sm">发布问题 <i class="layui-icon layui-icon-triangle-d"></i></a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<form class="layui-form" method="POST" action="{{ action_url }}">
|
||||
<div class="layout-main clearfix">
|
||||
<div class="layout-content">
|
||||
<div class="writer-content wrap">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
@ -27,27 +29,20 @@
|
||||
<textarea name="content" class="layui-hide" id="vditor-textarea">{{ question.content }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item center">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn kg-submit" lay-submit="true" lay-filter="go">发布问题</button>
|
||||
<input type="hidden" name="referer" value="{{ referer }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layout-sidebar">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">基本信息</div>
|
||||
<div class="layui-card-body">
|
||||
<div id="layer-publish" style="display:none;">
|
||||
<div class="writer-sidebar">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">标签</label>
|
||||
<label class="layui-form-label">分类标签</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="xm-tag-ids"></div>
|
||||
<input type="hidden" name="xm_tags" value='{{ xm_tags|json_encode }}'>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item last-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn layui-btn-fluid kg-submit" lay-submit="true" lay-filter="go">确认发布</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -5,13 +5,16 @@
|
||||
{{ partial('macros/question') }}
|
||||
|
||||
{% set question_list_url = url({'for':'home.question.list'}) %}
|
||||
{% set question_report_url = url({'for':'home.question.report','id':question.id}) %}
|
||||
{% set question_report_url = url({'for':'home.report.add'},{'item_id':question.id,'item_type':107}) %}
|
||||
{% set question_edit_url = url({'for':'home.question.edit','id':question.id}) %}
|
||||
{% set question_delete_url = url({'for':'home.question.delete','id':question.id}) %}
|
||||
{% set question_show_url = url({'for':'home.question.show','id':question.id}) %}
|
||||
{% set question_owner_url = url({'for':'home.user.show','id':question.owner.id}) %}
|
||||
{% set question_related_url = url({'for':'home.question.related','id':question.id}) %}
|
||||
{% set answer_add_url = url({'for':'home.answer.add'},{'question_id':question.id}) %}
|
||||
{% set answer_list_url = url({'for':'home.question.answers','id':question.id}) %}
|
||||
{% set answer_id = request.getQuery('answer_id','int',0) %}
|
||||
{% set answer_url = url({'for':'home.answer.info','id':answer_id}) %}
|
||||
|
||||
<div class="breadcrumb">
|
||||
<span class="layui-breadcrumb">
|
||||
@ -44,7 +47,7 @@
|
||||
<span class="answer">{{ question.answer_count }} 回答</span>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span class="question-report" data-url="{{ question_report_url }}">举报</span>
|
||||
<span class="kg-report" data-url="{{ question_report_url }}">举报</span>
|
||||
{% if auth_user.id == question.owner.id %}
|
||||
<span class="question-edit" data-url="{{ question_edit_url }}">编辑</span>
|
||||
<span class="question-delete" data-url="{{ question_delete_url }}">删除</span>
|
||||
@ -67,40 +70,24 @@
|
||||
<button class="layui-btn layui-btn-fluid btn-answer" data-url="{{ answer_add_url }}">回答问题</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if question.answer_count > 0 %}
|
||||
{% if answer_id > 0 %}
|
||||
<div class="answer-wrap wrap">
|
||||
<div class="layui-tab layui-tab-brief search-tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this" data-url="{{ answer_list_url }}?sort=popular">热门回答</li>
|
||||
<li data-url="{{ answer_list_url }}?sort=latest">最新回答</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div id="answer-list" data-url="{{ answer_list_url }}?sort=popular"></div>
|
||||
</div>
|
||||
<div id="answer-info" data-url="{{ answer_url }}"></div>
|
||||
</div>
|
||||
{% if question.answer_count > 0 %}
|
||||
<div class="center wrap">
|
||||
<a class="green" href="{{ question_show_url }}">查看全部 {{ question.answer_count }} 个回答</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% elseif question.answer_count > 0 %}
|
||||
<div class="answer-wrap wrap">
|
||||
{{ partial('question/show_answers') }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="layout-sidebar">
|
||||
<div class="sidebar">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">关于作者</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="sidebar-user-card clearfix">
|
||||
<div class="avatar">
|
||||
<img src="{{ question.owner.avatar }}!avatar_160" alt="{{ question.owner.name }}">
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ question_owner_url }}" title="{{ question.owner.about }}">{{ question.owner.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ question.owner.title|default('初出江湖') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ partial('question/show_owner') }}
|
||||
</div>
|
||||
<div class="sidebar" id="sidebar-related" data-url="{{ question_related_url }}"></div>
|
||||
</div>
|
||||
@ -126,8 +113,10 @@
|
||||
|
||||
{% block include_js %}
|
||||
|
||||
{{ js_include('lib/clipboard.min.js') }}
|
||||
{{ js_include('home/js/question.show.js') }}
|
||||
{{ js_include('home/js/question.share.js') }}
|
||||
{{ js_include('home/js/answer.js') }}
|
||||
{{ js_include('home/js/copy.js') }}
|
||||
|
||||
{% endblock %}
|
11
app/Http/Home/Views/question/show_answers.volt
Normal file
11
app/Http/Home/Views/question/show_answers.volt
Normal file
@ -0,0 +1,11 @@
|
||||
<div class="layui-tab layui-tab-brief search-tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this" data-url="{{ answer_list_url }}?sort=popular">热门回答</li>
|
||||
<li data-url="{{ answer_list_url }}?sort=latest">最新回答</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div id="answer-list" data-url="{{ answer_list_url }}?sort=popular"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
16
app/Http/Home/Views/question/show_owner.volt
Normal file
16
app/Http/Home/Views/question/show_owner.volt
Normal file
@ -0,0 +1,16 @@
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">关于作者</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="sidebar-user-card clearfix">
|
||||
<div class="avatar">
|
||||
<img src="{{ question.owner.avatar }}!avatar_160" alt="{{ question.owner.name }}">
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ question_owner_url }}" title="{{ question.owner.about }}">{{ question.owner.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ question.owner.title|default('初出江湖') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
37
app/Http/Home/Views/report/add.volt
Normal file
37
app/Http/Home/Views/report/add.volt
Normal file
@ -0,0 +1,37 @@
|
||||
{% extends 'templates/layer.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<form class="layui-form report-form" method="POST" action="{{ url({'for':'home.report.create'}) }}">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-form-label">举报理由</div>
|
||||
<div class="layui-input-block">
|
||||
<ul class="reason-list">
|
||||
{% for value,title in reasons %}
|
||||
<li><input type="radio" name="reason" value="{{ value }}" title="{{ title }}" lay-filter="reason"></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-form-label">补充说明</div>
|
||||
<div class="layui-input-block">
|
||||
<textarea class="layui-textarea" name="remark"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item center">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit="true" lay-filter="report">确定举报</button>
|
||||
<input type="hidden" name="item_id" value="{{ request.getQuery('item_id') }}">
|
||||
<input type="hidden" name="item_type" value="{{ request.getQuery('item_type') }}">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block include_js %}
|
||||
|
||||
{{ js_include('home/js/report.js') }}
|
||||
|
||||
{% endblock %}
|
@ -24,7 +24,7 @@
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
<col width="15%">
|
||||
<col width="20%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
@ -36,6 +36,7 @@
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set question_url = url({'for':'home.question.show','id':item.question.id}) %}
|
||||
{% set answer_url = url({'for':'home.answer.show','id':item.id}) %}
|
||||
{% set edit_url = url({'for':'home.answer.edit','id':item.id}) %}
|
||||
{% set delete_url = url({'for':'home.answer.delete','id':item.id}) %}
|
||||
<tr>
|
||||
@ -49,7 +50,8 @@
|
||||
</td>
|
||||
<td>{{ item.like_count }}</td>
|
||||
<td>
|
||||
<a href="{{ edit_url }}" class="layui-btn layui-btn-xs">修改</a>
|
||||
<a href="{{ answer_url }}" class="layui-btn layui-btn-xs">详情</a>
|
||||
<a href="{{ edit_url }}" class="layui-btn layui-btn-xs layui-bg-blue">修改</a>
|
||||
<a href="javascript:" class="layui-btn layui-btn-xs layui-bg-red kg-delete" data-url="{{ delete_url }}">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -11,7 +11,7 @@ class AppInfo
|
||||
|
||||
protected $link = 'https://koogua.com';
|
||||
|
||||
protected $version = '1.3.4';
|
||||
protected $version = '1.3.5';
|
||||
|
||||
public function __get($name)
|
||||
{
|
||||
|
26
app/Listeners/Report.php
Normal file
26
app/Listeners/Report.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Listeners;
|
||||
|
||||
use App\Models\Report as ReportModel;
|
||||
use Phalcon\Events\Event as PhEvent;
|
||||
|
||||
class Report extends Listener
|
||||
{
|
||||
|
||||
public function afterCreate(PhEvent $event, $source, ReportModel $report)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function afterUpdate(PhEvent $event, $source, ReportModel $report)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function afterDelete(PhEvent $event, $source, ReportModel $report)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -21,6 +21,26 @@ class UserDailyCounter extends Listener
|
||||
$this->counter->hIncrBy($user->id, 'favorite_count');
|
||||
}
|
||||
|
||||
public function incrReportCount(PhEvent $event, $source, UserModel $user)
|
||||
{
|
||||
$this->counter->hIncrBy($user->id, 'report_count');
|
||||
}
|
||||
|
||||
public function incrArticleCount(PhEvent $event, $source, UserModel $user)
|
||||
{
|
||||
$this->counter->hIncrBy($user->id, 'article_count');
|
||||
}
|
||||
|
||||
public function incrQuestionCount(PhEvent $event, $source, UserModel $user)
|
||||
{
|
||||
$this->counter->hIncrBy($user->id, 'question_count');
|
||||
}
|
||||
|
||||
public function incrAnswerCount(PhEvent $event, $source, UserModel $user)
|
||||
{
|
||||
$this->counter->hIncrBy($user->id, 'answer_count');
|
||||
}
|
||||
|
||||
public function incrCommentCount(PhEvent $event, $source, UserModel $user)
|
||||
{
|
||||
$this->counter->hIncrBy($user->id, 'comment_count');
|
||||
|
@ -26,6 +26,13 @@ class AnswerLike extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class AnswerLike extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_answer_like';
|
||||
@ -43,4 +57,9 @@ class AnswerLike extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,13 @@ class ArticleFavorite extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class ArticleFavorite extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_article_favorite';
|
||||
@ -43,4 +57,9 @@ class ArticleFavorite extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,13 @@ class ArticleLike extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class ArticleLike extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_article_like';
|
||||
@ -43,4 +57,9 @@ class ArticleLike extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,13 @@ class ChapterLike extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class ChapterLike extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_chapter_like';
|
||||
@ -43,4 +57,9 @@ class ChapterLike extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,13 @@ class CommentLike extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class CommentLike extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_comment_like';
|
||||
@ -43,4 +57,9 @@ class CommentLike extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,13 @@ class ConsultLike extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class ConsultLike extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_consult_like';
|
||||
@ -43,4 +57,9 @@ class ConsultLike extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,13 @@ class CourseFavorite extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class CourseFavorite extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_course_favorite';
|
||||
@ -43,4 +57,9 @@ class CourseFavorite extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -20,10 +20,10 @@ class PointHistory extends Model
|
||||
const EVENT_ARTICLE_POST = 10; // 发布文章
|
||||
const EVENT_QUESTION_POST = 11; // 发布问题
|
||||
const EVENT_ANSWER_POST = 12; // 发布回答
|
||||
const EVENT_ANSWER_ACCEPTED = 13; // 回答被采纳
|
||||
const EVENT_ANSWER_LIKED = 14; // 回答被点赞
|
||||
const EVENT_ARTICLE_LIKED = 15; // 文章被点赞
|
||||
const EVENT_QUESTION_LIKED = 16; // 提问被点赞
|
||||
const EVENT_ARTICLE_LIKED = 13; // 文章被点赞
|
||||
const EVENT_QUESTION_LIKED = 14; // 提问被点赞
|
||||
const EVENT_ANSWER_LIKED = 15; // 回答被点赞
|
||||
const EVENT_ANSWER_ACCEPTED = 16; // 回答被采纳
|
||||
|
||||
/**
|
||||
* 主键编号
|
||||
|
@ -26,6 +26,13 @@ class QuestionFavorite extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class QuestionFavorite extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_question_favorite';
|
||||
@ -43,4 +57,9 @@ class QuestionFavorite extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,13 @@ class QuestionLike extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class QuestionLike extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_question_like';
|
||||
@ -43,4 +57,9 @@ class QuestionLike extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -57,4 +57,27 @@ class Reason
|
||||
];
|
||||
}
|
||||
|
||||
public static function commentRejectOptions()
|
||||
{
|
||||
return [
|
||||
101 => '广告软文',
|
||||
102 => '违法内容',
|
||||
103 => '恶意对比',
|
||||
104 => '低俗色情',
|
||||
105 => '人身攻击',
|
||||
106 => '其它问题',
|
||||
];
|
||||
}
|
||||
|
||||
public static function reportOptions()
|
||||
{
|
||||
return [
|
||||
'101' => '推广广告:广告、招聘、推广、测试等内容',
|
||||
'102' => '违规内容:色情、暴力、血腥、敏感信息等',
|
||||
'103' => '违规内容:含有法律、法规禁止的其他内容',
|
||||
'104' => '恶意内容:人身攻击、挑衅辱骂、恶意行为',
|
||||
'105' => '其它理由:请填写补充说明',
|
||||
];
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,13 @@ class Report extends Model
|
||||
*/
|
||||
public $id;
|
||||
|
||||
/**
|
||||
* 举报理由
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $reason;
|
||||
|
||||
/**
|
||||
* 用户编号
|
||||
*
|
||||
@ -48,11 +55,18 @@ class Report extends Model
|
||||
public $item_type;
|
||||
|
||||
/**
|
||||
* 举报理由
|
||||
* 终端类型
|
||||
*
|
||||
* @var string
|
||||
* @var integer
|
||||
*/
|
||||
public $reason;
|
||||
public $client_type = 0;
|
||||
|
||||
/**
|
||||
* 终端IP
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
public $client_ip = '';
|
||||
|
||||
/**
|
||||
* 处理状态
|
||||
@ -97,4 +111,20 @@ class Report extends Model
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
public static function itemTypes()
|
||||
{
|
||||
return [
|
||||
self::ITEM_USER => '用户',
|
||||
self::ITEM_GROUP => '群组',
|
||||
self::ITEM_COURSE => '课程',
|
||||
self::ITEM_CHAPTER => '章节',
|
||||
self::ITEM_CONSULT => '咨询',
|
||||
self::ITEM_REVIEW => '评价',
|
||||
self::ITEM_ARTICLE => '文章',
|
||||
self::ITEM_QUESTION => '提问',
|
||||
self::ITEM_ANSWER => '回答',
|
||||
self::ITEM_COMMENT => '评论',
|
||||
];
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,13 @@ class ReviewLike extends Model
|
||||
*/
|
||||
public $user_id = 0;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $deleted = 0;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*
|
||||
@ -33,6 +40,13 @@ class ReviewLike extends Model
|
||||
*/
|
||||
public $create_time = 0;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $update_time = 0;
|
||||
|
||||
public function getSource(): string
|
||||
{
|
||||
return 'kg_review_like';
|
||||
@ -43,4 +57,9 @@ class ReviewLike extends Model
|
||||
$this->create_time = time();
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
}
|
@ -40,6 +40,10 @@ class Answer extends Repository
|
||||
$builder->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]);
|
||||
}
|
||||
|
||||
if ($sort == 'reported') {
|
||||
$builder->andWhere('report_count > 0');
|
||||
}
|
||||
|
||||
switch ($sort) {
|
||||
case 'popular':
|
||||
$orderBy = 'like_count DESC';
|
||||
|
@ -76,6 +76,10 @@ class Article extends Repository
|
||||
$builder->andWhere('featured = 1');
|
||||
}
|
||||
|
||||
if ($sort == 'reported') {
|
||||
$builder->andWhere('report_count > 0');
|
||||
}
|
||||
|
||||
switch ($sort) {
|
||||
case 'like':
|
||||
$orderBy = 'like_count DESC';
|
||||
|
@ -47,6 +47,10 @@ class Comment extends Repository
|
||||
$builder->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]);
|
||||
}
|
||||
|
||||
if ($sort == 'reported') {
|
||||
$builder->andWhere('report_count > 0');
|
||||
}
|
||||
|
||||
switch ($sort) {
|
||||
case 'popular':
|
||||
$orderBy = 'like_count DESC';
|
||||
|
@ -69,6 +69,10 @@ class Question extends Repository
|
||||
$builder->andWhere('answer_count = 0');
|
||||
}
|
||||
|
||||
if ($sort == 'reported') {
|
||||
$builder->andWhere('report_count > 0');
|
||||
}
|
||||
|
||||
switch ($sort) {
|
||||
case 'active':
|
||||
$orderBy = 'last_reply_time DESC';
|
||||
|
106
app/Repos/Report.php
Normal file
106
app/Repos/Report.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace App\Repos;
|
||||
|
||||
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
|
||||
use App\Models\Report as ReportModel;
|
||||
use Phalcon\Mvc\Model;
|
||||
use Phalcon\Mvc\Model\Resultset;
|
||||
use Phalcon\Mvc\Model\ResultsetInterface;
|
||||
|
||||
class Report extends Repository
|
||||
{
|
||||
|
||||
public function paginate($where = [], $sort = 'latest', $page = 1, $limit = 15)
|
||||
{
|
||||
$builder = $this->modelsManager->createBuilder();
|
||||
|
||||
$builder->from(ReportModel::class);
|
||||
|
||||
$builder->where('1 = 1');
|
||||
|
||||
if (!empty($where['item_id'])) {
|
||||
$builder->andWhere('item_id = :item_id:', ['item_id' => $where['item_id']]);
|
||||
}
|
||||
|
||||
if (!empty($where['item_type'])) {
|
||||
$builder->andWhere('item_type = :item_type:', ['item_type' => $where['item_type']]);
|
||||
}
|
||||
|
||||
if (!empty($where['owner_id'])) {
|
||||
$builder->andWhere('owner_id = :owner_id:', ['owner_id' => $where['owner_id']]);
|
||||
}
|
||||
|
||||
if (isset($where['reviewed'])) {
|
||||
$builder->andWhere('reviewed = :reviewed:', ['reviewed' => $where['reviewed']]);
|
||||
}
|
||||
|
||||
if (isset($where['accepted'])) {
|
||||
$builder->andWhere('accepted = :accepted:', ['accepted' => $where['accepted']]);
|
||||
}
|
||||
|
||||
switch ($sort) {
|
||||
default:
|
||||
$orderBy = 'id DESC';
|
||||
break;
|
||||
}
|
||||
|
||||
$builder->orderBy($orderBy);
|
||||
|
||||
$pager = new PagerQueryBuilder([
|
||||
'builder' => $builder,
|
||||
'page' => $page,
|
||||
'limit' => $limit,
|
||||
]);
|
||||
|
||||
return $pager->paginate();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $id
|
||||
* @return ReportModel|Model|bool
|
||||
*/
|
||||
public function findById($id)
|
||||
{
|
||||
return ReportModel::findFirst([
|
||||
'conditions' => 'id = :id:',
|
||||
'bind' => ['id' => $id],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $ids
|
||||
* @param array|string $columns
|
||||
* @return ResultsetInterface|Resultset|ReportModel[]
|
||||
*/
|
||||
public function findByIds($ids, $columns = '*')
|
||||
{
|
||||
return ReportModel::query()
|
||||
->columns($columns)
|
||||
->inWhere('id', $ids)
|
||||
->execute();
|
||||
}
|
||||
|
||||
public function findUserReport($userId, $itemId, $itemType)
|
||||
{
|
||||
return ReportModel::findFirst([
|
||||
'conditions' => 'owner_id = ?1 AND item_id = ?2 AND item_type = ?3',
|
||||
'bind' => [1 => $userId, 2 => $itemId, 3 => $itemType],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $itemId
|
||||
* @param int $itemType
|
||||
* @return ResultsetInterface|Resultset|ReportModel[]
|
||||
*/
|
||||
public function findItemPendingReports($itemId, $itemType)
|
||||
{
|
||||
return ReportModel::query()
|
||||
->where('item_id = :item_id:', ['item_id' => $itemId])
|
||||
->andWhere('item_type = :item_type:', ['item_type' => $itemType])
|
||||
->andWhere('reviewed = 0')
|
||||
->execute();
|
||||
}
|
||||
|
||||
}
|
@ -50,6 +50,34 @@ class Stat extends Repository
|
||||
]);
|
||||
}
|
||||
|
||||
public function countReportedArticles()
|
||||
{
|
||||
return (int)ArticleModel::count([
|
||||
'conditions' => 'report_count > 0',
|
||||
]);
|
||||
}
|
||||
|
||||
public function countReportedQuestions()
|
||||
{
|
||||
return (int)ArticleModel::count([
|
||||
'conditions' => 'report_count > 0',
|
||||
]);
|
||||
}
|
||||
|
||||
public function countReportedAnswers()
|
||||
{
|
||||
return (int)AnswerModel::count([
|
||||
'conditions' => 'report_count > 0',
|
||||
]);
|
||||
}
|
||||
|
||||
public function countReportedComments()
|
||||
{
|
||||
return (int)CommentModel::count([
|
||||
'conditions' => 'report_count > 0',
|
||||
]);
|
||||
}
|
||||
|
||||
public function countDailyRegisteredUsers($date)
|
||||
{
|
||||
$startTime = strtotime($date);
|
||||
@ -62,7 +90,7 @@ class Stat extends Repository
|
||||
]);
|
||||
}
|
||||
|
||||
public function countDailyOnlineUser($date)
|
||||
public function countDailyOnlineUsers($date)
|
||||
{
|
||||
$startTime = strtotime($date);
|
||||
|
||||
|
@ -12,9 +12,9 @@ use App\Services\Logic\Notice\System\QuestionAnswered as QuestionAnsweredNotice;
|
||||
use App\Services\Logic\Point\History\AnswerPost as AnswerPostPointHistory;
|
||||
use App\Services\Logic\QuestionTrait;
|
||||
use App\Services\Logic\Service as LogicService;
|
||||
use App\Services\Sync\QuestionScore as QuestionScoreSync;
|
||||
use App\Traits\Client as ClientTrait;
|
||||
use App\Validators\Answer as AnswerValidator;
|
||||
use App\Validators\UserLimit as UserLimitValidator;
|
||||
|
||||
class AnswerCreate extends LogicService
|
||||
{
|
||||
@ -31,6 +31,10 @@ class AnswerCreate extends LogicService
|
||||
|
||||
$user = $this->getLoginUser();
|
||||
|
||||
$validator = new UserLimitValidator();
|
||||
|
||||
$validator->checkDailyAnswerLimit($user);
|
||||
|
||||
$validator = new AnswerValidator();
|
||||
|
||||
$validator->checkIfAllowAnswer($question, $user);
|
||||
@ -38,7 +42,6 @@ class AnswerCreate extends LogicService
|
||||
$answer = new AnswerModel();
|
||||
|
||||
$answer->published = $this->getPublishStatus($user);
|
||||
|
||||
$answer->content = $validator->checkContent($post['content']);
|
||||
$answer->client_type = $this->getClientType();
|
||||
$answer->client_ip = $this->getClientIp();
|
||||
@ -47,6 +50,7 @@ class AnswerCreate extends LogicService
|
||||
|
||||
$answer->create();
|
||||
|
||||
$this->incrUserDailyAnswerCount($user);
|
||||
$this->recountQuestionAnswers($question);
|
||||
$this->recountUserAnswers($user);
|
||||
|
||||
@ -58,10 +62,11 @@ class AnswerCreate extends LogicService
|
||||
|
||||
$question->update();
|
||||
|
||||
$this->syncQuestionScore($question);
|
||||
if ($user->id != $question->owner_id) {
|
||||
$this->handleAnswerPostPoint($answer);
|
||||
$this->handleQuestionAnsweredNotice($answer);
|
||||
}
|
||||
}
|
||||
|
||||
$this->eventsManager->fire('Answer:afterCreate', $this, $answer);
|
||||
|
||||
@ -73,6 +78,11 @@ class AnswerCreate extends LogicService
|
||||
return $user->answer_count > 2 ? AnswerModel::PUBLISH_APPROVED : AnswerModel::PUBLISH_PENDING;
|
||||
}
|
||||
|
||||
protected function incrUserDailyAnswerCount(UserModel $user)
|
||||
{
|
||||
$this->eventsManager->fire('UserDailyCounter:incrAnswerCount', $this, $user);
|
||||
}
|
||||
|
||||
protected function recountQuestionAnswers(QuestionModel $question)
|
||||
{
|
||||
$questionRepo = new QuestionRepo();
|
||||
@ -95,13 +105,6 @@ class AnswerCreate extends LogicService
|
||||
$user->update();
|
||||
}
|
||||
|
||||
protected function syncQuestionScore(QuestionModel $question)
|
||||
{
|
||||
$sync = new QuestionScoreSync();
|
||||
|
||||
$sync->addItem($question->id);
|
||||
}
|
||||
|
||||
protected function handleQuestionAnsweredNotice(AnswerModel $answer)
|
||||
{
|
||||
if ($answer->published != AnswerModel::PUBLISH_APPROVED) return;
|
||||
|
@ -9,7 +9,6 @@ use App\Repos\User as UserRepo;
|
||||
use App\Services\Logic\AnswerTrait;
|
||||
use App\Services\Logic\QuestionTrait;
|
||||
use App\Services\Logic\Service as LogicService;
|
||||
use App\Services\Sync\QuestionScore as QuestionScoreSync;
|
||||
use App\Validators\Answer as AnswerValidator;
|
||||
|
||||
class AnswerDelete extends LogicService
|
||||
@ -66,11 +65,4 @@ class AnswerDelete extends LogicService
|
||||
$user->update();
|
||||
}
|
||||
|
||||
protected function syncQuestionScore(QuestionModel $question)
|
||||
{
|
||||
$sync = new QuestionScoreSync();
|
||||
|
||||
$sync->addItem($question->id);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,6 +3,8 @@
|
||||
namespace App\Services\Logic\Answer;
|
||||
|
||||
use App\Models\Answer as AnswerModel;
|
||||
use App\Models\User as UserModel;
|
||||
use App\Repos\AnswerLike as AnswerLikeRepo;
|
||||
use App\Repos\Question as QuestionRepo;
|
||||
use App\Repos\User as UserRepo;
|
||||
use App\Services\Logic\AnswerTrait;
|
||||
@ -17,10 +19,12 @@ class AnswerInfo extends LogicService
|
||||
{
|
||||
$answer = $this->checkAnswer($id);
|
||||
|
||||
return $this->handleAnswer($answer);
|
||||
$user = $this->getCurrentUser();
|
||||
|
||||
return $this->handleAnswer($answer, $user);
|
||||
}
|
||||
|
||||
protected function handleAnswer(AnswerModel $answer)
|
||||
protected function handleAnswer(AnswerModel $answer, UserModel $user)
|
||||
{
|
||||
$answer->content = kg_parse_markdown($answer->content);
|
||||
|
||||
@ -37,6 +41,7 @@ class AnswerInfo extends LogicService
|
||||
|
||||
$result['question'] = $this->handleQuestionInfo($answer);
|
||||
$result['owner'] = $this->handleOwnerInfo($answer);
|
||||
$result['me'] = $this->handleMeInfo($answer, $user);
|
||||
|
||||
return $result;
|
||||
}
|
||||
@ -66,4 +71,24 @@ class AnswerInfo extends LogicService
|
||||
];
|
||||
}
|
||||
|
||||
protected function handleMeInfo(AnswerModel $answer, UserModel $user)
|
||||
{
|
||||
$me = [
|
||||
'liked' => 0,
|
||||
];
|
||||
|
||||
if ($user->id > 0) {
|
||||
|
||||
$likeRepo = new AnswerLikeRepo();
|
||||
|
||||
$like = $likeRepo->findAnswerLike($answer->id, $user->id);
|
||||
|
||||
if ($like && $like->deleted == 0) {
|
||||
$me['liked'] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $me;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ use App\Models\User as UserModel;
|
||||
use App\Repos\AnswerLike as AnswerLikeRepo;
|
||||
use App\Services\Logic\AnswerTrait;
|
||||
use App\Services\Logic\Notice\System\AnswerLiked as AnswerLikedNotice;
|
||||
use App\Services\Logic\Point\History\AnswerLiked as AnswerLikedPointHistory;
|
||||
use App\Services\Logic\Service as LogicService;
|
||||
use App\Validators\UserLimit as UserLimitValidator;
|
||||
|
||||
@ -30,9 +31,9 @@ class AnswerLike extends LogicService
|
||||
|
||||
$answerLike = $likeRepo->findAnswerLike($answer->id, $user->id);
|
||||
|
||||
if (!$answerLike) {
|
||||
$isFirstTime = true;
|
||||
|
||||
$action = 'do';
|
||||
if (!$answerLike) {
|
||||
|
||||
$answerLike = new AnswerLikeModel();
|
||||
|
||||
@ -41,9 +42,22 @@ class AnswerLike extends LogicService
|
||||
|
||||
$answerLike->create();
|
||||
|
||||
$this->incrAnswerLikeCount($answer);
|
||||
} else {
|
||||
|
||||
$this->handleLikeNotice($answer, $user);
|
||||
$isFirstTime = false;
|
||||
|
||||
$answerLike->deleted = $answerLike->deleted == 1 ? 0 : 1;
|
||||
|
||||
$answerLike->update();
|
||||
}
|
||||
|
||||
$this->incrUserDailyAnswerLikeCount($user);
|
||||
|
||||
if ($answerLike->deleted == 0) {
|
||||
|
||||
$action = 'do';
|
||||
|
||||
$this->incrAnswerLikeCount($answer);
|
||||
|
||||
$this->eventsManager->fire('Answer:afterLike', $this, $answer);
|
||||
|
||||
@ -51,14 +65,20 @@ class AnswerLike extends LogicService
|
||||
|
||||
$action = 'undo';
|
||||
|
||||
$answerLike->delete();
|
||||
|
||||
$this->decrAnswerLikeCount($answer);
|
||||
|
||||
$this->eventsManager->fire('Answer:afterUndoLike', $this, $answer);
|
||||
}
|
||||
|
||||
$this->incrUserDailyAnswerLikeCount($user);
|
||||
$isOwner = $user->id == $answer->owner_id;
|
||||
|
||||
/**
|
||||
* 仅首次点赞发送通知和奖励积分
|
||||
*/
|
||||
if ($isFirstTime && !$isOwner) {
|
||||
$this->handleAnswerLikedNotice($answer, $user);
|
||||
$this->handleAnswerLikedPoint($answerLike);
|
||||
}
|
||||
|
||||
return [
|
||||
'action' => $action,
|
||||
@ -86,11 +106,18 @@ class AnswerLike extends LogicService
|
||||
$this->eventsManager->fire('UserDailyCounter:incrAnswerLikeCount', $this, $user);
|
||||
}
|
||||
|
||||
protected function handleLikeNotice(AnswerModel $answer, UserModel $sender)
|
||||
protected function handleAnswerLikedNotice(AnswerModel $answer, UserModel $sender)
|
||||
{
|
||||
$notice = new AnswerLikedNotice();
|
||||
|
||||
$notice->handle($answer, $sender);
|
||||
}
|
||||
|
||||
protected function handleAnswerLikedPoint(AnswerLikeModel $answerLike)
|
||||
{
|
||||
$service = new AnswerLikedPointHistory();
|
||||
|
||||
$service->handle($answerLike);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,11 +2,9 @@
|
||||
|
||||
namespace App\Services\Logic\Answer;
|
||||
|
||||
use App\Models\Question as QuestionModel;
|
||||
use App\Services\Logic\AnswerTrait;
|
||||
use App\Services\Logic\QuestionTrait;
|
||||
use App\Services\Logic\Service as LogicService;
|
||||
use App\Services\Sync\QuestionScore as QuestionScoreSync;
|
||||
use App\Traits\Client as ClientTrait;
|
||||
use App\Validators\Answer as AnswerValidator;
|
||||
|
||||
@ -42,11 +40,4 @@ class AnswerUpdate extends LogicService
|
||||
return $answer;
|
||||
}
|
||||
|
||||
protected function syncQuestionScore(QuestionModel $question)
|
||||
{
|
||||
$sync = new QuestionScoreSync();
|
||||
|
||||
$sync->addItem($question->id);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -6,14 +6,14 @@ use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Models\Comment as CommentModel;
|
||||
use App\Repos\Comment as CommentRepo;
|
||||
use App\Services\Logic\AnswerTrait;
|
||||
use App\Services\Logic\Comment\CommentListTrait;
|
||||
use App\Services\Logic\Comment\ListTrait;
|
||||
use App\Services\Logic\Service as LogicService;
|
||||
|
||||
class CommentList extends LogicService
|
||||
{
|
||||
|
||||
use AnswerTrait;
|
||||
use CommentListTrait;
|
||||
use ListTrait;
|
||||
|
||||
public function handle($id)
|
||||
{
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user