display stats of visits for categories and poems

#481
This commit is contained in:
Hamid Reza Mohammadi 2025-05-25 08:17:29 +03:30
parent 9d118cc218
commit 9407babe79
22 changed files with 213 additions and 19 deletions

View File

@ -0,0 +1,16 @@
using System;
namespace KontorService.Models.Reporting.ViewModels
{
public class DateRangeVisitsViewModel
{
/// <summary>
/// Date
/// </summary>
public DateTime Date { get; set; }
/// <summary>
/// visits
/// </summary>
public int Visits { get; set; }
}
}

View File

@ -151,7 +151,7 @@
</p>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/js/bk.js?version=78"></script>
<script src="~/js/bk.js?version=79"></script>
<script src="~/js/jplayersupport.js"></script>
<script src="~/js/vaabd.js?version=10"></script>
<script src="~/dist/jplayer/jquery.jplayer.min.js"></script>

View File

@ -16,7 +16,7 @@
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
var cookieValue = getCookie("playerScrollLock");
var playerScrollLock = cookieValue === "true";

View File

@ -17,7 +17,7 @@
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/chart.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
var cookieValue = getCookie("playerScrollLock");
var playerScrollLock = cookieValue === "true";

View File

@ -16,7 +16,7 @@
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
var cookieValue = getCookie("playerScrollLock");
var playerScrollLock = cookieValue === "true";

View File

@ -18,7 +18,7 @@
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
var cookieValue = getCookie("playerScrollLock");
var playerScrollLock = cookieValue === "true";

View File

@ -18,7 +18,7 @@
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml">
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/chart.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script src="/js/jquery.mark.min.js"></script>
<script>
var cookieValue = getCookie("playerScrollLock");

View File

@ -1606,7 +1606,17 @@ namespace GanjooRazor.Pages
if (!topVisitsResponse.IsSuccessStatusCode)
{
return null;
return new PartialViewResult()
{
ViewName = "_TopVisitsPartial",
ViewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = new _TopVisitsPartialModel()
{
Visits = null
}
}
};
}
var topVisits = JsonConvert.DeserializeObject<PageVisitsViewModel[]>(await topVisitsResponse.Content.ReadAsStringAsync());
@ -1623,6 +1633,41 @@ namespace GanjooRazor.Pages
};
}
public async Task<ActionResult> OnGetSevenDaysVisitsAsync(string url)
{
url = $"https://ganjoor.net/{url}/";
var apiUrl = $"https://track.kntr.ir/api/reporting/dailypagevisits/1/ganjoor.net/for/{WebUtility.UrlEncode(url)}?start={DateTime.Now.Date.AddDays(-7).ToString("yyyy-MM-dd")}";
var s7ndaysVisitsResponse = await _httpClient.GetAsync(apiUrl);
if (!s7ndaysVisitsResponse.IsSuccessStatusCode)
{
return new PartialViewResult()
{
ViewName = "_7DaysVisitsPartial",
ViewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = new _7DaysVisitsPartialModel()
{
SevenDaysVisits = null
}
}
};
}
var s7ndaysVisits = JsonConvert.DeserializeObject<DateRangeVisitsViewModel[]>(await s7ndaysVisitsResponse.Content.ReadAsStringAsync());
return new PartialViewResult()
{
ViewName = "_7DaysVisitsPartial",
ViewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = new _7DaysVisitsPartialModel()
{
SevenDaysVisits = s7ndaysVisits
}
}
};
}
}
}

View File

@ -24,7 +24,7 @@
font-family: 'Vazirmatn'
}
</style>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="~/js/leaflet.js"></script>
<script src="~/js/leaflet-providers.js"></script>

View File

@ -16,7 +16,7 @@
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
var cookieValue = getCookie("playerScrollLock");
var playerScrollLock = cookieValue === "true";

View File

@ -17,7 +17,7 @@
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
var cookieValue = getCookie("playerScrollLock");
var playerScrollLock = cookieValue === "true";

