浏览代码

广告优化

懒得勤快 5 年之前
父节点
当前提交
bcf9abc78f

+ 2 - 2
src/Masuit.MyBlogs.Core/Configs/MappingProfile.cs

@@ -86,8 +86,8 @@ namespace Masuit.MyBlogs.Core.Configs
             CreateMap<PostMergeRequest, Post>().ForMember(p => p.Id, e => e.Ignore()).ForMember(p => p.Status, e => e.Ignore()).ReverseMap();
             CreateMap<Post, PostMergeRequestDto>().ReverseMap();
 
-            CreateMap<Advertisement, AdvertisementViewModel>().ForMember(a => a.CategoryName, e => e.MapFrom(a => a.Category.Name));
-            CreateMap<AdvertisementDto, Advertisement>().ForMember(a => a.CategoryId, e => e.MapFrom(d => string.IsNullOrEmpty(d.CategoryId) ? null : d.CategoryId)).ForMember(a => a.Status, e => e.Ignore()).ForMember(a => a.UpdateTime, e => e.MapFrom(a => DateTime.Now));
+            CreateMap<Advertisement, AdvertisementViewModel>();
+            CreateMap<AdvertisementDto, Advertisement>().ForMember(a => a.Status, e => e.Ignore()).ForMember(a => a.UpdateTime, e => e.MapFrom(a => DateTime.Now));
         }
     }
 }

+ 14 - 2
src/Masuit.MyBlogs.Core/Controllers/AdvertisementController.cs

@@ -1,7 +1,9 @@
-using AutoMapper.QueryableExtensions;
+using AngleSharp.Text;
+using AutoMapper.QueryableExtensions;
 using Masuit.LuceneEFCore.SearchEngine.Linq;
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
+using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
@@ -9,6 +11,7 @@ using Masuit.MyBlogs.Core.Models.ViewModel;
 using Masuit.Tools;
 using Masuit.Tools.Core.Net;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore.Internal;
 using System;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
@@ -20,6 +23,8 @@ namespace Masuit.MyBlogs.Core.Controllers
     [Route("partner/[action]")]
     public class AdvertisementController : BaseController
     {
+        public ICategoryService CategoryService { get; set; }
+
         /// <summary>
         /// 前往
         /// </summary>
@@ -55,6 +60,13 @@ namespace Masuit.MyBlogs.Core.Controllers
             var query = AdsService.GetQuery(where);
             var total = query.Count();
             var list = query.OrderByDescending(p => p.Price).ThenByDescending(a => a.Weight).Skip((page - 1) * size).Take(size).ProjectTo<AdvertisementViewModel>(MapperConfig).ToList();
+            var cids = list.Where(m => !string.IsNullOrEmpty(m.CategoryIds)).SelectMany(m => m.CategoryIds.Split(",", StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)).Distinct().ToArray();
+            var dic = CategoryService.GetQuery(c => cids.Contains(c.Id)).ToDictionary(c => c.Id + "", c => c.Name);
+            foreach (var ad in list.Where(ad => !string.IsNullOrEmpty(ad.CategoryIds)))
+            {
+                ad.CategoryNames = ad.CategoryIds.Split(",").Select(c => dic[c]).Join(",");
+            }
+
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, total);
         }
