# Глава 8: База знаний — древовидные таблицы

<iframe width="800" height="436" src="https://player.bilibili.com/player.html?isOutside=true&aid=113815089907668&bvid=BV1mfcgeTE7H&cid=27830914731&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

### 8.1 Добро пожаловать в новую главу

В этой главе мы подробно разберём, как построить базу знаний. Это будет комплексный модуль, помогающий управлять документами, задачами и информацией. Спроектировав и создав документную таблицу с древовидной структурой, мы реализуем эффективное управление статусом, вложениями и связанными задачами для документов.

### 8.2 Знакомство с проектированием БД

#### 8.2.1 Базовое проектирование и создание таблицы документов

Начнём с простого: создадим в базе знаний «Таблицу документов» для всех документов. Она будет содержать следующие ключевые поля:

1. **Заголовок (Title)**: название документа, тип «Однострочный текст».
2. **Содержимое (Content)**: подробное содержимое документа, тип «Многострочный текст» с поддержкой Markdown.
3. **Статус документа (Status)**: текущий статус документа: черновик, опубликован, в архиве, удалён.
4. **Вложение (Attachment)**: возможность добавлять файлы и изображения.
5. **Связанная задача (Related Task)**: поле отношения многие-к-одному, связывающее документ с конкретной задачей — удобно для ссылок на документы при управлении задачами.

![](https://static-docs.nocobase.com/2412061730%E6%96%87%E6%A1%A3-%E4%BB%BB%E5%8A%A1er.svg)

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

#### 8.2.2 Построение древовидной структуры и управление каталогом

> Древовидная таблица (предоставляется плагином древовидных таблиц) — это иерархическая структура, в которой у каждой записи может быть один или несколько потомков, а у тех — свои потомки.

Для упорядочивания документов и иерархии выберем для нашей таблицы тип [**Древовидная таблица**](https://docs-cn.nocobase.com/handbook/collection-tree) — это даст удобную классификацию по принципу «родитель-потомок». При создании система автоматически добавит следующие поля:

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190010004.png)

- **ID родительской записи**: фиксирует родительский документ.
- **Родительская запись**: поле многие-к-одному, реализующее связь «родитель-потомок».
- **Дочерние записи**: поле один-ко-многим, позволяющее видеть все вложенные документы.
  ![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190011580.png)

Эти поля поддерживают иерархию каталога, поэтому изменять их не рекомендуется.

Также создадим связь с таблицей задач [(многие-к-одному)](https://docs-cn.nocobase.com/handbook/data-modeling/collection-fields/associations/m2o) и обратное отношение, чтобы при необходимости в окне связанных данных задачи можно было создавать список документов.

### 8.3 Создание страницы управления документами

#### 8.3.1 Создание меню «Управление документами»

В главном меню добавьте новую страницу — «Управление документами», выберите подходящий значок. Затем создайте табличный блок для нашей таблицы документов. В табличном блоке добавьте базовые операции CRUD и введите несколько тестовых записей, чтобы проверить корректность работы таблицы.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190011929.gif)

#### Упражнение

1. На странице управления документами добавьте родительский документ «Документ 1».
2. Создайте у «Документ 1» дочерний документ «Глава первая».

#### 8.3.2 Переключение в древовидное представление таблицы

Возможно, Вы удивитесь: почему пока не видна древовидная структура?

По умолчанию табличный блок показывает обычное представление; включим древовидное вручную:

1. В правом верхнем углу табличного блока > «Древовидная таблица».

   Установив галочку, под таблицей увидите переключатель «Развернуть всё».

   Только что созданная «Глава первая» исчезла.
2. Включите переключатель «Развернуть всё».

   Теперь чётко видна иерархия документов; можно легко разворачивать все уровни.

   Кстати, добавьте операцию «Добавить дочернюю запись».

Готово, переключение на древовидную таблицу прошло успешно!

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190012338.png)

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190012178.png)

### 8.3.3 Настройка «Добавить дочернюю запись»

Расставим базовые поля для добавления. Если выбрать поле «Родительская запись», по умолчанию оно будет «Только для чтения (нельзя изменить)», поскольку мы создаём запись внутри текущего документа.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190012648.png)

Если задач очень много, выбор связанной задачи может стать утомительным; зададим значение по умолчанию для фильтра задач — пусть оно будет равно задаче, связанной с родительской записью.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190012417.png)

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190013403.png)

Иногда значение по умолчанию подставляется не сразу — закройте и снова откройте, и оно автоматически появится.

### 8.4 Настройка шаблонов формы и связи с задачами

#### 8.4.1 Создание шаблонов таблицы и формы

