第26章 用户实体删除与批量删除的定义实现

1 Data.Repository.GetByIdsAsync

 /// name="ids">列表实例,该实例存储着多1个指定的长整型编号值。

        /// name="getCacheKey">1个具有返回值的委托方法实例,委托方法实例用于获取缓存键类的1个指定实例,默认值:null,即不存在缓存键实例。

        /// name="includeDeleted">指示是否包含指定实体中所有的逻辑删除项,默认值:true,即指定实体的所有实例。

        ///

        /// 【异步通过编号集值获取】

        ///

        /// 摘要:

        ///     直接从指定表中1个指定实体的多个指定实例;或从分布式缓存数据库获取1个指定实体的多个指定实例(即使该实例处于逻辑删除状态,也获取该实例)

        ///

        ///

        /// 返回:

        ///    列表实例,该实例存储着1个指定实体的多个指定实例。

        ///

        ///

        public virtual async Task<IList<TEntity>> GetByIdsAsync(IList<long> ids, Func<IStaticCacheManager, CacheKey> getCacheKey = null, bool includeDeleted = true)

        {

            if (!ids?.Any() ?? true)

                return new List<TEntity>();

            async Task<IList<TEntity>> getByIdsAsync()

            {

                var query = AddDeletedFilter(Table, includeDeleted);

                //获取1个指定实体的多个指定实例。

                var entries = await query.Where(entry => ids.Contains(entry.Id)).ToListAsync();

                //根据编号集对多 个指定实例进行排序操作。

                var sortedEntries = new List<TEntity>();

                foreach (var id in ids)

                {

                    var sortedEntry = entries.Find(entry => entry.Id == id);

                    if (sortedEntry != null)

                        sortedEntries.Add(sortedEntry);

                }

                return sortedEntries;

            }

            if (getCacheKey == null)

                return await getByIdsAsync();

            //如果存在缓存键实例,则把1个指定实体的多个指定实例,缓存到分布式缓存数据库中。

            var cacheKey = getCacheKey(_staticCacheManager)

                ?? _staticCacheManager.PrepareKeyForDefaultCache(EntityCacheDefaults<TEntity>.ByIdsCacheKey, ids);

            //从分布式缓存数据库返回1个指定实体的多个指定实例。

            return await _staticCacheManager.GetAsync(cacheKey, getByIdsAsync);

        }

2 Services.Customers.CustomerServicesDefaults.CustomerBySystemNameCacheKey

        #region 缓存--用户缓存键实例

        ///

        /// 1个指定系统用户所对应的1个用户缓存键】

        ///

        /// 摘要:

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

        /// {0} :1个指定系统用户所对应的系统用户名。

        ///

        ///

        public static CacheKey CustomerBySystemNameCacheKey => new("customer.bysystemname.{0}");

        #endregion

3 Services.Customers.CustomerService.GetCustomersByIdsAsync

 /// name="customerIds">数组实例,该实例存储着多1个指定的长整型编号值。

        ///

        /// 【异步通过编号集值获取用户】

        ///

        /// 摘要:

        ///     直接从用户表中用户实体的多个指定实例;或从分布式缓存数据库获取用户实体的多个指定实例(即使该实例处于逻辑删除状态,也获取该实例)

        ///

        ///

        /// 返回:

        ///    列表实例,该实例存储着用户实体的多个指定实例。

        ///

        ///

        public virtual async Task<IList<Customer>> GetCustomersByIdsAsync(long[] customerIds)

        {

            return await _customerRepository.GetByIdsAsync(customerIds, includeDeleted: false);

        }

4 Services.Customers.CustomerService.GetCustomerBySystemNameAsync

        /// name="systemName">1个指定的系统用户名字符串。

        ///

        /// 【异步通过系统用户名获取用户】

        ///

        /// 摘要:

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

        ///

        ///

        ///    1个指定的用户实例。

        ///

        ///

        public virtual async Task<Customer> GetCustomerBySystemNameAsync(string systemName)

        {

            if (string.IsNullOrWhiteSpace(systemName))

                return null;

            var key = _staticCacheManager.PrepareKeyForDefaultCache(CustomerServicesDefaults.CustomerBySystemNameCacheKey, systemName);

            var query = from c in _customerRepository.Table

                        orderby c.Id

                        where c.Username == systemName

                        select c;

            //如果分布式缓存数据库中无指定实例,则把指定实例存储到分布式缓存数据库中后,获取指定实例。;如果分布式缓存数据库中有指定实例,则直接从分布式缓存数据库中获取指定实例。

            var customer = await _staticCacheManager.GetAsync(key, async () => await query.FirstOrDefaultAsync());

            return customer;

        }

5 Services.Customers.CustomerService.DeleteCustomerAsync

/// name="customerList">列表实例,该实例存储着用户实体的1/n个指定实例。

        ///

        /// 【异步逻辑批量删除用户】

        ///

        /// 摘要:

        ///     把用户实体的1/n个指定实例从用户表中物理批量删除后,并从缓存数据库中移除与用户相关的所有缓存项。

        ///

        ///

        public virtual async Task DeleteCustomerAsync(IList<Customer> customerList)

        {

            await _customerRepository.DeleteAsync(customerList);

        }