@@ -67,7 +79,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [HttpPost, MyAuthorize]
         public async Task<IActionResult> Save(AdvertisementDto model)
         {
-            model.CategoryId = model.CategoryId?.Replace("null", "");
+            model.CategoryIds = model.CategoryIds?.Replace("null", "");
             var entity = await AdsService.GetByIdAsync(model.Id);
             if (entity != null)
             {

+ 1 - 0
src/Masuit.MyBlogs.Core/Controllers/CommentController.cs

@@ -17,6 +17,7 @@ using Microsoft.EntityFrameworkCore.Internal;
 using Microsoft.Net.Http.Headers;
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;

+ 1 - 0
src/Masuit.MyBlogs.Core/Controllers/MsgController.cs

@@ -16,6 +16,7 @@ using Microsoft.EntityFrameworkCore.Internal;
 using Microsoft.Net.Http.Headers;
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text.RegularExpressions;
 

+ 12 - 1
src/Masuit.MyBlogs.Core/Extensions/MyAuthorizeAttribute.cs

@@ -1,6 +1,17 @@
-using Microsoft.AspNetCore.Authorization;
+using Masuit.MyBlogs.Core.Configs;
+using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
+using Masuit.MyBlogs.Core.Models.DTO;
+using Masuit.MyBlogs.Core.Models.ViewModel;
+using Masuit.Tools.Core.Net;
+using Masuit.Tools.Security;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Filters;
+using Microsoft.Extensions.DependencyInjection;
+using System;
 using System.Linq;
+using System.Web;
 
 namespace Masuit.MyBlogs.Core.Extensions
 {

+ 0 - 1
src/Masuit.MyBlogs.Core/Infrastructure/DataContext.cs

@@ -24,7 +24,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure
             base.OnModelCreating(modelBuilder);
             modelBuilder.Entity<Category>().HasMany(e => e.Post).WithOne(e => e.Category).OnDelete(DeleteBehavior.Cascade);
             modelBuilder.Entity<Category>().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Category).OnDelete(DeleteBehavior.Cascade);
-            modelBuilder.Entity<Category>().HasMany(e => e.Advertisements).WithOne(e => e.Category).IsRequired(false).HasForeignKey(a => a.CategoryId).OnDelete(DeleteBehavior.SetNull);
 
             modelBuilder.Entity<Post>().HasMany(e => e.Comment).WithOne(e => e.Post).OnDelete(DeleteBehavior.Cascade);
             modelBuilder.Entity<Post>().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Post).OnDelete(DeleteBehavior.Cascade);

+ 19 - 3
src/Masuit.MyBlogs.Core/Infrastructure/Services/AdvertisementService.cs

@@ -17,6 +17,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
     public partial class AdvertisementService : BaseService<Advertisement>, IAdvertisementService
     {
         public ICacheManager<List<Advertisement>> CacheManager { get; set; }
+        public ICacheManager<bool> ValueCacheManager { get; set; }
 
         public AdvertisementService(IBaseRepository<Advertisement> repository, ISearchEngine<DataContext> searchEngine, ILuceneIndexSearcher searcher) : base(repository, searchEngine, searcher)
         {
@@ -45,7 +46,15 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             Expression<Func<Advertisement, bool>> where = a => a.Types.Contains(type.ToString("D")) && a.Status == Status.Available;
             if (cid.HasValue)
             {
-                where = where.And(a => a.CategoryId == cid || a.CategoryId == null);
+                var scid = cid.ToString();
+                if (ValueCacheManager.GetOrAdd(scid, s => Any(a => a.CategoryIds.Contains(scid))))
+                {
+                    where = where.And(a => a.CategoryIds.Contains(scid) || a.CategoryIds == null);
+                }
+                else
+                {
+                    where = where.And(a => a.CategoryIds == null);
+                }
             }
 
             return CacheManager.GetOrAdd($"{count}{type}{cid}", _ => GetQuery(where).AsEnumerable().Select(a => new WeightedItem<Advertisement>(a, a.Weight)).WeightedItems(count));
@@ -74,9 +83,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             Expression<Func<Advertisement, bool>> where = a => a.Types.Contains(type.ToString("D")) && a.Status == Status.Available;
             if (cid.HasValue)
             {
-                where = where.And(a => a.CategoryId == cid || a.CategoryId == null);
+                var scid = cid.ToString();
+                if (ValueCacheManager.GetOrAdd(scid, s => Any(a => a.CategoryIds.Contains(scid))))
+                {
+                    where = where.And(a => a.CategoryIds.Contains(scid) || a.CategoryIds == null);
+                }
+                else
+                {
+                    where = where.And(a => a.CategoryIds == null);
+                }
             }
-
             return CacheManager.GetOrAdd($"{count}{type}{cid}", _ => GetQuery(where).AsEnumerable().Select(a => new WeightedItem<Advertisement>(a, (int)a.Price)).WeightedItems(count));
         }
     }

+ 1 - 1
src/Masuit.MyBlogs.Core/Models/DTO/AdvertisementDto.cs

@@ -48,6 +48,6 @@ namespace Masuit.MyBlogs.Core.Models.DTO
         [Required(ErrorMessage = "类型不能为空,至少需要选择一个类型")]
         public string Types { get; set; }
 
-        public string CategoryId { get; set; }
+        public string CategoryIds { get; set; }
     }
 }

