You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

201 lines
9.6 KiB

using Microsoft.AspNetCore.Http;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Reflection;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
namespace ReZero.SuperAPI
{
/// <summary>
/// 默认UI使用,如果是Vue前后分离不会使用该类
/// </summary>
public class DefaultUiManager : IUiManager
{
private readonly string masterPagePlaceholder = "@@master_page.html";
private readonly string index_url = "@@index_url";
private readonly string masterPageFolder = "template";
private readonly string masterPageFileName = "master_page.html";
private readonly string layoutContentPlaceholder = "@@lyear-layout-content";
private readonly string masterMenuPlaceholder = "@@left-menu";
private readonly string mastreNavNamePlaceholder = "@@nav-title";
private readonly string pageControlPlaceholder = "@@page_control.html";
private readonly string pageControlName = "page_control.html";
private readonly string authorizationLocalStorageName = "@@authorizationLocalStorageName";
private readonly string version = "@@version";
private readonly string pageNumber = "__pageNumber";
private readonly string pageSize = "__pageSize";
public DefaultUiManager()
{
}
/// <summary>
/// Replaces the master page placeholder with the actual master page HTML content and replaces the layout content placeholder with the modified file content.
/// </summary>
/// <param name="fileContent">The content of the file to modify.</param>
/// <param name="filePath">The path of the file to modify.</param>
/// <returns>The modified file content.</returns>
public async Task<string> GetHtmlAsync(string fileContent, string filePath, Microsoft.AspNetCore.Http.HttpContext content)
{
var url = (content.Request.Path + "" + content.Request.QueryString).ToLower();
var modifiedContent = fileContent.Replace(masterPagePlaceholder, "");
var masterPagePath = Path.Combine(Path.GetDirectoryName(filePath), masterPageFolder, masterPageFileName);
var masterPageHtml = await File.ReadAllTextAsync(masterPagePath);
//menu html
var menuList = await App.Db.Queryable<ZeroInterfaceCategory>().ToTreeAsync(it => it.SubInterfaceCategories, it => it.ParentId, 0, it => it.Id);
var currentMenu = await App.Db.Queryable<ZeroInterfaceCategory>().Where(it => it.Url!.ToLower() == url).FirstAsync();
if (currentMenu == null)
{
if (url.Contains("utorials.html"))
{
currentMenu = await App.Db.Queryable<ZeroInterfaceCategory>().FirstAsync(it=>it.Id== InterfaceCategoryInitializerProvider.Id300008);
}
else
{
currentMenu = await App.Db.Queryable<ZeroInterfaceCategory>().FirstAsync();
}
}
var parentMenu = await App.Db.Queryable<ZeroInterfaceCategory>().Where(it => it.Id == currentMenu.ParentId).FirstAsync();
var menuHtml = await GetMenuHtml(menuList, filePath, currentMenu);
//authorization
masterPageHtml = GetAuthorizationHtml(content,masterPageHtml);
//Samll page
masterPageHtml = GetSmallPageHtml(content, masterPageHtml);
//Nav title
masterPageHtml = ReplaceNavTitle(masterPageHtml, currentMenu, parentMenu);
//Page html
modifiedContent = await ReplacePageContext(filePath, modifiedContent);
modifiedContent = ReplceIndexSrc(modifiedContent, currentMenu);
//Body context
masterPageHtml = ReplaceBodyContext(modifiedContent, masterPageHtml, menuHtml);
//token
masterPageHtml = masterPageHtml.Replace(authorizationLocalStorageName, SuperAPIModule._apiOptions?.InterfaceOptions?.AuthorizationLocalStorageName);
masterPageHtml = masterPageHtml.Replace(pageNumber, SuperAPIModule._apiOptions?.InterfaceOptions?.PageNumberPropName);
masterPageHtml = masterPageHtml.Replace(pageSize, SuperAPIModule._apiOptions?.InterfaceOptions?.PageSizePropName);
//version
masterPageHtml = masterPageHtml.Replace(version, $"{Assembly.GetExecutingAssembly().GetName().Version}");
return masterPageHtml;
}
private string GetAuthorizationHtml(HttpContext content, string masterPageHtml)
{
if (!string.IsNullOrEmpty((content.Request.Query["token"] + "").ToString())&& content.Request.Query["token"].ToString()!="null")
{
masterPageHtml = masterPageHtml
.Replace("localStorage.getItem('@@authorizationLocalStorageName')",$"'{content.Request.Query["token"]}'");
}
masterPageHtml = masterPageHtml.Replace(authorizationLocalStorageName, SuperAPIModule._apiOptions?.InterfaceOptions?.AuthorizationLocalStorageName);
//var db = App.Db;
//var loginSetting=db.Queryable<ZeroSysSetting>().First(it => it.TypeId == PubConst.Setting_EnableLoginType);
//if (loginSetting?.BoolValue == true)
//{
masterPageHtml=masterPageHtml.Replace("tools.checkAuthorization();", "var isloginPage=true;\r\n tools.checkAuthorization();");
//}
return masterPageHtml;
}
public Task<string> GetCustomPageHtmlAsync(string fileContent, string filePath, Microsoft.AspNetCore.Http.HttpContext content)
{
fileContent = fileContent.Replace(authorizationLocalStorageName, SuperAPIModule._apiOptions?.InterfaceOptions?.AuthorizationLocalStorageName);
return Task.FromResult(fileContent);
}
private static string GetSmallPageHtml(HttpContext content, string masterPageHtml)
{
if ((content.Request.Query["model"] + "").ToString().ToLower() == "small")
{
masterPageHtml = masterPageHtml
.Replace("<body data-theme=\"default\">", "<body data-theme=\"default\" class=\"lyear-layout-sidebar-close\">")
.Replace("dropdown dropdown-profile", "dropdown dropdown-profile hide")
.Replace("lyear-aside-toggler", "lyear-aside-toggler hide")
.Replace("@@nav-title", "<i class=\"mdi mdi-soccer\"></i> Rezero云API");
}
return masterPageHtml;
}
private string ReplceIndexSrc(string modifiedContent, ZeroInterfaceCategory? currentMenu)
{
if (
SuperAPIModule._apiOptions!.UiOptions!.DefaultIndexSource!=null&&
!SuperAPIModule._apiOptions!.UiOptions!.DefaultIndexSource!.StartsWith("/")&&
!SuperAPIModule._apiOptions!.UiOptions!.DefaultIndexSource.Contains(":"))
{
SuperAPIModule._apiOptions!.UiOptions!.DefaultIndexSource = "/" + SuperAPIModule._apiOptions!.UiOptions!.DefaultIndexSource;
}
modifiedContent = modifiedContent.Replace(index_url, SuperAPIModule._apiOptions!.UiOptions!.DefaultIndexSource);
return modifiedContent;
}
private async Task<string> ReplacePageContext(string filePath,string html)
{
if (html?.Contains(pageControlPlaceholder)==true)
{
var path = Path.Combine(Path.GetDirectoryName(filePath), masterPageFolder, pageControlName);
var pageHtml = await File.ReadAllTextAsync(path);
html= html.Replace(pageControlPlaceholder, pageHtml);
}
return html;
}
private string ReplaceBodyContext(string modifiedContent, string masterPageHtml, string menuHtml)
{
masterPageHtml = masterPageHtml.Replace(masterMenuPlaceholder, menuHtml);
masterPageHtml = masterPageHtml.Replace(layoutContentPlaceholder, modifiedContent);
return masterPageHtml;
}
private string ReplaceNavTitle(string masterPageHtml, ZeroInterfaceCategory currentMenu, ZeroInterfaceCategory parentMenu)
{
var navTitle = parentMenu?.Name + "->" + currentMenu.Name;
if (parentMenu == null)
{
navTitle=TextHandler.GetCommonText("详情页","Detail");
}
masterPageHtml = masterPageHtml.Replace(mastreNavNamePlaceholder, navTitle);
return masterPageHtml;
}
/// <summary>
/// Generates the HTML code for the menu based on the given list of interface categories.
/// </summary>
/// <param name="categories">The list of interface categories.</param>
/// <returns>The HTML code for the menu.</returns>
public async Task<string> GetMenuHtml(List<ZeroInterfaceCategory> categories,string filePath, ZeroInterfaceCategory current)
{
var result= await Task.FromResult(MenuBuilder.GenerateMenu(categories, current));
return result;
}
/// <summary>
/// Determines whether the given file content contains the master page placeholder.
/// </summary>
/// <param name="fileContent">The content of the file to check.</param>
/// <returns>True if the file content contains the master page placeholder, otherwise false.</returns>
public bool IsMasterPage(string fileContent)
{
return fileContent.Contains(masterPagePlaceholder);
}
}
}