← Архив: Common Lisp

Web-сайт первый опыт

Author: · 03.08.2017 18:29
· original author: alex_fff
Привет всем!
Взялся за задачку в целях изучения.
Нужен сайт по проведению тестов, результаты надо будет обработать и красиво с диаграммками показать.
Использовал hunchentoot, cl-mysql, parenscript для js и т.д.
Вроде бы со всем разобрался. На данный момент есть некий рабочий прототип.
Но когда гляжу на все это - вижу изобретенный велосипед, который едет конечно, но как-то неуклюже.
Это мой первый опыт во программированию для web. Компоненты брал чуть ли не первые, которые попадались.
Сервер - значит Hunchentoot, javascript - значит JQuery, Chartjs и parenscript.
Храним в базе данных - значит cl-mysql.
Шишек набил, проблемы порешал.
Собственно вопрос - а как умные люди решают подобные задачи? Вот, например, сейчас надо, чтобы страница с текстом и графиками формировалась и после этого можно было бросить на печать и напечаталось бы нормально. Или чтобы pdf с отчетом формировался.
А еще не до конца решен вопрос по восстановлению пароля. И совсем непонятно как, если mysql отвалился, его элегантно поднять при обращении очередного пользователя.
Странички когда формирую, если надо, организовываю div с форматированием через css. Но опыта нет никакого, и появляется ощущение, что есть пара-тройка книг или ресурсов, где описаны подходы ко всему этому. Вообще материалов очень много. Хочется как-то отфильтровать, чтобы все не перелопачивать.
Был бы очень признателен за любые советы или комментарии.
· original author: andy128k
> parenscript
Вроде как 2k17 на дворе. Нынче в моде тонкие GraphQL сервера и SPA-клиенты. :)
> печать
Это делается с помощью CSS и @media print {}
> pdf
Трудно дать общий ответ. Зависит от нюансов. Можно на сервере делать, а можно и на клиенте.
> восстановление пароля
Тут могут быть варианты.
Например, по запросу "я забыл пароль" сгенерить одноразовый токен, записать в базу рядом с пользователем, и отправить e-mail с ним (http://example.com/login/?token=....).
По заходу по ссылке с токеном, пользователя пустить, а токен в базе вытереть.
> если mysql отвалился
оставьте эту проблему systemd (или что там у вас)
> div с форматированием через css
Вёрстка это слишком большая тема чтобы коротко ответить.
БЭМ.
· original author: dima0905
если понадобится JSON, то вот  обзор библиотек.
· original author: amartynov
Немного попиарюсь: если надо пихать CLOS объекты в JSON с иерархией, вложенными объектами и HATEOAS, а потом доставать обратно, то можно попробовать https://gitlab.com/alexey-martynov/cl-json-object/
· original author: archimag
> если надо пихать CLOS объекты в JSON с иерархией, вложенными объектами и HATEOAS, а потом доставать обратно

ЛОЛ, мне сейчас приходится сопровождать один проект (правда на Java), где вот так вот объекты в JSON и обратно гоняются. Так вот. НИКОГДА ТАК НЕ ДЕЛАЙТЕ. Любое изменение модели ведёт к совершенно непредвиденным изменениям по всему проекту. Особенно доставляет, когда в одном месте на сервере меняешь, а в мобильном клиенте ломается совершенно другая функция и никто этого не замечает неделю или две.
· original author: amartynov
Ну не руками же эту конверсию менять? Задолбишься писать и сериализаторы, и парсеры. А там все по-человечески, с метаинформацией и прочим.
А опыт показывает, что изменение модели всегда ведет к последствиям. И если у нас столь слабо типизированная хрень как JSON посередине, то только тестирование нас спасает. И совершенно неважно, автоматически мы JSON получили или вручную. Особенно, если на версионность  внешнего интерфейса сложили не только болт, но и вообще все, что под рукой нашлось.
· original author: archimag
> только тестирование нас спасает.
При автоматической генерации JSON из объектов очень сложно писать тесты. Во-первых, в вывод поподает всякая хрень и всё это надо прописать в тестах. Во-вторых, изменение модели ломает половину тестов систему.
· original author: den73
Ну мне кажется тут возможна только тотальность подхода - один генератор должен генерировать все стороны интерфейса - и сериализатор, и десериализатор. 
Далее должна передаваться с каждым пакетом версия модели. Тогда всё упадёт сразу, что гораздо лучше, чем скрытый баг. 
· original author: archimag
> один генератор должен генерировать все стороны интерфейса
Сейчас часто к бэкэнду прилагается веб-интефрейс, android-приложение и iphone-приложение. Иметь один универсальный генератор для всех платформа малореалистично. 
· original author: andy128k
>Иметь один универсальный генератор для всех платформа малореалистично.
Если только все эти клиенты не на JavaScript ;)
· original author: amartynov
"не вижу препятствий" (c)
Независимо от целевого языка. Просто к генераторам кода отношусь осторожно-скептически. Большая часть доморощенных применима только для срочного закапывания.
· original author: archimag
> Если только все эти клиенты не на JavaScript ;)
Ну с точки зрения бизнес это было бы куда проще, потому что найти адекватных js-разработчиков проще, чем разработчиков под мобильные платформы, но... Недавно пришлось покопаться в исходниках cordova - я сразу понял, почему интерфейс на том же ionic "на ощупь" заметно отличается от нативного кода.
· original author: andy128k
>... cordova ... ionic ...
· original author: Hedin
React-native не пробовал?
· original author: alex_fff
Все достаточно познавательно.
А вот скажем внешний вид сайта. Ну там меню сверху, меню сбоку.
Правильнее разобраться и самому написать нечто компактно несложное без изысков.
Или можно что-то использовать готовое, что сократит расходы в 5 раз.
Есть рекомендации?
· original author: andy128k
Есть куча готовых CSS-библиотек (Bootstrap, Foundation...). Они сокращают время старта, но сильно ухудшают дальнейшую поддержку.