From 9bfc9b6f587b02b8fe1a07f855ecae6f9e76fbfe Mon Sep 17 00:00:00 2001 From: "William.Zhou" Date: Fri, 9 Feb 2018 19:06:21 +0800 Subject: [PATCH 1/2] to beta --- src/Areas/SingleBlog.Areas.Admin/AdminArea.cs | 11 + .../SingleBlog.Areas.Admin.csproj} | 7 +- src/SingleBlog.Core/AnonymousUserModel.cs | 28 + src/SingleBlog.Core/Data/Article.cs | 46 +- src/SingleBlog.Core/Data/Category.cs | 7 +- .../Data/Comment.cs} | 44 +- src/SingleBlog.Core/Data/IDataInitializer.cs | 22 +- .../Data/SingleBlogDbContext.cs | 19 +- .../Data/SingleBlogPasswordHasher.cs | 39 - src/SingleBlog.Core/Data/SingleBlogRole.cs | 8 + src/SingleBlog.Core/Data/SingleBlogUser.cs | 11 +- src/SingleBlog.Core/Data/Template.cs | 48 - ....cs => 20180209092845_V1_Init.Designer.cs} | 72 +- ...1_V1_Init.cs => 20180209092845_V1_Init.cs} | 67 +- .../SingleBlogDbContextModelSnapshot.cs | 70 +- .../Resources/Language.Designer.cs | 58 +- src/SingleBlog.Core/Resources/Language.resx | 6 + .../Services/ArticleService.cs | 145 +- .../Services/CategoryService.cs | 2 +- .../Services/CommentService.cs | 75 + .../Services/SettingService.cs | 25 +- .../Services/TemplateService.cs | 187 - .../GeneralSettingModel.cs | 18 +- .../ISettingModel.cs | 2 +- .../SingleBlogInfoModel.cs | 6 +- .../TemplateSettingModel.cs | 2 +- src/SingleBlog.Core/SingleBlog.Core.csproj | 6 +- src/SingleBlog.Data/Data/Category.cs | 17 - src/SingleBlog.Data/Data/DataInitializer.cs | 29 - src/SingleBlog.Data/Data/IDataInitializer.cs | 19 - src/SingleBlog.Data/Data/Setting.cs | 29 - .../Data/SingleBlogDbContext.cs | 21 - .../20180126074454_v1_Init.Designer.cs | 74 - .../Migrations/20180126074454_v1_Init.cs | 65 - .../SingleBlogDbContextModelSnapshot.cs | 73 - .../Models/GeneralSettingModel.cs | 15 - .../Services/SettingService.cs | 40 - .../SingleBlog.Framework.csproj | 29 + .../Startup/ServiceExtension.cs | 55 + .../Startup/SingleBlogConfigurationBuilder.cs | 35 + .../UI/Controls/PageButton.cs} | 119 +- .../UI/Extensions/HtmlExtension.cs | 15 + .../UI/Extensions/IdentityExtension.cs | 41 + .../Filters/InstallationFilterAttribute.cs | 10 +- .../UI}/Filters/SiteCloseAttribute.cs | 28 +- .../UI/Middlewares}/InstallationMiddleware.cs | 31 +- .../UI/SingleBlogViewEngine.cs | 52 + .../UI}/SingleBlogViewLocationExpandor.cs | 43 +- .../App_Code/Extension/IdentityExtension.cs | 14 - .../Extension/MiddlewareExtensions.cs | 14 - .../App_Code/Extension/PagedOption.cs | 105 - src/SingleBlog.Web/App_Code/PagesExtension.cs | 72 + .../App_Code/SingleBlogViewEngine.cs | 41 - .../TemplateEngine/FileSystemRazorProject.cs | 82 - .../FileSystemRazorProjectItem.cs | 41 - .../FileSystemRazorProjectItemWrapper.cs | 65 - .../TemplateEngine/TemplateGenerator.cs | 73 - .../Admin/Controllers/ArticleController.cs | 4 +- .../Admin/Controllers/CategoryController.cs | 2 +- .../Areas/Admin/Controllers/HomeController.cs | 2 +- .../Admin/Controllers/SettingController.cs | 4 +- .../Admin/Controllers/TemplateController.cs | 88 - .../Areas/Admin/Views/Article/Edit.cshtml | 45 +- .../Areas/Admin/Views/Article/List.cshtml | 2 +- .../Areas/Admin/Views/Category/Edit.cshtml | 2 +- .../Areas/Admin/Views/Home/Login.cshtml | 12 +- .../Admin/Views/Setting/ChangePwd.cshtml | 2 +- .../Areas/Admin/Views/Setting/Site.cshtml | 30 +- .../Admin/Views/Shared/_Layout-Full.cshtml | 4 +- .../Areas/Admin/Views/Shared/_Layout.cshtml | 4 +- .../Areas/Admin/Views/Template/Edit.cshtml | 76 - .../Areas/Admin/Views/Template/List.cshtml | 71 - .../Areas/Admin/Views/_ViewImports.cshtml | 3 +- .../Install/Controllers/InstallController.cs | 7 +- .../Areas/Install/Views/Install/Index.cshtml | 2 +- .../Install/Views/Install/Install.cshtml | 2 +- .../Areas/Install/Views/Shared/_Layout.cshtml | 10 +- .../ConfigFiles/SingleBlog.config.json | 8 + .../appsettings.Development.json | 0 .../{ => ConfigFiles}/appsettings.json | 3 +- .../Models/CategoryArticleViewModel.cs | 57 + .../Models/RecommandArticleViewModel.cs | 54 + .../{Templates/Default => Pages}/Close.cshtml | 0 src/SingleBlog.Web/Pages/Detail.cshtml | 99 + src/SingleBlog.Web/Pages/Index.cshtml | 19 + .../{Templates/Default => Pages}/List.cshtml | 42 +- .../Shared/_CommonHead.cshtml | 5 +- .../Shared/_CommonScripts.cshtml | 0 .../Shared/_CommonStyles.cshtml | 0 .../Shared/_Footer.cshtml | 2 +- .../Shared/_Header.cshtml | 15 +- .../Shared/_Layout-Container.cshtml | 10 +- .../Shared/_Layout.cshtml | 10 +- .../Shared/_ValidationScripts.cshtml | 0 .../Pages/Templates/_Article-List.cshtml | 24 + .../Templates/_Article-Recommand-List.cshtml | 29 + .../Templates/_Category-Article-Card.cshtml | 37 + .../Pages/Templates/_Category-List.cshtml | 15 + .../Templates/_Comment-Anonymous-Form.cshtml | 17 + .../Pages/Templates/_Comment-Form.cshtml | 27 + .../Pages/Templates/_Comment-List.cshtml | 39 + .../{Templates => Pages}/_ViewImports.cshtml | 6 + src/SingleBlog.Web/Pages/_ViewStart.cshtml | 3 + src/SingleBlog.Web/Program.cs | 60 +- src/SingleBlog.Web/SingleBlog.Web.csproj | 6 +- src/SingleBlog.Web/Startup.cs | 90 +- .../Templates/Default/Detail.cshtml | 40 - .../Templates/Default/Index.cshtml | 37 - .../Templates/Default/_ViewStart.cshtml | 3 - src/SingleBlog.Web/Templates/Error.cshtml | 23 - src/SingleBlog.Web/Templates/Error.cshtml.cs | 21 - .../Templates/Shared/_Layout-Col-10-2.cshtml | 26 - .../Templates/Shared/_Layout-Col-2-10.cshtml | 26 - .../Shared/_Layout-Container-Col-10-2.cshtml | 25 - .../Shared/_Layout-Container-Col-2-10.cshtml | 25 - .../Templates/_ViewStart.cshtml | 3 - src/SingleBlog.Web/wwwroot/styles/site.css | 11 + src/SingleBlog.sln | 15 + src/SingleBlog/Controllers/BlogController.cs | 14 - src/SingleBlog/Controllers/HomeController.cs | 16 - src/SingleBlog/Program.cs | 45 - src/SingleBlog/SingleBlog.csproj | 23 - src/SingleBlog/SingleBlog.db | Bin 32768 -> 0 bytes src/SingleBlog/Startup.cs | 30 - src/SingleBlog/ViewModels/BlogContentModel.cs | 14 - .../Views/Shared/_CommonScripts.cshtml | 2 - .../Views/Shared/_CommonSetting.cshtml | 8 - .../Views/Shared/_CommonStyles.cshtml | 2 - src/SingleBlog/Views/Shared/_Layout.cshtml | 19 - src/SingleBlog/Views/_ViewImports.cshtml | 3 - .../wwwroot/statics/fonts/FontAwesome.otf | Bin 134808 -> 0 bytes .../statics/fonts/fontawesome-webfont.eot | Bin 165742 -> 0 bytes .../statics/fonts/fontawesome-webfont.svg | 2671 ------ .../statics/fonts/fontawesome-webfont.ttf | Bin 165548 -> 0 bytes .../statics/fonts/fontawesome-webfont.woff | Bin 98024 -> 0 bytes .../statics/fonts/fontawesome-webfont.woff2 | Bin 77160 -> 0 bytes .../wwwroot/statics/scripts/bootstrap.min.js | 10 - .../wwwroot/statics/scripts/jquery.min.js | 12 - .../wwwroot/statics/styles/bootstrap.css | 7214 ----------------- .../statics/styles/font-awesome.min.css | 4 - 140 files changed, 1708 insertions(+), 12061 deletions(-) create mode 100644 src/Areas/SingleBlog.Areas.Admin/AdminArea.cs rename src/{SingleBlog.Data/SingleBlog.Core.csproj => Areas/SingleBlog.Areas.Admin/SingleBlog.Areas.Admin.csproj} (39%) create mode 100644 src/SingleBlog.Core/AnonymousUserModel.cs rename src/{SingleBlog.Data/Data/Article.cs => SingleBlog.Core/Data/Comment.cs} (39%) delete mode 100644 src/SingleBlog.Core/Data/SingleBlogPasswordHasher.cs delete mode 100644 src/SingleBlog.Core/Data/Template.cs rename src/SingleBlog.Core/Migrations/{20180202032151_V1_Init.Designer.cs => 20180209092845_V1_Init.Designer.cs} (85%) rename src/SingleBlog.Core/Migrations/{20180202032151_V1_Init.cs => 20180209092845_V1_Init.cs} (85%) create mode 100644 src/SingleBlog.Core/Services/CommentService.cs delete mode 100644 src/SingleBlog.Core/Services/TemplateService.cs rename src/SingleBlog.Core/{Models => SettingModels}/GeneralSettingModel.cs (71%) rename src/SingleBlog.Core/{Models => SettingModels}/ISettingModel.cs (84%) rename src/SingleBlog.Core/{Models => SettingModels}/SingleBlogInfoModel.cs (63%) rename src/SingleBlog.Core/{Models => SettingModels}/TemplateSettingModel.cs (96%) delete mode 100644 src/SingleBlog.Data/Data/Category.cs delete mode 100644 src/SingleBlog.Data/Data/DataInitializer.cs delete mode 100644 src/SingleBlog.Data/Data/IDataInitializer.cs delete mode 100644 src/SingleBlog.Data/Data/Setting.cs delete mode 100644 src/SingleBlog.Data/Data/SingleBlogDbContext.cs delete mode 100644 src/SingleBlog.Data/Migrations/20180126074454_v1_Init.Designer.cs delete mode 100644 src/SingleBlog.Data/Migrations/20180126074454_v1_Init.cs delete mode 100644 src/SingleBlog.Data/Migrations/SingleBlogDbContextModelSnapshot.cs delete mode 100644 src/SingleBlog.Data/Models/GeneralSettingModel.cs delete mode 100644 src/SingleBlog.Data/Services/SettingService.cs create mode 100644 src/SingleBlog.Framework/SingleBlog.Framework.csproj create mode 100644 src/SingleBlog.Framework/Startup/ServiceExtension.cs create mode 100644 src/SingleBlog.Framework/Startup/SingleBlogConfigurationBuilder.cs rename src/{SingleBlog.Web/App_Code/Extension/WebExtension.cs => SingleBlog.Framework/UI/Controls/PageButton.cs} (61%) create mode 100644 src/SingleBlog.Framework/UI/Extensions/HtmlExtension.cs create mode 100644 src/SingleBlog.Framework/UI/Extensions/IdentityExtension.cs rename src/{SingleBlog.Web/App_Code => SingleBlog.Framework/UI}/Filters/InstallationFilterAttribute.cs (83%) rename src/{SingleBlog.Web/App_Code => SingleBlog.Framework/UI}/Filters/SiteCloseAttribute.cs (54%) rename src/{SingleBlog.Web/App_Code/Middleware => SingleBlog.Framework/UI/Middlewares}/InstallationMiddleware.cs (46%) create mode 100644 src/SingleBlog.Framework/UI/SingleBlogViewEngine.cs rename src/{SingleBlog.Web/App_Code => SingleBlog.Framework/UI}/SingleBlogViewLocationExpandor.cs (45%) delete mode 100644 src/SingleBlog.Web/App_Code/Extension/IdentityExtension.cs delete mode 100644 src/SingleBlog.Web/App_Code/Extension/MiddlewareExtensions.cs delete mode 100644 src/SingleBlog.Web/App_Code/Extension/PagedOption.cs create mode 100644 src/SingleBlog.Web/App_Code/PagesExtension.cs delete mode 100644 src/SingleBlog.Web/App_Code/SingleBlogViewEngine.cs delete mode 100644 src/SingleBlog.Web/App_Code/TemplateEngine/FileSystemRazorProject.cs delete mode 100644 src/SingleBlog.Web/App_Code/TemplateEngine/FileSystemRazorProjectItem.cs delete mode 100644 src/SingleBlog.Web/App_Code/TemplateEngine/FileSystemRazorProjectItemWrapper.cs delete mode 100644 src/SingleBlog.Web/App_Code/TemplateEngine/TemplateGenerator.cs delete mode 100644 src/SingleBlog.Web/Areas/Admin/Controllers/TemplateController.cs delete mode 100644 src/SingleBlog.Web/Areas/Admin/Views/Template/Edit.cshtml delete mode 100644 src/SingleBlog.Web/Areas/Admin/Views/Template/List.cshtml create mode 100644 src/SingleBlog.Web/ConfigFiles/SingleBlog.config.json rename src/SingleBlog.Web/{ => ConfigFiles}/appsettings.Development.json (100%) rename src/SingleBlog.Web/{ => ConfigFiles}/appsettings.json (78%) create mode 100644 src/SingleBlog.Web/Models/CategoryArticleViewModel.cs create mode 100644 src/SingleBlog.Web/Models/RecommandArticleViewModel.cs rename src/SingleBlog.Web/{Templates/Default => Pages}/Close.cshtml (100%) create mode 100644 src/SingleBlog.Web/Pages/Detail.cshtml create mode 100644 src/SingleBlog.Web/Pages/Index.cshtml rename src/SingleBlog.Web/{Templates/Default => Pages}/List.cshtml (30%) rename src/SingleBlog.Web/{Templates => Pages}/Shared/_CommonHead.cshtml (83%) rename src/SingleBlog.Web/{Templates => Pages}/Shared/_CommonScripts.cshtml (100%) rename src/SingleBlog.Web/{Templates => Pages}/Shared/_CommonStyles.cshtml (100%) rename src/SingleBlog.Web/{Templates => Pages}/Shared/_Footer.cshtml (95%) rename src/SingleBlog.Web/{Templates => Pages}/Shared/_Header.cshtml (70%) rename src/SingleBlog.Web/{Templates => Pages}/Shared/_Layout-Container.cshtml (60%) rename src/SingleBlog.Web/{Templates => Pages}/Shared/_Layout.cshtml (60%) rename src/SingleBlog.Web/{Templates => Pages}/Shared/_ValidationScripts.cshtml (100%) create mode 100644 src/SingleBlog.Web/Pages/Templates/_Article-List.cshtml create mode 100644 src/SingleBlog.Web/Pages/Templates/_Article-Recommand-List.cshtml create mode 100644 src/SingleBlog.Web/Pages/Templates/_Category-Article-Card.cshtml create mode 100644 src/SingleBlog.Web/Pages/Templates/_Category-List.cshtml create mode 100644 src/SingleBlog.Web/Pages/Templates/_Comment-Anonymous-Form.cshtml create mode 100644 src/SingleBlog.Web/Pages/Templates/_Comment-Form.cshtml create mode 100644 src/SingleBlog.Web/Pages/Templates/_Comment-List.cshtml rename src/SingleBlog.Web/{Templates => Pages}/_ViewImports.cshtml (57%) create mode 100644 src/SingleBlog.Web/Pages/_ViewStart.cshtml delete mode 100644 src/SingleBlog.Web/Templates/Default/Detail.cshtml delete mode 100644 src/SingleBlog.Web/Templates/Default/Index.cshtml delete mode 100644 src/SingleBlog.Web/Templates/Default/_ViewStart.cshtml delete mode 100644 src/SingleBlog.Web/Templates/Error.cshtml delete mode 100644 src/SingleBlog.Web/Templates/Error.cshtml.cs delete mode 100644 src/SingleBlog.Web/Templates/Shared/_Layout-Col-10-2.cshtml delete mode 100644 src/SingleBlog.Web/Templates/Shared/_Layout-Col-2-10.cshtml delete mode 100644 src/SingleBlog.Web/Templates/Shared/_Layout-Container-Col-10-2.cshtml delete mode 100644 src/SingleBlog.Web/Templates/Shared/_Layout-Container-Col-2-10.cshtml delete mode 100644 src/SingleBlog.Web/Templates/_ViewStart.cshtml delete mode 100644 src/SingleBlog/Controllers/BlogController.cs delete mode 100644 src/SingleBlog/Controllers/HomeController.cs delete mode 100644 src/SingleBlog/Program.cs delete mode 100644 src/SingleBlog/SingleBlog.csproj delete mode 100644 src/SingleBlog/SingleBlog.db delete mode 100644 src/SingleBlog/Startup.cs delete mode 100644 src/SingleBlog/ViewModels/BlogContentModel.cs delete mode 100644 src/SingleBlog/Views/Shared/_CommonScripts.cshtml delete mode 100644 src/SingleBlog/Views/Shared/_CommonSetting.cshtml delete mode 100644 src/SingleBlog/Views/Shared/_CommonStyles.cshtml delete mode 100644 src/SingleBlog/Views/Shared/_Layout.cshtml delete mode 100644 src/SingleBlog/Views/_ViewImports.cshtml delete mode 100644 src/SingleBlog/wwwroot/statics/fonts/FontAwesome.otf delete mode 100644 src/SingleBlog/wwwroot/statics/fonts/fontawesome-webfont.eot delete mode 100644 src/SingleBlog/wwwroot/statics/fonts/fontawesome-webfont.svg delete mode 100644 src/SingleBlog/wwwroot/statics/fonts/fontawesome-webfont.ttf delete mode 100644 src/SingleBlog/wwwroot/statics/fonts/fontawesome-webfont.woff delete mode 100644 src/SingleBlog/wwwroot/statics/fonts/fontawesome-webfont.woff2 delete mode 100644 src/SingleBlog/wwwroot/statics/scripts/bootstrap.min.js delete mode 100644 src/SingleBlog/wwwroot/statics/scripts/jquery.min.js delete mode 100644 src/SingleBlog/wwwroot/statics/styles/bootstrap.css delete mode 100644 src/SingleBlog/wwwroot/statics/styles/font-awesome.min.css diff --git a/src/Areas/SingleBlog.Areas.Admin/AdminArea.cs b/src/Areas/SingleBlog.Areas.Admin/AdminArea.cs new file mode 100644 index 0000000..55b44bd --- /dev/null +++ b/src/Areas/SingleBlog.Areas.Admin/AdminArea.cs @@ -0,0 +1,11 @@ +using System; + +namespace SingleBlog.Areas.Admin +{ + using Framework; + + public class AdminArea : AreaStartup + { + public override string Name => "Admin"; + } +} diff --git a/src/SingleBlog.Data/SingleBlog.Core.csproj b/src/Areas/SingleBlog.Areas.Admin/SingleBlog.Areas.Admin.csproj similarity index 39% rename from src/SingleBlog.Data/SingleBlog.Core.csproj rename to src/Areas/SingleBlog.Areas.Admin/SingleBlog.Areas.Admin.csproj index b238ff5..08f567a 100644 --- a/src/SingleBlog.Data/SingleBlog.Core.csproj +++ b/src/Areas/SingleBlog.Areas.Admin/SingleBlog.Areas.Admin.csproj @@ -5,12 +5,7 @@ - - - - - - + diff --git a/src/SingleBlog.Core/AnonymousUserModel.cs b/src/SingleBlog.Core/AnonymousUserModel.cs new file mode 100644 index 0000000..9805310 --- /dev/null +++ b/src/SingleBlog.Core/AnonymousUserModel.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace SingleBlog +{ + /// + /// 匿名用户模型 + /// + public class AnonymousUserModel:IValidatableModel + { + /// + /// 昵称。 + /// + [Display(Name="昵称")] + [Required(ErrorMessage ="{0}不能为空")] + public string Name { get; set; } + + /// + /// 邮箱 + /// + [Display(Name = "邮箱")] + [Required(ErrorMessage = "{0}不能为空")] + [DataType(DataType.EmailAddress,ErrorMessage ="{0}格式不正确")] + public string Email { get; set; } + } +} diff --git a/src/SingleBlog.Core/Data/Article.cs b/src/SingleBlog.Core/Data/Article.cs index 64a0f61..342aef5 100644 --- a/src/SingleBlog.Core/Data/Article.cs +++ b/src/SingleBlog.Core/Data/Article.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Identity; using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -30,7 +31,7 @@ namespace SingleBlog.Core.Data /// public DateTime CreateTime { get; set; } = DateTime.Now; /// - /// 分类 + /// 分类Id /// public int CategoryId { get; set; } /// @@ -38,18 +39,57 @@ namespace SingleBlog.Core.Data /// [Display(Name ="阅读量")] [Range(0,int.MaxValue,ErrorMessage ="{0}不能小于0")] - public int ViewCount { get; set; } + public int ViewCount { get; private set; } - public int UserId { get; set; } + /// + /// 是否推荐文章 + /// + [Display(Name = "推荐")] + public bool IsRecommand { get;private set; } + /// + /// 自定义排序顺序,从小到大排序。 + /// + [Display(Name = "排序", Description ="从小到大")] + public int DisplayOrder { get; set; } + /// + /// Gets or sets the user identifier. + /// + /// + /// The user identifier. + /// + public int UserId { get; set; } + /// /// 增加阅读量。 /// /// public void IncreseView(int step = 1) => this.ViewCount += step; + /// + /// 设置推荐 + /// + public void Recommand() => this.IsRecommand = true; + /// + /// 设置不推荐 + /// + public void Unrecommand() => this.IsRecommand = false; + #region 导航属性 + /// + /// 关联分类。 + /// public virtual Category Category { get; set; } + /// + /// 关联用户。 + /// public virtual SingleBlogUser User { get; set; } + + /// + /// 关联回复。 + /// + public virtual ICollection Comments { get; set; } = new HashSet(); + #endregion + } } diff --git a/src/SingleBlog.Core/Data/Category.cs b/src/SingleBlog.Core/Data/Category.cs index 17d894f..f94bc18 100644 --- a/src/SingleBlog.Core/Data/Category.cs +++ b/src/SingleBlog.Core/Data/Category.cs @@ -25,7 +25,7 @@ namespace SingleBlog.Core.Data public string Name { get; set; } /// - /// 排序 + /// 排序,从小到大排序。 /// public int OrderNo { get; set; } @@ -35,5 +35,10 @@ namespace SingleBlog.Core.Data public bool IsSystem { get; set; } public virtual ICollection
Articles { get; set; } = new HashSet
(); + + /// + /// 表示系统内置分类的名称。 + /// + public const string DEFAULT_NAME = "默认分类"; } } diff --git a/src/SingleBlog.Data/Data/Article.cs b/src/SingleBlog.Core/Data/Comment.cs similarity index 39% rename from src/SingleBlog.Data/Data/Article.cs rename to src/SingleBlog.Core/Data/Comment.cs index 4c08498..7c50e6d 100644 --- a/src/SingleBlog.Data/Data/Article.cs +++ b/src/SingleBlog.Core/Data/Comment.cs @@ -4,31 +4,47 @@ using System.ComponentModel.DataAnnotations.Schema; namespace SingleBlog.Core.Data { - [Table("Articles")] - public class Article + /// + /// 文章回复 + /// + [Table("Comments")] + public class Comment { - /// - /// 自增Id。 - /// [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } + + [Display(Name ="回复内容")] + [Required(ErrorMessage ="{0}不能为空")] + public string Content { get; set; } + /// - /// 标题。 + /// 登录后的用户Id。如果匿名用户,使用 字段。 /// - [Required,StringLength(60)] - public string Title { get; set; } + public int? UserId { get; set; } + /// - /// 内容。 + /// 文章Id /// - [Required] - public string Content { get; set; } + public int ArticleId { get; set; } + + /// + /// 匿名用户的信息 + /// + public string AnonymouseUserInfo { get; set; } + /// /// 创建时间。 /// - public DateTime CreateTime { get; set; } = DateTime.Now; + public DateTime CreatedTime { get; set; } = DateTime.Now; + + /// + /// 关联用户,如果 是 null,则该实体返回 null。 + /// + public virtual SingleBlogUser User { get; set; } + /// - /// 分类 + /// 关联的文章 /// - public int CategoryId { get; set; } + public virtual Article Article { get; set; } } } diff --git a/src/SingleBlog.Core/Data/IDataInitializer.cs b/src/SingleBlog.Core/Data/IDataInitializer.cs index 4ad4b19..56fbc0e 100644 --- a/src/SingleBlog.Core/Data/IDataInitializer.cs +++ b/src/SingleBlog.Core/Data/IDataInitializer.cs @@ -5,7 +5,7 @@ namespace SingleBlog.Core.Data { using Microsoft.EntityFrameworkCore; using Services; - using SingleBlog.Core.Models; + using SettingModels; using System; using System.Linq; using System.Transactions; @@ -33,14 +33,12 @@ namespace SingleBlog.Core.Data private readonly RoleManager _roleManager; private readonly SettingService _settingService; private readonly CategoryService _categoryService; - private readonly TemplateService _templateService; public DefaultDataIntializer( DbContext context, UserManager userManager, RoleManager roleManager, SettingService settingService, - CategoryService categoryService, - TemplateService templateService + CategoryService categoryService ) { _context = context; @@ -48,7 +46,6 @@ namespace SingleBlog.Core.Data _roleManager = roleManager; _settingService = settingService; _categoryService = categoryService; - _templateService = templateService; } /// @@ -68,19 +65,10 @@ namespace SingleBlog.Core.Data _settingService.SaveSetting(GeneralSettingModel.Default()); _settingService.SaveSetting(new SingleBlogInfoModel()); - await _templateService.SaveTemplateAsync(new Template - { - Copyright = "码农猩球", - DirName = "Default", - Name = "默认模版", - IsCurrent = true, - IsSystem = true, - Version = "1.0" - }); - await _categoryService.SaveCategoryAsync(new Category { Name = "未分类", IsSystem = true }); + await _categoryService.SaveCategoryAsync(new Category { Name = Category.DEFAULT_NAME, IsSystem = true }); - var roleResult = await _roleManager.CreateAsync(new SingleBlogRole { Name = "Administrator", NormalizedName = "管理员" }); + var roleResult = await _roleManager.CreateAsync(new SingleBlogRole { Name = SingleBlogRole.ADMINISTRATOR, NormalizedName = SingleBlogRole.ADMINISTRATOR_NAME }); if (!roleResult.Succeeded) { throw new DataInitializeException(roleResult.Errors.Select(m => m.Description).Join(Environment.NewLine)); @@ -93,7 +81,7 @@ namespace SingleBlog.Core.Data throw new DataInitializeException(userResult.Errors.Select(m => m.Description).Join(Environment.NewLine)); } - var addRoleResult = await _userManager.AddToRoleAsync(user, "Administrator"); + var addRoleResult = await _userManager.AddToRoleAsync(user, SingleBlogRole.ADMINISTRATOR); if (!addRoleResult.Succeeded) { throw new DataInitializeException(addRoleResult.Errors.Select(m=>m.Description).Join(Environment.NewLine)); diff --git a/src/SingleBlog.Core/Data/SingleBlogDbContext.cs b/src/SingleBlog.Core/Data/SingleBlogDbContext.cs index 630e239..2868093 100644 --- a/src/SingleBlog.Core/Data/SingleBlogDbContext.cs +++ b/src/SingleBlog.Core/Data/SingleBlogDbContext.cs @@ -20,6 +20,12 @@ namespace SingleBlog.Core.Data { modelBuilder.Entity() .HasMany(m => m.Articles).WithOne(m => m.Category).HasForeignKey(m => m.CategoryId); + + modelBuilder.Entity() + .HasOne(m => m.User).WithMany(m => m.Comments).HasForeignKey(m => m.UserId); + + modelBuilder.Entity
() + .HasMany(m => m.Comments).WithOne(m => m.Article).HasForeignKey(m => m.ArticleId); modelBuilder.Entity().HasKey(m => m.Id); modelBuilder.Entity() @@ -47,10 +53,21 @@ namespace SingleBlog.Core.Data modelBuilder.Entity>().HasKey(m => new { m.UserId, m.LoginProvider }); } + /// + /// 文章 + /// public DbSet
Articles { get; set; } + + /// + /// 设置 + /// public DbSet Settings { get; set; } + + /// + /// 分类 + /// public DbSet Categories { get; set; } - public DbSet