目 录
摘 要 I
Abstract II
1 绪论 1
1.1 选题背景及意义 1
1.2 国内外研究现状 1
1.3 研究主要内容 2
2 关键技术和开发环境 4
2.1健身指标 4
2.2 JSP开发技术 5
2.3 MySQL数据库 7
2.4 小程序 8
2.5 个性化推荐技术 9
2.6 开发环境及工具 10
3 健康先行微信小程序系统分析 12
3.1 需求分析 12
3.1.1 会员帐户系统需求分析 13
3.1.2 计划系统 15
3.1.3摄入支出系统 16
3.2 可行性分析 17
3.2.1 经济可行性 17
3.2.2技术可行性 17
3.2.3 法律可行性 18
3.2.4 时间可行性 18
4 健康先行微信小程序系统设计 19
4.1 总体设计 19
4.2详细设计 19
4.2.1服务端设计 19
4.2.2 客户端设计 21
4.2.3 数据库设计 21
5 健康先行微信小程序系统实现 25
5.1生成计划功能 25
5.2身材管理 25
5.3 摄入支出平衡管理 26
5.4 健康管理 27
6 健康先行微信小程序系统测试 28
6.1系统兼容性测试 28
6.2系统功能性测试 28
6.3 系统性能测试 29
7 总结 30
参考文献 31
致 谢 33
5 健康先行微信小程序系统实现
5.1生成计划功能
通过自适应计划,让每个用户找到适合自己的计划,树立明确的运动目标。用户通过点击想要的达成的效果或者部位,如图5-1所示,进入计划详细页面进行计划的细微调整如图5-2所示。
5.2身材管理
通过身材管理直观的看到身材变化趋势,梳理运动信心。用户通过测量身材数据,并在小程序上记录身材变化如图5-3,添加成功后便可以直观的看到变化趋势,如图5-4所示。
5.3 摄入支出平衡管理
通过摄入支出平衡体系用户可以方便的查询到食物热量等信息,科学健康饮食健身。用户在搜索栏中搜索想要查询的食物/运动并根据找到的食物选择摄入的时间与份量,如图5-5。选择完成后成功添加到当日摄入食物列表中,如图5-6。
5.4 健康管理
通过基础数据帮助用户计算出个人健康状况表,用户通过修改个人资料,身高,体重等参数,如图5-7。本文转载自http://www.biyezuopin.vip/onews.asp?id=14129根据用户身体数据得到自身身体状况,如图5-8。
6 健康先行微信小程序系统测试
系统测试为系统开发的最后一道工序,只有经过缜密的系统测试,才能保证系统性能与功能的可靠性。通过测试用例反复测试,能将系统内一些隐藏的错误挖掘出来,从而让系统 及时得到修复与改善。
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);
}
}
}