feat:搭建yi-abp tool框架

This commit is contained in:
橙子
2024-06-02 13:09:25 +08:00
parent daaa3513ae
commit cbc34ade78
35 changed files with 822 additions and 9 deletions

View File

@@ -0,0 +1,114 @@
using System;
using System.Collections.Generic;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Yi.Abp.Tool.Domain.Shared.Dtos;
using Yi.Abp.Tool.Domain.Shared.Options;
namespace Yi.Abp.Tool.Domain
{
public class TemplateGenManager : ITransientDependency
{
public readonly ToolOptions _toolOptions;
public TemplateGenManager(IOptionsMonitor<ToolOptions> toolOptions) { _toolOptions = toolOptions.CurrentValue; }
public async Task<string> CreateTemplateAsync(TemplateGenCreateDto input)
{
if (string.IsNullOrEmpty(input.TemplateFilePath))
{
throw new UserFriendlyException($"模板路径无法找到,请检查,[{input.TemplateFilePath}]路径");
}
if (string.IsNullOrEmpty(_toolOptions.TempDirPath))
{
throw new UserFriendlyException($"临时目录路径无法找到,请检查,[{_toolOptions.TempDirPath}]路径");
}
var id = Guid.NewGuid().ToString("N");
var tempFileDirPath = Path.Combine(_toolOptions.TempDirPath, $"{id}");
if (!Directory.Exists(tempFileDirPath))
{
Directory.CreateDirectory(tempFileDirPath);
}
//文件解压覆盖
ZipFile.ExtractToDirectory(input.TemplateFilePath, tempFileDirPath, true);
await ReplaceContentAsync(tempFileDirPath, input.ReplaceStrData);
var tempFilePath = Path.Combine(_toolOptions.TempDirPath, $"{id}.zip");
ZipFile.CreateFromDirectory(tempFileDirPath, tempFilePath);
//创建压缩包后删除临时目录
Directory.Delete(tempFileDirPath, true);
return tempFilePath;
}
/// <summary>
/// 替换内容,key为要替换的内容value为替换成的内容
/// </summary>
/// <returns></returns>
private async Task ReplaceContentAsync(string rootDirectory, Dictionary<string, string> dic)
{
foreach (var dicEntry in dic)
{
await ReplaceInDirectory(rootDirectory, dicEntry.Key, dicEntry.Value);
}
//替换目录名
static async Task ReplaceInDirectory(string directoryPath, string searchString, string replaceString)
{
// 替换当前目录下的文件和文件夹名称
var newDirPath = await ReplaceInFiles(directoryPath, searchString, replaceString);
// 递归遍历子目录
string[] subDirectories = Directory.GetDirectories(newDirPath);
foreach (string subDirectory in subDirectories)
{
await ReplaceInDirectory(subDirectory, searchString, replaceString);
}
}
//替换文件名
static async Task<string> ReplaceInFiles(string directoryPath, string searchString, string replaceString)
{
// 替换目录名
string directoryName = new DirectoryInfo(directoryPath).Name;
string newDirectoryName = directoryName.Replace(searchString, replaceString);
if (directoryName != newDirectoryName)
{
string parentDirectory = Path.GetDirectoryName(directoryPath);
string newDirectoryPath = Path.Combine(parentDirectory, newDirectoryName);
Directory.Move(directoryPath, newDirectoryPath);
directoryPath = newDirectoryPath;
}
// 替换文件名
string[] files = Directory.GetFiles(directoryPath);
foreach (string file in files)
{
string newFileName = file.Replace(searchString, replaceString);
if (file != newFileName)
{
File.Move(file, newFileName);
}
}
files = Directory.GetFiles(directoryPath);
// 替换文件内容
foreach (string file in files)
{
string fileContent = await File.ReadAllTextAsync(file);
string newFileContent = fileContent.Replace(searchString, replaceString);
await File.WriteAllTextAsync(file, newFileContent);
}
return directoryPath;
}
}
}
}

View File

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Yi.Abp.Tool.Domain.Shared\Yi.Abp.Tool.Domain.Shared.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,24 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Yi.Abp.Tool.Domain.Shared;
using Yi.Abp.Tool.Domain.Shared.Options;
namespace Yi.Abp.Tool.Domain
{
[DependsOn(typeof(YiAbpToolDomainSharedModule))]
public class YiAbpToolDomainModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
Configure<ToolOptions>(configuration.GetSection("ToolOptions"));
var toolOptions = new ToolOptions();
configuration.GetSection("ToolOptions").Bind(toolOptions);
if (!Directory.Exists(toolOptions.TempDirPath))
{
Directory.CreateDirectory(toolOptions.TempDirPath);
}
}
}
}