APIJSON: планирование и дорожная карта
Часть функциональных описаний можно найти в APIAuto.
Логин: 13000002020, пароль: 123456.
http://apijson.cn/api
20230106 Обновлено: уже поддерживается, спасибо за вклад @cloudAndMonkey.
https://github.com/Tencent/APIJSON/pull/493
Для интернет-проектов данные очень важны, обычно они не удаляются физически, а просто помечаются как удалённые с помощью поля is_deleted и затем фильтруются при CRUD операциях. Эта функция очень важна, её можно реализовать, переопределив SQLConfig.isFakeDelete(), а затем, если true, заменить DELETE на PUT и использовать SQLConfig.onFakeDelete(Map<String, Object> map) для добавления условий:
GET: map.put("deleted", 0)
PUT: map.put("deleted", 0)
DELETE: map.put("deleted", 1)
POST: не используется, не обрабатывается.
Конечно, вы также можете добавить поле deletedTime и т. д.
Также можно добавить поля deletedKey, deletedValue, notDeletedValue в таблице apijson-framework и автоматически настроить, является ли это псевдоудалением, используя StringUtil.isNotEmpty(deletedKey, true), и поместить соответствующее значение ключа.
20220328 Обновлено: уже поддержано в версии 5.0.0.
https://github.com/Tencent/APIJSON/releases/tag/5.0.0
Используется для реализации внутренних условий AND, ранее использовавшихся @having, которые были заменены на OR, сохраняя при этом правила горизонтального и вертикального соединения.
@having! не является обязательным, его можно реализовать путём инвертирования внутреннего условия, но если реализация проста и не влияет на существующую функциональность, её также можно добавить.
20210415 Предоставлен плагин поля [apijson-column], поддерживающий сопоставление имён полей и !key для исключения полей.
Эта функция поддерживается только в apijson-framework, необходимо настроить все поля, доступные для каждой версии интерфейса и каждой таблицы, а затем исключить поля @column!.
Можно добавить запись VersionedColumn вместо HashMap для конфигурации кода.
Следует отметить, что во внешнем интерфейсе могут одновременно присутствовать @column и @column!, и в этом случае:
если нет перекрывающихся полей, игнорируйте @column! и используйте только @column;
если есть перекрывающиеся поля, выбросьте исключение и верните код ошибки и сообщение об ошибке.
20220809 Уже поддерживается Oracle EXPLAIN, спасибо @ifooling за вклад.
https://github.com/Tencent/APIJSON/pull/434
В настоящее время APIJSON поддерживает Oracle, SQL Server и DB2. Однако "@explain": true использует SET STATISTICS PROFILE ON (см. AbstractSQLConfig и AbstrctSQLExecutor). После выполнения результат фактически помещается в ResultSet, анализ производительности помещается в moreResult, поскольку эта проблема в настоящее время делает анализ производительности @explain фактически непригодным для использования в двух вышеупомянутых базах данных, и необходимо изменить способ анализа или решить проблему существующего способа.
В настоящее время нумерация страниц начинается с 0, но на самом деле 1 более распространена, и пользователи привыкли к ней, а стоимость поддержки невелика. Parser добавляет DEFAULT_QUERY_PAGE и getDefaultQueryPage, аналогично DEFAULT_QUERY_COUNT и getDefaultQueryCount, чтобы упростить передачу значения страницы через параметр и рендеринг значения страницы в info.page. Рекомендуется использовать page в AbstractParser, AbstractSQLConfig, когда используется page, для обеспечения совместимости.
"@url": "http://apijson.cn:8080/get"
{
"User": {
"@url": "http://apijson.cn:8080/get" // Пересылка на другие серверы для выполнения
},
"[]": {
"Comment": {
"userId@": "User/id"
}
},
"@explain": true
}
Необходимо учитывать зависимость порядка выполнения ссылочных присваиваний, поэтому обработка должна быть синхронной и блокирующей. Возможно, можно добавить префикс ~, чтобы указать асинхронность? Например, "@url": "~http://apijson.cn:8080/get", и вызывающая сторона гарантирует, что объект ниже не зависит от него.
Хотя INNER JOIN + условие OR может заменить его функцию, оно не может достичь производительности, которую может обеспечить индекс. Поддержка UNION очень необходима, но UNION ALL практически не требуется, и если реализация проста и не влияет на существующую функцию, её также можно добавить. sys.apijson_user WHERE ( (name
REGEXP BINARY 'a') )
UNION
SELECT * FROM sys.apijson_user WHERE ( (tag
REGESP BINARY 'a') )
LIMIT 10 OFFSET 0
#### Добавление поддержки With
20221126 Обновление: поддержка уже добавлена, спасибо за вклад @cloudAndMonkey <br />
https://github.com/Tencent/APIJSON/pull/481
Может уменьшить количество выполнений подзапросов и повысить производительность.
```js
{ //посмотреть на то, что недавно опубликовали люди, которые подписаны на вас (посты, комментарии)
"sql@": {
"with": true, //создать WITH(SELECT id ...) AS `sql`
"from": "User",
"User": {
"@column": "id",
"@role": "CONTACT"
}
},
"Moment[]": {
"Moment": {
"userId{}@": "sql",
"@order": "date-"
}
},
"Comment[]": {
"Comment": {
"userId{}@": "sql",
"@order": "date-"
}
},
"@explain": true
}
Сгенерированный SQL:
SELECT * FROM `sys`.`Moment` WHERE ( (`userId` IN (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
и
SELECT * FROM `sys`.`Moment` WHERE ( (`userId` IN (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
Необходимо преобразовать в:
WITH (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) AS `sql`
SELECT * FROM `sys`.`Moment` WHERE ( (`userId` IN `sql` ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
и
WITH (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) AS `sql`
SELECT * FROM `sys`.`Comment` WHERE ( (`userId` IN `sql` ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
[Обновление: реализация не требуется, можно использовать синтаксис SQL напрямую и использовать @raw]
Реализация SQL-подобного преобразования полей с помощью CASE WHEN в удалённых функциях также неудобна.
Пока не придумали, как это лучше реализовать. Если использовать оригинальный синтаксис SQL, то это будет немного громоздко.
AbstractVerifier.IS_UPDATE_MUST_HAVE_ID_CONDITION = false
Теперь поддерживается одновременное использование id и других условий для удаления
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java#L84-L86
Однако, поскольку Operation не имеет AT_LEAST_ONE/ANY_ONE подобных операций,
если настроена только одна конфигурация правила, то можно разрешить только один тип условия (MUST), нельзя использовать только id или другие поля.
Если настроены оба, так как id принудительно используется в качестве условия AND, его нельзя объединить с другими условиями OR.
Можно настроить два разных правила и использовать разные теги для разных условий.
метод: DELETE
Удаление по id:
tag: Comment-by-id // Конечно, можно написать Comment:id или любое другое название, которое не соответствует формату имени таблицы
structure: ... "MUST":"id" ...
Удаление по дате:
tag: Comment-by-date
structure: ... "MUST":"date" ...
tag: Comment
structure: ... "AT_LEAST_ONE":"id,date" ... // Необходимо передать хотя бы один из них, нельзя передавать более двух
или
tag: Comment
structure: ... "ANY_ONE":"id,date" ... // Должен быть передан один из них, но не оба
AT_LEAST_ONE и ANY_ONE также могут быть реализованы с использованием расширенного MUST (в настоящее время этот способ кажется лучшим)
"MUST":"id | date,other" — любой из них может быть передан с использованием |, обратите внимание, что слева и справа должно быть по одному пробелу, потому что могут быть "name|$" "id|{" и другие ключи, содержащие "|"
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/Operation.java
"MUST":"1:id | date,other" // id, date должны быть переданы, и нельзя передать больше
"MUST":">=2:id | momentId|{} | date>=,other" // id, momentId|{}, date>= должны быть переданы как минимум два
"MUST":"2+:id | momentId|{} | date>=,other" // id, momentId|{}, date>= должны быть переданы минимум два, вместо >= 2, более удобно анализировать и не нужно учитывать >1, != 2 и другие неравенства
"MUST":"2-:id | momentId|{} | date>=,other" // id, momentId|{}, дата>= максимум два могут быть переданы, вместо <= 2
https://github.com/Tencent/APIJSON/pull/493#issuecomment-1373376359
APIJSON предоставляет различные механизмы безопасности, которые можно добавить или улучшить на основе текущей структуры.
20220504 обновление: добавлен плагин apijson-router, который позволяет контролируемо выставлять простые RESTful интерфейсы в Интернете и выполнять их в виде запросов APIJSON.
https://github.com/APIJSON/apijson-router
В настоящее время существует RBAC для автоматического управления правами доступа.
APIJSONORM предоставляет @MethodAccess аннотацию для настройки
apijson-framework использует [Access Фронтенд, TypeScript фронтенд, маленькие программы для WeChat и т. д.,
Android-клиент, iOS-клиент, C# игровой клиент и др.
Java, C#, PHP, Node, Python и другие серверные демо и данные.
https://github.com/APIJSON/APIJSON-Demo
В настоящее время официально доступны два плагина: apijson-column и apijson-router.
Расширение может быть реализовано через расширение ключевых слов объекта @key, ключевых слов массива key, удалённых функций, перезаписи части методов и т. п.
Поскольку APIJSON основан на JSON, в большинстве случаев можно напрямую использовать такие библиотеки или инструменты для упаковки или анализа JSON, как fastjson и другие.
Однако некоторые функции APIJSON требуют использования специальных символов, таких как [] и @, в ключе, что может затруднить анализ при возврате [].
На данный момент можно использовать «format»: true, чтобы сервер форматировал ответ, но это также может привести к некоторым потерям производительности сервера.
Если на фронтенде или клиенте есть соответствующие инструменты форматирования (например, apijson-orm, который можно использовать на Android), выбор будет более разнообразным.
https://github.com/Tencent/APIJSON#相关推广
Обновление от 05.02.2020: недавно на главной странице были добавлены одна официальная статья и шесть статей, написанных пользователями.
https://github.com/Tencent/APIJSON/blob/master/README.md#相关推广
https://github.com/Tencent/APIJSON/issues/73
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )