abp vnext 创建档案管理Api

引言

创建档案管理项目后端,实现附件的增删改查,引用abp vnext最佳实践。

创建Web Api项目

使用空Web应用程序创建项目

1.创建Asp.net core 5 web api项目Hx.Archives.Api。

2.安装Nuget包:Volo.Abp.AspNetCore.MvcVolo.Abp.Autofac

3.创建Module,添加依赖:[DependsOn(typeof(AbpAspNetCoreMvcModule))][DependsOn(typeof(AbpAutofacModule))]

4.修改Startup类。

5.修改Program类。

6.添加swagger。

Module:

[DependsOn(typeof(AbpAspNetCoreMvcModule))]//添加依赖
    [DependsOn(typeof(AbpAutofacModule))]
    public class HxArchivesApiModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            //添加swagger服务
            context.Services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo { Title = "档案管理 Api", Version = "v0.1" });
                options.DocInclusionPredicate((docName, description) => true);
                options.CustomSchemaIds(type => type.FullName);
            });
        }
        public override void OnApplicationInitialization(
            ApplicationInitializationContext context)
        {
            var app = context.GetApplicationBuilder();
            app.UseStaticFiles();
            app.UseRouting();
            app.UseSwagger();
            app.UseSwaggerUI(options =>
            {
                options.SwaggerEndpoint("/swagger/v1/swagger.json", "Identity Service API");
            });
            app.UseConfiguredEndpoints();
        }
    }    

Program:

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .UseAutofac();  // 添加这一行
    }

Startup:

public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplication<HxArchivesApiModule>();
        }
        public void Configure(IApplicationBuilder app)
        {
            app.InitializeApplication();
        }
    }

创建领域层

1.创建(类库).NET Core项目,命名为Hx.Archives.Domain。

2.引入Nuget包:Volo.Abp.Ddd.Domain。

3.创建HxArchivesDomainModule,并引入依赖[DependsOn(typeof(AbpDddDomainModule))]。

创建实体AttachFile、AttachCatalogue,创建附件类型枚举:AttachTypeEnum。

HxArchivesDomainModule:

[DependsOn(typeof(AbpDddDomainModule))]
    public class HxArchivesDomainModule : AbpModule
    {

    }

AttachFile:

/// <summary>
    /// 附件文件
    /// </summary>
    public class AttachFile : Entity<Guid>
    {
        /// <summary>
        /// 文件名称
        /// </summary>
        public virtual string FileName { get; private set; }
        /// <summary>
        /// 文件别名
        /// </summary>
        public virtual string FileAlias { get; private set; }
        /// <summary>
        /// 文件路径
        /// </summary>
        public virtual string FilePath { get; private set; }
        /// <summary>
        /// 顺序号
        /// </summary>
        public virtual int SequenceNumber { get; private set; }
        /// <summary>
        /// 文件内容
        /// </summary>
        public virtual byte[] DocumentContent { get; private set; }
        /// <summary>
        /// 提供给ORM用来从数据库中获取实体,
        /// 无需初始化子集合因为它会被来自数据库的值覆盖
        /// </summary>
        protected AttachFile()
        { }
        /// <summary>
        /// 创建附件文件,通过文件管理系统持久化
        /// </summary>
        /// <param name="id"></param>
        /// <param name="aliasName"></param>
        /// <param name="sequenceNumber"></param>
        public AttachFile(
            Guid id,
            string aliasName,
            int sequenceNumber)
        {
            Id = id;
            SequenceNumber = sequenceNumber;
            FileAlias = aliasName;
            FileName = id.ToString();
        }
        /// <summary>
        /// 创建附件文件,通过数据库持久化
        /// </summary>
        /// <param name="id"></param>
        /// <param name="aliasName"></param>
        /// <param name="documentContent"></param>
        /// <param name="sequenceNumber"></param>
        public AttachFile(
            Guid id,
            string aliasName,
            byte[] documentContent,
            int sequenceNumber)
        {
            Id = id;
            SequenceNumber = sequenceNumber;
            FileAlias = aliasName;
            DocumentContent = documentContent;
        }
    }

AttachCatalogue:

