Example #1
0
        public async Task <IActionResult> ApplySettings(IndexViewModel model)
        {
            if (ModelState.IsValid)
            {
                SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync();

                settings.GalleriesPerPage   = model.GalleriesPerPage;
                settings.ImageResizeQuality = model.ImageResizeQuality;
                settings.MaxImageSize       = model.MaxImageSize;
                settings.ImagesPerGallery   = model.ImagesPerGallery;

                _websiteDB.SettingsGallery.Update(settings);
                await _websiteDB.SaveChangesAsync();
            }

            return(RedirectToAction("Index", "Gallery"));
        }
Example #2
0
        public async Task <IActionResult> Index()
        {
            List <Gallery> galleries = await _websiteDB.Galleries.ToListAsync();

            SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync();

            IndexViewModel model = new IndexViewModel()
            {
                GalleriesPerPage   = settings.GalleriesPerPage,
                ImagesPerGallery   = settings.ImagesPerGallery,
                MaxImageSize       = settings.MaxImageSize,
                ImageResizeQuality = settings.ImageResizeQuality,
                Galleries          = galleries
            };

            return(View(model));
        }
Example #3
0
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            #region Добавление ролей
            Role admin = new Role()
            {
                Id          = Guid.NewGuid(),
                Name        = "admin",
                Rank        = "Глава гильдии",
                Color       = "#ff0000",
                AccessLevel = 5
            };

            Role officer = new Role()
            {
                Id          = Guid.NewGuid(),
                Name        = "elite",
                Rank        = "Элита",
                Color       = "#00ff00",
                AccessLevel = 4
            };

            Role member = new Role()
            {
                Id          = Guid.NewGuid(),
                Name        = "member",
                Rank        = "Боец",
                Color       = "#cdcdcd",
                AccessLevel = 3
            };

            Role recruit = new Role()
            {
                Id          = Guid.NewGuid(),
                Name        = "recruit",
                Rank        = "Рекрут",
                Color       = "#828282",
                AccessLevel = 2
            };

            Role user = new Role()
            {
                Id          = Guid.NewGuid(),
                Name        = "user",
                Rank        = "Мимо крокодил",
                Color       = "#000000",
                AccessLevel = 1
            };
            #endregion

            #region Добавление игровых классов
            CharacterClass paladin = new CharacterClass()
            {
                Id            = Guid.NewGuid(),
                ClassIconPath = "/images/class_icon_paladin.jpg",
                ClassName     = "Паладин",
                ClassColor    = "#f58cba"
            };
            CharacterClass warrior = new CharacterClass
            {
                Id            = Guid.NewGuid(),
                ClassIconPath = "/images/class_icon_warrior.jpg",
                ClassName     = "Воин",
                ClassColor    = "#c79c6e"
            };
            CharacterClass hunter = new CharacterClass
            {
                Id            = Guid.NewGuid(),
                ClassIconPath = "/images/class_icon_hunter.jpg",
                ClassName     = "Охотник",
                ClassColor    = "#abd473"
            };
            CharacterClass shaman = new CharacterClass
            {
                Id            = Guid.NewGuid(),
                ClassIconPath = "/images/class_icon_shaman.jpg",
                ClassName     = "Шаман",
                ClassColor    = "#0070de"
            };
            CharacterClass rogue = new CharacterClass
            {
                Id            = Guid.NewGuid(),
                ClassIconPath = "/images/class_icon_rogue.jpg",
                ClassName     = "Разбойник",
                ClassColor    = "#fff569"
            };
            CharacterClass druid = new CharacterClass
            {
                Id            = Guid.NewGuid(),
                ClassIconPath = "/images/class_icon_druid.jpg",
                ClassName     = "Друид",
                ClassColor    = "#ff7d0a"
            };
            CharacterClass priest = new CharacterClass
            {
                Id            = Guid.NewGuid(),
                ClassIconPath = "/images/class_icon_priest.jpg",
                ClassName     = "Жрец",
                ClassColor    = "#ffffff"
            };
            CharacterClass mage = new CharacterClass
            {
                Id            = Guid.NewGuid(),
                ClassIconPath = "/images/class_icon_mage.jpg",
                ClassName     = "Маг",
                ClassColor    = "#69ccf0"
            };
            CharacterClass warlock = new CharacterClass
            {
                Id            = Guid.NewGuid(),
                ClassIconPath = "/images/class_icon_warlock.jpg",
                ClassName     = "Чернокнижник",
                ClassColor    = "#9482c9"
            };
            #endregion

            #region Добавление пользователей
            User Administrator = new User()
            {
                Id               = Guid.NewGuid(),
                Name             = "Administrator",
                Email            = "*****@*****.**",
                Password         = "******".HashString(),
                RegisterDate     = DateTime.Now,
                IsConfirmed      = true,
                RoleId           = admin.Id,
                CharacterClassId = paladin.Id
            };

            User Anonymous = new User()
            {
                Id               = Guid.NewGuid(),
                Name             = "Anonymous",
                IsConfirmed      = true,
                RoleId           = user.Id,
                CharacterClassId = paladin.Id
            };

            User user1 = new User()
            {
                Id               = Guid.NewGuid(),
                Name             = "User1",
                Email            = "*****@*****.**",
                Password         = "******".HashString(),
                RegisterDate     = DateTime.Now,
                IsConfirmed      = true,
                RoleId           = user.Id,
                CharacterClassId = rogue.Id
            };

            User user2 = new User()
            {
                Id               = Guid.NewGuid(),
                Name             = "User2",
                Email            = "*****@*****.**",
                Password         = "******".HashString(),
                RegisterDate     = DateTime.Now,
                IsConfirmed      = true,
                RoleId           = user.Id,
                CharacterClassId = priest.Id
            };

            User user3 = new User()
            {
                Id               = Guid.NewGuid(),
                Name             = "User3",
                Email            = "*****@*****.**",
                Password         = "******".HashString(),
                RegisterDate     = DateTime.Now,
                IsConfirmed      = true,
                RoleId           = user.Id,
                CharacterClassId = shaman.Id
            };
            #endregion

            #region Добавление настроек
            SettingsForum settingsForum = new SettingsForum()
            {
                Id = Guid.NewGuid(),
                SubsectionPageSize = 10,
                TopicPageSize      = 10
            };

            SettingsGallery settingsGallery = new SettingsGallery()
            {
                Id = Guid.NewGuid(),
                GalleriesPerPage   = 12,
                ImagesPerGallery   = 30,
                MaxImageSize       = 2,
                ImageResizeQuality = 50
            };

            SettingsNews settingsNews = new SettingsNews()
            {
                Id                 = Guid.NewGuid(),
                MaxImageSize       = 2,
                ImageResizeQuality = 50
            };
            #endregion

            modelBuilder.Entity <CharacterClass>().HasData(new CharacterClass[] { paladin, warrior, shaman, hunter, rogue, druid, priest, mage, warlock });
            modelBuilder.Entity <Role>().HasData(new Role[] { admin, officer, member, recruit, user });
            modelBuilder.Entity <User>().HasData(new User[] { Administrator, Anonymous, user1, user2, user3 });
            modelBuilder.Entity <SettingsForum>().HasData(settingsForum);
            modelBuilder.Entity <SettingsGallery>().HasData(settingsGallery);
            modelBuilder.Entity <SettingsNews>().HasData(settingsNews);

            base.OnModelCreating(modelBuilder);
        }
