WebCRM (Portable Offline Edition)

Миниатюрная CRM-система для автономного сбора лидов. Работает полностью оффлайн, запускается непосредственно с USB-флешки и спроектирована с возможностью быстрого переноса на любой ПК под управлением Windows 10 без необходимости повторной настройки среды.

🚀 Архитектурные особенности (KISS)

  • Zero Dependencies: Программа написана на чистой Java (JDK 25) с использованием встроенного легковесного веб-сервера com.sun.net.httpserver. Не требует скачивания тяжелых фреймворков (Spring Boot/Tomcat).
  • Портативность: Все компоненты (JDK, репозиторий, база данных) изолированы локально на диске C: (или флешке) и не засоряют системный реестр Windows.
  • Автономная БД: В качестве хранилища используется простой текстовый файл leads_db.txt, что гарантирует сохранность данных при перезапуске и обновлении страниц.

📂 Структура каталогов

Для корректной работы портативной сборки папки на целевом ПК или USB-носителе должны быть расположены строго по следующему пути:

C:\Java\
├── VSCode-Portable\                  <-- Портативное окружение разработчика
│   ├── jdk-25.0.2\                   <-- Локальный Java Development Kit (JDK)
│   └── maven_repository\             <-- Локальный оффлайн-репозиторий VS Code
└── prog\
    └── webcrm\                       <-- Корневой каталог приложения WebCRM
        ├── .vscode\                  
        │   └── settings.json         <-- Файл жесткой привязки VS Code к локальной JDK
        ├── Main.java                 <-- Исходный код приложения (интерфейс + логика)
        ├── README.md                 <-- Текущая документация
        └── leads_db.txt              <-- Локальная база данных (создается автоматически)

💻 Порядок запуска приложения

  1. Подключите USB-накопитель (или убедитесь, что папки скопированы в корень диска C:).
  2. Запустите редактор VS Code и откройте рабочую директорию проекта: C:\Java\prog\webcrm\.
  3. Откройте файл Main.java.
  4. В правом верхнем углу интерфейса VS Code нажмите кнопку Play (Run Java).
  5. В консоли появится сервисное уведомление: CRM запущена! Откройте: http://localhost:15853.
  6. Откройте любой веб-браузер и перейдите по адресу: http://localhost:15853

Примечание для работы оффлайн: Если на ПК временно включается интернет, встроенный менеджер VS Code автоматически подтянет индексы в папку maven_repository\, после чего систему можно полностью изолировать от сети.


📑 Функционал системы и Карта кода

Интерфейс представляет собой веб-страницу со следующими возможностями:

На странице должны быть поля:

  • Имя клиента — текстовое поле ввода, обязательное для заполнения.
  • Номер телефона — текстовое поле ввода контакта, обязательное для заполнения.
  • Источник лида — выпадающий список для сегментации входящего трафика с опциями «Холодный» или «Тёплый».
  • Ответственный — выпадающий список для распределения нагрузки между сотрудниками: «Лидоруб» (первичный обзвон) или «МОП» (менеджер отдела продаж).
  • Этап сделки — выпадающий список текущего статуса клиента со значениями: «Новый лид», «Квалифицирован», «Назначена консультация», «Отказ».
  • Переключатель «Запрошено ТЗ» — флажок (checkbox) для отметки о наличии технического задания от клиента.
  • Кнопка «Сохранить» — инициирует отправку данных формы на сервер, запуск валидации и процедуру записи в базу данных.

Что происходит после нажатия кнопки «Сохранить»:

  1. Валидация: На стороне сервера проверяется заполнение обязательных полей (Имя и Телефон). При ошибке выводится трансляция предупреждения.
  2. Сохранение данных: Успешно заполненный лид рендерится ниже формы в виде информационной карточки. Данные мгновенно записываются в файл leads_db.txt и не исчезают при обновлении (F5) страницы.

Где что находится в коде (Main.java):

  • Интерфейс (HTML/JS): Находится внутри метода handle() класса CRMHandler. Формируется через динамическую сборку строки StringBuilder html.
  • Логика кнопки «Сохранить»: Обрабатывается в блоке if ("POST".equalsIgnoreCase(ex.getRequestMethod())). Отвечает за парсинг, валидацию входных данных и генерацию карточек.
  • Сохранение данных (БД): Логика чтения и дозаписи файла реализована через стандартные методы пакета java.nio.file.Files при старте сервера и отправке формы.
  • Дополнительное задание (Смена этапов): На клиентской стороне внедрен JavaScript-скрипт (метод ch(b)), циклически переключающий этапы сделки прямо в карточке без перезагрузки страницы.
  • Дополнительное задание (API): Метод sendMockApiRequest эмулирует отправку JSON-пакета с данными лида на внешний контур https://crm.local (логируется в консоль VS Code).