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

OSCHINA-MIRROR/mirrors_Tencent-APIJSON

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README-extend.md 18 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 03:46 f8567b7

Функции

Один JSON (транзакция) поддерживает одновременно добавление, изменение, удаление, запрос и псевдонимы

https://github.com/Tencent/APIJSON/issues/468

Использование

JSON поддерживает различные способы определения метода:

  1. Первый способ:
"@post", "@put", "@delete", "@head", "@get", "@gets", "@head", "@heads"

"@post": ["Moment","Comment[]"] , значение является форматом массива, каждое значение = ключ

Необходимо гарантировать уникальность каждого ключа:

  • ключ = Moment;
  • ключ= Moment[] будет считаться тем же ключом. Используйте псевдонимы для различения, формат псевдонима: Sys_user_role:sur xxx таблица: псевдоним.
{
   "@post": ["Moment", "Comment:cArray[]", "User:u"], // распределение по POST-запросу соответствующего анализа обработки
   "Moment": {
     // TODO другие поля
   },
   "Comment:cArray[]": [
      {
        // TODO другие поля
      }
   ],
   "@get": ["User"], // распределение GET-запроса соответствующей обработки анализа
   "User:u": {
     // TODO другие поля
   },
   "Privacy": { // обработка по умолчанию в соответствии с URL (/get, /post и т.д.)
     // TODO другие поля
   }
}

Для тех, кто не объявляет явный метод операции, используйте URL (/get, /post и т. д.) для обработки по умолчанию.

  1. Второй способ:

Определение объекта "@method": "GET", значение в верхнем регистре.

{
    "sql@": {
        "@method": "GET",
        "with": true,
        "from": "Sys_role",
        "Sys_role": {
          "@column": "id",
          "role_name": "Роль 1"
        }
    },
    "Sys_user_role:sur[]": {
        "@method": "GET",
        "Sys_user_role": {
            "role_id{}@": "sql"
        }
    },
    "Sys_role_permission:srp[]": {
        "@method": "GET",
        "Sys_role_permission": {
            "role_id{}@": "sql"
        }
    },
    "@explain": true
}

Порядок разбора

  1. Метод объекта.
  2. "@post", "@put", "@delete".
  3. Для тех, кто не объявил явный метод операции, используется обработка по умолчанию, соответствующая URL (/get, /post и т. д.).

Правила автоматического создания тегов

{ "xxx:aa":{ "@tag": "" }}

Правила генерации:

  1. @tag существует, tag = @tag.
  2. @tag не существует:
    • Существует псевдоним: key = объект: tag = key удалить псевдоним; key = массив: tag = key удалить псевдоним + [].
    • Псевдоним не существует: tag = ключ; tag = ключ + [].

Предложение

  1. Один JSON содержит различные методы операций, URL-метод использует /post, /put.
  2. Значение является массивом JSON, рекомендуется использовать конфигурацию "@post", если она не настроена, выполнить шаг 3.

Таблица запросов

Это только мои настройки для справки, которые будут использоваться в будущем тестировании:

Однократное добавление:
POST   User_address     {"MUST":"addr","UPDATE": {"@role": "OWNER,ADMIN","childFunTest-()": "childFunTest(addr)"}, "REFUSE": "id"}
Пакетное добавление:
POST User_address[]  {"User_address[]": [{"MUST":"addr","REFUSE": "id"}], "UPDATE": {"@role": "OWNER,ADMIN","childFunTest-()": "childFunTest(addr)"}}
Однократное изменение:
PUT User_address   {"User_address":{ "MUST":"id","REFUSE": "userId", "UPDATE": {"@role": "OWNER,ADMIN","childFunTest-()": "childFunTest(addr)"}} }
Пакетное изменение:
PUT User_address[]  {"User_address[]": [{"MUST": "id","REFUSE": "userId"}], "UPDATE": {"@role": "OWNER,ADMIN"}}
Удаление:
DELETE User_address   {"User_address":{ "MUST":"id{}","REFUSE": "!", "INSERT": {"@role": "OWNER,ADMIN"}} }

Псевдонимы

Формат:

Sys_user_role: сур xxx таблица: псевдоним

