1
0
Эх сурвалжийг харах

文章支持按地区投放

懒得勤快 5 жил өмнө
parent
commit
ee54cf06cb

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

@@ -49,7 +49,7 @@ namespace Masuit.MyBlogs.Core.Configs
             CreateMap<NoticeCommand, NoticeDto>().ReverseMap();
             CreateMap<Notice, NoticeViewModel>().ForMember(c => c.PostDate, e => e.MapFrom(c => c.PostDate.ToString("yyyy-MM-dd HH:mm:ss"))).ForMember(c => c.ModifyDate, e => e.MapFrom(c => c.ModifyDate.ToString("yyyy-MM-dd HH:mm:ss"))).ReverseMap();
 
-            CreateMap<Post, PostCommand>().ReverseMap();
+            CreateMap<PostCommand, Post>().ReverseMap();
             CreateMap<Post, PostModelBase>();
             CreateMap<Post, PostHistoryVersion>().ForMember(p => p.Id, e => e.Ignore()).ForMember(v => v.PostId, e => e.MapFrom(p => p.Id));
             CreateMap<Post, PostDto>().ForMember(p => p.CategoryName, e => e.MapFrom(p => p.Category.Name)).ForMember(p => p.CommentCount, e => e.MapFrom(p => p.Comment.Count(c => c.Status == Status.Published))).ReverseMap();

+ 8 - 5
src/Masuit.MyBlogs.Core/Controllers/ActivityController.cs

@@ -37,21 +37,24 @@ namespace Masuit.MyBlogs.Core.Controllers
             return Ok(RedisHelper.SMembers("Share:" + email).Length);
         }
 
