博主介绍:本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮助到您;
🍅文章末尾获取源码下载方式🍅
目录
功能演示
一、项目介绍
1:新建日程:用户可以创建自己的日程信息。
2:删除日程:用户可以在日程期限已经过去或日程发生变化时,删除自己不需要的日程信息。
3:修改日程:用户可以对自己以前新建立的日程修改,使该日程更加适合自己现在的状况。
4:查找日程:用户可以在大量的信息情况下更加方便地查找到自己需要的日程信息。
5:日程类别维护:用户可以增加自己需要的日程类别,并且删除自己不需要的日程类别。
6:事务提醒功能:用户可以设置提醒时间,在到达日程时间时,可提醒用户该日程。
二、运行环境
1:客户端使用Android stuido进行开发;
2:服务端后台使用Myeclipse2014进行开发;
3:mysql数据库进行数据存储;
4:需要jdk1.7以上
5:使用雷电模拟器或者Androidstuio自带的模拟器进行运行
三、使用技术
总体设计逻辑和思路:
1:先设计数据库表文件
2:写服务端jsp页面以及写api接口给客户端提供数据
3:完成后台服务端的数据交互,也就是jsp页面数据的存储和显示
4:进行客户端页面的开发;
5:进行客户端对api接口的调用,也就是获取数据库的数据以及在客户端进行显示移动端:
1:使用android原生控件以及xml布局文件来完成界面的显示
2:使用java代码完成功能的数据和逻辑交互
3:使用http网络请求完成数据的请求;
4:使用json数据解析完成客户端数据的回调和显示服务端后台:
1:使用mysql完成数据的存储
2:使用jdbc完成数据库和代码的逻辑交互
3:使用jsp完成网页数据的显示
4:使用java代码完成api接口的编写以及以及数据的回调
四、数据库设计
/*
Navicat MySQL Data Transfer
Source Server : mydata
Source Server Version : 50537
Source Host : localhost:3306
Source Database : scheduledb
Target Server Type : MYSQL
Target Server Version : 50537
File Encoding : 65001
Date: 2019-01-24 17:00:56
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for scheduletb
-- ----------------------------
DROP TABLE IF EXISTS `scheduletb`;
CREATE TABLE `scheduletb` (
`scheduleId` int(50) NOT NULL AUTO_INCREMENT,
`scheduleName` varchar(255) DEFAULT NULL,
`scheduleTypeId` varchar(11) DEFAULT NULL,
`scheduleTypeName` varchar(255) DEFAULT NULL,
`scheduleMessage` varchar(1500) DEFAULT NULL,
`scheduleTime` varchar(100) DEFAULT NULL,
`scheduleUserId` varchar(255) DEFAULT NULL,
`scheduleUserName` varchar(255) DEFAULT NULL,
`scheduleCreatime` varchar(100) DEFAULT NULL,
PRIMARY KEY (`scheduleId`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of scheduletb
-- ----------------------------
INSERT INTO `scheduletb` VALUES ('5', '和朋友一起吃饭', '2', '吃饭', '我们的身体处在,血液高速循环的状态。这时突然坐下,不仅会阻碍血液循环,阻碍肌肉恢复。', '2019-01-25 15:11', '16', '多多', '2019-01-24 15:11');
INSERT INTO `scheduletb` VALUES ('7', '吃药', '1', '运动', '我们的身体处在,血液高速循环的状态。这时突然坐下;', '2019-01-24 15:42', '16', '多多', '2019-01-24 15:42');
INSERT INTO `scheduletb` VALUES ('8', 'chichcihi', '2', '吃饭', '我们的身体处在,血液高速循环的状态。这时突然坐下,不仅会阻碍血液循环,阻碍肌肉恢复。还会影响大脑供血的判断,很多的健身事故、猝死,正是来源于做完动作后立刻坐下,再站起来时因为头晕目眩而摔倒', '2019-01-24 16:32', '16', '多多', '2019-01-24 16:27');
INSERT INTO `scheduletb` VALUES ('9', '一起周末玩', '5', '竞技', '我们的身体处在,血液高速循环的状态', '2019-01-27 16:31', '16', '多多', '2019-01-24 16:31');
-- ----------------------------
-- Table structure for typetb
-- ----------------------------
DROP TABLE IF EXISTS `typetb`;
CREATE TABLE `typetb` (
`typeId` int(50) NOT NULL AUTO_INCREMENT,
`typeName` varchar(255) DEFAULT NULL,
`typeUserId` varchar(100) DEFAULT NULL,
`typeUserName` varchar(255) DEFAULT NULL,
`typeTime` varchar(255) DEFAULT NULL,
PRIMARY KEY (`typeId`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of typetb
-- ----------------------------
INSERT INTO `typetb` VALUES ('1', '运动', '16', '多多', '2019-01-24 11:22');
INSERT INTO `typetb` VALUES ('2', '吃饭', '16', '多多', '2019-01-24 11:22');
INSERT INTO `typetb` VALUES ('3', '吃药', '16', '多多', '2019-01-24 11:22');
INSERT INTO `typetb` VALUES ('5', '竞技', '16', '多多', '2019-01-24 16:31');
-- ----------------------------
-- Table structure for usermsg
-- ----------------------------
DROP TABLE IF EXISTS `usermsg`;
CREATE TABLE `usermsg` (
`userId` int(50) NOT NULL AUTO_INCREMENT,
`userName` varchar(255) DEFAULT NULL,
`userPhone` varchar(255) DEFAULT NULL,
`userPswd` varchar(255) DEFAULT NULL,
`userTime` varchar(255) DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of usermsg
-- ----------------------------
INSERT INTO `usermsg` VALUES ('14', '15249243002', '多多', '123456', '2019-01-24 15:05');
INSERT INTO `usermsg` VALUES ('15', '123456', '多多', '15249243002', '2019-01-24 15:06');
INSERT INTO `usermsg` VALUES ('16', '多多', '15249243002', '123456', '2019-01-24 15:09');
五、部分代码
1:日程列表
public class ScheduleFragment extends BaseFragment implements ScheduleListner, Observer {
// 获取view
private View rootView;
// 获取控件
private ListView mListMessage;
View convertView;
private ImageView mivCreateMessage;
private List<ScheduleModel> list_result = new ArrayList<ScheduleModel>();
private TextView mtvFenLei;
private boolean isCheck = false;
private int ctposNumber = 0;
private DialogListMsg dialogListMsg;
private List<TypeModel> list_type = new ArrayList<TypeModel>();
private DialogMsg dialogMsg;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_send, null);
initWidget();
initData();
return rootView;
}
@Override
public void initWidget() {
dialogMsg = new DialogMsg(getActivity());
dialogMsg.submit_no().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialogMsg.Close();
}
});
dialogMsg.submit_ok().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialogMsg.Close();
}
});
mivCreateMessage = (ImageView) rootView.findViewById(R.id.mivCreateMessage);
mtvFenLei = (TextView) rootView.findViewById(R.id.mtvFenLei);
mivCreateMessage.setOnClickListener(this);
mtvFenLei.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialogListMsg.Show();
}
});
mListMessage = (ListView) rootView.findViewById(R.id.mListMessage);
dialogListMsg = new DialogListMsg(getActivity());
dialogListMsg.setTitle().setText("请选择日程类型");
dialogListMsg.show_listview().setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
ctposNumber = position;
dialogListMsg.Close();
mtvFenLei.setText(list_type.get(position).getTypeName());
listSearchSchedule(true, list_type.get(position).getTypeId());
}
});
dialogListMsg.submit_no().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialogListMsg.Close();
}
});
}
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), CreateScheduleActivity.class);
startActivity(intent);
}
@Override
public void initData() {
listStudentPhone(true);
mListMessage.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
}
});
}
private void listStudentPhone(boolean isShow) {
AjaxParams params = new AjaxParams();
params.put("action_flag", "listSchedule");
params.put("scheduleUserId", MemberUserUtils.getUid(getActivity()));
httpPost(Consts.URL + Consts.APP.MessageAction, params, Consts.actionId.resultFlag, isShow, "正在加载...");
}
private void listSearchSchedule(boolean isShow,String scheduleTypeId) {
AjaxParams params = new AjaxParams();
params.put("action_flag", "listSearchSchedule");
params.put("scheduleUserId", MemberUserUtils.getUid(getActivity()));
params.put("scheduleTypeId", scheduleTypeId);
httpPost(Consts.URL + Consts.APP.MessageAction, params, Consts.actionId.resultSix, isShow, "正在加载...");
}
private void deleteSchedule(boolean isShow, ScheduleModel scheduleModel) {
AjaxParams params = new AjaxParams();
params.put("action_flag", "deleteSchedule");
params.put("scheduleId", scheduleModel.getScheduleId());
httpPost(Consts.URL + Consts.APP.MessageAction, params, Consts.actionId.resultCode, isShow, "正在加载...");
}
private void listTypePhone(boolean isShow) {
AjaxParams params = new AjaxParams();
params.put("action_flag", "listUserType");
params.put("typeUserId", MemberUserUtils.getUid(getActivity()));
httpPost(Consts.URL + Consts.APP.MessageAction, params, Consts.actionId.resultState, isShow, "正在加载...");
}
MessageAdapter noticeAdapter;
@Override
protected void callBackSuccess(ResponseEntry entry, int actionId) {
super.callBackSuccess(entry, actionId);
switch (actionId) {
case Consts.actionId.resultFlag:
if (null != entry.getData() && !TextUtils.isEmpty(entry.getData())) {
String jsonMsg = entry.getData().substring(1, entry.getData().length() - 1);
UserModel userModel = (UserModel) MemberUserUtils.getBean(getActivity(), "user_messgae");
if (null != jsonMsg && !TextUtils.isEmpty(jsonMsg)) {
list_result.clear();
list_result = mGson.fromJson(entry.getData(), new TypeToken<List<ScheduleModel>>() {
}.getType());
noticeAdapter = new MessageAdapter(getActivity(), list_result, ScheduleFragment.this);
mListMessage.setAdapter(noticeAdapter);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");// 设置日期格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");// 24小时制
long timeChoice;
long nowChoice;
List<String> listCheck = new ArrayList<String>();
for (int i = 0; i < list_result.size(); i++) {
String timeMessage = list_result.get(i).getScheduleTime();
try {
timeChoice = simpleDateFormat.parse(timeMessage).getTime();
nowChoice = simpleDateFormat.parse(df.format(new Date()) + "").getTime();
Log.i("pony_log", "courseTime:" + ((timeChoice - nowChoice) / 1000 / 60) + "");
long courseTime = ((timeChoice - nowChoice) / 1000 / 60);
if (0 < courseTime && courseTime <= 30) {
listCheck.add(list_result.get(i).getScheduleName());
}
} catch (ParseException e) {
e.printStackTrace();
}
}
if (listCheck.size() > 0 && isCheck == false) {
String courseMsg = "";
for (int i = 0; i < listCheck.size(); i++) {
courseMsg = listCheck.get(i) + "," + courseMsg;
}
dialogMsg.Set_Msg("提醒:" + courseMsg.substring(0, courseMsg.length() - 1));
dialogMsg.Show();
isCheck = true;
}
listTypePhone(false);
}
}
break;
case Consts.actionId.resultSix:
if (null != entry.getData() && !TextUtils.isEmpty(entry.getData())) {
String jsonMsg = entry.getData().substring(1, entry.getData().length() - 1);
UserModel userModel = (UserModel) MemberUserUtils.getBean(getActivity(), "user_messgae");
if (null != jsonMsg && !TextUtils.isEmpty(jsonMsg)) {
list_result.clear();
list_result = mGson.fromJson(entry.getData(), new TypeToken<List<ScheduleModel>>() {
}.getType());
noticeAdapter = new MessageAdapter(getActivity(), list_result, ScheduleFragment.this);
mListMessage.setAdapter(noticeAdapter);
}
}
break;
case Consts.actionId.resultCode:
ToastUtil.show(getActivity(), entry.getRepMsg());
list_result.remove(posDelete);
noticeAdapter.notifyDataSetChanged();
break;
case Consts.actionId.resultState:
if (null != entry.getData() && !TextUtils.isEmpty(entry.getData())) {
String jsonMsg = entry.getData().substring(1, entry.getData().length() - 1);
if (null != jsonMsg && !TextUtils.isEmpty(jsonMsg)) {
list_type = mGson.fromJson(entry.getData(), new TypeToken<List<TypeModel>>() {
}.getType());
TypeChoiceAdapter choiceStudentAdapter = new TypeChoiceAdapter(getActivity());
choiceStudentAdapter.setData(list_type);
dialogListMsg.show_listview().setAdapter(choiceStudentAdapter);
} else {
}
}
break;
default:
break;
}
}
@Override
protected void callBackAllFailure(String strMsg, int actionId) {
super.callBackAllFailure(strMsg, actionId);
ToastUtil.show(getActivity(), strMsg);
}
@Override
public void onResume() {
super.onResume();
SchuduleObservable.getInstance().addObserver(ScheduleFragment.this);
}
@Override
public void onDestroy() {
super.onDestroy();
SchuduleObservable.getInstance().deleteObserver(ScheduleFragment.this);
}
private int posDelete;
@Override
public void setDelete(int pos, ScheduleModel scheduleModel) {
posDelete = pos;
deleteSchedule(false, scheduleModel);
}
@Override
public void setUpdate(int pos, ScheduleModel scheduleModel) {
Intent intent = new Intent(getActivity(), UpdateScheduleActivity.class);
intent.putExtra("msg", scheduleModel);
getActivity().startActivity(intent);
}
@Override
public void update(Observable arg0, Object arg1) {
listStudentPhone(false);
}
}
2:类型列表
public class TypeFragment extends BaseFragment implements Observer ,TypeListner {
// 获取view
private View rootView;
// 获取控件
private ListView mListMessage;
View convertView;
private LinearLayout mllNomessage;
private List<TypeModel> list_result = new ArrayList<TypeModel>();
private TextView mtvTipMessage;
private ImageView mivCreateMessage;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_news, null);
initWidget();
initData();
return rootView;
}
@Override
public void initWidget() {
mllNomessage = (LinearLayout) rootView.findViewById(R.id.mllNomessage);
mListMessage = (ListView) rootView.findViewById(R.id.mListMessage);
mtvTipMessage = (TextView) rootView.findViewById(R.id.mtvTipMessage);
mivCreateMessage = (ImageView) rootView.findViewById(R.id.mivCreateMessage);
mivCreateMessage.setOnClickListener(this);
mivCreateMessage.setVisibility(View.VISIBLE);
}
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), CreateTypeActivity.class);
startActivity(intent);
}
@Override
public void initData() {
MessageAction(true);
mListMessage.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
}
});
}
private void MessageAction(boolean isShow) {
AjaxParams params = new AjaxParams();
params.put("action_flag", "listUserType");
params.put("typeUserId", MemberUserUtils.getUid(getActivity()));
httpPost(Consts.URL + Consts.APP.MessageAction, params, Consts.actionId.resultFlag, isShow, "正在加载...");
}
private void deleteType(boolean isShow, TypeModel typeModel) {
AjaxParams params = new AjaxParams();
params.put("action_flag", "deleteType");
params.put("typeId", typeModel.getTypeId());
httpPost(Consts.URL + Consts.APP.MessageAction, params, Consts.actionId.resultCode, isShow, "正在加载...");
}
TypeAdapter memAdapter;
@Override
protected void callBackSuccess(ResponseEntry entry, int actionId) {
super.callBackSuccess(entry, actionId);
switch (actionId) {
case Consts.actionId.resultFlag:
if (null != entry.getData() && !TextUtils.isEmpty(entry.getData())) {
String jsonMsg = entry.getData().substring(1, entry.getData().length() - 1);
if (null != jsonMsg && !TextUtils.isEmpty(jsonMsg)) {
list_result = mGson.fromJson(entry.getData(), new TypeToken<List<TypeModel>>() {
}.getType());
memAdapter = new TypeAdapter(getActivity(), list_result,TypeFragment.this);
mListMessage.setAdapter(memAdapter);
} else {
mllNomessage.setVisibility(View.VISIBLE);
}
}
break;
case Consts.actionId.resultCode:
ToastUtil.show(getActivity(), entry.getRepMsg());
list_result.remove(posDelete);
memAdapter.notifyDataSetChanged();
break;
default:
break;
}
}
@Override
public void onResume() {
super.onResume();
TypeObservable.getInstance().addObserver(TypeFragment.this);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
TypeObservable.getInstance().deleteObserver(TypeFragment.this);
}
@Override
public void update(Observable observable, Object data) {
MessageAction(false);
}
private int posDelete;
@Override
public void setDelete(int pos, TypeModel typeModel) {
posDelete = pos;
deleteType(false, typeModel);
}
@Override
public void setUpdate(int pos, TypeModel typeModel) {
Intent intent = new Intent(getActivity(), UpdateTypeActivity.class);
intent.putExtra("msg", typeModel);
getActivity().startActivity(intent);
}
}
六、浏览更多Android毕业设计
毕业设计-基于android的租房信息发布平台的APP_信息发布app源码_Android毕业设计源码的博客-CSDN博客
毕业设计-基于android选课系统的设计与实现_android学生选课系统_Android毕业设计源码的博客-CSDN博客
毕业设计之校园一卡通管理系统的设计与实现_一卡通管理系统实现_Android毕业设计源码的博客-CSDN博客
基于Android的校园二手闲置物品交易系统设计与实现_基于android的二手交易平台_Android毕业设计源码的博客-CSDN博客
基于androidstudio校园快递APP系统的设计与实现_android studio论文_Android毕业设计源码的博客-CSDN博客
基于android的商城购物定制APP_安卓开发购物app_Android毕业设计源码的博客-CSDN博客
更多毕业设计可以浏览我的个人主页哦!
七、源码下载
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取联系方式👇🏻👇🏻👇🏻