第21章 JQuery DataTables对角色的渲染显示

news2025/1/11 6:07:01

1 Services.Customers.CustomerServiceDefaults

 /// <summary>

        /// 1个指定用户所对应的所有角色缓存键】

        /// <remarks>

        /// 摘要:

        ///     设定一个缓存键实例,用于拼接1个指定的缓存键字符串,该缓存键字符与角色实体所有实例两者构建了缓存映射关系。  

        /// {0} :1个指定用户所对应的整型编号值。

        /// {1} : 布尔值字符串,为缓存键字符串的拼接提供数据支撑,如果该布尔值字符串为:“True”,则缓存键字符所对应缓存项中存储着角色实体的所有实例;

        ///     如果该布尔值字符串为:“False”,则缓存键字符所对应缓存项中存储着处于激活状态的角色实体的所有实例。

        /// </remarks>

        /// </summary>

        public static CacheKey RolesCacheKey => new("customer.role.{0}-{1}", RolesByCustomerPrefix, CustomerRolesPrefix);

        /// <summary>

        /// 1个指定用户所对应的所有角色前缀】

        /// <remarks>

        /// 摘要:

        ///     设定一个缓存键实例,用于拼接1个指定的缓存键字符串,该缓存键字符与角色实体所有实例两者构建了缓存映射关系。  

        /// </remarks>

        /// </summary>

        public static string CustomerRolesPrefix => "customer.role.";

        /// <summary>

        /// 1个指定用户所对应的所有角色前缀】

        /// <remarks>

        /// 摘要:

        ///     设定一个缓存键实例,用于拼接1个指定的缓存键字符串,该缓存键字符与角色实体所有实例两者构建了缓存映射关系。  

        /// {0} :1个指定用户所对应的整型编号值。

        /// </remarks>

        /// </summary>

        public static string RolesByCustomerPrefix => "customer.role.{0}";

2 重构Services.Customers.Caching.CustomerCacheEventConsumer

using Core.Domain.Customers;

using Services.Caching;

namespace Services.Customers.Caching

{

    /// <summary>

    /// 摘要:

    ///     通过该类中的方法成员,在用户实体的1个实例执行插入、更新或持久化/逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免用户实体的列表渲染显示出现的异常。

    /// </summary>

    public class CustomerCacheEventConsumer : CacheEventConsumer<Customer>

    {

        /// <param name="entity">用户实体的1个指定实例。</param>

        /// <summary>

        /// 【异步清理缓存】

        /// <remarks>

        /// 摘要:

        ///     执行插入、更新或删除操作时,从分布式数据库中强制移除该方法中所有指定的所有缓存项(/(“JSON”编码格式的)值对)或字典实例中强制移除该方法中所有指定的所有键/值对。

        /// </remarks>

        /// </summary>

        protected override async Task ClearCacheAsync(Customer entity)

        {

            await RemoveByPrefixAsync(CustomerServicesDefaults.RolesByCustomerPrefix, entity);

        }

    }

}

3 重构Services.Customers.Caching.RoleCacheEventConsumer

using Core.Domain.Customers;

using Services.Caching;

namespace Services.Customers.Caching

{

    /// <summary>

    /// 摘要:

    ///     通过该类中的方法成员,在角色实体的1个实例执行插入、更新或持久化/逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免角色实体的列表渲染显示出现的异常。

    /// </summary>

    public class RoleCacheEventConsumer : CacheEventConsumer<Role>

    {

        /// <param name="entity">角色实体的1个指定实例。</param>

        /// <summary>

        /// 【异步清理缓存】

        /// <remarks>

        /// 摘要:

        ///     执行插入、更新或删除操作时,从分布式数据库中强制移除该方法中所有指定的所有缓存项(/(“JSON”编码格式的)值对)或字典实例中强制移除该方法中所有指定的所有键/值对。

        /// </remarks>

        /// </summary>

        protected override async Task ClearCacheAsync(Role entity)

        {

            await RemoveByPrefixAsync(CustomerServicesDefaults.CustomerRolesPrefix);

        }

    }

}

4 Services.Customers.Caching.CustomerRoleCacheEventConsumer

using Core.Domain.Customers;

using Services.Caching;

