using Nancy; using Nancy.ModelBinding; using Nancy.Swagger; using Nancy.Swagger.Annotations.Attributes; using Swagger.ObjectModel; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using 电子展板.Base; using 电子展板.Models; using 电子展板.Utility; using 电子展板.Utility.Core; using 电子展板.Utility.Extension; using 电子展板.Utility.Logs; using 电子展板.Utility.Other; namespace 电子展板.WebModule { public class HomeModule : NancyModule { public HomeModule(ISwaggerModelCatalog modelCatalog) { //涉及到哪些Model modelCatalog.AddModel(); modelCatalog.AddModel>(); //默认页面 Get("", Index); Get("/", Index); Get("/index.html", Index); //全局静态资源 Get("/static/{name*}", StaticResource); //获得配置 Get("/getConfig", GetConfig, null, "getConfig"); //获得上传的文件 Get("/upload/{id}", GetUploadFiles); //上传图片 Post("/uploadImage", dynamic => { IEnumerable files = Request.Files; if (files == null || files.Count() == 0) return UploadImage(null); return UploadImage(files.FirstOrDefault()); }, null, "uploadImage"); //保存配置 Post("/save", SaveConfig, null, "save"); } /// /// 默认页面 /// /// /// private object Index(dynamic dynamic) { return Resouce("Views/Index.html"); } /// /// 全局静态资源 /// /// /// private object StaticResource(dynamic dynamic) { string name = dynamic.name; return Resouce(name); } /// /// 获得配置 /// /// /// [Route("getConfig")]//Name [Route(HttpMethod.Get, "/getConfig")]//Method And Path [Route(Summary = "获得配置数据")] [SwaggerResponse(HttpStatusCode.OK, typeof(MyConfig))] [Route(Tags = new[] { "获得配置数据" })] private object GetConfig(dynamic dynamic) { //保留JSON KEY首字母大写,这里就不用 Response.AsJson(); //AsJson会将首字母小写 return Response.AsText(JsonHelper.ToJson(GlobalVariable.Config), "application/json", Encoding.UTF8); } /// /// 获得上传的文件 /// /// /// private object GetUploadFiles(dynamic dynamic) { string id = dynamic.id; string contentType = MimeTypes.GetMimeType(id); return Response.AsFile(MyEnvironment.Root("/Upload/" + id), contentType); } /// /// 上传图片 /// /// /// [Route("uploadImage")]//Name [Route(HttpMethod.Post, "/uploadImage")]//Method And Path [Route(Summary = "上传图片")] [SwaggerResponse(HttpStatusCode.OK, typeof(RetValue))] [Route(Tags = new[] { "上传图片" })] private object UploadImage([RouteParam(ParamIn = ParameterIn.Form, Name = "file", Description = "图片文件", ParamType = typeof(SwaggerFile), Required = true)] HttpFile file) { string uploadPath = MyEnvironment.Root("/Upload/"); if (!Directory.Exists(uploadPath)) { Directory.CreateDirectory(uploadPath); } string ext = Path.GetExtension(file.Name); string fileName = UUID.StrSnowId + ext; var filePath = uploadPath + fileName; using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) { file.Value.CopyTo(fileStream); } RetValue result = new RetValue { state = 1, message = "上传成功", data = $"/upload/{fileName}" }; return Response.AsJson(result); } [Route("save")]//Name [Route(HttpMethod.Post, "/save")]//Method And Path [Route(Summary = "保存配置")] [SwaggerResponse(HttpStatusCode.OK, typeof(RetValue))] [Route(Tags = new[] { "保存配置" })] private object SaveConfig(dynamic dynamic) { MyConfig config = this.Bind(); //string str = Request.Body.AsString(); //MyConfig config = JsonHelper.ToObject(str); LogHelper.Instance.Info($"用户保存了配置:{JsonHelper.ToJson(config)}"); //保存 PropertyInfo[] propertyInfos = typeof(MyConfig).GetProperties(); foreach (PropertyInfo propertyInfo in propertyInfos) { object value = propertyInfo.GetValue(config); propertyInfo.SetValue(GlobalVariable.Config, value); } GlobalVariable.SaveConfig(); //保存并修改界面 EventBus.Instance.Publish("save", ""); RetValue result = new RetValue { state = 1, message = "保存成功" }; return Response.AsJson(result); } private object Resouce(string resourcePath) { string packUri = $"pack://application:,,,/Assets/{resourcePath}"; string contentType = MimeTypes.GetMimeType(packUri); return Response.FromStream(System.Windows.Application.GetResourceStream(new Uri(packUri, UriKind.RelativeOrAbsolute)).Stream, contentType); } } }