public Blog AddBlog(string title, string content, int blogCategory, string ImagePath, string author, bool approve, bool isLocalimg, IEnumerable <BlogLink> links) { var newBlog = new Blog { BlogTitle = title, Content = content, BlogDate = DateTime.Now, ImagePath = ImagePath, CategoryID = blogCategory, Author = author, isApproved = approve ? true : (bool?)null, IsLocalImg = isLocalimg, Links = Newtonsoft.Json.JsonConvert.SerializeObject(links), Rating = 0, isHarmony = false }; var mention = new MentionHandler(_udb); newBlog.Content = mention.ParseMentions(newBlog.Content); _db.Blogs.Add(newBlog); _db.SaveChanges(); mention.SendMentionMsg(_msgUtil, author, title, _urlHelper.Action("Details", "Blog", new { id = newBlog.BlogID })); return(newBlog); }
public ActionResult EditReply(int PostId, string content) { int id = PostId; var post = _db.Posts.Find(id); if (post == null) { return(NotFound()); } if (post.Author != User.Identity.Name && !User.IsInRole("Administrator") && !User.IsInRole("Moderator")) { return(Json(new { errmsg = "你tmd没权限更改" })); } else if (string.IsNullOrWhiteSpace(content)) { return(Json(new { errmsg = "回复不能为空" })); } if (User.Identity.Name != post.Author) { _adminUtil.log(User.Identity.Name, "editreply", _blogUtil.GetPostLink(post)); } var mention = new MentionHandler(_udb); post.Content = mention.ParseMentions(_sanitizerService.Sanitize(content)); if (mention.HasMentions()) { mention.SendMentionMsg(_msgUtil, User.Identity.Name, _blogUtil.GetPostTitle(post), _blogUtil.GetPostLink(post)); } _db.SaveChanges(); return(Json(true)); }
private Post AddPost(int itemid, ItemType idtype, string author, string content) { var p = new Post { Author = author, Content = content, PostDate = DateTime.Now, IdType = idtype, ItemId = itemid }; var mention = new MentionHandler(_udb); string ItemAuthor = null, ItemTitle = null; if (itemid > 0) { p.Content = mention.ParseMentions(p.Content); } _db.Posts.Add(p); _db.SaveChanges(); switch (idtype) { case ItemType.Blog: var b = _db.Blogs.Find(itemid); ItemAuthor = b.Author; ItemTitle = b.BlogTitle; break; case ItemType.Topic: var t = _db.Topics.Find(itemid); ItemAuthor = t.Author; ItemTitle = t.TopicTitle; break; case ItemType.Bounty: break; case ItemType.Answer: break; } string postlink = GetPostLink(p); if (ItemAuthor != null && GetUserOption(ItemAuthor, o => o.sendNoticeForNewReply)) { _msgUtil.SendNewPostNotice(ItemAuthor, author, ItemTitle, postlink); } mention.SendMentionMsg(_msgUtil, author, ItemTitle, postlink); return(p); }
public Reply AddPostReply(int id, string author, string content) { var r = new Reply { Author = author, Content = content, PostId = id, ReplyDate = DateTime.Now }; Post p = _db.Posts.Find(id); if (p != null) { bool isTopic = p.IdType == ItemType.Topic; string noticeuser = p.Author; bool isUserName = true; Regex re = new Regex(@"回复(?: |\s*)<span>(.+)</span>"); var match = re.Match(content); if (match.Length > 1) { noticeuser = System.Net.WebUtility.HtmlDecode(match.Groups[1].Value.Trim()); // Check format of "[Title] NickName" var idx = noticeuser.IndexOf("] "); if (idx >= 0) { noticeuser = noticeuser.Substring(idx + 2); } isUserName = false; } var user = _udb.Users.Include("option").AsNoTracking().SingleOrDefault(u => (isUserName ? u.UserName : u.NickName) == noticeuser); if (user != null) { UserOption o = user.option; if (o == null || o.sendNoticeForNewPostReply == true) { _msgUtil.SendNewReplyNotice(user.UserName, author, GetPostTitle(p), GetPostLink(p)); } } var mention = new MentionHandler(_udb); r.Content = mention.ParseMentions(r.Content); if (mention.HasMentions()) { mention.SendMentionMsg(_msgUtil, r.Author, GetPostTitle(p), GetPostLink(p)); } } p.Replies.Add(r); _db.SaveChanges(); return(r); }
public async Task <ActionResult> Edit([FromServices] HtmlSanitizerService sanitizerService, int id, BlogEdit blog, IFormFile[] files, bool setmain = false) { ViewBag.CategoryList = _catUtil.GetCategoryDropdown(blog.CategoryID); ViewBag.id = id; if (NolinkCategories == null || !NolinkCategories.Contains(blog.CategoryID)) { if (blog.BlogLinks == null) { ModelState.AddModelError("", "链接地址不能为空"); return(View(blog)); } else { blog.BlogLinks = blog.BlogLinks.Where(b => !string.IsNullOrWhiteSpace(b.url)).ToArray(); if (!BlogHelper.checkBlogLinks(blog.BlogLinks)) { ModelState.AddModelError("", "链接地址不能为空,且不得包含javascript"); return(View(blog)); } } } if (blog.Content == null || string.IsNullOrWhiteSpace(BlogHelper.removeAllTags(blog.Content))) { ModelState.AddModelError("", "内容不能为空或纯图片"); return(View(blog)); } if (!_blogUtil.CheckAdmin()) { blog.Content = sanitizerService.Sanitize(blog.Content); } if (ModelState.IsValid) { Blog originalblog = _db.Blogs.Find(id); bool hasupload = false; List <string> dellist = null; List <string> newlist = null; string thumb = null; string newthumb = null; string[] originalImglist = originalblog.ImagePath?.Split(';') ?? new string[] { }; string[] currentImglist = blog.ImagePath?.Split(';') ?? new string[] { }; int imgcount = currentImglist.Length; bool[] uploadpos = null; if (originalblog.option != null) { originalblog.option.MergeWith(_blogUtil, blog.Option); } else if (!blog.Option.OverrideOption(_blogUtil).IsDefault()) { originalblog.option = blog.Option; } if (originalblog.IsLocalImg) { dellist = originalImglist.ToList(); thumb = dellist.First(); } if (currentImglist.Length != 0) //item has local image & might or might not changed { // foreach name in current imglist, if orignal imglist does not contain the name,it is not valid if (!currentImglist.All(n => originalImglist.Contains(n))) { ModelState.AddModelError("", "内部参数错误,请刷新重试"); return(View(blog)); } // foreach name in orignial imglist, if current imglist does not contain the name,delete it dellist = originalImglist.Except(currentImglist).ToList(); originalblog.ImagePath = blog.ImagePath; } if (files != null) { uploadpos = new bool[files.Length]; imgcount += files.Where(f => f != null).Count(); for (int i = 0; i < files.Length; i++) { var data = files[i]; if (data != null) { if (data.Length > 1048576 * 4 || !data.ContentType.Contains("image")) { ModelState.AddModelError("", "单个文件不得超过4MB,且必须是图片"); return(View(blog)); } hasupload = true; uploadpos[i] = true; } else { uploadpos[i] = false; } } } if (hasupload) // has upload file { try { newlist = await _uploadUtil.SaveImagesAsync(files, false); } catch (Exception e) { ModelState.AddModelError("", "保存图片时发生异常:(" + e.Message + ")。如多次出错,请汇报给管理员。"); return(View(blog)); } if (newlist.Count < 1) { ModelState.AddModelError("", "图片服务器上传出错,请稍后再试。如多次出错,请汇报给管理员。"); return(View(blog)); } int i = 0; if (originalblog.IsLocalImg && setmain && files[0] != null && currentImglist.Length > 0) { List <string> updatedImgList = new List <string>(currentImglist); updatedImgList.Insert(0, newlist[0]); updatedImgList.AddRange(newlist.Skip(1)); originalblog.ImagePath = string.Join(";", updatedImgList); blog.Content = BlogHelper.InsertImgPlaceholder(blog.Content); i++; } else if (!originalblog.IsLocalImg) { originalblog.ImagePath = string.Join(";", newlist); } else { originalblog.ImagePath = string.Join(";", currentImglist.Concat(newlist)); } blog.Content = BlogHelper.ReplaceNewImgPlaceholder(blog.Content, i, currentImglist.Length, uploadpos); originalblog.IsLocalImg = true; } if (!originalblog.IsLocalImg || imgcount == 0) //no img no upload { string imgname = BlogHelper.getFirstImg(blog.Content); if (imgname == null || imgname.Length < 5) { ModelState.AddModelError("", "请添加预览图!(上传或外链图片)"); blog.ImagePath = originalblog.ImagePath; return(View(blog)); } originalblog.ImagePath = imgname; originalblog.IsLocalImg = false; } else { newthumb = originalblog.ImagePath.Split(';').ToList().First(); } var mention = new MentionHandler(_udb); blog.Content = mention.ParseMentions(blog.Content); mention.SendMentionMsg(_msgUtil, originalblog.Author, originalblog.BlogTitle, Url.Action("Details", new { id = originalblog.BlogID })); if (blog.Option != null && (originalblog.option != null || !blog.Option.IsDefault())) { originalblog.option = blog.Option; } // else image uploaded before and did not changed string[] tags = TagUtil.SplitTags(blog.BlogTags); List <Tag> updatedTags = null; try { // Replace 【】() with []() originalblog.BlogTitle = blog.BlogTitle.ToSingleByteCharacterString(); originalblog.Content = BlogHelper.RemoveComments(blog.Content); originalblog.CategoryID = blog.CategoryID; originalblog.Links = Newtonsoft.Json.JsonConvert.SerializeObject(blog.BlogLinks); if (blog.Option.NoApprove) { originalblog.isApproved = false; } else if (originalblog.isApproved == false) { originalblog.isApproved = null; } else if (originalblog.isApproved == null) { // Remove pending votes since the blog has changed. var audits = _db.BlogAudits.Where(b => b.BlogID == originalblog.BlogID).ToList(); var lastDecision = audits.Where(ba => ba.AuditAction == BlogAudit.Action.Approve || ba.AuditAction == BlogAudit.Action.Deny).OrderByDescending(ba => ba.BlogVersion).FirstOrDefault(); int lastVersion = lastDecision == null ? 0 : lastDecision.BlogVersion; _db.BlogAudits.RemoveRange(audits.Where(ba => ba.BlogVersion > lastVersion && (ba.AuditAction == BlogAudit.Action.VoteApprove || ba.AuditAction == BlogAudit.Action.VoteDeny))); } updatedTags = _tagUtil.SetTagsForBlog(originalblog.BlogID, tags, originalblog.Author); originalblog.isHarmony = BlogHelper.BlogIsHarmony(_db, originalblog, HarmonySettings); _db.SaveChanges(); } catch { if (originalblog.IsLocalImg && newlist != null) { await _uploadUtil.DeleteFilesAsync(newlist); } throw; } if (dellist != null && dellist.Count > 0) { await _uploadUtil.DeleteFilesAsync(dellist); } if (thumb != null && thumb != newthumb && blog.IsLocalImg) { await _uploadUtil.DeleteFileAsync(thumb.Replace("/upload/", "/thumbs/")); } if (originalblog.IsLocalImg && thumb != newthumb) { await _uploadUtil.SaveThumbAsync(originalblog.ImagePath); } if (originalblog.Author != User.Identity.Name) { _adminUtil.log(User.Identity.Name, "editblog", originalblog.BlogID.ToString()); } TriggerEditBlog(originalblog, updatedTags); return(RedirectToAction("Details", new { id })); } return(View(blog)); }
public async Task <ActionResult> Edit(int id, TopicEdit etopic, [FromServices] HtmlSanitizerService sanitizerService) { etopic.LoadBlog(_db); ViewBag.CategoryID = new SelectList(_catUtil.GetCategoryList(), "CategoryID", "CategoryName", etopic.CategoryID); int ret = TagUtil.CheckBlogTag(etopic.TagName, 1); if (ret != 0) { ModelState.AddModelError("", ret > 0 ? "专题标签只能有1个" : "标签不得超过20个字符"); } else if (!_blogUtil.CheckAdmin()) { etopic.Content = sanitizerService.Sanitize(etopic.Content); } else if (ModelState.IsValid) { var topic = _db.Topics.Find(id); bool uploadsaved = false; bool bannersaved = false; var blogcurrent = _db.BlogsInTopics.Where(bi => bi.TopicID == id).ToList(); foreach (var blog in blogcurrent) { _db.BlogsInTopics.Remove(blog); } int i = 0; foreach (var bid in etopic.BlogIDs.Distinct()) { var b = etopic.Blogs.SingleOrDefault(bb => bb.BlogID == bid); if (b == null) { ModelState.AddModelError("", "未找到ID编号为" + bid + "的资源"); return(View(topic)); } var blogintopic = new BlogsInTopic { blog = b, topic = topic, BlogOrder = i++ }; _db.BlogsInTopics.Add(blogintopic); } if (topic.tag.TagName != etopic.TagName) { var tag = _db.Tags.SingleOrDefault(t => t.TagName == etopic.TagName); if (tag == null) { tag = new Tag { TagName = etopic.TagName }; } topic.tag = tag; } try { var originalImage = topic.ImagePath; var originalBanner = topic.BannerPath; bool shouldDeleteOldImage = false; bool shouldDeleteOldBanner = string.IsNullOrWhiteSpace(etopic.BannerPath); if (etopic.TopicImage != null) { shouldDeleteOldImage = topic.isLocalImg; topic.isLocalImg = true; var imglist = await _uploadUtil.SaveImagesAsync(new IFormFile[] { etopic.TopicImage }, true); if (imglist.Count < 1) { ModelState.AddModelError("", "保存图片时发生异常。请尝试转换图片格式后再次上传。如多次出错,请汇报给管理员。"); return(View(etopic)); } topic.ImagePath = imglist[0]; uploadsaved = true; } else if (!topic.isLocalImg || (topic.isLocalImg && !etopic.IsLocalImg)) { string imgname = BlogHelper.getFirstImg(etopic.Content); if (imgname == null || imgname.Length < 5) { ModelState.AddModelError("", "请添加预览图!(上传或在文中外链图片)"); return(View(etopic)); } shouldDeleteOldImage = !etopic.IsLocalImg; topic.isLocalImg = false; topic.ImagePath = imgname; } if (etopic.TopicBanner != null) { var imglist = await _uploadUtil.SaveImagesAsync(new IFormFile[] { etopic.TopicBanner }, false); if (imglist.Count < 1) { ModelState.AddModelError("", "图片服务器上传出错,请尝试转换图片格式后再次上传。如多次出错,请汇报给管理员。"); return(View(topic)); } shouldDeleteOldBanner = true; bannersaved = true; topic.BannerPath = imglist[0]; } else { topic.BannerPath = etopic.BannerPath; } if (shouldDeleteOldBanner && !string.IsNullOrWhiteSpace(originalBanner)) { await _uploadUtil.DeleteFileAsync(originalBanner); } if (shouldDeleteOldImage && !string.IsNullOrWhiteSpace(originalImage)) { await _uploadUtil.DeleteFilesAsync(new[] { originalImage, originalImage.Replace("/upload/", "/thumbs/") }); } topic.UpdateDate = DateTime.Now; topic.TopicTitle = etopic.TopicTitle; topic.CategoryID = etopic.CategoryID; var mention = new MentionHandler(_udb); topic.Content = mention.ParseMentions(BlogHelper.RemoveComments(etopic.Content)); mention.SendMentionMsg(_msgUtil, User.Identity.Name, etopic.TopicTitle, Url.Action("Details", new { id = topic.TopicID })); _db.Entry(topic).State = EntityState.Modified; _db.SaveChanges(); TriggerEditTopic(topic); if (User.Identity.Name != topic.Author) { _adminUtil.log(User.Identity.Name, "edittopic", topic.TopicID.ToString()); } } catch { if (uploadsaved) { await _uploadUtil.DeleteFilesAsync(new[] { topic.ImagePath, topic.ImagePath.Replace("/upload/", "/thumbs/") }); } if (bannersaved) { await _uploadUtil.DeleteFileAsync(topic.BannerPath); } throw; } return(RedirectToAction("Details", new { id })); } return(View(etopic)); }
public async Task <ActionResult> Create(TopicEdit topic, [FromServices] HtmlSanitizerService sanitizerService) { ViewBag.CategoryID = sl; topic.LoadBlog(_db); if (ModelState.IsValid) { Topic ntopic = new Topic(); if (!_blogUtil.CheckAdmin()) { topic.Content = sanitizerService.Sanitize(topic.Content); } int i = 0; foreach (var bid in topic.BlogIDs.Distinct()) { var b = topic.Blogs.SingleOrDefault(bb => bb.BlogID == bid); if (b == null) { ModelState.AddModelError("", "未找到ID编号为" + bid + "的资源"); return(View(topic)); } var blogintopic = new BlogsInTopic { blog = b, topic = ntopic, BlogOrder = i++ }; _db.BlogsInTopics.Add(blogintopic); } ntopic.Author = User.Identity.Name; ntopic.CategoryID = topic.CategoryID; ntopic.Content = topic.Content; ntopic.CreateDate = DateTime.Now; ntopic.UpdateDate = DateTime.Now; ntopic.TopicVisit = 0; ntopic.TopicTitle = topic.TopicTitle; if (topic.TopicImage != null) { //ValidateFileAttribute里已经检查过了 ntopic.isLocalImg = true; var imglist = await _uploadUtil.SaveImagesAsync(new IFormFile[] { topic.TopicImage }); if (imglist.Count < 1) { ModelState.AddModelError("", "图片服务器上传出错,请稍后再试。如多次出错,请汇报给管理员。"); return(View(topic)); } ntopic.ImagePath = imglist[0]; } else { string imgname = BlogHelper.getFirstImg(ntopic.Content); if (imgname == null || imgname.Length < 5) { ModelState.AddModelError("", "请添加预览图!(上传或在文中外链图片)"); return(View(topic)); } ntopic.ImagePath = imgname; } if (topic.TopicBanner != null) { var imglist = await _uploadUtil.SaveImagesAsync(new IFormFile[] { topic.TopicBanner }, false); if (imglist.Count < 1) { ModelState.AddModelError("", "图片服务器上传出错,请稍后再试。如多次出错,请汇报给管理员。"); return(View(topic)); } ntopic.BannerPath = imglist[0]; } var tag = _db.Tags.SingleOrDefault(t => t.TagName == topic.TagName); if (tag == null) { tag = new Tag { TagName = topic.TagName }; } ntopic.tag = tag; var mention = new MentionHandler(_udb); ntopic.Content = mention.ParseMentions(BlogHelper.RemoveComments(ntopic.Content)); _db.Topics.Add(ntopic); _db.SaveChanges(); mention.SendMentionMsg(_msgUtil, ntopic.Author, ntopic.TopicTitle, Url.Action("Details", new { id = ntopic.TopicID })); TriggerNewTopic(ntopic); return(RedirectToAction("Details", new { id = ntopic.TopicID })); } return(View(topic)); }