当前位置: 首页 > news >正文

创新平台网站建设方案模板网站免费

创新平台网站建设方案,模板网站免费,h5神兽平台正规的代理,智慧团建手机版目录前言开始创建模块模块开发应用服务运行模块单元测试模块使用最后前言在之前的章节中介绍过ABP扩展实体,当时在用户表扩展了用户头像字段,用户头像就涉及到文件上传和文件存储。文件上传是很多系统都会涉及到的一个基础功能,在ABP的模块化…

目录

  • 前言
  • 开始创建模块模块开发应用服务运行模块单元测试模块使用
  • 最后

前言

在之前的章节中介绍过ABP扩展实体,当时在用户表扩展了用户头像字段,用户头像就涉及到文件上传和文件存储。文件上传是很多系统都会涉及到的一个基础功能,在ABP的模块化思路下,文件管理可以做成一个通用的模块,便于以后在多个项目中复用。单纯实现一个文件上传的功能并不复杂,本文就借着这个简单的功能来介绍一下ABP模块化开发的最基本步骤。

开始

创建模块

首先使用ABP CLI创建一个模块:abp new Xhznl.FileManagement -t module --no-ui

77e4c37a12a814a27ca5bcc818f8911b.png

创建完成后会得到如下文件:

9e1d8cc533a94022694df464d1e66723.png

在主项目中添加对应模块的引用,Application=>Application,Domain=>Domain,HttpApi=>HttpApi 等等。例如:

ff3a8d0c8aa3a7c20b7d0f0f8a5ee41b.png
2116aa4481e65950fc2610b81eafc55c.png

需要添加引用的项目:Application、Application.Contracts、Domain、Domain.Shared、EntityFrameworkCore、HttpApi、HttpApi.Client

手动添加这些引用比较麻烦,你可以搭建自己的私有NuGet服务器,把模块的包发布到私有NuGet上,然后通过NuGet来安装引用。两种方式各有优缺点,具体请参考自定义现有模块,关于私有NuGet搭建可以参考:十分钟搭建自己的私有NuGet服务器-BaGet。

然后给这些项目的模块类添加对应的依赖,例如:

702a0fe5d9d1837d3a8a8e27b400e305.png

通过上面的方式引用模块,使用visual studio是无法编译通过的:

d5ab15036f582eec81e858dbafc54ce2.png

需要在解决方案目录下,手动执行dotnet restore命令即可:

872e80c64e11779377bbf7d64191109c.png

模块开发

接下来关于文件管理功能的开发,都在模块Xhznl.FileManagement中进行,它是一个独立的解决方案。初学ABP,下面就以尽量简单的方式来实现这个模块。

应用服务

模块开发通常从Domain层实体建立开始,但是这里先跳过。先在FileManagement.Application.Contracts项目添加应用服务接口和Dto。

modulesfile-managementsrcXhznl.FileManagement.Application.ContractsFilesIFileAppService.cs:

public interface IFileAppService : IApplicationService{    Task GetAsync(string name);    Task CreateAsync(FileUploadInputDto input);}

modulesfile-managementsrcXhznl.FileManagement.Application.ContractsFilesFileUploadInputDto.cs:

public class FileUploadInputDto{    [Required]    public byte[] Bytes { get; set; }    [Required]    public string Name { get; set; }}

然后是FileManagement.Application项目,实现应用服务,先定义一个配置类。

modulesfile-managementsrcXhznl.FileManagement.ApplicationFilesFileOptions.cs:

public class FileOptions{    ///     /// 文件上传目录    ///     public string FileUploadLocalFolder { get; set; }    ///     /// 允许的文件最大大小    ///     public long MaxFileSize { get; set; } = 1048576;//1MB    ///     /// 允许的文件类型    ///     public string[] AllowedUploadFormats { get; set; } = { ".jpg", ".jpeg", ".png", "gif", ".txt" };}

modulesfile-managementsrcXhznl.FileManagement.ApplicationFilesFileAppService.cs:

public class FileAppService : FileManagementAppService, IFileAppService{    private readonly FileOptions _fileOptions;    public FileAppService(IOptions fileOptions)    {        _fileOptions = fileOptions.Value;    }    public Task GetAsync(string name)    {        Check.NotNullOrWhiteSpace(name, nameof(name));        var filePath = Path.Combine(_fileOptions.FileUploadLocalFolder, name);        if (File.Exists(filePath))        {            return Task.FromResult(File.ReadAllBytes(filePath));        }        return Task.FromResult(new byte[0]);    }    [Authorize]    public Task CreateAsync(FileUploadInputDto input)    {        if (input.Bytes.IsNullOrEmpty())        {            throw new AbpValidationException("Bytes can not be null or empty!",                new List                {                    new ValidationResult("Bytes can not be null or empty!", new[] {"Bytes"})                });        }        if (input.Bytes.Length > _fileOptions.MaxFileSize)        {            throw new UserFriendlyException($"File exceeds the maximum upload size ({_fileOptions.MaxFileSize / 1024 / 1024} MB)!");        }        if (!_fileOptions.AllowedUploadFormats.Contains(Path.GetExtension(input.Name)))        {            throw new UserFriendlyException("Not a valid file format!");        }        var fileName = Guid.NewGuid().ToString("N") + Path.GetExtension(input.Name);        var filePath = Path.Combine(_fileOptions.FileUploadLocalFolder, fileName);        if (!Directory.Exists(_fileOptions.FileUploadLocalFolder))        {            Directory.CreateDirectory(_fileOptions.FileUploadLocalFolder);        }        File.WriteAllBytes(filePath, input.Bytes);        return Task.FromResult("/api/file-management/files/" + fileName);    }}

服务实现很简单,就是基于本地文件系统的读写操作。

下面是FileManagement.HttpApi项目,添加控制器,暴露服务API接口。

modulesfile-managementsrcXhznl.FileManagement.HttpApiFilesFileController.cs:

[RemoteService][Route("api/file-management/files")]public class FileController : FileManagementController{    private readonly IFileAppService _fileAppService;    public FileController(IFileAppService fileAppService)    {        _fileAppService = fileAppService;    }    [HttpGet]    [Route("{name}")]    public async Task GetAsync(string name)    {        var bytes = await _fileAppService.GetAsync(name);        return File(bytes, MimeTypes.GetByExtension(Path.GetExtension(name)));    }    [HttpPost]    [Route("upload")]    [Authorize]    public async Task CreateAsync(IFormFile file)    {        if (file == null)        {            throw new UserFriendlyException("No file found!");        }        var bytes = await file.GetAllBytesAsync();        var result = await _fileAppService.CreateAsync(new FileUploadInputDto()        {            Bytes = bytes,            Name = file.FileName        });        return Json(result);    }}

运行模块

ABP的模板是可以独立运行的,在FileManagement.HttpApi.Host项目的模块类FileManagementHttpApiHostModule配置FileOptions:

63d3e770003a48d8a9b259dcc3d44f8c.png

修改FileManagement.HttpApi.Host和FileManagement.IdentityServer项目的数据库连接配置,然后启动这2个项目,不出意外的话可以看到如下界面。

FileManagement.HttpApi.Host:

e16e765153918d4f8af51270c773999f.png

FileManagement.IdentityServer:

50ad6695377fa2cba9ebecdd2083a10a.png

现在你可以使用postman来测试一下File的2个API,当然也可以编写单元测试。

e3d5e9221fe674745a94afaa0118b22b.png
7209ba5752265b6d6bc4f7a234f01080.png
9e96d6226fdfcae468223b41818dd0bf.png

单元测试

更好的方法是编写单元测试,关于如何做好单元测试可以参考ABP源码,下面只做一个简单示例:

5459bcd12973cd5261fb80d4c418b4ad.png
4b94ac85d46724fce3842691d9a1bf27.png
3ecfa3f83faf07c82f8f27ca82cad27c.png
a3e6a05ff20544792d427c978e60522e.png
d240e4eedb7ef4f49ac93fe8a19be103.png

模块使用

模块测试通过后,回到主项目。模块引用,模块依赖前面都已经做好了,现在只需配置一下FileOptions,就可以使用了。

876bbf27bc7c2d6eee4b1d9741be17d2.png
2e8ba403fda6e1ccb441a7a44a49333b.png

目前FileManagement.Domain、FileManagement.Domain.Shared、FileManagement.EntityFrameworkCore这几个项目暂时没用到,项目结构也不是固定的,可以根据自己实际情况来调整。

最后

本文的模块示例比较简单,只是完成了一个文件上传和显示的基本功能,关于实体,数据库,领域服务,仓储之类的都暂时没用到。但是相信可以通过这个简单的例子,感受到ABP插件式的开发体验,这是一个好的开始,更多详细内容后面再做介绍。本文参考了ABP blogging模块的文件管理,关于文件存储,ABP中也有一个BLOB系统可以了解一下。

http://www.lbrq.cn/news/2585467.html

相关文章:

  • 赣州淘捷网络科技有限公司河北网站seo外包
  • 晋中网站公司云巅seo
  • 南通市住房和建设局网站广告软文小故事200字
  • 向国旗致敬做时代新人网站网络科技公司网站建设
  • 网站搜索优化靠谱seo研究中心培训机构
  • 秦皇岛北京网站建设怎么接推广
  • 网站开发调研站长之家网站排行榜
  • 北京网站改版营销推广外包
  • 东莞南城网站开发公司免费网站大全
  • 网站建设培训会上的讲话查淘宝关键词排名软件有哪些
  • 百度竞价镇江seo网页的基础知识
  • 做局域网站数据库客户管理软件哪个好用
  • 织梦门户网站源码专业代写软文
  • 中国最好网站建设公司哪里能搜索引擎优化
  • 网站反链数武汉seo服务多少钱
  • 外包公司做网站的流程设计网站用什么软件
  • c做网站怎样做网站的优化、排名
  • 最好的网站制作公司windows优化大师官方网站
  • 兰州关键词网络推广广州seo报价
  • 云南网站建设效果好吗电商网站链接买卖
  • 网站改版打造全新网站seo免费
  • 百度不收录哪些网站吗百度网盘app怎么打开链接
  • 织梦系统怎么复制网站模板优化大师好用吗
  • 枣庄公司做网站百度关键词优化策略
  • 汕头网站推广公司网站排名提升软件
  • 贵州建设监理协会网站进不了百度快照怎么删除
  • 搭建网站服务vi设计
  • 南京网站建设有限公司百度客服在线咨询人工服务
  • 网站如何留住客户百度竞价一个月5000够吗
  • 又一个wordpress站点企业网站推广技巧
  • 区块链 和 一致性哈希的结合
  • STM32-ESP8266通过MQTT与阿里云通讯
  • (FD Conv)Frequency Dynamic Convolution for Dense Image Prediction论文精读(逐段解析)
  • 安灯系统(Andon System)
  • SpringBoot与TurboGears2跨栈、整合AI服务、智能客服路由系统整合实战
  • 系统性学习数据结构-第一讲-算法复杂度