博主介绍:本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮助到您;
🍅文章末尾获取源码下载方式🍅
一、项目功能介绍
Android客户端功能描述:
1:登录注册:用户可以通过自己的信息进行账号的注册
2:商家查看:查看发布的外卖商家信息
3:商家详情:用户点击某一个商家之后可以查看商家的地址和联系方式信息
4:外卖分类:用户在点餐的详情页面可以根据分类信息进行美食的选择;
5:订单支付:用户选择完美食之后可以查看自己选择的信息,以及对美食信息进行支付
6:我的订单:用户可以查看自己的订单信息;
7:个人信息:用户登录之后可以查看用户的基本资料以及对密码信息进行修改
后台服务端功能描述:
1:用户管理:可以查看注册的用户信息
2:订单信息:查看用户的订单信息
3:商家信息:添加商家信息以及对商家信息进行查看
二、运行环境
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接口的编写以及以及数据的回调
四、运行截图信息
说明:后台信息管理界面
说明:用户登录之后的首页界面,也就是商家的列表界面,点击之后可以查看详情的信息界面;
说明:个人信息界面,可以查看用户的信息,我的订单,修改密码信息;
说明:用点餐界面,用户在此界面可以根据分类点餐,也可以选择美食的数量信息,选择完之后可以进行美食的支付操作;
说明:订单信息确认界面;
说明:我的订单界面,可以查看自己的历史订单信息;
四、部分代码
1:商家列表
public class StoreFragment extends BaseFragment {// 获取view
private View rootView;
// 获取控件
private ListView mListMessage;
List<TypeModel> list_result = new ArrayList<TypeModel>();
MaterialRefreshLayout materialRefreshLayout;
private boolean isPrepared;@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_newsload, null);
isPrepared = true;
// setlazyLoad();
initWidget();
initData();
return rootView;
}/**
* 加载数据的方法,只要保证isPrepared和isVisible都为true的时候才往下执行开始加载数据
*/
@Override
protected void setlazyLoad() {
super.setlazyLoad();if (!isPrepared || !isVisible) {
return;
}
if (list_result.size() == 0) {
initWidget();
initData();
}
}
@Override
public void initWidget() {mListMessage = (ListView) rootView.findViewById(R.id.mListMessage);
materialRefreshLayout = (MaterialRefreshLayout) rootView.findViewById(R.id.refresh);
materialRefreshLayout.setLoadMore(false);
materialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
@Override
public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
CampusAction(false);
materialRefreshLayout.finishRefresh();
}
@Override
public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
//上拉加载更多...
// 结束上拉刷新...
materialRefreshLayout.finishRefreshLoadMore();
}
});
}@Override
public void onClick(View v) {}
@Override
public void initData() {
CampusAction(true);
mListMessage.setOnItemClickListener(new OnItemClickListener() {@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {Intent intent = new Intent(getActivity(), LookStoreActivity.class);
intent.putExtra("msg",list_result.get(pos));
startActivity(intent);
}
});}
private void CampusAction(boolean isShow) {
AjaxParams params = new AjaxParams();
params.put("action_flag", "listTypePhone");
httpPost(Consts.URL + Consts.APP.FoodAction, params, Consts.actionId.resultCode, isShow, "正在加载...");
}
@Override
protected void callBackSuccess(ResponseEntry entry, int actionId) {
super.callBackSuccess(entry, actionId);switch (actionId) {
case Consts.actionId.resultCode:
materialRefreshLayout.finishRefresh();
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());
StorListAdapter campusAdapter = new StorListAdapter(getActivity(), list_result);
mListMessage.setAdapter(campusAdapter);
} else {
}
}
break;
default:
break;
}}
@Override
protected void callBackAllFailure(String strMsg, int actionId) {
super.callBackAllFailure(strMsg, actionId);
ToastUtil.show(getActivity(), strMsg);}
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();}
}
2:美食列表
public class FoodFragment extends BaseFragment implements FoodAddListner {MainModel mainModel;
private List<FoodModel> listMsgSearch = new ArrayList<FoodModel>();
// 获取view
private View rootView;
// 获取控件
private ListView mListMessage;private ListView mListChoiceMessage;
private CheckBox mllType;
private List<TypeModel> list_result_type = new ArrayList<TypeModel>();
private boolean isPrepared;// 预加载标志private TextView mtvFoodNumber;
private LinearLayout mllGoBuy;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_selected, null);
isPrepared = true;
setlazyLoad();
return rootView;
}/**
* 加载数据的方法,只要保证isPrepared和isVisible都为true的时候才往下执行开始加载数据
*/
@Override
protected void setlazyLoad() {
super.setlazyLoad();if (!isPrepared || !isVisible) {
return;
}
if (listFood.size() == 0) {
initWidget();
initData();
}
}@Override
public void initWidget() {
mListChoiceMessage = (ListView) rootView.findViewById(R.id.mListChoiceMessage);
mllType = (CheckBox) rootView.findViewById(R.id.mllType);
mListMessage = (ListView) rootView.findViewById(R.id.mListMessage);
mtvFoodNumber = (TextView) rootView.findViewById(R.id.mtvFoodNumber);mllGoBuy = (LinearLayout) rootView.findViewById(R.id.mllGoBuy);
mllGoBuy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {Intent intent = new Intent(getActivity(),PayMessageActivity.class);
intent.putExtra("msg",(Serializable) list_result_choice);
intent.putExtra("payMoney",shopMoneyPrice+"");
getActivity().startActivity(intent);
}
});}
@Override
public void onClick(View v) {
}
@Override
public void initData() {TypeModel type = new TypeModel();
type.setTypeId("-1");
type.setTypeId("-1");
type.setTypeId("-1");
mllType.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {ChoiceMessageAdapter choiceMessageAdapter = new ChoiceMessageAdapter(getActivity(), list_result_type);
mListChoiceMessage.setAdapter(choiceMessageAdapter);if (arg1) {
mListChoiceMessage.setVisibility(View.VISIBLE);
} else {
mListChoiceMessage.setVisibility(View.GONE);
}
}
});listPhoneMessage(false);
}
private void listPhoneMessage(boolean isShow) {
AjaxParams params = new AjaxParams();
params.put("action_flag", "listPhoneMessage");
httpPost(Consts.URL + Consts.APP.FoodAction, params, Consts.actionId.resultFlag, isShow, "正在加载...");
}private List<FoodModel> listFood = new ArrayList<FoodModel>();
FoodChocieListAdapter lookListAdapter;
@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)) {
mainModel = mGson.fromJson(entry.getData(), MainModel.class);
list_result_type = mainModel.getFlagTop();
listFood = mainModel.getFlagFood();
lookListAdapter= new FoodChocieListAdapter(getActivity(), listFood, this);
mListMessage.setAdapter(lookListAdapter);
}
}
break;
}}
@Override
protected void callBackAllFailure(String strMsg, int actionId) {
super.callBackAllFailure(strMsg, actionId);
ToastUtil.show(getActivity(), strMsg);}
private FoodModel foodModelAdapter;
@Override
public void setJian(int pos, FoodModel carModel) {
Log.i("pony_log:", pos + "");
carModel.setTotalNumber(carModel.getTotalNumber() - 1);
listFood.set(pos, carModel);
lookListAdapter.notifyDataSetChanged();
TotalMoney();
}@Override
public void setJia(int pos, FoodModel carModel) {
Log.i("pony_log:", pos + "");
carModel.setTotalNumber(carModel.getTotalNumber() + 1);
listFood.set(pos, carModel);
lookListAdapter.notifyDataSetChanged();
TotalMoney();
}
private List<FoodModel> list_result_choice = new ArrayList<FoodModel>();Double shopMoneyPrice ;
private void TotalMoney() {
shopMoneyPrice = 0.0;
list_result_choice.clear();
for (int i = 0; i < listFood.size(); i++) {
shopMoneyPrice = shopMoneyPrice + (Double.valueOf(listFood.get(i).getfMoney()) * listFood.get(i).getTotalNumber());
if (listFood.get(i).getTotalNumber()>0) {
list_result_choice.add(listFood.get(i));
}
}
mtvFoodNumber.setText(shopMoneyPrice + "元");
}
}
五、数据库设计
/*
Navicat MySQL Data TransferSource Server : mydata
Source Server Version : 50528
Source Host : localhost:3306
Source Database : takeawayTarget Server Type : MYSQL
Target Server Version : 50528
File Encoding : 65001Date: 2023-02-23 16:24:17
*/SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for classifytb
-- ----------------------------
DROP TABLE IF EXISTS `classifytb`;
CREATE TABLE `classifytb` (
`classifyId` int(11) NOT NULL AUTO_INCREMENT,
`classifyTypeId` int(11) DEFAULT NULL,
`classifyName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`classifyId`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of classifytb
-- ----------------------------
INSERT INTO `classifytb` VALUES ('1', '15', '人气必买');
INSERT INTO `classifytb` VALUES ('2', '15', '清爽果茶');
INSERT INTO `classifytb` VALUES ('3', '15', '现煮奶茶');
INSERT INTO `classifytb` VALUES ('4', '15', '零食小吃');
INSERT INTO `classifytb` VALUES ('5', '15', '大单划算');-- ----------------------------
-- Table structure for foodmsg
-- ----------------------------
DROP TABLE IF EXISTS `foodmsg`;
CREATE TABLE `foodmsg` (
`fid` int(50) NOT NULL AUTO_INCREMENT,
`fTitle` varchar(100) NOT NULL,
`fTyeId` varchar(100) DEFAULT NULL,
`fTyeName` varchar(255) DEFAULT NULL,
`fMoney` varchar(255) DEFAULT NULL,
`fTopState` varchar(255) DEFAULT NULL,
`fImage` varchar(100) NOT NULL,
`fStoreId` int(11) DEFAULT NULL,
PRIMARY KEY (`fid`)
) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of foodmsg
-- ------------------------------ ----------------------------
-- Table structure for ordertb
-- ----------------------------
DROP TABLE IF EXISTS `ordertb`;
CREATE TABLE `ordertb` (
`orderId` int(11) NOT NULL AUTO_INCREMENT,
`orderMessageId` varchar(255) DEFAULT NULL,
`orderMessageInfor` varchar(255) DEFAULT NULL,
`orderMessageMoney` varchar(255) DEFAULT NULL,
`tableMessage` varchar(255) DEFAULT NULL,
`orderUserId` varchar(11) DEFAULT NULL,
`orderUserName` varchar(255) DEFAULT NULL,
`orderTime` varchar(100) DEFAULT NULL,
PRIMARY KEY (`orderId`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of ordertb
-- ----------------------------
-- ----------------------------
-- Table structure for typemsg
-- ----------------------------
DROP TABLE IF EXISTS `typemsg`;
CREATE TABLE `typemsg` (
`typeId` int(50) NOT NULL AUTO_INCREMENT,
`typeName` varchar(255) DEFAULT NULL,
`typePhone` varchar(100) DEFAULT NULL,
`typeAddress` varchar(255) DEFAULT NULL,
`typeImage` varchar(255) DEFAULT NULL,
PRIMARY KEY (`typeId`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of typemsg
-- ------------------------------ ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` int(50) NOT NULL AUTO_INCREMENT,
`uname` varchar(100) NOT NULL,
`uphone` varchar(100) NOT NULL,
`upswd` varchar(100) NOT NULL,
`utime` varchar(100) NOT NULL,
`uaddress` varchar(255) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of user
-- ----------------------------
六、浏览更多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博客文章来源:https://www.toymoban.com/news/detail-460069.html
七、下载源码
https://download.csdn.net/download/u014388322/88150982文章来源地址https://www.toymoban.com/news/detail-460069.html
到了这里,关于基于Android的校园外卖系统app的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!