6 重构Services.Customers.Caching.CustomerCacheEventConsumer

  protected override async Task ClearCacheAsync(Customer entity)

        {

            await RemoveByPrefixAsync(CustomerServicesDefaults.RolesByCustomerPrefix, entity);

            await RemoveAsync(CustomerServicesDefaults.CustomerBySystemNameCacheKey, entity.Username);

        }

7 Web.Areas.Admin.Controllers.CustomerController.Delete/ DeleteSelected

       /// name="id">1个指定的长整编号值。

        ///

        /// 【逻辑删除1个用户】

        ///

        /// 摘要:

        ///     从用户表中逻辑删除1个指定用户实例。

        ///

        ///

        /// 返回:

        ///     JSON编码格式的删除操作状态结果。

        ///

        ///

        [HttpPost]

        public async Task<IActionResult> Delete(long id)

        {

            var customer = await _customerService.GetCustomerByIdAsync(id);

            if (!customer.Username.Equals(CustomerDefaults.DefaultSystemCustomer, StringComparison.InvariantCultureIgnoreCase))

                await _customerService.DeleteCustomerAsync(customer);

            return Json(new { Result = true });

        }

        /// name="selectedIds">集合实例,该实例存储着多个指定的长整编号值。

        ///

        /// 【逻辑删除多个用户】

        ///

        /// 摘要:

        ///     从用户表中逻辑删除多个指定用户实例。

        ///

        ///

        /// 返回:

        ///     JSON编码格式的删除操作状态结果。

        ///

        ///

        [HttpPost]

        public virtual async Task<IActionResult> DeleteSelected(ICollection<long> selectedIds)

        {

            var customer = await _customerService.GetCustomerBySystemNameAsync(CustomerDefaults.DefaultSystemCustomer);

            if (selectedIds.Any(x => x.Equals(customer.Id)))

               selectedIds.Remove(customer.Id);

            await _customerService.DeleteCustomerAsync((await _customerService.GetCustomersByIdsAsync(selectedIds.ToArray())).ToList());

            return Json(new { Result = true });

        }

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

 //删除单个指定用户

        function deleteData(id) {

            if (!confirm("确定删除该记录:" + id +"吗?")) {

                return;

            }

            if (id <= 0) {

                alert("参数错误!");

                return;

            }

            $.post("/Admin/Customer/Delete/", { id: id }, function (data) {

                if (data.result) {

                    var pageIndex = tableModel.page();//当前页页码值,但是Jquery DataTables插件的页面是从“0”开始,而不从“1”

                    var pageLength = tableModel.page.info().length;//1页最多显示的行数值。

                    var pageStart = tableModel.page.info().start;  //获取Jquery DataTable插件当前显示页面,需要跳过的行数值:=(页数-1)*pageSize(length(默认值)102050100)

                    var pageCount = tableModel.page.info().pages;//获取Jquery DataTable插件中的总页面值。

                    var recordsTotal = tableModel.page.info().recordsTotal - 1;;//执行删除操作后Jquery DataTable插件中的总项数。

                    if ((recordsTotal - pageStart) <= 0 && pageStart > 0) {

                        $("#example").DataTable().page('previous').draw("page");//返回上一页

                    }

                    else {

                        $("#example").DataTable().page(pageIndex).draw(false); //刷新当前页;或跳转到指定页。

                    }

                }

                else {

                    alert("出现了错误或问题!");

                }

            });

        }

        //批量删除

        $("#DeleteSelected").on("click", function () {

            var idArray = new Array(); //批量删除的用户ID数组

            $("[name=checkItem]:checkbox:checked").each(function (index) {

                idArray.push($(this).val());

            });

            if (idArray.length == 0) {

                alert("请选择要删除的用户!");

                return;

            }

            //执行您的删除操作

            alert("删除用户的编号:" + idArray);

            $.post("/Admin/Customer/DeleteSelected/", { selectedIds: idArray }, function (data) {

                if (data.result) {

                    var pageIndex = tableModel.page();//当前页页码值,但是DataTables插件的页面是从“0”开始,而不从“1”

                    var pageLength = tableModel.page.info().length;//1页最多显示的行数值。

                    var pageStart = tableModel.page.info().start;  //获取Jquery DataTable插件当前显示页面,需要跳过的行数值:=(页数-1)*pageSize(length(默认值)102050100)

                    var pageCount = tableModel.page.info().pages;//获取Jquery DataTable插件中的总页面值。

                    var recordsTotal = tableModel.page.info().recordsTotal - idArray.length;//执行删除操作后Jquery DataTable插件中的总项数。

                    if ((recordsTotal - pageStart) <= 0 && pageStart > 0) {

                        $("#example").DataTable().page('previous').draw("page");//返回上一页

                    }

                    else {

                        $("#example").DataTable().page(pageIndex).draw(false); //刷新当前页;或跳转到指定页。

                    }

                }

                else {

                    alert("出现了错误或问题!");

                }

            });

        });

   

对以上功能更为具体实现和注释见:230613_026ShopRazor(用户实体删除与批量删除的定义实现)。

你可能感兴趣的:(.Net7,MVC,删除与批量删除)