Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В современной цифровой среде пользователи работают с широким набором данных организации, включая сообщения электронной почты, чаты, файлы, события календаря и многое другое. Это может привести к частым сменам контекста — переключению между задачами или приложениями, что может нарушить фокус и снизить производительность. Например, пользователю, работающему над проектом, может потребоваться переключиться с текущего приложения в Outlook, чтобы найти важные сведения в сообщении электронной почты или переключиться на OneDrive для бизнеса, чтобы найти связанный файл. Это действие назад и вперед нарушает фокус и тратит время, которое может быть лучше потрачено на задачу на руку.
Чтобы повысить эффективность, вы можете интегрировать организационные данные непосредственно в приложения, которые пользователи используют ежедневно. Путем привлечения данных организации к приложениям пользователи могут получать доступ к информации и управлять ими более просто, минимизируя сдвиги контекста и повышая производительность. Кроме того, эта интеграция предоставляет ценные аналитические сведения и контекст, что позволяет пользователям принимать обоснованные решения и эффективно работать.
В этом упражнении вы выполните следующие действия.
- Узнайте, как веб-компонент mgt-search-results в Microsoft Graph Toolkit можно использовать для поиска файлов.
- Узнайте, как вызвать Microsoft Graph непосредственно для получения файлов из OneDrive для бизнеса и сообщений чата из Microsoft Teams.
- Узнайте, как отправлять сообщения чата в каналы Microsoft Teams с помощью Microsoft Graph.
Использование функции данных организации
В предыдущем упражнении вы создали регистрацию приложения в идентификаторе Microsoft Entra и запустили сервер приложений и сервер API. Вы также обновили следующие значения в
.envфайле.ENTRAID_CLIENT_ID=<APPLICATION_CLIENT_ID_VALUE> TEAM_ID=<TEAMS_TEAM_ID> CHANNEL_ID=<TEAMS_CHANNEL_ID>Прежде чем продолжить, убедитесь, что вы выполнили предыдущее упражнение .
Вернитесь в браузер (http://localhost:4200). Если вы еще не вошли, выберите вход в заголовок и войдите с помощью пользователя из клиента разработчика Microsoft 365.
Замечание
Помимо проверки подлинности пользователя, веб-компонент mgt-login также получает маркер доступа, который может использоваться Microsoft Graph для доступа к файлам, чатам, сообщениям электронной почты, событиям календаря и другим данным организации. Маркер доступа содержит области (разрешения), такие как
Chat.ReadWrite,Files.Read.Allи другие, которые вы видели ранее:Providers.globalProvider = new Msal2Provider({ clientId: ENTRAID_CLIENT_ID, // retrieved from .env file scopes: ['User.Read', 'Presence.Read', 'Chat.ReadWrite', 'Calendars.Read', 'ChannelMessage.Read.All', 'ChannelMessage.Send', 'Files.Read.All', 'Mail.Read'] });Выберите "Просмотреть связанное содержимое " для строки Adatum Corporation в datagrid. Это приведет к получению данных организации, таких как файлы, чаты, сообщения электронной почты и события календаря с помощью Microsoft Graph. После загрузки данных он будет отображаться под datagrid в интерфейсе табуляции. Важно отметить, что на данный момент вы не видите никаких данных, так как вы еще не добавили какие-либо файлы, чаты, сообщения электронной почты или события календаря для пользователя в клиенте разработчика Microsoft 365. Давайте исправим это на следующем шаге.
На этом этапе у клиента Microsoft 365 могут не быть связанные данные организации для корпорации Adatum . Чтобы добавить некоторые примеры данных, выполните по крайней мере одно из следующих действий:
Добавьте файлы, посещая https://onedrive.com и выполнив вход с помощью учетных данных клиента разработчика Microsoft 365.
- Выберите "Мои файлы " в области навигации слева.
- Выберите +Добавить новую , а затем отправьте папку из меню.
- Выберите папку документов openai-acs-msgraph/customer из клонированного проекта.
Добавьте сообщения чата и события календаря, посещая https://teams.microsoft.com и выполнив вход с помощью учетных данных клиента Разработчика Microsoft 365.
Выберите Teams в области навигации слева.
Выберите команду и канал.
Нажмите кнопку "Пуск записи".
Введите новый заказ для Adatum Corporation для темы и любого дополнительного текста, который вы хотите добавить в текст сообщения. Нажмите кнопку "Опубликовать ".
Вы можете добавить дополнительные сообщения чата, которые упоминают другие компании, используемые в приложении, такие как Adventure Works Cycles, Contoso Pharmaceuticals и Tailwind Traders.
Выберите "Календарь " в области навигации слева.
Выберите "Создать собрание".
Введите "Встреча с Adatum Corporation о расписании проекта" для названия и текста.
Нажмите кнопку "Сохранить".
Добавьте сообщения электронной почты, посещая https://outlook.com и выполнив вход с помощью учетных данных клиента Разработчика Microsoft 365.
Выберите "Создать почту".
Введите личный адрес электронной почты в поле "To ".
Введите новый заказ, размещенный для Adatum Corporation для темы и все, что вы хотите для тела.
Выберите Отправить.
Вернитесь в приложение в браузере и обновите страницу. Снова выберите "Просмотреть связанное содержимое" для строки "Корпорация Adatum". Теперь на вкладках должны отображаться данные в зависимости от того, какие задачи вы выполнили на предыдущем шаге.
Давайте рассмотрим код, который включает функцию данных организации в приложении. Чтобы получить данные, клиентская часть приложения использует маркер доступа, полученный компонентом mgt-login , который вы рассмотрели ранее для вызова API Microsoft Graph.
Изучение кода поиска файлов
Подсказка
Если вы используете Visual Studio Code, вы можете открывать файлы напрямую, выбрав:
- Windows/Linux: CTRL +P
- Mac: Cmd + P
Затем введите имя файла, который нужно открыть.
Начнем с того, как данные файла извлекаются из OneDrive для бизнеса. Откройте files.component.html и просмотрите код. Полный путь к файлу — client/src/app/files/files.component.html.
Найдите компонент mgt-search-results и обратите внимание на следующие атрибуты:
<mgt-search-results class="search-results" entity-types="driveItem" [queryString]="searchText" (dataChange)="dataChange($any($event))" />Компонент mgt-search-results является частью Набора средств Microsoft Graph, и, как подразумевает имя, оно используется для отображения результатов поиска из Microsoft Graph. Компонент использует следующие функции в этом примере:
Атрибут
classиспользуется для указания того, чтоsearch-resultsкласс CSS должен применяться к компоненту.Атрибут
entity-typesиспользуется для указания типа данных для поиска. В этом случае значение используетсяdriveItemдля поиска файлов в OneDrive для бизнеса.Атрибут
queryStringиспользуется для указания термина поиска. В этом случае значение привязано кsearchTextсвойству, передаваемому компоненту файлов , когда пользователь выбирает представление связанного содержимого для строки в datagrid. Квадратные скобки вокругqueryStringуказывают, что свойство привязано к значениюsearchText.Событие
dataChangeзапускается при изменении результатов поиска. В этом случае в компоненте файловdataChange()функция клиента, а данные события передаются функции. Круглые скобкиdataChangeуказывают на то, что событие привязано кdataChange()функции.Так как не указан пользовательский шаблон, встроенный
mgt-search-resultsшаблон по умолчанию используется для отображения результатов поиска.
Альтернативой использованию компонентов, таких как mgt-search-results, является вызов API Microsoft Graph непосредственно с помощью кода. Чтобы узнать, как это работает, откройте файл graph.service.ts и найдите функцию
searchFiles(). Полный путь к файлу — client/src/app/core/graph.service.ts.Вы заметите, что
queryпараметр передается функции. Это поисковый термин, передаваемый по мере выбора пользователем представления связанного содержимого для строки в datagrid. Если поисковый запрос не передается, возвращается пустой массив.async searchFiles(query: string) { const files: DriveItem[] = []; if (!query) return files; ... }Затем создается фильтр, определяющий тип выполняемого поиска. В этом случае код ищет файлы в OneDrive для бизнеса поэтому
driveItemиспользуется так же, как вы видели ранее с компонентомmgt-search-results. Это то же самое, что передачаdriveItementity-typesв компонент mgt-search-results , который вы видели ранее. Затем параметрqueryдобавляется вqueryStringфильтр вместе сContentType:Document.const filter = { "requests": [ { "entityTypes": [ "driveItem" ], "query": { "queryString": `${query} AND ContentType:Document` } } ] };Затем вызов выполняется в
/search/queryAPI Microsoft Graph с помощьюProviders.globalProvider.graph.client.api()функции. Объектfilterпередаетсяpost()функции, которая отправляет данные в API.const searchResults = await Providers.globalProvider.graph.client.api('/search/query').post(filter);Затем результаты поиска итерируются для поиска
hits. Каждыйhitсодержит сведения о найденном документе. Свойство с именемresourceсодержит метаданные документа и добавляется вfilesмассив.if (searchResults.value.length !== 0) { for (const hitContainer of searchResults.value[0].hitsContainers) { if (hitContainer.hits) { for (const hit of hitContainer.hits) { files.push(hit.resource); } } } }Затем
filesмассив возвращается вызывающей объекту.return files;
Просматривая этот код, вы можете увидеть, что веб-компонент mgt-search-results , который вы изучили ранее, выполняет большую работу и значительно сокращает объем кода, который необходимо написать! Однако могут возникнуть сценарии, в которых требуется вызвать Microsoft Graph напрямую, чтобы получить больше контроля над данными, отправленными в API, или способом обработки результатов.
Откройте файл files.component.ts и найдите функцию
search(). Полный путь к файлу — client/src/app/files/files.component.ts.Хотя текст этой функции закомментирован из-за используемого компонента mgt-search-results , функция может использоваться для вызова Microsoft Graph при выборе пользователем представления связанного содержимого для строки в datagrid. Функция
search()вызываетсяsearchFiles()в graph.service.ts и передаетqueryпараметр в него (имя компании в этом примере). Затем результаты поиска назначаютсяdataсвойству компонента.override async search(query: string) { this.data = await this.graphService.searchFiles(query); }Затем компонент файлов может использовать
dataсвойство для отображения результатов поиска. Это можно обрабатывать с помощью пользовательских привязок HTML или с помощью другого элемента управления Microsoft Graph Toolkit с именемmgt-file-list. Ниже приведен пример привязкиdataсвойства к одному из свойств компонента с именемfilesи обработкойitemClickсобытия по мере взаимодействия пользователя с файлом.<mgt-file-list (itemClick)="itemClick($any($event))" [files]="data"></mgt-file-list>Независимо от того, следует ли использовать компонент mgt-search-results , показанный ранее или написать пользовательский код для вызова Microsoft Graph, будет зависеть от конкретного сценария. В этом примере компонент mgt-search-results используется для упрощения кода и уменьшения объема необходимой работы.
Изучение кода поиска сообщений чата Teams
Вернитесь к graph.service.ts и найдите функцию
searchChatMessages(). Вы увидите, что это похоже наsearchFiles()функцию, которую вы посмотрели ранее.- Он публикует данные в API Microsoft Graph
/search/queryи преобразует результаты в массив объектов, имеющих сведения оteamId,channelIdиmessageIdкоторые соответствуют термину поиска. - Чтобы получить сообщения канала Teams, в API и
/teams/${chat.teamId}/channels/${chat.channelId}/messages/${chat.messageId}teamIdAPI выполняетсяchannelIdвторой вызов, который передается.messageIdВозвращает полные сведения о сообщении. - Выполняются дополнительные задачи фильтрации, а полученные сообщения возвращаются вызывающей
searchChatMessages()программе.
- Он публикует данные в API Microsoft Graph
Откройте файл chats.component.ts и найдите функцию
search(). Полный путь к файлу — client/src/app/chats/chats.component.ts. Функцияsearch()вызываетсяsearchChatMessages()в graph.service.ts и передаетqueryпараметр в него.override async search(query: string) { this.data = await this.graphService.searchChatMessages(query); }Результаты поиска назначаются
dataсвойству компонента и привязке данных используются для итерации по массиву результатов и отрисовки данных. В этом примере для отображения результатов поиска используется компонент карточки Angular Material .@if (this.data.length) { <div> @for (chatMessage of this.data;track chatMessage.id) { <mat-card> <mat-card-header> <mat-card-title [innerHTML]="chatMessage.summary"></mat-card-title> <!-- <mat-card-subtitle [innerHTML]="chatMessage.body"></mat-card-subtitle> --> </mat-card-header> <mat-card-actions> <a mat-stroked-button color="basic" [href]="chatMessage.webUrl" target="_blank">View Message</a> </mat-card-actions> </mat-card> } </div> }
Отправка сообщения в канал Microsoft Teams
Помимо поиска сообщений чата Microsoft Teams, приложение также позволяет пользователю отправлять сообщения в канал Microsoft Teams. Это можно сделать, вызвав конечную точку
/teams/${teamId}/channels/${channelId}/messagesMicrosoft Graph.
В следующем коде вы увидите, что создается URL-адрес, включающий
teamIdзначения иchannelIdзначения. Значения переменной среды используются для идентификатора команды и идентификатора канала в этом примере, но эти значения могут быть динамически получены, а также с помощью Microsoft Graph. Константаbodyсодержит сообщение для отправки. Затем выполняется запрос POST, и результаты возвращаются вызывающей объекту.async sendTeamsChat(message: string): Promise<TeamsDialogData> { if (!message) new Error('No message to send.'); if (!TEAM_ID || !CHANNEL_ID) new Error('Team ID or Channel ID not set in environment variables. Please set TEAM_ID and CHANNEL_ID in the .env file.'); const url = `https://graph.microsoft.com/v1.0/teams/${TEAM_ID}/channels/${CHANNEL_ID}/messages`; const body = { "body": { "contentType": "html", "content": message } }; const response = await Providers.globalProvider.graph.client.api(url).post(body); return { id: response.id, teamId: response.channelIdentity.teamId, channelId: response.channelIdentity.channelId, message: response.body.content, webUrl: response.webUrl, title: 'Send Teams Chat' }; }Использование этого типа функций в Microsoft Graph обеспечивает отличный способ повышения качества продукта пользователей, позволяя пользователям взаимодействовать с Microsoft Teams непосредственно из приложения, которое они уже используют.