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 156078ff3a
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/), 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/). 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 ## [v1.2.12] - 2024-03-19
### Geändert ### Geändert
- Performance-Optimierung der Suchfunktion durch Reduzierung der Suchfelder - 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. 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 ## Version
Aktuelle Version: v1.2.12 Aktuelle Version: 1.2.13
## Installation ## Installation

197
app.py
View File

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