https://github.com/kuan-m/crm
A modular monolith CRM built with Laravel
https://github.com/kuan-m/crm
crm crud docker laravel modular-monolith rest-api
Last synced: 2 months ago
JSON representation
A modular monolith CRM built with Laravel
- Host: GitHub
- URL: https://github.com/kuan-m/crm
- Owner: kuan-m
- Created: 2026-03-10T11:00:54.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-03-28T13:26:25.000Z (3 months ago)
- Last Synced: 2026-03-28T16:32:33.836Z (3 months ago)
- Topics: crm, crud, docker, laravel, modular-monolith, rest-api
- Language: PHP
- Homepage: https://crm.kuan.uk/widget
- Size: 219 KB
- Stars: 3
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# CRM
Система для управления тикетами. Состоит из клиентского виджета для подачи заявок и панели управления для менеджеров
## Быстрый старт
Развернуть локально можно одной командой:
```bash
make dev-init
```
*С нуля до конца поднимет приложение, накатит миграции и применит сидеры (tickets, users (manager), customer). В последующем проект поднимать через make up*
### 🔗Ссылки:
- **Приложение:** [http://localhost:8085](http://localhost:8085)
- **Виджет:** [http://localhost:8085/widget](http://localhost:8085/widget)
- **Админка:** [http://localhost:8085/manager/login](http://localhost:8085/manager/login) (Данные уже подставлены (если нет то запустите make dev-seed), просто нажмите "Войти". Данные для ручного ввода: `admin@crm.test` / `password`)
- **Swagger:** [http://localhost:8085/swagger](http://localhost:8085/swagger)
---
## Интеграция виджета
Чтобы поставить виджет на любой свой сайт, просто добавьте этот код:
```html
```
- Виджет уже доступен и работает по адресу https://crm.kuan.uk/widget
- Админка https://crm.kuan.uk/manager/login (`admin@crm.test` / `password`)
---
## 🏗 Архитектура (Модульный Монолит)
Проект разбит на независимые куски — **модули** (`app/Modules`). Главная цель — чтобы модули не зависели друг от друга напрямую.
### 🔌 Главное правило: работаем только через интерфейсы
**Модуль не должен знать о "внутренностях" другого.** Общение идет только через **Contracts**.
#### ✅ Правильно (через контракт)
Если `Ticket` хочет сохранить файлы, он просит об этом `IFileService`.
```php
public function __construct(
protected IFileService $fileService // ✅ Просто просим интерфейс
) {}
```
#### ❌ Неправильно (напрямую)
Нельзя импортировать реализацию (`Services`) или модели (`Models`) из чужого модуля:
```php
use App\Modules\File\Services\Service; // ❌ Нельзя! Прямая связь
```
---
## 💎 4 принципf "невидимых границ"
1. **Интерфейсы** — модуль показывает наружу только "кнопки", остальное скрыто.
2. **Изоляция** — не лезем в чужие модели и таблицы напрямую.
3. **DTO** — передаем данные через простые классы, а не Laravel-модели.
4. **DI** — Laravel сам подставит нужную реализацию (через сервис-провайдеры).
### 🚀 Зачем это надо?
- **Тесты**: можно заменить реальный модуль "заглушкой" (Mock).
- **Микросервисы**: модуль легко вынести отдельно, просто заменив интерфейс на HTTP-запрос. Код в других модулях при этом **не изменится**.
---
### Сущности:
1. **Manager (User)** — сотрудники, которые обрабатывают заявки
2. **Customer** — клиенты (создаются автоматически при подаче тикета)
3. **Ticket** — само обращение (тема, текст, статус, файлы)
4. **File (Media)** — общий модуль, тикет ссылаются на него
### Репозитории (Data Layer):
Для работы с данными использован паттерн "Репозиторий". Это позволит легко менять хранилище (в зависимости от откружений, тестов и тд.)
- **EloquentRepository** — основная работа с БД
- **InMemoryRepository** — удобно для быстрых тестов в ОЗУ без участия базы
### Безопасность и API:
- **Авторизация:** Используются стандартные сессии Laravel
- **Публичные эндпоинты:** Создание тикета, загрузка файлов, просмотр виджета
- **Защищенные эндпоинты:** Статистика, смена статусов, просмотр деталей тикета (доступны только после входа в админку)
- **API тикетов** services/crm/app/Modules/Ticket/Routes/api.php
- **Роуты админов** services/crm/app/Modules/Manager/Routes/web.php
- **Роуты web** services/crm/routes/web.php
---
## Тестовые данные (Seeders)
При запуске `make dev-init` создаются:
- Администратор: `admin@crm.test` / `password`.
- 10 случайных клиентов
- Около 50 тикетов с разными статусами
---
**Библиотеки:**
- `spatie/laravel-medialibrary` — для работы с файлами
- `fakerphp/faker` — для генерации тестовых данных
- `tailwind/axios` — в виджете для легкости и быстрого UI (Tailwind через CDN. Это делает его быстрым для загрузки на сторонних сайтах, Верстка и фронтенд писался через ИИ, чтобы сэкономить время)