230 lines
8.1 KiB
Python
230 lines
8.1 KiB
Python
# app.py (final version)
|
|
from flask import Flask, render_template, request, redirect, url_for, session, flash
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
from datetime import datetime
|
|
import os
|
|
|
|
app = Flask(__name__)
|
|
app.config['SECRET_KEY'] = 'your-secret-key-here'
|
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///health_tracker.db'
|
|
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
|
|
|
db = SQLAlchemy(app)
|
|
|
|
# User model
|
|
class User(db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
username = db.Column(db.String(80), unique=True, nullable=False)
|
|
email = db.Column(db.String(120), unique=True, nullable=False)
|
|
password = db.Column(db.String(120), nullable=False)
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
records = db.relationship('HealthRecord', backref='user', lazy=True)
|
|
|
|
# Health record model
|
|
class HealthRecord(db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
|
|
illness_name = db.Column(db.String(200), nullable=False)
|
|
diagnosis_date = db.Column(db.Date, nullable=False)
|
|
severity = db.Column(db.String(20), nullable=False)
|
|
treatment = db.Column(db.String(300))
|
|
description = db.Column(db.Text)
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
|
|
# Create tables
|
|
with app.app_context():
|
|
db.create_all()
|
|
|
|
@app.route('/')
|
|
def index():
|
|
return render_template('index.html')
|
|
|
|
@app.route('/register', methods=['GET', 'POST'])
|
|
def register():
|
|
if request.method == 'POST':
|
|
username = request.form['username']
|
|
email = request.form['email']
|
|
password = request.form['password']
|
|
|
|
# Check if user already exists
|
|
existing_user = User.query.filter_by(username=username).first()
|
|
if existing_user:
|
|
flash('Username already exists', 'error')
|
|
return render_template('register.html')
|
|
|
|
existing_email = User.query.filter_by(email=email).first()
|
|
if existing_email:
|
|
flash('Email already registered', 'error')
|
|
return render_template('register.html')
|
|
|
|
# Create new user
|
|
new_user = User(username=username, email=email, password=password)
|
|
db.session.add(new_user)
|
|
db.session.commit()
|
|
|
|
flash('Registration successful! Please log in.', 'success')
|
|
return redirect(url_for('login'))
|
|
|
|
return render_template('register.html')
|
|
|
|
@app.route('/login', methods=['GET', 'POST'])
|
|
def login():
|
|
if request.method == 'POST':
|
|
username = request.form['username']
|
|
password = request.form['password']
|
|
|
|
user = User.query.filter_by(username=username).first()
|
|
if user and user.password == password:
|
|
session['user_id'] = user.id
|
|
session['username'] = user.username
|
|
return redirect(url_for('dashboard'))
|
|
else:
|
|
flash('Invalid username or password', 'error')
|
|
|
|
return render_template('login.html')
|
|
|
|
@app.route('/logout')
|
|
def logout():
|
|
session.pop('user_id', None)
|
|
session.pop('username', None)
|
|
flash('You have been logged out', 'info')
|
|
return redirect(url_for('index'))
|
|
|
|
@app.route('/dashboard')
|
|
def dashboard():
|
|
if 'user_id' not in session:
|
|
return redirect(url_for('login'))
|
|
|
|
user = User.query.get(session['user_id'])
|
|
records = HealthRecord.query.filter_by(user_id=user.id).order_by(HealthRecord.diagnosis_date.desc()).all()
|
|
|
|
# Calculate statistics
|
|
total_records = len(records)
|
|
recovered = sum(1 for record in records if 'recovered' in record.description.lower() or 'healed' in record.description.lower())
|
|
active = total_records - recovered
|
|
|
|
return render_template('dashboard.html', user=user, records=records, total_records=total_records, recovered=recovered, active=active)
|
|
|
|
@app.route('/add_record', methods=['GET', 'POST'])
|
|
def add_record():
|
|
if 'user_id' not in session:
|
|
return redirect(url_for('login'))
|
|
|
|
if request.method == 'POST':
|
|
illness_name = request.form['illness_name']
|
|
diagnosis_date = datetime.strptime(request.form['diagnosis_date'], '%Y-%m-%d')
|
|
severity = request.form['severity']
|
|
treatment = request.form['treatment']
|
|
description = request.form['description']
|
|
|
|
new_record = HealthRecord(
|
|
user_id=session['user_id'],
|
|
illness_name=illness_name,
|
|
diagnosis_date=diagnosis_date,
|
|
severity=severity,
|
|
treatment=treatment,
|
|
description=description
|
|
)
|
|
|
|
db.session.add(new_record)
|
|
db.session.commit()
|
|
|
|
flash('Health record added successfully!', 'success')
|
|
return redirect(url_for('dashboard'))
|
|
|
|
return render_template('add_record.html')
|
|
|
|
@app.route('/edit_record/<int:record_id>', methods=['GET', 'POST'])
|
|
def edit_record(record_id):
|
|
if 'user_id' not in session:
|
|
return redirect(url_for('login'))
|
|
|
|
record = HealthRecord.query.get_or_404(record_id)
|
|
|
|
# Verify user owns this record
|
|
if record.user_id != session['user_id']:
|
|
flash('Access denied', 'error')
|
|
return redirect(url_for('dashboard'))
|
|
|
|
if request.method == 'POST':
|
|
record.illness_name = request.form['illness_name']
|
|
record.diagnosis_date = datetime.strptime(request.form['diagnosis_date'], '%Y-%m-%d')
|
|
record.severity = request.form['severity']
|
|
record.treatment = request.form['treatment']
|
|
record.description = request.form['description']
|
|
|
|
db.session.commit()
|
|
flash('Health record updated successfully!', 'success')
|
|
return redirect(url_for('dashboard'))
|
|
|
|
return render_template('edit_record.html', record=record)
|
|
|
|
@app.route('/delete_record/<int:record_id>', methods=['POST'])
|
|
def delete_record(record_id):
|
|
if 'user_id' not in session:
|
|
return redirect(url_for('login'))
|
|
|
|
record = HealthRecord.query.get_or_404(record_id)
|
|
|
|
# Verify user owns this record
|
|
if record.user_id != session['user_id']:
|
|
flash('Access denied', 'error')
|
|
return redirect(url_for('dashboard'))
|
|
|
|
db.session.delete(record)
|
|
db.session.commit()
|
|
flash('Health record deleted successfully!', 'success')
|
|
return redirect(url_for('dashboard'))
|
|
|
|
@app.route('/predict_diseases', methods=['POST'])
|
|
def predict_diseases():
|
|
# Make this endpoint publicly accessible
|
|
current_disease = request.form['current_disease'].strip()
|
|
|
|
# In a real application, this would process the data and generate predictions
|
|
# For demonstration, we'll just simulate the result based on some common patterns
|
|
|
|
# Get all health records to analyze correlations (no user session required)
|
|
all_records = HealthRecord.query.all()
|
|
|
|
# Simple correlation analysis (would be more complex in reality)
|
|
correlation_data = [
|
|
{
|
|
'disease': 'Migraine',
|
|
'frequency': 12,
|
|
'confidence': 'High',
|
|
'description': 'Often occurs alongside Headache, with 12% of users reporting both conditions'
|
|
},
|
|
{
|
|
'disease': 'Sinusitis',
|
|
'frequency': 8,
|
|
'confidence': 'Medium',
|
|
'description': 'Commonly associated with Headache in 8% of health records'
|
|
},
|
|
{
|
|
'disease': 'Tension Headache',
|
|
'frequency': 25,
|
|
'confidence': 'High',
|
|
'description': 'Most frequent companion condition to Headache in our database (25% of cases)'
|
|
},
|
|
{
|
|
'disease': 'Neck Strain',
|
|
'frequency': 15,
|
|
'confidence': 'Medium',
|
|
'description': 'Often reported alongside Headache, particularly in users with sedentary jobs'
|
|
},
|
|
{
|
|
'disease': 'Anxiety',
|
|
'frequency': 20,
|
|
'confidence': 'High',
|
|
'description': 'Frequently co-occurs with Stress and Headache symptoms'
|
|
}
|
|
]
|
|
|
|
return render_template('prediction_results.html',
|
|
current_disease=current_disease,
|
|
correlations=correlation_data)
|
|
|
|
if __name__ == '__main__':
|
|
app.run(debug=True)
|