Example #4
0
        public async Task <IActionResult> CreateGallery(CreateGalleryViewModel model, IFormFile sliderImage)
        {
            // Настройки галереи
            SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync();

            int imageSize = 1048576 * settings.MaxImageSize;

            // Проверяем, чтобы обязательно был указан файл с изображением
            if (sliderImage == null || sliderImage.Length == 0)
            {
                ModelState.AddModelError("GallerySliderImage", "Укажите изображение для показа в слайдере.");
            }
            // Проверяем, чтобы входящий файл не превышал установленный максимальный размер
            if (sliderImage != null && sliderImage.Length > imageSize)
            {
                ModelState.AddModelError("GallerySliderImage", $"Файл \"{sliderImage.FileName}\" превышает установленный лимит 2MB.");
            }

            // Проверяем чтобы не случился дубликат имени галереи
            Gallery gallery = await _websiteDB.Galleries.FirstOrDefaultAsync(g => g.GalleryTitle == model.GalleryTitle);

            if (gallery != null)
            {
                ModelState.AddModelError("GalleryTitle", "Галерея с таким именем уже существует");
            }

            // Если на пути проблем не возникло, то создаем галерею
            if (ModelState.IsValid)
            {
                // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки
                FileInfo imgFile = new FileInfo(sliderImage.FileName);
                // Приводим расширение файла к нижнему регистру
                string imgExtension = imgFile.Extension.ToLower();
                // Генерируем новое имя для файла
                string newFileName = Guid.NewGuid() + imgExtension;
                // Пути сохранения файла
                string sliderDirectory = "/uploadedfiles/gallery/images/slider/";
                // Если такой директории не существует, то создаем её
                if (!Directory.Exists(_appEnvironment.WebRootPath + sliderDirectory))
                {
                    Directory.CreateDirectory(_appEnvironment.WebRootPath + sliderDirectory);
                }
                // Путь для слайд-изображения
                string pathSliderImage = sliderDirectory + newFileName;

                // В операторе try/catch делаем уменьшенную копию изображения.
                // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке
                try
                {
                    // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение
                    using (Image image = Image.Load(sliderImage.OpenReadStream()))
                    {
                        // Создаем уменьшенную копию и обрезаем её
                        var clone = image.Clone(x => x.Resize(new ResizeOptions
                        {
                            Mode = ResizeMode.Crop,
                            Size = new Size(1056, 220)
                        }));
                        // Сохраняем уменьшенную копию
                        await clone.SaveAsync(_appEnvironment.WebRootPath + pathSliderImage, new JpegEncoder { Quality = settings.ImageResizeQuality });
                    }
                }
                // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке
                catch
                {
                    // Создаем сообщение об ошибке для вывода пользователю
                    ModelState.AddModelError("GallerySliderImage", $"Файл {sliderImage.FileName} имеет неверный формат.");

                    // Возвращаем модель с сообщением об ошибке в представление
                    return(View(model));
                }

                if (string.IsNullOrEmpty(model.GalleryDescription))
                {
                    model.GalleryDescription = "";
                }

                gallery = new Gallery()
                {
                    Id                 = Guid.NewGuid(),
                    GalleryTitle       = model.GalleryTitle,
                    GalleryDescription = model.GalleryDescription.SpecSymbolsToView(),
                    GalleryDate        = DateTime.Now,
                    GalleryUserName    = User.Identity.Name,
                    GallerySliderImage = pathSliderImage
                };

                await _websiteDB.Galleries.AddAsync(gallery);

                await _websiteDB.SaveChangesAsync();

                return(RedirectToAction("Index", "Gallery"));
            }

            // Возврат модели при неудачной валидации
            return(View(model));
        }
