feat: initialize full-stack architecture with backend routes, database schema, and glassmorphic frontend UI

This commit is contained in:
2026-05-13 00:12:19 +03:00
parent bd73f18d5c
commit 0732acbda5
21 changed files with 1937 additions and 307 deletions

65
backend/utils/ai_utils.py Normal file
View File

@@ -0,0 +1,65 @@
import os
import google.generativeai as genai
def generate_complaint_text(platform, violator_article, my_article=None):
"""Генерирует текст претензии с помощью Google Gemini."""
api_key = os.getenv('GEMINI_API_KEY')
if not api_key:
return "Ошибка: API ключ для Gemini не настроен в .env"
genai.configure(api_key=api_key)
model = genai.GenerativeModel('gemini-1.5-flash')
prompt = f"""
Ты - профессиональный юрист в сфере интеллектуальной собственности и e-commerce.
Напиши официальную и убедительную претензию для маркетплейса {platform}.
Суть нарушения: продавец с артикулом {violator_article} незаконно использует мой контент или нарушает правила ценообразования.
Мой оригинальный артикул для сравнения: {my_article if my_article else 'не указан'}.
Требования:
1. Текст должен быть на русском языке.
2. Стиль официально-деловой.
3. Упомяни о необходимости защиты прав правообладателя.
4. Текст должен быть лаконичным (до 500 знаков).
Ответ дай сразу в виде текста претензии, без лишних вступлений.
"""
try:
response = model.generate_content(prompt)
return response.text.strip()
except Exception as e:
return f"Ошибка при генерации текста ИИ: {str(e)}"
def generate_review_reply(review_text, rating):
"""Генерирует ответ на отзыв покупателя."""
api_key = os.getenv('GEMINI_API_KEY')
if not api_key:
return "Ошибка: API ключ не настроен."
genai.configure(api_key=api_key)
model = genai.GenerativeModel('gemini-1.5-flash')
prompt = f"""
Ты - менеджер по работе с клиентами в магазине на маркетплейсе.
Твоя задача: вежливо и профессионально ответить на отзыв покупателя.
Оценка покупателя: {rating} звезд(ы).
Текст отзыва: "{review_text}"
Правила:
1. Если оценка 4-5 звезд: поблагодари за покупку, вырази радость, предложи посмотреть другие товары нашего бренда.
2. Если оценка 1-3 звезды: извинись за неудобства, уточни, что мы работаем над качеством, и предложи обратиться в поддержку, если это уместно.
3. Стиль: дружелюбный, но деловой. Не используй слишком много восклицательных знаков.
4. Длина: 2-4 предложения.
5. Не используй шаблоны "Уважаемый покупатель", начни более естественно.
Ответ дай сразу в виде готового текста.
"""
try:
response = model.generate_content(prompt)
return response.text.strip()
except Exception as e:
return f"Ошибка ИИ: {str(e)}"

View File

@@ -0,0 +1,17 @@
import json
from ..db import get_db_connection, release_db_connection
def log_action(user_id, action, details=None):
"""Записывает действие пользователя в лог аудита."""
conn = get_db_connection()
try:
cur = conn.cursor()
cur.execute(
"INSERT INTO audit_log (user_id, action, details) VALUES (%s, %s, %s)",
(user_id, action, json.dumps(details) if details else None)
)
conn.commit()
except Exception as e:
print(f"Audit Log Error: {e}")
finally:
release_db_connection(conn)

View File

@@ -0,0 +1,20 @@
from PIL import Image
import imagehash
import os
def calculate_image_hash(image_path):
"""Вычисляет перцептивный хеш изображения."""
try:
img = Image.open(image_path)
hash_val = imagehash.phash(img)
return str(hash_val)
except Exception as e:
print(f"Hashing Error: {e}")
return None
def compare_hashes(hash1, hash2, threshold=5):
"""Сравнивает два хеша. Если разница меньше порога, изображения считаются похожими."""
h1 = imagehash.hex_to_hash(hash1)
h2 = imagehash.hex_to_hash(hash2)
diff = h1 - h2
return diff <= threshold

View File

@@ -0,0 +1,24 @@
import requests
import os
def send_telegram_notification(message):
token = os.getenv('TELEGRAM_BOT_TOKEN')
chat_id = os.getenv('TELEGRAM_CHAT_ID')
if not token or not chat_id:
print("Telegram notification skipped: Token or Chat ID not configured.")
return False
url = f"https://api.telegram.org/bot{token}/sendMessage"
payload = {
"chat_id": chat_id,
"text": message,
"parse_mode": "HTML"
}
try:
response = requests.post(url, json=payload, timeout=5)
return response.status_code == 200
except Exception as e:
print(f"Error sending Telegram message: {e}")
return False