ADD: Система флагов

Сделаем пока только «пожаловаться» без выбора причин и пояснений к этому.
This commit is contained in:
Evg 2021-08-17 16:51:15 +03:00
parent 4a0cf01c0a
commit ab467806a5
17 changed files with 326 additions and 7 deletions

View file

@ -89,4 +89,5 @@ class ActionController extends \MainController
return ActionModel::getSearch($search, $type);
}
}

View file

@ -0,0 +1,51 @@
<?php
namespace App\Controllers;
use Hleb\Constructor\Handlers\Request;
use App\Models\NotificationsModel;
use App\Models\PostModel;
use App\Models\ReportModel;
use Lori\Base;
class ReportController extends \MainController
{
public function index()
{
$uid = Base::getUid();
$content_type = \Request::getPost('type');
$post_id = \Request::getPostInt('post_id');
$content_id = \Request::getPostInt('content_id');
if ($uid['user_trust_level'] < 1) {
return false;
}
$post = PostModel::getPostId($post_id);
Base::PageError404($post);
$type_id = 'comment_' . $content_id;
if ($content_type == 'answer') {
$type_id = 'answer_' . $content_id;
}
$url_report = '/post/' . $post['post_id'] . '/' . $post['post_slug'] . '#' . $type_id;
// Оповещение админу
$type = 20; // Система флагов
$user_id = 1; // админу
NotificationsModel::send($uid['user_id'], $user_id, $type, $post_id, $url_report, 1);
$data = [
'report_user_id' => $uid['user_id'],
'report_type' => $content_type,
'report_content_id' => $content_id,
'report_reason' => lang('Breaking the rules'),
'report_url' => $url_report,
'report_date' => date("Y-m-d H:i:s"),
'report_status' => 0,
];
ReportModel::send($data);
}
}

View file

