diff --git a/course-work/article/article1.pdf b/course-work/article/article1.pdf index d501ffd..5638d0d 100644 Binary files a/course-work/article/article1.pdf and b/course-work/article/article1.pdf differ diff --git a/course-work/article/article1.tex b/course-work/article/article1.tex index 255e160..a17d306 100644 --- a/course-work/article/article1.tex +++ b/course-work/article/article1.tex @@ -23,13 +23,13 @@ \supersection{Сравнительный анализ существующих цифровых решений в сфере поиска потерянных вещей.} - Аннотация. \textit{Статья представляет обзор существующих подходов и решений поиска потерянных вещей.} + Аннотация. \textit{Отслеживание пропавших предметов остается важной задачей, которая появляется в разнообразных ситуациях. Эта проблема может произойти из-за утери таких вещей, как ключи, удостоверения личности, смартфоны, бумажники или другие предметы значимости или необходимости. Поэтому актуален вопрос о разработке систем, способных помочь людям находить потерянное. Данная статья освещает обзор текущих методик и систем, предназначенных для поиска утраченных предметов.} Ключевые слова: \textit{бюро находок, веб-сайт, RFID, GPS.} \supersection{A comparative analysis of existing digital solutions in the field of lost items retrieval} - Annotation. \textit{This article provides an overview of existing approaches and solutions for finding lost items. } + Annotation. \textit{Tracking missing items remains an important task that arises in a variety of situations. This problem can occur due to the loss of items such as keys, ID cards, smartphones, wallets, or other items of significance or necessity. Therefore, the issue of developing systems that can help people find what they have lost is relevant. This article provides an overview of current techniques and systems designed to locate lost items.} Keywords: \textit{lost and found, websit, RFID, GPS.} @@ -41,8 +41,6 @@ Поиск утерянных вещей является актуальной проблемой, которая возникает при различных обстоятельствах. Эта проблема может возникнуть в результате потери ключей, документов, мобильных телефонов, кошельков или других ценных или важных вещей~\cite{bib:m24_losts_article,bib:usinsk_losts_article}. В связи с этим существует необходимость разработки системы, которая поможет людям вернуть утерянные вещи. - Целью данной работы является проведение анализа существующих систем поиска утерянных вещей и выделение их преимуществ и недостатков. - \subsection*{Статистика потерянных и найденных вещей} Для подтверждения актуальности и важности сравниваемых систем, необходимо провести исследование рынка и определить основные проблемы и потребности пользователей. Одним из способов сбора информации является проведение опроса среди пользователей. @@ -110,6 +108,20 @@ \captionof{figure}{Скриншот системы <>} \label{fig:lostPropertyOffice} \end{Figure} + + Сравнительный анализ: + + \begin{tabular}{ | m{5em} | m{5em}| m{5em} | } + \hline + столнаходок .рф & Find My Stuff & Lost Propery Office \\ + \hline + Устаревший UI & Удобный UI/UX & Неудобный UI/UX \\ + \hline + Нет уведомлений & Есть push оповещения & Нет уведомлений \\ + \hline + Широкий доступ & Только через GPS & Ограничен\-ный доступ \\ + \hline + \end{tabular} На основании проведенного обзора можно сделать вывод, что существующие веб-сервисы и приложения для поиска и возврата утерянных вещей имеют некоторые преимущества, но также недостатки, которые ограничивают их функциональность и удобство использования. Веб-сервис Бюро находок будет разработан с учетом этих недостатков и предлагать более удобное взаимодействие между пользователями и сервисом. diff --git a/course-work/course-work-1.tex b/course-work/course-work-1.tex index 65676db..1471fc3 100644 --- a/course-work/course-work-1.tex +++ b/course-work/course-work-1.tex @@ -62,7 +62,7 @@ \subsection{Анализ существующих систем для поиск \label{fig:stolNahodok2} \end{figure} -<>~\cite{bib:find_my_stuff} --- это мобильное приложение, разработанное для операционных систем iOS и Android. Оно предлагает функцию отслеживания утерянных предметов через GPS-модуль смартфона, представлено на рис.~\ref{fig:findMyStuff1}, \ref{fig:findMyStuff2}. Пользователи могут отмечать свои вещи на карте и получать уведомления, когда они находятся рядом с утерянным предметом. Однако, ограничение использования только наличием смартфона с GPS-модулем и низкая точность определения местоположения представляют существенные ограничения данного приложения. +<<Стол находок>>~\cite{bib:stol_nahodok} --- это мобильное приложение, разработанное для операционных систем iOS и Android. Оно предлагает функцию отслеживания утерянных предметов через GPS-модуль смартфона, представлено на рис.~\ref{fig:findMyStuff1}, \ref{fig:findMyStuff2}. Пользователи могут отмечать свои вещи на карте и получать уведомления, когда они находятся рядом с утерянным предметом. Однако, ограничение использования только наличием смартфона с GPS-модулем и низкая точность определения местоположения представляют существенные ограничения данного приложения. \begin{figure}[htb] \centering diff --git a/course-work/course-work-2.tex b/course-work/course-work-2.tex index 757623a..4fba2aa 100644 --- a/course-work/course-work-2.tex +++ b/course-work/course-work-2.tex @@ -3,10 +3,26 @@ \section{Специальный раздел} \subsection{Требования к разрабатываемой системе} -TODO +Требования к разрабатываемой системе представляют собой совокупность параметров и характеристик, которыми должно обладать разрабатываемое приложение для достижения поставленных целей и решения задач. Они определяют функциональность системы, ее поведение, а также условия, необходимые для ее корректной работы. Требования подразделяются на функциональные и нефункциональные. + +Функциональные требования описывают специфические функции или действия, которые должна выполнять система. В контексте разрабатываемого приложения для поиска и возврата уянных вещей, это могут быть функции регистрации и авторизации пользователей, поиска утерянных вещей, добавления информации о утерянных вещах, связи между пользователями и системы уведомлений. + +Нефункциональные требования определяют качественные характеристики системы, такие как производительность, безопасность, доступность, удобство использования, совместимость, масштабируемость, тестирование и документация. + +Требования к разрабатываемой системе играют ключевую роль в процессе разработки приложения. Они служат основой для проектирования, реализации и тестирования системы. Без четко определенных требований невозможно разработать эффективное и надежное приложение, которое будет отвечать потребностям пользователей и бизнес-задачам. + +В контексте курсовой работы на тему “Разработка приложения для поиска и возврата утерянных вещей”, требования к разрабатываемой системе позволяют сформулировать и структурировать задачи, которые должно решать приложение, а также определить параметры, необходимые для его успешной работы. Они служат основой для дальнейшего проектирования и разработки приложения, а также для оценки его эффективности и качества после внедрения. \subsubsection{Функциональные требования} +\begin{itemize} + \item Приложение должно предоставлять возможность регистрации и авторизации пользователей. + \item Приложение должно предоставлять возможность поиска утерянных вещей по различным критериям (например, по типу вещи, по месту утери и т.д.). + \item Пользователи должны иметь возможность добавлять информацию о утерянных вещах, включая описание, фотографии и место утери. + \item Приложение должно предоставлять функционал для связи между пользователем, который нашел вещь, и пользователем, который ее потерял. + \item Приложение должно иметь систему уведомлений, которая будет информировать пользователей о новых найденных вещах, соответствующих их критериям поиска. +\end{itemize} + ER-диаграмма представлена на рис.~\ref{fig:erd}. \begin{figure}[htb] @@ -19,24 +35,38 @@ \subsubsection{Функциональные требования} \subsubsection{Нефункциональные требования} -TODO +\begin{itemize} + \item Приложение должно обеспечивать быстрый поиск и отображение результатов, а также быстрое добавление информации о утерянных вещах. + \item Все данные пользователей должны быть защищены. Пароли должны храниться в зашифрованном виде. + \item Приложение должно быть доступно для использования 24/7. + \item Интерфейс приложения должен быть интуитивно понятным и удобным для пользователей разного уровня компьютерной грамотности. + \item Приложение должно быть совместимо с основными операционными системами (iOS, Android) и браузерами (Chrome, Firefox, Safari, Edge). + \item Приложение должно быть способно обслуживать большое количество пользователей одновременно без снижения производительности. + \item Приложение должно быть тщательно протестировано на наличие ошибок и уязвимостей перед запуском. +\end{itemize} \subsection{Проектирование модулей автоматизации процессов} -TODO +Проектирование модулей автоматизации процессов включает в себя разработку структуры и функционала модулей, которые будут автоматизировать ключевые процессы приложения для поиска и возврата утерянных вещей. В данном случае, ключевыми процессами являются: регистрация и авторизация пользователей, добавление и поиск утерянных вещей, связь между пользователями и система уведомлений. + +\subsubsection{Модуль регистрации и авторизации пользователей} + +Этот модуль предназначен для создания и поддержки учетных записей пользователей. Он должен включать функции регистрации, авторизации и восстановления пароля. Для обеспечения безопасности, пароли должны храниться в зашифрованном виде. \subsubsection{Модуль бесконечных лент объявлений потерянных, найденных вещей} -TODO +Модуль бесконечных лент объявлений представляет собой ключевой элемент приложения для поиска и возврата утерянных вещей. Он предназначен для отображения объявлений о потерянных и найденных вещах в формате бесконечной ленты, обеспечивая пользователю удобный и непрерывный доступ к информации. -\subsubsection{Модуль полнотекстового поиска объявлений} +\subsubsection{Модуль добавления и поиска утерянных вещей} -TODO +Этот модуль отвечает за добавление информации о утерянных вещах в базу данных и поиск по этой базе. Он должен предоставлять пользователю возможность добавлять описание, фотографии и место утери вещи, а также осуществлять поиск по различным критериям. \subsubsection{Модуль генерации описания объявлений} -TODO +Модуль генерации описания объявлений является важным компонентом приложения для поиска и возврата утерянных вещей. Он предназначен для автоматического создания описаний объявлений на основе введенных пользователем данных, что облегчает процесс создания объявлений и повышает их качество. \subsection*{Вывод по разделу} -TODO \ No newline at end of file +Проектирование модулей автоматизации процессов является важным этапом в разработке приложения для поиска и возврата утерянных вещей. Каждый из модулей, включая модуль регистрации и авторизации пользователей, модуль бесконечных лент объявлений, модуль добавления и поиска утерянных вещей и модуль генерации описания объявлений, играет свою уникальную роль в обеспечении функциональности и эффективности приложения. + +Каждый из этих модулей важен для обеспечения эффективности и удобства использования приложения, и их совместная работа позволяет создать надежное и функциональное приложение для поиска и возврата утерянных вещей. \ No newline at end of file diff --git a/course-work/course-work-3.tex b/course-work/course-work-3.tex index c827b73..882ec89 100644 --- a/course-work/course-work-3.tex +++ b/course-work/course-work-3.tex @@ -3,24 +3,431 @@ \section{Технологический раздел} \subsection{Выбор технологий для реализации системы} -TODO +Ниже представлены некоторые из выбранных технологий: + +\begin{lstlisting}[caption={Выбранные технологии}, label=lst:deps] +"dependencies": { + "@headlessui/react": "^1.7.14", + "@heroicons/react": "^2.0.17", + "@hookform/resolvers": "^3.1.0", + "@mdx-js/loader": "^2.3.0", + "@mdx-js/react": "^2.3.0", + "@next-auth/prisma-adapter": "^1.0.5", + "@next/bundle-analyzer": "^13.2.4", + "@next/mdx": "^13.4.3", + "@prisma/client": "^4.15.0", + "@react-three/drei": "^9.77.0", + "@react-three/fiber": "^8.13.3", + "@t3-oss/env-nextjs": "^0.2.2", + "@tanstack/react-query": "^4.28.0", + "@tanstack/react-table": "^8.9.3", + "@trpc/client": "^10.18.0", + "@trpc/next": "^10.18.0", + "@trpc/react-query": "^10.18.0", + "@trpc/server": "^10.18.0", + "aws-sdk": "^2.1408.0", + "axios": "^1.4.0", + "classnames": "^2.3.2", + "date-fns": "^2.29.3", + "feed": "^4.2.2", + "flowbite": "^1.6.5", + "flowbite-react": "^0.4.4", + "immer": "^10.0.2", + "next": "^13.4.1", + "next-auth": "4.20.1", + "next-pwa": "^5.6.0", + "next-s3-upload": "^0.3.0", + "next-seo": "^6.0.0", + "nextjs-progressbar": "^0.0.16", + "nodemailer": "^6.9.1", + "openai": "^3.2.1", + "react": "^18.2.0", + "react-copy-to-clipboard": "^5.1.0", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-highlight-words": "^0.20.0", + "react-hook-form": "^7.44.2", + "react-hot-toast": "^2.4.0", + "react-hotkeys-hook": "^4.4.1", + "react-infinite-scroll-component": "^6.1.0", + "react-medium-image-zoom": "^5.1.6", + "redis": "^4.6.7", + "sharp": "^0.32.0", + "spinners-react": "^1.0.7", + "superjson": "1.12.2", + "three": "^0.153.0", + "transliteration": "^2.3.5", + "trpc-panel": "^1.3.4", + "unique-names-generator": "^4.7.1", + "zod": "^3.21.4", + "zustand": "^4.3.8" +}, +"devDependencies": { + "@tailwindcss/forms": "^0.5.3", + "@tailwindcss/typography": "^0.5.9", + "@types/eslint": "^8.21.3", + "@types/node": "^18.16.9", + "@types/prettier": "^2.7.2", + "@types/react": "^18.0.28", + "@types/react-copy-to-clipboard": "^5.0.4", + "@types/react-dom": "^18.0.11", + "@types/react-highlight-words": "^0.16.4", + "@types/three": "^0.152.1", + "@types/uuid": "^9.0.1", + "@typescript-eslint/eslint-plugin": "^5.56.0", + "@typescript-eslint/parser": "^5.56.0", + "autoprefixer": "^10.4.14", + "eslint": "^8.37.0", + "eslint-config-next": "^13.4.1", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "husky": "^8.0.3", + "lint-staged": "^13.2.0", + "postcss": "^8.4.21", + "prettier": "2.8.7", + "prettier-plugin-tailwindcss": "^0.2.6", + "prisma": "^4.15.0", + "tailwindcss": "^3.3.0", + "typescript": "^5.0.2" +}, +\end{lstlisting} \subsection{Реализация модулей автоматизации процессов} -TODO +\subsubsection{Модуль регистрации и авторизации пользователей} + +Модуль представляет реализацию OAuth через login.mirea.ru с единовременной передачей данных пользователя. + +\begin{lstlisting}[caption={Реализация OAuth}, label=lst:oauth] +export default function MireaNinjaLksProvider(options: MireaNinjaLKSProviderConfig): Provider { + return { + id: 'lks', + name: 'LKS', + type: 'oauth', + version: '2.0', + accessTokenUrl: 'https://auth-app.mirea.ru/oauth/token', + requestTokenUrl: 'https://auth-app.mirea.ru/oauth/token', + authorization: { + url: 'https://auth-app.mirea.ru/oauth/authorize', + params: { scope: 'profile' }, + }, + token: { + url: 'https://auth-app.mirea.ru/oauth/token', + }, + userinfo: { + url: 'https://auth-app.mirea.ru/api/?action=getData&url=https://lk.mirea.ru/profile/', + }, + checks: ['state'], + async profile(profile: MireaProfile) { + const name = [profile.arUser.NAME, profile.arUser.LAST_NAME].join(' ') + return { + id: profile.arUser.ID, + name, + nickname: await nicknameValidation(name), + email: profile.arUser.LOGIN, + emailVerified: new Date(), + userInfo: null, + role: Role.USER, + image: 'https://lk.mirea.ru' + profile.arUser.PHOTO, + isBlocked: false, + blockReason: null, + } + }, + clientId: options.clientId, + clientSecret: options.clientSecret, + } +} +\end{lstlisting} + \subsubsection{Модуль бесконечных лент объявлений потерянных, найденных вещей} -TODO +\begin{lstlisting}[caption={Реализация бесконечной ленты}, label=lst:scroll] +function ScrollGridLoader({ visible }: { visible: boolean }) { + return visible ? ( +

+ + Загрузка... +

+ ) : null +} + +function ScrollGridEndMessage() { + return ( +
+ +

Пока что тут ничего нет

+
+ ) +} -\subsubsection{Модуль полнотекстового поиска объявлений} +interface InfiniteScrollGridWithFilterProps { + reason: PostItemReason +} -TODO +export default function InfiniteScrollGridWithFilter({ + reason, +}: InfiniteScrollGridWithFilterProps) { + const { enabledSortOption, checkedFilters } = useScrollGridStore((state) => state[reason]) + const postsQuery = api.posts.infinitePosts.useInfiniteQuery( + { + limit: 12, + reason, + orderByCreationDate: enabledSortOption, + filters: checkedFilters, + }, + { getNextPageParam: (lastPage) => lastPage.nextCursor }, + ) + const [posts, setPosts] = useState([]) + const [hasMore, setHasMore] = useState(true) + + useEffect(() => { + if (postsQuery.data) { + setPosts(postsQuery.data.pages.map((query) => query.items).flat()) + setHasMore(postsQuery.data.pages.at(-1)?.nextCursor !== undefined) + } + }, [postsQuery.data]) + + const fetchMoreData = () => { + if (postsQuery.data && postsQuery.data.pages.length * 10 >= 500) { + setHasMore(false) + return + } + void postsQuery.fetchNextPage() + } + + return ( + <> + + 0} />} + className='grid grid-cols-2 gap-4 sm:grid-cols-2 md:grid-cols-4' + > + {posts.map((post) => ( +
+ +
+ ))} +
+ {(postsQuery.isFetched && (!posts || posts.length === 0) && ) || null} + + ) +} +\end{lstlisting} + +\subsubsection{Модуль добавления и поиска утерянных вещей} + +\begin{lstlisting}[caption={Реализация бесконечной ленты}, label=lst:scroll] +const inputs: { name: string; className: string; input: React.ReactNode }[] = [ +{ + name: 'Фотографии', + className: 'sm:col-span-6', + input: ( + <> + + setPost((current) => ({ ...current, images: [...current.images, img] })) + } + /> +
+
    + {post.images.map((url, index) => ( +
  • +
    +
    + +
    +
    +

    + {url.split('/').at(-1)} +

    +
    +
    + +
    +
    +
  • + ))} +
+
+ + ), +}, +{ + name: 'Название', + className: 'sm:col-span-3', + input: ( +
+ setPost((value) => ({ ...value, name: e.target.value }))} + type='text' + name='name' + id='name' + className='w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm' + /> + {post.images.length > 0 && ( + + )} +
+ ), +}, +{ + name: 'Описание', + className: 'sm:col-span-6', + input: ( +