using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Results;
using System.Web;
using System.IO;
using MongoDB.Bson;
using MongoDB.Driver;
using Newtonsoft.Json.Linq;
using ShadowEditor.Server.Base;
using ShadowEditor.Server.Helpers;
using Newtonsoft.Json;
using System.Text;
using ShadowEditor.Server.CustomAttribute;
namespace ShadowEditor.Server.Controllers.Export
{
///
/// 导出所有示例控制器
///
public class ExportExamplesController : ApiBase
{
///
/// 发布静态网站
///
///
[HttpPost]
[Authority(OperatingAuthority.EXPORT_EXAMPLES)]
public JsonResult Run()
{
var now = DateTime.Now;
var path = HttpContext.Current.Server.MapPath($"~/temp/{now.ToString("yyyyMMddHHmmss")}");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
this.CopyStaticAssets(path);
this.CreateDataFile(path);
return Json(new
{
Code = 200,
Msg = "Export successfully!",
Url = $"/temp/{now.ToString("yyyyMMddHHmmss")}/index.html"
});
}
#region 复制静态资源
///
/// 复制静态资源到示例文件夹
///
///
private void CopyStaticAssets(string path)
{
var list = new string[]
{
"favicon.ico",
"index.html",
"view.html",
"assets",
"build",
"locales"
};
foreach (var i in list)
{
var source = HttpContext.Current.Server.MapPath($"~/{i}");
var dest = $"{path}/{i}";
if (File.Exists(source)) // 文件
{
File.Copy(source, dest, true);
if (i == "index.html" || i == "view.html") // 入口页需要把服务端替换成相对目录,以便静态化api接口。
{
var text1 = File.ReadAllText(dest, Encoding.UTF8).Replace("location.origin", "'.'"); // 使api路径变为当前目录
File.WriteAllText(dest, text1, Encoding.UTF8);
}
}
else if (Directory.Exists(source)) // 目录
{
DirectoryHelper.Copy(source, dest);
}
else // 其他
{
throw new Exception($"Unknown ${i}");
}
}
}
#endregion
///
/// 通过调用API接口,创建数据文件
///
///
private void CreateDataFile(string path)
{
var dirName = $"{path}/api/";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
this.CreateAnimationDataFile(path);
this.CreateAssetsDataFile(path);
this.CreateAudioDataFile(path);
this.CreateCategoryDataFile(path);
this.CreateCharacterDataFile(path);
this.CreateMapDataFile(path);
this.CreateMaterialDataFile(path);
this.CreateMeshDataFile(path);
this.CreateParticleDataFile(path);
this.CreatePrefabDataFile(path);
this.CreateSceneDataFile(path);
this.CreateScreenshotDataFile(path);
this.CreateUploadDataFile(path);
this.CreateVideoDataFile(path);
}
#region Animation
///
/// 复制动画数据文件
///
///
private void CreateAnimationDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Animation/List");
var dirName = $"{path}/api/Animation";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Animation/List";
File.WriteAllText(fileName, result);
// 其他接口
var apiList = new string[] { $"{path}/api/Animation/Add", $"{path}/api/Animation/Edit", $"{path}/api/Animation/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Assets
///
/// 复制资源数据文件
///
///
private void CreateAssetsDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Assets/List");
var dirName = $"{path}/api/Assets";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Assets/List";
File.WriteAllText(fileName, result);
}
#endregion
#region Audio
///
/// 创建音频数据文件
///
///
private void CreateAudioDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Audio/List");
var dirName = $"{path}/api/Audio";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Audio/List";
File.WriteAllText(fileName, result);
// 其他接口
var apiList = new string[] { $"{path}/api/Audio/Add", $"{path}/api/Audio/Edit", $"{path}/api/Audio/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Category
///
/// 创建类别数据文件
///
///
private void CreateCategoryDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Category/List");
var dirName = $"{path}/api/Category";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Category/List";
File.WriteAllText(fileName, result);
// 其他接口
var apiList = new string[] { $"{path}/api/Category/Save", $"{path}/api/Category/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Character
///
/// 创建角色数据文件
///
private void CreateCharacterDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Character/List");
var dirName = $"{path}/api/Character";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Character/List";
File.WriteAllText(fileName, result);
// 导出场景
var obj = JsonConvert.DeserializeObject(result);
var array = obj["Data"] as JArray;
foreach (var i in array)
{
var id = i["ID"].ToString();
result = HttpHelper.Get($"http://{host}:{port}/api/Character/Get?ID={id}");
fileName = $"{path}/api/Character/Character_{id}";
File.WriteAllText(fileName, result);
}
// 其他接口
var apiList = new string[] { $"{path}/api/Character/Edit", $"{path}/api/Character/Save", $"{path}/api/Character/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Map
///
/// 创建贴图数据文件
///
///
private void CreateMapDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Map/List");
var dirName = $"{path}/api/Map";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Map/List";
File.WriteAllText(fileName, result);
// 其他接口
var apiList = new string[] { $"{path}/api/Map/Add", $"{path}/api/Map/Edit", $"{path}/api/Map/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Material
///
/// 创建材质数据文件
///
///
private void CreateMaterialDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Material/List");
var dirName = $"{path}/api/Material";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Material/List";
File.WriteAllText(fileName, result);
// 其他接口
var apiList = new string[] { $"{path}/api/Material/Add", $"{path}/api/Material/Edit", $"{path}/api/Material/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Mesh
///
/// 创建模型数据文件
///
///
private void CreateMeshDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Mesh/List");
var dirName = $"{path}/api/Mesh";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Mesh/List";
File.WriteAllText(fileName, result);
// 其他接口
var apiList = new string[] { $"{path}/api/Mesh/Add", $"{path}/api/Mesh/Edit", $"{path}/api/Mesh/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Particle
///
/// 创建粒子数据文件
///
private void CreateParticleDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Particle/List");
var dirName = $"{path}/api/Particle";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Particle/List";
File.WriteAllText(fileName, result);
// 导出场景
var obj = JsonConvert.DeserializeObject(result);
var array = obj["Data"] as JArray;
foreach (var i in array)
{
var id = i["ID"].ToString();
result = HttpHelper.Get($"http://{host}:{port}/api/Particle/Get?ID={id}");
fileName = $"{path}/api/Particle/Particle_{id}";
File.WriteAllText(fileName, result);
}
// 其他接口
var apiList = new string[] { $"{path}/api/Particle/Edit", $"{path}/api/Particle/Save", $"{path}/api/Particle/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Particle
///
/// 创建预设体数据文件
///
private void CreatePrefabDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Prefab/List");
var dirName = $"{path}/api/Prefab";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Prefab/List";
File.WriteAllText(fileName, result);
// 导出场景
var obj = JsonConvert.DeserializeObject(result);
var array = obj["Data"] as JArray;
foreach (var i in array)
{
var id = i["ID"].ToString();
result = HttpHelper.Get($"http://{host}:{port}/api/Prefab/Get?ID={id}");
fileName = $"{path}/api/Prefab/Prefab_{id}";
File.WriteAllText(fileName, result);
}
// 其他接口
var apiList = new string[] { $"{path}/api/Prefab/Edit", $"{path}/api/Prefab/Save", $"{path}/api/Prefab/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Scene
///
/// 创建场景数据文件
///
private void CreateSceneDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Scene/List");
var dirName = $"{path}/api/Scene";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Scene/List";
File.WriteAllText(fileName, result);
// 导出场景
var obj = JsonConvert.DeserializeObject(result);
var array = obj["Data"] as JArray;
foreach (var i in array)
{
var id = i["ID"].ToString();
result = HttpHelper.Get($"http://{host}:{port}/api/Scene/Load?ID={id}");
fileName = $"{path}/api/Scene/Scene_{id}";
File.WriteAllText(fileName, result);
}
// 其他接口
var apiList = new string[] { $"{path}/api/Scene/Edit", $"{path}/api/Scene/Save", $"{path}/api/Scene/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Screenshot
///
/// 创建截图数据文件
///
///
private void CreateScreenshotDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Screenshot/List");
var dirName = $"{path}/api/Screenshot";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Screenshot/List";
File.WriteAllText(fileName, result);
// 其他接口
var apiList = new string[] { $"{path}/api/Screenshot/Add", $"{path}/api/Screenshot/Edit", $"{path}/api/Screenshot/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Upload
///
/// 创建上传数据文件
///
///
private void CreateUploadDataFile(string path)
{
var server = HttpContext.Current.Server;
var dirName = $"{path}/api/Upload";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 其他接口
var apiList = new string[] { $"{path}/api/Upload/Upload" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
#region Video
///
/// 创建截图数据文件
///
///
private void CreateVideoDataFile(string path)
{
var server = HttpContext.Current.Server;
var request = HttpContext.Current.Request;
var host = request.Url.Host;
var port = request.Url.Port;
var result = HttpHelper.Get($"http://{host}:{port}/api/Video/List");
var dirName = $"{path}/api/Video";
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// 获取列表
var fileName = $"{path}/api/Video/List";
File.WriteAllText(fileName, result);
// 其他接口
var apiList = new string[] { $"{path}/api/Video/Add", $"{path}/api/Video/Edit", $"{path}/api/Video/Delete" };
var data = JsonConvert.SerializeObject(new { Code = 200, Msg = "Execute sucessfully!" });
foreach (var i in apiList)
{
File.WriteAllText(i, data);
}
}
#endregion
}
}