212-基于Python的老人健康管理系统
基于 Python 的老人健康管理系统:从技术选型到功能落地的完整实践
一款面向老年人健康管理场景的 Flask 全栈项目,聚焦用户多角色协作、健康报告、数据可视化与基础运营能力,适合作为课程设计/毕业设计/业务快速原型。
目录
- 项目背景与亮点
- 系统功能清单(基于实际实现)
- 项目目录结构
- 技术栈与依赖说明
- 本地快速启动
- 数据库初始化与迁移
- 关键模块与核心代码
- 可视化展示(预留位)
- 常见问题(FAQ)
- 结语与联系我
项目背景与亮点
- 面向“老人-家属-医生-管理员”多角色协作的健康管理系统。
- 基于 Flask + SQLAlchemy 快速构建,MySQL 持久化,前端以模板+静态资源为主。
- 内置登录/注册、角色鉴权、健康报告、药品/药品类型管理、轮播与公告等。
- 前端集成多种图表库(ECharts/Chart.js/ApexCharts/C3/Flot/Morris)便于扩展可视化。
系统功能清单(基于实际实现)
- 用户注册与登录
- 新用户注册(管理员/医生/老人/家属),校验用户名/手机号唯一性
- 账号登录(用户名+密码+角色校验,状态校验)
- 安全退出(会话清理)
- 登录后修改密码(验证原密码)
- 首页与导航
- 系统总览(用户/老人/医生/家属统计)
- 轮播图展示、公告列表、医生信息展示
- 角色化侧边导航
- 角色与数据管理
- 管理员:老人/家属/医生数据管理,公告、轮播、健康报告、药品/药品类型维护,绑定关系管理
- 医生:管理名下老人、健康报告、药品/药品类型
- 老人:查看绑定的医生/家属、药品与健康报告
- 家属:查看绑定老人、健康报告与用药信息
- 健康报告与可视化
- 健康报告录入/查看
- 首页与模块页具备基础统计图表(ECharts等)
注:本项目聚焦“老人健康管理”,不包含诗词/AI写诗等无关功能。
项目目录结构
health/app.pyblueprints/admin.pydoctor.pyelder.pyfamily.pyconfig.pydependency.txtdesign_212_health.sqlmodels.pytemplates/base.htmlindex.htmllogin.htmlregister.htmllogout.htmlchange_password.htmladmin/ ...(公告/轮播/老人/家属/医生/报告/药品 等)doctor/ ...(名下老人、报告、药品 等)elder/ ...(绑定/报告/药品)family/ ...(绑定老人、报告、药品)static/js/(ECharts、Chart.js、ApexCharts、C3、Flot、Morris 等)css/ images/ uploads/ assets/ dist/ ...
项目演示
212-基于Python的老人健康管理系统
技术栈与依赖说明
- 后端
- Flask(Web 框架)
- Flask-SQLAlchemy(ORM)
- Flask-Migrate(迁移)
- Flask-WTF(表单)
- flask_cors(跨域)
- PyMySQL(MySQL 驱动)
- werkzeug.security(密码哈希)
- 数据库
- MySQL(
mysql+pymysql
)
- MySQL(
- 前端
- Jinja2 模板
- jQuery / Bootstrap
- 图表库:ECharts、Chart.js、ApexCharts、C3.js、Flot、Morris.js
- 数据分析库
- pandas 在依赖中声明,但当前代码库未直接 import/使用
- numpy 未使用
依赖文件(节选):
pip install flask==3.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install flask-migrate==4.0.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install flask-sqlalchemy==3.0.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install flask-wtf==1.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pandas==1.1.5 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql==1.0.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
本地快速启动
- 克隆/下载项目后,创建并激活虚拟环境(可选)。
- 安装依赖:
pip install -r <(sed 's/^pip install //; s/ -i .*//;' dependency.txt) # Linux/macOS zsh/bash
# 或手动执行 dependency.txt 中的 pip install 命令(Windows/PowerShell)
- 配置数据库连接:编辑
config.py
,确保账号、密码、库名正确。
HOSTNAME = 'localhost'
DATABASE = 'design_212_health'
PORT = 3306
USERNAME = 'root'
PASSWORD = '123456'
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)SQLALCHEMY_DATABASE_URI = DB_URL
SQLALCHEMY_TRACK_MODIFICATIONS = False
- 初始化数据库(见下文“数据库初始化与迁移”)。
- 运行:
python app.py # 如 app.py 已配置运行入口或通过 Flask 运行
数据库初始化与迁移
- 直接导入 SQL:将
design_212_health.sql
导入到 MySQL 数据库(推荐用于快速体验)。 - 或使用迁移(如已集成 Flask-Migrate,可按如下思路):
flask db init
flask db migrate -m "init"
flask db upgrade
模型定义(节选):
db = SQLAlchemy()# 用户表(User)
class User(db.Model):__tablename__ = 'user'user_id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户ID')username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名')password = db.Column(db.String(255), nullable=False, comment='密码')role = db.Column(db.Enum('admin', 'doctor', 'elder', 'family'), nullable=False,comment='用户角色(管理员、医生、老人、家属)')avatar_url = db.Column(db.String(255), default=None, comment='头像URL地址')email = db.Column(db.String(100), unique=True, default=None, comment='电子邮箱')phone = db.Column(db.String(20), default=None, comment='电话号码')reset_token = db.Column(db.String(100), default=None, comment='找回密码的临时token')reset_token_expire = db.Column(db.DateTime, default=None, comment='reset_token的过期时间')status = db.Column(db.Enum('active', 'disabled'), default='active', comment='账号状态(激活/禁用)')created_at = db.Column(db.DateTime, default=datetime.utcnow, comment='账号创建时间')
关键模块与核心代码
身份认证:登录/注册/首页
登录:
# 登录页面
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')role = request.form.get('role')user = User.query.filter_by(username=username).first()if not user:message = "用户不存在"return render_template('login.html', message=message)elif user.status == 'disabled':message = "账号已被禁用,请联系管理员"return render_template('login.html', message=message)elif not check_password_hash(user.password, password):message = "密码错误"return render_template('login.html', message=message)elif user.role != role:message = "角色错误"return render_template('login.html', message=message)# 登录成功,将用户名和角色存入 sessionsession['username'] = user.usernamesession['role'] = user.role# ... 省略:按角色写入 session['name']return redirect(url_for('index'))return render_template('login.html')
注册(字段校验、唯一性校验、角色默认头像):
@app.route('/register', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')email = request.form.get('email')phone = request.form.get('phone')address = request.form.get('address')role = request.form.get('role')# ... 省略:字段校验与唯一性校验hashed_password = generate_password_hash(password)# 根据角色设置头像 URLif role == 'doctor':avatar_url = 'static/uploads/doctor/default.jpg'elif role == 'elder':avatar_url = 'static/uploads/elder/default.jpg'elif role == 'family':avatar_url = 'static/uploads/family/default.jpg'else:avatar_url = 'static/uploads/default.jpg'# ... 省略:创建用户与对应角色资料
首页统计与展示数据:
@app.route('/')
def index():username = session.get('username')if username:user = User.query.filter_by(username=username).first()user_count = User.query.count()elder_count = Elder.query.count()family_count = Family.query.count()doctor_count = Doctor.query.count()carousels = Carousel.query.order_by(Carousel.order_index).all()announcements = Announcement.query.all()doctors = Doctor.query.all()return render_template('index.html',username=username,user=user,user_count=user_count,elder_count=elder_count,family_count=family_count,doctor_count=doctor_count,carousels=carousels,announcements=announcements,doctors=doctors)else:return redirect(url_for('login'))
业务模块:蓝图划分
blueprints/admin.py # 管理员:公告/轮播/人员/报告/药品/绑定管理doctor.py # 医生:名下老人、报告、药品管理elder.py # 老人:查看绑定医生/家属、药品、报告family.py # 家属:查看绑定老人、报告、药品
前端模板:角色化导航与个人信息
侧边栏展示头像与名称(节选):
<div class="leftbar-user" style="text-align: center;"><a href="#" style="display: flex; flex-direction: column; align-items: center; text-decoration: none;"><img src="/{{ user.avatar_url }}" alt="user-image" height="42" class="rounded-circle shadow-sm" style="margin-bottom: 5px;"><span style="color: black; font-weight: bold;">{{ session['name'] }}</span></a>
</div>
可视化:ECharts/Chart.js/ApexCharts 等
ECharts(示例函数):
function draw_chart(containerId, data) {var chart = echarts.init(document.getElementById(containerId));var option = {title: {left: 'center',top: 'top',textStyle: { color: '#2c3e50', fontSize: 24, fontFamily: 'Arial, sans-serif', fontWeight: 'bold' },subtextStyle: { color: '#7f8c8d', fontSize: 18, fontFamily: 'Arial, sans-serif' }},// ...
Chart.js(节选):
$(function() {/* ChartJS */'use strict';var data = {labels: ["2013", "2014", "2014", "2015", "2016", "2017"],datasets: [{label: '# of Votes',data: [10, 19, 3, 5, 2, 3],
ApexCharts(节选):
var options1= {chart: { type: 'area', height: 60, sparkline: { enabled: true } },series: [ { data: [24, 66, 42, 88, 62, 24, 45, 12, 36, 10] } ],stroke: { curve: 'smooth', width: 3 },colors: ['#0e86e7'],
可视化展示(预留位)
这里提供可直接替换的数据与示例容器,便于快速接入真实数据。你可以在首页或统计页中引入这些容器。
HTML 容器示例(可放在 templates/index.html
或统计页):
<div class="row"><div class="col-md-6"><div id="viz_users_by_role" style="height:360px;"></div></div><div class="col-md-6"><canvas id="viz_reports_trend" height="360"></canvas></div>
</div>
ECharts 渲染示例(挂到 static/js/mychart.js
或新建 static/js/viz.js
):
function renderUsersByRole(containerId, stats) {const chart = echarts.init(document.getElementById(containerId));chart.setOption({title: { text: '各角色用户数量' },tooltip: { trigger: 'item' },series: [{ type: 'pie', radius: '60%', data: [{ name: '管理员', value: stats.admin },{ name: '医生', value: stats.doctor },{ name: '老人', value: stats.elder },{ name: '家属', value: stats.family },] }]});
}
Chart.js 渲染示例:
function renderReportsTrend(canvasId, xLabels, values) {const ctx = document.getElementById(canvasId).getContext('2d');new Chart(ctx, {type: 'line',data: { labels: xLabels, datasets: [{ label: '健康报告数', data: values, borderColor: '#0e86e7', fill: false }] },options: { scales: { yAxes: [{ ticks: { beginAtZero: true } }] } }});
}
后端提供数据接口(示例):
@app.route('/api/stats/overview')
def api_stats_overview():return jsonify({'admin': User.query.filter_by(role='admin').count(),'doctor': User.query.filter_by(role='doctor').count(),'elder': User.query.filter_by(role='elder').count(),'family': User.query.filter_by(role='family').count(),})
常见问题(FAQ)
- Q: 依赖里的 pandas 会用到吗?
- A: 目前未在代码中直接使用,后期可在报表/分析中加入。
- Q: 支持哪些图表库?
- A: 已引入 ECharts / Chart.js / ApexCharts / C3 / Flot / Morris,可按需选用。
- Q: 如何添加新的角色能力?
- A: 在
models.py
扩展数据模型,在blueprints/*.py
补充路由与权限校验,在templates/
补充页面。
- A: 在
结语与联系我
如果这个项目对你有帮助,欢迎 Star / Fork / 交流共建。也欢迎将其作为课程/毕业设计的基础骨架,在此之上扩展更多健康数据指标与可视化能力。
联系方式:码界筑梦坊各大平台同名