ilb / adsviewer Goto Github PK
View Code? Open in Web Editor NEWСервис просмотра объявлений
Сервис просмотра объявлений
Форму поиска реализовать через схему uniforms
adsviewer/src/usecases/Search.mjs
Line 33 in d7e2fcb
Для перерисовки формы при смене полей
Использовать Autoform autosave или onChange
https://uniforms.tools/docs/api-forms/#autosave
Перестраивать форму через router.replace или push
(Если не работает, показать пример)
Реализовать хранение ссылок на фотографии в базе, можно внтури поля json поля images или links
"images": [
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/214165/add.1519579814479e7737aa9fc/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/1020830/add.15195798364955902b3ad89/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/1020830/add.1519579852828a787958c5b/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/223159/add.151957988341218ecf1468a/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/1020830/add.1519579907282bbd3098d66/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/880603/add.1519579929830cd6a716ca9/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/776213/add.1519579949613df74b7f5f0/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/878469/add.15195800015746520e51e2b/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/762918/add.1519579983392039019cc79/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/773594/add.15195800264989957b4d509/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/366972/add.1519580060314df47f0d13f/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/762918/add.15195800950356bfefa77ae/large"
},
{
"imgurl": "https://avatars.mds.yandex.net/get-realty/212743/add.15195801352389d3f0e7930/large"
}
],
Нужно сделать, чтобы он из будущего не грузил, через настройку, например не грузить объявления свежее 30 минут, иначе он может записать как загруженное время, а на самом деле нет
Не заполняется форма при переходе по ссылке
adsviewer/autoform?case=transport&carmanufacturer=%D0%92%D0%90%D0%97+(LADA)&carmodel=2104
нужно передавать request в AutoForm.model
Переписать или настроить babe!
Тут нужно использовать process.env для конфигурации (process.env.ADSAPI_USER, process.env.ADSAPI_TOKEN)
Line 20 in e0dd06a
Загрузку запускать npm run loadads
(там сейчас подключен dotenv)
При поиске должна быть разбивка на страницы
Пример https://github.com/ilb/userprofile/blob/main/pages/salepointsHistory.js
Разработать фильтр для поиска объявлений "Транспорт.Автомобили"
Форма должна отображаться через json schema, при выборе категории "Автомобили"
Для того, чтобы перестроить форму при выборе категории используется router.push / router.replace
пример
При выборе марки/модели должны быть доступны для выбора только доступные по справочнику Кузов и Коробка передач
dateFrom: 11-04-2021 12:34:00
dateFrom: 11-04-2021 12:49:00
https://ads-api.ru/main/[email protected]&token=7898911c474142c34cae4d840cb149e9&category_id=22&date1=11-04-2021+12:34:00&date2=11-04-2021+12:49:00
Send query to server
(Provider)Get server ansver 200
Loaded...
dateFrom: 11-04-2021 12:34:00
dateFrom: 11-04-2021 12:49:00
https://ads-api.ru/main/[email protected]&token=7898911c474142c34cae4d840cb149e9&category_id=22&date1=11-04-2021+12:34:00&date2=11-04-2021+12:49:00
Send query to server
(Provider)Get server ansver 200
А в таблице ads пусто
Не работает загрузка объявлений
npm run loadads
[email protected] loadads /home/slavb/work/adsviewer
node -r dotenv/config bin/loadads.mjs
tick
(node:7938) UnhandledPromiseRejectionWarning: RangeError: Invalid time value
at Date.toISOString ()
at AdsLoader.loadData (file:///home/slavb/work/adsviewer/src/services/AdsLoader.mjs:40:38)
at uploaded (file:///home/slavb/work/adsviewer/bin/loadads.mjs:29:19)
at Timeout.tick [as _onTimeout] (file:///home/slavb/work/adsviewer/bin/loadads.mjs:34:3)
at listOnTimeout (internal/timers.js:554:17)
at processTimers (internal/timers.js:497:7)
(Use node14 --trace-warnings ...
to show where the warning was created)
(node:7938) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict
(see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:7938) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Подключить поиск в списках, пример здесь:
Можно использовать DropDown с опцией search
https://react.semantic-ui.com/modules/dropdown/#types-search-selection
Lines 26 to 28 in 51f067a
adsviewer/prisma/schema.prisma
Line 25 in 171a742
При превышении лимита 1000 (50 в бесплатной версии)
сервис не отадет все обьявления
варианты решения
Отсортировать список регионов по алфавиту в селектор
Вводное задание в проект.
Внимание! Ввводное задание на frontend, последующие задания будут fullstack, для информации https://vercel.com/guides/nextjs-prisma-postgres
У нас есть справочники авто, которые мы берем с авито, вида
model carbody {
id Int @id @default(autoincrement())
name String @db.VarChar(15)
code String @db.VarChar(15)
avitocode String @db.VarChar(15)
carmodelbody carmodelbody[]
}
такие же есть еще carmanufacturer, carmodel, carmodelbody, carmodeltransmission, cartransmission.
Их нужно периодически обновлять. Обновлени нужн осделать автоматическое.
Разработать репозиторий объявлений AdsRepository
с методами search(params) и save (data),
используя prisma
Видео-пример разработки репозитория
Примеры репозиториев проекта userprofile
Методы репозитория AdsRepository
Метод search
Поиск по полями params.title, params.description, params.categoryId
Метод save
Сохраняет объявление в базу
Для проверки репозитория разработать тест
Реализовать расчет стоимости авто параметрам
Пример на php во вложении
SampleStatisticsRepository.zip
Пример запроса на оценку
{
"estimateDate": "2021-06-18",
"manufacturer": "HYUNDAY",
"model":"SOLARIS",
"age": 9,
"body":"HATCHBACK",
"transmission":"AUTOMATIC",
"owners":3,
"enginePower":123.00,
"engineCapacity":1.6,
"year": 2011,
"region":18
}
$query = "SELECT "
. "ad.carPrice, "
. "r.kladrCode as region "
. "FROM advertisements ad "
. "LEFT JOIN regions r ON r.id = ad.regionId "
. "LEFT JOIN carModification cm ON cm.code = :cmCode AND cm.carYear = :cmCarYear "
. "WHERE "
. "ad.carModificationId = cm.id "
. "and ad.dtSale > :adDtSale "
. "and ad.carManufacturerId = :adCarManufacturerId "
. "and ad.carModelId = :adCarModelId "
. ($request->getBody() ? " and ad.carBodyId = :adCarBodyId " : '')
. "and ad.carYear = :adCarYear "
. ($request->getOwners() ? "and ad.carOwners = :adCarOwners " : '')
. "and ad.carPrice < 100000000 and ad.carPrice > 10000 and ad.carStatus IS NULL "
. "ORDER BY ad.carPrice;";
Пример по Solaris
SELECT model.id modelId, model.carManufacturerId manufacturerId
, body.id bodyId
FROM carModel model
join carBody body on body.code = 'HATCHBACK'
join carManufacturer manufacture ON manufacture.code = 'hyundai'
WHERE model.code = 'solaris'
AND model.carManufacturerId = manufacture.id
LIMIT 1
Получаем
modelId
=18694 manufacturerId
=1258 bodyId
=1
Далее получаем список цен
SELECT
ad.carPrice,
r.kladrCode as region
FROM advertisements ad
LEFT JOIN regions r ON r.id = ad.regionId
LEFT JOIN carModification cm ON cm.code = 'AUTOMATIC__123__1_6' AND cm.carYear = 2013
WHERE
ad.carModificationId = cm.id
and ad.dtSale > '2022-06-01'
and ad.carManufacturerId = 1258
and ad.carModelId = 18694
and ad.carBodyId = 1
and ad.carYear = 2013
and ad.carOwners = 2
and ad.carPrice < 100000000 and ad.carPrice > 10000 and ad.carStatus IS NULL
ORDER BY ad.carPrice;
По массиву собирается
По каждому вычисляется 3 квартиль
import quantile from 'compute-quantile';
Пример 1:
const unsorted = [4, 3, 5, 1, 2];
const q = quantile(unsorted, 0.75);
Пример 2:
const sorted = [1, 2, 3, 4, 5];
const q = quantile(sorted, 0.75, { sorted: true });
Количество итераций и задержка между ними должны через ком. строку задаваться
По умолчанию 1 итерация должна быть
Для бесконечности можно -1 передавать
Например loadads.mjs -n 10 -d 6
10 итераций задержка 6 сек
Line 46 in 2f33289
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.