1 Data.Repository
/// 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:(默认值)10,20,50,100)。
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:(默认值)10,20,50,100)。
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(用户实体删除与批量删除的定义实现)。