Готовый стартовый проект для миграции legacy WinForms/DevExpress приложения на современный стек:
- backend: ASP.NET Core Web API на .NET 9;
- ORM: DevExpress XPO;
- frontend: React + Vite + DevExtreme React;
- фоновые процессы: отдельный Worker Service;
- рассылка: MailKit + персистентная очередь + статистика;
- legacy-интеграция: авторизация и чтение сотрудников / организаций / вкладки «Работа» из текущей БД.
По исходному архиву были выделены и перенесены ключевые сущности:
set_User→LegacyUserset_UserInfo→LegacyUserInfoset_Org→LegacyOrgset_OrgInfo→LegacyOrgInfoset_OrgInfoOther→LegacyOrgInfoOtherset_Contact→LegacyContactset_Job→LegacyJobset_Task→LegacyTaskset_SprEnumeration→LegacySprEnumeration
Совместимость по паролям сохранена: используется старый алгоритм MD5(Encoding.Unicode.GetBytes(password)).
Проект сознательно разделён на две БД:
- LegacyDb — текущая рабочая БД существующего приложения. Из неё читаются:
- пользователи;
- организации;
- контакты;
- данные вкладки «Работа» (
set_Job).
- MailingDb — новая БД сервиса рассылки. В ней хранятся:
- кампании;
- вложения;
- очереди отправки;
- истории запусков;
- статистика;
- SMTP-профили.
Такой подход не ломает legacy-схему и упрощает внедрение.
backend/
PulsNextMailing.sln
src/
PulsNext.Domain.Legacy/
PulsNext.Domain.Mailing/
PulsNext.Infrastructure/
PulsNext.Api/
PulsNext.Worker/
frontend/
puls-next-web/
storage/
Скопируйте example-конфиги и подставьте connection string legacy БД из старого settings/XpoSettingsDB.xml:
copy backend\src\PulsNext.Api\appsettings.Development.example.json backend\src\PulsNext.Api\appsettings.Development.json
copy backend\src\PulsNext.Worker\appsettings.Development.example.json backend\src\PulsNext.Worker\appsettings.Development.jsonДалее отредактируйте:
backend/src/PulsNext.Api/appsettings.Development.jsonbackend/src/PulsNext.Worker/appsettings.Development.json
Пример:
{
"ConnectionStrings": {
"LegacyDb": "XpoProvider=MSSqlServer;data source=SERVER;integrated security=SSPI;initial catalog=DXPulsBase",
"MailingDb": "XpoProvider=SQLite;Data Source=../../../../storage/mailing.db"
}
}cd backend
dotnet build PulsNextMailing.slnЕсли во время сборки появляется DX1001, см. docs/devexpress-license.md.
cd backend
dotnet run --project src/PulsNext.ApiВ отдельной консоли:
cd backend
dotnet run --project src/PulsNext.Workercd frontend/puls-next-web
npm install
npm run build
npm run devПосле этого будут доступны:
- frontend:
http://localhost:5173 - backend api:
http://localhost:5185 - swagger:
http://localhost:5185/swagger
- JWT-авторизация по legacy пользователям;
- список сотрудников;
- список организаций;
- данные вкладки «Работа»;
- CRUD кампаний рассылки;
- CRUD SMTP-профилей;
- загрузка файлов;
- предпросмотр расписания;
- статистика по отправкам;
- ручной запуск кампании.
- поиск кампаний, у которых наступило время запуска;
- расчёт следующего времени отправки;
- генерация очереди отправки по организациям и email-адресам;
- конкурентная обработка очереди;
- ретраи;
- запись статусов и ошибок.
- современная shell-навигация;
- логин;
- страницы сотрудников, организаций и вкладки «Работа»;
- список кампаний;
- мастер редактирования кампании;
- загрузка вложений и картинок;
- просмотр статистики;
- управление SMTP-профилями.
- OneTime — отложенная разовая отправка;
- FixedInterval — каждые N минут;
- RandomInterval — случайный интервал от X до Y минут;
- Cron — произвольное расписание Quartz Cron (например, по понедельникам, по будням, в определённые часы и т.п.).
- Локальная сборка проверена командами
dotnet build backend/PulsNextMailing.slnиnpm run buildвfrontend/puls-next-web. - Frontend и backend настроены как production-ready scaffold: после подстановки актуальных connection strings проект должен быть близок к боевому запуску.
- Для реального продакшена рекомендовано:
- вынести файловое хранилище в S3/MinIO/Azure Blob;
- подключить Redis/RabbitMQ для распределённой очереди;
- добавить OpenTelemetry/Prometheus;
- включить reverse proxy и TLS.
Если будете внедрять это в текущую БД, сначала поднимите проект на копии базы и прогоните сценарии:
- логин;
- чтение сотрудников;
- чтение организаций;
- чтение вкладки «Работа»;
- создание тестовой кампании;
- отправка на тестовый SMTP.