ISBuilder 8.7.2
dotnet add package ISBuilder --version 8.7.2
NuGet\Install-Package ISBuilder -Version 8.7.2
<PackageReference Include="ISBuilder" Version="8.7.2" />
<PackageVersion Include="ISBuilder" Version="8.7.2" />
<PackageReference Include="ISBuilder" />
paket add ISBuilder --version 8.7.2
#r "nuget: ISBuilder, 8.7.2"
#:package ISBuilder@8.7.2
#addin nuget:?package=ISBuilder&version=8.7.2
#tool nuget:?package=ISBuilder&version=8.7.2
ISBuilder
Information System Builder — конструктор информационных систем на .NET 8.
Один пакет — все инструменты для разработки WinForms + EF Core + SQL Server приложений.
Установка
dotnet add package ISBuilder
Подтягивает все 27 пакетов автоматически. Ничего дополнительно устанавливать не нужно.
Состав пакетов
| Пакет | Пространство имен | Описание |
|---|---|---|
| AppBuilder | AppBuilder |
Конструктор CRUD-приложений за 15 строк |
| ExportKit | UniversalExport |
Экспорт/импорт в 11 форматов (JSON, XML, CSV, TXT, Excel, PDF, HTML, YAML, Markdown, Word, SQL) |
| EFQueryKit | EFQueryKit |
Запросы EF без лямбд, CRUD, агрегации |
| AutoFormsKit | AutoForms |
Автогенерация диалогов с валидацией [Required], [StringLength], [DataType] |
| SeedKit | SeedKit |
Генератор тестовых данных (русские ФИО, адреса, телефоны) |
| TestCaseKit | TestCaseKit |
Генератор тест-кейсов для тестирования ИС |
| ISBuilder | — | Мета-пакет, подтягивает все 27 пакетов |
| ConnectKit | ConnectKit |
Визуальный диалог подключения к SQL Server |
| NotifyKit | NotifyKit |
Всплывающие уведомления (тосты) |
| AppSettingsKit | SettingsKit |
Хранение настроек приложения в JSON с секциями |
| ValidationKit | ValidationKit |
Валидация данных без лямбд |
| MenuKit | MenuKit |
Генератор меню WinForms |
| DashboardKit | DashboardKit |
Панель статистики с цветными карточками |
| MigrationKit | MigrationKit |
Управление БД (создание, бэкап, восстановление, сид) |
| HelpKit | HelpKit |
Автоматическая справка по модели данных |
| DataDictKit | DataDictKit |
Словарь данных в Word |
| SearchKit | SearchKit |
Панель поиска для DataGridView |
| StatusBarKit | StatusBarKit |
Статусная строка с часами и счетчиком записей |
| AuthKit | AuthKit |
Авторизация (логин, роли, хеширование паролей) |
| UmlKit | UmlKit |
UML/ER-диаграммы (PlantUML, Mermaid, Draw.io) |
| PrintKit | PrintKit |
Печать таблиц с предпросмотром |
| ThemeKit | ThemeKit |
6 тем оформления (Dark, Light, Blue, Green, Purple, Orange) + сохранение выбора |
| ChartKit | ChartKit |
Диаграммы (столбчатая, круговая, линейная) |
| AuditKit | AuditKit |
Журнал действий пользователей |
| SchedulerKit | SchedulerKit |
Планировщик фоновых задач |
| ReportKit | ReportKit |
Генерация PDF-отчетов с таблицами и сводкой |
| CalcKit | CalcKit |
Бизнес-калькуляторы (кредит, депозит, пособие, доставка и др.) |
| MatchKit | MatchKit |
Движок подбора записей по критериям с оценкой совпадения |
Полный рабочий пример: ИС "Служба занятости"
Один файл Program.cs -- полноценная информационная система с дашбордом, CRUD,
поиском, экспортом в 9 форматов, словарём данных и тест-кейсами.
Установка: dotnet add package ISBuilder + dotnet add package Microsoft.EntityFrameworkCore.SqlServer.
// Полный рабочий пример — один файл Program.cs
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using AppBuilder;
using SeedKit;
using AuditKit;
using DataDictKit;
using TestCaseKit;
var db = new EmploymentDb();
db.Database.EnsureCreated();
if (!db.Enterprises.Any())
{
var enterprises = Seeder.Generate<Enterprise>(10);
foreach (var e in enterprises) e.Id = 0;
db.Enterprises.AddRange(enterprises);
db.SaveChanges();
var vacancies = Seeder.GenerateLinked<Vacancy, Enterprise>(50, enterprises.ToList(), "EnterpriseId");
foreach (var v in vacancies) v.Id = 0;
db.Vacancies.AddRange(vacancies);
db.SaveChanges();
var applicants = Seeder.Generate<Applicant>(30);
foreach (var a in applicants) a.Id = 0;
db.Applicants.AddRange(applicants);
db.SaveChanges();
// Отклики
var rnd = new Random();
var vacList = db.Vacancies.ToList();
var appList = db.Applicants.ToList();
for (int i = 0; i < 20; i++)
{
db.Applications.Add(new VacancyApplication
{
ApplicantId = appList[rnd.Next(appList.Count)].Id,
VacancyId = vacList[rnd.Next(vacList.Count)].Id
});
}
db.SaveChanges();
// Словарь данных
DataDictionary.GenerateDocx(db, "Словарь_данных.docx");
DataDictionary.GenerateJson(db, "Словарь_данных.json");
// Тест-кейсы
var cases = new List<TestCase>();
cases.AddRange(TestCaseGenerator.GenerateCrud<Vacancy>("Вакансии"));
cases.AddRange(TestCaseGenerator.GenerateCrud<Applicant>("Соискатели"));
cases.AddRange(TestCaseGenerator.GenerateCrud<Enterprise>("Предприятия"));
UniversalExport.ExportManager.Export(
TestCaseGenerator.ToDataTable(cases, "Тест-кейсы"), "Тест_кейсы.xlsx");
Audit.Log(db, "БД создана, словарь и тест-кейсы сгенерированы", "system");
}
App.Create<EmploymentDb>("ИС «Городская служба занятости»")
.WithMenu()
.WithDashboard(d => new[]
{
("Предприятий", (object)d.Enterprises.Count(), Color.FromArgb(52, 152, 219)),
("Вакансий", (object)d.Vacancies.Count(), Color.FromArgb(46, 204, 113)),
("Соискателей", (object)d.Applicants.Count(), Color.FromArgb(155, 89, 182)),
("Откликов", (object)d.Applications.Count(), Color.FromArgb(230, 126, 34))
})
.AddTab<Enterprise>("Предприятия")
.AddTab<Vacancy>("Вакансии")
.AddTab<Applicant>("Соискатели")
.AddTab<VacancyApplication>("Отклики")
.WithExport()
.WithSearch()
.WithStatusBar()
.Size(1280, 800)
.Run();
// --- Перечисления ---
public enum EmploymentType
{
[Display(Name = "Полная")] Полная,
[Display(Name = "Частичная")] Частичная,
[Display(Name = "Удалённая")] Удалённая,
[Display(Name = "Стажировка")] Стажировка
}
public enum EducationLevel
{
[Display(Name = "Среднее")] Среднее,
[Display(Name = "Среднее специальное")] СреднееСпециальное,
[Display(Name = "Незаконченное высшее")] НезаконченноеВысшее,
[Display(Name = "Высшее")] Высшее,
[Display(Name = "Магистратура")] Магистратура,
[Display(Name = "Аспирантура")] Аспирантура
}
public enum ApplicationStatus
{
[Display(Name = "На рассмотрении")] НаРассмотрении,
[Display(Name = "Приглашён на собеседование")] Собеседование,
[Display(Name = "Принят")] Принят,
[Display(Name = "Отклонён")] Отклонён
}
// --- Модели ---
public class Enterprise
{
public int Id { get; set; }
[Display(Name = "Название"), Required, StringLength(100)]
public string Name { get; set; } = "";
[Display(Name = "Юридический адрес")] public string LegalAddress { get; set; } = "";
[Display(Name = "Фактический адрес")] public string ActualAddress { get; set; } = "";
[Display(Name = "Телефон")] public string Phone { get; set; } = "";
[Display(Name = "Контактное лицо")] public string ContactPerson { get; set; } = "";
public List<Vacancy> Vacancies { get; set; } = new();
public override string ToString() => Name;
}
public class Vacancy
{
public int Id { get; set; }
[Display(Name = "Должность"), Required] public string Position { get; set; } = "";
[Display(Name = "Оклад")] public decimal Salary { get; set; }
[Display(Name = "Занятость")] public EmploymentType EmploymentType { get; set; } = EmploymentType.Полная;
[Display(Name = "Требуемое образование")] public EducationLevel RequiredEducation { get; set; } = EducationLevel.Среднее;
[Display(Name = "Мин. возраст")] public int MinAge { get; set; }
[Display(Name = "Макс. возраст")] public int MaxAge { get; set; }
[Display(Name = "Требуемый стаж (лет)")] public int RequiredExperience { get; set; }
[Display(Name = "Дата публикации")] public DateTime PublishedDate { get; set; } = DateTime.Now;
[Display(Name = "Активна")] public bool IsActive { get; set; } = true;
[Display(Name = "Предприятие")] public int EnterpriseId { get; set; }
[ForeignKey("EnterpriseId")] public Enterprise? Enterprise { get; set; }
public override string ToString() => $"{Position} ({Salary:N0} руб.)";
}
public class Applicant
{
public int Id { get; set; }
[Display(Name = "ФИО"), Required] public string FullName { get; set; } = "";
[Display(Name = "Адрес регистрации")] public string RegistrationAddress { get; set; } = "";
[Display(Name = "Адрес проживания")] public string ActualAddress { get; set; } = "";
[Display(Name = "Телефон")] public string Phone { get; set; } = "";
[Display(Name = "Образование")] public EducationLevel Education { get; set; } = EducationLevel.Среднее;
[Display(Name = "Стаж (лет)")] public int Experience { get; set; }
[Display(Name = "Прежняя зарплата")] public decimal PreviousSalary { get; set; }
[Display(Name = "Прежняя должность")] public string PreviousPosition { get; set; } = "";
[Display(Name = "Желаемая должность")] public string DesiredPosition { get; set; } = "";
[Display(Name = "Мин. желаемая зарплата")] public decimal MinDesiredSalary { get; set; }
[Display(Name = "Дата постановки на учёт")] public DateTime RegistrationDate { get; set; } = DateTime.Now;
[Display(Name = "Семейное положение")] public string MaritalStatus { get; set; } = "";
public override string ToString() => FullName;
}
public class VacancyApplication
{
public int Id { get; set; }
[Display(Name = "Соискатель")] public int ApplicantId { get; set; }
[ForeignKey("ApplicantId")] public Applicant? Applicant { get; set; }
[Display(Name = "Вакансия")] public int VacancyId { get; set; }
[ForeignKey("VacancyId")] public Vacancy? Vacancy { get; set; }
[Display(Name = "Дата отклика")] public DateTime ApplicationDate { get; set; } = DateTime.Now;
[Display(Name = "Статус")] public ApplicationStatus Status { get; set; } = ApplicationStatus.НаРассмотрении;
}
// --- Контекст БД ---
public class EmploymentDb : DbContext
{
public DbSet<Enterprise> Enterprises { get; set; }
public DbSet<Vacancy> Vacancies { get; set; }
public DbSet<Applicant> Applicants { get; set; }
public DbSet<VacancyApplication> Applications { get; set; }
public DbSet<AuditLog> AuditLogs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer(
"Server=SERVER;Database=EmploymentDb;Trusted_Connection=true;TrustServerCertificate=true");
}
Полный рабочий пример: ИС "Библиотека"
Установка: dotnet add package ISBuilder + dotnet add package Microsoft.EntityFrameworkCore.SqlServer.
// Полный рабочий пример — один файл Program.cs
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using AppBuilder;
using SeedKit;
using AuditKit;
using DataDictKit;
using TestCaseKit;
var db = new LibraryDb();
db.Database.EnsureCreated();
if (!db.Authors.Any())
{
var rnd = new Random();
var authors = new List<Author>();
foreach (var name in new[] { "Толстой Л.Н.", "Достоевский Ф.М.", "Булгаков М.А.", "Пушкин А.С.",
"Гоголь Н.В.", "Чехов А.П.", "Тургенев И.С.", "Гончаров И.А.", "Шолохов М.А.",
"Лермонтов М.Ю.", "Куприн А.И.", "Бунин И.А.", "Горький М.", "Есенин С.А.", "Маяковский В.В." })
authors.Add(new Author { Name = name });
db.Authors.AddRange(authors);
db.SaveChanges();
var genres = new List<Genre>();
foreach (var name in new[] { "Роман", "Повесть", "Рассказ", "Поэма", "Драма",
"Детектив", "Фантастика", "Научная литература", "Учебник", "Справочник", "Биография" })
genres.Add(new Genre { Name = name });
db.Genres.AddRange(genres);
db.SaveChanges();
var publishers = new List<Publisher>();
foreach (var name in new[] { "Эксмо", "АСТ", "Азбука", "Просвещение", "Дрофа",
"Питер", "МИФ", "Росмэн", "Лениздат", "Молодая гвардия" })
publishers.Add(new Publisher { Name = name });
db.Publishers.AddRange(publishers);
db.SaveChanges();
var readers = Seeder.Generate<Reader>(40);
foreach (var r in readers) r.Id = 0;
db.Readers.AddRange(readers);
db.SaveChanges();
var authorList = db.Authors.ToList();
var genreList = db.Genres.ToList();
var pubList = db.Publishers.ToList();
var bookTitles = new[] { "Война и мир", "Преступление и наказание", "Мастер и Маргарита",
"Евгений Онегин", "Анна Каренина", "Мёртвые души", "Тихий Дон", "Идиот",
"Отцы и дети", "Двенадцать стульев", "Капитанская дочка", "Герой нашего времени",
"Обломов", "Собачье сердце", "Вишнёвый сад", "Гранатовый браслет",
"Тёмные аллеи", "На дне", "Детство", "Ревизор",
"Бесы", "Братья Карамазовы", "Записки из мёртвого дома", "Белая гвардия",
"Дубровский", "Пиковая дама", "Нос", "Шинель", "Хаджи-Мурат", "Кавказский пленник" };
foreach (var title in bookTitles)
{
db.Books.Add(new Book
{
Title = title,
AuthorId = authorList[rnd.Next(authorList.Count)].Id,
GenreId = genreList[rnd.Next(genreList.Count)].Id,
PublisherId = pubList[rnd.Next(pubList.Count)].Id,
LibraryCode = $"84({rnd.Next(2,5)})Р{rnd.Next(10,99)}",
PublishYear = rnd.Next(1950, 2025),
ISBN = $"978-5-{rnd.Next(10000,99999)}-{rnd.Next(100,999)}-{rnd.Next(0,9)}",
TotalCopies = rnd.Next(2, 8)
});
}
db.SaveChanges();
var bookList = db.Books.ToList();
foreach (var book in bookList)
{
for (int i = 0; i < book.TotalCopies; i++)
db.BookCopies.Add(new BookCopy
{
BookId = book.Id,
InventoryNumber = $"ИНВ-{rnd.Next(10000, 99999)}",
Condition = (BookCondition)rnd.Next(0, 3)
});
}
db.SaveChanges();
var readerList = db.Readers.ToList();
var copyList = db.BookCopies.Where(c => c.Condition != BookCondition.Списан).ToList();
for (int i = 0; i < 60; i++)
{
var reader = readerList[rnd.Next(readerList.Count)];
var copy = copyList[rnd.Next(copyList.Count)];
var issueDate = DateTime.Now.AddDays(-rnd.Next(1, 90));
var returned = rnd.Next(100) < 70;
db.Loans.Add(new Loan
{
ReaderId = reader.Id, BookCopyId = copy.Id,
IssueDate = issueDate, DueDate = issueDate.AddDays(30),
ReturnDate = returned ? issueDate.AddDays(rnd.Next(1, 35)) : null,
Status = returned ? LoanStatus.Возвращена : LoanStatus.Выдана
});
}
db.SaveChanges();
DataDictionary.GenerateDocx(db, "Словарь_данных_библиотека.docx");
var cases = new List<TestCase>();
cases.AddRange(TestCaseGenerator.GenerateCrud<Book>("Книги"));
cases.AddRange(TestCaseGenerator.GenerateCrud<Reader>("Читатели"));
cases.AddRange(TestCaseGenerator.GenerateCrud<BookCopy>("Экземпляры"));
cases.AddRange(TestCaseGenerator.GenerateCrud<Loan>("Выдачи"));
UniversalExport.ExportManager.Export(
TestCaseGenerator.ToDataTable(cases, "Тест-кейсы"), "Тест_кейсы_библиотека.xlsx");
Audit.Log(db, "БД создана, словарь и тест-кейсы сгенерированы", "system");
}
App.Create<LibraryDb>("ИС «Управление библиотекой»")
.WithMenu()
.WithDashboard(d => new[]
{
("Книг", (object)d.Books.Count(), Color.FromArgb(142, 68, 173)),
("Читателей", (object)d.Readers.Count(), Color.FromArgb(41, 128, 185)),
("Экземпляров", (object)d.BookCopies.Count(), Color.FromArgb(39, 174, 96)),
("Выдач", (object)d.Loans.Count(), Color.FromArgb(230, 126, 34))
})
.AddTab<Book>("Каталог книг")
.AddTab<Author>("Авторы").AddTab<Genre>("Жанры").AddTab<Publisher>("Издательства")
.AddTab<Reader>("Читатели").AddTab<BookCopy>("Экземпляры").AddTab<Loan>("Выдачи / Возвраты")
.WithExport().WithSearch().WithStatusBar().Size(1280, 800).Run();
// --- Перечисления ---
public enum BookCondition
{
[Display(Name = "Отличное")] Отличное, [Display(Name = "Хорошее")] Хорошее,
[Display(Name = "Удовлетворительное")] Удовлетворительное, [Display(Name = "Списан")] Списан
}
public enum LoanStatus
{
[Display(Name = "Выдана")] Выдана, [Display(Name = "Возвращена")] Возвращена,
[Display(Name = "Просрочена")] Просрочена
}
// --- Справочники ---
public class Author
{
public int Id { get; set; }
[Display(Name = "ФИО автора"), Required] public string Name { get; set; } = "";
public List<Book> Books { get; set; } = new();
public override string ToString() => Name;
}
public class Genre
{
public int Id { get; set; }
[Display(Name = "Название жанра"), Required] public string Name { get; set; } = "";
public List<Book> Books { get; set; } = new();
public override string ToString() => Name;
}
public class Publisher
{
public int Id { get; set; }
[Display(Name = "Название издательства"), Required] public string Name { get; set; } = "";
public List<Book> Books { get; set; } = new();
public override string ToString() => Name;
}
// --- Модели ---
public class Book
{
public int Id { get; set; }
[Display(Name = "Название"), Required, StringLength(200)] public string Title { get; set; } = "";
[Display(Name = "Автор")] public int AuthorId { get; set; }
[ForeignKey("AuthorId")] public Author? Author { get; set; }
[Display(Name = "Жанр")] public int GenreId { get; set; }
[ForeignKey("GenreId")] public Genre? Genre { get; set; }
[Display(Name = "Издательство")] public int PublisherId { get; set; }
[ForeignKey("PublisherId")] public Publisher? Publisher { get; set; }
[Display(Name = "Библиотечный шифр")] public string LibraryCode { get; set; } = "";
[Display(Name = "Год издания")] public int PublishYear { get; set; }
[Display(Name = "ISBN")] public string ISBN { get; set; } = "";
[Display(Name = "Экземпляров")] public int TotalCopies { get; set; }
public List<BookCopy> Copies { get; set; } = new();
public override string ToString() => Title;
}
public class Reader
{
public int Id { get; set; }
[Display(Name = "ФИО"), Required] public string FullName { get; set; } = "";
[Display(Name = "Читательский билет")] public string CardNumber { get; set; } = "";
[Display(Name = "Телефон")] public string Phone { get; set; } = "";
[Display(Name = "Дата выдачи билета")] public DateTime CardIssueDate { get; set; } = DateTime.Now;
[Display(Name = "Перерегистрация")] public DateTime LastReregistration { get; set; } = DateTime.Now;
[Display(Name = "Нарушитель")] public bool IsViolator { get; set; } = false;
public override string ToString() => FullName;
}
public class BookCopy
{
public int Id { get; set; }
[Display(Name = "Инв. номер"), Required] public string InventoryNumber { get; set; } = "";
[Display(Name = "Состояние")] public BookCondition Condition { get; set; } = BookCondition.Хорошее;
[Display(Name = "Книга")] public int BookId { get; set; }
[ForeignKey("BookId")] public Book? Book { get; set; }
public override string ToString() => $"{InventoryNumber} ({Book?.Title ?? "?"})";
}
public class Loan
{
public int Id { get; set; }
[Display(Name = "Читатель")] public int ReaderId { get; set; }
[ForeignKey("ReaderId")] public Reader? Reader { get; set; }
[Display(Name = "Экземпляр")] public int BookCopyId { get; set; }
[ForeignKey("BookCopyId")] public BookCopy? BookCopy { get; set; }
[Display(Name = "Дата выдачи")] public DateTime IssueDate { get; set; } = DateTime.Now;
[Display(Name = "Срок возврата")] public DateTime DueDate { get; set; }
[Display(Name = "Дата возврата")] public DateTime? ReturnDate { get; set; }
[Display(Name = "Статус")] public LoanStatus Status { get; set; } = LoanStatus.Выдана;
}
// --- Контекст ---
public class LibraryDb : DbContext
{
public DbSet<Author> Authors { get; set; }
public DbSet<Genre> Genres { get; set; }
public DbSet<Publisher> Publishers { get; set; }
public DbSet<Book> Books { get; set; }
public DbSet<Reader> Readers { get; set; }
public DbSet<BookCopy> BookCopies { get; set; }
public DbSet<Loan> Loans { get; set; }
public DbSet<AuditLog> AuditLogs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer(
"Server=SERVER;Database=LibraryDb;Trusted_Connection=true;TrustServerCertificate=true");
}
Покрываемые предметные области (25+)
ISBuilder содержит инструменты для разработки информационных систем по любой предметной области:
| Область | Примеры сущностей |
|---|---|
| Служба занятости | Вакансии, Соискатели, Предприятия, Отклики |
| Банк | Клиенты, Кредиты, Вклады, Платежи |
| Гостиница | Номера, Гости, Бронирования, Услуги |
| Магазин | Товары, Заказы, Клиенты, Скидки |
| Транспорт | Рейсы, Билеты, Пассажиры, Маршруты |
| Аптека | Лекарства, Рецепты, Поставщики, Продажи |
| Поликлиника | Врачи, Пациенты, Приемы, Диагнозы |
| Автосалон | Автомобили, Клиенты, Продажи, Сервис |
| Библиотека | Книги, Читатели, Выдачи, Авторы |
| Риелторское агентство | Объекты, Клиенты, Сделки, Агенты |
| Турагентство | Туры, Клиенты, Бронирования, Направления |
| Ресторан | Блюда, Заказы, Столики, Официанты |
| Автосервис | Автомобили, Заказ-наряды, Запчасти, Мастера |
| Склад | Товары, Поступления, Отгрузки, Ячейки |
| Учебный центр | Курсы, Студенты, Преподаватели, Оценки |
| Кинотеатр | Фильмы, Сеансы, Залы, Билеты |
| Салон красоты | Услуги, Мастера, Клиенты, Записи |
| Фитнес-клуб | Абонементы, Клиенты, Тренеры, Занятия |
| Страховая компания | Полисы, Клиенты, Выплаты, Агенты |
| Доставка еды | Блюда, Заказы, Курьеры, Рестораны |
| Ветеринарная клиника | Животные, Владельцы, Приемы, Лечение |
| Прокат автомобилей | Автомобили, Клиенты, Аренда, Тарифы |
| Управляющая компания ЖКХ | Дома, Жильцы, Платежи, Заявки |
| Спортивная школа | Секции, Тренеры, Ученики, Соревнования |
| Издательство | Книги, Авторы, Тиражи, Продажи |
Как использовать (How To)
Шаг 1. Создать проект
dotnet new winforms -n MyApp
cd MyApp
Шаг 2. Установить ISBuilder
dotnet add package ISBuilder
Все 27 пакетов установятся автоматически.
Шаг 3. Создать модели данных
Создайте классы сущностей по вашей предметной области:
public class Vacancy
{
public int Id { get; set; }
public string Position { get; set; }
public decimal Salary { get; set; }
public string EmploymentType { get; set; }
public DateTime PublishedDate { get; set; }
public int EnterpriseId { get; set; }
}
Шаг 4. Создать DbContext
using Microsoft.EntityFrameworkCore;
public class MyDbContext : DbContext
{
public DbSet<Vacancy> Vacancies { get; set; }
public DbSet<AuditKit.AuditLog> AuditLogs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer(
"Server=.;Database=MyAppDb;Trusted_Connection=true;TrustServerCertificate=true");
}
Шаг 5. Создать и заполнить БД
using MigrationKit;
using SeedKit;
var db = new MyDbContext();
await DbHelper.EnsureCreatedAsync(db); // создать БД
var data = Seeder.Generate<Vacancy>(50); // сгенерировать тестовые данные
db.Vacancies.AddRange(data);
db.SaveChanges();
Шаг 6. Запустить приложение
using AppBuilder;
App.Create<MyDbContext>("Моя информационная система")
.WithMenu()
.WithDashboard(db => new[] {
("Записей", (object)db.Vacancies.Count(), Color.FromArgb(52,152,219))
})
.AddTab<Vacancy>("Вакансии")
.WithExport()
.WithSearch()
.WithStatusBar()
.Size(1200, 750)
.Run();
Шаг 7. Добавить дополнительные функции
// Отчет в PDF
var vacancies = db.Vacancies.ToList();
var dt = UniversalExport.ExportManager.ToDataTable(vacancies);
Report.Create("Отчет").AddTable(dt).AddSummary("Salary").SavePdf("report.pdf");
// Диаграмма
var chart = SimpleChart.Bar(dt, "Position", "Salary", "Зарплаты");
// Расчет
decimal benefit = BizCalc.UnemploymentBenefit(70000, 4);
// Подбор
var matches = Matcher.FindWithScore(vacancies,
new MatchRule("Salary", ">=", 60000, weight: 3));
// Аудит
Audit.Log(db, "Экспорт данных", "admin");
// Планировщик
TaskScheduler.Daily(new TimeOnly(9, 0), () => CheckStaleRecords());
Лицензия
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0-windows7.0 is compatible. net9.0-windows was computed. net10.0-windows was computed. |
-
net8.0-windows7.0
- AppBuilderKit (>= 8.7.0)
- AppSettingsKit (>= 8.6.4)
- AuditKit (>= 8.6.4)
- AuthKit (>= 8.6.4)
- AutoFormsKit (>= 8.6.4)
- CalcKit (>= 8.6.4)
- ConnectKit (>= 8.6.4)
- DashboardKit (>= 8.6.4)
- DataDictKit (>= 8.7.0)
- EFQueryKit (>= 8.6.4)
- ExportKit (>= 8.6.4)
- HelpKit (>= 8.6.4)
- MatcherKit (>= 8.6.4)
- MenuKit (>= 8.6.4)
- MigrationKit (>= 8.6.4)
- NotifyKit (>= 8.6.4)
- PrintKit (>= 8.6.4)
- ReportKit (>= 8.6.4)
- SchedulerKit (>= 8.6.4)
- SearchKit (>= 8.6.4)
- SeedKit (>= 8.6.4)
- SimpleChartKit (>= 8.6.4)
- StatusBarKit (>= 8.6.4)
- TestCaseKit (>= 8.6.4)
- ThemeKit (>= 8.6.4)
- UmlKit (>= 8.6.4)
- ValidationKit (>= 8.6.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.