View File

@ -239,7 +239,7 @@
<script src="~/js/bk.js?version=78"></script>
<script src="~/js/bk.js?version=79"></script>
<script src="~/js/jplayersupport.js"></script>
<script src="~/js/vaabd.js?version=10"></script>
<script src="~/dist/jplayer/jquery.jplayer.min.js"></script>

View File

@ -22,7 +22,7 @@
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="/js/chart.js"></script>
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
var cookieValue = getCookie("playerScrollLock");
var playerScrollLock = cookieValue === "true";

View File

@ -36,7 +36,7 @@
});
</script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
function editBanner(bannerId) {
var url = '?handler=Edit';

View File

@ -33,7 +33,7 @@
});
</script>
<script src="/lib/diff.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
function compareCorrectionBlocks(originalElemenyId, editedElementId, resultElementId) {
var a = document.getElementById(originalElemenyId);

View File

@ -18,7 +18,7 @@
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
var cookieValue = getCookie("playerScrollLock");
var playerScrollLock = cookieValue === "true";

View File

@ -18,7 +18,7 @@
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/js/bk.js?version=78"></script>
<script src="/js/bk.js?version=79"></script>
<script>
var cookieValue = getCookie("playerScrollLock");
var playerScrollLock = cookieValue === "true";

View File

@ -0,0 +1,42 @@
@using DNTPersianUtils.Core
@model GanjooRazor.Pages._7DaysVisitsPartialModel
@if (Model.SevenDaysVisits == null)
{
<p>در دریافت آمار خطایی رخ داده، لطفاً مجدداً دکمهٔ روند بازدیدها را بزنید.</p>
return;
}
@if (Model.SevenDaysVisits.Length > 0)
{
<table class="stats" id="7days-visits">
<thead>
<tr class="h">
<td class="c1">ردیف</td>
<td class="c2">تاریخ</td>
<td class="c3">شمار</td>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.SevenDaysVisits.Length; i++)
{
@if (i % 2 == 0)
{
<tr class="e">
<td class="c1">@((i + 1).ToPersianNumbers())</td>
<td class="c2">@RMuseum.Services.Implementation.LanguageUtils.FormatInShortDate(Model.SevenDaysVisits[i].Date)</td>
<td class="c3">@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.SevenDaysVisits[i].Visits)</td>
</tr>
}
else
{
<tr>
<td class="c1">@((i + 1).ToPersianNumbers())</td>
<td class="c2">@RMuseum.Services.Implementation.LanguageUtils.FormatInShortDate(Model.SevenDaysVisits[i].Date)</td>
<td class="c3">@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.SevenDaysVisits[i].Visits)</td>
</tr>
}
}
</tbody>
</table>
}

View File

@ -0,0 +1,10 @@
using KontorService.Models.Reporting.ViewModels;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace GanjooRazor.Pages
{
public class _7DaysVisitsPartialModel : PageModel
{
public DateRangeVisitsViewModel[] SevenDaysVisits { get; set; }
}
}

View File

