예제 #1
0
        public async Task <Resp> GetLiseAsync(int index, int rows)
        {
            Paginator pager = new Paginator
            {
                Index = index,
                Rows  = rows
            };

            Comments.Hub commentHub = new Comments.Hub();

            using var db    = new DB.DarkContext();
            pager.TotalRows = await db.Posts.CountAsync();

            pager.List = await db.Posts.AsNoTracking()
                         .OrderByDescending(p => p.CreateDate)
                         .Skip(pager.GetSkip())
                         .Take(pager.Rows)
                         .Include(p => p.Image)
                         .Select(p => new Results.PostItem
            {
                Id       = p.Id,
                NickName = p.Creator,
                Content  = p.Content,
                Date     = p.CreateDate.ToStandardTimeString(),
                Comments = commentHub.GetComments(p.Id, 1, 5),
                Img      = new Share.Image
                {
                    Thumbnail = p.Image.Thumbnail,
                    Source    = p.Image.Path
                }
            })
                         .ToListAsync();

            return(Resp.Success(pager, ""));
        }
예제 #2
0
        public async Task <Resp> NewPostsAsync(Models.NewPostInfo info)
        {
            (bool isValid, string msg) = info.IsValid();
            if (!isValid)
            {
                return(Resp.Fault(Resp.NONE, msg));
            }

            File files = await File.SaveImageAsync(info.Img);

            DB.Tables.Post newPost = new DB.Tables.Post
            {
                CreateDate = DateTimeOffset.Now,
                Creator    = info.NickName,
                Content    = info.Content,
                ImageId    = files?.Id ?? File.DEFAULT_IMG_ID
            };
            using var db = new DB.DarkContext();
            db.Posts.Add(newPost);
            int suc = await db.SaveChangesAsync();

            if (suc == 1)
            {
                return(Resp.Success(Resp.NONE, "成功"));
            }
            return(Resp.Fault(Resp.NONE, "提交失败"));
        }
예제 #3
0
 private void ClearAllData()
 {
     using var db = new DB.DarkContext();
     db.Database.ExecuteSqlRaw($"DELETE FROM {nameof(DB.DarkContext.Comments)}");
     db.Database.ExecuteSqlRaw($"DELETE FROM {nameof(DB.DarkContext.Posts)}");
     db.Database.ExecuteSqlRaw($"DELETE FROM {nameof(DB.DarkContext.Files)} where Id != 1");
 }
예제 #4
0
        public async Task <Resp> NewCommentsAsync(Models.NewCommentInfo info)
        {
            (bool isValid, string msg) = info.IsValid();
            if (!isValid)
            {
                return(Resp.Fault(Resp.NONE, msg));
            }

            List <File> files = await File.SaveImagesAsync(info.Images, 100, 100);

            DB.Tables.Comment newComment = new DB.Tables.Comment
            {
                PostId     = info.PostId,
                CreateDate = DateTimeOffset.Now,
                Creator    = info.NickName,
                Content    = info.Content,
                Images     = string.Join(", ", files.Select(f => f.Id))
            };

            using var db = new DB.DarkContext();
            db.Comments.Add(newComment);
            int suc = await db.SaveChangesAsync();

            if (suc == 1)
            {
                return(Resp.Fault(Resp.NONE, "成功"));
            }
            return(Resp.Fault(Resp.NONE, "提交失败"));
        }
예제 #5
0
 internal List <Results.CommentItem> GetComments(int postId, int index, int rows)
 {
     using var db = new DB.DarkContext();
     return(db.Comments.AsNoTracking()
            .Where(c => c.PostId == postId)
            .Skip(rows * (index - 1))
            .Take(rows)
            .Select(c => new Results.CommentItem
     {
         NickName = c.Creator,
         Content = c.Content,
         Date = c.CreateDate.ToStandardTimeString(),
         Imgs = File.GetImagesPath(c.Images.SplitToInt(','))
     })
            .ToList());
 }
예제 #6
0
        /// <summary>
        /// 获取所有评论
        /// </summary>
        public async Task <Resp> GetAllListAsync(int postId)
        {
            using var db = new DB.DarkContext();
            List <Results.CommentItem> list = await db.Comments.AsNoTracking()
                                              .Where(c => c.PostId == postId)
                                              .Select(c => new Results.CommentItem
            {
                NickName = c.Creator,
                Content  = c.Content,
                Date     = c.CreateDate.ToStandardTimeString(),
                Imgs     = File.GetImagesPath(c.Images.SplitToInt(','))
            })
                                              .ToListAsync();

            return(Resp.Success(list));
        }
