В этом примере покажем, как создать приложение для управления изображениями. После ознакомления с этой статьей Вы научитесь загружать, сохранять, отображать и управлять изображениями.
Импортируем модули attachMedia
, refresh
из @app/ui
и Heap
из @app/heap
.
import {attachMedia, refresh} from '@app/ui'
import {Heap} from '@app/heap'
attachMedia
позволяет прикреплять медиафайлыrefresh
обновляет экран.Heap
из @app/heap
используется для работы с базой данных.const ImagesTable = Heap.Table('images', {
filename: Heap.String(),
image: Heap.ImageFile(),
sessionId: Heap.String(),
})
ImagesTable
определяет структуру таблицы с полями:
filename
, в котором отображается название файлаimage
- файл изображенияsessionId
- идентификатор сессии, в которой будут размещаться будущие загруженные файлы.Определим маршрут /
, который отображает главный экран с заголовком "File manager", и на нем будут отображаться будущие файлы в виде таблицы.
app.screen('/', async (ctx, req) => {
const records = await ImagesTable.findAll(ctx, {
where: { sessionId: ctx.session.id }
})
return (
<screen title="File manager">
<text class="section">Select image file to upload</text>
{records.map(record =>
<list-item
icon={{ url: record.image.getThumbnailUrl(80) }}
content={{ title: record.filename, subTitle: record.createdAt.toLocaleDateString() }}
onClick={cardRoute({id: record.id}).navigate()}
/>
)}
ctx
и req
— контекст и запрос, используемые для обработки данных.ImagesTable.
findAll извлекает все записи изображений для текущей сессии.screen
создает экран с заголовком "File manager".text
выводит текст "Select image file to upload".records.map
перебирает все записи и создает элементы списка list-item с иконкой изображения, заголовком и датой создания.<button class={['section', 'primary']}
onClick={attachMedia({
mediaType: 'photo',
submitUrl: uploadRoute.url()
})}
>Upload</button>
</screen>
)
})
attachMedia
для загрузки изображения. При нажатии на кнопку открывается диалоговое окно для выбора фотографии, а затем вызывается маршрут загрузки uploadRoute
.На данном этапе определяется маршрут /upload
, который обрабатывает загрузку изображений.
const uploadRoute = app.apiCall('/upload', async(ctx, req) => {
await ImagesTable.create(ctx, {
filename: req.body.file.name,
image: req.body.file.hash,
sessionId: ctx.session.id,
})
return refresh()
})
uploadRoute
— это API-запрос для загрузки изображений.ImagesTable.create
создает новую запись в таблице с данными о загруженном файле.После успешной загрузки и сохранения изображения, для того чтобы новый файл отобразился на экране вызывается функция refresh
, которая обновляет текущий экран.
Для того чтобы отобразить отдельное изображение, нужно определить маршрут /card/:id
.
const cardRoute = app.screen('/card/:id', async(ctx, req) => {
const record = await ImagesTable.getById(ctx, req.params.id)
return <screen title={record.filename}>
<image src={record.image.getThumbnailSrc(800)} />
<button class={['section', 'secondary']} onClick={ctx.router.navigate('/')}>Back</button>
</screen>
})
Тут мы определяем экран для маршрута /card/:id
. Далее, используя ImagesTable.getById(ctx, req.params.id)
получаем запись из таблицы ImagesTable по идентификатору, переданному в URL и отображаем экран с заголовком, соответствующим имени файла изображения (screen title={record.filename}
). С помощью image src={record.image.getThumbnailSrc(800)}
вставим изображение с шириной 800 пикселей. Так же добавим кнопку "Back", которая возвращает пользователя на главный экран (button c ctx.router.navigate('/')
).
Этот код демонстрирует создание таблицы для хранения изображений, определение маршрутов для отображения и загрузки изображений, а также создание динамических интерфейсов для управления этими изображениями.