abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级之上(六十一)

Posted DotNet菜园

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级之上(六十一)相关的知识,希望对你有一定的参考价值。

在前面的文章中我们已经将abp(net core)+easyui+efcore实现的仓储管理系统升级到ABP7.3,今天我们对组织管理功能进行升级,并解决升级过后的一些问题。

 Abp(net core)+easyui+efcore实现仓储管理系统目录

 

      有了前一篇文章(abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级(六十) ),对于模块管理的升级过程中解决升级中出现的问题的一些经验。我们对组织管理这个模块进行升级。

一、添加Profile定义文件

   1. 在Visual Studio 2022的“解决方案资源管理器”中,右键单击“ABP.TPLMS.Application”项目,使用鼠标左键展开“Orgs” > “Dto”文件夹

  2. 使用鼠标右键单击“Dto”文件夹,然后选择“添加” > “类”。 将类命名为 OrgMapProfile,然后选择“添加”。代码如下。

using ABP.TPLMS.Authorization.Users;

using ABP.TPLMS.Entitys;
using ABP.TPLMS.Users.Dto;
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ABP.TPLMS.Orgs.Dto


    public class OrgMapProfile:Profile
    

        public OrgMapProfile()

        

            CreateMap<OrgDto, Org>();
            CreateMap<OrgDto, CreateUpdateOrgDto>();
           CreateMap<CreateUpdateOrgDto, Org>(); 

        
    
 

二、修改OrgAppService类

   3.在Visual Studio 2022的“解决方案资源管理器”中,在“Orgs”文件夹中找到OrgAppService.cs文件,双击在文本编辑器中打开,修改代码如下。

using Abp.Application.Services;
using Abp.Application.Services.Dto;
using Abp.Domain.Repositories;
using Abp.Web.Models;
using ABP.TPLMS.Entitys;
using ABP.TPLMS.Modules.Dto;
using ABP.TPLMS.Orgs.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ABP.TPLMS.Orgs

    public class OrgAppService : AsyncCrudAppService<Org, OrgDto, int, PagedOrgResultRequestDto,
                            CreateUpdateOrgDto, CreateUpdateOrgDto>, IOrgAppService
 
    
        public OrgAppService(IRepository<Org, int> repository)
            : base(repository)
        
 
        
        [DontWrapResult]
        public  PagedOrgResultDto<OrgDto> GetAllOrgs(PagedOrgResultRequestDto input)
        
            PagedOrgResultDto<OrgDto> orgs = new PagedOrgResultDto<OrgDto>();
            input.SkipCount = 0;//这里需要进行参数传递
            input.MaxResultCount= 1000;          
            var allOrgs=GetAllAsync(input);           

            IReadOnlyList<OrgDto> result = AddParentOrgs(input, allOrgs.Result.Items).AsReadOnly();
            orgs.Rows = result;
            orgs.Total = result.Count;
            return orgs;
        
        private List<OrgDto> AddParentOrgs(PagedOrgResultRequestDto input,IReadOnlyList<OrgDto> list)
        
            List<OrgDto> result = new List<OrgDto>();
            if (list == null)
                return result;
            var qry1 = base.CreateFilteredQuery(input);
            List<Org> listParent = new List<Org>();
            GetParentOrgs(listParent, list[0].ParentId, qry1);
          
            foreach (var item in listParent)
            
                result.Add(ObjectMapper.Map<OrgDto>(item));
            
            result.AddRange(list.ToArray());
            return result;
        
 

        protected override IQueryable<Org> CreateFilteredQuery(PagedOrgResultRequestDto input)
        

            var qry = base.CreateFilteredQuery(input)
                .Where(t => t.Name.Contains(input.OrgName == null ? string.Empty : input.OrgName))

                .Where(t => t.BizCode.Contains(input.OrgCode == null ? string.Empty : input.OrgCode))

                .Where(t => t.CustomCode.Contains(input.CustomCode == null ? string.Empty : input.CustomCode));

            return qry;
        
        private void GetParentOrgs(List<Org> orgs, int ParentId, IQueryable<Org> listOrgs)
        

            List<Org> drs = listOrgs.Where(x => x.Id == ParentId).ToList();
            if (drs == null || drs.Count <= 0)
            
                return;
            
            else
            
                for (int i = 0; i < drs.Count; i++)
                
                    var dr = drs[i];
                    if (!orgs.Contains(dr))
                    
                        orgs.Add(dr);
                                       
                    GetParentOrgs(orgs, dr.ParentId, listOrgs);
                
            
        
    