Комментарий: cArray []

Реализация идеи

В то время я ссылался на пример автора: процесс регистрации. Я увидел, что можно обойти проверку, объединив несколько операторов JSON в один, чтобы выполнить пакетную обработку. Поэтому я подумал о том, как реализовать один JSON, который поддерживает различные методы работы и транзакции.

Анализируя исходный код, я познакомился с процессом проверки, процессом анализа и выполнения JSON, процессом генерации SQL-операторов анализа JSON и некоторыми правилами совместимости и проверки.

После обсуждения с автором я очень благодарен автору за предоставленные решения и идеи. Постепенно я понял принципы проектирования и структуру фреймворка apijson.

Один JSON (транзакции) поддерживает добавление, изменение, удаление, запросы и псевдонимы. Идея реализации заключается в следующем:

  1. Модуль проверки:

Анализ JSON для объектов, временных переменных, подзапросов, псевдонимов и тегов.

Добавьте метод к свойствам объекта JSON.

"Sys_role": {
        "@method": "PUT",
        "id": "6aedce0d-2a29-4fbe-aeed-0ba935ca6b41",
        "id{}@": "sql",
        "role_code": "code-subrange-4",
        "role_name": "роль-поддиапазон-4"
    }
  1. Анализ объекта:

Используйте атрибут @method объекта, чтобы заменить метод Parser.

  1. Поддержка транзакций:

Дальнейшая оптимизация

  1. Отдельно определите URL-метод и выполните разные процессы в зависимости от метода.

Разделите его с существующим методом, чтобы избежать двусмысленности.

  1. Самый внешний слой добавляет параметр «транзакция»: true, чтобы указать запуск транзакции. В настоящее время это URL-адреса put и post для управления запуском транзакции, а также при фиксации AbstractParser onCommit определяет transactionIsolation (4: запуск транзакции, 0: запрос без транзакции).

Более подробную информацию см. в: https://github.com/Tencent/APIJSON/issues/468.

  1. Завершите «@Explain».

Если нет плана выполнения, верните SQL-оператор. Вы можете увидеть JSON-оператор, выполняемый в каждой строке SQL в ответе, чтобы облегчить поиск и устранение неисправностей.

  1. Поддержка @version.

Определите различные сценарии добавления, изменения, удаления и других правил выполнения. Пожалуйста, разделите их по версии.

Таблица запросов основана на тегах, методах и версиях для обеспечения уникальности.

  1. Функция предварительного выполнения.

Функция предварительного выполнения может добавлять операторы JSON к

... mysql8 with-as表达式

mysql8 с выражением with-as

Предварительные условия:

  • версия mysql: 8+;
  • mysql-connector-java: 8.0.31 — версия поддерживает with-as;
  • druid: 1.2.15 — версия поддерживает with-as.

Необходимо удалить конфигурацию druid wall.

Тестовый случай: запрос одной ссылки range ref

// Тестирование mysql8 with as выражения
// Таблица пользователей
// Таблица ролей пользователей
// Ролевая таблица
// Пример 1: одна ссылка range ref
{
    "sql@": {
        "@method": "GET",
        "with": true,
        *from: «Sys_role»,*
        "Sys_role": {
          "@column": "id",
          "role_name": "Роль 1"
        }
    },
    "Sys_user_role:sur[]": {
        "@method": "GET",
        "Sys_user_role": {
            "role_id{}@": "sql"
        }
    },
    "Sys_role_permission:srp[]": {
        "@method": "GET",
        "Sys_role_permission": {
            "role_id{}@": "sql"
        }
    },
    "@explain": true
}  

// Второй способ написания
{
    "@get": ["sql@","Sys_user_role:sur[]","Sys_role_permission:srp[]"],
    "sql@": {
        "with": true,
        "from": "Sys_role",
        "Sys_role": {
          "@column": "id",
          "role_name": "Роль 1"
        }
    },
    "Sys_user_role:sur[]": {
        "Sys_user_role": {
            "role_id{}@": "sql"
        }
    },
    "Sys_role_permission:srp[]": {
        "Sys_role_permission": {
            "role_id{}@": "sql"
        }
    },
    "@explain": true
} 