@ -10,8 +10,13 @@ return [
'Create Post' => 'Написать пост',
'Create' => 'Написать',
'Reads' => 'Читают',
'Saw' => 'Видел',
'The post' => 'Поста',
'Bodies' => 'Тела',
'Thanks' => 'Спасибо',
'Report' => 'Флаг',
'Reports' => 'Флаги',
'complained about' => 'пожаловался на',
'Freely' => 'Свободно',
'Useful resources' => 'Полезные ресурсы',
'Comment deleted' => 'Комментарий удален',
@ -313,6 +318,8 @@ return [
'invate-to-replay' => 'Вы уже отсылали приглашение этому пользователю',
'limit-post-day' => 'Вы исчерпали лимит постов на сегодня',
'Registration by invite'=> 'Регистрация по инвайту',
'Breaking the rules' => 'Нарушение правил',
/* Meta - desc */
'desc-user-all' => 'Список всех участников сортированных по дате регистрации на сайте',

View file

@ -19,6 +19,7 @@ class NotificationsModel extends \MainModel
// 11 - в ответах (@login)
// 12 - в комментариях (@login)
// 15 - аудит
// 20 - флаг система
// Лист уведомлений
public static function listNotification($user_id)

View file

@ -0,0 +1,41 @@
<?php
namespace App\Models;
use App\Models\NotificationsModel;
use DB;
class ReportModel extends \MainModel
{
// Записываем флаг
public static function send($data)
{
$params = [
'report_user_id' => $data['report_user_id'],
'report_type' => $data['report_type'],
'report_content_id' => $data['report_content_id'],
'report_reason' => $data['report_reason'],
'report_url' => $data['report_url'],
'report_date' => $data['report_date'],
'report_status' => $data['report_status'],
];
$sql = "INSERT INTO reports(report_user_id,
report_type,
report_content_id,
report_reason,
report_url,
report_date,
report_status)
VALUES(:report_user_id,
:report_type,
:report_content_id,
:report_reason,
:report_url,
:report_date,
:report_status)";
return DB::run($sql, $params);
}
}

View file

@ -4,6 +4,7 @@
* MIT License
* https://github.com/BertMaurau/php-url-scraper
* @author Bert Maurau
* См. https://github.com/orcnd/parseMetaTags
*/
class URLScraper

View file

@ -0,0 +1,48 @@
<?php
namespace Modules\Admin\Controllers;
use Hleb\Constructor\Handlers\Request;
use Modules\Admin\Models\ReportModel;
use App\Models\UserModel;
use Lori\Base;
class ReportsController extends \MainController
{
public function index()
{
$uid = Base::getUid();
$page = \Request::getInt('page');
$page = $page == 0 ? 1 : $page;
$limit = 50;
$pagesCount = ReportModel::getCount();
$reports = ReportModel::get($page, $limit);
$result = array();
foreach ($reports as $ind => $row) {
$row['user'] = UserModel::getUser($row['report_user_id'], 'id');
$row['date'] = lang_date($row['report_date']);
$result[$ind] = $row;
}
$data = [
'pagesCount' => ceil($pagesCount / $limit),
'pNum' => $page,
'meta_title' => lang('Reports'),
'sheet' => 'reports',
];
return view('/templates/reports', ['data' => $data, 'uid' => $uid, 'reports' => $result]);
}
// Ознакомился
public function status()
{
$report_id = \Request::getPostInt('id');
ReportModel::setStatus($report_id);
return true;
}
}

View file

@ -0,0 +1,41 @@
<?php
namespace Modules\Admin\Models;
use DB;
use PDO;
class ReportModel extends \MainModel
{
public static function get($page, $limit)
{
$start = ($page - 1) * $limit;
$sql = "SELECT
report_id,
report_user_id,
report_type,
report_content_id,
report_reason,
report_url,
report_date,
report_status
FROM reports ORDER BY report_id DESC LIMIT $start, $limit";
return DB::run($sql)->fetchAll(PDO::FETCH_ASSOC);
}
public static function getCount()
{
return DB::run("SELECT report_id FROM reports")->rowCount();
}
// Изменим отмеку о занесении в бан-лист
public static function setStatus($report_id)
{
$sql = "UPDATE reports
SET report_status = 1
WHERE report_id = :report_id";
return DB::run($sql, ['report_id' => $report_id]);
}
}

View file

@ -23,6 +23,12 @@
<span class="size-15 middle"><?= lang('Users'); ?></span>
</a>
</li>
<li class="nav<?php if ($data['sheet'] == 'reports') { ?> active<?php } ?>">
<a title="<?= lang('Reports'); ?>" href="/admin/reports">
<i class="icon-warning-empty middle mr10"></i>
<span class="size-15 middle"><?= lang('Reports'); ?></span>
</a>
</li>
<li class="nav<?php if ($data['sheet'] == 'audits' || $data['sheet'] == 'audits') { ?> active<?php } ?>">
<a title="<?= lang('Audit'); ?>" href="/admin/audits">
<i class="icon-lightbulb middle mr10"></i>
@ -84,7 +90,7 @@
</a>
</li>
</ul>
<div class="center gray size-13">
------------------------
<br>

View file

@ -0,0 +1,58 @@
<?php include TEMPLATE_ADMIN_DIR . '/_block/header-admin.php'; ?>
<div class="wrap">
<main class="admin">
<div class="white-box">
<div class="pt5 pr15 pb5 pl15">
<?= breadcrumb('/admin', lang('Admin'), '/admin/users', lang('Users'), $data['meta_title']); ?>
<div class="t-table">
<div class="t-th">
<span class="t-td center">N</span>
<span class="t-td"><?= lang('Avatar'); ?></span>
<span class="t-td"><?= lang('Information'); ?></span>
<span class="t-td center"><?= lang('Saw'); ?></span>
</div>
<?php if ($reports) { ?>
<?php foreach ($reports as $report) { ?>
<div class="t-tr">
<span class="t-td width-30 center">
<?= $report['report_id']; ?>
</span>
<span class="t-td width-30">
<a class="gray" href="/u/<?= $report['user']['user_login']; ?>">
<?= user_avatar_img($report['user']['user_avatar'], 'max', $report['user']['user_login'], 'ava-24 mr5'); ?>
<?= $report['user']['user_login']; ?>
</a>
</span>
<span class="t-td">
<div class="size-13 gray lowercase">
<?= $report['report_type']; ?>
<span class="mr5 ml5"> &#183; </span>
<?= $report['date']; ?>
</div>
<div class="mt5">
<a href="<?= $report['report_url']; ?>"><?= $report['report_url']; ?></a>
</div>
</span>
<span class="t-td center<?php if ($report['report_status'] == 0) { ?> delleted<?php } ?>">
<span class="report-status" data-id="<?= $report['report_id']; ?>">
<i class="icon-air gray size-21"></i>
</span>
</span>
</div>
<?php } ?>
<?php } else { ?>
<p class="no-content gray">
<i class="icon-info green middle"></i>
<span class="middle"><?= lang('No users'); ?>...</span>
</p>
<?php } ?>
</div>
<?= pagination($data['pNum'], $data['pagesCount'], null, '/admin/reports'); ?>
</div>
</div>
</main>
</div>
<?php include TEMPLATE_ADMIN_DIR . '/_block/footer-admin.php'; ?>

View file

@ -1,4 +1,16 @@
$(function(){
// Я читал флаг
$(document).on('click', '.report-status', function() {
let report_id = $(this).data('id');
fetch("/admin/reports/status", {
method: "POST",
body: "id=" + report_id,
headers:{'Content-Type': 'application/x-www-form-urlencoded'}
})
.then((response) => {
location.reload();
})
});
// Забанить / разбанить участника
$(document).on('click', '.user-ban', function() {
let user_id = $(this).data('id');

View file

@ -47,6 +47,15 @@
<?php } ?>
</a>
<?php } ?>
<?php if ($notif['notification_action_type'] == 20) { ?>
<i class="icon-warning-empty middle red"></i>
<span class="mr5 ml5"></span>
<a class="gray" href="/u/<?= $notif['user_login']; ?>"><?= $notif['user_login']; ?></a>
<?= lang('complained about'); ?>
<a class="ntf2 lowercase" href="/notifications/read/<?= $notif['notification_id']; ?>">
<?= lang('Comment'); ?>
</a>
<?php } ?>
<?php if ($notif['notification_action_type'] == 15) { ?>
<a class="ntf2 lowercase" href="/notifications/read/<?= $notif['notification_id']; ?>">
<i class="icon-lightbulb middle red"></i>

View file

@ -88,6 +88,13 @@
</a>
</span>
<?php } ?>
<?php if ($uid['user_trust_level'] > 0) { ?>
<span id="answer_dell" class="ml15">
<a data-post_id="<?= $post['post_id']; ?>" data-type="answer" data-content_id="<?= $answer['answer_id']; ?>" class="msg-flag gray">
<?= lang('Report'); ?>
</a>
</span>
<?php } ?>
</div>
</div>
<div id="answer_addentry<?= $answer['answer_id']; ?>" class="reply"></div>
@ -184,13 +191,19 @@
<?= lang('Edit'); ?>
</a>
</span>
<span id="comment_dell" class="mr5 ml5">
<a data-type="comment" data-id="<?= $comment['comment_id']; ?>" class="type-action gray">
<?= lang('Remove'); ?>
</a>
</span>
<?php } ?>
<?php if ($uid['user_trust_level'] > 0) { ?>
<span id="answer_dell" class="ml15">
<a data-post_id="<?= $post['post_id']; ?>"data-type="comment" data-content_id="<?= $comment['comment_id']; ?>" class="msg-flag gray">
<?= lang('Report'); ?>
</a>
</span>
<?php } ?>
</div>
</div>
<div id="comment_addentry<?= $comment['comment_id']; ?>" class="reply"></div>

View file

@ -40,7 +40,7 @@
<?php if ($uid['user_trust_level'] >= Lori\Config::get(Lori\Config::PARAM_TL_ADD_COMM_QA)) { ?>
<?php if ($post['post_closed'] == 0) { ?>
<?php if ($post['post_is_deleted'] == 0 || $uid['user_trust_level'] == 5) { ?>
<span class="mr5 ml5">
<span class="ml15">
<a data-post_id="<?= $post['post_id']; ?>" data-answer_id="<?= $answer['answer_id']; ?>" class="add-comment gray"><?= lang('Reply'); ?></a>
</span>
<?php } ?>
@ -48,7 +48,7 @@
<?php } ?>
<?php if ($uid['user_id'] == $answer['answer_user_id'] || $uid['user_trust_level'] == 5) { ?>
<span id="answer_edit" class="mr5 ml5">
<span id="answer_edit" class="ml15">
<a class="editansw gray" href="/answer/edit/<?= $answer['answer_id']; ?>">
<?= lang('Edit'); ?>
</a>
@ -56,7 +56,7 @@
<?php } ?>
<?php if ($uid['user_id']) { ?>
<span class="add-favorite gray mr5 ml5" data-id="<?= $answer['answer_id']; ?>" data-type="answer">
<span class="add-favorite gray ml15" data-id="<?= $answer['answer_id']; ?>" data-type="answer">
<?php if ($answer['favorite_user_id']) { ?>
<?= lang('remove-favorites'); ?>
<?php } else { ?>
@ -67,12 +67,19 @@
<?php if ($uid['user_trust_level'] == 5) { ?>
<span class="mr5 ml5"></span>
<span id="answer_dell" class="mr5 ml5">
<span id="answer_dell" class="ml15">
<a data-type="answer" data-id="<?= $answer['answer_id']; ?>" class="type-action gray">
<?= lang('Remove'); ?>
</a>
</span>
<?php } ?>
<?php if ($uid['user_trust_level'] > 0) { ?>
<span id="answer_dell" class="ml15">
<a data-post_id="<?= $post['post_id']; ?>" data-type="answer" data-content_id="<?= $answer['answer_id']; ?>" class="msg-flag gray">
<?= lang('Report'); ?>
</a>
</span>
<?php } ?>
</div>
<div id="answer_addentry<?= $answer['answer_id']; ?>" class="reply"></div>
</li>
@ -135,7 +142,13 @@
</a>
</span>
<?php } ?>
<?php if ($uid['user_trust_level'] > 0) { ?>
<span id="answer_dell" class="ml5">
<a data-post_id="<?= $post['post_id']; ?>" data-type="comment" data-content_id="<?= $comment['comment_id']; ?>" class="msg-flag gray">
<?= lang('Report'); ?>
</a>
</span>
<?php } ?>
</div>
</div>
<div id="comment_addentry<?= $comment['comment_id']; ?>" class="reply"></div>

View file

@ -298,6 +298,18 @@
photos: '#layer-photos',
anim: 4
});
$(document).on('click', '.msg-flag', function() {
let post_id = $(this).data('post_id');
let content_id = $(this).data('content_id');
let type = $(this).data('type');
layer.confirm('Это нарушает правила сайта?',
{icon: 5, title: '<?= lang('Report'); ?>',
btn: ['<?= lang('Yes'); ?>', '<?= lang('No'); ?>']}, function(index) {
$.post('/flag/repost', {type, post_id, content_id}, function(str){
layer.msg('<?= lang('Thanks'); ?>!');
});
});
});
});
</script>
<?php include TEMPLATE_DIR . '/footer.php'; ?>

