восстанолвение из бекапа
This commit is contained in:
parent
1a027e7583
commit
356c8a6d02
@ -24,8 +24,8 @@ GO";
|
||||
SELECT Id, RoleName, RolePriority, DateCreate, DateDelete, IsDeleted FROM DepartmentDatabaseContext.dbo.DepartmentRoles";
|
||||
|
||||
private static readonly string userMigration =
|
||||
@"INSERT INTO DepartmentDatabasePortal.dbo.Users(Id, UserName, PasswordHash, StudentId, LecturerId, Avatar, DateLastVisit, IsBanned, DateBanned, CountAttempt, DateCreate, DateDelete, IsDeleted)
|
||||
SELECT Id, UserName, PasswordHash, StudentId, LecturerId, Avatar, DateLastVisit, IsLocked, DateBanned, CountAttempt, DateCreate, DateDelete, IsDeleted FROM DepartmentDatabaseContext.dbo.DepartmentUsers";
|
||||
@"INSERT INTO DepartmentDatabasePortal.dbo.Users(Id, UserName, PasswordHash, Avatar, DateLastVisit, IsBanned, DateBanned, CountAttempt, DateCreate, DateDelete, IsDeleted)
|
||||
SELECT Id, UserName, PasswordHash, Avatar, DateLastVisit, IsLocked, DateBanned, CountAttempt, DateCreate, DateDelete, IsDeleted FROM DepartmentDatabaseContext.dbo.DepartmentUsers";
|
||||
|
||||
private static readonly string userroleMigration =
|
||||
@"INSERT INTO DepartmentDatabasePortal.dbo.UserRoles(Id, UserId, RoleId, DateCreate, DateDelete, IsDeleted)
|
||||
|
@ -19,5 +19,10 @@
|
||||
/// Создать архив с выгрузкой
|
||||
/// </summary>
|
||||
public bool CreateArchive { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Имя файла для архива
|
||||
/// </summary>
|
||||
public string ArchiveFileName { get; set; }
|
||||
}
|
||||
}
|
@ -1,14 +1,13 @@
|
||||
using ModuleTools.BusinessLogics;
|
||||
using ModuleTools.Enums;
|
||||
using ModuleTools.Extensions;
|
||||
using ModuleTools.Interfaces;
|
||||
using ModuleTools.Models;
|
||||
using SecurityBusinessLogic.BindingModels;
|
||||
using SecurityBusinessLogic.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
|
||||
namespace SecurityBusinessLogic.BusinessLogics
|
||||
{
|
||||
@ -17,18 +16,25 @@ namespace SecurityBusinessLogic.BusinessLogics
|
||||
/// </summary>
|
||||
public class BackupBusinessLogic
|
||||
{
|
||||
private IBackupService _service;
|
||||
/// <summary>
|
||||
/// Серивс для работы с бекапом
|
||||
/// </summary>
|
||||
private readonly IBackupService _service;
|
||||
|
||||
/// <summary>
|
||||
/// Менеджер безопасности
|
||||
/// </summary>
|
||||
private ISecurityManager _security;
|
||||
private readonly ISecurityManager _security;
|
||||
|
||||
/// <summary>
|
||||
/// Перечень ошибок при выполнении операции
|
||||
/// </summary>
|
||||
public List<(string Title, string Message)> Errors { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Логика работы с бекапом
|
||||
/// </summary>
|
||||
/// <param name="service"></param>
|
||||
public BackupBusinessLogic(IBackupService service)
|
||||
{
|
||||
_service = service;
|
||||
@ -36,19 +42,80 @@ namespace SecurityBusinessLogic.BusinessLogics
|
||||
Errors = new();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Создание бекапа с данными
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
public bool CreateBackUp(BackupBindingModel model)
|
||||
{
|
||||
if (NoAccess())
|
||||
if (model.FolderName.IsEmpty())
|
||||
{
|
||||
Errors.Add(("Ошибка", "Путь до папки не указан"));
|
||||
return false;
|
||||
}
|
||||
var result = _service.CreateBackUp(model);
|
||||
if (!result.IsSucceeded)
|
||||
try
|
||||
{
|
||||
Errors.AddRange(result.Errors);
|
||||
if (NoAccess())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var result = _service.CreateBackUp(model);
|
||||
if (!result.IsSucceeded)
|
||||
{
|
||||
Errors.AddRange(result.Errors);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Errors.Add(("Ошибка", ex.Message));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Восстанволение данных через бекап
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
public bool RestoreBackUp(BackupBindingModel model)
|
||||
{
|
||||
if (model.FolderName.IsEmpty() && model.ArchiveFileName.IsEmpty())
|
||||
{
|
||||
Errors.Add(("Ошибка", "Путь до папки/архива не указан"));
|
||||
return false;
|
||||
}
|
||||
if (model.ArchiveFileName.IsNotEmpty() && !File.Exists(model.ArchiveFileName))
|
||||
{
|
||||
Errors.Add(("Ошибка", "Файл с архивом не найден"));
|
||||
return false;
|
||||
}
|
||||
if (model.ArchiveFileName.IsEmpty() && !Directory.Exists(model.FolderName))
|
||||
{
|
||||
Errors.Add(("Ошибка", "Папка с даными не найдена"));
|
||||
return false;
|
||||
}
|
||||
try
|
||||
{
|
||||
if (NoAccess())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var result = _service.RestoreBackUp(model);
|
||||
if (!result.IsSucceeded)
|
||||
{
|
||||
Errors.AddRange(result.Errors);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Errors.Add(("Ошибка", ex.Message));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -57,7 +124,7 @@ namespace SecurityBusinessLogic.BusinessLogics
|
||||
/// <returns></returns>
|
||||
private bool NoAccess()
|
||||
{
|
||||
if (_security.CheckAccess(new SecurityManagerCheckAccessModel(null, AccessOperation.РаботасБекапом, AccessType.View, "бекап")))
|
||||
if (_security.CheckAccess(new SecurityManagerCheckAccessModel(null, AccessOperation.РаботасБекапом, AccessType.Delete, "бекап")))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -8,6 +8,18 @@ namespace SecurityBusinessLogic.Interfaces
|
||||
/// </summary>
|
||||
public interface IBackupService
|
||||
{
|
||||
/// <summary>
|
||||
/// Создание бекапа с данными
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
OperationResultModel CreateBackUp(BackupBindingModel model);
|
||||
|
||||
/// <summary>
|
||||
/// Восстанволение данных через бекап
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
OperationResultModel RestoreBackUp(BackupBindingModel model);
|
||||
}
|
||||
}
|
@ -0,0 +1,201 @@
|
||||
using DatabaseCore;
|
||||
using ModuleTools.Attributes;
|
||||
using ModuleTools.Extensions;
|
||||
using ModuleTools.Interfaces;
|
||||
using ModuleTools.Models;
|
||||
using SecurityBusinessLogic.BindingModels;
|
||||
using SecurityBusinessLogic.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Serialization.Json;
|
||||
|
||||
namespace SecurityDatabaseImplementation.Implementations
|
||||
{
|
||||
/// <summary>
|
||||
/// Реализация IBackupService для сохранения в JSON через JsonContract
|
||||
/// </summary>
|
||||
public class BackupJsonContractService : IBackupService
|
||||
{
|
||||
public OperationResultModel CreateBackUp(BackupBindingModel model)
|
||||
{
|
||||
try
|
||||
{
|
||||
var asm = typeof(DatabaseManager).Assembly;
|
||||
MethodInfo method = GetType().GetTypeInfo().GetDeclaredMethod("SaveToFile");
|
||||
foreach (var t in asm.GetExportedTypes())
|
||||
{
|
||||
if (t.IsClass && t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntitySecurityExtenstion<>)) &&
|
||||
t.GetCustomAttribute<EntityDescriptionAttribute>() != null)
|
||||
{
|
||||
MethodInfo generic = method.MakeGenericMethod(t);
|
||||
generic.Invoke(this, new object[] { model.FolderName, model.FullData, t });
|
||||
}
|
||||
}
|
||||
if (model.CreateArchive)
|
||||
{
|
||||
var fileName = $"{model.FolderName}.zip";
|
||||
if (File.Exists(fileName))
|
||||
{
|
||||
File.Delete($"{model.FolderName}.zip");
|
||||
}
|
||||
ZipFile.CreateFromDirectory(model.FolderName, fileName);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return OperationResultModel.Error(ex);
|
||||
}
|
||||
return OperationResultModel.Success(null);
|
||||
}
|
||||
|
||||
public OperationResultModel RestoreBackUp(BackupBindingModel model)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (model.ArchiveFileName.IsNotEmpty())
|
||||
{
|
||||
if(model.FolderName.IsEmpty())
|
||||
{
|
||||
model.FolderName = $"{Path.GetDirectoryName(model.ArchiveFileName)}{Path.GetFileNameWithoutExtension(model.ArchiveFileName)}";
|
||||
}
|
||||
ZipFile.ExtractToDirectory(model.ArchiveFileName, model.FolderName);
|
||||
}
|
||||
var asm = typeof(DatabaseManager).Assembly;
|
||||
#region вытаскиваем все типы-сущности (они должны быть унаследованы от IEntitySecurityExtenstion и иметь атрибут EntityDescription)
|
||||
List<Type> types = new();
|
||||
foreach (var t in asm.GetExportedTypes())
|
||||
{
|
||||
if (t.IsClass && t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntitySecurityExtenstion<>)) &&
|
||||
t.GetCustomAttribute<EntityDescriptionAttribute>() != null)
|
||||
{
|
||||
types.Add(t);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region формиурем зависимости (в каком порядке загружать данные)
|
||||
Dictionary<Type, int> typesWithLevel = new();
|
||||
while (types.Count > 0)
|
||||
{
|
||||
for (int i = 0; i < types.Count; ++i)
|
||||
{
|
||||
var depends = types[i].GetCustomAttributes<EntityDependencyAttribute>();
|
||||
if ((depends == null || !depends.Any()) && !typesWithLevel.ContainsKey(types[i]))
|
||||
{
|
||||
typesWithLevel.Add(types[i], 0);
|
||||
types.RemoveAt(i--);
|
||||
continue;
|
||||
}
|
||||
|
||||
int? level = null;
|
||||
foreach (var depend in depends)
|
||||
{
|
||||
var type = typesWithLevel.Keys.FirstOrDefault(x => x.Name == depend.ClassName);
|
||||
if (type != null)
|
||||
{
|
||||
if (!level.HasValue)
|
||||
{
|
||||
level = typesWithLevel[type];
|
||||
}
|
||||
else if (level < typesWithLevel[type])
|
||||
{
|
||||
level = typesWithLevel[type];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
level = null;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (level.HasValue)
|
||||
{
|
||||
typesWithLevel.Add(types[i], level.Value + 1);
|
||||
types.RemoveAt(i--);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Удаляем записи сначала из тех, на которые никкто не ссылается и в последнюю оередь, те, на которые все ссылаются
|
||||
var deleteOrder = typesWithLevel.OrderByDescending(x => x.Value);
|
||||
MethodInfo delMethod = GetType().GetTypeInfo().GetDeclaredMethod("DeleteFromDB");
|
||||
foreach (var delElem in deleteOrder)
|
||||
{
|
||||
if (File.Exists(string.Format("{0}/{1}.json", model.FolderName, delElem.Key.Name)))
|
||||
{
|
||||
MethodInfo generic = delMethod.MakeGenericMethod(delElem.Key);
|
||||
generic.Invoke(this, null);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Заполняем в порядке - сначала те, у которых нет родителей, потом их потомство
|
||||
MethodInfo method = GetType().GetTypeInfo().GetDeclaredMethod("LoadFromFile");
|
||||
foreach (var delElem in typesWithLevel.OrderBy(x => x.Value))
|
||||
{
|
||||
MethodInfo generic = method.MakeGenericMethod(delElem.Key);
|
||||
generic.Invoke(this, new object[] { model.FolderName, delElem.Key });
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return OperationResultModel.Error(ex);
|
||||
}
|
||||
return OperationResultModel.Success(null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Сохранение списка сущности из БД в файл (вызывается через рефлексию)
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="folderName"></param>
|
||||
/// <param name="allowFullData"></param>
|
||||
/// <param name="t"></param>
|
||||
private void SaveToFile<T>(string folderName, bool allowFullData, Type t) where T : class, IEntitySecurityExtenstion<T>, new()
|
||||
{
|
||||
using var context = DatabaseManager.GetContext;
|
||||
var records = context.Set<T>().Select(x => x.SecurityCheck(x, allowFullData));
|
||||
DataContractJsonSerializer jsonFormatter = new(typeof(List<T>));
|
||||
using FileStream fs = new(string.Format("{0}/{1}.json", folderName, t.Name), FileMode.OpenOrCreate);
|
||||
jsonFormatter.WriteObject(fs, records);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Отчистка записей сущности в БД (вызывается через рефлексию)
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
private void DeleteFromDB<T>() where T : class, new()
|
||||
{
|
||||
using var context = DatabaseManager.GetContext;
|
||||
context.Set<T>().RemoveRange(context.Set<T>());
|
||||
context.SaveChanges();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Загрузка списка сущности из файла в БД (вызывается через рефлексию)
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="folderName"></param>
|
||||
/// <param name="t"></param>
|
||||
private void LoadFromFile<T>(string folderName, Type t) where T : class, new()
|
||||
{
|
||||
using var context = DatabaseManager.GetContext;
|
||||
if (File.Exists(string.Format("{0}/{1}.json", folderName, t.Name)))
|
||||
{
|
||||
DataContractJsonSerializer jsonFormatter = new(typeof(List<T>));
|
||||
using FileStream fs = new(string.Format("{0}/{1}.json", folderName, t.Name), FileMode.Open);
|
||||
List<T> records = (List<T>)jsonFormatter.ReadObject(fs);
|
||||
context.Set<T>().AddRange(records);
|
||||
context.SaveChanges();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
using DatabaseCore;
|
||||
using ModuleTools.Interfaces;
|
||||
using ModuleTools.Models;
|
||||
using SecurityBusinessLogic.BindingModels;
|
||||
using SecurityBusinessLogic.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Serialization.Json;
|
||||
|
||||
namespace SecurityDatabaseImplementation.Implementations
|
||||
{
|
||||
public class BackupService : IBackupService
|
||||
{
|
||||
public OperationResultModel CreateBackUp(BackupBindingModel model)
|
||||
{
|
||||
try
|
||||
{
|
||||
var asm = typeof(DatabaseManager).Assembly;
|
||||
MethodInfo method = GetType().GetTypeInfo().GetDeclaredMethod("SaveToFile");
|
||||
foreach (var t in asm.GetExportedTypes())
|
||||
{
|
||||
if (t.IsClass && t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntitySecurityExtenstion<>)))
|
||||
{
|
||||
var elem = asm.CreateInstance(t.FullName);
|
||||
MethodInfo generic = method.MakeGenericMethod(elem.GetType());
|
||||
generic.Invoke(this, new object[] { model.FolderName, model.FullData, t });
|
||||
}
|
||||
}
|
||||
if (model.CreateArchive)
|
||||
{
|
||||
ZipFile.CreateFromDirectory(model.FolderName, $"{model.FolderName}.zip");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return OperationResultModel.Error(ex);
|
||||
}
|
||||
return OperationResultModel.Success(null);
|
||||
}
|
||||
|
||||
private void SaveToFile<T>(string folderName, bool allowFullData, Type t) where T : class, IEntitySecurityExtenstion<T>, new()
|
||||
{
|
||||
using var context = DatabaseManager.GetContext;
|
||||
var records = context.Set<T>().Select(x => x.SecurityCheck(x, allowFullData));
|
||||
DataContractJsonSerializer jsonFormatter = new(typeof(List<T>));
|
||||
using FileStream fs = new(string.Format("{0}/{1}.json", folderName, t.Name), FileMode.OpenOrCreate);
|
||||
jsonFormatter.WriteObject(fs, records);
|
||||
}
|
||||
}
|
||||
}
|
@ -15,7 +15,7 @@ namespace SecurityDatabaseImplementation
|
||||
DependencyManager.Instance.RegisterType<IUserService, UserService>();
|
||||
DependencyManager.Instance.RegisterType<IUserRoleService, UserRoleService>();
|
||||
|
||||
DependencyManager.Instance.RegisterType<IBackupService, BackupService>();
|
||||
DependencyManager.Instance.RegisterType<IBackupService, BackupJsonContractService>();
|
||||
}
|
||||
}
|
||||
}
|
@ -33,13 +33,22 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
this.buttonCreateBackup = new System.Windows.Forms.Button();
|
||||
this.checkBoxCreateArchive = new System.Windows.Forms.CheckBox();
|
||||
this.checkBoxFullLoad = new System.Windows.Forms.CheckBox();
|
||||
this.buttonSelectFolder = new System.Windows.Forms.Button();
|
||||
this.textBoxFolderName = new System.Windows.Forms.TextBox();
|
||||
this.labelFolderName = new System.Windows.Forms.Label();
|
||||
this.buttonSaveSelectFolder = new System.Windows.Forms.Button();
|
||||
this.textBoxSaveFolderName = new System.Windows.Forms.TextBox();
|
||||
this.labelSaveFolderName = new System.Windows.Forms.Label();
|
||||
this.toolStripHeader = new System.Windows.Forms.ToolStrip();
|
||||
this.toolStripButtonClose = new System.Windows.Forms.ToolStripButton();
|
||||
this.groupBoxLoadBackup = new System.Windows.Forms.GroupBox();
|
||||
this.buttonRestoreBackup = new System.Windows.Forms.Button();
|
||||
this.buttonLoadArchiveSelect = new System.Windows.Forms.Button();
|
||||
this.textBoxLoadArchiveName = new System.Windows.Forms.TextBox();
|
||||
this.labelLoadArchiveName = new System.Windows.Forms.Label();
|
||||
this.buttonLoadSelectFolder = new System.Windows.Forms.Button();
|
||||
this.textBoxLoadFolderName = new System.Windows.Forms.TextBox();
|
||||
this.labelLoadFolderName = new System.Windows.Forms.Label();
|
||||
this.groupBoxSaveBackup.SuspendLayout();
|
||||
this.toolStripHeader.SuspendLayout();
|
||||
this.groupBoxLoadBackup.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// groupBoxSaveBackup
|
||||
@ -47,9 +56,9 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
this.groupBoxSaveBackup.Controls.Add(this.buttonCreateBackup);
|
||||
this.groupBoxSaveBackup.Controls.Add(this.checkBoxCreateArchive);
|
||||
this.groupBoxSaveBackup.Controls.Add(this.checkBoxFullLoad);
|
||||
this.groupBoxSaveBackup.Controls.Add(this.buttonSelectFolder);
|
||||
this.groupBoxSaveBackup.Controls.Add(this.textBoxFolderName);
|
||||
this.groupBoxSaveBackup.Controls.Add(this.labelFolderName);
|
||||
this.groupBoxSaveBackup.Controls.Add(this.buttonSaveSelectFolder);
|
||||
this.groupBoxSaveBackup.Controls.Add(this.textBoxSaveFolderName);
|
||||
this.groupBoxSaveBackup.Controls.Add(this.labelSaveFolderName);
|
||||
this.groupBoxSaveBackup.Location = new System.Drawing.Point(0, 28);
|
||||
this.groupBoxSaveBackup.Name = "groupBoxSaveBackup";
|
||||
this.groupBoxSaveBackup.Size = new System.Drawing.Size(496, 100);
|
||||
@ -87,31 +96,31 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
this.checkBoxFullLoad.Text = "Полная выгрузка";
|
||||
this.checkBoxFullLoad.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// buttonSelectFolder
|
||||
// buttonSaveSelectFolder
|
||||
//
|
||||
this.buttonSelectFolder.Location = new System.Drawing.Point(385, 26);
|
||||
this.buttonSelectFolder.Name = "buttonSelectFolder";
|
||||
this.buttonSelectFolder.Size = new System.Drawing.Size(99, 23);
|
||||
this.buttonSelectFolder.TabIndex = 2;
|
||||
this.buttonSelectFolder.Text = "Выбрать папку";
|
||||
this.buttonSelectFolder.UseVisualStyleBackColor = true;
|
||||
this.buttonSelectFolder.Click += new System.EventHandler(this.ButtonSelectFolder_Click);
|
||||
this.buttonSaveSelectFolder.Location = new System.Drawing.Point(385, 26);
|
||||
this.buttonSaveSelectFolder.Name = "buttonSaveSelectFolder";
|
||||
this.buttonSaveSelectFolder.Size = new System.Drawing.Size(99, 23);
|
||||
this.buttonSaveSelectFolder.TabIndex = 2;
|
||||
this.buttonSaveSelectFolder.Text = "Выбрать папку";
|
||||
this.buttonSaveSelectFolder.UseVisualStyleBackColor = true;
|
||||
this.buttonSaveSelectFolder.Click += new System.EventHandler(this.ButtonSaveSelectFolder_Click);
|
||||
//
|
||||
// textBoxFolderName
|
||||
// textBoxSaveFolderName
|
||||
//
|
||||
this.textBoxFolderName.Location = new System.Drawing.Point(107, 26);
|
||||
this.textBoxFolderName.Name = "textBoxFolderName";
|
||||
this.textBoxFolderName.Size = new System.Drawing.Size(272, 23);
|
||||
this.textBoxFolderName.TabIndex = 1;
|
||||
this.textBoxSaveFolderName.Location = new System.Drawing.Point(110, 26);
|
||||
this.textBoxSaveFolderName.Name = "textBoxSaveFolderName";
|
||||
this.textBoxSaveFolderName.Size = new System.Drawing.Size(269, 23);
|
||||
this.textBoxSaveFolderName.TabIndex = 1;
|
||||
//
|
||||
// labelFolderName
|
||||
// labelSaveFolderName
|
||||
//
|
||||
this.labelFolderName.AutoSize = true;
|
||||
this.labelFolderName.Location = new System.Drawing.Point(16, 29);
|
||||
this.labelFolderName.Name = "labelFolderName";
|
||||
this.labelFolderName.Size = new System.Drawing.Size(85, 15);
|
||||
this.labelFolderName.TabIndex = 0;
|
||||
this.labelFolderName.Text = "Путь до папки";
|
||||
this.labelSaveFolderName.AutoSize = true;
|
||||
this.labelSaveFolderName.Location = new System.Drawing.Point(16, 29);
|
||||
this.labelSaveFolderName.Name = "labelSaveFolderName";
|
||||
this.labelSaveFolderName.Size = new System.Drawing.Size(85, 15);
|
||||
this.labelSaveFolderName.TabIndex = 0;
|
||||
this.labelSaveFolderName.Text = "Путь до папки";
|
||||
//
|
||||
// toolStripHeader
|
||||
//
|
||||
@ -134,10 +143,89 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
this.toolStripButtonClose.Size = new System.Drawing.Size(23, 22);
|
||||
this.toolStripButtonClose.Text = "Закрыть";
|
||||
//
|
||||
// groupBoxLoadBackup
|
||||
//
|
||||
this.groupBoxLoadBackup.Controls.Add(this.buttonRestoreBackup);
|
||||
this.groupBoxLoadBackup.Controls.Add(this.buttonLoadArchiveSelect);
|
||||
this.groupBoxLoadBackup.Controls.Add(this.textBoxLoadArchiveName);
|
||||
this.groupBoxLoadBackup.Controls.Add(this.labelLoadArchiveName);
|
||||
this.groupBoxLoadBackup.Controls.Add(this.buttonLoadSelectFolder);
|
||||
this.groupBoxLoadBackup.Controls.Add(this.textBoxLoadFolderName);
|
||||
this.groupBoxLoadBackup.Controls.Add(this.labelLoadFolderName);
|
||||
this.groupBoxLoadBackup.Location = new System.Drawing.Point(0, 134);
|
||||
this.groupBoxLoadBackup.Name = "groupBoxLoadBackup";
|
||||
this.groupBoxLoadBackup.Size = new System.Drawing.Size(496, 137);
|
||||
this.groupBoxLoadBackup.TabIndex = 2;
|
||||
this.groupBoxLoadBackup.TabStop = false;
|
||||
this.groupBoxLoadBackup.Text = "Загрузка из бекапа";
|
||||
//
|
||||
// buttonRestoreBackup
|
||||
//
|
||||
this.buttonRestoreBackup.Location = new System.Drawing.Point(383, 99);
|
||||
this.buttonRestoreBackup.Name = "buttonRestoreBackup";
|
||||
this.buttonRestoreBackup.Size = new System.Drawing.Size(99, 23);
|
||||
this.buttonRestoreBackup.TabIndex = 9;
|
||||
this.buttonRestoreBackup.Text = "Загрузить";
|
||||
this.buttonRestoreBackup.UseVisualStyleBackColor = true;
|
||||
this.buttonRestoreBackup.Click += new System.EventHandler(this.ButtonRestoreBackup_Click);
|
||||
//
|
||||
// buttonLoadArchiveSelect
|
||||
//
|
||||
this.buttonLoadArchiveSelect.Location = new System.Drawing.Point(383, 64);
|
||||
this.buttonLoadArchiveSelect.Name = "buttonLoadArchiveSelect";
|
||||
this.buttonLoadArchiveSelect.Size = new System.Drawing.Size(99, 23);
|
||||
this.buttonLoadArchiveSelect.TabIndex = 8;
|
||||
this.buttonLoadArchiveSelect.Text = "Выбрать файл";
|
||||
this.buttonLoadArchiveSelect.UseVisualStyleBackColor = true;
|
||||
this.buttonLoadArchiveSelect.Click += new System.EventHandler(this.ButtonLoadArchiveSelect_Click);
|
||||
//
|
||||
// textBoxLoadArchiveName
|
||||
//
|
||||
this.textBoxLoadArchiveName.Location = new System.Drawing.Point(110, 64);
|
||||
this.textBoxLoadArchiveName.Name = "textBoxLoadArchiveName";
|
||||
this.textBoxLoadArchiveName.Size = new System.Drawing.Size(267, 23);
|
||||
this.textBoxLoadArchiveName.TabIndex = 7;
|
||||
//
|
||||
// labelLoadArchiveName
|
||||
//
|
||||
this.labelLoadArchiveName.AutoSize = true;
|
||||
this.labelLoadArchiveName.Location = new System.Drawing.Point(14, 67);
|
||||
this.labelLoadArchiveName.Name = "labelLoadArchiveName";
|
||||
this.labelLoadArchiveName.Size = new System.Drawing.Size(90, 15);
|
||||
this.labelLoadArchiveName.TabIndex = 6;
|
||||
this.labelLoadArchiveName.Text = "Путь до архива";
|
||||
//
|
||||
// buttonLoadSelectFolder
|
||||
//
|
||||
this.buttonLoadSelectFolder.Location = new System.Drawing.Point(385, 28);
|
||||
this.buttonLoadSelectFolder.Name = "buttonLoadSelectFolder";
|
||||
this.buttonLoadSelectFolder.Size = new System.Drawing.Size(99, 23);
|
||||
this.buttonLoadSelectFolder.TabIndex = 5;
|
||||
this.buttonLoadSelectFolder.Text = "Выбрать папку";
|
||||
this.buttonLoadSelectFolder.UseVisualStyleBackColor = true;
|
||||
this.buttonLoadSelectFolder.Click += new System.EventHandler(this.ButtonLoadSelectFolder_Click);
|
||||
//
|
||||
// textBoxLoadFolderName
|
||||
//
|
||||
this.textBoxLoadFolderName.Location = new System.Drawing.Point(110, 28);
|
||||
this.textBoxLoadFolderName.Name = "textBoxLoadFolderName";
|
||||
this.textBoxLoadFolderName.Size = new System.Drawing.Size(269, 23);
|
||||
this.textBoxLoadFolderName.TabIndex = 4;
|
||||
//
|
||||
// labelLoadFolderName
|
||||
//
|
||||
this.labelLoadFolderName.AutoSize = true;
|
||||
this.labelLoadFolderName.Location = new System.Drawing.Point(16, 31);
|
||||
this.labelLoadFolderName.Name = "labelLoadFolderName";
|
||||
this.labelLoadFolderName.Size = new System.Drawing.Size(85, 15);
|
||||
this.labelLoadFolderName.TabIndex = 3;
|
||||
this.labelLoadFolderName.Text = "Путь до папки";
|
||||
//
|
||||
// BackupControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.groupBoxLoadBackup);
|
||||
this.Controls.Add(this.toolStripHeader);
|
||||
this.Controls.Add(this.groupBoxSaveBackup);
|
||||
this.Name = "BackupControl";
|
||||
@ -146,6 +234,8 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
this.groupBoxSaveBackup.PerformLayout();
|
||||
this.toolStripHeader.ResumeLayout(false);
|
||||
this.toolStripHeader.PerformLayout();
|
||||
this.groupBoxLoadBackup.ResumeLayout(false);
|
||||
this.groupBoxLoadBackup.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
@ -154,13 +244,21 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.GroupBox groupBoxSaveBackup;
|
||||
private System.Windows.Forms.Label labelFolderName;
|
||||
private System.Windows.Forms.TextBox textBoxFolderName;
|
||||
private System.Windows.Forms.Button buttonSelectFolder;
|
||||
private System.Windows.Forms.Label labelSaveFolderName;
|
||||
private System.Windows.Forms.TextBox textBoxSaveFolderName;
|
||||
private System.Windows.Forms.Button buttonSaveSelectFolder;
|
||||
private System.Windows.Forms.CheckBox checkBoxCreateArchive;
|
||||
private System.Windows.Forms.Button buttonCreateBackup;
|
||||
private System.Windows.Forms.CheckBox checkBoxFullLoad;
|
||||
private System.Windows.Forms.ToolStrip toolStripHeader;
|
||||
private System.Windows.Forms.ToolStripButton toolStripButtonClose;
|
||||
private System.Windows.Forms.GroupBox groupBoxLoadBackup;
|
||||
private System.Windows.Forms.TextBox textBoxLoadFolderName;
|
||||
private System.Windows.Forms.Label labelLoadFolderName;
|
||||
private System.Windows.Forms.Button buttonLoadSelectFolder;
|
||||
private System.Windows.Forms.Label labelLoadArchiveName;
|
||||
private System.Windows.Forms.TextBox textBoxLoadArchiveName;
|
||||
private System.Windows.Forms.Button buttonLoadArchiveSelect;
|
||||
private System.Windows.Forms.Button buttonRestoreBackup;
|
||||
}
|
||||
}
|
||||
|
@ -7,11 +7,18 @@ using SecurityBusinessLogic.BindingModels;
|
||||
using SecurityBusinessLogic.BusinessLogics;
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace SecurityWindowsDesktop.SpecialControls
|
||||
{
|
||||
/// <summary>
|
||||
/// Контрол для работы с бекапом
|
||||
/// </summary>
|
||||
public partial class BackupControl : UserControl, IControl
|
||||
{
|
||||
/// <summary>
|
||||
/// Класс с бизнес-лоникой работы с бекапом
|
||||
/// </summary>
|
||||
private readonly BackupBusinessLogic _businessLogic;
|
||||
|
||||
/// <summary>
|
||||
@ -19,6 +26,9 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
/// </summary>
|
||||
private event Action<Guid> CloseEvent;
|
||||
|
||||
/// <summary>
|
||||
/// Контрол для работы с бекапом
|
||||
/// </summary>
|
||||
public BackupControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
@ -28,6 +38,7 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
AccessOperation = AccessOperation.РаботасБекапом;
|
||||
}
|
||||
|
||||
#region IControl
|
||||
public Guid ControlId { get; private set; }
|
||||
|
||||
public string Title { get; private set; }
|
||||
@ -36,10 +47,6 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
|
||||
public IControl GetInstance() => new BackupControl() { ControlId = Guid.NewGuid() };
|
||||
|
||||
public void LoadFromXml(string xml)
|
||||
{
|
||||
}
|
||||
|
||||
public void Open(ControlOpenModel model)
|
||||
{
|
||||
if (model.CloseList != null)
|
||||
@ -49,25 +56,58 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
Dock = DockStyle.Fill;
|
||||
}
|
||||
|
||||
public string SaveToXml()
|
||||
public string SaveToXml() => new XElement("Control",
|
||||
new XAttribute("Type", GetType().FullName),
|
||||
new XAttribute("ControlId", ControlId),
|
||||
new XAttribute("Title", Title),
|
||||
new XAttribute("AccessOperation", AccessOperation)).ToString();
|
||||
|
||||
public void LoadFromXml(string xml)
|
||||
{
|
||||
return string.Empty;
|
||||
var control = XElement.Parse(xml);
|
||||
ControlId = new Guid(control.Attribute("ControlId").Value.ToString());
|
||||
Title = control.Attribute("Title").Value.ToString();
|
||||
AccessOperation = (AccessOperation)Enum.Parse(typeof(AccessOperation), control.Attribute("AccessOperation").Value.ToString());
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Закрытие контрола
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void ToolStripHeader_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
|
||||
{
|
||||
CloseEvent?.Invoke(ControlId);
|
||||
Dispose();
|
||||
}
|
||||
|
||||
private void ButtonSelectFolder_Click(object sender, EventArgs e)
|
||||
/// <summary>
|
||||
/// Выбор пути для папки сохранения бекапа
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void ButtonSaveSelectFolder_Click(object sender, EventArgs e)
|
||||
{
|
||||
var fbd = new FolderBrowserDialog();
|
||||
if (fbd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
textBoxFolderName.Text = fbd.SelectedPath;
|
||||
textBoxSaveFolderName.Text = fbd.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Создание бекапа
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void ButtonCreateBackup_Click(object sender, EventArgs e)
|
||||
{
|
||||
var cursor = Cursor.Current;
|
||||
Cursor.Current = Cursors.WaitCursor;
|
||||
if (_businessLogic.CreateBackUp(new BackupBindingModel
|
||||
{
|
||||
FolderName = textBoxFolderName.Text,
|
||||
FolderName = textBoxSaveFolderName.Text,
|
||||
FullData = checkBoxFullLoad.Checked,
|
||||
CreateArchive = checkBoxCreateArchive.Checked
|
||||
}))
|
||||
@ -78,12 +118,59 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
{
|
||||
DialogHelper.MessageException(_businessLogic.Errors, "Ошибки при сохранении");
|
||||
}
|
||||
Cursor.Current = cursor;
|
||||
}
|
||||
|
||||
private void ToolStripHeader_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
|
||||
/// <summary>
|
||||
/// Выбор пути для папки восстановления бекапа
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void ButtonLoadSelectFolder_Click(object sender, EventArgs e)
|
||||
{
|
||||
CloseEvent?.Invoke(ControlId);
|
||||
Dispose();
|
||||
var fbd = new FolderBrowserDialog();
|
||||
if (fbd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
textBoxLoadFolderName.Text = fbd.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Выбор пути для файла-архива с бекапом
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void ButtonLoadArchiveSelect_Click(object sender, EventArgs e)
|
||||
{
|
||||
var ofd = new OpenFileDialog();
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
textBoxLoadArchiveName.Text = ofd.FileName;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Восстановление
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void ButtonRestoreBackup_Click(object sender, EventArgs e)
|
||||
{
|
||||
var cursor = Cursor.Current;
|
||||
Cursor.Current = Cursors.WaitCursor;
|
||||
if (_businessLogic.RestoreBackUp(new BackupBindingModel
|
||||
{
|
||||
FolderName = textBoxLoadFolderName.Text,
|
||||
ArchiveFileName = textBoxLoadArchiveName.Text
|
||||
}))
|
||||
{
|
||||
DialogHelper.MessageInformation("Сохранение прошло успешно", "Результат");
|
||||
}
|
||||
else
|
||||
{
|
||||
DialogHelper.MessageException(_businessLogic.Errors, "Ошибки при сохранении");
|
||||
}
|
||||
Cursor.Current = cursor;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user