Merge pull request #9538 from abpframework/berkan/improve-performance-on-docs-module

Improve performance on docs module
pull/9542/head
ebicoglu 4 years ago committed by GitHub
commit 9c51cf8a13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,14 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.Docs.Admin.Documents
{
public class DocumentWithoutDetailsDto : EntityDto<Guid>
{
public virtual string Version { get; set; }
public virtual string LanguageCode { get; set; }
public virtual string Format { get; set; }
}
}

@ -65,8 +65,9 @@ namespace Volo.Docs.Documents
{ {
var project = await _projectRepository.GetAsync(input.ProjectId); var project = await _projectRepository.GetAsync(input.ProjectId);
input.Version = GetProjectVersionPrefixIfExist(project) + input.Version; var inputVersionStringBuilder = new StringBuilder();
input.Version = inputVersionStringBuilder.Append(GetProjectVersionPrefixIfExist(project)).Append(input.Version).ToString();
return await GetDocumentWithDetailsDtoAsync( return await GetDocumentWithDetailsDtoAsync(
project, project,
input.Name, input.Name,
@ -79,11 +80,14 @@ namespace Volo.Docs.Documents
{ {
var project = await _projectRepository.GetAsync(input.ProjectId); var project = await _projectRepository.GetAsync(input.ProjectId);
input.Version = GetProjectVersionPrefixIfExist(project) + input.Version; var sb = new StringBuilder();
input.Version = sb.Append(GetProjectVersionPrefixIfExist(project)).Append(input.Version).ToString();
sb.Clear();
return await GetDocumentWithDetailsDtoAsync( return await GetDocumentWithDetailsDtoAsync(
project, project,
project.DefaultDocumentName + "." + project.Format, sb.Append(project.DefaultDocumentName).Append(".").Append(project.Format).ToString(),
input.LanguageCode, input.LanguageCode,
input.Version input.Version
); );
@ -226,7 +230,7 @@ namespace Volo.Docs.Documents
private async Task AddDocumentToUrls(string prefix, Project project, DocumentWithoutDetails document, private async Task AddDocumentToUrls(string prefix, Project project, DocumentWithoutDetails document,
List<string> documentUrls) List<string> documentUrls)
{ {
var navigationNodes = await GetNavigationNodesAsync(prefix, project, document); var navigationNodes = await GetNavigationNodesAsync(project, document);
AddDocumentUrls(prefix, navigationNodes, documentUrls, project, document); AddDocumentUrls(prefix, navigationNodes, documentUrls, project, document);
} }
@ -244,7 +248,7 @@ namespace Volo.Docs.Documents
}); });
} }
private async Task<List<NavigationNode>> GetNavigationNodesAsync(string prefix, Project project, private async Task<List<NavigationNode>> GetNavigationNodesAsync(Project project,
DocumentWithoutDetails document) DocumentWithoutDetails document)
{ {
var version = GetProjectVersionPrefixIfExist(project) + document.Version; var version = GetProjectVersionPrefixIfExist(project) + document.Version;
@ -286,10 +290,12 @@ namespace Volo.Docs.Documents
private string NormalizePath(string prefix, string path, string shortName, DocumentWithoutDetails document) private string NormalizePath(string prefix, string path, string shortName, DocumentWithoutDetails document)
{ {
var pathWithoutFileExtension = RemoveFileExtensionFromPath(path, document.Format); var pathWithoutFileExtension = RemoveFileExtensionFromPath(path, document.Format);
var normalizedPath = prefix + document.LanguageCode + "/" + shortName + "/" + document.Version + "/" +
pathWithoutFileExtension; var normalizedPathStringBuilder = new StringBuilder();
normalizedPathStringBuilder.Append(prefix).Append(document.LanguageCode).Append("/").Append(shortName)
.Append("/").Append(document.Version).Append("/").Append(pathWithoutFileExtension);
return normalizedPath; return normalizedPathStringBuilder.ToString();
} }
private string RemoveFileExtensionFromPath(string path, string format) private string RemoveFileExtensionFromPath(string path, string format)
@ -375,21 +381,6 @@ namespace Volo.Docs.Documents
return await GetDocumentAsync(documentName, project, languageCode, version, document); return await GetDocumentAsync(documentName, project, languageCode, version, document);
} }
var cacheKey = CacheKeyGenerator.GenerateDocumentUpdateInfoCacheKey(
project,
document.Name,
document.LanguageCode,
document.Version
);
await DocumentUpdateCache.SetAsync(cacheKey, new DocumentUpdateInfo
{
Name = document.Name,
CreationTime = document.CreationTime,
LastUpdatedTime = document.LastUpdatedTime,
LastSignificantUpdateTime = document.LastSignificantUpdateTime
});
return CreateDocumentWithDetailsDto(project, document); return CreateDocumentWithDetailsDto(project, document);
} }

