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 } }