-        public ActionResult Users(string type = "json")
+        public ActionResult Users(string type = "json", int count = 5)
         {
-            var keys = RedisHelper.Keys("Share:*").Select(s => s[6..].MaskEmail()).ToList();
+            var keys = RedisHelper.Keys("Share:*").ToDictionary(s => s[6..].MaskEmail(), s => RedisHelper.SMembers(s).Length).OrderByDescending(p => p.Value).ToList();
             switch (type)
             {
                 case "svg":
-                    var svg = new SvgDocument();
+                    var svg = new SvgDocument()
+                    {
+                        Height = keys.Count * 19
+                    };
                     var svgText = new SvgText();
                     for (var i = 0; i < keys.Count; i++)
                     {
                         var s = keys[i];
                         svgText.Children.Add(new SvgTextSpan()
                         {
-                            Text = s,
-                            Fill = new SvgColourServer(Color.Red),
+                            Text = s.Key,
+                            Fill = new SvgColourServer(s.Value >= count ? Color.Red : Color.Black),
                             FontWeight = SvgFontWeight.Bold,
                             Y = new SvgUnitCollection()
                             {

+ 19 - 1
src/Masuit.MyBlogs.Core/Controllers/BaseController.cs

@@ -46,7 +46,25 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <summary>
         /// 客户端的真实IP
         /// </summary>
-        public string ClientIP => HttpContext.Connection.RemoteIpAddress.ToString();
+        public string ClientIP
+        {
+            get
+            {
+                var ip = HttpContext.Connection.RemoteIpAddress.ToString();
+                var trueip = Request.Headers[AppConfig.TrueClientIPHeader].ToString();
+                if (!string.IsNullOrEmpty(trueip) && ip != trueip)
+                {
+                    ip = trueip;
+                }
+                return ip;
+            }
+        }
+
+        /// <summary>
+        /// 普通访客是否token合法
+        /// </summary>
+        public bool VisitorTokenValid => Request.Cookies["Email"].MDString3(AppConfig.BaiduAK).Equals(Request.Cookies["FullAccessToken"]);
+
 
         public IMapper Mapper { get; set; }
         public MapperConfiguration MapperConfig { get; set; }

+ 19 - 0
src/Masuit.MyBlogs.Core/Controllers/HomeController.cs

@@ -1,4 +1,5 @@
 using Masuit.LuceneEFCore.SearchEngine.Linq;
+using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Infrastructure.Repository;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
@@ -7,6 +8,8 @@ using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.MyBlogs.Core.Models.ViewModel;
+using Masuit.Tools;
+using Masuit.Tools.Models;
 using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Mvc;
 using System;
@@ -58,6 +61,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             var postsQuery = PostService.GetQuery<PostDto>(p => (p.Status == Status.Published || CurrentUser.IsAdmin)); //准备文章的查询
             var posts = await postsQuery.Where(p => !p.IsFixedTop).OrderBy(OrderBy.ModifyDate.GetDisplay() + " desc").ToCachedPagedListAsync(1, 15);
             posts.Data.InsertRange(0, postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate).ToList());
+            CheckPermission(posts);
             var viewModel = await GetIndexPageViewModel();
             viewModel.Banner = banners;
             viewModel.Posts = posts;
@@ -66,6 +70,17 @@ namespace Masuit.MyBlogs.Core.Controllers
             return View(viewModel);
         }
 
+        private void CheckPermission(PagedList<PostDto> posts)
+        {
+            var location = ClientIP.GetIPLocation();
+            posts.Data.RemoveAll(p => p.LimitMode switch
+            {
+                PostLimitMode.AllowRegion => !location.Contains(p.Regions.Split(',', StringSplitOptions.RemoveEmptyEntries)) && !CurrentUser.IsAdmin && !VisitorTokenValid,
+                PostLimitMode.ForbidRegion => location.Contains(p.Regions.Split(',', StringSplitOptions.RemoveEmptyEntries)) && !CurrentUser.IsAdmin && !VisitorTokenValid,
+                _ => false
+            });
+        }
+
         /// <summary>
         /// 文章列表页
         /// </summary>
@@ -84,6 +99,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 posts.Data.InsertRange(0, postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate).ToList());
             }
 
+            CheckPermission(posts);
             viewModel.Posts = posts;
             viewModel.PageParams = new Pagination(page, size, posts.TotalCount, orderBy);
             return View(viewModel);
@@ -101,6 +117,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Tag(string id, [Optional] OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
             var posts = await PostService.GetQuery<PostDto>(p => p.Label.Contains(id) && (p.Status == Status.Published || CurrentUser.IsAdmin)).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync(page, size);
+            CheckPermission(posts);
             var viewModel = await GetIndexPageViewModel();
             ViewBag.Tag = id;
             viewModel.Posts = posts;
@@ -122,6 +139,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             Expression<Func<Post, bool>> where = p => p.Author.Equals(author) || p.Modifier.Equals(author) || p.Email.Equals(author) || p.PostHistoryVersion.Any(v => v.Modifier.Equals(author) || v.ModifierEmail.Equals(author));
             where = where.And(p => p.Status == Status.Published || CurrentUser.IsAdmin);
             var posts = PostService.GetQuery<PostDto>(where).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedList(page, size);
+            CheckPermission(posts);
             var viewModel = await GetIndexPageViewModel();
             ViewBag.Author = author;
             ViewBag.Total = posts.TotalCount;
@@ -144,6 +162,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var cat = await CategoryService.GetByIdAsync(id) ?? throw new NotFoundException("文章分类未找到");
             var posts = PostService.GetQuery<PostDto>(p => p.CategoryId == cat.Id && (p.Status == Status.Published || CurrentUser.IsAdmin)).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedList(page, size);
+            CheckPermission(posts);
             var viewModel = await GetIndexPageViewModel();
             viewModel.Posts = posts;
             ViewBag.Category = cat;

+ 32 - 1
src/Masuit.MyBlogs.Core/Controllers/PostController.cs

@@ -62,6 +62,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Details(int id, string kw)
         {
             var post = await PostService.GetAsync(p => p.Id == id && (p.Status == Status.Published || CurrentUser.IsAdmin)) ?? throw new NotFoundException("文章未找到");
+            CheckPermission(post);
             ViewBag.Keyword = post.Keyword + "," + post.Label;
             var modifyDate = post.ModifyDate;
             ViewBag.Next = PostService.GetFromCache<DateTime, PostModelBase>(p => p.ModifyDate > modifyDate && (p.Status == Status.Published || CurrentUser.IsAdmin), p => p.ModifyDate);
@@ -96,6 +97,28 @@ namespace Masuit.MyBlogs.Core.Controllers
             return View(post);
         }
 
+        private void CheckPermission(Post post)
+        {
+            var location = ClientIP.GetIPLocation();
+            switch (post.LimitMode)
+            {
+                case PostLimitMode.AllowRegion:
+                    if (!location.Contains(post.Regions.Split(',', StringSplitOptions.RemoveEmptyEntries)) && !CurrentUser.IsAdmin && !VisitorTokenValid)
+                    {
+                        throw new NotFoundException("文章未找到");
+                    }
+
+                    break;
+                case PostLimitMode.ForbidRegion:
+                    if (location.Contains(post.Regions.Split(',', StringSplitOptions.RemoveEmptyEntries)) && !CurrentUser.IsAdmin && !VisitorTokenValid)
+                    {
+                        throw new NotFoundException("文章未找到");
+                    }
+
+                    break;
+            }
+        }
+
         /// <summary>
         /// 文章历史版本
         /// </summary>
@@ -107,6 +130,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> History(int id, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 20)
         {
             var post = await PostService.GetAsync(p => p.Id == id && (p.Status == Status.Published || CurrentUser.IsAdmin)) ?? throw new NotFoundException("文章未找到");
+            CheckPermission(post);
             ViewBag.Primary = post;
             var list = PostHistoryVersionService.GetPages(page, size, v => v.PostId == id, v => v.ModifyDate, false);
             foreach (var item in list.Data)
@@ -128,6 +152,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> HistoryVersion(int id, int hid)
         {
             var post = await PostHistoryVersionService.GetAsync(v => v.Id == hid) ?? throw new NotFoundException("文章未找到");
+            CheckPermission(post.Post);
             var next = await PostHistoryVersionService.GetAsync(p => p.PostId == id && p.ModifyDate > post.ModifyDate, p => p.ModifyDate);
             var prev = await PostHistoryVersionService.GetAsync(p => p.PostId == id && p.ModifyDate < post.ModifyDate, p => p.ModifyDate, false);
             ViewBag.Next = next;
@@ -147,6 +172,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> CompareVersion(int id, int v1, int v2)
         {
             var post = await PostService.GetAsync(p => p.Id == id && (p.Status == Status.Published || CurrentUser.IsAdmin));
+            CheckPermission(post);
             var main = post.Mapper<PostHistoryVersion>() ?? throw new NotFoundException("文章未找到");
             var left = v1 <= 0 ? main : await PostHistoryVersionService.GetAsync(v => v.Id == v1) ?? throw new NotFoundException("文章未找到");
             var right = v2 <= 0 ? main : await PostHistoryVersionService.GetAsync(v => v.Id == v2) ?? throw new NotFoundException("文章未找到");
@@ -651,7 +677,12 @@ namespace Masuit.MyBlogs.Core.Controllers
             post.Content = await ImagebedClient.ReplaceImgSrc(post.Content.Trim().ClearImgAttributes());
             if (!CategoryService.Any(c => c.Id == post.CategoryId && c.Status == Status.Available))
             {
-                return ResultData(null, message: "请选择一个分类");
+                return ResultData(null, false, "请选择一个分类");
+            }
+
+            if (post.LimitMode > 0 && string.IsNullOrEmpty(post.Regions))
+            {
+                return ResultData(null, false, "请输入投放的地区");
             }
 
             if (string.IsNullOrEmpty(post.Label?.Trim()) || post.Label.Equals("null"))

+ 6 - 0
src/Masuit.MyBlogs.Core/Controllers/ToolsController.cs

@@ -1,5 +1,6 @@
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Configs;
+using Masuit.Tools;
 using Masuit.Tools.Core.Net;
 using Masuit.Tools.Models;
 using Microsoft.AspNetCore.Http;
@@ -41,6 +42,11 @@ namespace Masuit.MyBlogs.Core.Controllers
                 ip = ClientIP;
             }
 
+            if (ip.IsPrivateIP())
+            {
+                return Ok("内网IP");
+            }
+
             ViewBag.IP = ip;
             var location = CommonHelper.MaxmindReader.City(ip).Location;
             var address = await ip.GetPhysicsAddressInfo() ?? new PhysicsAddress()

+ 43 - 34
src/Masuit.MyBlogs.Core/Controllers/UploadController.cs

@@ -96,36 +96,46 @@ namespace Masuit.MyBlogs.Core.Controllers
         }
         private async Task<string> ConvertToHtml(IFormFile file)
         {
-            await using var ms = file.OpenReadStream();
-            await using var fs = new FileStream(Path.Combine(Environment.GetEnvironmentVariable("temp") ??
-                "upload", file.FileName), FileMode.OpenOrCreate, FileAccess.ReadWrite);
-            await ms.CopyToAsync(fs);
-            using var doc = WordprocessingDocument.Open(fs, true);
-            var pageTitle = file.FileName;
-            var part = doc.CoreFilePropertiesPart;
-            if (part != null)
+            var docfile = Path.Combine(Environment.GetEnvironmentVariable("temp") ?? "upload", file.FileName);
+            try
             {
-                pageTitle ??= (string)part.GetXDocument().Descendants(DC.title).FirstOrDefault();
-            }
+                await using var ms = file.OpenReadStream();
+                await using var fs = new FileStream(docfile, FileMode.OpenOrCreate, FileAccess.ReadWrite);
+                await ms.CopyToAsync(fs);
+                using var doc = WordprocessingDocument.Open(fs, true);
+                var pageTitle = file.FileName;
+                var part = doc.CoreFilePropertiesPart;
+                if (part != null)
+                {
+                    pageTitle ??= (string)part.GetXDocument().Descendants(DC.title).FirstOrDefault();
+                }
 
-            var settings = new HtmlConverterSettings()
+                var settings = new HtmlConverterSettings()
+                {
+                    PageTitle = pageTitle,
+                    FabricateCssClasses = false,
+                    RestrictToSupportedLanguages = false,
+                    RestrictToSupportedNumberingFormats = false,
+                    ImageHandler = imageInfo =>
+                    {
+                        var stream = new MemoryStream();
+                        imageInfo.Bitmap.Save(stream, imageInfo.Bitmap.RawFormat);
+                        var base64String = Convert.ToBase64String(stream.ToArray());
+                        return new XElement(Xhtml.img, new XAttribute(NoNamespace.src, $"data:{imageInfo.ContentType};base64," + base64String), imageInfo.ImgStyleAttribute, imageInfo.AltText != null ? new XAttribute(NoNamespace.alt, imageInfo.AltText) : null);
+                    }
+                };
+                var htmlElement = HtmlConverter.ConvertToHtml(doc, settings);
+                var html = new XDocument(new XDocumentType("html", null, null, null), htmlElement);
+                var htmlString = html.ToString(SaveOptions.DisableFormatting);
+                return htmlString;
+            }
+            finally
             {
-                PageTitle = pageTitle,
-                FabricateCssClasses = false,
-                RestrictToSupportedLanguages = false,
-                RestrictToSupportedNumberingFormats = false,
-                ImageHandler = imageInfo =>
+                if (System.IO.File.Exists(docfile))
                 {
-                    var stream = new MemoryStream();
-                    imageInfo.Bitmap.Save(stream, imageInfo.Bitmap.RawFormat);
-                    var base64String = Convert.ToBase64String(stream.ToArray());
-                    return new XElement(Xhtml.img, new XAttribute(NoNamespace.src, $"data:{imageInfo.ContentType};base64," + base64String), imageInfo.ImgStyleAttribute, imageInfo.AltText != null ? new XAttribute(NoNamespace.alt, imageInfo.AltText) : null);
+                    System.IO.File.Delete(docfile);
                 }
-            };
-            var htmlElement = HtmlConverter.ConvertToHtml(doc, settings);
-            var html = new XDocument(new XDocumentType("html", null, null, null), htmlElement);
-            var htmlString = html.ToString(SaveOptions.DisableFormatting);
-            return htmlString;
+            }
         }
 
         private async Task<string> SaveAsHtml(IFormFile file)
@@ -147,17 +157,16 @@ namespace Masuit.MyBlogs.Core.Controllers
                     var ext = strs[0].Split(";")[0].Split("/")[1];
                     await using var image = new MemoryStream(bytes);
                     var imgFile = $"{SnowFlake.NewId}.{ext}";
-                    var (url, success) = await ImagebedClient.UploadImage(image, imgFile);
-                    if (success)
+                    var path = Path.Combine(HostEnvironment.WebRootPath, CommonHelper.SystemSettings.GetOrAdd("UploadPath", "upload").Trim('/', '\\'), "images", imgFile);
+                    var dir = Path.GetDirectoryName(path);
+                    if (!Directory.Exists(dir))
                     {
-                        img.Attributes["src"].Value = url;
-                    }
-                    else
-                    {
-                        var path = Path.Combine(HostEnvironment.WebRootPath, CommonHelper.SystemSettings.GetOrAdd("UploadPath", "upload").Trim('/', '\\'), "images", imgFile);
-                        await SaveFile(file, path);
-                        img.Attributes["src"].Value = path.Substring(HostEnvironment.WebRootPath.Length).Replace("\\", "/");
+                        Directory.CreateDirectory(dir);
                     }
+
+                    await using var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
+                    await image.CopyToAsync(fs);
+                    img.Attributes["src"].Value = path.Substring(HostEnvironment.WebRootPath.Length).Replace("\\", "/");
                 }
             }
 