Для удобства последующего управления сохраним таблицу документов и формы создания/редактирования как [шаблоны](https://docs-cn.nocobase.com/handbook/block-template), чтобы переиспользовать их на других страницах.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190013599.png)

#### 8.4.2 Копирование табличного блока документов

В окне просмотра задачи добавим новую [вкладку](https://docs-cn.nocobase.com/manual/ui/pages) — «Документы». На ней добавьте блок формы > Другие записи > Таблица документов > «Копировать шаблон» и подгрузите ранее сохранённый шаблон таблицы документов. (Обязательно выбирайте [**Копировать шаблон**](https://docs-cn.nocobase.com/handbook/block-template).)

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190013140.png)

Так удобно создавать список документов для каждой задачи.

#### 8.4.3 Настройка связи с задачей

Так как мы скопировали внешний шаблон таблицы и она не связана с задачей, отображаются все документы — это не то, что нужно.

Это типичный случай: если поля отношения нет, а связанные данные нужно показать, придётся настраивать связь вручную. (Помните, мы используем [**Копировать шаблон**](https://docs-cn.nocobase.com/handbook/block-template); не выбирайте [Сослаться на шаблон](https://docs-cn.nocobase.com/handbook/block-template), иначе все правки синхронизируются по другим табличным блокам!)

- Связь по отображаемым данным

В правом верхнем углу табличного блока выберите [«Установить диапазон данных»](https://docs-cn.nocobase.com/handbook/ui/blocks/block-settings/data-scope):

【Задача/ID】= 【Текущая запись модального окна/ID】

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190014372.png)

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190014983.gif)

Готово — теперь в таблице остаются только документы, привязанные к текущей задаче.

- Связь блока добавления

Откройте блок добавления:

Для поля связанной задачи установите [значение по умолчанию](https://docs-cn.nocobase.com/handbook/ui/fields/field-settings/default-value) > 【Запись родительского модального окна】.

Родительское модальное окно — это операция «Просмотр» текущей задачи; мы автоматически свяжем добавление с этой задачей.

Установите [Только для чтения (режим чтения)](https://docs-cn.nocobase.com/handbook/ui/fields/field-settings/pattern), чтобы внутри текущего модального окна нельзя было привязать к другой задаче.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190014424.png)

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190014289.gif)

Готово! Теперь добавление и отображение документов будут связаны с текущей задачей.

Для аккуратности добавьте такие же фильтры в операциях «Редактировать» и «Добавить подзадачу».

Чтобы древовидная структура выглядела чище, перенесите столбец «Заголовок» в первую позицию таблицы — операционные столбцы будут смотреться аккуратнее.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190015378.png)

### 8.5 Фильтрация и поиск в управлении документами

#### 8.5.1 Добавление [блока фильтра](https://docs-cn.nocobase.com/handbook/ui/blocks/filter-blocks/form)

Заодно добавим фильтрацию по таблице документов.

- На странице управления документами добавьте [блок фильтра](https://docs-cn.nocobase.com/handbook/ui/blocks/filter-blocks/form).
- Выберите фильтр в виде формы и перетащите его наверх.
- Отметьте поля «Заголовок», «Статус», «Поле задачи» и т. п. — это будут условия фильтрации.
- Добавьте операции «Фильтровать» и «Сбросить».

Эта форма станет нашим полем поиска: введите ключевое слово — и таблица отобразит подходящие документы.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190015868.png)

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190015365.gif)

#### 8.5.2 [Соединение блоков данных](https://docs-cn.nocobase.com/handbook/ui/blocks/block-settings/connect-block)

Возможно, после нажатия фильтра ничего не происходит. Остался последний шаг: соединить блок поиска с целевым блоком данных.

- В правом верхнем углу блока выберите Конфигурация > [Соединить блоки данных](https://docs-cn.nocobase.com/handbook/ui/blocks/block-settings/connect-block).

  ```
  Здесь перечислены доступные для соединения блоки.

  Поскольку мы создали форму для таблицы документов, в качестве вариантов отображаются все блоки, связанные с этой таблицей (на странице — один).

  Не запутаетесь: при наведении на пункт камера автоматически центрирует соответствующий блок.
  ```
- Включите соединение с нужным блоком и протестируйте поиск.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412190016981.gif)

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

### 8.6 [Настройка прав](https://docs-cn.nocobase.com/handbook/acl) для базы знаний

Чтобы обеспечить безопасность документов и порядок управления, можно назначать [права](https://docs-cn.nocobase.com/handbook/acl) разным ролям. У разных ролей будут права на просмотр, редактирование или удаление документов.

Мы скоро доработаем таблицу документов, добавив новости и объявления о задачах, поэтому сейчас права можно сделать чуть более свободными.

### 8.7 Итог и следующий шаг

В этой главе мы создали базовую базу знаний: таблицу документов, [древовидную структуру](https://docs-cn.nocobase.com/handbook/collection-tree) и связь с задачами. Добавив блок фильтра и переиспользование шаблонов, мы получили эффективное управление документами.

В [следующей главе](https://www.nocobase.com/cn/tutorials/project-tutorial-task-dashboard-part-1) мы научимся строить персональную панель с [графиками для анализа данных](https://docs-cn.nocobase.com/handbook/data-visualization) и важной информацией!

---

Продолжайте экспериментировать! Если возникнут вопросы — не забывайте о [официальной документации NocoBase](https://docs-cn.nocobase.com/) и [сообществе NocoBase](https://forum.nocobase.com/).
