public bool TryResolveRoute(Uri absoluteUri, out SiteRoute route) { if (!absoluteUri.IsAbsoluteUri) { throw new Exception("Uris should be absolute."); } route = null; RouteConstraint constraint; try { constraint = GetBestRouteConstraint(absoluteUri); } catch (Exception e) { return(false); } var absPath = new Uri(absoluteUri.AbsolutePath, UriKind.Relative); absPath = RemoveTrailingSlashes(absPath); return(_siteRouteTables[constraint].TryGetRoute(absPath, out route)); }
public async Task <IActionResult> PostNewsDocLocalHostAsync([FromHeader] String source, [FromRoute] SiteRoute route, DateTime pushTime, DateTime?errStartTime ) { var response = new Response <Object>(); try { var categories = await _IWebCategoryRepository.Query(a => a.SiteId == route.mark && a.IsEnable == 1, a => a.Sequence).ToListAsync(); var iidn = await _IWebNewsElastic.AddIndexAsync(_IWebNewsElastic.IndexName); List <WebNews> news = null; Expression <Func <WebNews, bool> > predicate; if (errStartTime != null) //如果中途断掉则根据断掉的时间节点重新写入 { predicate = c => c.SiteId == route.mark && c.IsEnable == 1 && (c.PushTime <= pushTime && c.PushTime > errStartTime); } else { predicate = c => c.SiteId == route.mark && c.IsEnable == 1 && c.PushTime <= pushTime; } for (int pageIndex = 1; pageIndex <= 1; pageIndex++) { news = await _IWebNewsRepository.Query(predicate) .ToPager(pageIndex, 100).ToListAsync(); var docs = new List <WebNewsDoc>(); news.ForEach(x => { var category = categories.SingleOrDefault(a => a.CategoryName == x.CategoryName); if (category != null) { docs.Add(GetWebNewsDoc(x)); } }); if (docs.Count > 0) { try { var flag = await _IWebNewsElastic.BatchAddDocumentAsync(_IWebNewsElastic.IndexName, docs); response.Data = docs.Count * pageIndex;//写入es response.Message = docs.LastOrDefault().PushTime.ToString(); response.Code = flag; } catch (Exception ex) { LogHelper.LogError("写入ES错误信息:{0}", ex.Message + ex.StackTrace); } } } } catch (Exception ex) { LogHelper.LogError("db读取错误信息:{0}", ex.Message + ex.StackTrace); } return(response.ToHttpResponse()); }
public Uri CreateUriForRoute(SiteRoute sr, UriSettings settings, IDictionary <string, string> parameters) { var requireSsl = false; if (sr is ContentPageRoute cpr) { requireSsl = cpr.RequireSsl; } var needsAuthorityChange = (sr.Authority != UriAuthorityFilter.Any && _context.Authority != sr.Authority); var needsSslChange = !_context.IsSsl && requireSsl; if (settings.PreferUriKind != UriKinds.AbsoluteUri && !needsSslChange && !needsAuthorityChange) { if (settings.PreferUriKind == UriKinds.RelativeFromSiteRoot) { return(sr.VirtualPath); } if (settings.PreferUriKind == UriKinds.RelativeFromCurrent) { return(_context.AbsolutePath.MakeRelativeUri(sr.VirtualPath)); } } var protocol = "http://"; if (requireSsl) { protocol = "https://"; } var authority = sr.Authority; if (sr.Authority == UriAuthorityFilter.Any) { authority = _context.Authority; } var uriBase = new Uri($"{protocol}{authority}{sr.VirtualPath}"); var builder = new UriBuilder(uriBase); if (parameters != null && parameters.Count > 0) { builder.Query = new FormUrlEncodedContent(parameters).ReadAsStringAsync().Result; } return(builder.Uri); }
public async Task <IActionResult> GetCategoriesAsync([FromHeader] String source, [FromRoute] SiteRoute route) { var response = new Response <List <WebCategoryValue> >(); try { var result = await this._IWebCategoryRedis.GetAsync(route.mark); if (result.Count > 0) { response.Code = true; response.Data = result; } else { var entities = await _IWebCategoryRepository.Query(a => a.SiteId == route.mark && a.IsEnable == 1, a => a.Sequence) .Select(a => new WebCategoryValue() { CategoryId = a.CategoryId, ChannelId = Convert.ToInt32(a.Remarks), CategoryName = a.CategoryName, ParentId = a.ParentId, Controller = a.Controller, Action = a.Action, Urls = a.Urls, Title = a.Title, Keywords = a.Keywords, Description = a.Description }) .ToListAsync(); if (entities.Count > 0) { await _IWebCategoryRedis.AddAsync(route.mark, entities); response.Code = true; response.Data = entities; } else { return(NoContent()); } } } catch (Exception ex) { response.SetError(ex, this._ILogger); } return(response.ToHttpResponse()); }
public bool TryResolveRoute(Guid pageId, out SiteRoute route) { route = null; foreach (var site in _siteRouteTables.Keys) { var success = _siteRouteTables[site].TryGetRoute(pageId, out route); if (success) { return(true); } } return(false); }
public async Task <IActionResult> PostNewsDocLocalHostAsync([FromHeader] String source, [FromRoute] SiteRoute route) { var response = new Response <Object>(); try { var categories = await _IWebCategoryRepository.Query(a => a.SiteId == route.mark && a.IsEnable == 1, a => a.Sequence).ToListAsync(); await _IWebNewsElastic.AddIndexAsync(_IWebNewsElastic.IndexName); var lastNews = new WebNews(); var current = System.DateTime.Now; for (int pageIndex = 1; pageIndex <= 40; pageIndex++) { var news = new List <WebNews>(); var express = Express.Begin <WebNews>(true); express = express.And(a => a.SiteId == route.mark && a.IsEnable == 1 && a.PushTime <= current); news = await _IWebNewsRepository.Query(express) .OrderByDescending(a => a.PushTime) .ToPager(pageIndex, 30000) .ToListAsync(); lastNews = news.LastOrDefault(); if (lastNews != null) { var docs = new List <WebNewsDoc>(); news.ForEach(x => { var category = categories.SingleOrDefault(a => a.CategoryName == x.CategoryName); if (category != null) { docs.Add(GetWebNewsDoc(x)); } }); if (docs.Count > 0) { await _IWebNewsElastic.BatchAddDocumentAsync(_IWebNewsElastic.IndexName, docs); } } } response.Code = true; response.Other = null; } catch (Exception ex) { response.SetError(ex, this._ILogger); } return(response.ToHttpResponse()); }
public async Task <IActionResult> GetWebSiteAsync( [FromHeader] String source, [FromRoute] SiteRoute route) { var response = new Response <WebSiteValue>(); try { var entity = await _IWebSiteRedis.GetAsync(route.mark); if (entity != null) { response.Code = true; response.Data = entity; } else { var result = await _IWebSiteRepository.Query(a => a.SiteId == route.mark) .Select(a => new WebSiteValue() { SiteId = a.SiteId, SiteName = a.SiteName, SiteUrls = a.SiteUrls, LogoUrls = a.LogoUrls, Title = a.Title, Keywords = a.Keywords, Description = a.Description }) .SingleOrDefaultAsync(); if (result != null) { await _IWebSiteRedis.AddAsync(route.mark, result); response.Code = true; response.Data = result; } else { return(NotFound("数据不存在或未定义!")); } } } catch (Exception ex) { response.SetError(ex, this._ILogger); } return(response.ToHttpResponse()); }
public async Task <IActionResult> PostNewsDocAsync([FromHeader] String source, [FromRoute] SiteRoute route, string newsId = "10000000") { var response = new Response <Object>(); try { var categories = await _IWebCategoryRepository.Query(a => a.SiteId == route.mark && a.IsEnable == 1, a => a.Sequence).ToListAsync(); var iidn = await _IWebNewsElastic.AddIndexAsync(_IWebNewsElastic.IndexName); for (int pageIndex = 1; pageIndex <= 20; pageIndex++) { var news = new List <WebNews>(); news = _IMySqlRepository.GetList(1, pageIndex, 1000, Convert.ToInt32(newsId)); var lastNews = news.LastOrDefault(); if (lastNews != null) { newsId = news.LastOrDefault().NewsId; var docs = new List <WebNewsDoc>(); var newsDatas = new List <WebNews>(); news.ForEach(x => { var category = categories.SingleOrDefault(a => a.CategoryName == x.CategoryName); if (category != null) { newsDatas.Add(SetWebNews(x, category)); docs.Add(GetWebNewsDoc(x)); } }); if (newsDatas.Count > 0) { await _IWebNewsRepository.BatchAddAsync(newsDatas);//写入数据库 } //if (docs.Count > 0) // response.Other += (await _IWebNewsElastic.BatchAddDocumentAsync(_IWebNewsElastic.IndexName, docs)).ToString() + "a|" + docs.Count;//写入es } } response.Code = true; response.Other = null; } catch (Exception ex) { LogHelper.LogError("错误信息:{0}", ex.Message + ex.StackTrace); } response.Data = newsId; return(response.ToHttpResponse()); }
public async Task <IActionResult> GetSiteAccessAsync( [FromHeader] String source, [FromRoute] SiteRoute route, [FromQuery] SiteAccessGet item) { var response = new Response <Object>(); try { // 渠道访问 if (!string.IsNullOrEmpty(item.From)) { await _IWebChannelRedis.AddAccessCount(route.mark, item.From); } // 站点访问 await _IWebSiteRedis.AddAccessCount(route.mark); response.Code = true; } catch (Exception ex) { response.SetError(ex, this._ILogger); } return(response.ToHttpResponse()); }
private string CreateUrl(SiteRoute transferRoute, IDictionary <string, string> parameters) { var uriBuilder = new CmsUriBuilder(httpRequest.ToUriBuilderContext()); return(uriBuilder.CreateUriForRoute(transferRoute, UriSettings.Default, parameters).ToString()); }
public async Task <IActionResult> GetNewsHotAsync([FromHeader] String source, [FromRoute] SiteRoute route, [FromQuery] PagerElastic item) { var response = new Response <List <NewsListResponse> >(); try { var request = new SearchRequest <WebNewsDoc>(_IWebNewsElastic.IndexName) { TrackTotalHits = true, Query = new BoolQuery() { Must = new QueryContainer[] { new TermQuery() { Field = "siteId", Value = route.mark } && new DateRangeQuery() { Field = "pushTime", GreaterThanOrEqualTo = System.DateTime.Now.ToString("yyyy-MM-dd 00:00:00"), LessThanOrEqualTo = System.DateTime.Now.ToString("yyyy-MM-dd 23:59:59"), Format = "yyyy-MM-dd HH:mm:ss" } }, MustNot = new QueryContainer[] { new TermQuery() { Field = "contentType", Value = 2 } } }, Source = new Union <bool, ISourceFilter>(new SourceFilter { Excludes = new[] { "contents" } }), Sort = new List <ISort>() { new FieldSort() { Field = "accessCount", Order = SortOrder.Descending } }, Size = item.PageSize }; if (item.PageIndex != null) { request.From = 0; request.SearchAfter = item.PageIndex.Split(","); } var result = await this._IWebNewsElastic.Client .SearchAsync <NewsListResponse>(request); if (result.ApiCall.Success && result.ApiCall.HttpStatusCode == 200) { if (result.Documents.Count > 0) { response.Code = true; response.Data = result.Documents.ToList(); response.Other = string.Join(',', result.Hits.LastOrDefault().Sorts); } else { return(NoContent()); } } else { return(NoContent()); } } catch (Exception ex) { response.SetError(ex, this._ILogger); } return(response.ToHttpResponse()); }
public async Task <IActionResult> GetNewsSearchAsync([FromHeader] String source, [FromRoute] SiteRoute route, [FromQuery] NewsTitleSearchGet item) { var response = new Response <Object>(); try { var headerSource = source.ToObject <HeaderSource>(); item.ShowType = item.ShowType == 0 ? 1 : item.ShowType; // 针对安卓版本判断 var lastVers = new Version("1.0.4"); // 最后版本 //var newVers = new Version(headerSource.SystemVers); // 最新版本 string[] newsSearchAfter = null; // 新闻分页 string[] videoSearchAfter = null; // 视频分页 var mustNot = new QueryContainer[] { new MatchPhraseQuery() { Field = "newsTitle", Query = item.Title } }; if (headerSource.Device == "android" && (headerSource.SystemVers == "5" || headerSource.SystemVers == "1")) { if (string.IsNullOrEmpty(item.NewsId)) { mustNot = new QueryContainer[] { new TermQuery() { Field = "contentType", Value = 2 } }; } else { mustNot = new QueryContainer[] { new TermQuery() { Field = "contentType", Value = 2 } && new TermQuery() { Field = "newsId", Value = item.NewsId } }; } } else if (!string.IsNullOrEmpty(item.NewsId)) { mustNot = new QueryContainer[] { new TermQuery() { Field = "newsId", Value = item.NewsId } }; } // 页 int?from = null; if (!string.IsNullOrEmpty(item.PageIndex)) { from = 0; var after = item.PageIndex.Split("|"); if (after.Length > 1) { newsSearchAfter = string.IsNullOrEmpty(after[0]) ? null : after[0].Split(','); videoSearchAfter = string.IsNullOrEmpty(after[1]) ? null : after[1].Split(','); } else if (item.ShowType == 1) { newsSearchAfter = item.PageIndex.Split(","); } else if (item.ShowType == 2) { videoSearchAfter = item.PageIndex.Split(","); } } else { from = null; } Func <int, Func <SearchDescriptor <NewsListResponse>, ISearchRequest> > searchSelector = (x) => { string[] searchAfter = null; var pageSize = item.PageSize; if (x == 1) { searchAfter = newsSearchAfter; } else if (x == 2 && item.ShowType == 3) { searchAfter = videoSearchAfter; pageSize = pageSize / 2; } else if (x == 2) { searchAfter = videoSearchAfter; } Func <SearchDescriptor <NewsListResponse>, ISearchRequest> func = a => a .Index(_IWebNewsElastic.IndexName) .TrackTotalHits(true) .Query(c => c .Bool(d => d .Must(e => e .Term("siteId", route.mark) && e .Term(f => f.ContentType, x) && e .Match(f => f.Field(g => g.NewsTitle).Query(item.Title)) ) .MustNot(mustNot))) .Source(c => c.Excludes(d => d.Field("contents"))) .Sort(c => c.Field(d => d.PushTime, SortOrder.Descending)) .Highlight(c => c.PreTags("<em style='color:#f73131'>") .PostTags("</em>") .Fields(f => f .Field("newsTitle") )) .Size(pageSize) .From(from) .SearchAfter(searchAfter); return(func); }; MultiSearchResponse result; if (item.ShowType == 3) { // 显示文章和视频 result = await _IWebNewsElastic.Client.MultiSearchAsync(null, a => a.Search <NewsListResponse>("news", searchSelector(1)) .Search <NewsListResponse>("videos", searchSelector(2))); } else { result = await _IWebNewsElastic.Client.MultiSearchAsync(null, a => a.Search <NewsListResponse>("news", searchSelector(item.ShowType))); } if (result.ApiCall.Success && result.ApiCall.HttpStatusCode == 200) { var news = result.GetResponse <NewsListResponse>("news"); var videos = result.GetResponse <NewsListResponse>("videos"); if (news.Hits.Count > 0) { response.Code = true; var data = new List <Dictionary <string, Object> >(); var entity = new Dictionary <string, Object>(); if (item.ShowType == 3) { if (videos.Hits.Count > 0) { var videosHits = videos.Hits.ToList(); for (int i = 0; i < news.Hits.Count; i++) { entity = new Dictionary <string, object>(); var newsHit = news.Hits.ElementAt(i); if (i + 1 > news.Hits.Count) { break; } else { entity.Add("highlight", newsHit.Highlight.Values.ElementAt(0).First()); entity.Add("entity", newsHit.Source); data.Add(entity); if ((i + 1) % 2 == 0 && i > 0) { var videosHit = videosHits.FirstOrDefault(); if (videosHit != null) { entity = new Dictionary <string, object>(); if (videosHits.Count > 0) { videosHits.Remove(videosHit); } entity.Add("highlight", videosHit.Highlight.Values.ElementAt(0).First()); entity.Add("entity", videosHit.Source); data.Add(entity); } } } } videosHits.ForEach(x => { var videosHit = videosHits.FirstOrDefault(); entity = new Dictionary <string, Object>(); entity.Add("highlight", videosHit.Highlight.Values.ElementAt(0).First()); entity.Add("entity", videosHit.Source); data.Add(entity); }); var ns = string.Join(',', news.Hits.LastOrDefault().Sorts); var vs = string.Join(',', videos.Hits.LastOrDefault().Sorts); response.Data = data; response.Other = $"{ns}|{vs}"; } else { foreach (var hit in news.Hits) { entity = new Dictionary <string, Object>(); entity.Add("highlight", hit.Highlight.Values.ElementAt(0).First()); entity.Add("entity", hit.Source); data.Add(entity); } response.Data = data; response.Other = string.Join(',', news.Hits.LastOrDefault().Sorts); } } else { foreach (var hit in news.Hits) { entity = new Dictionary <string, Object>(); entity.Add("highlight", hit.Highlight.Values.ElementAt(0).First()); entity.Add("entity", hit.Source); data.Add(entity); } response.Data = data; response.Other = string.Join(',', news.Hits.LastOrDefault().Sorts); } } else { return(NoContent()); } } else { return(NoContent()); } } catch (Exception ex) { response.SetError(ex, this._ILogger); } return(response.ToHttpResponse()); }
public Task Upgrade(IVersionContext versionContext) { var rootTaliSiteRoute = new SiteRoute { Id = "5f02cb57e63b2b3634d51373", ElemPath = "/", PageId = "5f02cb57e63b2b3634d51375", LocaleId = "default", ParentId = "5f02cb57e63b2b3634d51373", RoutePath = "/", SiteId = Constants.MAIN_SITE_ID }; var blogsListSiteRoute = new SiteRoute { Id = "5f02cb57e63b2b3634d51374", ElemPath = "blogs", PageId = "5f0aa3731558bf76447b18d0", LocaleId = "default", ParentId = "5f02cb57e63b2b3634d51373", RoutePath = "/blogs", ResolveMaps = new List <ResolveDataMap> { new ResolveDataMap { Key = "blogs", Inputs = "", Resolver = "blogs" } }, SiteId = Constants.MAIN_SITE_ID }; var blogCateSiteRoute = new SiteRoute { Id = "5f0ab7065063a011e8fc2f85", ElemPath = "*", RoutePath = "/blogs/*", WildcardKey = "blog", LocaleId = "default", PageId = "5f0aa3731558bf76447b18d1", ParentId = "5f02cb57e63b2b3634d51374", ResolveMaps = new List <ResolveDataMap> { new ResolveDataMap { Key = "blog", Inputs = "blog", Resolver = "blog" }, new ResolveDataMap { Key = "posts", Resolver = "postsOfBlog" } }, SiteId = Constants.MAIN_SITE_ID }; var postsEmptySiteRoute = new SiteRoute { Id = "5f204bc8d5ac7c6bd0dde43e", ElemPath = "posts", RoutePath = "/posts", LocaleId = "default", ParentId = "5f02cb57e63b2b3634d51373", SiteId = Constants.MAIN_SITE_ID }; var blogPostSiteRoute = new SiteRoute { Id = "5f0ab7065063a011e8fc2f86", ElemPath = "*", RoutePath = "/posts/*", WildcardKey = "blogPost", LocaleId = "default", PageId = "5f0aa3731558bf76447b18d3", ParentId = "5f204bc8d5ac7c6bd0dde43e", ResponseCaching = new ResponseCaching { Enable = true, CacheControl = "public", Duration = 10 }, ResolveMaps = new List <ResolveDataMap> { new ResolveDataMap { Key = "blogPost", Inputs = "blogPost", Resolver = "blogPost" } }, SiteId = Constants.MAIN_SITE_ID }; var blogTagsSiteRoute = new SiteRoute { Id = "5f1ef6fce9ce36726865ebc2", ElemPath = "blog-tagged", RoutePath = "/blog-tagged", LocaleId = "default", PageId = "5f1ef6fce9ce36726865ebc3", ParentId = "5f02cb57e63b2b3634d51373", ResolveMaps = new List <ResolveDataMap> { new ResolveDataMap { Key = "posts", Resolver = "postsOfTag", EnableInMemoryCache = true, CacheDuration = 60 } }, SiteId = Constants.MAIN_SITE_ID }; versionContext.InsertData(rootTaliSiteRoute); versionContext.InsertData(blogsListSiteRoute); versionContext.InsertData(blogCateSiteRoute); versionContext.InsertData(blogPostSiteRoute); versionContext.InsertData(blogTagsSiteRoute); versionContext.InsertData(postsEmptySiteRoute); return(Task.CompletedTask); }