namespace Services.Customers.Caching

{

    /// <summary>

    /// 摘要:

    ///     通过该类中的方法成员,在用户角色映射实体的1个实例执行插入、更新或持久化/逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免用户角色映射实体的列表渲染显示出现的异常。

    /// </summary>

    public partial class CustomerRoleCacheEventConsumer : CacheEventConsumer<CustomerRole>

    {

        /// <param name="entity">用户角色映射实体的1个指定实例。</param>

        /// <summary>

        /// 【异步清理缓存】

        /// <remarks>

        /// 摘要:

        ///     执行插入、更新或删除操作时,从分布式数据库中强制移除该方法中所有指定的所有缓存项(/(“JSON”编码格式的)值对)或字典实例中强制移除该方法中所有指定的所有键/值对。

        /// </remarks>

        /// </summary>

        protected override async Task ClearCacheAsync(CustomerRole entity)

        {

            await RemoveByPrefixAsync(CustomerServicesDefaults.CustomerRolesPrefix);

        }

    }

}

5 Services.Customers.CustomerService.GetRolesAsync

/// <param name="customer">用户实体的1个指定实例。</param>

        /// <param name="showHidden">指示是否获取角色实体的所有实例,默认值:false,即只获取处于激活状态的角色实体的所有实例。</param>

        /// <summary>

        /// 【异步获取1个指定用户的所有角色】

        /// <remarks>

        /// 摘要:

        ///     直接从角色表中1个指定用户的所有角色实例;或从分布式缓存数据库获取1个指定用户的所有角色实例。

        /// </remarks>

        /// <returns>

        ///    列表实例,该实例存储着1个指定用户的所有角色实例。

        /// </returns>

        /// </summary>

        public virtual async Task<IList<Role>> GetRolesAsync(Customer customer, bool showHidden = false)

        {

            if (customer == null)

                throw new ArgumentNullException(nameof(customer));

            return await _roleRepository.GetAllAsync(query =>

            {

                return from role in query

                       join customerRole in _customerRoleRepository.Table on role.Id equals customerRole.RoleId

                       where customerRole.CustomerId == customer.Id &&

                             (showHidden || role.Active)

                       select role;

            }, cache => cache.PrepareKeyForShortTermCache(CustomerServicesDefaults.RolesCacheKey, customer, showHidden));

        }

6 重构Web.Areas.Admin.Factories.CustomerModelFactory.PrepareCustomerListModelAsync

 public virtual async Task<CustomerListModel> PrepareCustomerListModelAsync(CustomerSearchModel searchModel)

        {

            var createdTo = !searchModel.CreatedDateTo.HasValue ? null

               : searchModel.CreatedDateTo?.AddDays(1);

            //根据前端传递的用户过滤筛选模型纪录的1个指定实例,从用户表中获取(1逻辑页中的)相应行数的数据,并把这些数据存储到列表实例中。

            var customers = await _customerService.GetAllCustomersAsync(

                deleted: searchModel.Deleted,

                email: searchModel.Email,

                username: searchModel.Username,

                phone: searchModel.Phone,

                createdDateFrom: searchModel.CreatedDateFrom,

                createdDateTo: createdTo,

                orderByFiled: searchModel.OrderBy,

                orderByType: searchModel.OrderDir.ToString(),

                pageIndex: searchModel.Page - 1,

                pageSize: searchModel.PageSize);

            //实例化当前用户分页列表模型纪录(“物理页”),为Jquery DataTable插件当前页渲染显示提供基本且必须的数据支撑。

            var model = await new CustomerListModel().PrepareToGridAsync(searchModel, customers, () =>

            {

                return customers.SelectAwait(async customer =>

                {

                    var customerModel = customer.ToModel<CustomerModel>();

                    customerModel.Avatar = GetAbsoluteAvatarUrl(customerModel.Avatar);

                    customerModel.RoleNames = string.Join(", ",(await _customerService.GetRolesAsync(customer)).Select(role => role.Name));

                    return customerModel;

                });

            });

            return model;

        }

