Ejemplo n.º 1
0
        /// <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);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }
Ejemplo n.º 3
0
        /// <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);
            }
        }
Ejemplo n.º 4
0
        /// <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());
                    }
                }
            }
        }
Ejemplo n.º 5
0
        /// <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());
        }