from datetime import time, datetime
from flask import Flask, request, jsonify, session, render_template, redirect, url_for
from perc import all_data_json, merged_df_json, final_json
from bp import blood1
from pe import frontend_data, pedata, disease_data
from hrc import hr_data
import os
from werkzeug.utils import secure_filename
from functools import wraps
from mysql import get_user_from_db, add_activity_to_db, get_all_activities_from_db, delete_activity_from_db
from ids_email import send_mail_soap
from bmi_warning_email import bmi_email
app = Flask(__name__)
app.secret_key = 'your_secret_key_here'
UPLOAD_FOLDER = 'static/uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if 'user' not in session:
session['login_required'] = True # 设置标志
return redirect(url_for('home'))
return f(*args, **kwargs)
return decorated_function
def get_current_user():
return session.get('user')
@app.route('/')
def home():
return render_template('index.html')
@app.route('/blood')
@login_required
def blood():
return render_template('blood.html')
@app.route('/bmi')
@login_required
def bmi():
return render_template('bmi.html')
@app.route('/physical')
@login_required
def physical():
return render_template(
'physical.html',
analysis_options=pedata.get("analysis_options", []),
employees_by_analysis=pedata.get("employees_by_analysis", {})
)
@app.route('/clf')
@login_required
def clf():
return render_template('clf.html')
@app.route('/general')
@login_required
def general():
return render_template('general.html')
@app.route('/hpa')
@login_required
def hpa():
return render_template('hpa.html')
@app.route('/perfile')
@login_required
def per():
return render_template('personal_file.html')
@app.route('/send-bmi-warning', methods=['POST'])
def bmi_warning():
try:
data = request.get_json()
if not data:
return jsonify({'success': False, 'message': '请求体为空'}), 400
employees = data.get('employees')
if not employees:
return jsonify({'success': False, 'message': '缺少 employees 数据'}), 400
if not isinstance(employees, list):
return jsonify({'success': False, 'message': 'employees 必须是数组'}), 400
print("\n" + "=" * 60)
print("收到 BMI 健康提醒请求")
print("=" * 60)
results = []
success_count = 0
for emp in employees:
# 发送邮件
mail_result = bmi_email(emp)
# 添加员工信息到结果
mail_result['employee_id'] = emp.get('id', '')
mail_result['name'] = emp.get('name', '未知')
if mail_result.get('success'):
success_count += 1
results.append(mail_result)
print(f"共处理 {len(employees)} 名员工,成功发送 {success_count} 封邮件")
print("=" * 60)
return jsonify({
'success': True,
'sentCount': success_count,
'total': len(employees),
'results': results,
'message': f'成功发送 {success_count} 封邮件(共 {len(employees)} 名员工)'
})
except Exception as e:
print(f"服务器错误: {e}")
return jsonify({
'success': False,
'message': '内部错误',
'error': str(e)
}), 500
# @app.route('/send_email')
# @login_required
# def send():
# return render_template('send_email.html')
@app.route('/data/first', methods=['GET'])
def all_data():
return all_data_json
@app.route('/data/second', methods=['GET'])
def second_data():
return frontend_data
@app.route('/data/blood1', methods=['GET'])
def blood1_data():
return blood1
@app.route('/data/pedata', methods=['GET'])
def pe_data():
return pedata
@app.route('/data/risk', methods=['GET'])
def risk_data():
return merged_df_json
@app.route('/data/risk_dept', methods=['GET'])
def risk_dept():
return final_json
@app.route('/data/hrdata', methods=['GET'])
def hrdata():
return hr_data
@app.route('/data/diseasedata', methods=['GET'])
def disease():
return disease_data
# activities = [
# {
# 'title': '健康讲座',
# 'description': '健康讲座',
# 'date': '2025-07-29T14:30',
# 'tags': ['讲座'],
# 'image': ''
# },
# {
# 'title': '社区义诊',
# 'description': '社区义诊',
# 'date': '2025-08-06T10:00',
# 'tags': ['义诊'],
# 'image': ''
# },
# {
# 'title': '免费体检',
# 'description': '免费体检',
# 'date': '2025-08-06T09:00',
# 'tags': ['其他相关'],
# 'image': ''
# },
# {
# 'title': '健康饮食讲座',
# 'description': '健康饮食讲座',
# 'date': '2025-09-06T09:00',
# 'tags': ['讲座'],
# 'image': ''
# },
# {
# 'title': '图片',
# 'description': '健康饮食讲座',
# 'date': '2025-09-11T09:00',
# 'tags': ['讲座'],
# 'image': 'static/uploads/2025-09-10_164723.png'
# }
# ]
@app.route('/add_activity', methods=['POST'])
def add_activity():
try:
title = request.form.get('title', '').strip()
description = request.form.get('description', '').strip()
date = request.form.get('date', '').strip()
tags = request.form.getlist('tags')
if not title or not date:
return jsonify({'error': '缺少必要字段'}), 400
# 处理多图上传
image_urls = []
files = request.files.getlist('image')
for file in files:
if file and allowed_file(file.filename):
filename = secure_filename(f"{int(time.time())}_{file.filename}")
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
image_url = '/' + filepath.replace('\\', '/')
image_urls.append(image_url)
# 写入数据库
new_id = add_activity_to_db(title, description, date, tags, image_urls)
if not new_id:
return jsonify({'error': '保存到数据库失败'}), 500
# 返回响应数据
response_data = {
'id': new_id,
'title': title,
'description': description,
'date': date,
'tags': tags,
'images': image_urls
}
return jsonify(response_data), 201
except Exception as e:
print(f"Error in /add_activity: {e}")
return jsonify({'error': str(e)}), 500
@app.route('/get_activities', methods=['GET'])
def get_activities():
try:
activities = get_all_activities_from_db()
row['date'] = row['date'].isoformat()
return jsonify(activities)
except Exception as e:
print(f"Error in /get_activities: {e}")
return jsonify({'error': str(e)}), 500
@app.route('/delete_activity/<int:activity_id>', methods=['DELETE'])
def delete_activity(activity_id):
user = get_current_user()
if not user or user['role'] != 'admin' or user['dept'] != 'all':
return jsonify({'success': False, 'message': '权限不足'}), 403
try:
result = delete_activity_from_db(activity_id)
if not result['success']:
return jsonify(result), 404
# 删除本地图片文件
for img_path in result.get('image_paths', []):
real_path = '.' + img_path # 转为相对路径
if os.path.exists(real_path):
try:
os.remove(real_path)
except Exception as e:
print(f"无法删除图片文件 {real_path}: {e}")
return jsonify({'success': True, 'message': '删除成功'})
except Exception as e:
print(f"删除失败: {e}")
return jsonify({'success': False, 'message': '服务器错误'}), 500
# users = [
# {"id": 'all', "username": "admin", "password": "123456", "role": "admin", "dept": "all"},
# {"id": '22527715', "username": "user1", "password": "123456", "role": "admin", "dept": "HR"},
# {"id": 3, "username": "user2", "password": "123456", "role": "admin", "dept": "S17"},
# {"id": 4, "username": "user3", "password": "123456", "role": "user", "dept": "S17"},
# {"id": "22527715", "username": "user4", "password": "123456", "role": "user", "dept": "HR"},
# ]
# 登录接口
@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
username = data.get('username')
password = data.get('password')
if not username or not password:
return jsonify({"success": False, "message": "用户名或密码不能为空"}), 400
# 从数据库查询用户
user = get_user_from_db(username, password)
if user:
session['user'] = {
'id': user['num_id'],
'username': user['username'],
'role': user['role'],
'dept': user['dept']
}
return jsonify({"success": True, "message": "登录成功"})
else:
return jsonify({"success": False, "message": "用户名或密码错误"}), 401
@app.route('/user')
def get_user():
if 'user' in session:
user = session['user']
return jsonify({
'user': {
'id': user.get('id'),
'username': user.get('username'),
'role': user.get('role', 'user'),
'dept': user.get('dept', 'all')
},
'is_authenticated': True
})
else:
show_login_toast = session.pop('login_required', False)
return jsonify({
'user': None,
'is_authenticated': False,
'show_login_toast': show_login_toast
})
@app.route('/logout', methods=['POST'])
def logout():
session.pop('user', None)
return jsonify({"success": True, "message": "退出成功"})
@app.route('/send_email', methods=['POST'])
def handle_send_email():
"""接收前端请求并调用邮件函数"""
try:
data = request.get_json()
print(data)
sjr = data.get('sjr', '').strip()
csr = data.get('csr', '').strip()
tbbt = data.get('tbbt', '').strip()
tbnr = data.get('tbnr', '').strip()
fjr = data.get('fjr', 'IDS').strip()
if not sjr or not tbbt or not tbnr:
return jsonify({"success": False, "message": "缺少必要参数"}), 400
result = send_mail_soap(sjr=sjr, csr=csr, tbbt=tbbt, tbnr=tbnr, fjr=fjr)
return jsonify(result)
except Exception as e:
return jsonify({"success": False, "message": f"服务器错误: {str(e)}"}), 500
if __name__ == '__main__':
app.run(debug=True)