From 9d5376926f41ed444cce905f8e78c5ce43a29835 Mon Sep 17 00:00:00 2001 From: flashwave Date: Sat, 13 Apr 2019 01:28:09 +0200 Subject: [PATCH] Better indexing and added statistics overview to manage. --- assets/less/manage/manage.less | 2 + assets/less/manage/statistic.less | 16 ++ assets/less/manage/statistics.less | 14 ++ .../2019_04_12_224041_add_more_indices.php | 100 ++++++++++ public/manage/index.php | 178 +++++++++++++++++- templates/manage/general/overview.twig | 54 +++++- 6 files changed, 361 insertions(+), 3 deletions(-) create mode 100644 assets/less/manage/statistic.less create mode 100644 assets/less/manage/statistics.less create mode 100644 database/2019_04_12_224041_add_more_indices.php diff --git a/assets/less/manage/manage.less b/assets/less/manage/manage.less index 0141b0ad..76e9da07 100644 --- a/assets/less/manage/manage.less +++ b/assets/less/manage/manage.less @@ -35,3 +35,5 @@ @import "user-item"; @import "user"; @import "users"; +@import "statistic"; +@import "statistics"; diff --git a/assets/less/manage/statistic.less b/assets/less/manage/statistic.less new file mode 100644 index 00000000..19e39130 --- /dev/null +++ b/assets/less/manage/statistic.less @@ -0,0 +1,16 @@ +.manage__statistic { + border: 1px solid var(--accent-colour); + border-radius: 2px; + padding: 2px 5px; + + &__name { + font-size: 1.1em; + line-height: 1.5em; + } + + &__value { + text-align: right; + font-size: 1.5em; + line-height: 2em; + } +} diff --git a/assets/less/manage/statistics.less b/assets/less/manage/statistics.less new file mode 100644 index 00000000..54fbd878 --- /dev/null +++ b/assets/less/manage/statistics.less @@ -0,0 +1,14 @@ +.manage__statistics { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + padding: 5px; + grid-gap: 5px; + + @media (max-width: 900px) { + grid-template-columns: 1fr 1fr; + } + + @media (max-width: 500px) { + grid-template-columns: 1fr; + } +} diff --git a/database/2019_04_12_224041_add_more_indices.php b/database/2019_04_12_224041_add_more_indices.php new file mode 100644 index 00000000..94e4d0c8 --- /dev/null +++ b/database/2019_04_12_224041_add_more_indices.php @@ -0,0 +1,100 @@ +exec(" + ALTER TABLE `msz_forum_posts` + ADD INDEX `posts_parse_index` (`post_parse`), + ADD INDEX `posts_edited_index` (`post_edited`), + ADD INDEX `posts_display_signature_index` (`post_display_signature`), + ADD INDEX `posts_ip_index` (`post_ip`), + ADD FULLTEXT INDEX `posts_fulltext` (`post_text`); + "); + + $conn->exec(" + ALTER TABLE `msz_comments_categories` + ADD INDEX `comments_categories_locked_index` (`category_locked`); + "); + + $conn->exec(" + ALTER TABLE `msz_forum_topics` + DROP INDEX `topics_indices`, + ADD FULLTEXT INDEX `topics_fulltext` (`topic_title`), + ADD INDEX `topics_type_index` (`topic_type`), + ADD INDEX `topics_created_index` (`topic_created`), + ADD INDEX `topics_bumped_index` (`topic_bumped`), + ADD INDEX `topics_deleted_index` (`topic_deleted`), + ADD INDEX `topics_locked_index` (`topic_locked`); + "); + + $conn->exec(" + ALTER TABLE `msz_news_posts` + DROP INDEX `news_posts_indices`, + ADD INDEX `news_posts_featured_index` (`post_is_featured`), + ADD INDEX `news_posts_scheduled_index` (`post_scheduled`), + ADD INDEX `news_posts_created_index` (`post_created`), + ADD INDEX `news_posts_updated_index` (`post_updated`), + ADD INDEX `news_posts_deleted_index` (`post_deleted`), + ADD FULLTEXT INDEX `news_posts_fulltext` (`post_title`, `post_text`); + "); + + $conn->exec(" + ALTER TABLE `msz_user_warnings` + DROP INDEX `user_warnings_indices`, + ADD INDEX `user_warnings_created_index` (`warning_created`), + ADD INDEX `user_warnings_duration_index` (`warning_duration`), + ADD INDEX `user_warnings_type_index` (`warning_type`), + ADD INDEX `user_warnings_user_ip_index` (`user_ip`); + "); +} + +function migrate_down(PDO $conn): void +{ + $conn->exec(" + ALTER TABLE `msz_user_warnings` + DROP INDEX `user_warnings_user_ip_index`, + DROP INDEX `user_warnings_type_index`, + DROP INDEX `user_warnings_duration_index`, + DROP INDEX `user_warnings_created_index`, + ADD INDEX `user_warnings_indices` (`warning_created`, `warning_type`, `warning_duration`, `user_ip`); + "); + + $conn->exec(" + ALTER TABLE `msz_news_posts` + DROP INDEX `news_posts_fulltext`, + DROP INDEX `news_posts_deleted_index`, + DROP INDEX `news_posts_created_index`, + DROP INDEX `news_posts_updated_index`, + DROP INDEX `news_posts_scheduled_index`, + DROP INDEX `news_posts_featured_index`, + ADD INDEX `news_posts_indices` (`post_is_featured`, `post_scheduled`, `post_created`); + "); + + $conn->exec(" + ALTER TABLE `msz_forum_topics` + DROP INDEX `topics_fulltext`, + DROP INDEX `topics_locked_index`, + DROP INDEX `topics_deleted_index`, + DROP INDEX `topics_created_index`, + DROP INDEX `topics_bumped_index`, + DROP INDEX `topics_type_index`, + ADD INDEX `topics_indices` (`topic_type`, `topic_bumped`); + "); + + $conn->exec(" + ALTER TABLE `msz_comments_categories` + DROP INDEX `comments_categories_locked_index`; + "); + + $conn->exec(" + ALTER TABLE `msz_forum_posts` + DROP INDEX `posts_fulltext`, + DROP INDEX `posts_ip_index`, + DROP INDEX `posts_display_signature_index`, + DROP INDEX `posts_edited_index`, + DROP INDEX `posts_parse_index`,; + "); +} diff --git a/public/manage/index.php b/public/manage/index.php index 83cf9052..285b9476 100644 --- a/public/manage/index.php +++ b/public/manage/index.php @@ -6,7 +6,183 @@ $generalPerms = perms_get_user(MSZ_PERMS_GENERAL, user_session_current('user_id' switch ($_GET['v'] ?? null) { default: case 'overview': - echo tpl_render('manage.general.overview'); + $statistics = db_fetch(db_query(' + SELECT + ( + SELECT COUNT(`user_id`) + FROM `msz_users` + ) AS `stat_users_total`, + ( + SELECT COUNT(`user_id`) + FROM `msz_users` + WHERE `user_deleted` IS NOT NULL + ) AS `stat_users_deleted`, + ( + SELECT COUNT(`user_id`) + FROM `msz_users` + WHERE `user_active` IS NOT NULL + AND `user_deleted` IS NULL + ) AS `stat_users_active`, + ( + SELECT COUNT(`log_id`) + FROM `msz_audit_log` + ) AS `stat_audit_logs`, + ( + SELECT COUNT(`change_id`) + FROM `msz_changelog_changes` + ) AS `stat_changelog_entries`, + ( + SELECT COUNT(`category_id`) + FROM `msz_comments_categories` + ) AS `stat_comment_categories_total`, + ( + SELECT COUNT(`category_id`) + FROM `msz_comments_categories` + WHERE `category_locked` IS NOT NULL + ) AS `stat_comment_categories_locked`, + ( + SELECT COUNT(`comment_id`) + FROM `msz_comments_posts` + ) AS `stat_comment_posts_total`, + ( + SELECT COUNT(`comment_id`) + FROM `msz_comments_posts` + WHERE `comment_deleted` IS NOT NULL + ) AS `stat_comment_posts_deleted`, + ( + SELECT COUNT(`comment_id`) + FROM `msz_comments_posts` + WHERE `comment_reply_to` IS NOT NULL + ) AS `stat_comment_posts_replies`, + ( + SELECT COUNT(`comment_id`) + FROM `msz_comments_posts` + WHERE `comment_pinned` IS NOT NULL + ) AS `stat_comment_posts_pinned`, + ( + SELECT COUNT(`comment_id`) + FROM `msz_comments_posts` + WHERE `comment_edited` IS NOT NULL + ) AS `stat_comment_posts_edited`, + ( + SELECT COUNT(`user_id`) + FROM `msz_comments_votes` + WHERE `comment_vote` > 0 + ) AS `stat_comment_likes`, + ( + SELECT COUNT(`user_id`) + FROM `msz_comments_votes` + WHERE `comment_vote` < 0 + ) AS `stat_comment_dislikes`, + ( + SELECT COUNT(`post_id`) + FROM `msz_forum_posts` + ) AS `stat_forum_posts_total`, + ( + SELECT COUNT(`post_id`) + FROM `msz_forum_posts` + WHERE `post_deleted` IS NOT NULL + ) AS `stat_forum_posts_deleted`, + ( + SELECT COUNT(`post_id`) + FROM `msz_forum_posts` + WHERE `post_edited` IS NOT NULL + ) AS `stat_forum_posts_edited`, + ( + SELECT COUNT(`post_id`) + FROM `msz_forum_posts` + WHERE `post_parse` = 0 + ) AS `stat_forum_posts_plain`, + ( + SELECT COUNT(`post_id`) + FROM `msz_forum_posts` + WHERE `post_parse` = 1 + ) AS `stat_forum_posts_bbcode`, + ( + SELECT COUNT(`post_id`) + FROM `msz_forum_posts` + WHERE `post_parse` = 2 + ) AS `stat_forum_posts_markdown`, + ( + SELECT COUNT(`post_id`) + FROM `msz_forum_posts` + WHERE `post_display_signature` != 0 + ) AS `stat_forum_posts_signature`, + ( + SELECT COUNT(`topic_id`) + FROM `msz_forum_topics` + ) AS `stat_forum_topics_total`, + ( + SELECT COUNT(`topic_id`) + FROM `msz_forum_topics` + WHERE `topic_type` = 0 + ) AS `stat_forum_topics_normal`, + ( + SELECT COUNT(`topic_id`) + FROM `msz_forum_topics` + WHERE `topic_type` = 1 + ) AS `stat_forum_topics_pinned`, + ( + SELECT COUNT(`topic_id`) + FROM `msz_forum_topics` + WHERE `topic_type` = 2 + ) AS `stat_forum_topics_announce`, + ( + SELECT COUNT(`topic_id`) + FROM `msz_forum_topics` + WHERE `topic_type` = 3 + ) AS `stat_forum_topics_global_announce`, + ( + SELECT COUNT(`topic_id`) + FROM `msz_forum_topics` + WHERE `topic_deleted` IS NOT NULL + ) AS `stat_forum_topics_deleted`, + ( + SELECT COUNT(`topic_id`) + FROM `msz_forum_topics` + WHERE `topic_locked` IS NOT NULL + ) AS `stat_forum_topics_locked`, + ( + SELECT COUNT(*) + FROM `msz_ip_blacklist` + ) AS `stat_blacklist`, + ( + SELECT COUNT(`attempt_id`) + FROM `msz_login_attempts` + ) AS `stat_login_attempts_total`, + ( + SELECT COUNT(`attempt_id`) + FROM `msz_login_attempts` + WHERE `attempt_success` = 0 + ) AS `stat_login_attempts_failed`, + ( + SELECT COUNT(`session_id`) + FROM `msz_sessions` + ) AS `stat_user_sessions`, + ( + SELECT COUNT(`user_id`) + FROM `msz_users_password_resets` + ) AS `stat_user_password_resets`, + ( + SELECT COUNT(`user_id`) + FROM `msz_user_relations` + ) AS `stat_user_relations`, + ( + SELECT COUNT(`warning_id`) + FROM `msz_user_warnings` + WHERE `warning_type` != 0 + ) AS `stat_user_warnings` + ')); + + if (!empty($_GET['poll'])) { + header('Content-Type: application/json; charset=utf-8'); + echo json_encode($statistics); + return; + } + + echo tpl_render('manage.general.overview', [ + 'statistics' => $statistics, + ]); break; case 'logs': diff --git a/templates/manage/general/overview.twig b/templates/manage/general/overview.twig index 79147d8e..e66c580d 100644 --- a/templates/manage/general/overview.twig +++ b/templates/manage/general/overview.twig @@ -1,13 +1,63 @@ {% extends 'manage/general/master.twig' %} {% from 'macros.twig' import container_title %} +{% set stat_names = { + 'stat_users_total': 'Total Users', + 'stat_users_deleted': 'Deleted Users', + 'stat_users_active': 'Active Users', + 'stat_audit_logs': 'Logged Actions', + 'stat_changelog_entries': 'Changelogs', + 'stat_comment_categories_total': 'Comment Sections', + 'stat_comment_categories_locked': 'Locked Comment Sections', + 'stat_comment_posts_total': 'Total Comments', + 'stat_comment_posts_deleted': 'Deleted Comments', + 'stat_comment_posts_replies': 'Comment Replies', + 'stat_comment_posts_pinned': 'Pinned Comments', + 'stat_comment_posts_edited': 'Edited Comments', + 'stat_comment_likes': 'Comments Like Votes', + 'stat_comment_dislikes': 'Comments Dislike Votes', + 'stat_forum_posts_total': 'Total Forum Posts', + 'stat_forum_posts_deleted': 'Deleted Forum Posts', + 'stat_forum_posts_edited': 'Edited Forum Posts', + 'stat_forum_posts_plain': 'Forum Posts using Plain Text', + 'stat_forum_posts_bbcode': 'Forum Posts using BBCode', + 'stat_forum_posts_markdown': 'Forum Posts using Markdown', + 'stat_forum_posts_signature': 'Forum Posts with Visible Signature', + 'stat_forum_topics_total': 'Total Forum Topics', + 'stat_forum_topics_normal': 'Regular Forum Topics', + 'stat_forum_topics_pinned': 'Pinned Forum Topics', + 'stat_forum_topics_announce': 'Announcement Forum Topics', + 'stat_forum_topics_global_announce': 'Global Announcement Forum Topics', + 'stat_forum_topics_deleted': 'Deleted Forum Topics', + 'stat_forum_topics_locked': 'Locked Forum Topics', + 'stat_blacklist': 'Blacklisted IP addresses', + 'stat_login_attempts_total': 'Total Login Attempts', + 'stat_login_attempts_failed': 'Failed Login Attempts', + 'stat_user_sessions': 'Active User Sessions', + 'stat_user_password_resets': 'Pending Password Resets', + 'stat_user_relations': 'User Relations', + 'stat_user_warnings': 'User Warnings', +} %} + {% block manage_content %} -
+
{{ container_title('Overview') }}

Welcome to Manage, here you can manage things.

-

Please teach me how to give a shit about management panel. -flashwave

+
+
+ +
+ {{ container_title('Statistics') }} + +
+ {% for name, value in statistics %} +
+
{{ stat_names[name]|default(name) }}
+
{{ value|number_format }}
+
+ {% endfor %}
{% endblock %}