+ 10 - 0
src/Masuit.MyBlogs.Core/Models/DTO/PostCommand.cs

@@ -76,5 +76,15 @@ namespace Masuit.MyBlogs.Core.Models.DTO
         /// 禁止转载
         /// </summary>
         public bool DisableCopy { get; set; }
+
+        /// <summary>
+        /// 限制模式
+        /// </summary>
+        public PostLimitMode? LimitMode { get; set; }
+
+        /// <summary>
+        /// 地区,逗号分隔
+        /// </summary>
+        public string Regions { get; set; }
     }
 }

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

@@ -1,4 +1,5 @@
-using System;
+using Masuit.MyBlogs.Core.Models.Entity;
+using System;
 
 namespace Masuit.MyBlogs.Core.Models.DTO
 {
@@ -122,5 +123,15 @@ namespace Masuit.MyBlogs.Core.Models.DTO
         /// </summary>
         public double AverageViewCount { get; set; }
 
+        /// <summary>
+        /// 限制模式
+        /// </summary>
+        public PostLimitMode? LimitMode { get; set; }
+
+        /// <summary>
+        /// 地区,逗号分隔
+        /// </summary>
+        public string Regions { get; set; }
+
     }
 }

+ 23 - 0
src/Masuit.MyBlogs.Core/Models/Entity/Post.cs