/// <summary>
    /// 附件目录
    /// </summary>
    public class AttachCatalogue : FullAuditedAggregateRoot<Guid>
    {
        /// <summary>
        /// 附件类型
        /// </summary>
        public virtual AttachTypeEnum AttachType { get; private set; }
        /// <summary>
        /// 目录名称
        /// </summary>
        public virtual string CatalogueName { get; private set; }
        /// <summary>
        /// 附件数量
        /// </summary>
        public virtual int AttachCount { get; private set; }
        /// <summary>
        /// 页数
        /// </summary>
        public virtual int PageCount { get; private set; }
        /// <summary>
        /// 是否核验
        /// </summary>
        public virtual bool IsVerification { get; private set; }
        /// <summary>
        /// 是否必收
        /// </summary>
        public virtual bool IsRequired { get; private set; }
        /// <summary>
        /// 顺序号
        /// </summary>
        public virtual int SequenceNumber { get; private set; }
        /// <summary>
        /// 归档状态
        /// </summary>
        public virtual bool ArchivingStatus { get; private set; }
        /// <summary>
        /// 附件文件集合
        /// </summary>
        public virtual Collection<AttachFile> AttachFiles { get; private set; }
        /// <summary>
        /// 提供给ORM用来从数据库中获取实体,
        /// 无需初始化子集合因为它会被来自数据库的值覆盖
        /// </summary>
        protected AttachCatalogue()
        { }
        public AttachCatalogue(
            Guid id,
            AttachTypeEnum attachTypeEnum,
            string catologueName,
            int sequenceNumber,
            Collection<AttachFile> attachFiles = null,
            bool isRequired = true,
            int attachCount = 0,
            int pageCount = 0
            )
        {
            Id = id;
            AttachType = attachTypeEnum;
            CatalogueName = catologueName;
            SequenceNumber = sequenceNumber;
            IsRequired = isRequired;
            AttachCount = attachCount;
            PageCount = pageCount;
            if (attachFiles == null) AttachFiles = new Collection<AttachFile>();
            else AttachFiles = AttachFiles;
        }
        /// <summary>
        /// 验证
        /// </summary>
        public void Verify() => IsVerification = true;
        /// <summary>
        /// 归档
        /// </summary>
        public void Archiving() => ArchivingStatus = true;
        /// <summary>
        /// 添加附件
        /// </summary>
        /// <param name="attach">文件</param>
        public void AddAttachFile(AttachFile attach) => AttachFiles.Add(attach);
        public void AddAttachFiles(Collection<AttachFile> attachFiles) => AttachFiles = attachFiles;
    }

AttachTypeEnum:

public enum AttachTypeEnum
    {
        /// <summary>
        /// 原件
        /// </summary>
        OriginalScript = 1,
        /// <summary>
        ///复印件
        /// </summary>
        Copy = 2,
        /// <summary>
        ///原件副本
        /// </summary>
        Duplicate = 3,
        /// <summary>
        ///副本复印件
        /// </summary>
        DuplicateCopy = 4,
        /// <summary>
        ///手稿
        /// </summary>
        Manuscript = 5,
        /// <summary>
        ///原件或复印件
        /// </summary>
        OriginalScriptOrCopy = 6,
        /// <summary>
        ///其它
        /// </summary>
        Other = 99
    }

创建数据访问EntityFrameworkCore

1.添加Nuget包:Volo.Abp.EntityFrameworkCore。

2.创建HxArchivesEntityFrameworkCoreModule,引入依赖:[DependsOn(typeof(AbpEntityFrameworkCoreModule))]、[DependsOn(typeof(HxArchivesDomainModule))]。

3.创建数据库上下文、上下文接口:ArchivesDbContext、IArchivesDbContext。

4.创建表名前缀及数据库模式。

5.创建ModelBuilder扩展类。

HxArchivesEntityFrameworkCoreModule:

    [DependsOn(typeof(AbpEntityFrameworkCoreModule))]
    [DependsOn(typeof(HxArchivesDomainModule))]
    public class HxArchivesEntityFrameworkCoreModule : AbpModule
    {

    }

ArchivesDbContext:

    [ConnectionStringName("HxArchives")]
    public class ArchivesDbContext : AbpDbContext<ArchivesDbContext>, IArchivesDbContext
    {
        public ArchivesDbContext(DbContextOptions<ArchivesDbContext> options)
            : base(options)
        { }
    }

IArchivesDbContext:

    [ConnectionStringName("HxArhives")]
    public interface IArchivesDbContext : IEfCoreDbContext
    {
    }

ArchivesModelBuilderConfigurationOptions:

    public class ArchivesModelBuilderConfigurationOptions : AbpModelBuilderConfigurationOptions
    {
        public ArchivesModelBuilderConfigurationOptions(
            [NotNull] string tablePrefix,
            [CanBeNull] string schema)
            : base(tablePrefix, schema)
        { }
    }
原文地址:https://www.cnblogs.com/GiserPage/p/14523974.html