7 重构Web\Areas\Admin\Views\Customer\Index.cshtml

  { data: "phone", title: "手机", width: "100px", orderable: false },

                    {

                        data: "roleNames",

                        title: "角色",

                        width: "100px",

                        orderable: false,

                        //禁止当前列渲染显示排序按钮。

                        render: function (data, type, row, full, meta) {

                            var roleArray = data.split(",");

                            var roleHtml = "";

                            $.each(roleArray, function () {

                                roleHtml += "<span class='badge bg-info'>" + this + "</span><br/>"

                            });

                            return roleHtml;

                        },

                    },

对以上功能更为具体实现和注释见230602_021ShopRazor(JQuery DataTables对角色的渲染显示)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/602346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

量化多因子——描述数据(空值、重复值、异常值)

数据清洗是量化的第一步&#xff0c;也是非常关键的一步。 检查数据的空值、重复值、异常值&#xff0c;并进行描述性数据分析&#xff0c;观察数据的分布情况。 缺失值&#xff1a; return_all.info() np.where(np.isnan(return_all)) np.where(np.isinf(return_all)) 重复值&…

基础巩固(五)Android通过WebView与Js交互

文章目录 简介WebView基本使用常用方法WebView的生命周期 / 状态切换关于前进 / 后退网页清除缓存数据 常用类WebSettings类常见用法&#xff1a;设置WebView缓存 WebViewClient类WebChromeClient类 注意事项如何避免WebView内存泄露 使用案例 通过WebView使得native与Js交互An…

k8s安装部署

1、基础环境 所有机器执行以下操作 hostname ipk8s-master192.168.0.121k8s-node1192.168.0.102k8s-node2192.168.0.160 docker version&#xff1a;20.10.7 k8s相关插件version&#xff1a;1.20.9 #各个机器设置自己的域名 hostnamectl set-hostname xxxx# 将 SEL…

Java中令人惊艳的五大算法,你知道多少?

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Golang - 选项模式 vs 构建器模式

在使用Golang创建复杂对象时&#xff0c;常用的两种模式是选项模式&#xff08;Options pattern&#xff09;和构建器模式&#xff08;Builder pattern&#xff09;。这两种模式各有优缺点&#xff0c;选择适合项目需求的模式取决于具体情况。 问题 假设我们想创建一个具有许…

【HTTP 协议】掌握 Web 的核心技术

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 HTTP 协议&#xff08;超文本传输协议&#xff09;&#xff0c;不知道大家第一次是从什么地方了解到这个协议的呢&#xff1f;在真实的网络环境中网络协议的种类非常多&#xff0c;其中有一些耳熟能详的…

GBASE南大通用5月份公司动态一览

产品动态 5月初&#xff0c;GBASE南大通用两款新产品&#xff1a;GBase 8c V5.0和GBase 8s V8.8.5于鲲鹏开发者大会主论坛商业发行版联合发布仪式上正式发布。新版本与上一版本功能特性保持兼容&#xff0c;并在算子能力、用户级别审计、兼容性等方面全面增强&#xff0c;支持一…

最新版本 Stable Diffusion 开源 AI 绘画工具之微调模型篇

✨ 目录 &#x1f388; 模型种类&#x1f388; 变分自动编码器 / VAE&#x1f388; 美学梯度 / Aesthetic Gradients&#x1f388; 大型语言模型的低阶自适应 / LoRA&#x1f388; 超网络模型 / Hypernetwork&#x1f388; 微调模型 / LyCORIS &#x1f388; 模型种类 当你打开…

jacoco检测功能或自动化测试覆盖率

参考文档&#xff1a;http://t.csdn.cn/QqCSh http://t.csdn.cn/HonVL 目录 下载jacoco 启动jacocoagent监控被测项目 执行手工测试 生成exec文件 生成report报告 jacoco代码覆盖率报告分析 下载jacoco http://t.csdn.cn/HonVL 我下载的最新的 jacoco-0.8.10.zip 下…

虚拟化技术 — Cgroups 与 Namespaces 支撑实现的操作系统虚拟化

目录 文章目录 目录操作系统虚拟化&#xff08;容器技术&#xff09;的发展历程ChrootCgroupsCgroup SubsystemsCgroup FilesystemCgroup HierarchyCgroups 的操作规则Cgroups 的代码实现 NamespacesUTS namespacePID namespaceIPC namespaceMount namespaceNetwork namespaceU…