@ -108,6 +108,8 @@ namespace Volo.Docs.Areas.Documents.TagHelpers
private string GetLeafNode(NavigationNode node, string content) private string GetLeafNode(NavigationNode node, string content)
{ {
var sb = new StringBuilder();
var textCss = node.Path.IsNullOrEmpty() ? "tree-toggle" : ""; var textCss = node.Path.IsNullOrEmpty() ? "tree-toggle" : "";
var isNodeSelected = node.IsSelected(SelectedDocumentName); var isNodeSelected = node.IsSelected(SelectedDocumentName);
var listItemCss = node.HasChildItems ? "nav-header" : "last-link"; var listItemCss = node.HasChildItems ? "nav-header" : "last-link";
@ -123,31 +125,36 @@ namespace Volo.Docs.Areas.Documents.TagHelpers
} }
else else
{ {
var badge = ""; var badgeStringBuilder = new StringBuilder();
if (!node.Path.IsNullOrWhiteSpace() && node.CreationTime.HasValue && node.LastUpdatedTime.HasValue) if (!node.Path.IsNullOrWhiteSpace() && node.CreationTime.HasValue && node.LastUpdatedTime.HasValue)
{ {
if(node.CreationTime + TimeSpan.FromDays(14) > DateTime.Now) if(node.CreationTime + TimeSpan.FromDays(14) > DateTime.Now)
{ {
var newBadge = "<span class='badge badge-primary ml-2' title=\"" + _localizer["NewExplanation"] + "\">" + _localizer["New"] + "</span>"; var newBadge = sb.Append("<span class='badge badge-primary ml-2' title=\"").Append(_localizer["NewExplanation"]).Append("\">").Append(_localizer["New"]).Append("</span>").ToString();
badge += newBadge;
badgeStringBuilder.Append(newBadge);
} }
else if (node.LastSignificantUpdateTime != null && node.LastSignificantUpdateTime + TimeSpan.FromDays(14) > DateTime.Now) else if (node.LastSignificantUpdateTime != null && node.LastSignificantUpdateTime + TimeSpan.FromDays(14) > DateTime.Now)
{ {
var updBadge = "<span class='badge badge-light ml-2' title=\"" + _localizer["UpdatedExplanation"] + "\">" + _localizer["Upd"] + "</span>"; var updBadge = sb.Append("<span class='badge badge-light ml-2' title=\"").Append(_localizer["UpdatedExplanation"]).Append("\">").Append(_localizer["Upd"]).Append("</span>");
badge += updBadge; badgeStringBuilder.Append(updBadge);
} }
} }
sb.Clear();
listInnerItem = string.Format(ListItemAnchor, NormalizePath(node.Path), textCss, listInnerItem = string.Format(ListItemAnchor, NormalizePath(node.Path), textCss,
node.Text.IsNullOrEmpty() node.Text.IsNullOrEmpty()
? "?" ? "?"
: node.Text + badge); : sb.Append(node.Text).Append(badgeStringBuilder).ToString());
} }
sb.Clear();
return string.Format(LiItemTemplateWithLink, return string.Format(LiItemTemplateWithLink,
listItemCss, listItemCss,
node.HasChildItems ? "chevron-right" : "long-arrow-right " + (node.Path.IsNullOrEmpty() ? "no-link" : "has-link"), node.HasChildItems ? "chevron-right" : sb.Append("long-arrow-right ").Append(node.Path.IsNullOrEmpty() ? "no-link" : "has-link").ToString(),
listInnerItem, listInnerItem,
content); content);
} }
@ -167,8 +174,9 @@ namespace Volo.Docs.Areas.Documents.TagHelpers
} }
var prefix = _uiOptions.RoutePrefix; var prefix = _uiOptions.RoutePrefix;
return prefix + LanguageCode + "/" + ProjectName + "/" + Version + "/" + pathWithoutFileExtension; var sb = new StringBuilder();
return sb.Append(prefix).Append(LanguageCode).Append("/").Append(ProjectName).Append("/").Append(Version).Append("/").Append(pathWithoutFileExtension).ToString();
} }
private string RemoveFileExtensionFromPath(string path) private string RemoveFileExtensionFromPath(string path)
@ -183,4 +191,4 @@ namespace Volo.Docs.Areas.Documents.TagHelpers
: path; : path;
} }
} }
} }

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Volo.Docs.Utils; using Volo.Docs.Utils;
@ -34,7 +35,12 @@ namespace Volo.Docs.HtmlConverting
public static string ReplaceCodeBlocksLanguage(string content, string currentLanguage, string newLanguage) public static string ReplaceCodeBlocksLanguage(string content, string currentLanguage, string newLanguage)
{ {
return Regex.Replace(content, "<code class=\"" + currentLanguage + "\">", "<code class=\"" + newLanguage + "\">", RegexOptions.IgnoreCase); var sb = new StringBuilder();
var pattern = sb.Append("<code class=\"").Append(currentLanguage).Append("\">").ToString();
sb.Clear();
var replacement = sb.Append("<code class=\"").Append(newLanguage).Append("\">").ToString();
return Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);
} }
/// <summary> /// <summary>

