Преглед на файлове

优化搜索页和公告列表页

懒得勤快 преди 5 дни
родител
ревизия
d8dea57d25

+ 5 - 1
src/Masuit.MyBlogs.Core/Controllers/SearchController.cs

@@ -40,7 +40,6 @@ public sealed class SearchController : BaseController
                 ViewBag.Ads = AdsService.GetByWeightedPrice(AdvertiseType.ListItem, Request.Location(), keywords: wd);
             }
 
-            ViewBag.hotSearches = new List<KeywordsRank>();
             if (posts.Total > size)
             {
                 ViewBag.RelateKeywords = SearchDetailsService.GetQuery(s => s.Keywords.Contains(wd) && s.Keywords != wd).Select(s => s.Keywords).GroupBy(s => s).OrderByDescending(g => g.Count()).Select(g => g.Key).Take(10).Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromHours(1)).ToPooledListScope();
@@ -65,6 +64,11 @@ public sealed class SearchController : BaseController
                 return RedirectToAction("Details", "Post", new { id = posts.Results[0].Id, kw = wd });
             }
 
+            ViewBag.hotSearches = new List<KeywordsRank>();
+            if (posts.Total == 0)
+            {
+                ViewBag.hotSearches = RedisHelper.Get<List<KeywordsRank>>("SearchRank:Week").Take(10).ToList();
+            }
             return View(posts);
         }
 

+ 1 - 3
src/Masuit.MyBlogs.Core/Views/Home/Index.cshtml

@@ -1,10 +1,8 @@
-@using System.Diagnostics
-@using Collections.Pooled
+@using Collections.Pooled
 @using Masuit.MyBlogs.Core.Common
 @using Masuit.MyBlogs.Core.Models.DTO
 @using Masuit.MyBlogs.Core.Models.Entity
 @using Masuit.MyBlogs.Core.Models.ViewModel
-@using Masuit.Tools
 @using Masuit.Tools.Core.Net
 @using Microsoft.AspNetCore.Http
 @model Masuit.MyBlogs.Core.Models.ViewModel.HomePageViewModel

+ 31 - 31
src/Masuit.MyBlogs.Core/Views/Notice/Index.cshtml

@@ -1,38 +1,38 @@
 @using Masuit.MyBlogs.Core.Models.DTO
 @model IList<Masuit.MyBlogs.Core.Models.DTO.NoticeDto>
 @{
-  ViewBag.Title = "网站公告栏";
-  Layout = "~/Views/Shared/_Layout.cshtml";
+    ViewBag.Title = "网站公告栏";
+    Layout = "~/Views/Shared/_Layout.cshtml";
 }
 <div class="container min-height610">