View file

@ -10,6 +10,7 @@ Route::before('Authorization@admin')->getGroup();
Route::get('/favicon/add')->module('admin', 'Controllers\WebsController@favicon');
Route::get('/word/del')->module('admin', 'Controllers\WordsController@deletes');
Route::get('/audit/status')->module('admin', 'Controllers\AuditsController@status');
Route::get('/reports/status')->module('admin', 'Controllers\ReportsController@status');
Route::getProtect();
Route::get('/badge/user/add')->module('admin', 'Controllers\BadgesController@addUser');
@ -67,4 +68,7 @@ Route::before('Authorization@admin')->getGroup();
Route::get('/words/add')->module('admin', 'Controllers\WordsController@addPage');
Route::get('/words')->module('admin', 'Controllers\WordsController', ['all']);
Route::get('/reports')->module('admin', 'Controllers\ReportsController');
Route::get('/reports/page/{page?}')->module('admin', 'Controllers\ReportsController')->where(['page' => '[0-9]+']);
Route::endGroup();

View file

@ -3,6 +3,7 @@
Route::before('Authorization@noAuth')->getGroup();
Route::getType('post');
Route::get('/flag/repost')->controller('ReportController');
Route::get('/backend/uploadimage')->controller('Post\EditPostController@uploadimage');
Route::get('/status/action')->controller('ActionController@deletingAndRestoring');
Route::get('/post/grabtitle')->controller('Post\AddPostController@grabMeta');