@ -509,6 +509,7 @@
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
@ -746,6 +747,7 @@
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
@ -780,6 +782,7 @@
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
@ -873,6 +876,7 @@
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
@ -914,6 +918,7 @@
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
@ -948,6 +953,7 @@
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
@ -1001,6 +1007,7 @@
<div class="poemtablinks active"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
@ -1088,6 +1095,7 @@
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks active"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
@ -1128,6 +1136,41 @@
}
</div>
<div class="poempretab" id="7daysvisits"></div>
<div class="poemtab">
<div class="poemtablinks"><a href="#pretab">اطّلاعات</a></div>
<div class="poemtablinks"><a href="#words" onclick="javascript:countPoemWords(@Model.GanjoorPage.Id, @Model.GanjoorPage.PoetOrCat.Cat.Id, @Model.GanjoorPage.PoetOrCat.Poet.Id)">واژگان</a></div>
<div class="poemtablinks"><a href="#manuscripts">تصاویر</a></div>
@if (Model.GanjoorPage.Poem.Recitations.Where(a => a.RecitationType == RMuseum.Models.GanjoorAudio.RecitationType.Normal).Any())
{
<div class="poemtablinks"><a href="#recitations">خوانش‌ها</a></div>
}
@if (Model.GanjoorPage.Poem.Recitations.Where(a => a.RecitationType == RMuseum.Models.GanjoorAudio.RecitationType.Commentary).Any())
{
<div class="poemtablinks"><a href="#commentaries">شرح‌های صوتی</a></div>
}
<div class="poemtablinks"><a href="#qpoems">مشق شعر</a></div>
@if (Model.SectionsWithRelated.Count > 0)
{
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks active"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
</div>
<div class="related-images-frame poemtabcontent">
<div class="century cursor-pointer" id="load-7daysvisits" onclick="load7DaysVisits('@Model.GanjoorPage.FullUrl')">
بارگذاری روند بازدیدها
</div>
<div id="7daysvisits-placeholder">
</div>
</div>
<div class="poempretab" id="discussions"></div>
<div class="poemtab">
<div class="poemtablinks"><a href="#pretab">اطّلاعات</a></div>
@ -1148,6 +1191,7 @@
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#songs">ترانه‌ها</a></div>
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks active">
<a href="#discussions">حاشیه‌ها</a>
</div>

View File

@ -1,5 +1,11 @@
@using DNTPersianUtils.Core
@model GanjooRazor.Pages._TopVisitsPartialModel
@if (Model.Visits == null)
{
<p>در دریافت آمار خطایی رخ داده، لطفاً مجدداً دکمهٔ پربازدیدها را بزنید.</p>
return;
}
@if (Model.Visits.Length > 0)
{
<table class="stats" id="top-visits">

View File

@ -1972,6 +1972,12 @@ function loadContributionsUsers(dataType, pageNumber) {
}
function loadTopVisits(url) {
if (document.getElementById("top-visits") != null) {
return;
}
if (document.getElementById("load-topvisits") != null) {
document.getElementById("load-topvisits").remove();
}
var divParent = document.getElementById('topvisits-placeholder');
var imgElementId = 'loadingtopvisitsimg';
divParent.innerHTML = '<div class="bnumdiv" id="remove-this-topvisits"><img id="' + imgElementId + '" src="/image/loading.gif" alt="بارگذاری"/></div>';
@ -1986,12 +1992,37 @@ function loadTopVisits(url) {
success: function (data) {
if (document.getElementById("remove-this-topvisits") != null) {
document.getElementById("remove-this-topvisits").remove();
if (document.getElementById("load-topvisits") != null) {
document.getElementById("load-topvisits").remove();
}
$(data).appendTo(divParent);
plotChart('top-visits');
}
},
});
}
function load7DaysVisits(url) {
if (document.getElementById("7days-visits") != null) {
return;
}
if (document.getElementById("load-7daysvisits") != null) {
document.getElementById("load-7daysvisits").remove();
}
var divParent = document.getElementById('7daysvisits-placeholder');
var imgElementId = 'loading7daysvisitsimg';
divParent.innerHTML = '<div class="bnumdiv" id="remove-this-7daysvisits"><img id="' + imgElementId + '" src="/image/loading.gif" alt="بارگذاری"/></div>';
$.ajax({
type: "GET",
url: '?Handler=SevenDaysVisits&url=' + url,
error: function () {
if (document.getElementById("remove-this-7daysvisits") != null) {
document.getElementById("remove-this-7daysvisits").remove();
}
},
success: function (data) {
if (document.getElementById("remove-this-7daysvisits") != null) {
document.getElementById("remove-this-7daysvisits").remove();
$(data).appendTo(divParent);
plotChart('7days-visits');
}
},
});
}