-  <ol class="breadcrumb">
-    <li>
-      <a asp-action="Index" asp-controller="Home">首页</a>
-    </li>
-    <li class="current">
-      <em>@ViewBag.Title</em>
-    </li>
-  </ol>
-  <div aria-multiselectable="true" class="panel-group" id="accordion" role="tablist">
-    @foreach (var n in Model) {
-      <div class="panel panel-default">
-        <div class="panel-heading" id="[email protected]" role="tab">
-          <h4 class="panel-title">
-            <a aria-controls="[email protected]" aria-expanded="false" class="collapsed" data-parent="#accordion" data-toggle="collapse" href="#[email protected]" role="button">
-              @n.ModifyDate.ToString("yyyy-MM-dd") @n.Title
-            </a>
-          </h4>
-        </div>
-        <div aria-labelledby="[email protected]" class="collapse panel-collapse" id="[email protected]" role="tabpanel">
-          <div class="panel-body">
-            @Html.Raw(n.Content)
-          </div>
-        </div>
-      </div>
+    <ol class="breadcrumb">
+        <li>
+            <a asp-action="Index" asp-controller="Home">首页</a>
+        </li>
+        <li class="current">
+            <em>@ViewBag.Title</em>
+        </li>
+    </ol>
+    <div class="main-container">
+        @foreach (var n in Model)
+        {
+            <div class="site-announcement-bar" style="margin:10px 0">
+                <div class="announcement-container">
+                    <div class="announcement-header">
+                        <span class="announcement-title">@n.Title</span>
+                        <span class="announcement-time">@n.ModifyDate.ToString("yyyy-MM-dd")</span>
+                    </div>
+                    <div class="announcement-content">
+                        @Html.Raw(n.Content.Replace("img src=", $"img class='lazyload' title='{CommonHelper.SystemSettings["Title"]}' alt='{CommonHelper.SystemSettings["Title"]}' decoding='async' loading='lazy' data-src="))
+                    </div>
+                </div>
+            </div>
+        }
+
+    </div>
+
+    @{
+        await Html.RenderPartialAsync("_Pagination", ViewData["page"]);
+        await Html.RenderPartialAsync("_ArticleListAdvertisement", (AdvertisementDto)ViewBag.Ads);
     }
-  </div>
-  @{
-    await Html.RenderPartialAsync("_Pagination", ViewData["page"]);
-    await Html.RenderPartialAsync("_ArticleListAdvertisement", (AdvertisementDto) ViewBag.Ads);
-  }
 </div>

+ 21 - 21
src/Masuit.MyBlogs.Core/Views/Notice/Index_Admin.cshtml

@@ -13,29 +13,29 @@
       <em>@ViewBag.Title</em>
     </li>
   </ol>
-  <a class="btn btn-info" href="/dashboard/notice/write">发布新公告</a>
-  <div aria-multiselectable="true" class="panel-group" id="accordion" role="tablist">
-    @foreach (var n in Model) {
-      <div class="panel panel-default">
-        <div class="panel-heading" id="[email protected]" role="tab">
-          <h4 class="panel-title">
-            <a aria-controls="[email protected]" aria-expanded="false" class="collapsed" data-parent="#accordion" data-toggle="collapse" href="#[email protected]" role="button">
-              @n.ModifyDate.ToString("yyyy-MM-dd") @n.Title
-            </a>
-          </h4>
-        </div>
-        <div aria-labelledby="[email protected]" class="collapse panel-collapse" id="[email protected]" role="tabpanel">
-          <div class="panel-body">
-            <div class="btn-group">
-              <a class="btn btn-info" onclick="del(@n.Id,'@n.Title')">删除</a>
-              <a class="btn btn-danger" href="/dashboard/notice/[email protected]" target="_blank">修改</a>
+  <a class="like-btn" href="/dashboard/notice/write">发布新公告</a>
+    <div class="main-container">
+        @foreach (var n in Model)
+        {
+            <div class="site-announcement-bar" style="margin:10px 0">
+            <div class="announcement-container">
+                <div class="announcement-header">
+                    <span class="announcement-title">@n.Title</span>
+                    <span class="announcement-time">@n.ModifyDate.ToString("yyyy-MM-dd")</span>
+                </div>
+                <div class="article-ops-row">
+                    <a class="article-op-btn" onclick="del(@n.Id,'@n.Title')">删除</a>
+                    <a class="article-op-btn" href="/dashboard/notice/[email protected]" target="_blank">修改</a>
+                </div>
+                <div class="announcement-content">
+                    @Html.Raw(n.Content.Replace("img src=", $"img class='lazyload' title='{CommonHelper.SystemSettings["Title"]}' alt='{CommonHelper.SystemSettings["Title"]}' decoding='async' loading='lazy' data-src="))
+                </div>
             </div>
-            @Html.Raw(n.Content)
-          </div>
         </div>
-      </div>
-    }
-  </div>
+        }
+        
+    </div>
+
   @{
     await Html.RenderPartialAsync("_Pagination", ViewData["page"]);
     await Html.RenderPartialAsync("_ArticleListAdvertisement", (AdvertisementDto) ViewBag.Ads);

+ 46 - 78
src/Masuit.MyBlogs.Core/Views/Search/Search.cshtml

@@ -1,8 +1,6 @@
-@using Masuit.MyBlogs.Core.Common
-@using Masuit.MyBlogs.Core.Models.DTO
+@using Masuit.MyBlogs.Core.Models.DTO
 @using Masuit.MyBlogs.Core.Models.ViewModel
 @using Masuit.Tools
-@using Masuit.Tools.Core.Net
 @using Microsoft.AspNetCore.Mvc.Rendering
 @model SearchResult<Masuit.MyBlogs.Core.Models.DTO.PostDto>
 @{
@@ -37,15 +35,12 @@
             </div>
           </form>
           @if (hotSearches.Any()) {
-            <span>搜索推荐:</span>
-            foreach (var item in hotSearches) {
-              @Html.ActionLink(item.Keywords + "(" + item.Count + ")", "Search", new {
-                wd = item.Keywords
-              }, new {
-                @class = "label label-danger"
-              })
-              <span> </span>
-            }
+              <div class="copyright-card">
+                <h2 class="recommend-title">搜索推荐:</h2>
+                @for (var index = 0; index < hotSearches.Count; index++) {
+                    <a asp-action="Search" asp-route-wd="@hotSearches[index].Keywords" class="margin-bot10 tag-cloud-item tag@(index+1)">@hotSearches[index].Keywords (@hotSearches[index].Count)</a>
+                }
+              </div>
           }
         </div>
         @if (Model.Results.Any()) {
@@ -57,7 +52,7 @@
             }
 
             var p = Model.Results[i];
-            <div class="article-card" style="margin-top: 15px;">
+            <div class="article-card" style="margin: 15px 0;">
               <div class="article-content">
                 <a asp-action="Details" asp-controller="Post" asp-route-id="@p.Id" asp-route-kw="@ViewBag.Keyword" class="article-title" target="_blank">
                   @Html.Raw(p.Title)
@@ -84,11 +79,10 @@
           }
         }
         @if (relateKeywords?.Count > 0) {
-          <div class="margin-bot10">
-            <h3>相关搜索:</h3>
-            @foreach (var kw in relateKeywords) {
-              <a asp-action="Search" asp-route-wd="@kw">@kw</a>
-              <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
+          <div class="copyright-card">
+            <h2 class="recommend-title">相关搜索:</h2>
+            @for (var index = 0; index < relateKeywords.Count; index++) {
+                <a asp-action="Search" asp-route-wd="@relateKeywords[index]" class="margin-bot10 tag-cloud-item tag@(index+1)">@relateKeywords[index]</a>
             }
           </div>
         }
@@ -112,71 +106,45 @@
           }
         }
         @if (pages > 1) {
-          <ul class="margin-clear pagination">
-            @if (current == 1) {
-              <li class="disabled">
-                <a>首页</a>
-              </li>
-              <li class="disabled">
-                <a aria-label="Previous">
-                  <span aria-hidden="true">&laquo;</span>
-                </a>
-              </li>
-            } else {
-              <li>
-                <a aria-label="Previous" asp-action="Search" asp-route-wd="@ViewBag.Keyword">首页</a>
-              </li>
-              <li>
-                <a aria-label="Previous" asp-action="Search" asp-route-page="@(page - 1 <= 0 ? 1 : page - 1)" asp-route-wd="@ViewBag.Keyword">
-                  <span aria-hidden="true">&laquo;</span>
+          <div class="article-list-footer">
+            <div class="pagination">
+              @if (current == 1) {
+                <button class="disabled page-btn" disabled="disabled">&laquo;</button>
+              } else {
+                <a asp-action="Search" asp-route-wd="@ViewBag.Keyword">
+                  <button class="page-btn">首页</button>
                 </a>
-              </li>
-            }
-            @if (pageStart > 1) {
-              <li class="disabled">
-                <a aria-label="Previous">
-                  <span aria-hidden="true">...</span>
+                <a asp-action="Search" asp-route-page="@(page - 1 <= 0 ? 1 : page - 1)" asp-route-wd="@ViewBag.Keyword">
+                  <button class="page-btn">&laquo;</button>
                 </a>
-              </li>
-            }
-            @for (int i = pageStart; i <= pageEnd; i++) {
-              if (i == current) {
-                <li class="disabled">
-                  <a>@i</a>
-                </li>
-              } else {
-                <li>
-                  <a asp-action="Search" asp-route-page="@i" asp-route-wd="@ViewBag.Keyword">@i</a>
-                </li>
               }
-            }
-            @if (pageEnd < pages) {
-              <li class="disabled">
-                <a aria-label="Previous">
-                  <span aria-hidden="true">...</span>
-                </a>
-              </li>
-            }
-            @if (current == pages) {
-              <li class="disabled">
-                <a>
-                  <span aria-hidden="true">&raquo;</span>
+              @if (pageStart > 1) {
+                <span class="ellipsis">...</span>
+              }
+              @for (int i = pageStart; i <= pageEnd; i++) {
+                if (i == current) {
+                  <button class="active page-btn">@i</button>
+                } else {
+                  <a asp-action="Search" asp-route-page="@i" asp-route-wd="@ViewBag.Keyword">
+                    <button class="page-btn">@i</button>
+                  </a>
+                }
+              }
+              @if (pageEnd < pages) {
+                <span class="ellipsis">...</span>
+              }
+              @if (current == pages) {
+                <button class="disabled page-btn" disabled="disabled">&raquo;</button>
+              } else {
+                <a asp-action="Search" asp-route-page="@(current + 1)" asp-route-wd="@ViewBag.Keyword">
+                  <button class="page-btn">&raquo;</button>
                 </a>
-              </li>
-              <li class="disabled">
-                <a>最后一页</a>
-              </li>
-            } else {
-              <li>
-                <a aria-label="Next" asp-action="Search" asp-route-page="@(current + 1)" asp-route-wd="@ViewBag.Keyword">
-                  <span aria-hidden="true">&raquo;</span>
+                <a asp-action="Search" asp-route-page="@pages" asp-route-wd="@ViewBag.Keyword">
+                  <button class="page-btn">最后一页</button>
                 </a>
-              </li>
-              <li>
-                <a aria-label="Next" asp-action="Search" asp-route-page="@pages" asp-route-wd="@ViewBag.Keyword">最后一页</a>
-              </li>
-            }
-          </ul>
+              }
+            </div>
+          </div>
         }
       </div>
     </div>

+ 2 - 6
src/Masuit.MyBlogs.Core/Views/Shared/_ArticleListItem.cshtml

@@ -1,11 +1,7 @@
 @using Masuit.MyBlogs.Core.Common
 @using Masuit.Tools.Html
-@using FreeRedis
 @model Masuit.MyBlogs.Core.Models.DTO.PostDto
-@inject IRedisClient CacheManager
-@{
-  var online = await CacheManager.SCardAsync("PostOnline:" + Model.Id);
-}
+
 <div class="article-card">
   @{
     //取第一张图片
@@ -13,7 +9,7 @@
     if (!string.IsNullOrEmpty(imgSrc)) {
       imgSrc += "?width=240&format=webp&quality=50";
       <div class="cover">
-        <img alt="@CommonHelper.SystemSettings["Title"]" class="lazyload thumb" data-src="@imgSrc?width=240&format=webp&quality=50" decoding="async" loading="lazy" title="@CommonHelper.SystemSettings["Title"] ">
+        <img alt="@Model.Title" class="lazyload thumb" data-src="@imgSrc?width=240&format=webp&quality=50" decoding="async" loading="lazy" title="@Model.Title">
       </div>
     }
   }

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Shared/_ArticleListItem_Admin.cshtml

@@ -14,7 +14,7 @@
     if (!string.IsNullOrEmpty(imgSrc)) {
       imgSrc += "?width=240&format=webp&quality=50";
       <div class="cover">
-        <img alt="@CommonHelper.SystemSettings["Title"]" class="lazyload thumb" data-src="@imgSrc?width=240&format=webp&quality=50" decoding="async" loading="lazy" title="@CommonHelper.SystemSettings["Title"] ">
+        <img alt="@Model.Title" class="lazyload thumb" data-src="@imgSrc?width=240&format=webp&quality=50" decoding="async" loading="lazy" title="@Model.Title">
       </div>
     }
   }