教程目錄html
從零開始啓動Osharp前端
1.1. 使用OsharpNS項目模板建立項目git
1.2. 配置數據庫鏈接串並啓動項目github
1.3. OsharpNS.Swagger使用實例(登陸和受權)web
1.4. Angular6的前端項目啓動數據庫
Osharp代碼生成器的使用api
2.1 生成器的使用app
2.2 生成代碼詳解(如何本身實現業務功能)框架
Osharp部分模塊使用async
3.1 Osharp.Redis使用
Osharp深度學習和使用
4.2 多上下文配置(多個數據庫的使用)
4.3. 自定義模塊的定義(Senparc.Weixin的使用)
4.4. 繼續學習中....
OsharpNS官方資源
項目地址:https://github.com/i66soft/osharp-ns20
演示地址:https://www.osharp.org 直接使用QQ登陸能夠查看效果
文檔地址:https://docs.osharp.org 正在完善中....
發佈博客:https://www.cnblogs.com/guomingfeng/p/osharpns-publish.html 大神看這個文檔應該就能跑起來,從零開始啓動Osharp基於此文檔完成
VS生成器插件:https://marketplace.visualstudio.com/items?itemName=LiuliuSoft.osharp
官方交流QQ羣:85895249
目錄
本篇基於教程前面的項目和生成的代碼展開,CanDoo.Test
是使用項目模板建立的項目命名空間,CMS
是使用生成器建立的內容管理模塊,如不明白,請看前面的教程。
根據業務需求,肯定須要開發的模塊,和各個模塊須要的實體及實體屬性
根據業務須要分模塊定義實體屬性,位於CanDoo.Test.Core/CMS/Entities
根據實體的定義,完成實體各屬性的數據庫配置,位於CanDoo.Test.EntityConfiguration/CMS/
根據業務須要定義輸入、輸出Dto,位於CanDoo.Test.Core/CMS/Dtos
根據業務須要定義此實體對應的功能接口,位於CanDoo.Test.Core/CMS
根據業務需求實現功能,位於CanDoo.Test.Core/CMS
新建一個自定義模塊,完成接口和服務的依賴注入,位於CanDoo.Test.Core/CMS
新建一個控制器,調用對應模塊的接口,定義對應功能的WebApi,前端調用WebApi完成用戶界面,位於CanDoo.Test.Web/Areas/Admin/Controllers/CMS
下圖爲接下去講解代碼在項目中的位置,不少文件以.generated.cs
,此文件爲代碼自動生成的模板代碼,實現了基礎的增刪改查操做,當使用生成器從新生成代碼時,此文件會被覆蓋,若是實現代碼須要改動,不建議直接在此文件上改動,建議新建一個文件,繼承自以.generated.cs結尾的文件,在新文件中改動相關的實現,從而避免從新生成代碼,致使自定義代碼被覆蓋
接下去以CMS模塊中的Article爲了來說解相關代碼
實體的定義:
EntityBase
ILockable:定義可鎖定功能,需定義屬性:IsLocked
ISoftDeletable:定義邏輯刪除功能,需定義屬性:DeletedTime
ICreationAudited
IUpdateAudited
//------------------------------------------------------------------------------ // <auto-generated> // 此代碼由代碼生成器生成。 // 手動更改此文件可能致使應用程序出現意外的行爲。 // 若是從新生成代碼,對此文件的任何修改都會丟失。 // 若是須要擴展此類,請新建分部類 partial class Article 進行擴展 // </auto-generated> // // <copyright file="Article.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // ----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using OSharp.Entity; using CanDoo.Test.Identity.Entities; namespace CanDoo.Test.CMS.Entities { /// <summary> /// 實體類:文章信息 /// </summary> [Description("文章信息")] public partial class Article : EntityBase<int>, ILockable, ISoftDeletable, ICreationAudited<int>, IUpdateAudited<int> { /// <summary> /// 獲取或設置 標題 /// </summary> [DisplayName("標題")] public string Title { get; set; } /// <summary> /// 獲取或設置 內容 /// </summary> [DisplayName("內容")] public string Content { get; set; } /// <summary> /// 獲取或設置 是否鎖定 /// </summary> [DisplayName("是否鎖定")] public bool IsLocked { get; set; } /// <summary> /// 獲取或設置 刪除時間 /// </summary> [DisplayName("刪除時間")] public DateTime? DeletedTime { get; set; } /// <summary> /// 獲取或設置 建立者 /// </summary> [DisplayName("建立者")] public int? CreatorId { get; set; } /// <summary> /// 獲取或設置 建立時間 /// </summary> [DisplayName("建立時間")] public DateTime CreatedTime { get; set; } /// <summary> /// 獲取或設置 更新者 /// </summary> [DisplayName("更新者")] public int? LastUpdaterId { get; set; } /// <summary> /// 獲取或設置 更新時間 /// </summary> [DisplayName("更新時間")] public DateTime? LastUpdatedTime { get; set; } /// <summary> /// 獲取或設置 分類外鍵 /// </summary> [DisplayName("分類外鍵")] public int ArticleCategoryId { get; set; } /// <summary> /// 獲取或設置 發佈人外鍵 /// </summary> [DisplayName("發佈人外鍵")] public int? UserId { get; set; } /// <summary> /// 獲取或設置 分類 /// </summary> [DisplayName("分類")] public virtual ArticleCategory ArticleCategory { get; set; } /// <summary> /// 獲取或設置 發佈人 /// </summary> [DisplayName("發佈人")] public virtual User User { get; set; } } }
InputDto的定義:此Dto用於向系統輸入數據的時候,好比新增數據,編輯數據時,經過InputDto來提供數據
IInputDto
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動更改此文件可能致使應用程序出現意外的行爲。 // 若是從新生成代碼,對此文件的任何修改都會丟失。 // 若是須要擴展此類,請新建分部類 partial class ArticleInputDto 進行擴展 // </auto-generated> // // <copyright file="ArticleInputDto.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // ----------------------------------------------------------------------- using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using OSharp.Entity; using OSharp.Mapping; using CanDoo.Test.CMS.Entities; namespace CanDoo.Test.CMS.Dtos { /// <summary> /// 輸入DTO:文章信息 /// </summary> [MapTo(typeof(Article))] [Description("文章信息")] public partial class ArticleInputDto : IInputDto<int> { /// <summary> /// 獲取或設置 編號 /// </summary> [DisplayName("編號")] public int Id { get; set; } /// <summary> /// 獲取或設置 分類外鍵 /// </summary> [DisplayName("分類外鍵")] public int ArticleCategoryId { get; set; } /// <summary> /// 獲取或設置 標題 /// </summary> [DisplayName("標題")] public string Title { get; set; } /// <summary> /// 獲取或設置 內容 /// </summary> [DisplayName("內容")] public string Content { get; set; } /// <summary> /// 獲取或設置 發佈人外鍵 /// </summary> [DisplayName("發佈人外鍵")] public int UserId { get; set; } /// <summary> /// 獲取或設置 是否鎖定 /// </summary> [DisplayName("是否鎖定")] public bool IsLocked { get; set; } } }
OutDto的定義:此Dto用於輸出數據給用戶時候,好比數據列表展現,展現數據詳情的時候,經過OutDto來提供數據
IDataAuthEnabled:定義數據權限的容許更新,容許刪除狀態,需定義:Updatable,Deletable
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動更改此文件可能致使應用程序出現意外的行爲。 // 若是從新生成代碼,對此文件的任何修改都會丟失。 // 若是須要擴展此類,請新建分部類 partial class ArticleOutputDto 進行擴展 // </auto-generated> // // <copyright file="ArticleOutputDto.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // ----------------------------------------------------------------------- using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using OSharp.Entity; using OSharp.Mapping; using CanDoo.Test.CMS.Entities; using CanDoo.Test.Identity.Entities; namespace CanDoo.Test.CMS.Dtos { /// <summary> /// 輸入DTO:文章信息 /// </summary> [MapFrom(typeof(Article))] [Description("文章信息")] public partial class ArticleOutputDto : IOutputDto, IDataAuthEnabled { /// <summary> /// 獲取或設置 編號 /// </summary> [DisplayName("編號")] public int Id { get; set; } /// <summary> /// 獲取或設置 分類 /// </summary> [DisplayName("分類")] public ArticleCategory ArticleCategory { get; set; } /// <summary> /// 獲取或設置 標題 /// </summary> [DisplayName("標題")] public string Title { get; set; } /// <summary> /// 獲取或設置 內容 /// </summary> [DisplayName("內容")] public string Content { get; set; } /// <summary> /// 獲取或設置 發佈人 /// </summary> [DisplayName("發佈人")] public User User { get; set; } /// <summary> /// 獲取或設置 是否鎖定 /// </summary> [DisplayName("是否鎖定")] public bool IsLocked { get; set; } /// <summary> /// 獲取或設置 建立者 /// </summary> [DisplayName("建立者")] public int CreatorId { get; set; } /// <summary> /// 獲取或設置 建立時間 /// </summary> [DisplayName("建立時間")] public DateTime CreatedTime { get; set; } /// <summary> /// 獲取或設置 更新者 /// </summary> [DisplayName("更新者")] public int LastUpdaterId { get; set; } /// <summary> /// 獲取或設置 更新時間 /// </summary> [DisplayName("更新時間")] public DateTime LastUpdatedTime { get; set; } /// <summary> /// 獲取或設置 是否可更新的數據權限狀態 /// </summary> public bool Updatable { get; set; } /// <summary> /// 獲取或設置 是否可刪除的數據權限狀態 /// </summary> public bool Deletable { get; set; } } }
接口的定義:定義須要的接口
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動更改此文件可能致使應用程序出現意外的行爲。 // 若是從新生成代碼,對此文件的任何修改都會丟失。 // 若是須要擴展此接口,請新建分部接口 partial interface ICMSContract 添加新的方法,並添加相應新的分部基類 abstract partial class CMSServiceBase 實現新方法 // </auto-generated> // // <copyright file="ICMSContract.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // ----------------------------------------------------------------------- using System; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using OSharp.Data; using OSharp.Extensions; using CanDoo.Test.CMS.Dtos; using CanDoo.Test.CMS.Entities; namespace CanDoo.Test.CMS { /// <summary> /// 業務契約接口:內容管理模塊 /// </summary> public partial interface ICMSContract { #region 文章分類信息業務 #endregion #region 文章信息業務 /// <summary> /// 獲取 文章信息查詢數據集 /// </summary> IQueryable<Article> Articles { get; } /// <summary> /// 檢查文章信息信息是否存在 /// </summary> /// <param name="predicate">檢查謂語表達式</param> /// <param name="id">更新的文章信息編號</param> /// <returns>文章信息是否存在</returns> Task<bool> CheckArticleExists(Expression<Func<Article, bool>> predicate, int id = default(int)); /// <summary> /// 添加文章信息信息 /// </summary> /// <param name="dtos">要添加的文章信息DTO信息</param> /// <returns>業務操做結果</returns> Task<OperationResult> CreateArticles(params ArticleInputDto[] dtos); /// <summary> /// 更新文章信息信息 /// </summary> /// <param name="dtos">包含更新信息的文章信息DTO信息</param> /// <returns>業務操做結果</returns> Task<OperationResult> UpdateArticles(params ArticleInputDto[] dtos); /// <summary> /// 刪除文章信息信息 /// </summary> /// <param name="ids">要刪除的文章信息編號</param> /// <returns>業務操做結果</returns> Task<OperationResult> DeleteArticles(params int[] ids); #endregion #region 留言板信息業務 #endregion } }
功能實現:由於一個功能模塊中會有大量的實體,系統中將各個實體的具體實現進行了文件的拆分,從前面的圖中能夠看出,Article的具體實現位於CMSServiceBase.Article.generated.cs
,CMSServiceBase.generated.cs
定義了CMS模塊全部須要使用到的對象,CMSService.cs
爲模塊的業務實現基類
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動更改此文件可能致使應用程序出現意外的行爲。 // 若是從新生成代碼,對此文件的任何修改都會丟失。 // 若是須要擴展此類,能夠遵照以下規則進行擴展: // 1.橫向擴展:如需給當前實體 Article 添加方法,可新建文件「CMSServiceBase.Article.cs」的分部類「public abstract partial class CMSServiceBase」添加功能 // 2.縱向擴展:如須要重寫當前實體 Article 的業務實現,可新建文件「CMSService.Article.cs」的分部類「public partial class CMSService」對現有方法進行方法重寫實現 // </auto-generated> // // <copyright file="CMSServiceBase.Article.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // ----------------------------------------------------------------------- using System; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using OSharp.Data; using OSharp.Dependency; using OSharp.Extensions; using OSharp.Mapping; using CanDoo.Test.CMS.Dtos; using CanDoo.Test.CMS.Entities; namespace CanDoo.Test.CMS { public abstract partial class CMSServiceBase { /// <summary> /// 獲取 文章信息查詢數據集 /// </summary> public IQueryable<Article> Articles { get { return ArticleRepository.Query(); } } /// <summary> /// 檢查文章信息是否存在 /// </summary> /// <param name="predicate">檢查謂語表達式</param> /// <param name="id">更新的文章信息編號</param> /// <returns>文章信息是否存在</returns> public virtual Task<bool> CheckArticleExists(Expression<Func<Article, bool>> predicate, int id = default(int)) { return ArticleRepository.CheckExistsAsync(predicate, id); } /// <summary> /// 添加文章信息 /// </summary> /// <param name="dtos">要添加的文章信息DTO信息</param> /// <returns>業務操做結果</returns> public virtual Task<OperationResult> CreateArticles(params ArticleInputDto[] dtos) { Check.NotNull(dtos, nameof(dtos)); return ArticleRepository.InsertAsync(dtos); } /// <summary> /// 更新文章信息 /// </summary> /// <param name="dtos">包含更新信息的文章信息DTO信息</param> /// <returns>業務操做結果</returns> public virtual Task<OperationResult> UpdateArticles(params ArticleInputDto[] dtos) { Check.NotNull(dtos, nameof(dtos)); return ArticleRepository.UpdateAsync(dtos); } /// <summary> /// 刪除文章信息 /// </summary> /// <param name="ids">要刪除的文章信息編號</param> /// <returns>業務操做結果</returns> public virtual Task<OperationResult> DeleteArticles(params int[] ids) { Check.NotNull(ids, nameof(ids)); return ArticleRepository.DeleteAsync(ids); } } }
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動更改此文件可能致使應用程序出現意外的行爲。 // 若是從新生成代碼,對此文件的任何修改都會丟失。 // 若是須要擴展此類,請在控制器類型 CMSService 進行繼承重寫 // </auto-generated> // // <copyright file="ICMSServiceBase.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // ----------------------------------------------------------------------- using System; using System.Linq; using System.Threading.Tasks; using OSharp.Core.Systems; using OSharp.Data; using OSharp.Entity; using OSharp.EventBuses; using OSharp.Extensions; using OSharp.Identity; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using CanDoo.Test.CMS.Dtos; using CanDoo.Test.CMS.Entities; namespace CanDoo.Test.CMS { /// <summary> /// 業務實現基類:內容管理模塊 /// </summary> public abstract partial class CMSServiceBase : ICMSContract { /// <summary> /// 初始化一個<see cref="CMSService"/>類型的新實例 /// </summary> protected CMSServiceBase(IServiceProvider provider) { ServiceProvider = provider; Logger = provider.GetLogger(GetType()); } #region 屬性 /// <summary> /// 獲取或設置 服務提供者對象 /// </summary> protected IServiceProvider ServiceProvider { get; } /// <summary> /// 獲取或設置 日誌對象 /// </summary> protected ILogger Logger { get; } /// <summary> /// 獲取或設置 文章分類信息倉儲對象 /// </summary> protected IRepository<ArticleCategory, int> ArticleCategoryRepository => ServiceProvider.GetService<IRepository<ArticleCategory, int>>(); /// <summary> /// 獲取或設置 文章信息倉儲對象 /// </summary> protected IRepository<Article, int> ArticleRepository => ServiceProvider.GetService<IRepository<Article, int>>(); /// <summary> /// 獲取或設置 留言板信息倉儲對象 /// </summary> protected IRepository<MessageBoard, int> MessageBoardRepository => ServiceProvider.GetService<IRepository<MessageBoard, int>>(); /// <summary> /// 獲取 事件總線 /// </summary> protected IEventBus EventBus => ServiceProvider.GetService<IEventBus>(); /// <summary> /// 獲取 設置存儲對象 /// </summary> protected IKeyValueStore KeyValueStore => ServiceProvider.GetService<IKeyValueStore>(); #endregion } }
// ----------------------------------------------------------------------- // <once-generated> // 這個文件只生成一次,再次生成不會被覆蓋。 // 能夠在此類進行繼承重寫來擴展基類 CMSServiceBase // </once-generated> // // <copyright file="ICMSService.cs" company="Qiadoo"> // 隨便用 // </copyright> // <site>http://www.qiadoo.com</site> // <last-editor>atai</last-editor> // <last-date>2019-04-26 13:52</last-date> // ----------------------------------------------------------------------- using System; namespace CanDoo.Test.CMS { /// <summary> /// 業務實現基類:內容管理模塊 /// </summary> public partial class CMSService : CMSServiceBase { /// <summary> /// 初始化一個<see cref="CMSService"/>類型的新實例 /// </summary> public CMSService(IServiceProvider provider) : base(provider) { } } }
模塊定義:將模塊服務添加到依賴注入服務容器中
OsharpPack:系統啓動的時候會自動查找繼承自OsharpPack的模塊,完成加載
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動更改此文件可能致使應用程序出現意外的行爲。 // 若是從新生成代碼,對此文件的任何修改都會丟失。 // 若是須要擴展此類,請新建分部類 partial class CMSPack 進行實現分部方法 AddServicesAppend,UsePackAppend 進行擴展 // </auto-generated> // // <copyright file="ICMSPack.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // ----------------------------------------------------------------------- using System; using System.ComponentModel; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using OSharp.Core.Packs; namespace CanDoo.Test.CMS { /// <summary> /// 內容管理模塊 /// </summary> [Description("內容管理模塊")] public partial class CMSPack : OsharpPack { /// <summary>將模塊服務添加到依賴注入服務容器中</summary> /// <param name="services">依賴注入服務容器</param> /// <returns></returns> public override IServiceCollection AddServices(IServiceCollection services) { services.TryAddScoped<ICMSContract, CMSService>(); AddServicesAppend(services); return services; } /// <summary> /// 額外的服務註冊 /// </summary> /// <param name="services">依賴注入服務容器</param> partial void AddServicesAppend(IServiceCollection services); /// <summary> /// 應用模塊服務 /// </summary> /// <param name="provider">服務提供者</param> public override void UsePack(IServiceProvider provider) { UsePackAppend(provider); base.UsePack(provider); } /// <summary> /// 額外的服務註冊 /// </summary> /// <param name="provider">服務提供者</param> partial void UsePackAppend(IServiceProvider provider); } }
直接貼代碼了,在這裏完成了各個屬性的數據庫配置,如下2行都是多對一的配置,第一條是文章和文章分類實現雙向導航,第二條是文章和用戶的單向導航,固然在這裏還能指定表的名稱等等,反正數據庫想怎麼配置就在這裏折騰吧
builder.HasOne<ArticleCategory>(m => m.ArticleCategory).WithMany(n => n.Articles).HasForeignKey(m => m.ArticleCategoryId).IsRequired().OnDelete(DeleteBehavior.Restrict);
builder.HasOne<User>(m => m.User).WithMany().HasForeignKey(m => m.UserId).IsRequired().OnDelete(DeleteBehavior.Restrict);
//------------------------------------------------------------------------------ // <auto-generated> // 此代碼由代碼生成器生成。 // 手動更改此文件可能致使應用程序出現意外的行爲。 // 若是從新生成代碼,對此文件的任何修改都會丟失。 // 若是須要擴展此類,請新建分部類 partial class ArticleConfiguration 實現分部方法 EntityConfigurationAppend 進行擴展 // </auto-generated> // // <copyright file="ArticleConfiguration.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // ----------------------------------------------------------------------- using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using OSharp.Entity; using CanDoo.Test.CMS.Entities; using CanDoo.Test.Identity.Entities; namespace CanDoo.Test.EntityConfiguration.CMS { /// <summary> /// 實體配置類:文章信息 /// </summary> public partial class ArticleConfiguration : EntityTypeConfigurationBase<Article, int> { /// <summary> /// 重寫以實現實體類型各個屬性的數據庫配置 /// </summary> /// <param name="builder">實體類型建立器</param> public override void Configure(EntityTypeBuilder<Article> builder) { builder.HasOne<ArticleCategory>(m => m.ArticleCategory).WithMany(n => n.Articles).HasForeignKey(m => m.ArticleCategoryId).IsRequired().OnDelete(DeleteBehavior.Restrict); builder.HasOne<User>(m => m.User).WithMany().HasForeignKey(m => m.UserId).IsRequired().OnDelete(DeleteBehavior.Restrict); EntityConfigurationAppend(builder); } /// <summary> /// 額外的數據映射 /// </summary> partial void EntityConfigurationAppend(EntityTypeBuilder<Article> builder); } }
仍是沒啥說的,本身看代碼吧,注意看下對AdminApiController
的繼承,
// ----------------------------------------------------------------------- // <copyright file="AdminApiController.cs" company="OSharp開源團隊"> // Copyright (c) 2014-2018 OSharp. All rights reserved. // </copyright> // <site>http://www.osharp.org</site> // <last-editor>郭明鋒</last-editor> // <last-date>2018-06-27 4:50</last-date> // ----------------------------------------------------------------------- using Microsoft.AspNetCore.Mvc; using OSharp.AspNetCore.Mvc; using OSharp.Core; namespace CanDoo.Test.Web.Areas.Admin.Controllers { [Area("Admin")] [RoleLimit]//繼承了這個,就會進行權限檢查 public abstract class AdminApiController : AreaApiController { } }
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動更改此文件可能致使應用程序出現意外的行爲。 // 若是從新生成代碼,對此文件的任何修改都會丟失。 // 若是須要擴展此類,請在控制器類型 ArticleController 進行繼承重寫 // </auto-generated> // // <copyright file="ArticleBase.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // ----------------------------------------------------------------------- using System; using System.ComponentModel; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using OSharp.AspNetCore.Mvc; using OSharp.AspNetCore.Mvc.Filters; using OSharp.AspNetCore.UI; using OSharp.Caching; using OSharp.Core.Functions; using OSharp.Core.Modules; using OSharp.Data; using OSharp.Entity; using OSharp.Filter; using OSharp.Secutiry; using CanDoo.Test.CMS; using CanDoo.Test.CMS.Dtos; using CanDoo.Test.CMS.Entities; namespace CanDoo.Test.Web.Areas.Admin.Controllers { /// <summary> /// 管理控制器基類: 文章信息 /// </summary> [ModuleInfo(Position = "CMS", PositionName = "內容管理模塊")] [Description("管理-文章信息")] public abstract class ArticleControllerBase : AdminApiController { /// <summary> /// 初始化一個<see cref="ArticleController"/>類型的新實例 /// </summary> protected ArticleControllerBase(ICMSContract cMSContract, IFilterService filterService) { CMSContract = cMSContract; FilterService = filterService; } /// <summary> /// 獲取或設置 數據過濾服務對象 /// </summary> protected IFilterService FilterService { get; } /// <summary> /// 獲取或設置 內容管理模塊業務契約對象 /// </summary> protected ICMSContract CMSContract { get; } /// <summary> /// 讀取文章列表信息 /// </summary> /// <param name="request">頁請求信息</param> /// <returns>文章列表分頁信息</returns> [HttpPost] [ModuleInfo] [Description("讀取")] public virtual PageData<ArticleOutputDto> Read(PageRequest request) { Check.NotNull(request, nameof(request)); Expression<Func<Article, bool>> predicate = FilterService.GetExpression<Article>(request.FilterGroup); var page = CMSContract.Articles.ToPage<Article, ArticleOutputDto>(predicate, request.PageCondition); return page.ToPageData(); } /// <summary> /// 新增文章信息 /// </summary> /// <param name="dtos">文章信息輸入DTO</param> /// <returns>JSON操做結果</returns> [HttpPost] [ModuleInfo] [DependOnFunction("Read")] [ServiceFilter(typeof(UnitOfWorkAttribute))] [Description("新增")] public virtual async Task<AjaxResult> Create(ArticleInputDto[] dtos) { Check.NotNull(dtos, nameof(dtos)); OperationResult result = await CMSContract.CreateArticles(dtos); return result.ToAjaxResult(); } /// <summary> /// 更新文章信息 /// </summary> /// <param name="dtos">文章信息輸入DTO</param> /// <returns>JSON操做結果</returns> [HttpPost] [ModuleInfo] [DependOnFunction("Read")] [ServiceFilter(typeof(UnitOfWorkAttribute))] [Description("更新")] public virtual async Task<AjaxResult> Update(ArticleInputDto[] dtos) { Check.NotNull(dtos, nameof(dtos)); OperationResult result = await CMSContract.UpdateArticles(dtos); return result.ToAjaxResult(); } /// <summary> /// 刪除文章信息 /// </summary> /// <param name="ids">文章信息編號</param> /// <returns>JSON操做結果</returns> [HttpPost] [ModuleInfo] [DependOnFunction("Read")] [ServiceFilter(typeof(UnitOfWorkAttribute))] [Description("刪除")] public virtual async Task<AjaxResult> Delete(int[] ids) { Check.NotNull(ids, nameof(ids)); OperationResult result = await CMSContract.DeleteArticles(ids); return result.ToAjaxResult(); } } }
// ----------------------------------------------------------------------- // <once-generated> // 這個文件只生成一次,再次生成不會被覆蓋。 // 能夠在此類進行繼承重寫來擴展基類 ArticleControllerBase // </once-generated> // // <copyright file="Article.cs" company="Qiadoo"> // 隨便用 // </copyright> // <site>http://www.qiadoo.com</site> // <last-editor>atai</last-editor> // <last-date>2019-04-26 13:52</last-date> // ----------------------------------------------------------------------- using System; using OSharp.Filter; using CanDoo.Test.CMS; namespace CanDoo.Test.Web.Areas.Admin.Controllers { /// <summary> /// 管理控制器: 文章信息 /// </summary> public class ArticleController : ArticleControllerBase { /// <summary> /// 初始化一個<see cref="ArticleController"/>類型的新實例 /// </summary> public ArticleController(ICMSContract cMSContract, IFilterService filterService) : base(cMSContract, filterService) { } } }