【免费】LLM大模型 AI智能微信小程序个人健康管理系统(FastAPI+Vue3) 适合AI大模型毕业设计 Python毕业设计,课程设计 锋哥原创出品,必属精品
·
大家好,我是Java1234_小锋老师,分享一套锋哥原创的LLM大模型 AI智能微信小程序个人健康管理系统(FastAPI+Vue3) 。

项目介绍
随着移动互联网与人工智能技术的快速发展,个人健康管理正由传统的医院诊疗模式逐步转向日常化、数字化和智能化。大学生及年轻群体普遍存在作息不规律、饮食结构不合理、运动不足等问题,但现有健康应用往往功能分散、使用门槛较高,难以与即时通讯场景深度融合。针对上述问题,本文设计并实现了一套AI智能微信小程序个人健康管理系统。
系统采用前后端分离与多端协同架构:服务端基于Python语言与FastAPI框架构建RESTful接口,使用SQLAlchemy操作MySQL数据库db_health;用户端基于微信小程序实现健康数据的随身记录与AI咨询;管理端基于Vue3、Vite、Element Plus和ECharts实现业务数据管理与可视化统计。系统涵盖用户注册登录、个人资料与密码管理、健康指标监测、饮食与运动记录、健康计划、健康资讯以及AI智能客服等功能。其中AI客服对接OpenAI兼容接口,结合健康领域系统提示词,为用户提供饮食、运动、血压血糖等常识性建议,并明确提示不可替代专业诊疗。
本文完成了需求分析、总体设计、数据库E-R设计、接口设计、功能实现与测试验证。测试结果表明,系统功能完整、界面简洁、数据统计直观,能够为个人日常健康管理提供可行的信息化方案,对同类微信小程序与Python Web应用的开发具有一定参考价值。
源码下载
链接: https://pan.baidu.com/s/1WwCEAeCAixFaFkqn1uRNrA?pwd=1234
提取码: 1234
系统展示






