目录
一、项目演示
网络资源模板--健康管理系统
二、项目测试环境
三、项目详情
基于安卓android的健康管理系统App源码。项目实现了欢迎页、登录、注册、后台管理(热量管理、食谱管理、用户管理)、运动记步、体重记录、健康档案、饮食记录、健康菜谱、我的、退出登录、网络请求、API接口调用、数据库等功能。
技术栈:23个Activity + 3个Fragment + RecyclerView + Sqlite数据库(一个数据库,八个数据表) + 图片选择库 + Glide图片加载 + Okhttp网络请求 + API接口调用 + Gson数据解析 + MPAndroidChart图表 + ImageView + TextView + FloatingActionButton + EditText + Button + WebView + RadioGroup + RadioButton + 自定义SportStepView + ScrollView
注册登录页面
-
用户输入信息:用户可以输入账号、昵称、手机号、地址、密码及确认密码,同时选择性别并上传头像。
-
头像选择:点击头像区域,可以打开图库选择图片,支持裁剪和压缩功能,并使用 Glide 加载预览图像。
-
输入验证:在注册时进行多项输入验证,如检查头像、账号、昵称、手机号、地址、密码的有效性,以及确保密码一致性。
-
数据库操作:通过 SQLite 数据库检查用户是否已存在,若不存在则插入新用户记录。
-
反馈与提示:在注册成功或输入错误时,通过 Toast 提供用户反馈。
-
导航功能:提供跳转到登录界面的功能,方便已有用户登录
this.btnRegister.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 获取输入的注册信息
String account = etAccount.getText().toString();
String nickName = etNickName.getText().toString();
String phone = etPhone.getText().toString();
String address = etAddress.getText().toString();
String password = etPassword.getText().toString();
String passwordSure = etPasswordSure.getText().toString();
// 输入验证
if ("".equals(imagePath)) {
Toast.makeText(RegisterActivity.this, "请上传头像", Toast.LENGTH_SHORT).show();
} else if ("".equals(account)) {
Toast.makeText(RegisterActivity.this, "用户名不能为空", Toast.LENGTH_SHORT).show();
} else if ("".equals(nickName)) {
Toast.makeText(RegisterActivity.this, "昵称不能为空", Toast.LENGTH_SHORT).show();
} else if ("".equals(phone)) {
Toast.makeText(RegisterActivity.this, "手机号不能为空", Toast.LENGTH_SHORT).show();
} else if (phone.length() != 11) {
Toast.makeText(RegisterActivity.this, "手机号格式错误", Toast.LENGTH_SHORT).show();
} else if ("".equals(address)) {
Toast.makeText(RegisterActivity.this, "地址不能为空", Toast.LENGTH_SHORT).show();
} else if ("".equals(password)) {
Toast.makeText(RegisterActivity.this, "密码为空", Toast.LENGTH_SHORT).show();
} else if (!password.equals(passwordSure)) {
Toast.makeText(RegisterActivity.this, "密码不一致", Toast.LENGTH_SHORT).show();
} else {
String sex = rgSex.getCheckedRadioButtonId() == R.id.rb_man ? "男" : "女"; // 获取性别
User mUser = null; // 初始化用户对象
SQLiteDatabase db = helper.getWritableDatabase(); // 获取可写数据库
// 查询是否已有相同用户名
Cursor cursor = db.rawQuery("select * from user where account = ?", new String[]{account});
if (cursor != null && cursor.getColumnCount() > 0) {
while (cursor.moveToNext()) {
mUser = new User(cursor.getInt(0), cursor.getString(1), cursor.getString(2),
cursor.getString(3), cursor.getString(4), cursor.getString(5),
cursor.getString(6), cursor.getString(7));
}
}
// 如果用户不存在,则进行注册
if (mUser == null) {
db.execSQL("insert into user(account, password, name, sex, phone, address, photo) values(?,?,?,?,?,?,?)",
new Object[]{
account, password, nickName, sex, phone, address, imagePath
});
Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
finish(); // 注册成功后结束当前活动
} else {
Toast.makeText(RegisterActivity.this, "该账号已存在", Toast.LENGTH_SHORT).show(); // 账号已存在提示
}
db.close(); // 关闭数据库连接
}
}
});
}
-
用户输入:提供账号和密码输入框,用户可以输入登录凭证。
-
输入验证:在用户点击登录按钮时,检查输入是否为空,并显示相应的提示信息。
-
数据库查询:查询 SQLite 数据库,验证用户账号是否存在以及密码是否正确。
-
默认管理员登录:支持默认的管理员账号(账号为 "admin" 和密码为 "123456"),若输入匹配,则跳转到管理员界面。
-
错误提示:如果账号不存在或密码错误,提供相应的错误提示。
-
跳转功能:根据登录结果,成功登录后跳转到主界面或管理界面,并结束当前活动。
-
用户信息存储:登录成功后,将用户 ID 存储在 SharedPreferences 中,以便后续使用
this.btnLogin.setOnClickListener(v -> {
String account = LoginActivity.this.etAccount.getText().toString(); // 获取输入的账号
String password = LoginActivity.this.etPassword.getText().toString(); // 获取输入的密码
// 校验输入
if ("".equals(account)) {
Toast.makeText(LoginActivity.this, "用户名不能为空", Toast.LENGTH_SHORT).show(); // 账号不能为空提示
} else if ("".equals(password)) {
Toast.makeText(LoginActivity.this, "密码不能为空", Toast.LENGTH_SHORT).show(); // 密码不能为空提示
} else if (!account.equals("admin") || !password.equals("123456")) { // 如果不是默认账号和密码
User mUser = null; // 初始化用户对象
SQLiteDatabase db = LoginActivity.this.helper.getWritableDatabase(); // 获取可写数据库
// 查询数据库中的用户
Cursor cursor = db.rawQuery("select * from user where account = ?", new String[]{account});
if (cursor != null && cursor.getColumnCount() > 0) {
while (cursor.moveToNext()) {
// 创建用户对象
mUser = new User(
Integer.valueOf(cursor.getInt(0)),
cursor.getString(1),
cursor.getString(2),
cursor.getString(3),
cursor.getString(4),
cursor.getString(5),
cursor.getString(6),
cursor.getString(7)
);
}
}
db.close(); // 关闭数据库
// 根据查询结果进行判断
if (mUser == null) {
Toast.makeText(LoginActivity.this, "账号不存在", Toast.LENGTH_SHORT).show(); // 提示账号不存在
} else if (!password.equals(mUser.getPassword())) {
Toast.makeText(LoginActivity.this, "密码错误", Toast.LENGTH_SHORT).show(); // 提示密码错误
} else {
SPUtils.put(LoginActivity.this, SPUtils.USER_ID, mUser.getId()); // 保存用户ID到SharedPreferences
LoginActivity.this.startActivity(new Intent(LoginActivity.this, MainActivity.class)); // 跳转到主活动
LoginActivity.this.finish(); // 关闭当前活动
}
} else { // 如果是默认的管理员账号
LoginActivity.this.startActivity(new Intent(LoginActivity.this, ManagerActivity.class)); // 跳转到管理活动
LoginActivity.this.finish(); // 关闭当前活动
}
});
}
首页
-
用户输入:用户可以输入身高和体重,并选择性别(男性或女性)。
-
BMI 计算:通过点击计算按钮,Fragment 会收集用户输入,并通过 API 请求计算 BMI。
-
API 请求:使用网络工具发起 GET 请求,向外部 API 发送身高、体重和性别数据,以获取 BMI 结果。
-
结果展示:成功获取结果后,弹出对话框显示 BMI 指数及相关信息(如理想体重、正常体重范围等)。如果计算失败,则显示相应的提示信息。
-
页面导航:提供多个入口,用户可以点击不同的布局,跳转到其他活动(如饮食记录、运动记录等)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
this.helper = new MySqliteOpenHelper(this.myActivity);
this.ll_food_energy = (LinearLayout) view.findViewById(R.id.ll_food_energy);
this.ll_weight = (LinearLayout) view.findViewById(R.id.ll_weight);
this.ll_diet = (LinearLayout) view.findViewById(R.id.ll_diet);
this.ll_lose_weight = (LinearLayout) view.findViewById(R.id.ll_lose_weight);
this.ll_health_record = (LinearLayout) view.findViewById(R.id.ll_health_record);
this.ll_sport_record = (LinearLayout) view.findViewById(R.id.ll_sport_record);
this.ll_lose_weight = (LinearLayout) view.findViewById(R.id.ll_lose_weight);
this.etHeight = (EditText) view.findViewById(R.id.et_height);
this.etWeight = (EditText) view.findViewById(R.id.et_weight);
this.rgSex = (RadioGroup) view.findViewById(R.id.rg_sex);
this.btnCalculate = (Button) view.findViewById(R.id.btn_calculate);
initView();
this.ll_food_energy.setOnClickListener(v -> {
HomeFragment.this.startActivity(new Intent(HomeFragment.this.myActivity, FoodEnergyActivity.class));
});
this.ll_weight.setOnClickListener(v -> {
HomeFragment.this.startActivity(new Intent(HomeFragment.this.myActivity, WeightRecordActivity.class));
});
this.ll_diet.setOnClickListener(v -> {
HomeFragment.this.startActivity(new Intent(HomeFragment.this.myActivity, DietActivity.class));
});
this.ll_lose_weight.setOnClickListener(v -> {
HomeFragment.this.startActivity(new Intent(HomeFragment.this.myActivity, LoseWeightActivity.class));
});
this.ll_health_record.setOnClickListener(v -> {
HomeFragment.this.startActivity(new Intent(HomeFragment.this.myActivity, HealthRecordActivity.class));
});
this.ll_sport_record.setOnClickListener(v -> {
HomeFragment.this.startActivity(new Intent(HomeFragment.this.myActivity, SportRecordActivity.class));
});
this.btnCalculate.setOnClickListener(v ->
{
HomeFragment.this.calculate();
});
return view;
}
private void initView() {
}
四、完整的项目源码
👇👇👇👇👇快捷获取方式👇👇👇👇👇