+ 1 - 2
src/Masuit.MyBlogs.Core/Models/Entity/Advertisement.cs

@@ -74,7 +74,6 @@ namespace Masuit.MyBlogs.Core.Models.Entity
         /// </summary>
         public int ViewCount { get; set; }
 
-        public int? CategoryId { get; set; }
-        public virtual Category Category { get; set; }
+        public string CategoryIds { get; set; }
     }
 }

+ 0 - 1
src/Masuit.MyBlogs.Core/Models/Entity/Category.cs

@@ -29,6 +29,5 @@ namespace Masuit.MyBlogs.Core.Models.Entity
 
         public virtual ICollection<Post> Post { get; set; }
         public virtual ICollection<PostHistoryVersion> PostHistoryVersion { get; set; }
-        public virtual ICollection<Advertisement> Advertisements { get; set; }
     }
 }

+ 2 - 2
src/Masuit.MyBlogs.Core/Models/ViewModel/AdvertisementViewModel.cs

@@ -63,7 +63,7 @@ namespace Masuit.MyBlogs.Core.Models.ViewModel
         /// </summary>
         public int ViewCount { get; set; }
 
-        public int? CategoryId { get; set; }
-        public string CategoryName { get; set; }
+        public string CategoryIds { get; set; }
+        public string CategoryNames { get; set; }
     }
 }

+ 6 - 0
src/Masuit.MyBlogs.Core/bundleconfig.json

@@ -70,5 +70,11 @@
     "inputFiles": [
       "wwwroot/Assets/UEditor/ueditor.config.admin.js"
     ]
+  },
+  {
+    "outputFileName": "wwwroot/ng-views/controllers/partner.min.js",
+    "inputFiles": [
+      "wwwroot/ng-views/controllers/partner.js"
+    ]
   }
 ]

+ 2 - 2
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/partner.js

@@ -49,7 +49,7 @@
 				$scope.cat = data.Data;
 				$('.ui.dropdown.category').dropdown({
 					onChange: function (value) {
-						$scope.partner.CategoryId = value;
+						$scope.partner.CategoryIds = value;
 					},
 					message: {
 						maxSelections: '最多选择 {maxCount} 项',
@@ -113,7 +113,7 @@
         $timeout(function () {
 		    $('.ui.dropdown.category').dropdown('clear');
 		    $('.ui.dropdown.types').dropdown('clear');
-			$('.ui.dropdown.category').dropdown('set selected', [item.CategoryId]);
+			$('.ui.dropdown.category').dropdown('set selected', (item.CategoryIds+"").split(','));
 		    $('.ui.dropdown.types').dropdown('set selected', item.Types.split(','));
 		}, 10);
 		layer.open({

文件差异内容过多而无法显示
+ 0 - 0
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/partner.min.js


+ 3 - 3
src/Masuit.MyBlogs.Core/wwwroot/ng-views/views/partner.html

@@ -37,7 +37,7 @@
                 {{row.ViewCount}}
             </td>
             <td title="'分类'">
-                {{row.CategoryName}}
+                {{row.CategoryNames}}
             </td>
             <td title="'创建时间'">
                 {{row.CreateTime|date:'yyyy-MM-dd HH:mm:ss'}}
@@ -120,7 +120,7 @@
             <div class="form-group">
                 <div class="input-group">
                     <label for="desc" class="input-group-addon control-label">分类:</label>
-                    <div class="ui fluid top search selection dropdown category">
+                    <div class="ui fluid top search multiple selection dropdown category">
                         <input name="category" type="hidden" id="category">
                         <i class="dropdown icon"></i>
                         <div class="default text">请选择分类</div>
@@ -209,7 +209,7 @@
                             </div>
                         </div>
                     </td>
-                    <td>分类:{{partner.CategoryName}}</td>
+                    <td>分类:{{partner.CategoryNames}}</td>
                 </tr>
                 <tr>
                     <td>宣传大图片</td>

部分文件因为文件数量过多而无法显示