Результат выполнения в mysql8:

Изображение не представлено.

Результат выполнения в mysql5.7:

Изображение не представлено.

Запрос нескольких ссылок range ref

{
    "sql@": {
        "@method": "GET", 
        "with": true, 
        *from: "Sys_role",*
        "Sys_role": {
            "@column": "id", 
            "role_name": "Роль 1"
        }
    }, 
    "sql_user@": {
        "@method": "GET", 
        "with": true, 
        *from: "Sys_user",*
        "Sys_user": {
            "@column": "id", 
            *id: "f0894db2-6940-4d89-a5b2-4405d0ad0c8f"*
        }
    }, 
    "Sys_user_role:sur[]": {
        "@method": "GET", 
        "Sys_user_role": {
            "role_id{}@": "sql", 
            "user_id{}@": "sql_user"
        }
    }, 
    "Sys_role_permission:srp[]": {
        "@method": "GET", 
        "Sys_role_permission": {
            "role_id{}@": "sql"
        }
    }, 
    "@explain": true
}

Результат выполнения в mysql8:

Изображение не представлено.

Результат выполнения в mysql5.7:

Изображение не представлено.

Удаление подзапроса

{
    "sql@": {
        "@method": "GET",
        "with": true,
        from: "Sys_role_permission",
        "Sys_role_permission": {
          column: "id",
          role_id: ["e7129d5f-b07e-4996-9965-9528e370a393"]
        }
    },
    "Sys_role_permission": {
        "@method": "DELETE",
        id{}: "sql"
    },
    explan: true
}

Изображение не представлено.

Выполнение sql-запроса в mysql8:

WITH  `sql` AS (SELECT `id` FROM `housekeeping`.`Sys_role_permission` WHERE  (  (`role_id` IN ('68877ee9-4cf4-4f32-86e6-16c505ca3b21'))  ) ) DELETE FROM `housekeeping`.`Sys_role_permission` WHERE  (  (`id` IN ( SELECT * FROM `sql`) )  ) 

Plain Text

Выполнение запроса в mysql5.7:

DELETE FROM `housekeeping`.`Sys_role_permission` WHERE  (  (`id` IN ( SELECT * FROM (SELECT `id` FROM `housekeeping`.`Sys_role_permission` WHERE  (  (`role_id` IN ('20d337bb-9886-455f-8dce-f1cadab0ec4f'))  ) ) AS `sql`) )  ) 



Plain Text

Обновление подзапроса

Текст не представлен. ``` { "6aedce0d-2a29-4fbe-aeed-0ba935ca6b41": { "id{}@": "sql", "role_code": "code-subrange-4", "role_name": "角色-subrange-4" }, "@explain": true }

Второй вариант написания: { "@get": ["sql@"], "sql@": { "with": true, "from": "Sys_role_permission", "Sys_role_permission": { "@column": "role_id", "id{}": ["c95ef2d6-bf14-42b0-bb87-038cee8c78f1"] } }, "@put": ["Sys_role"], "Sys_role": { "id": "0bb92d96-8ca6-469e-91e8-60308ce5b835", "id{}@": "sql", "role_code": "code-subrange-4", "role_name": "角色-subrange-4" }, "@explain": true }


Выполнение SQL-запроса в MySQL 8:

Изображение: https://user-images.githubusercontent.com/12228225/204079628-8536b4be-8078-42a5-b3f7-460159372a8a.png

Выполнение запроса в MySQL 5.7:

Изображение:  https://user-images.githubusercontent.com/12228225/204079633-df9175bc-703f-4997-95f6-85bbc1134b0b.png

**Получение одной строки данных:**

Будет выполнен процесс проверки.

Запрос:
```http://localhost:8675/lowCodePlatform/forms/api/gets

{
    "sql@": {
        "with": true,
        "from": "Sys_user_role",
        "Sys_user_role": {
          "@column": "role_id",
          "user_id": "4732209c-5785-4827-b532-5092f154fd94"
        }
    },
    "Sys_role[]": {
        "Sys_role": {
            "id{}@": "sql"
        },
        "page": 0,
        "count": 10,
        "query": 2
    },
    "tag":"Sys_role[]",
    "total@": "/Sys_role[]/total",
    "@explain": true
}