4. 上面代码中需要特别注意的一点,是GetAllOrgs方法中的input.SkipCount=0这一行代码,如果将这一行代码注释掉,在进行条件查询时,会报错。在组织管理页面的海关代码中输入“2011”,然后点击“查询”按钮。如下图。

5.Visual Studio 2022会弹出一个用记未处理的异常,错误信息,如下图。

 

    6.在Visual Studio 2022的解决方案资源管理器中,将刚才注释掉的那一条代码“input.SkipCount=0”,还原。按F5运行应用程序。

   7.在浏览器中的登录页面中输入管理员用户名和密码进行登录。

   8.在主界面的菜单中,选择“Business->组织管理”菜单项,浏览器中呈现一个组织信息列表与四个按钮。组织信息能正常显示。如下图。

  9. 在“组织管理”列表页面的海关代码输入框中输入“2011”,然后点击“查询”按钮。如下图。

 

10.这一次程序运行正常,查询出了结果,结果如下图。

11.在“组织管理”列表页面中使用鼠标点击“添加”按钮,弹出“添加组织信息”界面。如下图。

 

12.在“添加组织信息”中填写完信息,然后点击“保存”按钮,将新添加的组织信息保存到数据库。如下图。

 

 

 

 

ABP .Net Core 部署到IIS 问题汇总

文章来源:https://www.cnblogs.com/donaldtdz/p/7802096.html

在ABP官网创建一个.Net Core项目编译完成

1、 发布网站

 技术分享图片

技术分享图片

技术分享图片

 

2、 IIS新建站点

目录指向发布的目录

 技术分享图片

 

3、安装WindowsHosting

IIS安装服务器上安装DotNetCore.X.X.X-WindowsHosting安装成功后重启IIS服务器。根据版本选择下载

下载地址:https://www.microsoft.com/net/download/windows  。

上面官网下载没整成功,然后去网上找了个下载整成功了。

http://download.csdn.net/download/fushangde123/10272240

 技术分享图片

如果没有安装SDK 需要安装.Net Core SDK

4、 修改application pool应用程序池 选择无托管代码

 技术分享图片

5、 浏览程序

报错如下:

An error occurred while starting the application.

看不到详细信息需要修改web.config 查看详细信息 将stdoutLogEnabled的修改为 true,并在应用程序根目录添加 logs 文件夹

<aspNetCore processPath="dotnet" arguments=".\\tzky.saas.Web.Host.dll" stdoutLogEnabled="true" stdoutLogFile=".\\logs\\stdout" forwardWindowsAuthToken="false" />

再浏览网站,当然还是报错,现在到logs目录查看报错详细信息

错误信息:用户 ‘IIS APPPOOL\\saasapp‘ 登录失败

 技术分享图片

 

6、错误诊断与解决

错误分析很显然是应用程序权限问题,只要到application pool应用池-> 高级 -> 标识 将原来ApplicationPoolIdentity改为对数据库有访问权限和网站文件有读写权限的Windows用户(这里需要确定这个Windows用户可以登录数据库,不行可以在数据库安全设置添加。当然你也可以将数据库连接字符窜改为数据库用户和密码访问,比如:sa),然后重启应用池,重启网站浏览

 技术分享图片

技术分享图片

启动运行成功

 技术分享图片

 

7、总结

.Net Core 和 传统的.Net 程序IIS部署主要注意以下几点:

  • 安装DotNetCore.X.X.X-WindowsHosting和.Net Core SDK
  • 应用池配置为无托管代码(网上解释:ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑之后再将HTTP响应数据重新回写到IIS中,最终转达到不同的客户端(浏览器,APP,客户端等)。而配置文件和过程都会由些许调整,中间最重要的角色便是AspNetCoreModule,它是其中一个的IIS模块,请求进入到IIS之后便立即由它转发,并迅速重定向到ASP.NET Core项目中,所以这时候我们无需设置应用程序池来托管我们的代码,它只负责转发请求而已)
  • 如果需要读写根目录权限,要更改应用池 ApplicationPoolIdentity
  • 网站报错,通过修改web.config 启用错误日志查看详细错误信息

来源:https://www.cnblogs.com/donaldtdz/p/7802096.html

以上是关于abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级之上(六十一)的主要内容,如果未能解决你的问题,请参考以下文章

abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级之上(六十一)

abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之上(六十三)

[Abp 源码分析]ASP.NET Core 集成

基于Abp 的.net core 工程改造mysql 的记录

基于Abp 的.net core 工程改造mysql 的记录

如何为 .NET Core 重命名 ABP 中的列?