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

1 Data.Repository<TEntity>.GetByIdsAsync

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

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

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

        /// <summary>

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

        /// <remarks>

        /// 摘要:

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

        /// </remarks>

        /// <returns>

        /// 返回:

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

        /// </returns>

        /// </summary>

        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 缓存--用户缓存键实例

        /// <summary>

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

        /// <remarks>

        /// 摘要:

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

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

        /// </remarks>

        /// </summary>

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

        #endregion

3 Services.Customers.CustomerService.GetCustomersByIdsAsync

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

        /// <summary>

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

        /// <remarks>

        /// 摘要:

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

        /// </remarks>

        /// <returns>

        /// 返回:

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

        /// </returns>

        /// </summary>

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

        {

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

        }

4 Services.Customers.CustomerService.GetCustomerBySystemNameAsync

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

        /// <summary>

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

        /// <remarks>

        /// 摘要:

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

        /// </remarks>

        /// <returns>

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

        /// </returns>

        /// </summary>

        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

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

        /// <summary>

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

        /// <remarks>

        /// 摘要:

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

        /// </remarks>

        /// </summary>

        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

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

        /// <summary>

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

        /// <remarks>

        /// 摘要:

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

        /// </remarks>

        /// <returns>

        /// 返回:

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

        /// </returns>

        /// </summary>

        [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 });

        }

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

        /// <summary>

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

        /// <remarks>

        /// 摘要:

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

        /// </remarks>

        /// <returns>

        /// 返回:

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

        /// </returns>

        /// </summary>

        [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("出现了错误或问题!");

                }

            });

        });

    </script>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
使用 JavaScript 编写的 Squareshooter 游戏及其源代码   项目:使用 JavaScript 编写的 Squareshooter 游戏(附源代码) 这款游戏是双人游戏。这是一款使用 JavaScript 编写的射击游戏,带有门户和强化道具。在这里,每个玩家都必须控制方形盒子(作为射手)。这款射击游戏的主要目标是射击对手玩家以求生存。当它射击对手时,它会获得一分。 游戏制作 该游戏仅使用 HTML 和 JavaScript 开发。该游戏的 PC 控制也很简单。 对于玩家 1: T:朝你上次动作的方向射击 A:向左移动 D:向右移动 W:向上移动 S:向下移动 对于玩家2: L:朝你上次移动的方向射击 左箭头:向左移动 右箭头:向右移动 向上箭头:向上移动 向下箭头:向下移动 游戏会一直进行,直到您成功射击对手或对手射击您为止。游戏得分显示在顶部。所有游戏功能均由 JavaScript 设置,而布局和其他次要功能则由 HTML 设置。 如何运行该项目? 要运行此项目,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要运行此游戏,首先,通过单击 index.html 文件在浏览器中打开项目。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值