示例#1
0
        public async Task <IActionResult> Index()
        {
            SettingsNews settings = await _websiteDB.SettingsNews.FirstAsync();

            List <News> news = await _websiteDB.News.OrderByDescending(n => n.NewsDate).ToListAsync();

            IndexViewModel model = new IndexViewModel()
            {
                MaxImageSize       = settings.MaxImageSize,
                ImageResizeQuality = settings.ImageResizeQuality,
                News = news
            };

            return(View(model));
        }
示例#2
0
        public async Task <IActionResult> ApplySettings(IndexViewModel model)
        {
            SettingsNews settings = await _websiteDB.SettingsNews.FirstAsync();

            if (ModelState.IsValid)
            {
                settings.ImageResizeQuality = model.ImageResizeQuality;
                settings.MaxImageSize       = model.MaxImageSize;

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

            return(RedirectToAction("Index", "News"));
        }
示例#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);
        }
示例#4
0
        public async Task <IActionResult> CreateNews(CreateNewsViewModel model, IFormFileCollection uploads)
        {
            SettingsNews settings = await _websiteDB.SettingsNews.FirstAsync();

            // Объем изображения в мегабайтах
            int imageSize = 1048576 * settings.MaxImageSize;

            if (uploads.Count > 3)
            {
                ModelState.AddModelError("NewsImage", $"Нельзя загрузить больше 3 изображений");
            }
            else
            {
                // Проверяем, чтобы размер файлов не превышал заданный объем
                foreach (var file in uploads)
                {
                    if (file.Length > imageSize)
                    {
                        ModelState.AddModelError("NewsImage", $"Файл \"{file.FileName}\" превышает установленный лимит {settings.MaxImageSize}MB.");
                        break;
                    }
                }
            }

            // Если все в порядке, заходим в тело условия
            if (ModelState.IsValid)
            {
                // Создаем экземпляр класса News и присваиваем ему значения
                News news = new News()
                {
                    Id           = Guid.NewGuid(),
                    NewsTitle    = model.NewsTitle,
                    NewsBody     = model.NewsBody.SpecSymbolsToView(),
                    NewsDate     = DateTime.Now,
                    NewsUserName = User.Identity.Name
                };

                // Далее начинаем обработку изображений
                List <NewsImage> newsImages = new List <NewsImage>();
                foreach (var uploadedImage in uploads)
                {
                    // Если размер входного файла больше 0, заходим в тело условия
                    if (uploadedImage.Length > 0)
                    {
                        // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки
                        FileInfo imgFile = new FileInfo(uploadedImage.FileName);
                        // Приводим расширение к нижнему регистру (если оно было в верхнем)
                        string imgExtension = imgFile.Extension.ToLower();
                        // Генерируем новое имя для файла
                        string newFileName = Guid.NewGuid() + imgExtension;
                        // Пути сохранения файла
                        string originalDirectory = "/uploadedfiles/news/images/original/";
                        string scaledDirectory   = "/uploadedfiles/news/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("NewsImage", $"Ошибка при загрузке файла {uploadedImage.FileName}. Обратитесь к администратору сайта.");

                            // Удаляем только что созданные файлы (если ошибка возникла не на первом файле)
                            foreach (var image in newsImages)
                            {
                                // Исходные (полноразмерные) изображения
                                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));
                        }

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

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

                await _websiteDB.SaveChangesAsync();

                // Редирект на главную страницу
                return(RedirectToAction("Index", "News"));
            }

            // Возврат модели в представление в случае, если запорится валидация
            return(View(model));
        }
示例#5
0
        public async Task <IActionResult> EditNews(EditNewsViewModel model, IFormFileCollection uploads)
        {
            SettingsNews settings = await _websiteDB.SettingsNews.FirstAsync();

            int imageSize = 1048576 * settings.MaxImageSize;

            // Ищем запись в БД по Id
            News news = await _websiteDB.News.FirstOrDefaultAsync(n => n.Id == model.NewsId);

            // Если запись существует, продолжаем обработку
            if (news != null)
            {
                // Проверяем, чтобы общее количество изображений не превышало установленный лимит
                if (uploads.Count > 3 - model.NewsImagesCount)
                {
                    ModelState.AddModelError("NewsImage", $"Превышен лимит изображений для одной записи: 3");
                }
                else
                {
                    // Проверяем, чтобы размер файлов не превышал заданный объем
                    foreach (var file in uploads)
                    {
                        if (file.Length > imageSize)
                        {
                            ModelState.AddModelError("NewsImage", $"Файл \"{file.FileName}\" превышает установленный лимит {settings.MaxImageSize}MB.");
                            break;
                        }
                    }
                }

                // Если все в порядке, заходим в тело условия
                if (ModelState.IsValid)
                {
                    //News news = await _websiteDB.News.FirstAsync(n => n.Id == model.NewsId);

                    // Обновляем данные
                    news.NewsTitle = model.NewsTitle;
                    news.NewsBody  = model.NewsBody.SpecSymbolsToView();

                    // Далее начинаем обработку загружаемых изображений
                    List <NewsImage> newsImages = new List <NewsImage>();
                    foreach (var uploadedImage in uploads)
                    {
                        // Если размер входного файла больше 0, заходим в тело условия
                        if (uploadedImage.Length > 0)
                        {
                            // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки
                            FileInfo imgFile = new FileInfo(uploadedImage.FileName);
                            // Приводим расширение к нижнему регистру (если оно было в верхнем)
                            string imgExtension = imgFile.Extension.ToLower();
                            // Генерируем новое имя для файла
                            string newFileName = Guid.NewGuid() + imgExtension;
                            // Пути сохранения файла
                            string originalDirectory = "/uploadedfiles/news/images/original/";
                            string scaledDirectory   = "/uploadedfiles/news/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("NewsImage", $"Ошибка при обработке файла {uploadedImage.FileName}. Обратитесь к администратору сайта.");

                                // Удаляем только что созданные файлы (если ошибка возникла не на первом файле)
                                foreach (var image in newsImages)
                                {
                                    // Исходные (полноразмерные) изображения
                                    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));
                            }

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

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

                    // Редирект на главную страницу
                    return(RedirectToAction("Index", "News"));
                }

                // В случае, если при редактировании пытаться загрузить картинку выше разрешенного лимита, то перестают отображаться уже имеющиеся изображения
                // При перегонке модели из гет в пост, теряется список с изображениями. Причина пока не ясна, поэтому сделал такой костыль
                // Счетчик соответственно тоже обнулялся, поэтому его тоже приходится переназначать заново
                List <NewsImage> images = await _websiteDB.NewsImages.Where(i => i.NewsId == model.NewsId).OrderByDescending(i => i.ImageDate).ToListAsync();

                model.NewsImages      = images;
                model.NewsImagesCount = images.Count;

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