feat: initialize full-stack architecture with backend routes, database schema, and glassmorphic frontend UI
This commit is contained in:
65
backend/utils/ai_utils.py
Normal file
65
backend/utils/ai_utils.py
Normal 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)}"
|
||||
17
backend/utils/audit_utils.py
Normal file
17
backend/utils/audit_utils.py
Normal 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)
|
||||
20
backend/utils/image_utils.py
Normal file
20
backend/utils/image_utils.py
Normal 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
|
||||
24
backend/utils/telegram_utils.py
Normal file
24
backend/utils/telegram_utils.py
Normal 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
|
||||
Reference in New Issue
Block a user