Example #5
0
        public async Task <IActionResult> EditGallery(EditGalleryViewModel model, IFormFile sliderImage)
        {
            // Настройки галереи
            SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync();

            int imageSize = 1048576 * settings.MaxImageSize;

            // Если размер превью-изображения превышает установленный лимит, генерируем ошибку модели
            if (sliderImage != null && sliderImage.Length > imageSize)
            {
                ModelState.AddModelError("GalleryPreviewImage", $"Файл \"{sliderImage.FileName}\" превышает установленный лимит {settings.MaxImageSize}MB.");
            }

            // Проверяем, чтобы такая галерея существовала в БД
            Gallery gallery = await _websiteDB.Galleries.FirstOrDefaultAsync(g => g.Id == model.GalleryId);

            if (gallery == null)
            {
                return(Redirect("/Main/PageNotFound"));
            }

            // Если ошибок не возникло, заходим в тело условия
            if (ModelState.IsValid)
            {
                if (string.IsNullOrEmpty(model.GalleryDescription))
                {
                    model.GalleryDescription = "";
                }

                // Если исходный файл не равен NULL и его размер больше 0, заходим в тело условия
                if (sliderImage != null && sliderImage.Length > 0)
                {
                    // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки
                    FileInfo imgFile = new FileInfo(sliderImage.FileName);
                    // Приводим расширение к нижнему регистру (если оно было в верхнем)
                    string imgExtension = imgFile.Extension.ToLower();
                    // Генерируем новое имя для файла
                    string newFileName = Guid.NewGuid() + imgExtension;
                    // Пути сохранения файла
                    string sliderDirectory = "/uploadedfiles/gallery/images/slider/";
                    // Пути сохранения файла
                    string pathSliderImage = sliderDirectory + newFileName; // уменьшенное изображение

                    // Если такой директории не существует, то создаем её
                    if (!Directory.Exists(_appEnvironment.WebRootPath + sliderDirectory))
                    {
                        Directory.CreateDirectory(_appEnvironment.WebRootPath + sliderDirectory);
                    }

                    // В операторе try/catch делаем уменьшенную копию изображения.
                    // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке
                    try
                    {
                        // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение
                        using (Image image = Image.Load(sliderImage.OpenReadStream()))
                        {
                            // Создаем уменьшенную копию и обрезаем её
                            var clone = image.Clone(x => x.Resize(new ResizeOptions
                            {
                                Mode = ResizeMode.Crop,
                                Size = new Size(1056, 220)
                            }));
                            // Сохраняем уменьшенную копию
                            await clone.SaveAsync(_appEnvironment.WebRootPath + pathSliderImage, new JpegEncoder { Quality = settings.ImageResizeQuality });
                        }
                    }
                    // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке
                    catch
                    {
                        // Создаем сообщение об ошибке для вывода пользователю
                        ModelState.AddModelError("GalleryPreviewImage", $"Файл {sliderImage.FileName} имеет неверный формат.");

                        // Возвращаем модель с сообщением об ошибке в представление
                        return(View(model));
                    }

                    // Удаляем предыдущее изображения для слайдера
                    if (gallery.GallerySliderImage != null)
                    {
                        FileInfo imageToDelete = new FileInfo(_appEnvironment.WebRootPath + gallery.GallerySliderImage);
                        if (imageToDelete.Exists)
                        {
                            imageToDelete.Delete();
                        }
                    }

                    // Обновляем значения на полученные с формы
                    gallery.GalleryTitle       = model.GalleryTitle;
                    gallery.GalleryDescription = model.GalleryDescription.SpecSymbolsToView();
                    gallery.GallerySliderImage = pathSliderImage;


                    // Сохраняем изменения в БД
                    _websiteDB.Galleries.Update(gallery);
                    await _websiteDB.SaveChangesAsync();

                    return(RedirectToAction("Index", "Gallery"));
                }
                // Если не была выбрана картинка для превью, заходим в блок ELSE
                else
                {
                    // Обновляем значения на полученные с формы
                    gallery.GalleryTitle       = model.GalleryTitle;
                    gallery.GalleryDescription = model.GalleryDescription.SpecSymbolsToView();

                    // Сохраняем изменения в БД
                    _websiteDB.Galleries.Update(gallery);
                    await _websiteDB.SaveChangesAsync();

                    return(RedirectToAction("Index", "Gallery"));
                }
            }

            // Возврат модели при неудачной валидации
            return(View(model));
        }
Example #6
0
        public async Task <IActionResult> ViewGallery(ViewGalleryViewModel model, IFormFileCollection uploads)
        {
            // Настройки галереи
            SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync();

            int imageSize        = 1048576 * settings.MaxImageSize;
            int imagesPerGallery = settings.ImagesPerGallery;

            // Выбираем все изображения, находящиеся в данной галерее
            List <GalleryImage> images = await _websiteDB.GalleryImages.Where(i => i.GalleryId == model.GalleryId).OrderByDescending(i => i.ImageDate).ToListAsync();

            // Проверяем, не превышает ли количество загружаемых изображений допустимый лимит
            if (uploads.Count > imagesPerGallery - images.Count)
            {
                ModelState.AddModelError("GalleryImage", $"Превышен лимит изображений для галереи.");
                //ModelState.AddModelError("GalleryImage", $"Вы пытаетесь загрузить {uploads.Count} изображений. Лимит галереи {imagesPerGallery} изображений. Вы можете загрузить еще {imagesPerGallery - images.Count} изображений.");
            }
            // Если всё в порядке, заходим в ELSE
            else
            {
                // Проверяем, чтобы размер файлов не превышал заданный объем
                foreach (var file in uploads)
                {
                    if (file == null || file.Length == 0)
                    {
                        ModelState.AddModelError("GalleryImage", $"Произошла ошибка при обработке файла \"{file.FileName}\".");
                        break;
                    }
                    if (file.Length > imageSize)
                    {
                        ModelState.AddModelError("GalleryImage", $"Файл \"{file.FileName}\" превышает установленный лимит {settings.MaxImageSize}MB.");
                        break;
                    }
                }
            }

            // Если все в порядке, заходим в тело условия
            if (ModelState.IsValid)
            {
                // Далее начинаем обработку загружаемых изображений
                List <GalleryImage> galleryImages = new List <GalleryImage>();
                foreach (var uploadedImage in uploads)
                {
                    // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки
                    FileInfo imgFile = new FileInfo(uploadedImage.FileName);
                    // Приводим расширение к нижнему регистру (если оно было в верхнем)
                    string imgExtension = imgFile.Extension.ToLower();
                    // Генерируем новое имя для файла
                    string newFileName = Guid.NewGuid() + imgExtension;
                    // Пути сохранения файла
                    string originalDirectory = "/uploadedfiles/gallery/images/original/";
                    string scaledDirectory   = "/uploadedfiles/gallery/images/scaled/";
                    string pathOriginal      = originalDirectory + newFileName; // изображение исходного размера
                    string pathScaled        = scaledDirectory + newFileName;   // уменьшенное изображение

                    // Если такой директории не существует, то создаем её
                    if (!Directory.Exists(_appEnvironment.WebRootPath + originalDirectory))
                    {
                        Directory.CreateDirectory(_appEnvironment.WebRootPath + originalDirectory);
                    }
                    if (!Directory.Exists(_appEnvironment.WebRootPath + scaledDirectory))
                    {
                        Directory.CreateDirectory(_appEnvironment.WebRootPath + scaledDirectory);
                    }

                    // В операторе try/catch делаем уменьшенную копию изображения.
                    // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке
                    try
                    {
                        // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение
                        using (Image image = Image.Load(uploadedImage.OpenReadStream()))
                        {
                            // Создаем уменьшенную копию и обрезаем её
                            var clone = image.Clone(x => x.Resize(new ResizeOptions
                            {
                                Mode = ResizeMode.Crop,
                                Size = new Size(300, 169)
                            }));
                            // Сохраняем уменьшенную копию
                            await clone.SaveAsync(_appEnvironment.WebRootPath + pathScaled, new JpegEncoder { Quality = settings.ImageResizeQuality });

                            // Сохраняем исходное изображение
                            await image.SaveAsync(_appEnvironment.WebRootPath + pathOriginal);
                        }
                    }
                    // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке
                    catch
                    {
                        // Создаем сообщение об ошибке для вывода пользователю
                        ModelState.AddModelError("GalleryImage", $"Файл {uploadedImage.FileName} имеет неверный формат.");

                        // Удаляем только что созданные файлы (если ошибка возникла не на первом файле и некоторые уже были загружены на сервер)
                        foreach (var image in galleryImages)
                        {
                            // Исходные (полноразмерные) изображения
                            FileInfo imageOriginal = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathOriginal);
                            if (imageOriginal.Exists)
                            {
                                imageOriginal.Delete();
                            }
                            // И их уменьшенные копии
                            FileInfo imageScaled = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathScaled);
                            if (imageScaled.Exists)
                            {
                                imageScaled.Delete();
                            }
                        }
                        // Возвращаем модель с сообщением об ошибке в представление
                        return(View(model));
                    }

                    // Создаем объект класса GalleryImage со всеми параметрами
                    GalleryImage galleryImage = new GalleryImage()
                    {
                        Id                = Guid.NewGuid(),
                        ImageName         = newFileName,
                        ImagePathOriginal = pathOriginal,
                        ImagePathScaled   = pathScaled,
                        GalleryId         = model.GalleryId,
                        ImageDate         = DateTime.Now
                    };
                    // Добавляем объект galleryImage в список galleryImages
                    galleryImages.Add(galleryImage);
                }

                // Если в процессе выполнения не возникло ошибок, сохраняем всё в БД
                if (galleryImages != null && galleryImages.Count > 0)
                {
                    await _websiteDB.GalleryImages.AddRangeAsync(galleryImages);

                    await _websiteDB.SaveChangesAsync();
                }

                // Выводим обновленную модель в представление
                return(RedirectToAction("ViewGallery", "Gallery", new { galleryId = model.GalleryId }));
            }

            // В случае, если произошла ошибка валидации, требуется заново присвоить список изображений и счетчик для возвращаемой модели
            // При перегонке модели из гет в пост, теряется список с изображениями. Причина пока не ясна, поэтому сделал такой костыль
            // Счетчик соответственно тоже обнулялся, поэтому его тоже приходится переназначать заново
            model.GalleryImages = images;
            model.ImagesCount   = images.Count;

            // Возврат модели в представление в случае, если запорится валидация
            return(View(model));
        }