Второй способ написания:
{
    "@gets": ["sql@","Sys_role[]"],
    "sql@": {
        "with": true,
        "from": "Sys_user_role",
        "Sys_user_role": {
          "@column": "role_id",
          "user_id": "4732209c-5785-4827-b532-5092f154fd94"
        }
    },
    "Sys_role[]": {
        "Sys_role": {
            "id{}@": "sql"
        },
        "page": 0,
        "count": 10,
        "query": 2
    },
    "tag":"Sys_role[]",
    "total@": "/Sys_role[]/total",
    "@explain": true
}

Доступ и запрос требуют настройки аутентификации:

Изображение: https://user-images.githubusercontent.com/12228225/204079649-510a047b-2b8e-44d2-a32a-f6ea0e7f6a74.png

Выполнение SQL-запроса в MySQL 8:

Изображение: https://user-images.githubusercontent.com/12228225/204079657-6e62872a-2f29-478e-a29b-bcb0a92781a6.png

Выполнение запроса в MySQL 5.7:

Изображение: https://user-images.githubusercontent.com/12228225/204079878-a9885b86-5a44-4ba2-b837-66adc43b07d3.png

Получение нескольких строк данных:

Будет выполнен процесс проверки.

Запрос:


{
    "sql@": {
        "@method": "GETS",
        "with": true,
        "from": "Sys_role",
        "Sys_role": {
          "@column": "id",
          "role_name": "超级管理员"
        }
    },
    "sql_user@": {
        "@method": "GETS",
        "with": true,
        "from": "Sys_user",
        "Sys_user": {
          "@column": "id",
          "id": "4732209c-5785-4827-b532-5092f154fd94"
        }
    },
    "Sys_user_role:sur[]": {
        "@method": "GETS",
        "Sys_user_role": {
            "role_id{}@": "sql",
            "user_id{}@": "sql_user"
        }
    },
    "Sys_role_permission:srp[]": {
        "@method": "GETS",
        "Sys_role_permission": {
            "role_id{}@": "sql"
        }
    },
    "@explain": true
}

Выполнение SQL-запроса в MySQL 8:

Изображение: https://user-images.githubusercontent.com/12228225/204079892-bc71eb65-cfbd-4c3c-bda9-4b31902058ba.png

Выполнение запроса в MySQL 5.7:

Изображение: https://user-images.githubusercontent.com/12228225/204079897-521a763f-bb08-44af-92c6-5e4117fe9d33.png

Получение количества строк:

Обычный запрос на получение количества, GET и HEAD не выполняют процесс проверки.

Запрос:

{
    "sql@": {
        "@method": "GET",
        "with": true,
        "from": "Sys_user_role",
        "Sys_user_role": {
          "@column": "role_id",
          "user_id": "4732209c-5785-4827-b532-5092f154fd94"
        }
    },
    "Sys_role": {
        "@method": "head",
        "id{}@": "sql"
    },
    "@explain": true
}

Выполнение SQL-запроса в MySQL 8:

Изображение: https://user-images.githubusercontent.com/12228225/204079903-e397a78a-1849-4678-ac41-0611165a1de1.png

Выполнение запроса в MySQL 5.7:

Изображение: https://user-images.githubusercontent.com/12228225/204079908-1efb5b28-889d-4d9b-b4f9-5092925888c9.png { "sql@": { "with": true, "from": "Sys_role_permission", "Sys_role_permission": { "@column": "id", "role_id{}": ["94f79f0b-331b-4cc5-bfc0-ebfc47d00f13"] } }, "Sys_role_permission": { "@method": "DELETE", "id{}@": "sql" }, "explan": true }

Примечание: в ответе переведён только текст без кода и специальных символов.

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

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

1
https://api.gitlife.ru/oschina-mirror/mirrors_Tencent-APIJSON.git
git@api.gitlife.ru:oschina-mirror/mirrors_Tencent-APIJSON.git
oschina-mirror
mirrors_Tencent-APIJSON
mirrors_Tencent-APIJSON
master