/// <summary> /// 导出当前主题到数据流 /// 包括以下文件 /// theme.json 主题信息 /// App_Data\areas下的文件 /// 不包括以下文件 /// App_Data\static下的文件 /// App_Data\templates下的文件 /// 这些文件可以手动添加到包里面 /// </summary> /// <param name="info">主题信息</param> /// <param name="stream">数据流</param> public virtual void ExportThemeToStream(VisualThemeInfo info, Stream stream) { var fileStorage = Application.Ioc.Resolve <IFileStorage>(); var areasDir = fileStorage.GetStorageDirectory("areas"); using (var archive = new ZipArchive(stream, ZipArchiveMode.Create)) { // 添加主题信息 var infoEntry = archive.CreateEntry(ThemeInforFilename); using (var writer = new StreamWriter(infoEntry.Open())) { writer.Write(JsonConvert.SerializeObject(info)); } // 添加areas下的文件 foreach (var widgetsFile in areasDir.EnumerateFiles()) { var widgetsEntry = archive.CreateEntry("areas/" + widgetsFile.Filename); using (var writer = new StreamWriter(widgetsEntry.Open())) { writer.Write(widgetsFile.ReadAllText()); } } // 添加预览图 if (!string.IsNullOrEmpty(info.PreviewImageBase64)) { var previewEntry = archive.CreateEntry(PreviewFilename); using (var entryStream = previewEntry.Open()) { var previewImageBytes = Convert.FromBase64String(info.PreviewImageBase64); entryStream.Write(previewImageBytes, 0, previewImageBytes.Length); } } } }
/// <summary> /// 备份当前主题 /// </summary> public virtual void BackupUsingTheme() { // 清理旧的备份文件 var fileStorage = Application.Ioc.Resolve <IFileStorage>(); var backupThemeDir = fileStorage.GetStorageDirectory(BackupThemeDirectoryName); var files = backupThemeDir.EnumerateFiles().OrderByDescending(f => f.Filename).ToList(); foreach (var file in files.Skip(KeepBackups)) { file.Delete(); } // 生成主题信息 var timeString = DateTime.UtcNow.ToClientTime().ToString("yyyyMMdd_HHmmss"); var info = new VisualThemeInfo(); info.Name = $"AutoBackup {timeString}"; info.Author = "System"; info.Version = "1.0"; // 生成备份文件 var backupFileName = $"{timeString}.zip"; var backupFile = fileStorage.GetStorageFile(BackupThemeDirectoryName, backupFileName); using (var stream = backupFile.OpenWrite()) { ExportThemeToStream(info, stream); } }
/// <summary> /// 创建主题 /// 根据当前使用的主题创建 /// </summary> /// <param name="info">主题信息</param> public virtual void CreateTheme(VisualThemeInfo info) { var filenameWithoutExtension = Path.GetFileNameWithoutExtension(info.Filename); var result = new List <VisualThemeInfo>(); var fileStorage = Application.Ioc.Resolve <IFileStorage>(); int index = 0; var saveFilename = $"{filenameWithoutExtension}.zip"; IFileEntry file = fileStorage.GetStorageFile(ThemeDirectoryName, saveFilename); while (file.Exists) { saveFilename = $"{filenameWithoutExtension}({++index}).zip"; file = fileStorage.GetStorageFile(ThemeDirectoryName, saveFilename); } using (var fileStream = file.OpenWrite()) { ExportThemeToStream(info, fileStream); } }
/// <summary> /// 导出当前主题到数据流 /// 包括以下文件 /// theme.json 主题信息 /// App_Data\areas下的文件 /// 不包括以下文件 /// App_Data\static下的文件 /// App_Data\templates下的文件 /// 这些文件可以手动添加到包里面 /// </summary> /// <param name="info">主题信息</param> /// <param name="stream">数据流</param> protected virtual void ExportThemeToStream(VisualThemeInfo info, Stream stream) { var fileStorage = Application.Ioc.Resolve <IFileStorage>(); var areasDir = fileStorage.GetStorageDirectory("areas"); using (var archive = new ZipArchive(stream, ZipArchiveMode.Create)) { // 添加主题信息 var infoEntry = archive.CreateEntry("theme.json"); using (var writer = new StreamWriter(infoEntry.Open())) { writer.Write(JsonConvert.SerializeObject(info)); } // 添加areas下的文件 foreach (var widgetsFile in areasDir.EnumerateFiles()) { var widgetsEntry = archive.CreateEntry("areas/" + widgetsFile.Filename); using (var writer = new StreamWriter(widgetsEntry.Open())) { writer.Write(widgetsFile.ReadAllText()); } } } }
/// <summary> /// 提交表单 /// </summary> /// <returns></returns> protected override object OnSubmit() { var themeInfo = new VisualThemeInfo(); themeInfo.Name = ThemeName; themeInfo.Description = ThemeDescription; themeInfo.Author = ThemeAuthor; themeInfo.Version = ThemeVersion; themeInfo.Filename = ThemeFilename; var previewStream = ThemePreviewImage?.OpenReadStream(); if (previewStream != null) { using (var image = Image.FromStream(previewStream)) using (var memoryStream = new MemoryStream()) { image.Save(memoryStream, ImageFormat.Png); themeInfo.PreviewImageBase64 = Convert.ToBase64String(memoryStream.ToArray()); } } var themeManager = Application.Ioc.Resolve <VisualThemeManager>(); themeManager.CreateTheme(themeInfo); return(this.SaveSuccessAndRefreshModal()); }