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
201 lines
9.6 KiB
3 weeks ago
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|