/// <summary> /// 资讯详情页 /// </summary> public ActionResult ContentItemDetail(long contentItemId) { ContentItem contentItem = contentItemService.Get(contentItemId); if (contentItem == null || contentItem.User == null) { return(HttpNotFound()); } //验证是否通过审核 long currentSpaceUserId = UserIdToUserNameDictionary.GetUserId(contentItem.User.UserName); if (!authorizer.IsAdministrator(CmsConfig.Instance().ApplicationId) && contentItem.UserId != currentSpaceUserId && (int)contentItem.AuditStatus < (int)(new AuditService().GetPubliclyAuditStatus(CmsConfig.Instance().ApplicationId))) { return(Redirect(SiteUrls.Instance().SystemMessage(TempData, new SystemMessageViewModel { Title = "尚未通过审核", Body = "由于当前资讯尚未通过审核,您无法浏览当前内容。", StatusMessageType = StatusMessageType.Hint }))); } AttachmentService <Attachment> attachmentService = new AttachmentService <Attachment>(TenantTypeIds.Instance().ContentItem()); //更新浏览计数 CountService countService = new CountService(TenantTypeIds.Instance().ContentItem()); countService.ChangeCount(CountTypes.Instance().HitTimes(), contentItem.ContentItemId, contentItem.UserId, 1, true); if (UserContext.CurrentUser != null) { //创建访客记录 VisitService visitService = new VisitService(TenantTypeIds.Instance().ContentItem()); visitService.CreateVisit(UserContext.CurrentUser.UserId, UserContext.CurrentUser.DisplayName, contentItem.ContentItemId, contentItem.Title); } //设置SEO信息 pageResourceManager.InsertTitlePart(contentItem.Title); List <string> keywords = new List <string>(); keywords.AddRange(contentItem.TagNames); string keyword = string.Join(" ", keywords.Distinct()); keyword += " " + string.Join(" ", ClauseScrubber.TitleToKeywords(contentItem.Title)); pageResourceManager.SetMetaOfKeywords(keyword); pageResourceManager.SetMetaOfDescription(contentItem.Summary); return(View(contentItem)); }
/// <summary> /// 资讯标签选择器(支持自动提取) /// </summary> /// <param name="contentFolderId"></param> /// <param name="contentItemId"></param> /// <param name="title"></param> /// <returns></returns> public ActionResult _TagSelector(long contentItemId, int contentFolderId, string title = null) { IEnumerable <string> selectedTagNames = new List <string>(); if (string.IsNullOrEmpty(title)) { var contentItem = contentItemService.Get(contentItemId); if (contentItem != null) { selectedTagNames = contentItem.TagNames; } ViewData["selectedTagNames"] = selectedTagNames; return(View()); } string filteredPhrase = ClauseScrubber.LuceneKeywordsScrub(title); if (!string.IsNullOrEmpty(filteredPhrase)) { string[] nameSegments = ClauseScrubber.SegmentForPhraseQuery(filteredPhrase); selectedTagNames = nameSegments.Where(n => n.Length > 1).Take(5).ToList(); ViewData["selectedTagNames"] = selectedTagNames; } return(View()); }
/// <summary> /// 转换成BlogThread类型 /// </summary> /// <returns>文章实体</returns> public BlogThread AsBlogThread() { BlogThread blogThread = null; //写文章 if (this.ThreadId <= 0) { blogThread = BlogThread.New(); blogThread.UserId = UserContext.CurrentUser.UserId; blogThread.Author = UserContext.CurrentUser.DisplayName; if (this.OwnerId.HasValue) { blogThread.OwnerId = this.OwnerId.Value; blogThread.TenantTypeId = TenantTypeIds.Instance().Group(); } else { blogThread.OwnerId = UserContext.CurrentUser.UserId; blogThread.TenantTypeId = TenantTypeIds.Instance().User(); } blogThread.OriginalAuthorId = UserContext.CurrentUser.UserId; blogThread.IsDraft = this.IsDraft; } //编辑文章 else { BlogService blogService = new BlogService(); blogThread = blogService.Get(this.ThreadId); blogThread.LastModified = DateTime.UtcNow; } blogThread.Subject = this.Subject; blogThread.Body = this.Body; blogThread.IsSticky = this.IsSticky; blogThread.IsLocked = this.IsLocked; blogThread.PrivacyStatus = this.PrivacyStatus; blogThread.Keywords = this.Keywords; if (string.IsNullOrEmpty(blogThread.Keywords)) { string[] keywords = ClauseScrubber.TitleToKeywords(this.Subject); if (keywords.Length > 0) { blogThread.Keywords = string.Join(" ", keywords); } else { blogThread.Keywords = string.Empty; } } blogThread.Summary = this.Summary; if (string.IsNullOrEmpty(this.Summary)) { blogThread.Summary = HtmlUtility.TrimHtml(this.Body, 100); } blogThread.FeaturedImageAttachmentId = this.FeaturedImageAttachmentId; if (blogThread.FeaturedImageAttachmentId > 0) { Attachment attachment = attachmentService.Get(blogThread.FeaturedImageAttachmentId); if (attachment != null) { blogThread.FeaturedImage = attachment.GetRelativePath() + "\\" + attachment.FileName; } else { blogThread.FeaturedImageAttachmentId = 0; } } else { blogThread.FeaturedImage = string.Empty; } return(blogThread); }
/// <summary> /// 搜索“供职于同一公司”的用户 /// </summary> /// <param name="userId">当前用户的ID</param> /// <param name="pageIndex">分页页码</param> /// <param name="pageSize">分页大小</param> /// <param name="companyNameDic">存储用户ID到标签公司名称列表的映射,用于页面列表输出</param> /// <returns></returns> public PagingDataSet <User> SearchInterestedWithCompanys(long userId, int pageIndex, int pageSize, out Dictionary <long, IEnumerable <string> > companyNameDic) { //Dictionary,用于页面列表输出 companyNameDic = new Dictionary <long, IEnumerable <string> >(); //无效用户ID,直接返回空列表 if (userId <= 0) { return(new PagingDataSet <User>(new List <User>())); } Query query = null; Filter filter = null; Sort sort = null; //先搜索出当前用户的公司名称 //使用LuceneSearchBuilder构建Lucene需要Query、Filter、Sort LuceneSearchBuilder searchBuilder = new LuceneSearchBuilder(); searchBuilder.WithField(UserIndexDocument.UserId, userId.ToString(), true); searchBuilder.BuildQuery(out query, out filter, out sort); IEnumerable <Document> docs = searchEngine.Search(query, filter, sort, 1); //索引中无此用户,直接返回空列表 if (docs == null || docs.Count <Document>() == 0) { return(new PagingDataSet <User>(new List <User>())); } string[] myCompanyNames = docs.First <Document>().GetValues(UserIndexDocument.CompanyName); //当前用户无公司名称,直接返回空列表 if (myCompanyNames != null && myCompanyNames.Count() == 0) { return(new PagingDataSet <User>(new List <User>())); } //List<string> myCompanyNameList=myCompanyNames.Select(n=>ClauseScrubber.CompanyNameScrub(n)).ToList(); //查找有相同公司名称的用户 //先查询当前用户关注的人(包括“悄悄关注”的用户),此处需要调用数据库查询,因为索引中没有存储“是否悄悄关注”属性 IEnumerable <long> myFollowedUserIds = followService.GetPortionFollowedUserIds(userId); //黑名单用户 IEnumerable <long> stopUserIds = new PrivacyService().GetStopedUsers(userId).Select(n => n.Key); //使用LuceneSearchBuilder构建Lucene需要Query、Filter、Sort searchBuilder = new LuceneSearchBuilder(1); //搜索条件需要排除掉当前用户本身和已关注用户 searchBuilder.WithPhrases(UserIndexDocument.CompanyName, myCompanyNames.Distinct().Take(3).Select(n => ClauseScrubber.CompanyNameScrub(n))) .NotWithField(UserIndexDocument.UserId, userId.ToString()) //排除掉当前用户 .NotWithFields(UserIndexDocument.UserId, myFollowedUserIds.Select(n => n.ToString())) //排除掉已关注用户 .NotWithFields(UserIndexDocument.UserId, stopUserIds.Select(n => n.ToString())); //排除掉黑名单用户 searchBuilder.BuildQuery(out query, out filter, out sort); PagingDataSet <Document> searchResult = searchEngine.Search(query, filter, sort, pageIndex, pageSize); docs = searchResult.ToList <Document>(); //如果没有使用相同公司名称的用户,直接返回空列表 if (docs == null || docs.Count <Document>() == 0) { return(new PagingDataSet <User>(new List <User>())); } //“相同公司名称”的用户ID列表 List <long> sameUserIds = new List <long>(); foreach (Document doc in docs) { //比较获取“相同的公司名称” List <string> sameCompanyNames = new List <string>(); string[] companyNames = doc.GetValues(UserIndexDocument.CompanyName); foreach (string myCompanyName in myCompanyNames) { foreach (string companyName in companyNames) { if (companyName.Equals(myCompanyName) || companyName.Contains(myCompanyName)) { sameCompanyNames.Add(myCompanyName); break; } } } long sameUserId = long.Parse(doc.Get(UserIndexDocument.UserId)); sameUserIds.Add(sameUserId); //加入Dictionary,用于页面列表输出 if (!companyNameDic.ContainsKey(sameUserId)) { companyNameDic.Add(sameUserId, sameCompanyNames); } } //批量查询“相同公司名称”的用户列表 IEnumerable <User> sameUsers = userService.GetFullUsers(sameUserIds).Where(n => n.IsCanbeFollow == true && n.IsActivated == true && n.IsBanned == false); //组装分页对象 PagingDataSet <User> users = new PagingDataSet <User>(sameUsers) { TotalRecords = searchResult.TotalRecords, PageSize = searchResult.PageSize, PageIndex = searchResult.PageIndex, QueryDuration = searchResult.QueryDuration }; return(users); }