using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
namespace Zion.ERP.Inventory
{
///
/// API配置编辑器窗口
///
public class ApiConfigEditorWindow : EditorWindow
{
private ApiConfigData configData;
private Vector2 scrollPosition;
private const string CONFIG_PATH = "Assets/StreamingAssets/DataConfig/api_config.json";
private List environmentFoldouts = new List();
private List endpointFoldouts = new List();
private List parameterFoldouts = new List();
private bool showEnvironments = true;
private bool showEndpoints = true;
private bool showGlobalParameters = true;
[MenuItem("工具/API配置编辑器")]
public static void ShowWindow()
{
GetWindow("API配置编辑器");
}
private void OnEnable()
{
LoadConfigData();
SyncFoldouts();
}
private void LoadConfigData()
{
if (!Directory.Exists("Assets/StreamingAssets/DataConfig"))
{
Directory.CreateDirectory("Assets/StreamingAssets/DataConfig");
}
if (File.Exists(CONFIG_PATH))
{
string jsonContent = File.ReadAllText(CONFIG_PATH);
configData = JsonConvert.DeserializeObject(jsonContent);
}
if (configData == null)
{
Debug.LogError("未找到API配置文件,请确保配置文件存在");
configData = new ApiConfigData();
}
}
private void CreateDefaultConfig()
{
Debug.LogWarning("CreateDefaultConfig方法已废弃,请使用JSON配置文件进行配置");
configData = new ApiConfigData();
}
private void SaveConfigData()
{
string jsonContent = JsonConvert.SerializeObject(configData, Formatting.Indented);
File.WriteAllText(CONFIG_PATH, jsonContent);
AssetDatabase.Refresh();
}
private void SyncFoldouts()
{
while (environmentFoldouts.Count < configData.Environments.Count)
environmentFoldouts.Add(false);
while (environmentFoldouts.Count > configData.Environments.Count)
environmentFoldouts.RemoveAt(environmentFoldouts.Count - 1);
while (endpointFoldouts.Count < configData.Endpoints.Count)
endpointFoldouts.Add(false);
while (endpointFoldouts.Count > configData.Endpoints.Count)
endpointFoldouts.RemoveAt(endpointFoldouts.Count - 1);
while (parameterFoldouts.Count < configData.GlobalParameters.Count)
parameterFoldouts.Add(false);
while (parameterFoldouts.Count > configData.GlobalParameters.Count)
parameterFoldouts.RemoveAt(parameterFoldouts.Count - 1);
}
private void OnGUI()
{
if (configData == null)
{
LoadConfigData();
return;
}
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
// 标题
EditorGUILayout.LabelField("API接口配置编辑器", EditorStyles.boldLabel);
EditorGUILayout.Space();
// 基本信息
EditorGUILayout.LabelField("基本信息", EditorStyles.boldLabel);
configData.Version = EditorGUILayout.TextField("版本", configData.Version);
configData.Description = EditorGUILayout.TextField("描述", configData.Description);
configData.CurrentEnvironment = (ApiEnvironment)EditorGUILayout.EnumPopup("当前环境", configData.CurrentEnvironment);
EditorGUILayout.Space();
// 环境配置
showEnvironments = EditorGUILayout.Foldout(showEnvironments, "环境配置", true);
if (showEnvironments)
{
EditorGUI.indentLevel++;
for (int i = 0; i < configData.Environments.Count; i++)
{
var env = configData.Environments[i];
environmentFoldouts[i] = EditorGUILayout.Foldout(environmentFoldouts[i], $"{env.Environment} - {env.BaseUrl}", true);
if (environmentFoldouts[i])
{
EditorGUI.indentLevel++;
env.Environment = (ApiEnvironment)EditorGUILayout.EnumPopup("环境", env.Environment);
env.BaseUrl = EditorGUILayout.TextField("基础URL", env.BaseUrl);
env.DefaultTimeout = EditorGUILayout.IntField("默认超时时间", env.DefaultTimeout);
env.DefaultRetryCount = EditorGUILayout.IntField("默认重试次数", env.DefaultRetryCount);
env.IsEnabled = EditorGUILayout.Toggle("启用", env.IsEnabled);
env.Description = EditorGUILayout.TextField("描述", env.Description);
if (GUILayout.Button("删除环境"))
{
configData.Environments.RemoveAt(i);
SyncFoldouts();
break;
}
EditorGUI.indentLevel--;
}
}
if (GUILayout.Button("添加环境"))
{
configData.Environments.Add(new ApiEnvironmentConfig());
SyncFoldouts();
}
EditorGUI.indentLevel--;
}
EditorGUILayout.Space();
// API接口配置
showEndpoints = EditorGUILayout.Foldout(showEndpoints, "API接口配置", true);
if (showEndpoints)
{
EditorGUI.indentLevel++;
for (int i = 0; i < configData.Endpoints.Count; i++)
{
var endpoint = configData.Endpoints[i];
endpointFoldouts[i] = EditorGUILayout.Foldout(endpointFoldouts[i], $"{endpoint.Name} - {endpoint.Description}", true);
if (endpointFoldouts[i])
{
EditorGUI.indentLevel++;
endpoint.Name = EditorGUILayout.TextField("接口名称", endpoint.Name);
endpoint.Description = EditorGUILayout.TextField("描述", endpoint.Description);
endpoint.UrlTemplate = EditorGUILayout.TextField("URL模板", endpoint.UrlTemplate);
endpoint.Method = EditorGUILayout.TextField("HTTP方法", endpoint.Method);
endpoint.RequireAuth = EditorGUILayout.Toggle("需要认证", endpoint.RequireAuth);
endpoint.Timeout = EditorGUILayout.IntField("超时时间", endpoint.Timeout);
endpoint.RetryCount = EditorGUILayout.IntField("重试次数", endpoint.RetryCount);
endpoint.IsEnabled = EditorGUILayout.Toggle("启用", endpoint.IsEnabled);
// 参数配置
EditorGUILayout.LabelField("参数配置", EditorStyles.boldLabel);
for (int j = 0; j < endpoint.Parameters.Count; j++)
{
var param = endpoint.Parameters[j];
parameterFoldouts[j] = EditorGUILayout.Foldout(parameterFoldouts[j], $"参数 {j + 1}", true);
if (parameterFoldouts[j])
{
param.Name = EditorGUILayout.TextField("参数名", param.Name);
param.Value = EditorGUILayout.TextField("参数值", param.Value);
param.Description = EditorGUILayout.TextField("描述", param.Description);
param.IsRequired = EditorGUILayout.Toggle("必需", param.IsRequired);
if (GUILayout.Button("删除参数"))
{
endpoint.Parameters.RemoveAt(j);
break;
}
}
}
if (GUILayout.Button("添加参数"))
{
endpoint.Parameters.Add(new ApiParameter());
}
if (GUILayout.Button("删除接口"))
{
configData.Endpoints.RemoveAt(i);
SyncFoldouts();
break;
}
EditorGUI.indentLevel--;
}
}
if (GUILayout.Button("添加接口"))
{
configData.Endpoints.Add(new ApiEndpoint());
SyncFoldouts();
}
EditorGUI.indentLevel--;
}
EditorGUILayout.Space();
// 全局参数
showGlobalParameters = EditorGUILayout.Foldout(showGlobalParameters, "全局参数", true);
if (showGlobalParameters)
{
EditorGUI.indentLevel++;
for (int i = 0; i < configData.GlobalParameters.Count; i++)
{
var param = configData.GlobalParameters[i];
parameterFoldouts[i] = EditorGUILayout.Foldout(parameterFoldouts[i], $"全局参数 {i + 1}", true);
if (parameterFoldouts[i])
{
param.Name = EditorGUILayout.TextField("参数名", param.Name);
param.Value = EditorGUILayout.TextField("参数值", param.Value);
param.Description = EditorGUILayout.TextField("描述", param.Description);
param.IsRequired = EditorGUILayout.Toggle("必需", param.IsRequired);
if (GUILayout.Button("删除参数"))
{
configData.GlobalParameters.RemoveAt(i);
SyncFoldouts();
break;
}
}
}
if (GUILayout.Button("添加全局参数"))
{
configData.GlobalParameters.Add(new ApiParameter());
SyncFoldouts();
}
EditorGUI.indentLevel--;
}
EditorGUILayout.Space();
// 操作按钮
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("保存配置"))
{
SaveConfigData();
EditorUtility.DisplayDialog("保存成功", "API配置已保存到JSON文件", "确定");
}
if (GUILayout.Button("重新加载"))
{
LoadConfigData();
SyncFoldouts();
}
if (GUILayout.Button("重置为默认"))
{
EditorUtility.DisplayDialog("提示", "重置功能已废弃,请直接编辑JSON配置文件", "确定");
}
EditorGUILayout.EndHorizontal();
// 验证配置
if (GUILayout.Button("验证配置"))
{
if (configData.Validate())
{
EditorUtility.DisplayDialog("验证成功", "API配置验证通过", "确定");
}
else
{
EditorUtility.DisplayDialog("验证失败", "API配置验证失败,请检查配置", "确定");
}
}
EditorGUILayout.EndScrollView();
}
}
}