Version 1.2.13: Korrektur der SQL-Abfrage für die allgemeine Suche

This commit is contained in:
2025-03-20 11:55:07 +01:00
parent 5d56c7128e
commit 3bf888e8b1
3 changed files with 57 additions and 151 deletions

View File

@@ -5,6 +5,11 @@ Alle wichtigen Änderungen an diesem Projekt werden in dieser Datei dokumentiert
Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.0.0/),
und dieses Projekt adhäriert zu [Semantic Versioning](https://semver.org/lang/de/).
## [1.2.13] - 2024-03-20
### Fixed
- Korrektur der Parameteranzahl in der SQL-Abfrage für die allgemeine Suche
- Behebung des Fehlers bei der Suche in allen Datenbankfeldern
## [v1.2.12] - 2024-03-19
### Geändert
- Performance-Optimierung der Suchfunktion durch Reduzierung der Suchfelder

View File

@@ -1,4 +1,4 @@
# medisoftware Kundensuche
# Medi-Customers
Eine moderne Webanwendung zur Suche und Verwaltung von Kundendaten, die MEDISOFT und MEDICONSULT Daten kombiniert.
@@ -14,7 +14,7 @@ Eine moderne Webanwendung zur Suche und Verwaltung von Kundendaten, die MEDISOFT
## Version
Aktuelle Version: v1.2.12
Aktuelle Version: 1.2.13
## Installation

199
app.py
View File

@@ -18,7 +18,7 @@ logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Version der Anwendung
VERSION = "1.2.12"
VERSION = "1.2.13"
# Pfad zur Datenbank
DB_FILE = 'data/customers.db'
@@ -174,133 +174,16 @@ def import_csv():
if conn:
conn.close()
def search_customers():
try:
if request.method == 'POST':
data = request.get_json()
query = data.get('query', '')
tag = data.get('tag', 'medisoft')
else:
query = request.args.get('q', '')
name = request.args.get('name', '')
ort = request.args.get('ort', '')
nummer = request.args.get('nummer', '')
plz = request.args.get('plz', '')
fachrichtung = request.args.get('fachrichtung', '')
operator = request.args.get('operator', 'or')
tag = request.args.get('tag', 'medisoft')
conn = get_db_connection()
c = conn.cursor()
# Baue die SQL-Abfrage
query = '''
SELECT
nummer,
name,
strasse,
plz,
ort,
telefon,
mobil,
email,
fachrichtung,
tag,
handy,
tele_firma,
kontakt1,
kontakt2,
kontakt3
FROM customers
WHERE 1=1
'''
params = []
# Füge die Suchbedingungen hinzu
if query:
# Optimierte Suche mit FTS (Full Text Search)
query += """
AND (
name LIKE ? OR
nummer LIKE ? OR
fachrichtung LIKE ?
)
"""
search_term = f"%{query}%"
params.extend([search_term, search_term, search_term])
if name:
query += " AND name LIKE ?"
params.append(f"%{name}%")
if ort:
query += " AND ort LIKE ?"
params.append(f"%{ort}%")
if nummer:
query += " AND nummer LIKE ?"
params.append(f"%{nummer}%")
if plz:
query += " AND plz LIKE ?"
params.append(f"%{plz}%")
if fachrichtung:
query += " AND fachrichtung LIKE ?"
params.append(f"%{fachrichtung}%")
# Filter nach Tag
if tag != 'all':
query += " AND tag = ?"
params.append(tag)
# Füge LIMIT hinzu und optimiere die Sortierung
query += " ORDER BY name LIMIT 100"
# Führe die Abfrage aus
cursor = conn.cursor()
cursor.execute(query, params)
results = cursor.fetchall()
formatted_results = []
for row in results:
customer = {
'nummer': row[0],
'name': row[1],
'strasse': row[2],
'plz': row[3],
'ort': row[4],
'telefon': row[5],
'mobil': row[6],
'email': row[7],
'fachrichtung': row[8],
'tag': row[9],
'handy': row[10],
'tele_firma': row[11],
'kontakt1': row[12],
'kontakt2': row[13],
'kontakt3': row[14]
}
formatted_results.append(customer)
conn.close()
return jsonify(formatted_results)
except Exception as e:
print(f"Fehler bei der Suche: {str(e)}")
return jsonify({'error': str(e)}), 500
def clean_dataframe(df):
"""Konvertiert NaN-Werte in None für JSON-Kompatibilität"""
return df.replace({np.nan: None})
@app.route('/login', methods=['GET', 'POST'])
def login():
# Überprüfe, ob die Client-IP in einem der erlaubten Bereiche liegt
client_ip = request.headers.get('X-Forwarded-For', request.remote_addr)
# Überprüfe, ob die Client-IP in einem der erlaubten Bereiche liegt
# Überprüfe, ob die Client-IP in einem der erlaubten Bereichen liegt
is_allowed = any(isIPInSubnet(client_ip, range.strip()) for range in ALLOWED_IP_RANGES if range.strip())
if is_allowed:
@@ -339,17 +222,24 @@ def search():
return jsonify({'error': 'Nicht eingeloggt'}), 401
try:
# Hole die Suchparameter
q = request.args.get('q', '').strip()
name = request.args.get('name', '').strip()
ort = request.args.get('ort', '').strip()
nummer = request.args.get('nummer', '').strip()
plz = request.args.get('plz', '').strip()
fachrichtung = request.args.get('fachrichtung', '').strip()
selected_tag = request.args.get('tag', 'medisoft')
if request.method == 'POST':
data = request.get_json()
search_query = data.get('query', '')
tag = data.get('tag', 'medisoft')
else:
search_query = request.args.get('q', '')
name = request.args.get('name', '')
ort = request.args.get('ort', '')
nummer = request.args.get('nummer', '')
plz = request.args.get('plz', '')
fachrichtung = request.args.get('fachrichtung', '')
tag = request.args.get('tag', 'medisoft')
conn = get_db_connection()
c = conn.cursor()
# Baue die SQL-Abfrage
query = '''
sql_query = '''
SELECT
nummer,
name,
@@ -372,54 +262,65 @@ def search():
params = []
# Füge die Suchbedingungen hinzu
if q:
if search_query:
# Optimierte Suche mit FTS (Full Text Search)
query += """
sql_query += """
AND (
name LIKE ? OR
nummer LIKE ? OR
fachrichtung LIKE ?
fachrichtung LIKE ? OR
ort LIKE ? OR
plz LIKE ? OR
strasse LIKE ? OR
telefon LIKE ? OR
mobil LIKE ? OR
email LIKE ? OR
bemerkung LIKE ? OR
tag LIKE ? OR
handy LIKE ? OR
tele_firma LIKE ? OR
kontakt1 LIKE ? OR
kontakt2 LIKE ? OR
kontakt3 LIKE ?
)
"""
search_term = f"%{q}%"
params.extend([search_term, search_term, search_term])
search_term = f"%{search_query}%"
params.extend([search_term] * 16) # 16 Felder für die allgemeine Suche
if name:
query += " AND name LIKE ?"
sql_query += " AND name LIKE ?"
params.append(f"%{name}%")
if ort:
query += " AND ort LIKE ?"
sql_query += " AND ort LIKE ?"
params.append(f"%{ort}%")
if nummer:
query += " AND nummer LIKE ?"
sql_query += " AND nummer LIKE ?"
params.append(f"%{nummer}%")
if plz:
query += " AND plz LIKE ?"
sql_query += " AND plz LIKE ?"
params.append(f"%{plz}%")
if fachrichtung:
query += " AND fachrichtung LIKE ?"
sql_query += " AND fachrichtung LIKE ?"
params.append(f"%{fachrichtung}%")
# Filter nach Tag
if selected_tag != 'all':
query += " AND tag = ?"
params.append(selected_tag)
if tag != 'all':
sql_query += " AND tag = ?"
params.append(tag)
# Füge LIMIT hinzu und optimiere die Sortierung
query += " ORDER BY name LIMIT 100"
sql_query += " ORDER BY name LIMIT 100"
# Führe die Abfrage aus
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute(query, params)
cursor.execute(sql_query, params)
results = cursor.fetchall()
# Formatiere die Ergebnisse
customers = []
formatted_results = []
for row in results:
customer = {
'nummer': row[0],
@@ -438,10 +339,10 @@ def search():
'kontakt2': row[13],
'kontakt3': row[14]
}
customers.append(customer)
formatted_results.append(customer)
conn.close()
return jsonify(customers)
return jsonify(formatted_results)
except Exception as e:
logger.error(f"Fehler bei der Suche: {str(e)}")