@@ -140,6 +140,16 @@ namespace Masuit.MyBlogs.Core.Models.Entity
         /// </summary>
         public bool DisableCopy { get; set; }
 
+        /// <summary>
+        /// 限制模式
+        /// </summary>
+        public PostLimitMode? LimitMode { get; set; }
+
+        /// <summary>
+        /// 地区,逗号分隔
+        /// </summary>
+        public string Regions { get; set; }
+
         /// <summary>
         /// 分类
         /// </summary>
@@ -165,4 +175,17 @@ namespace Masuit.MyBlogs.Core.Models.Entity
         /// </summary>
         public virtual ICollection<PostMergeRequest> PostMergeRequests { get; set; }
     }
+
+    /// <summary>
+    /// 地区限制
+    /// </summary>
+    public enum PostLimitMode
+    {
+        [Description("不限")]
+        All,
+        [Description("指定地区可见")]
+        AllowRegion,
+        [Description("指定地区不可见")]
+        ForbidRegion
+    }
 }

+ 0 - 1
src/Masuit.MyBlogs.Core/Startup.cs

@@ -208,7 +208,6 @@ namespace Masuit.MyBlogs.Core
             });
             app.UseSession().UseCookiePolicy().UseMiniProfiler(); //注入Session
             app.UseRequestIntercept(); //启用网站请求拦截
