1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/qinyongcheng-NetCoreFast

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Query.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 01:35 40a9520

Фильтр запросов QueryFilterAttribute

Фильтр запросов Web.Filter.QueryFilterAttribute используется для настройки условий в методах добавления, изменения, удаления и запроса данных.

1. Фильтр удаления и запроса

(1) Реализация на стороне сервера

Шаг 1: Добавить атрибут [QueryFilter] к контроллеру или методу action.

Шаг 2: Назвать метод действия «list», «delete», «batchdelete», «get» или «query» (без учёта регистра). Либо добавить атрибут [Queryable] к методу.

Шаг 3: Добавить параметр Dictionary<string, string> типа FromQuery к методу действия для получения параметров запроса от клиента и установки предопределённых параметров фильтра QueryFilterAttribute.

Шаг 4: Вызвать метод класса бизнес-логики с параметром типа Dictionary<string, string>, который имеет тип параметра запроса, и запросить данные.

 [Route("api/[controller]/[action]")]
 [ApiController]
 [QueryFilter]
public class AreaController: MyBaseController<Area>
  [HttpGet]
  public Result List([FromQuery] Dictionary<string, string> where)
  {
     return Result.Success("succeed").SetData(bll.Query(where));
  }
}

В QueryFilterAttribute есть встроенные предустановленные параметры запроса:
Для методов запроса «list» и «query»:
a) Если информация о пользователе содержит tenantId, это означает, что пользователь принадлежит нескольким арендаторам. Тогда условие запроса where будет включать tenantId для фильтрации данных по арендатору. Это значение по умолчанию.
b) Если пользователь уже вошёл в систему, а роль не начинается с «admin», то пользователь является обычным пользователем. Условие запроса where будет содержать userId для фильтрации данных пользователя. Это значение по умолчанию.
c) Если клиент не передал параметр сортировки sort, то сортировка будет установлена по полю Added_time в порядке убывания. Это значение по умолчанию.

Для метода удаления «delete» и метода запроса get:
a) Если информация о пользователе содержит tenantId, то пользователь принадлежит нескольким арендаторам. Условие запроса where будет включать tenantId для фильтрации данных по арендатору. Это значение по умолчанию.
b) Если пользователь уже вошёл в систему, а роль не начинается с «admin», то пользователь является обычным пользователем. Условие запроса where будет содержать userId для фильтрации данных пользователя. Это значение по умолчанию.
c) Если пользователь уже вошёл в систему, а его роль не начинается с «admin», то он является обычным пользователем. Условие запроса where добавит Sys = false для фильтрации удаления системных данных. Значение Sys = true указывает на системные данные. По умолчанию обычные пользователи не могут удалять системные данные, а также получать их.

(2) Запрос клиента

a) Запрос списка

/api/area/list?sort=-Id&name=武汉&pageNo=1   

sort — порядок сортировки, формат: +|-поле, например, -Id для сортировки по Id в порядке убывания, +Id для сортировки по Id в порядке возрастания. Можно использовать несколько полей для сортировки, например, +Id,-Added_time. Обратите внимание, что имена полей должны соответствовать именам свойств в классе сущности и сохранять регистр.
pageNo — номер страницы запроса; <=0 означает запрос всех данных, по умолчанию 1.
pageSize — количество элементов на странице; <=0 означает запрос всех данных, по умолчанию 12.
Условие запроса, формат: поле__оператор=значение. Например, «parent.id__eq=1». Если оператор не указан, используется eq по умолчанию, например: parent.id=1 эквивалентно parent.id__eq=1. Обратите внимание, что имена полей должны совпадать с именами свойств в классе сущности и сохранять регистр.
Операторы запроса включают: contains — содержит, eq — равно, ne — не равно, gt — больше, gte — больше или равно, lt — меньше, lte — меньше или равно, in — содержит, between — между. При использовании оператора in значения разделяются символом ",", например, "id__in=1,2,3".

b) Запрос одного элемента

/api/area/get/1   

c) Удаление одного элемента по идентификатору

/api/area/delete/1
или
/api/area/delete?id=1

d) Пакетное удаление по идентификаторам

/api/area/delete/1,2,3
или
/api/area/delete?id=1,2,3

e) Пакетное удаление по условию

/api/area/delete?name=武汉

2. Добавление и изменение фильтра

(1) Реализация на стороне сервера

Шаг 1: Добавить атрибут [QueryFilter] к контроллеру или методу action.

Шаг 2: Назвать метод action «add» или «update» (без учёта регистра), либо добавить атрибут [Queryable].

Шаг 3: Добавить параметр типа сущности к методу action.

 [Route("api/[controller]/[action]")]
 [ApiController]
 [QueryFilter]
public class AreaController: MyBaseController<Area>
   [HttpPost]
   public Result Add(Area o)
   {
      return ModelState.IsValid ? (bll.Add(o) ? Result.Success("添加成功") : Result.Error("添加失败")) : Result.Error("添加失败!" + ModelState.GetAllErrMsgStr(";")); ;
   }
}

QueryFilterAttribute имеет встроенные предустановленные параметры запроса:
Если параметр метода действия реализует интерфейс IUser, и пользователь вошёл в систему, то устанавливается значение UserId для параметра метода. Также устанавливается флаг для данных, указывающий на то, что действие было выполнено вошедшим в систему пользователем.

//автоматическое добавление user id
if (typeof(IUser).IsAssignableFrom(parameterType))
{
    var model = context.ActionArguments[parameterName] as IUser;
    if (userId != 0)
    {
        model.UserId = userId;
    }
}

Если параметр метода действия реализует интерфейс ITenant, и пользователь вошёл в систему и арендатор TenantId существует, то устанавливается значение TenantId для параметра метода. Также устанавливается флаг для данных, указывающий на то, что действие было выполнено арендатором.

//автоматическое добавление tenant id
if (typeof(ITenant).IsAssignableFrom(parameterType))
{
    var model = context.ActionArguments[parameterName] as ITenant;
    if (TenantId != 0)
    {
        model.TenantId = TenantId;
    }
}

Если параметр метода действия реализует интерфейс ISys, то автоматически устанавливаются следующие значения:

  • Modify_time — время модификации, равное текущему времени.
  • Если роль пользователя начинается с «admin», это означает, что он является администратором. Тогда для параметра модели устанавливается значение Sys, указывающее на системный ресурс.
  • Если роль пользователя не начинается с «admin», это означает, что он не является администратором. Тогда для параметра модели устанавливается значение false, указывающее на несистемный ресурс.
//если это тип ISys, добавить системный ресурс
if (typeof(ISys).IsAssignableFrom(parameterType))
{
    var model = context.ActionArguments[parameterName] as ISys;
    model.Modify_time = DateTime.Now;
    //добавить системный ресурс  несистемные администраторы или нешкольные администраторы, студенты, учителя добавляют ресурсы как несистемные ресурсы. системные администраторы, школьные администраторы добавляют ресурсы как системные ресурсы                   
    if (role.StartsWith("admin"))
    {
        model.Sys = true;                          
    }
    else
    {
        model.Sys = false;
    }
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/qinyongcheng-NetCoreFast.git
git@api.gitlife.ru:oschina-mirror/qinyongcheng-NetCoreFast.git
oschina-mirror
qinyongcheng-NetCoreFast
qinyongcheng-NetCoreFast
NET8