@ -209,11 +209,15 @@ namespace Volo.Docs.Pages.Documents.Project
private IActionResult ReloadPageWithCulture() private IActionResult ReloadPageWithCulture()
{ {
var returnUrl = DocumentsUrlPrefix + LanguageCode + "/" + ProjectName + "/" var sb = new StringBuilder();
+ (LatestVersionInfo.IsSelected ? DocsAppConsts.Latest : Version) + "/" +
DocumentName;
return Redirect("/Abp/Languages/Switch?culture=" + LanguageCode + "&uiCulture=" + LanguageCode + "&returnUrl=" + returnUrl); var returnUrl = sb.Append(DocumentsUrlPrefix).Append(LanguageCode).Append("/").Append(ProjectName)
.Append("/").Append(LatestVersionInfo.IsSelected ? DocsAppConsts.Latest : Version).Append("/").Append(DocumentName);
sb.Clear();
return Redirect(sb.Append("/Abp/Languages/Switch?culture=").Append(LanguageCode).Append("&uiCulture=")
.Append(LanguageCode).Append("&returnUrl=").Append(returnUrl).ToString());
} }
private IActionResult RedirectToDefaultLanguage() private IActionResult RedirectToDefaultLanguage()
@ -242,10 +246,12 @@ namespace Volo.Docs.Pages.Documents.Project
{ {
var projects = await _projectAppService.GetListAsync(); var projects = await _projectAppService.GetListAsync();
var sb = new StringBuilder();
ProjectSelectItems = projects.Items.Select(p => new SelectListItem ProjectSelectItems = projects.Items.Select(p => new SelectListItem
{ {
Text = p.Name, Text = p.Name,
Value = p.Id != Project.Id ? DocumentsUrlPrefix + LanguageCode + "/" + p.ShortName + "/" + DocsAppConsts.Latest : null, Value = p.Id != Project.Id ? sb.Append(DocumentsUrlPrefix).Append(LanguageCode).Append("/").Append(p.ShortName).Append("/").Append(DocsAppConsts.Latest).ToString() : null,
Selected = p.Id == Project.Id Selected = p.Id == Project.Id
}).ToList(); }).ToList();
} }
@ -383,14 +389,15 @@ namespace Volo.Docs.Pages.Documents.Project
version = DocsAppConsts.Latest; version = DocsAppConsts.Latest;
} }
var link = DocumentsUrlPrefix + LanguageCode + "/" + ProjectName + "/" + version; var linkStringBuilder = new StringBuilder();
linkStringBuilder.Append(DocumentsUrlPrefix).Append(LanguageCode).Append("/").Append(ProjectName).Append("/").Append(version);
if (documentName != null) if (documentName != null)
{ {
link += "/" + DocumentName; linkStringBuilder.Append("/").Append(DocumentName);
} }
return link; return linkStringBuilder.ToString();
} }
public string GetSpecificVersionOrLatest() public string GetSpecificVersionOrLatest()
@ -407,7 +414,8 @@ namespace Volo.Docs.Pages.Documents.Project
private async Task SetDocumentAsync() private async Task SetDocumentAsync()
{ {
DocumentNameWithExtension = DocumentName + "." + Project.Format; var sb = new StringBuilder();
DocumentNameWithExtension = sb.Append(DocumentName).Append(".").Append(Project.Format).ToString();
try try
{ {
@ -435,12 +443,14 @@ namespace Volo.Docs.Pages.Documents.Project
{ {
LanguageSelectListItems = new List<SelectListItem>(); LanguageSelectListItems = new List<SelectListItem>();
var sb = new StringBuilder();
foreach (var language in LanguageConfig.Languages) foreach (var language in LanguageConfig.Languages)
{ {
LanguageSelectListItems.Add( LanguageSelectListItems.Add(
new SelectListItem( new SelectListItem(
language.DisplayName, language.DisplayName,
DocumentsUrlPrefix + language.Code + "/" + Project.ShortName + "/" + (LatestVersionInfo.IsSelected ? DocsAppConsts.Latest : Version) + "/" + DocumentName, sb.Append(DocumentsUrlPrefix).Append(language.Code).Append("/").Append(Project.ShortName).Append("/").Append(LatestVersionInfo.IsSelected ? DocsAppConsts.Latest : Version).Append("/").Append(DocumentName).ToString(),
language.Code == LanguageCode language.Code == LanguageCode
) )
); );
@ -614,18 +624,17 @@ namespace Volo.Docs.Pages.Documents.Project
} }
); );
} }
else
{
return await _documentAppService.GetAsync( return await _documentAppService.GetAsync(
new GetDocumentInput new GetDocumentInput
{ {
ProjectId = Project.Id, ProjectId = Project.Id,
Name = DocumentNameWithExtension, Name = DocumentNameWithExtension,
LanguageCode = languageCode, LanguageCode = languageCode,
Version = Version Version = Version
} }
); );
}
} }
private async Task SetDocumentPreferencesAsync() private async Task SetDocumentPreferencesAsync()
@ -745,4 +754,4 @@ namespace Volo.Docs.Pages.Documents.Project
return description.Truncate(MaxDescriptionMetaTagLength); return description.Truncate(MaxDescriptionMetaTagLength);
} }
} }
} }
Loading…
Cancel
Save