怎样优雅地增删查改(七):按用户查询

文章介绍了如何通过定义IUserOrientedFilter接口来实现按用户查询的功能。在查询实体列表时,如果输入参数实现了该接口,系统会自动过滤出指定用户或当前登录用户关联的实体。关键在于ApplyUserOrientedFiltered方法,它根据接口提供的信息构造并应用LINQ表达式进行过滤。示例中展示了在GetAllAlarmInput类中实现接口的应用,以及测试过程,包括创建组织、客户和告警,然后查看特定用户告警的场景。

文章目录

实现

定义按用户查询(IUserOrientedFilter)接口

public interface IUserOrientedFilter
{
    public string EntityUserIdIdiom { get; }
    Guid? UserId { get; set; }
}

  • EntityUserIdIdiom:语义上的UserId,用于指定业务实体中用于描述“用户Id”字段的名称,若不指定,则默认为“UserId”
  • UserId:用户Id,若为Guid.Empty,则使用当前登录用户的Id

查询实体列表Dto若实现该接口,将筛选指定 UserId 下的关联的实体。

若指定 UserId 为 Guid.Empty,则使用当前登录用户的 UserId。

ICurrentUser是Abp的一个服务,用于获取当前登录用户的信息

创建应用过滤条件方法:ApplyUserOrientedFiltered,在此实现拼接LINQ表达式,代码如下:

protected virtual IQueryable<TEntity> ApplyUserOrientedFiltered(IQueryable<TEntity> query, TGetListInput input)
{
    if (input is IUserOrientedFilter)
    {
        var filteredInput = input as IUserOrientedFilter;
        var entityUserIdIdiom = filteredInput.EntityUserIdIdiom;
        if (string.IsNullOrEmpty(entityUserIdIdiom))
        {
            entityUserIdIdiom = "UserId";
        }
        if (HasProperty<TEntity>(entityUserIdIdiom))
        {
            var property = typeof(TEntity).GetProperty(entityUserIdIdiom);
            if (filteredInput != null && filteredInput.UserId.HasValue)
            {
                Guid userId = default;
                if (filteredInput.UserId.Value == Guid.Empty)
                {
                    using (var scope = ServiceProvider.CreateScope())
                    {
                        var currentUser = scope.ServiceProvider.GetRequiredService<ICurrentUser>();
                        if (currentUser != null)
                        {
                            userId = currentUser.GetId();
                        }
                    }
                }
                else
                {
                    userId = filteredInput.UserId.Value;
                }

                var parameter = Expression.Parameter(typeof(TEntity), "p");
                var keyConstantExpression = Expression.Constant(userId, typeof(Guid));

                var propertyAccess = Expression.MakeMemberAccess(parameter, property);
                var expression = Expression.Equal(propertyAccess, keyConstantExpression);

                var equalExpression = expression != null ?
                        Expression.Lambda<Func<TEntity, bool>>(expression, parameter)
                        : p => false;

                query = query.Where(equalExpression);
            }
        }
    }
    return query;
}


请注意,可应用过滤的条件为:

  1. input需实现IUserOrientedFilter接口;
  2. 实体必须关联用户。

否则将原封不动返回IQueryable对象。

使用

无需在应用层中更改代码,

在GetAllAlarmInput中实现IUserOrientedFilter接口,代码如下:

public class GetAllAlarmInput : PagedAndSortedResultRequestDto, IUserOrientedFilter
{
    Guid? UserId { get; set; }
    
    public string EntityUserIdIdiom { get; }      
    // 或显式实现   
    // public string EntityUserIdIdiom => "UserId";
    
    ...
}

测试

创建一些组织架构,命名“群组”

在这里插入图片描述

在不同“群组”下创建一些客户(Client)

在这里插入图片描述

在这里插入图片描述

在告警管理页面中,创建一些告警,并将这些告警分配给不同的客户

在这里插入图片描述

告警创建完成后,进入客户管理,在右侧客户列表中点击“查看详情”

打开客户详情页面,点击“告警”标签页,可以看到该客户下的告警列表

在这里插入图片描述

资源介绍“Java毕业设计-基于springboot开发的学生成绩管理系统”是一个综合性的学生成绩管理解决方案,它结合了Java编程语言的稳定性与Spring Boot框架的便捷性,为学生成绩管理提供了高效、安全的平台。该系统不仅具备基本的学生信息管理、成绩录入、成绩查询等功能,还融入了数据统计分析、成绩预警等高级特性,满足了现代教学管理的多样化需求。在系统的设计上,我们充分考虑了用户体验与数据安全性。通过简洁明了的操作界面,用户可以轻松完成各项管理任务。同时,系统采用了严格的数据加密和权限控制机制,确保了学生信息的安全与隐私。在技术实现上,该系统采用了Spring Boot框架,大大简化了开发流程,提高了开发效率。同时,系统还集成了多种前端技术,如HTML、CSS和JavaScript,为用户提供了友好的交互体验。值得一提的是,该系统具有良好的扩展性和可定制性。它提供了丰富的API接口,方便与其他系统进行集成。此外,系统的源代码清晰易懂,注释详尽,为二次开发提供了便利。用户可以根据自身需求,对系统进行定制开发,满足特定的教学管理需求。本资源还附带了详细的说明文档,对系统的各个模块、功能及使用方法进行了详细的介绍。同时,我们还提供了完整的源代码,方便用户进行学习和研究。总的来说,“Java毕业设计-基于springboot开发的学生成绩管理系统”是一个功能丰富、性能稳定、易于定制的学生成绩管理解决方案,它将为学校的教学管理工作带来极大的便利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林晓lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值