Add complete CKE Project implementation with news management system

This commit is contained in:
albivkt
2025-07-13 01:34:11 +03:00
parent c9317555ca
commit a84810c6b9
32 changed files with 8901 additions and 811 deletions

153
scripts/init-database.ts Normal file
View File

@ -0,0 +1,153 @@
import { PrismaClient } from '@prisma/client';
import { hashPassword } from '../lib/auth';
import { NEWS_DATA } from '../lib/news-data';
const prisma = new PrismaClient();
async function main() {
console.log('🚀 Initializing database...');
try {
// Создаем категории по умолчанию
console.log('📂 Creating default categories...');
const categories = [
{
name: 'Новости компании',
slug: 'company',
color: '#3B82F6',
description: 'Корпоративные новости и объявления'
},
{
name: 'Акции',
slug: 'promotions',
color: '#10B981',
description: 'Специальные предложения и акции'
},
{
name: 'Другое',
slug: 'other',
color: '#8B5CF6',
description: 'Прочие новости и события'
}
];
for (const category of categories) {
await prisma.category.upsert({
where: { slug: category.slug },
update: category,
create: category
});
console.log(`✅ Category "${category.name}" created/updated`);
}
// Создаем администратора по умолчанию
console.log('👤 Creating default admin user...');
const adminPassword = await hashPassword('admin123');
await prisma.user.upsert({
where: { email: 'admin@ckeproekt.ru' },
update: {},
create: {
email: 'admin@ckeproekt.ru',
username: 'admin',
password: adminPassword,
role: 'ADMIN',
name: 'Администратор'
}
});
console.log('✅ Admin user created/updated');
// Создаем редактора по умолчанию
console.log('👤 Creating default editor user...');
const editorPassword = await hashPassword('editor123');
const editor = await prisma.user.upsert({
where: { email: 'editor@ckeproekt.ru' },
update: {},
create: {
email: 'editor@ckeproekt.ru',
username: 'editor',
password: editorPassword,
role: 'EDITOR',
name: 'Редактор'
}
});
console.log('✅ Editor user created/updated');
// Мигрируем существующие новости
console.log('📰 Migrating existing news...');
for (const newsItem of NEWS_DATA) {
try {
await prisma.news.upsert({
where: { slug: newsItem.slug },
update: {
title: newsItem.title,
summary: newsItem.summary,
content: newsItem.content,
category: newsItem.category,
imageUrl: newsItem.imageUrl,
featured: newsItem.featured || false,
published: newsItem.published !== false,
publishedAt: new Date(newsItem.publishedAt),
tags: []
},
create: {
title: newsItem.title,
slug: newsItem.slug,
summary: newsItem.summary,
content: newsItem.content,
category: newsItem.category,
imageUrl: newsItem.imageUrl,
featured: newsItem.featured || false,
published: newsItem.published !== false,
publishedAt: new Date(newsItem.publishedAt),
authorId: editor.id,
tags: []
}
});
console.log(`✅ News "${newsItem.title}" migrated`);
} catch (error) {
console.error(`❌ Error migrating news "${newsItem.title}":`, error);
}
}
// Получаем статистику
console.log('📊 Database statistics:');
const stats = await Promise.all([
prisma.user.count(),
prisma.category.count(),
prisma.news.count(),
prisma.news.count({ where: { published: true } }),
prisma.news.count({ where: { featured: true } })
]);
console.log(`👥 Users: ${stats[0]}`);
console.log(`📂 Categories: ${stats[1]}`);
console.log(`📰 Total news: ${stats[2]}`);
console.log(`📢 Published news: ${stats[3]}`);
console.log(`⭐ Featured news: ${stats[4]}`);
console.log('✅ Database initialization completed successfully!');
} catch (error) {
console.error('❌ Database initialization failed:', error);
process.exit(1);
}
}
main()
.catch((e) => {
console.error('❌ Unexpected error:', e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});

193
scripts/seed.ts Normal file
View File

@ -0,0 +1,193 @@
import { PrismaClient } from '@prisma/client';
import bcrypt from 'bcryptjs';
const prisma = new PrismaClient();
async function main() {
console.log('🌱 Seeding database...');
// Создаем пользователей
const adminPassword = await bcrypt.hash('admin123', 10);
const editorPassword = await bcrypt.hash('editor123', 10);
const admin = await prisma.user.upsert({
where: { email: 'admin@ckeproekt.ru' },
update: {},
create: {
email: 'admin@ckeproekt.ru',
username: 'admin',
password: adminPassword,
role: 'ADMIN',
name: 'Администратор',
},
});
const editor = await prisma.user.upsert({
where: { email: 'editor@ckeproekt.ru' },
update: {},
create: {
email: 'editor@ckeproekt.ru',
username: 'editor',
password: editorPassword,
role: 'EDITOR',
name: 'Редактор',
},
});
// Создаем категории
const categories = [
{ name: 'Строительная экспертиза', slug: 'construction-expertise', color: '#3B82F6' },
{ name: 'Экспертиза залива', slug: 'flood-expertise', color: '#EF4444' },
{ name: 'Тепловизионная экспертиза', slug: 'thermal-expertise', color: '#F59E0B' },
{ name: 'Обследование канализации', slug: 'sewerage-inspection', color: '#10B981' },
{ name: 'Общие новости', slug: 'general-news', color: '#8B5CF6' },
];
for (const category of categories) {
await prisma.category.upsert({
where: { slug: category.slug },
update: {},
create: category,
});
}
// Создаем тестовые новости
const newsData = [
{
title: 'Новые стандарты строительной экспертизы в 2024 году',
slug: 'new-construction-standards-2024',
summary: 'Обзор изменений в нормативах и требованиях к проведению строительно-технической экспертизы.',
content: `
<p>В 2024 году вступили в силу новые стандарты проведения строительно-технической экспертизы, которые значительно повышают требования к качеству и точности исследований.</p>
<h3>Основные изменения:</h3>
<ul>
<li>Усиление требований к квалификации экспертов</li>
<li>Новые методы неразрушающего контроля</li>
<li>Цифровизация процесса документооборота</li>
<li>Обязательное использование современного оборудования</li>
</ul>
<p>Наша компания ЦКЭ Проект полностью соответствует новым требованиям и готова предоставить услуги экспертизы на самом высоком уровне.</p>
`,
category: 'Строительная экспертиза',
imageUrl: '/images/placeholders/services/construction-control.jpg',
featured: true,
authorId: admin.id,
tags: 'стандарты, экспертиза, 2024, нормативы',
},
{
title: 'Как правильно провести экспертизу после залива квартиры',
slug: 'flood-damage-expertise-guide',
summary: 'Пошаговое руководство по проведению экспертизы ущерба от залива и оценке восстановительных работ.',
content: `
<p>Залив квартиры это серьезная проблема, которая требует немедленного и профессионального подхода к оценке ущерба.</p>
<h3>Этапы проведения экспертизы:</h3>
<ol>
<li><strong>Фиксация первоначального состояния</strong> - фотографирование и документирование повреждений</li>
<li><strong>Оценка конструктивных элементов</strong> - проверка состояния стен, полов, потолков</li>
<li><strong>Исследование инженерных систем</strong> - проверка электропроводки, отопления, водоснабжения</li>
<li><strong>Определение объема восстановительных работ</strong> - составление сметы на ремонт</li>
</ol>
<p>Важно помнить, что экспертизу должны проводить только аккредитованные специалисты с соответствующей квалификацией.</p>
`,
category: 'Экспертиза залива',
imageUrl: '/images/placeholders/services/flood-expertise.jpg',
featured: true,
authorId: editor.id,
tags: 'залив, экспертиза, ущерб, восстановление',
},
{
title: 'Тепловизионная диагностика: современные возможности',
slug: 'thermal-imaging-diagnostics',
summary: 'Применение тепловизионного оборудования для выявления скрытых дефектов в строительных конструкциях.',
content: `
<p>Тепловизионная диагностика является одним из наиболее эффективных методов неразрушающего контроля строительных конструкций.</p>
<h3>Преимущества метода:</h3>
<ul>
<li>Выявление скрытых дефектов без разрушения конструкций</li>
<li>Определение мест утечек тепла</li>
<li>Обнаружение проблем в электропроводке</li>
<li>Контроль качества утепления</li>
</ul>
<p>Наши специалисты используют современное тепловизионное оборудование последнего поколения для максимально точной диагностики.</p>
`,
category: 'Тепловизионная экспертиза',
imageUrl: '/images/placeholders/services/thermal-inspection.jpg',
featured: false,
authorId: admin.id,
tags: 'тепловизор, диагностика, дефекты, контроль',
},
{
title: 'Обследование канализационных систем: важность регулярной проверки',
slug: 'sewerage-inspection-importance',
summary: 'Почему важно регулярно проводить обследование канализационных систем и как это влияет на безопасность здания.',
content: `
<p>Канализационная система это одна из важнейших инженерных систем любого здания, требующая регулярного контроля и обслуживания.</p>
<h3>Основные проблемы канализации:</h3>
<ul>
<li>Засоры и отложения</li>
<li>Коррозия труб</li>
<li>Нарушение герметичности соединений</li>
<li>Деформация трубопроводов</li>
</ul>
<p>Своевременное обследование позволяет выявить проблемы на ранней стадии и избежать серьезных аварий.</p>
`,
category: 'Обследование канализации',
imageUrl: '/images/placeholders/services/sewerage-inspection.jpg',
featured: false,
authorId: editor.id,
tags: 'канализация, обследование, трубы, аварии',
},
{
title: 'ЦКЭ Проект расширяет географию услуг',
slug: 'cke-project-expansion',
summary: 'Компания ЦКЭ Проект объявляет о расширении географии предоставления услуг строительно-технической экспертизы.',
content: `
<p>Мы рады сообщить о значительном расширении географии наших услуг. Теперь высококачественная строительно-техническая экспертиза доступна в еще большем количестве регионов.</p>
<h3>Новые направления:</h3>
<ul>
<li>Московская область</li>
<li>Нижегородская область</li>
<li>Республика Татарстан</li>
<li>Самарская область</li>
</ul>
<p>Это стало возможным благодаря увеличению штата квалифицированных экспертов и приобретению дополнительного оборудования.</p>
`,
category: 'Общие новости',
imageUrl: '/images/office.jpg',
featured: false,
authorId: admin.id,
tags: 'расширение, услуги, регионы, экспертиза',
},
];
for (const news of newsData) {
await prisma.news.upsert({
where: { slug: news.slug },
update: {},
create: news,
});
}
console.log('✅ Database seeded successfully!');
console.log('👤 Admin user: admin@ckeproekt.ru / admin123');
console.log('👤 Editor user: editor@ckeproekt.ru / editor123');
}
main()
.catch((e) => {
console.error('❌ Error seeding database:', e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});