目 录
-
绪论 1
1.1 背景和意义 1
1.2 国内外研究现状 1
1.3相关知识 2
1.3.1健身指标 2
1.3.2开发工具 3 -
减肥塑身平台的需求分析 4
2.1减肥塑身平台整体的需求分析 4
2.1.1会员帐户系统需求分析 5
2.1.2 计划系统 5
2.1.3摄入支出系统 6
2.2 可行性分析 7
2.2.1 经济可行性 7
2.2.2技术可行性 7
2.2.3 法律可行性 7
2.2.4 时间可行性 7 -
减肥塑身系统的设计与实现 8
3.1总体设计 8
3.2详细设计 8
3.2.1服务端设计 8
3.2.2客户端设计 9
3.2.3数据库设计 9
3.3 功能实现 12
3.3.1生成计划功能 12
3.3.2身材管理 12
3.3.3摄入支出平衡管理 13
3.3.4健康管理 13 -
减肥塑身系统的测试 14
4.1系统兼容性测试 14
4.2系统功能性测试 14
4.3 系统性能测试 15 -
总结 16
参考文献 18
2.2 可行性分析
可行性分析的目的是在软件开发之前对新系统从经济、技术、法律、进度、文化、运行等方面进行可行性分析。可行性分析能减少开发风险,提高软件开发的成功率。
2.2.1 经济可行性
经济可行性,一方面指的是项目进行过程使用现有资源,比如人力资源、资金资源的可能性;另一方面指的是开发过程中所需要的成本和项目完成后的收益。
硬件:
个人电脑一台:5000元,开发人员已经拥有。
网络设备及相关费用:50元。
Android智能手机:Nexus5 3000元,开发人员已经拥有。
软件:
Java SDK、Eclipse、Android Studio、Android SDK:均可从与之相关的官方网站上免费下载,花费为0元。
其他:
参考资料、相关教程:均可从网络、图书馆等地方免费获取,花费为0元。
收益:
现阶段下载、使用本应用均不收取任何费用,也没有加入广告,收益为0元。
总的来说,开发过程中主要使用的是开发者本人已经拥有或能免费获取的资源,开发该项目时需要的资金额度比较小,而且该额度在开发人员的承受范围内。现阶段没有盈利部分,盈利部分将出现在将来优化后的版本中。
2.2.2技术可行性
技术可行性,指的是开发过程中决策和决策方案的技术,不能超出当前阶段开发组织所熟练和掌握的技术资源条件。在本次开发过程中,开发人员现有的开发技术及开发经验可以承担该开发任务,主要用到的技术有Android 开发技术、Android SDK使用技术、Java SDK使用技术等等。
2.2.3 法律可行性
法律可行性,指的是项目本身、项目开发过程、项目投入使用过程和项目报废过程中都符合我国的相关法律法规,没有违法乱纪、侵犯专利权等现象。本次开发的项目本身、项目开发过程均符合我国相关的法律法规标准,项目投入使用过程和项目报废过程经科学预计,也将符合我国相关的法律法规标准。
2.2.4 时间可行性
时间可行性,指的是开发时间不能超出当前阶段开发组织所规定的时间范围。在本次开发过程中,项目启动、应用开发到应用展示,有将近一年的时间,时间是足够的。 -
减肥塑身系统的设计与实现
3.1总体设计
本系统的主要载体有四个:1.Android设备、2. MySQL数据库、3. SQLite本地数据库、4. 远程服务器;
Android端作为应用呈现给用户的主要载体,本章后续将会详细介绍。MySQL 数据库在本减肥健身应用系统中作为数据中心存储的载体[8]。SQLite本地数据库存储者食物热量库与运动热量库 android 端可以直接从本地获取。远程服务器是租阿里云服务器ECS,云服务器作为连通android端和MySQL 数据库的桥梁,本文转载自http://www.biyezuopin.vip/onews.asp?id=13471可以方便的调用数据库中的数据用于展现在android 端上。图为四者的关系(如图3-1)。
图3- 1 系统载体关系
3.2详细设计
3.2.1服务端设计
后台设计是整个系统中非常重要的部分,主要分成计划模块与用户业务模块两方面。
(1)计划模块设计
本应用主要以计划目标为指导,引导用户去达成目标。所以,计划是本应用的核心,所有的操作都将围绕完成计划而努力。在注册完成后必须新增计划,如果已经注册,就可以查看计划,查看的同时可以新增计划,完成计划,新增消耗/摄入热量,查看消耗/摄入热量记录。新增身材变化,查看身材变化趋势等操作(如图3-2)。
图3- 2计划模块流程图
(2)用户业务模块设计
用户是以设备UUID 唯一值作为区分,也就以一台android 手机对应着一个账号,用户不需要手动去输入账号密码,由服务端判断这个帐户在数据库中是否有存在,有登陆,没有则进行注册。每个用户主要具有修改个人基本资料,查看BMI与基础热量消耗等个人健康数据,新增身材变化三个业务。首先介绍修改个人基本资料,每个人的身体状态并不相同,甚至可以说是千差万别。只有掌握每个用户的基本身体状况信息,才能精确计算出该用户的身体状况。查看BMI与基础热量消耗等个人健康数据,这些数据建立在准确的用户基本资料上,通过用户的准确资料计算出BMI,基础热量消耗,与健康体重范围,让用户了解自己的身体状况。新增身材变化,通过每一条身材记录的变化,用户能够直观的体现用户锻炼减肥成效。具有账户切换,进行测量,查询历史三个业务。
3.2.2客户端设计
客户端参考 全新的Android 5.0后的新特性 材料设计 (material design),通过模仿材料的表面以及边缘提供更加真实效果的视觉体验,以真实的触感让用户可以快速地理解和认知这一动作。材料的多样性可以让我们展现出更多反映真实世界的设计与效果,但同时不会脱离现实世界的物理规律。
(1)根据用户行为, 添加有意义的动画效果,有效地暗示、指引用户。通过动画效果,让物体变化以更连续流畅、更平滑的方式呈现给用户。在实际应用动画上,更加贴近现实生活环境,在交互时及时反馈,转换场景上交互动画更加优美,连贯且有层次区分,而且不能脱离功能,而要服务于功能
(2)在样式基础上,要考虑不同的饱和度,达到不同的展现效果,用简洁对称的集合形状,并为矩形添加了圆角设计,使得矩形更加柔和。在图片配合文字时,尽量使用图片的原型性,不能失去图片的意义。
(3)在布局上,按下的状态时上浮的,这样显得更有层次,在适当的时候要考虑元素的z轴空间,z轴的深度表达出了层次关系,顶部的阴影表达深度,底端的阴影表达边界。
(4)在使用性上,至少要确保可触摸的元素大小至少有4848像素,因为人的拇指最小的点击范围正好是4848像素。在关键的文本信息处要有足够的对比方便读者阅读。
package com.zszdevelop.planman.view;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.zszdevelop.planman.base.BaseBean;
import com.zszdevelop.planman.utils.LogUtils;
import java.util.List;
import butterknife.ButterKnife;
/**
* Created by jimmy on 15/12/29.
*/
public abstract class BaseSectionAdapter<T extends BaseBean> extends RecyclerView.Adapter {
private final static int ITEM_TYPE_HEAD = Integer.MIN_VALUE;
private final static int ITEM_ADAPTER_OFFSET = 1;
private Context context;
private int layoutRes;
private List<T> data;
public BaseSectionAdapter(Context context, int layoutRes, List<T> data) {
this.context = context;
this.layoutRes = layoutRes;
this.data = data;
}
public T getItem(int position) {
if (data.size() <= 0) {
return null;
}
return data.get(position);
}
@Override
public final RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE_HEAD) {
return onCreateHeadViewHolder(parent, ITEM_TYPE_HEAD);
} else {
return onCreateItemViewHolder(parent, viewType - ITEM_ADAPTER_OFFSET);
}
}
@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int type = holder.getItemViewType();
if (type == ITEM_TYPE_HEAD && position == 0) {
//head的相关逻辑写在这里
LogUtils.e("处理头部的逻辑");
onBindHeadView(holder, position);
} else {
//这个是处理常规ITEM的操作
onBindItemView(holder, position - (hasHeader() ? 1 : 0) );
}
}
@Override
public int getItemViewType(int position) {
if (position == 0 & hasHeader()) {
return ITEM_TYPE_HEAD;
} else {
return super.getItemViewType(position) + ITEM_ADAPTER_OFFSET;
}
}
@Override
public int getItemCount() {
int itemCount = getBasicItemCount();
if (hasHeader()) {
itemCount += 1;
}
return itemCount;
}
public void appendData(List<T> list) {
if (list == null) {
return;
}
data.addAll(list);
}
public void clear() {
LogUtils.e(data.size()+"前");
data.clear();
LogUtils.e(data.size() + "后");
notifyDataSetChanged();
}
private int getBasicItemCount() {
return data.size();
}
public abstract boolean hasHeader();
public abstract RecyclerView.ViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType);
public abstract RecyclerView.ViewHolder onCreateHeadViewHolder(ViewGroup parent, int viewType);
public abstract void onBindItemView(RecyclerView.ViewHolder holder, int position);
public abstract void onBindHeadView(RecyclerView.ViewHolder holder, int position);
protected class OtherViewHolder extends RecyclerView.ViewHolder {
public OtherViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}