核心代码
"""
健康资讯业务服务
"""
from sqlalchemy import func, select
from sqlalchemy.orm import Session
from app.models.article import Article
from app.schemas.common import ArticleVO
from app.utils.exception import BusinessException
class ArticleService:
"""健康资讯业务服务类"""
@staticmethod
def page(db: Session, page_num: int, page_size: int, keyword: str | None = None, category: str | None = None) -> dict:
"""分页查询资讯"""
query = select(Article)
if keyword:
query = query.where(Article.title.like(f"%{keyword}%"))
if category:
query = query.where(Article.category == category)
query = query.order_by(Article.create_time.desc())
total = db.scalar(select(func.count()).select_from(query.subquery()))
records = db.scalars(query.offset((page_num - 1) * page_size).limit(page_size)).all()
return {
"total": total or 0,
"records": [ArticleVO.model_validate(r).model_dump(by_alias=True) for r in records],
}
@staticmethod
def detail(db: Session, article_id: int) -> ArticleVO | None:
"""获取资讯详情并增加浏览量"""
article = db.get(Article, article_id)
if article:
article.views = (article.views or 0) + 1
db.commit()
db.refresh(article)
return ArticleVO.model_validate(article)
return None
@staticmethod
def add(db: Session, article: Article) -> None:
"""新增资讯"""
db.add(article)
db.commit()
@staticmethod
def update(db: Session, article: Article) -> None:
"""更新资讯"""
if not db.get(Article, article.id):
raise BusinessException("资讯不存在")
db.merge(article)
db.commit()
@staticmethod
def delete(db: Session, article_id: int) -> None:
"""删除资讯"""
article = db.get(Article, article_id)
if article:
db.delete(article)
db.commit()
<template>
<div class="page-container">
<div class="page-header"><h2>健康指标</h2></div>
<div class="search-bar">
<el-input v-model="keyword" placeholder="搜索用户/类型/备注" clearable style="width:220px" @clear="loadData" @keyup.enter="loadData" />
<el-select v-model="queryType" placeholder="指标类型" clearable style="width:140px" @change="loadData">
<el-option v-for="t in types" :key="t" :label="t" :value="t" />
</el-select>
<el-button type="primary" @click="loadData"><el-icon><Search /></el-icon>搜索</el-button>
<el-button type="success" @click="openDialog()"><el-icon><Plus /></el-icon>新增</el-button>
</div>
<el-table :data="tableData" stripe border style="width:100%">
<el-table-column prop="id" label="ID" min-width="60" />
<el-table-column prop="nickname" label="用户" min-width="90" />
<el-table-column prop="type" label="类型" min-width="80" />
<el-table-column label="数值" min-width="120">
<template #default="{ row }">
{{ row.value }}{{ row.value2 ? '/' + row.value2 : '' }} {{ row.unit }}
</template>
</el-table-column>
<el-table-column prop="recordTime" label="记录时间" min-width="160">
<template #default="{ row }">{{ formatDateTime(row.recordTime) }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" min-width="120" show-overflow-tooltip />
<el-table-column label="操作" min-width="140" fixed="right">
<template #default="{ row }">
<el-button type="primary" link @click="openDialog(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination class="pagination" v-model:current-page="pageNum" v-model:page-size="pageSize" :total="total" layout="total, prev, pager, next" @change="loadData" />
<el-dialog v-model="dialogVisible" :title="form.id ? '编辑指标' : '新增指标'" width="500px">
<el-form :model="form" label-width="90px">
<el-form-item label="用户">
<el-select v-model="form.userId" placeholder="请选择用户" filterable style="width:100%">
<el-option v-for="u in userList" :key="u.id" :label="u.nickname" :value="u.id" />
</el-select>
</el-form-item>
<el-form-item label="类型">
<el-select v-model="form.type"><el-option v-for="t in types" :key="t" :label="t" :value="t" /></el-select>
</el-form-item>
<el-form-item label="数值"><el-input-number v-model="form.value" :precision="2" /></el-form-item>
<el-form-item label="辅助值" v-if="form.type === '血压'"><el-input-number v-model="form.value2" :precision="2" /></el-form-item>
<el-form-item label="单位"><el-input v-model="form.unit" /></el-form-item>
<el-form-item label="记录时间"><el-date-picker v-model="form.recordTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" /></el-form-item>
<el-form-item label="备注"><el-input v-model="form.remark" /></el-form-item>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleSave">保存</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import request from '@/utils/request'
import { formatDateTime } from '@/utils/format'
const types = ['体重', '血压', '血糖', '心率', '体温']
const tableData = ref([])
const total = ref(0)
const pageNum = ref(1)
const pageSize = ref(10)
const queryType = ref('')
const keyword = ref('')
const dialogVisible = ref(false)
/** 用户下拉列表(按昵称选择,提交时用用户ID) */
const userList = ref([])
const form = reactive({ id: null, userId: null, type: '体重', value: 0, value2: null, unit: 'kg', recordTime: '', remark: '' })
onMounted(() => {
loadData()
loadUsers()
})
/** 加载用户列表,供新增/编辑时按昵称选择 */
async function loadUsers() {
const res = await request.get('/admin/user/page', { params: { pageNum: 1, pageSize: 1000 } })
userList.value = res.data.records || []
}
async function loadData() {
const res = await request.get('/admin/metric/page', { params: { pageNum: pageNum.value, pageSize: pageSize.value, type: queryType.value, keyword: keyword.value } })
tableData.value = res.data.records
total.value = res.data.total
}
/** 打开新增/编辑弹窗 */
function openDialog(row) {
const defaultUserId = userList.value.length ? userList.value[0].id : null
Object.assign(form, row ? { ...row } : { id: null, userId: defaultUserId, type: '体重', value: 0, value2: null, unit: 'kg', recordTime: new Date().toISOString().slice(0,19).replace('T',' '), remark: '' })
dialogVisible.value = true
}
async function handleSave() {
if (form.id) await request.put('/admin/metric', form)
else await request.post('/admin/metric', form)
ElMessage.success('保存成功')
dialogVisible.value = false
loadData()
}
async function handleDelete(id) {
await ElMessageBox.confirm('确定删除吗?', '提示', { type: 'warning' })
await request.delete(`/admin/metric/${id}`)
ElMessage.success('删除成功')
loadData()
}
</script>
<style scoped>
.pagination { margin-top: 16px; justify-content: flex-end; }
</style>
更多推荐


所有评论(0)