Browse Source

add axios or vben-axios proxy generator

pull/754/head
cKey 3 years ago
parent
commit
260fd09e66
  1. 8
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/AbpCliModule.cs
  2. 25
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/GenerateProxyCommand.cs
  3. 4
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/GenerateProxyArgs.cs
  4. 231
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/AxiosHttpApiScriptGenerator.cs
  5. 6
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/IHttpApiScriptGenerator.cs
  6. 10
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/ITypeScriptModelGenerator.cs
  7. 182
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/TypeScriptModelGenerator.cs
  8. 24
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/TypeScriptServiceProxyGenerator.cs
  9. 12
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/TypeScriptServiceProxyOptions.cs
  10. 233
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/UniAppAxiosHttpApiScriptGenerator.cs
  11. 241
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/VbenAxiosHttpApiScriptGenerator.cs
  12. 210
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/VbenDynamicHttpApiScriptGenerator.cs
  13. 2
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json

8
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/AbpCliModule.cs

@ -29,6 +29,14 @@ namespace LINGYUN.Abp.Cli
options.Generators[TypeScriptServiceProxyGenerator.Name] = typeof(TypeScriptServiceProxyGenerator);
options.Generators[CSharpServiceProxyGenerator.Name] = typeof(CSharpServiceProxyGenerator);
});
Configure<TypeScriptServiceProxyOptions>(options =>
{
options.ScriptGenerators[AxiosHttpApiScriptGenerator.Name] = new AxiosHttpApiScriptGenerator();
options.ScriptGenerators[VbenAxiosHttpApiScriptGenerator.Name] = new VbenAxiosHttpApiScriptGenerator();
options.ScriptGenerators[VbenDynamicHttpApiScriptGenerator.Name] = new VbenDynamicHttpApiScriptGenerator();
options.ScriptGenerators[UniAppAxiosHttpApiScriptGenerator.Name] = new UniAppAxiosHttpApiScriptGenerator();
});
}
}
}

25
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/GenerateProxyCommand.cs