mysql order by 索引问题综合分析

一&#xff0c;文章1 Mysql-索引失效 order by优化_orderby索引失效_zyk1.的博客-CSDN博客 总结&#xff1a; 0&#xff0c;索引 与 查询条件 与 排序字段关系&#xff0c;Using filesort出现场景 1.联合索引&#xff0c;最左匹配原则&#xff0c;不仅查询条件需要遵循&…

vivado FIFO的Standard 和 FWFT模式

vivado FIFO的Standard 和 FWFT模式 Standard 模式读操作 对于标准 FIFO 读取操作&#xff0c;在断言读有效后&#xff0c;如果 FIFO 非空&#xff0c;存储在FIFO中的下一个数据被驱动到输出总线&#xff08;dout&#xff09;上和VALID标志有效。 下图显示标准模式下的读数据…

ChatGPT介绍与使用场景

ChatGPT是OpenAI开发的一款基于GPT-3和GPT-4的人工智能聊天机器人。“GPT"代表的是"Generative Pre-trained Transformer”&#xff0c;这是一种深度学习技术&#xff0c;使用人工神经网络来生成类似人类的文本。 ChatGPT能够处理各种对话任务&#xff0c;包括回答问…

教您如何快速自助搭建一个元宇宙场景

【导语】 在数字化时代&#xff0c;营销方式正经历着巨大的变革。而在这场变革的浪潮中&#xff0c;元宇宙编辑器凭借其独特的元宇宙展厅解决方案&#xff0c;为企业和个人提供了快速、简便的自助搭建元宇宙场景的机会。 今天&#xff0c;让我们一起走进元宇宙编辑器的世界&…

如何将Windows 7系统镜像部署到不同的硬件计算机?

案例&#xff1a;将Windows 7系统镜像恢复到另一台电脑 “我有一台运行 Windows 7 的电脑&#xff0c;我已经创建了一个系统镜像并希望将其加载到另一台电脑上。但是&#xff0c;当我运行恢复控制台时&#xff0c;我不断收到错误消息。这让我想知道是否可以创建 Windows 7 系…

前端面试技巧?第一手面试真题!

面试有哪些套路和技巧&#xff1f; 第一次去面试&#xff0c;该注意什么&#xff1f; 怎么说话能打动面试官&#xff0c;成功入职&#xff1f; 当你褪去青涩&#xff0c;将头发梳成大人模样走向面试之路时&#xff0c;你们的搜索记录和行为早已暴露了自己内心状态&#xff1a…

数据结构和算法的基本概念

数据结构概念 1.数据&#xff1a;所有能输入计算机且能被计算机处理的符号总称 2.数据元素&#xff1a;是数据的基本单位&#xff0c;表示数据集合中的一个个体。 3 .数据项&#xff1a;数据元素中有独立含义的最小单位。 数据结构&#xff1a;相互之间存在一定关系的数据元素的…

Layui时间选择设置只能选择整点半点,并隐藏秒钟部分

文章目录 1.整点半点选择2.隐藏秒选择部分3.默认值处理3.1 操作done函数3.2 操作ready函数 1.整点半点选择 处理思路&#xff1a;通过循环将使用不到的时间点去除掉&#xff0c;关键代码位于ready函数 //选择起止时间 layui.laydate.render({elem: .laydate-times,type: &quo…

第五章 Electron|Node 使用cheerio 爬虫

一、cheerio是什么可以做什么 &#x1f447; &#x1f447; &#x1f447; Cheerio是一个快速、灵活且精益的jQuery核心实现&#xff0c;用于在Node.js环境中解析HTML文档。它可以帮助您在服务器端轻松地从HTML文档中提取数据&#xff0c;比如从网页中提取文章标题、内容、图片…

【JVM】.class文件如何在JVM中运行的?

一、先认识JVM的组成 java虚拟机整体包括&#xff1a;类加载系统、运行时数据区、执行引擎、垃圾回收器。 &#xff08;1&#xff09;方法区&#xff1a;线程共享&#xff0c;存储Class信息、常量、静态变量等等&#xff1b; jdk1.6~1.7时称为永久代&#xff0c;存储常量、Cla…