feat: Реализован полный CRUD для админ-панели и улучшена функциональность

- Portfolio CRUD: добавление, редактирование, удаление, переключение публикации
- Services CRUD: полное управление услугами с возможностью активации/деактивации
- Banner system: новая модель Banner с CRUD операциями и аналитикой кликов
- Telegram integration: расширенные настройки бота, обнаружение чатов, отправка сообщений
- Media management: улучшенная загрузка файлов с оптимизацией изображений и превью
- UI improvements: обновлённые админ-панели с rich-text редактором и drag&drop загрузкой
- Database: добавлена таблица banners с полями для баннеров и аналитики
This commit is contained in:
2025-10-22 20:32:16 +09:00
parent 150891b29d
commit 9477ff6de0
69 changed files with 11451 additions and 2321 deletions

View File

@@ -2,32 +2,29 @@
/**
* Database initialization script for SmartSolTech
* Creates initial admin user and sample data
* Creates initial admin user and sample data for PostgreSQL
*/
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const { sequelize } = require('../config/database');
require('dotenv').config();
// Import models
const User = require('../models/User');
const Service = require('../models/Service');
const Portfolio = require('../models/Portfolio');
const SiteSettings = require('../models/SiteSettings');
const { User, Service, Portfolio, SiteSettings } = require('../models');
// Configuration
const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/smartsoltech';
const ADMIN_EMAIL = process.env.ADMIN_EMAIL || 'admin@smartsoltech.kr';
const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || 'admin123456';
async function initializeDatabase() {
try {
console.log('🔄 Connecting to MongoDB...');
await mongoose.connect(MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
console.log('✅ Connected to MongoDB');
console.log('🔄 Connecting to PostgreSQL...');
await sequelize.authenticate();
console.log('✅ Connected to PostgreSQL');
// Sync database (create tables)
console.log('🔄 Syncing database schema...');
await sequelize.sync({ force: false });
console.log('✅ Database schema synchronized');
// Create admin user
await createAdminUser();
@@ -50,7 +47,7 @@ async function initializeDatabase() {
console.error('❌ Database initialization failed:', error);
process.exit(1);
} finally {
await mongoose.connection.close();
await sequelize.close();
console.log('🔌 Database connection closed');
process.exit(0);
}
@@ -58,14 +55,16 @@ async function initializeDatabase() {
async function createAdminUser() {
try {
const existingAdmin = await User.findOne({ email: ADMIN_EMAIL });
const existingAdmin = await User.findOne({
where: { email: ADMIN_EMAIL }
});
if (existingAdmin) {
console.log('👤 Admin user already exists, skipping...');
return;
}
const adminUser = new User({
const adminUser = await User.create({
name: 'Administrator',
email: ADMIN_EMAIL,
password: ADMIN_PASSWORD,
@@ -73,7 +72,6 @@ async function createAdminUser() {
isActive: true
});
await adminUser.save();
console.log('✅ Admin user created successfully');
} catch (error) {
console.error('❌ Error creating admin user:', error);
@@ -83,7 +81,7 @@ async function createAdminUser() {
async function createSampleServices() {
try {
const existingServices = await Service.countDocuments();
const existingServices = await Service.count();
if (existingServices > 0) {
console.log('🛠️ Services already exist, skipping...');
@@ -243,7 +241,7 @@ async function createSampleServices() {
}
];
await Service.insertMany(services);
await Service.bulkCreate(services);
console.log('✅ Sample services created successfully');
} catch (error) {
console.error('❌ Error creating sample services:', error);
@@ -253,7 +251,7 @@ async function createSampleServices() {
async function createSamplePortfolio() {
try {
const existingPortfolio = await Portfolio.countDocuments();
const existingPortfolio = await Portfolio.count();
if (existingPortfolio > 0) {
console.log('🎨 Portfolio items already exist, skipping...');
@@ -416,7 +414,7 @@ async function createSamplePortfolio() {
}
];
await Portfolio.insertMany(portfolioItems);
await Portfolio.bulkCreate(portfolioItems);
console.log('✅ Sample portfolio items created successfully');
} catch (error) {
console.error('❌ Error creating sample portfolio:', error);
@@ -433,7 +431,7 @@ async function createSiteSettings() {
return;
}
const settings = new SiteSettings({
const settings = await SiteSettings.create({
siteName: 'SmartSolTech',
siteDescription: '혁신적인 기술 솔루션으로 비즈니스의 성장을 지원합니다',
logo: '/images/logo.png',
@@ -476,7 +474,6 @@ async function createSiteSettings() {
}
});
await settings.save();
console.log('✅ Site settings created successfully');
} catch (error) {
console.error('❌ Error creating site settings:', error);