@ -1,4 +1,5 @@
using LINGYUN.Abp.Cli.ServiceProxying;
using LINGYUN.Abp.Cli.ServiceProxying.TypeScript;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System;
@ -54,6 +55,8 @@ public class GenerateProxyCommand : IConsoleCommand, ITransientDependency
private VoloGenerateProxyArgs BuildArgs(CommandLineArgs commandLineArgs)
{
var provider = commandLineArgs.Options.GetOrNull(Options.Provider.Short, Options.Provider.Long);
var apiScriptProxy = commandLineArgs.Options.GetOrNull(Options.ApiScriptProxy.Short, Options.ApiScriptProxy.Long) ??
VbenDynamicHttpApiScriptGenerator.Name;
var url = commandLineArgs.Options.GetOrNull(Options.Url.Short, Options.Url.Long);
var target = commandLineArgs.Options.GetOrNull(Options.Target.Long);
var module = commandLineArgs.Options.GetOrNull(Options.Module.Short, Options.Module.Long) ?? "app";
@ -63,7 +66,19 @@ public class GenerateProxyCommand : IConsoleCommand, ITransientDependency
var workDirectory = commandLineArgs.Options.GetOrNull(Options.WorkDirectory.Short, Options.WorkDirectory.Long) ?? Directory.GetCurrentDirectory();
var folder = commandLineArgs.Options.GetOrNull(Options.Folder.Long);
return new GenerateProxyArgs(CommandName, workDirectory, module, url, output, target, apiName, source, folder, provider, commandLineArgs.Options);
return new GenerateProxyArgs(
CommandName,
workDirectory,
module,
url,
output,
target,
apiName,
source,
folder,
provider,
apiScriptProxy,
commandLineArgs.Options);
}
public string GetUsageInfo()
@ -84,6 +99,7 @@ public class GenerateProxyCommand : IConsoleCommand, ITransientDependency
sb.AppendLine(" csharp");
sb.AppendLine(" --folder <folder-name> (default: 'ClientProxies') Folder name to place generated CSharp code in.");
sb.AppendLine(" ts");
sb.AppendLine(" -asp|--api-script-proxy <api-script-proxy> The generated api proxy type(axios, vben-axios, vben-dynamic). default: vben-dynamic.");
sb.AppendLine(" -o|--output <output-name> TypeScript file path or folder to place generated code in.");
sb.AppendLine("-p|--provider <client-proxy-provider> The client proxy provider(http, dapr).");
sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI");
@ -96,6 +112,7 @@ public class GenerateProxyCommand : IConsoleCommand, ITransientDependency
sb.AppendLine(" labp generate-proxy -m identity -o Pages/Identity/client-proxies.js -url https://localhost:44302/");
sb.AppendLine(" labp generate-proxy --folder MyProxies/InnerFolder -url https://localhost:44302/");
sb.AppendLine(" labp generate-proxy -t ts -m identity -o api/identity -url https://localhost:44302/");
sb.AppendLine(" labp generate-proxy -t ts -asp vben-dynamic -m identity -o api/identity -url https://localhost:44302/");
return sb.ToString();
}
@ -119,6 +136,12 @@ public class GenerateProxyCommand : IConsoleCommand, ITransientDependency
public const string Long = "provider";
}
public static class ApiScriptProxy
{
public const string Short = "asp";
public const string Long = "api-script-proxy";
}
public static class Module
{
public const string Short = "m";

4
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/GenerateProxyArgs.cs

@ -7,6 +7,8 @@ public class GenerateProxyArgs : Volo.Abp.Cli.ServiceProxying.GenerateProxyArgs
{
public string Provider { get; }
public string ApiScriptProxy { get; }
public GenerateProxyArgs(
[NotNull] string commandName,
[NotNull] string workDirectory,
@ -18,9 +20,11 @@ public class GenerateProxyArgs : Volo.Abp.Cli.ServiceProxying.GenerateProxyArgs
string source,
string folder,
string provider,
string apiScriptProxy,
Dictionary<string, string> extraProperties = null)
: base(commandName, workDirectory, module, url, output, target, apiName, source, folder, extraProperties)
{
ApiScriptProxy = apiScriptProxy;
Provider = provider;
}
}

231
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/AxiosHttpApiScriptGenerator.cs

@ -0,0 +1,231 @@
using System;
using System.Linq;
using System.Text;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Modeling;
namespace LINGYUN.Abp.Cli.ServiceProxying.TypeScript;
// axios原生代理生成
public class AxiosHttpApiScriptGenerator : IHttpApiScriptGenerator, ITransientDependency
{
public const string Name = "axios";
public string CreateScript(
ApplicationApiDescriptionModel appModel,
ModuleApiDescriptionModel apiModel,
ControllerApiDescriptionModel actionModel)
{
var apiScriptBuilder = new StringBuilder();
apiScriptBuilder.AppendLine("import axios from 'axios';");
var importModel = "";
foreach (var action in actionModel.Actions)
{
foreach (var paramter in action.Value.ParametersOnMethod)
{
if (appModel.Types.TryGetValue(paramter.Type, out var _))
{
var modelTypeName = paramter.Type[(paramter.Type.LastIndexOf('.') + 1)..];
if (!importModel.Contains(modelTypeName))
{
importModel += modelTypeName + ", ";
}
}
}
var returnType = action.Value.ReturnValue.TypeSimple;
if (!returnType.StartsWith("System"))
{
var abpBaseType = TypeScriptModelGenerator.AbpBaseTypes.FirstOrDefault(basType => returnType.StartsWith(basType));
if (!abpBaseType.IsNullOrWhiteSpace())
{
returnType = returnType
.Replace(abpBaseType, "")
.Replace("<", "")
.Replace(">", "");
}
returnType = ReplaceTypeSimple(returnType);
returnType = returnType[(returnType.LastIndexOf('.') + 1)..];
if (!importModel.Contains(returnType))
{
importModel += returnType + ",";
}
}
}
importModel = importModel.RemovePostFix(",");
apiScriptBuilder.AppendLine("import { " + importModel + " } from './model';");
apiScriptBuilder.AppendLine("");
foreach (var action in actionModel.Actions)
{
var url = action.Value.Url;
var isFormatUrl = false;
apiScriptBuilder.AppendFormat("export const {0} = (", action.Value.UniqueName);
for (var index = 0; index < action.Value.ParametersOnMethod.Count; index++)
{
var paramter = action.Value.ParametersOnMethod[index];
var apiParamCharacter = paramter.IsOptional ? "?:" : ":";
var apiParamName = paramter.TypeSimple;
apiParamName = apiParamName[(apiParamName.LastIndexOf('.') + 1)..];
apiScriptBuilder.AppendFormat("{0}{1} {2}", paramter.Name, apiParamCharacter, apiParamName);
if (index < action.Value.ParametersOnMethod.Count - 1)
{
apiScriptBuilder.Append(", ");
}
// 需要格式化url
if (url.Contains('{') && url.Contains(paramter.Name))
{
var formatUrl = MiddleString(url, "{", "}");
url = url.Replace(formatUrl, "");
url = "'" + url + "'" + " + " + paramter.Name;
isFormatUrl = true;
}
}
apiScriptBuilder.AppendLine(") => {");
var apiRetuanName = action.Value.ReturnValue.TypeSimple;
if (apiRetuanName.Contains("ListResultDto"))
{
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
apiRetuanName = $"ListResultDto<{apiRetuanName}>";
}
else if (apiRetuanName.Contains("PagedResultDto"))
{
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
apiRetuanName = $"PagedResultDto<{apiRetuanName}>";
}
else
{
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
}
if (action.Value.ReturnValue.TypeSimple.Contains("System."))
{
apiRetuanName = apiRetuanName.ToLower();
}
if (!url.StartsWith("'") && !url.EndsWith("'"))
{
url = "'" + url + "'";
}
apiScriptBuilder.AppendFormat(" return axios.request<{0}>(", apiRetuanName);
apiScriptBuilder.AppendLine("{");
apiScriptBuilder.AppendFormat(" method: '{0}',", action.Value.HttpMethod);
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendFormat(" url: {0},", url);
apiScriptBuilder.AppendLine("");
if (TypeScriptModelGenerator.DataInParamMethods.Contains(action.Value.HttpMethod))
{
if (!isFormatUrl && action.Value.ParametersOnMethod.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in action.Value.ParametersOnMethod)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
else
{
var inPathParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Path");
var inBodyParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Body");
if (!isFormatUrl && inPathParams.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in inPathParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
if (inBodyParams.Any() &&
inBodyParams.Count() == 1)
{
apiScriptBuilder.AppendFormat(" data: {0},", inBodyParams.First().NameOnMethod);
apiScriptBuilder.AppendLine("");
}
else
{
apiScriptBuilder.AppendLine(" data: {");
foreach (var paramter in inBodyParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
apiScriptBuilder.AppendLine(" });");
apiScriptBuilder.AppendLine("};");
}
return apiScriptBuilder.ToString();
}
protected virtual string ReplaceTypeSimple(string typeSimple)
{
typeSimple = typeSimple
.Replace("?", "")
.Replace("<System.String>", "<string>")
.Replace("<System.Guid>", "<string>")
.Replace("<System.Int32>", "<number>")
.Replace("<System.Int64>", "<number>")
.Replace("{string:string}", "Dictionary<string, string>")
.Replace("{number:string}", "Dictionary<number, string>")
.Replace("{string:number}", "Dictionary<string, number>")
.Replace("{string:object}", "Dictionary<string, any>");
if (typeSimple.StartsWith("[") && typeSimple.EndsWith("]"))
{
typeSimple = typeSimple.ReplaceFirst("[", "").RemovePostFix("]", "");
typeSimple = typeSimple.Replace(typeSimple, $"{typeSimple}[]");
}
return typeSimple;
}
public static string MiddleString(string sourse, string startstr, string endstr)
{
var result = string.Empty;
int startindex, endindex;
startindex = sourse.IndexOf(startstr);
if (startindex == -1)
{
return result;
}
var tmpstr = sourse.Substring(startindex + startstr.Length - 1);
endindex = tmpstr.IndexOf(endstr);
if (endindex == -1)
{
return result;
}
result = tmpstr.Remove(endindex + 1);
return result;
}
}

6
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/ITypeScriptProxyGenerator.cs → aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/IHttpApiScriptGenerator.cs

@ -2,12 +2,8 @@
namespace LINGYUN.Abp.Cli.ServiceProxying.TypeScript;
public interface ITypeScriptProxyGenerator
public interface IHttpApiScriptGenerator
{
string CreateModelScript(
ApplicationApiDescriptionModel appModel,
ControllerApiDescriptionModel actionModel);
string CreateScript(
ApplicationApiDescriptionModel appModel,
ModuleApiDescriptionModel apiModel,

10
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/ITypeScriptModelGenerator.cs

@ -0,0 +1,10 @@
using Volo.Abp.Http.Modeling;
namespace LINGYUN.Abp.Cli.ServiceProxying.TypeScript;
public interface ITypeScriptModelGenerator
{
string CreateScript(
ApplicationApiDescriptionModel appModel,
ControllerApiDescriptionModel actionModel);
}

182
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/TypeScriptProxyGenerator.cs → aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/TypeScriptModelGenerator.cs

@ -9,9 +9,9 @@ using Volo.Abp.Http.Modeling;
using Volo.Abp.ObjectExtending;
namespace LINGYUN.Abp.Cli.ServiceProxying.TypeScript;
public class TypeScriptProxyGenerator : ITypeScriptProxyGenerator, ITransientDependency
public class TypeScriptModelGenerator : ITypeScriptModelGenerator, ITransientDependency
{
protected static string[] AbpBaseTypes = new string[]
internal readonly static string[] AbpBaseTypes = new string[]
{
typeof(ExtensibleObject).FullName,
"Volo.Abp.Application.Dtos.AuditedEntityDto",
@ -34,19 +34,22 @@ public class TypeScriptProxyGenerator : ITypeScriptProxyGenerator, ITransientDep
"Volo.Abp.Application.Dtos.PagedResultDto",
"Volo.Abp.Application.Dtos.PagedResultRequestDto",
};
protected static string[] DataInParamMethods = new string[]
internal readonly static string[] DataInParamMethods = new string[]
{
"GET",
"DELETE"
};
public ILogger<TypeScriptProxyGenerator> Logger { protected get; set; }
public TypeScriptProxyGenerator()
public ILogger<TypeScriptModelGenerator> Logger { protected get; set; }
public TypeScriptModelGenerator()
{
Logger = NullLogger<TypeScriptProxyGenerator>.Instance;
Logger = NullLogger<TypeScriptModelGenerator>.Instance;
}
public string CreateModelScript(ApplicationApiDescriptionModel appModel, ControllerApiDescriptionModel actionModel)
public string CreateScript(
ApplicationApiDescriptionModel appModel,
ControllerApiDescriptionModel actionModel)
{
var modelScriptBuilder = new StringBuilder();
var modelBaseTypes = new List<string>();
@ -163,171 +166,6 @@ public class TypeScriptProxyGenerator : ITypeScriptProxyGenerator, ITransientDep
return modelScriptBuilder.ToString();
}
public string CreateScript(
ApplicationApiDescriptionModel appModel,
ModuleApiDescriptionModel apiModel,
ControllerApiDescriptionModel actionModel)
{
var apiScriptBuilder = new StringBuilder();
apiScriptBuilder.AppendLine("import { defAbpHttp } from '/@/utils/http/abp';");
var importModel = "";
foreach (var action in actionModel.Actions)
{
foreach (var paramter in action.Value.ParametersOnMethod)
{
if (appModel.Types.TryGetValue(paramter.Type, out var _))
{
var modelTypeName = paramter.Type[(paramter.Type.LastIndexOf('.') + 1)..];
if (!importModel.Contains(modelTypeName))
{
importModel += modelTypeName + ", ";
}
}
}
var returnType = action.Value.ReturnValue.TypeSimple;
if (!returnType.StartsWith("System"))
{
var abpBaseType = AbpBaseTypes.FirstOrDefault(basType => returnType.StartsWith(basType));
if (!abpBaseType.IsNullOrWhiteSpace())
{
returnType = returnType
.Replace(abpBaseType, "")
.Replace("<", "")
.Replace(">", "");
}
returnType = ReplaceTypeSimple(returnType);
returnType = returnType[(returnType.LastIndexOf('.') + 1)..];
if (!importModel.Contains(returnType))
{
importModel += returnType + ",";
}
}
}
importModel = importModel.RemovePostFix(",");
apiScriptBuilder.AppendLine("import { " + importModel + " } from './model';");
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendFormat("const remoteServiceName = '{0}';", apiModel.RemoteServiceName);
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendFormat("const controllerName = '{0}';", actionModel.ControllerName);
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendLine("");
foreach (var action in actionModel.Actions)
{
apiScriptBuilder.AppendFormat("export const {0} = (", action.Value.UniqueName);
for (var index = 0; index < action.Value.ParametersOnMethod.Count; index++)
{
var paramter = action.Value.ParametersOnMethod[index];
var apiParamCharacter = paramter.IsOptional ? "?:" : ":";
var apiParamName = paramter.TypeSimple;
apiParamName = apiParamName[(apiParamName.LastIndexOf('.') + 1)..];
apiScriptBuilder.AppendFormat("{0}{1} {2}", paramter.Name, apiParamCharacter, apiParamName);
if (index < action.Value.ParametersOnMethod.Count - 1)
{
apiScriptBuilder.Append(", ");
}
}
apiScriptBuilder.AppendLine(") => {");
var apiRequestName = "request";
var apiRetuanName = action.Value.ReturnValue.TypeSimple;
if (apiRetuanName.Contains("ListResultDto"))
{
apiRequestName = "listRequest";
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
}
else if (apiRetuanName.Contains("PagedResultDto"))
{
apiRequestName = "pagedRequest";
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
}
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
if (action.Value.ReturnValue.TypeSimple.Contains("System."))
{
apiRetuanName = apiRetuanName.ToLower();
}
apiScriptBuilder.AppendFormat(" return defAbpHttp.{0}<{1}>(", apiRequestName, apiRetuanName);
apiScriptBuilder.AppendLine("{");
apiScriptBuilder.AppendLine(" service: remoteServiceName,");
apiScriptBuilder.AppendLine(" controller: controllerName,");
apiScriptBuilder.AppendFormat(" action: '{0}',", action.Value.Name);
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendFormat(" uniqueName: '{0}',", action.Value.UniqueName);
apiScriptBuilder.AppendLine("");
if (DataInParamMethods.Contains(action.Value.HttpMethod))
{
if (action.Value.ParametersOnMethod.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in action.Value.ParametersOnMethod)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
else
{
var inPathParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Path");
var inBodyParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Body");
if (inPathParams.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in inPathParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
if (inBodyParams.Any() &&
inBodyParams.Count() == 1)
{
apiScriptBuilder.AppendFormat(" data: {0},", inBodyParams.First().NameOnMethod);
apiScriptBuilder.AppendLine("");
}
else
{
apiScriptBuilder.AppendLine(" data: {");
foreach (var paramter in inBodyParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
apiScriptBuilder.AppendLine(" });");
apiScriptBuilder.AppendLine("};");
}
return apiScriptBuilder.ToString();
}
protected virtual string CreateModel(
string modelName,
TypeApiDescriptionModel model)

24
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/TypeScriptServiceProxyGenerator.cs

@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.IO;
using System.Linq;
@ -17,15 +18,18 @@ public class TypeScriptServiceProxyGenerator : ServiceProxyGeneratorBase<TypeScr
{
public const string Name = "TS";
private readonly ITypeScriptProxyGenerator _typeScriptProxyGenerator;
private readonly ITypeScriptModelGenerator _typeScriptModelGenerator;
private readonly TypeScriptServiceProxyOptions _typeScriptServiceProxyOptions;
public TypeScriptServiceProxyGenerator(
CliHttpClientFactory cliHttpClientFactory,
IJsonSerializer jsonSerializer,
ITypeScriptProxyGenerator typeScriptProxyGenerator)
ITypeScriptModelGenerator typeScriptModelGenerator,
IOptions<TypeScriptServiceProxyOptions> typeScriptServiceProxyOptions)
: base(cliHttpClientFactory, jsonSerializer)
{
_typeScriptProxyGenerator = typeScriptProxyGenerator;
_typeScriptModelGenerator = typeScriptModelGenerator;
_typeScriptServiceProxyOptions = typeScriptServiceProxyOptions.Value;
}
public async override Task GenerateProxyAsync(Volo.Abp.Cli.ServiceProxying.GenerateProxyArgs args)
@ -41,8 +45,8 @@ public class TypeScriptServiceProxyGenerator : ServiceProxyGeneratorBase<TypeScr
{
Logger.LogInformation($" [{module.Value.RemoteServiceName}], Generating model script with controller: {controller.Value.ControllerName}.");
var modelScript = _typeScriptProxyGenerator
.CreateModelScript(applicationApiDescriptionModel, controller.Value);
var modelScript = _typeScriptModelGenerator
.CreateScript(applicationApiDescriptionModel, controller.Value);
Logger.LogInformation($" [{module.Value.RemoteServiceName}], {controller.Value.ControllerName} model script generated.");
@ -67,9 +71,17 @@ public class TypeScriptServiceProxyGenerator : ServiceProxyGeneratorBase<TypeScr
// api script
var apiScriptType = (args as GenerateProxyArgs).ApiScriptProxy;
if (!_typeScriptServiceProxyOptions.ScriptGenerators.ContainsKey(apiScriptType))
{
throw new CliUsageException($"Option Api Script Type {apiScriptType} value is invalid.");
}
var httpApiScriptProxy = _typeScriptServiceProxyOptions.ScriptGenerators[apiScriptType];
Logger.LogInformation($" [{module.Value.RemoteServiceName}], Generating api script with {apiScriptType}.");
Logger.LogInformation($" [{module.Value.RemoteServiceName}], Generating api script with controller: {controller.Value.ControllerName}.");
var apiScript = _typeScriptProxyGenerator.CreateScript(
var apiScript = httpApiScriptProxy.CreateScript(
applicationApiDescriptionModel,
module.Value,
controller.Value);

12
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/TypeScriptServiceProxyOptions.cs

@ -0,0 +1,12 @@
using System.Collections.Generic;
namespace LINGYUN.Abp.Cli.ServiceProxying.TypeScript;
public class TypeScriptServiceProxyOptions
{
public IDictionary<string, IHttpApiScriptGenerator> ScriptGenerators { get; }
public TypeScriptServiceProxyOptions()
{
ScriptGenerators = new Dictionary<string, IHttpApiScriptGenerator>();
}
}

233
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/UniAppAxiosHttpApiScriptGenerator.cs

@ -0,0 +1,233 @@
using System;
using System.Linq;
using System.Text;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Modeling;
namespace LINGYUN.Abp.Cli.ServiceProxying.TypeScript;
// 自用,请勿使用
// 适用于uni-app的axios
public class UniAppAxiosHttpApiScriptGenerator : IHttpApiScriptGenerator, ITransientDependency
{
public const string Name = "uni-app-axios";
public string CreateScript(
ApplicationApiDescriptionModel appModel,
ModuleApiDescriptionModel apiModel,
ControllerApiDescriptionModel actionModel)
{
var apiScriptBuilder = new StringBuilder();
apiScriptBuilder.AppendLine("import http from '../http'");
var importModel = "";
foreach (var action in actionModel.Actions)
{
foreach (var paramter in action.Value.ParametersOnMethod)
{
if (appModel.Types.TryGetValue(paramter.Type, out var _))
{
var modelTypeName = paramter.Type[(paramter.Type.LastIndexOf('.') + 1)..];
if (!importModel.Contains(modelTypeName))
{
importModel += modelTypeName + ", ";
}
}
}
var returnType = action.Value.ReturnValue.TypeSimple;
if (!returnType.StartsWith("System"))
{
var abpBaseType = TypeScriptModelGenerator.AbpBaseTypes.FirstOrDefault(basType => returnType.StartsWith(basType));
if (!abpBaseType.IsNullOrWhiteSpace())
{
returnType = returnType
.Replace(abpBaseType, "")
.Replace("<", "")
.Replace(">", "");
}
returnType = ReplaceTypeSimple(returnType);
returnType = returnType[(returnType.LastIndexOf('.') + 1)..];
if (!importModel.Contains(returnType))
{
importModel += returnType + ",";
}
}
}
importModel = importModel.RemovePostFix(",");
apiScriptBuilder.AppendLine("import { " + importModel + " } from './model'");
apiScriptBuilder.AppendLine("");
foreach (var action in actionModel.Actions)
{
var url = action.Value.Url;
var isFormatUrl = false;
apiScriptBuilder.AppendFormat("export const {0} = (", action.Value.UniqueName);
for (var index = 0; index < action.Value.ParametersOnMethod.Count; index++)
{
var paramter = action.Value.ParametersOnMethod[index];
var apiParamCharacter = paramter.IsOptional ? "?:" : ":";
var apiParamName = paramter.TypeSimple;
apiParamName = apiParamName[(apiParamName.LastIndexOf('.') + 1)..];
apiScriptBuilder.AppendFormat("{0}{1} {2}", paramter.Name, apiParamCharacter, apiParamName);
if (index < action.Value.ParametersOnMethod.Count - 1)
{
apiScriptBuilder.Append(", ");
}
// 需要格式化url
if (url.Contains('{') && url.Contains(paramter.Name))
{
var formatUrl = MiddleString(url, "{", "}");
url = url.Replace(formatUrl, "");
url = "'" + url + "'" + " + " + paramter.Name;
isFormatUrl = true;
}
}
var apiRetuanName = action.Value.ReturnValue.TypeSimple;
if (apiRetuanName.Contains("ListResultDto"))
{
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
apiRetuanName = $"ListResultDto<{apiRetuanName}>";
}
else if (apiRetuanName.Contains("PagedResultDto"))
{
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
apiRetuanName = $"PagedResultDto<{apiRetuanName}>";
}
else
{
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
}
if (action.Value.ReturnValue.TypeSimple.Contains("System."))
{
apiRetuanName = apiRetuanName.ToLower();
}
apiScriptBuilder.AppendFormat("): Promise<{0}> ", apiRetuanName);
apiScriptBuilder.AppendLine("=> {");
if (!url.StartsWith("'") && !url.EndsWith("'"))
{
url = "'" + url + "'";
}
apiScriptBuilder.AppendLine(" return http.request({");
apiScriptBuilder.AppendFormat(" method: '{0}',", action.Value.HttpMethod);
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendFormat(" url: {0},", url);
apiScriptBuilder.AppendLine("");
if (TypeScriptModelGenerator.DataInParamMethods.Contains(action.Value.HttpMethod))
{
if (!isFormatUrl && action.Value.ParametersOnMethod.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in action.Value.ParametersOnMethod)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
else
{
var inPathParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Path");
var inBodyParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Body");
if (!isFormatUrl && inPathParams.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in inPathParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
if (inBodyParams.Any() &&
inBodyParams.Count() == 1)
{
apiScriptBuilder.AppendFormat(" data: {0},", inBodyParams.First().NameOnMethod);
apiScriptBuilder.AppendLine("");
}
else
{
apiScriptBuilder.AppendLine(" data: {");
foreach (var paramter in inBodyParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
apiScriptBuilder.AppendLine(" })");
apiScriptBuilder.AppendLine("}");
}
return apiScriptBuilder.ToString();
}
protected virtual string ReplaceTypeSimple(string typeSimple)
{
typeSimple = typeSimple
.Replace("?", "")
.Replace("<System.String>", "<string>")
.Replace("<System.Guid>", "<string>")
.Replace("<System.Int32>", "<number>")
.Replace("<System.Int64>", "<number>")
.Replace("{string:string}", "Dictionary<string, string>")
.Replace("{number:string}", "Dictionary<number, string>")
.Replace("{string:number}", "Dictionary<string, number>")
.Replace("{string:object}", "Dictionary<string, any>");
if (typeSimple.StartsWith("[") && typeSimple.EndsWith("]"))
{
typeSimple = typeSimple.ReplaceFirst("[", "").RemovePostFix("]", "");
typeSimple = typeSimple.Replace(typeSimple, $"{typeSimple}[]");
}
return typeSimple;
}
public static string MiddleString(string sourse, string startstr, string endstr)
{
var result = string.Empty;
int startindex, endindex;
startindex = sourse.IndexOf(startstr);
if (startindex == -1)
{
return result;
}
var tmpstr = sourse.Substring(startindex + startstr.Length - 1);
endindex = tmpstr.IndexOf(endstr);
if (endindex == -1)
{
return result;
}
result = tmpstr.Remove(endindex + 1);
return result;
}
}

241
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/VbenAxiosHttpApiScriptGenerator.cs

@ -0,0 +1,241 @@
using Serilog;
using System;
using System.Linq;
using System.Text;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Modeling;
namespace LINGYUN.Abp.Cli.ServiceProxying.TypeScript;
// 用于vben原生axios代理生成
public class VbenAxiosHttpApiScriptGenerator : IHttpApiScriptGenerator, ITransientDependency
{
public const string Name = "vben-axios";
public string CreateScript(
ApplicationApiDescriptionModel appModel,
ModuleApiDescriptionModel apiModel,
ControllerApiDescriptionModel actionModel)
{
var apiScriptBuilder = new StringBuilder();
apiScriptBuilder.AppendLine("import { defHttp } from '/@/utils/http/axios';");
var importModel = "";
foreach (var action in actionModel.Actions)
{
foreach (var paramter in action.Value.ParametersOnMethod)
{
if (appModel.Types.TryGetValue(paramter.Type, out var _))
{
var modelTypeName = paramter.Type[(paramter.Type.LastIndexOf('.') + 1)..];
if (!importModel.Contains(modelTypeName))
{
importModel += modelTypeName + ", ";
}
}
}
var returnType = action.Value.ReturnValue.TypeSimple;
if (!returnType.StartsWith("System"))
{
var abpBaseType = TypeScriptModelGenerator.AbpBaseTypes.FirstOrDefault(basType => returnType.StartsWith(basType));
if (!abpBaseType.IsNullOrWhiteSpace())
{
returnType = returnType
.Replace(abpBaseType, "")
.Replace("<", "")
.Replace(">", "");
}
returnType = ReplaceTypeSimple(returnType);
returnType = returnType[(returnType.LastIndexOf('.') + 1)..];
if (!importModel.Contains(returnType))
{
importModel += returnType + ",";
}
}
}
importModel = importModel.RemovePostFix(",");
apiScriptBuilder.AppendLine("import { " + importModel + " } from './model';");
apiScriptBuilder.AppendLine("");
foreach (var action in actionModel.Actions)
{
var url = action.Value.Url;
apiScriptBuilder.AppendFormat("export const {0} = (", action.Value.UniqueName);
for (var index = 0; index < action.Value.ParametersOnMethod.Count; index++)
{
var paramter = action.Value.ParametersOnMethod[index];
var apiParamCharacter = paramter.IsOptional ? "?:" : ":";
var apiParamName = paramter.TypeSimple;
apiParamName = apiParamName[(apiParamName.LastIndexOf('.') + 1)..];
apiScriptBuilder.AppendFormat("{0}{1} {2}", paramter.Name, apiParamCharacter, apiParamName);
if (index < action.Value.ParametersOnMethod.Count - 1)
{
apiScriptBuilder.Append(", ");
}
// 需要格式化url
if (url.Contains('{') && url.Contains(paramter.Name))
{
var formatUrl = MiddleString(url, "{", "}");
url = url.Replace(formatUrl, "");
url = "'" + url + "'" + " + " + paramter.Name;
}
}
apiScriptBuilder.AppendLine(") => {");
var apiRetuanName = action.Value.ReturnValue.TypeSimple;
if (apiRetuanName.Contains("ListResultDto"))
{
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
apiRetuanName = $"ListResultDto<{apiRetuanName}>";
}
else if (apiRetuanName.Contains("PagedResultDto"))
{
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
apiRetuanName = $"PagedResultDto<{apiRetuanName}>";
}
else
{
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
}
if (action.Value.ReturnValue.TypeSimple.Contains("System."))
{
apiRetuanName = apiRetuanName.ToLower();
}
if (!url.StartsWith("'") && !url.EndsWith("'"))
{
url = "'" + url + "'";
}
apiScriptBuilder.AppendFormat(" return defHttp.request<{0}>(", apiRetuanName);
apiScriptBuilder.AppendLine("{");
apiScriptBuilder.AppendFormat(" method: '{0}',", action.Value.HttpMethod);
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendFormat(" url: {0},", url);
apiScriptBuilder.AppendLine("");
if (TypeScriptModelGenerator.DataInParamMethods.Contains(action.Value.HttpMethod))
{
if (action.Value.ParametersOnMethod.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in action.Value.ParametersOnMethod)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
else
{
var inPathParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Path");
var inBodyParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Body");
if (inPathParams.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in inPathParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
if (inBodyParams.Any() &&
inBodyParams.Count() == 1)
{
apiScriptBuilder.AppendFormat(" data: {0},", inBodyParams.First().NameOnMethod);
apiScriptBuilder.AppendLine("");
}
else
{
apiScriptBuilder.AppendLine(" data: {");
foreach (var paramter in inBodyParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
apiScriptBuilder.Append(" }");
if (action.Value.AllowAnonymous == true)
{
apiScriptBuilder.AppendLine(",{");
// 匿名方法无需token
apiScriptBuilder.AppendLine(" withToken: false,");
apiScriptBuilder.Append(" }");
}
apiScriptBuilder.AppendLine(");");
apiScriptBuilder.AppendLine("};");
}
return apiScriptBuilder.ToString();
}
protected virtual string ReplaceTypeSimple(string typeSimple)
{
typeSimple = typeSimple
.Replace("?", "")
.Replace("<System.String>", "<string>")
.Replace("<System.Guid>", "<string>")
.Replace("<System.Int32>", "<number>")
.Replace("<System.Int64>", "<number>")
.Replace("{string:string}", "Dictionary<string, string>")
.Replace("{number:string}", "Dictionary<number, string>")
.Replace("{string:number}", "Dictionary<string, number>")
.Replace("{string:object}", "Dictionary<string, any>");
if (typeSimple.StartsWith("[") && typeSimple.EndsWith("]"))
{
typeSimple = typeSimple.ReplaceFirst("[", "").RemovePostFix("]", "");
typeSimple = typeSimple.Replace(typeSimple, $"{typeSimple}[]");
}
return typeSimple;
}
public static string MiddleString(string sourse, string startstr, string endstr)
{
var result = string.Empty;
int startindex, endindex;
startindex = sourse.IndexOf(startstr);
if (startindex == -1)
{
return result;
}
var tmpstr = sourse.Substring(startindex + startstr.Length - 1);
endindex = tmpstr.IndexOf(endstr);
if (endindex == -1)
{
return result;
}
result = tmpstr.Remove(endindex + 1);
return result;
}
}

210
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/ServiceProxying/TypeScript/VbenDynamicHttpApiScriptGenerator.cs

@ -0,0 +1,210 @@
using System;
using System.Linq;
using System.Text;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Modeling;
namespace LINGYUN.Abp.Cli.ServiceProxying.TypeScript;
// 用于vben动态axios代理生成
public class VbenDynamicHttpApiScriptGenerator : IHttpApiScriptGenerator, ITransientDependency
{
public const string Name = "vben-dynamic";
public string CreateScript(
ApplicationApiDescriptionModel appModel,
ModuleApiDescriptionModel apiModel,
ControllerApiDescriptionModel actionModel)
{
var apiScriptBuilder = new StringBuilder();
apiScriptBuilder.AppendLine("import { defAbpHttp } from '/@/utils/http/abp';");
var importModel = "";
foreach (var action in actionModel.Actions)
{
foreach (var paramter in action.Value.ParametersOnMethod)
{
if (appModel.Types.TryGetValue(paramter.Type, out var _))
{
var modelTypeName = paramter.Type[(paramter.Type.LastIndexOf('.') + 1)..];
if (!importModel.Contains(modelTypeName))
{
importModel += modelTypeName + ", ";
}
}
}
var returnType = action.Value.ReturnValue.TypeSimple;
if (!returnType.StartsWith("System"))
{
var abpBaseType = TypeScriptModelGenerator.AbpBaseTypes.FirstOrDefault(basType => returnType.StartsWith(basType));
if (!abpBaseType.IsNullOrWhiteSpace())
{
returnType = returnType
.Replace(abpBaseType, "")
.Replace("<", "")
.Replace(">", "");
}
returnType = ReplaceTypeSimple(returnType);
returnType = returnType[(returnType.LastIndexOf('.') + 1)..];
if (!importModel.Contains(returnType))
{
importModel += returnType + ",";
}
}
}
importModel = importModel.RemovePostFix(",");
apiScriptBuilder.AppendLine("import { " + importModel + " } from './model';");
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendFormat("const remoteServiceName = '{0}';", apiModel.RemoteServiceName);
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendFormat("const controllerName = '{0}';", actionModel.ControllerName);
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendLine("");
foreach (var action in actionModel.Actions)
{
apiScriptBuilder.AppendFormat("export const {0} = (", action.Value.UniqueName);
for (var index = 0; index < action.Value.ParametersOnMethod.Count; index++)
{
var paramter = action.Value.ParametersOnMethod[index];
var apiParamCharacter = paramter.IsOptional ? "?:" : ":";
var apiParamName = paramter.TypeSimple;
apiParamName = apiParamName[(apiParamName.LastIndexOf('.') + 1)..];
apiScriptBuilder.AppendFormat("{0}{1} {2}", paramter.Name, apiParamCharacter, apiParamName);
if (index < action.Value.ParametersOnMethod.Count - 1)
{
apiScriptBuilder.Append(", ");
}
}
apiScriptBuilder.AppendLine(") => {");
var apiRequestName = "request";
var apiRetuanName = action.Value.ReturnValue.TypeSimple;
if (apiRetuanName.Contains("ListResultDto"))
{
apiRequestName = "listRequest";
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
}
else if (apiRetuanName.Contains("PagedResultDto"))
{
apiRequestName = "pagedRequest";
apiRetuanName = apiRetuanName[(apiRetuanName.IndexOf("<") + 1)..];
apiRetuanName = apiRetuanName[..^1];
}
apiRetuanName = apiRetuanName[(apiRetuanName.LastIndexOf('.') + 1)..];
if (action.Value.ReturnValue.TypeSimple.Contains("System."))
{
apiRetuanName = apiRetuanName.ToLower();
}
apiScriptBuilder.AppendFormat(" return defAbpHttp.{0}<{1}>(", apiRequestName, apiRetuanName);
apiScriptBuilder.AppendLine("{");
apiScriptBuilder.AppendLine(" service: remoteServiceName,");
apiScriptBuilder.AppendLine(" controller: controllerName,");
apiScriptBuilder.AppendFormat(" action: '{0}',", action.Value.Name);
apiScriptBuilder.AppendLine("");
apiScriptBuilder.AppendFormat(" uniqueName: '{0}',", action.Value.UniqueName);
apiScriptBuilder.AppendLine("");
if (TypeScriptModelGenerator.DataInParamMethods.Contains(action.Value.HttpMethod))
{
if (action.Value.ParametersOnMethod.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in action.Value.ParametersOnMethod)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
else
{
var inPathParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Path");
var inBodyParams = action.Value.Parameters.Where(p => p.BindingSourceId == "Body");
if (inPathParams.Any())
{
apiScriptBuilder.AppendLine(" params: {");
foreach (var paramter in inPathParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
if (inBodyParams.Any() &&
inBodyParams.Count() == 1)
{
apiScriptBuilder.AppendFormat(" data: {0},", inBodyParams.First().NameOnMethod);
apiScriptBuilder.AppendLine("");
}
else
{
apiScriptBuilder.AppendLine(" data: {");
foreach (var paramter in inBodyParams)
{
apiScriptBuilder.AppendFormat(" {0}: {1},", paramter.Name, paramter.Name);
apiScriptBuilder.AppendLine("");
}
apiScriptBuilder.AppendLine(" },");
}
}
apiScriptBuilder.Append(" }");
if (action.Value.AllowAnonymous == true)
{
apiScriptBuilder.AppendLine(",{");
// 匿名方法无需token
apiScriptBuilder.AppendLine(" withToken: false,");
apiScriptBuilder.Append(" }");
}
apiScriptBuilder.AppendLine(");");
apiScriptBuilder.AppendLine("};");
}
return apiScriptBuilder.ToString();
}
protected virtual string ReplaceTypeSimple(string typeSimple)
{
typeSimple = typeSimple
.Replace("?", "")
.Replace("<System.String>", "<string>")
.Replace("<System.Guid>", "<string>")
.Replace("<System.Int32>", "<number>")
.Replace("<System.Int64>", "<number>")
.Replace("{string:string}", "Dictionary<string, string>")
.Replace("{number:string}", "Dictionary<number, string>")
.Replace("{string:number}", "Dictionary<string, number>")
.Replace("{string:object}", "Dictionary<string, any>");
if (typeSimple.StartsWith("[") && typeSimple.EndsWith("]"))
{
typeSimple = typeSimple.ReplaceFirst("[", "").RemovePostFix("]", "");
typeSimple = typeSimple.Replace(typeSimple, $"{typeSimple}[]");
}
return typeSimple;
}
}

2
aspnet-core/modules/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json

@ -2,7 +2,7 @@
"profiles": {
"LINGYUN.Abp.Cli": {
"commandName": "Project",
"commandLineArgs": "generate-proxy -t ts -u http://127.0.0.1:30045 -m webhooks-management -o D:\\Projects\\Development\\type-script"
"commandLineArgs": "generate-proxy -t ts -asp uni-app-axios -u http://127.0.0.1:30010 -m abp -o D:\\Projects\\Development\\type-script"
}
}
}
Loading…
Cancel
Save