예제 #7
0
        public async Task <Resp> GetListAsync(int postId, int index, int rows)
        {
            Paginator pager = new Paginator
            {
                Index = index,
                Rows  = rows
            };

            using var db = new DB.DarkContext();

            pager.TotalRows = await db.Comments.CountAsync(c => c.PostId == postId);

            pager.List = GetComments(postId, index, rows);

            return(Resp.Success(pager));
        }
예제 #8
0
        /// <summary>
        /// 获取一张图片的缩略图路径和原图路径
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static Share.Image GetImagePath(int id)
        {
            using var db = new DB.DarkContext();
            DB.Tables.File file = db.Files.AsNoTracking()
                                  .FirstOrDefault(f => f.Id == id);
            Share.Image image = new Share.Image
            {
                Thumbnail = "",
                Source    = ""
            };

            if (file is null)
            {
                return(image);
            }
            image.Thumbnail = file.Thumbnail;
            image.Source    = file.Path;
            return(image);
        }
예제 #9
0
        /// <summary>
        /// 保存图片, 返回图片信息
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public static async Task <File> SaveImageAsync(IFormFile file, double thumbnailWidth = THUMBNAIL_WIDTH, double thumbnailHeight = THUMBNAIL_HEIGHT)
        {
            /*
             * 保存图片到数据库, 同时保存图片的缩略图
             */

            if (file is null)
            {
                return(null);
            }

            //  源文件名
            string fileName = file.FileName;
            //  扩展名
            string ExtensionName = Path.GetExtension(fileName);
            //  保存名
            string saveName = string.Concat(Guid.NewGuid().ToString(), ExtensionName);
            //  源文件大小
            long size = file.Length;
            //  缩略图名字
            //  原图保存名 + '-min' + 缩略图扩展名
            string thumbnailName = saveName.Replace(ExtensionName, $"-min{DEFAULT_THUMBNAIL_EXTENSIONS}");
            //  缩略图保存路径
            string thumbnailPath = Path.Combine(SaveThumbnailPath, thumbnailName);
            //  原图的保存路径
            string sourceSavePath = Path.Combine(SavePath, saveName);

            //  保存原图
            using (Stream stream = System.IO.File.Create(sourceSavePath))
            {
                await file.CopyToAsync(stream);
            }

            string coverTempName = saveName.Replace(ExtensionName, $"-cover{DEFAULT_THUMBNAIL_EXTENSIONS}");
            string coverTempPath = null;
            //  制作缩略图的源文件
            //  静态图是源文件
            //  GIF 图是截取的封面
            string thumbnailSourcePath;

            //  是否 GIF
            //  是的话, 保存 GIF 的封面的缩略图
            if (ExtensionName.ToUpper() == GIF)
            {
                /*
                 *  先截取封面所临时缩略图
                 *  再使用里临时缩略图制作缩略图
                 */
                coverTempPath = Path.Combine(SaveTempPath, coverTempName);
                GetGIFCover(sourceSavePath, coverTempPath);
                thumbnailSourcePath = coverTempPath;
            }
            else
            {
                thumbnailSourcePath = sourceSavePath;
            }

            //  保存缩略图
            Task thumbnailT = MakeThumbnail(thumbnailSourcePath, thumbnailPath, thumbnailWidth, thumbnailHeight);

            DB.Tables.File fileModel = new DB.Tables.File
            {
                Name          = fileName,
                ExtensionName = ExtensionName,
                Size          = size,
                Path          = Path.Combine(WebSaveDirectory, saveName),
                Thumbnail     = Path.Combine(WebSaveThumbnailDirectory, thumbnailName)
            };
            using DB.DarkContext db = new DB.DarkContext();
            db.Files.Add(fileModel);
            int suc = await db.SaveChangesAsync();

            //  等待缩略图保存完成
            await thumbnailT;

            //  删除临时文件
            if (!string.IsNullOrWhiteSpace(coverTempPath))
            {
                System.IO.File.Delete(coverTempPath);
            }
            if (suc == 1)
            {
                return(new File(fileModel));
            }
            return(null);
        }