-            app.UseStaticHttpContext(); //注入静态HttpContext对象
 
             app.UseHangfireServer().UseHangfireDashboard("/taskcenter", new DashboardOptions()
             {

+ 6 - 0
src/Masuit.MyBlogs.Core/Views/Post/Details_Admin.cshtml

@@ -113,6 +113,12 @@
                                         </div>
                                     </div>
                                 </div>
+                                @if (Model.LimitMode > 0)
+                                {
+                                    <div class="col-md-12 text-red">
+                                        本文 @Model.LimitMode.GetDescription():@Model.Regions
+                                    </div>
+                                }
                             </div>
                             @if (DateTime.Now - Model.ModifyDate > TimeSpan.FromDays(365))
                             {

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

@@ -329,7 +329,7 @@ myApp.controller("writeblog", ["$scope", "$http", "$timeout", function ($scope,
 	}
 	//异步提交表单开始
 	$scope.submit = function(post) {
-		
+		Object.keys(post).forEach(key => post[key] == undefined||post[key] == null ? delete post[key] : '');
 		if (!post.Label) {
 			post.Label = null;
 		}
@@ -541,6 +541,7 @@ myApp.controller("postedit", ["$scope", "$http", "$location", "$timeout", functi
 
 	//异步提交表单开始
 	$scope.submit = function (post) {
+		Object.keys(post).forEach(key => post[key] == undefined||post[key] == null ? delete post[key] : '');
 		
 		if (!post.Label) {
 			post.Label = null;

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/post.min.js


+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/css/app.css

@@ -1314,7 +1314,7 @@ mark,
   padding: .2em;
 }
 .text-left {
-  text-align: left;
+  text-align: left !important;
 }
 .text-right {
   text-align: right;

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/Masuit.MyBlogs.Core/wwwroot/ng-views/css/app.min.css


+ 24 - 2
src/Masuit.MyBlogs.Core/wwwroot/ng-views/views/post/edit.html

@@ -88,8 +88,7 @@
                     <label for="DisableCopy">
                         <i>
                             <svg version="1.1" id="DisableCopy-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
-                            <circle fill="none" stroke="#B7B7B7" stroke-width="3" stroke-miterlimit="10" cx="25.11" cy="24.883" r="23.519" /><path fill="none" stroke-width="3" stroke-miterlimit="10" d="M48.659,25c0,12.998-10.537,23.534-23.534,23.534 S1.591,37.998,1.591,25S12.127,1.466,25.125,1.466c9.291,0,17.325,5.384,21.151,13.203L19,36l-9-14" />
-                            </svg>
+                            <circle fill="none" stroke="#B7B7B7" stroke-width="3" stroke-miterlimit="10" cx="25.11" cy="24.883" r="23.519" /><path fill="none" stroke-width="3" stroke-miterlimit="10" d="M48.659,25c0,12.998-10.537,23.534-23.534,23.534 S1.591,37.998,1.591,25S12.127,1.466,25.125,1.466c9.291,0,17.325,5.384,21.151,13.203L19,36l-9-14" /></svg>
                         </i>
                         禁止转载
                     </label>
@@ -107,6 +106,29 @@
             </div>
         </div>
     </div>
+    <div class="input-group">
+        <span class="input-group-addon text-left">
+            <span>按地区投放:</span>
+            <label class="radio radio-inline m-r-20">
+                <input type="radio" ng-model="post.LimitMode" ng-value="1">
+                <i class="input-helper"></i>
+                指定地区可见
+            </label>
+            <label class="radio radio-inline m-r-20">
+                <input type="radio" ng-model="post.LimitMode" ng-value="2">
+                <i class="input-helper"></i>
+                指定地区不可见
+            </label>
+            <label class="radio radio-inline m-r-20">
+                <input type="radio" ng-model="post.LimitMode" ng-value="0">
+                <i class="input-helper"></i>
+                不限
+            </label>
+        </span>
+        <div class="fg-line" ng-if="post.LimitMode==1||post.LimitMode==2">
+            <input type="text" class="form-control" placeholder="江苏,移动" ng-model="post.Regions">
+        </div>
+    </div>
 </form>
 <div style="position: absolute; left: -20000px;">
     <div id="docfile">

+ 37 - 2
src/Masuit.MyBlogs.Core/wwwroot/ng-views/views/post/writeblog.html

@@ -100,7 +100,13 @@
                     <i>
                         <svg version="1.1" id="DisableCopy-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
                         <circle fill="none" stroke="#B7B7B7" stroke-width="3" stroke-miterlimit="10" cx="25.11" cy="24.883" r="23.519" />
+
+
+
                         <path fill="none" stroke-width="3" stroke-miterlimit="10" d="M48.659,25c0,12.998-10.537,23.534-23.534,23.534 S1.591,37.998,1.591,25S12.127,1.466,25.125,1.466c9.291,0,17.325,5.384,21.151,13.203L19,36l-9-14" />
+
+
+
                         </svg>
                     </i>
                     禁止转载
@@ -112,7 +118,13 @@
                     <i>
                         <svg version="1.1" id="DisableComment-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
                         <circle fill="none" stroke="#B7B7B7" stroke-width="3" stroke-miterlimit="10" cx="25.11" cy="24.883" r="23.519" />
+
+
+
                         <path fill="none" stroke-width="3" stroke-miterlimit="10" d="M48.659,25c0,12.998-10.537,23.534-23.534,23.534 S1.591,37.998,1.591,25S12.127,1.466,25.125,1.466c9.291,0,17.325,5.384,21.151,13.203L19,36l-9-14" />
+
+
+
                         </svg>
                     </i>
                     禁止评论
@@ -124,8 +136,7 @@
                     <i>
                         <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
                         <circle fill="none" stroke="#B7B7B7" stroke-width="3" stroke-miterlimit="10" cx="25.11" cy="24.883" r="23.519" />
-                        <path fill="none" stroke-width="3" stroke-miterlimit="10" d="M48.659,25c0,12.998-10.537,23.534-23.534,23.534 S1.591,37.998,1.591,25S12.127,1.466,25.125,1.466c9.291,0,17.325,5.384,21.151,13.203L19,36l-9-14" />
-                        </svg>
+                        <path fill="none" stroke-width="3" stroke-miterlimit="10" d="M48.659,25c0,12.998-10.537,23.534-23.534,23.534 S1.591,37.998,1.591,25S12.127,1.466,25.125,1.466c9.291,0,17.325,5.384,21.151,13.203L19,36l-9-14" /></svg>
                     </i>
                     定时发表&nbsp;&nbsp;&nbsp;
                 </label>
@@ -135,6 +146,30 @@
             </div>
         </div>
     </div>
+
+    <div class="input-group">
+        <span class="input-group-addon text-left">
+            <span>按地区投放:</span>
+            <label class="radio radio-inline m-r-20">
+                <input type="radio" ng-model="post.LimitMode" ng-value="1">
+                <i class="input-helper"></i>
+                指定地区可见
+            </label>
+            <label class="radio radio-inline m-r-20">
+                <input type="radio" ng-model="post.LimitMode" ng-value="2">
+                <i class="input-helper"></i>
+                指定地区不可见
+            </label>
+            <label class="radio radio-inline m-r-20">
+                <input type="radio" ng-model="post.LimitMode" ng-value="0">
+                <i class="input-helper"></i>
+                不限
+            </label>
+        </span>
+        <div class="fg-line" ng-if="post.LimitMode==1||post.LimitMode==2">
+            <input type="text" class="form-control" placeholder="江苏,移动" ng-model="post.Regions">
+        </div>
+    </div>
 </form>
 <div style="position: absolute; left: -20000px; ">
     <div id="docfile">

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно