一、需求分析
随着信息经济的发展,许多上班族因工作繁忙导致就餐时间紧凑,而没法享受各种美味。传统的订餐方式过于乏味。而不能满足当今社会快速的生活节凑。然而,把餐饮与互联网结合起来正好解决了这一问题。网上订餐系统对广大顾客提供网上订餐服务,既方便了上班族、游客这些特定群体就餐,又帮助餐饮企业提高服务质量、扩大营业范围,增加知名度等。同时也有利于餐饮企业的管理和售后服务。
网上订餐研究的内容主要是提供饮食信息、优惠信息的浏览和产品的订购、订单确认及付款、产品配送等。顾客可以通过订餐系统实现店铺浏览、饮食资讯浏览、网上预定和付款、送餐服务等;商家(网站管理员)可以实现店铺展示,顾客需求信息管理,发放广告以及对相关信息进行添加、删除、修改和导出等。要使网上订餐系统能够从架构变成能使用。网上订餐系统需要解决的关键问题是实现以下的功能模块,其中包括:
(1)菜单管理:访客登录网上订餐系统进行菜单浏览,对的菜单进行添加、删除和修改。
(2)用户管理:访客注册为会员,会员、系统管理员可以对自己的个人账号信息进行设置、更改。
(3)饭盒管理:(类似购物车)会员可以管理自己的饭盒,如增 、删、改、查。
(4)评论管理:会员可以对菜单进行评价、系统管理员对评论进行管理。
(5)订单管理:系统管理员对订单进行管理,确定订单的生成 。
(6)销售统计管理:日销售统计、月销售统计、导出销售统计数据。
(7)角色管理:超级管理员(软件服务商)管理系统管理员、会员。
本研究课题主要包括了七大模块:菜单管理、用户管理、菜单管理、饭盒管理、评论管理,销售统计管理管理、销售统计管理、角色管理。这七个模块相互独立又存在着一定的联系
二、
系统模块设计
三、 数据字典
数据项是数据库的关系中不可再分的数据单位,下表分别列出了数据的名称、数据类型、长度、取值能否为空。利用mysql建立“网上订餐系统”数据库,其基本表清单及表结构描述如下:
数据库中用到的表:
1、软件服务商(超级管理员admin)
|
|
|
|
admin_id |
varchar(64) |
not null |
ID |
|
varchar(64) |
not null |
超级管理员帐号 |
password |
varchar(64) |
not null |
密码 |
Key |
Varchar(64) |
not null |
验证键 |
2、餐厅设置数据表(RefectorySetting)
|
|
|
|
Refectory_id |
varchar(64) |
not null |
餐馆ID |
subdomain |
varchar(64) |
not null |
餐馆的二级域名 |
|
varchar(64) |
not null |
管理员帐号 |
password |
varchar(64) |
not null |
密码 |
Refectory _name |
varchar(64) |
not null |
餐馆名称 |
Refectory_logo |
varchar(64) |
not null |
餐馆Logo |
Login_IP |
varchar(64) |
null |
登录ip |
iPhone |
varchar(64) |
not null |
联系电话 |
Begin_time |
datetime |
not null |
帐号开通时间 |
Active_time |
varchar(64) |
not null |
帐号有效期 |
Status |
varchar(64) |
null |
帐号状态(冻结、删除、) |
datetime |
null |
上次修改的时间 |
3、会员数据表(user)
|
|
|
|
user_id |
varchar(64) |
not null |
ID |
Refectory_id |
varchar(64) |
not null |
餐馆ID (外键) |
|
varchar(64) |
not null |
会员帐号 |
password |
varchar(64) |
not null |
密码 |
nickname |
varchar(64) |
not null |
昵称 |
iPhone |
varchar(64) |
not null |
联系方式 |
Register_time |
datetime |
not null |
注册时间 |
Active_key |
varchar(64) |
not null |
激活码 |
Active_status |
Integer |
not null |
激活状态 |
Ip |
varchar(64) |
not null |
登录ip |
Login_time |
datetime |
not null |
上一次登录时间 |
4、地址数据表(address)
|
|
|
|
address _id |
varchar(64) |
not null |
ID |
Refectory_id |
varchar(64) |
not null |
餐馆ID (外键) |
userid |
varchar(64) |
not null |
userid(外键) |
address |
varchar(64) |
not null |
送餐地址 |
Tel |
varchar(64) |
not null |
联系方式 |
status |
varchar(64) |
not null |
是否为默认地址 |
remarks |
varchar(64) |
not null |
备注 |
5、菜单数据表(menu)
|
|
|
|
menu _id |
varchar(64) |
not null |
ID |
Refectory_id |
varchar(64) |
not null |
餐馆ID (外键) |
name |
varchar(64) |
not null |
名称 |
image |
varchar(64) |
not null |
图片 |
introduce |
varchar(64) |
not null |
菜单介绍 |
price |
varchar(64) |
not null |
价格 |
User_price |
varchar(64) |
not null |
会员价格 |
classification |
varchar(64) |
not null |
所属类别 |
Add_time |
datetime |
not null |
添加时间 |
Status |
Int |
not null |
是否为推荐菜色 |
PopularNum |
int |
not null |
受欢迎程度 |
appraise |
varchar(64) |
not null |
好评程度(五星) |
6、菜色类别(classification)
|
|
|
|
classification _id |
varchar(64) |
not null |
ID |
Refectory_id |
varchar(64) |
not null |
餐馆ID (外键) |
name |
varchar(64) |
not null |
类别名称 |
7、订单数据表(order)
|
|
|
|
order _id |
varchar(64) |
not null |
ID |
Refectory_id |
varchar(64) |
not null |
餐馆ID (外键) |
userid |
varchar(64) |
not null |
联系人(外键) |
menu _id |
varchar(64) |
not null |
菜单id(外键) |
num |
Int |
not null |
购买数量 |
Price |
Float |
not null |
总价格 |
payment |
Float |
not null |
支付方式 |
|
int |
not null |
订单状态 |
Add_time |
datatime |
not null |
订单下订时间 |
|
Int |
not null |
送餐状态 |
remarks |
varchar(64) |
not null |
备注 |
8、评论管理数据表(commentary)
|
|
|
|
commentary _id |
varchar(64) |
not null |
ID |
Refectory_id |
varchar(64) |
not null |
餐馆ID (外键) |
userid |
varchar(64) |
not null |
联系人(外键) |
menu _id |
varchar(64) |
not null |
菜单id(外键) |
Content |
text |
not null |
评论内容 |
Ip |
varchar(64) |
not null |
评论IP |
|
int |
not null |
审核状态 |
time |
datetime |
not null |
评论时间 |
9、销售统计数据表(sold record)
|
|
|
|
sold _id |
varchar(64) |
not null |
ID |
Refectory_id |
varchar(64) |
not null |
餐馆ID (外键) |
menu _id |
varchar(64) |
not null |
菜单id(外键) |
num |
int |
not null |
销售数量 |
price |
Float |
not null |
单价 |
|
Float |
not null |
金额 |
|
|
|
|
四、部分关键代码:
1、导航分类
部分代码:
/**
* @param request
* @param response
* @return
* 导航分类
*/
@RequestMapping(value="{classificationId}/classifyPage",method={RequestMethod.GET,RequestMethod.POST})
public ModelAndView classifyPage(@PathVariable String classificationId,HttpServletRequest request,HttpServletResponse response){
ModelAndView mav=new ModelAndView();
String refectoryId="refectory";
HttpSession session=request.getSession();
String userId=(String) session.getAttribute("userId");
System.out.println("welcome uid:"+userId);
User user=userService.getUserById(userId);
mav.addObject("user", user);
// 分类导航
ClassificationeExample example4 = new ClassificationeExample();
example4.createCriteria().andRefectoryIdEqualTo(refectoryId);//查询条件
example4.setOrderByClause(" classification_id DESC limit 6 ");
List<Classificatione> classificationes = classificationService.getClassificationList(example4);
mav.addObject("classificationes", classificationes);
int page = ServletRequestUtils.getIntParameter(request, "page", 1); // 第几页
// 分类菜谱
MenuExample menuExample = new MenuExample();
menuExample.createCriteria().andRefectoryIdEqualTo(refectoryId).andClassificationIdEqualTo(classificationId);//查询条件
Pageable pageable = new PageRequest(page, PAGE_SIZE);
Paginator<Menu> paginator = menuService.getClassMenu(menuExample, pageable);
String queryString = "";
mav.addObject("paginator", paginator);
mav.addObject("paginationHtml", paginator.toPaginationHtml(queryString));
mav.setViewName("classifyPage");
return mav;
}
3、菜谱详情:
/**
* @param request
* @param response
* @return
* 菜谱详情
*/
@RequestMapping(value="{menuId}/detailedPage",method={RequestMethod.GET,RequestMethod.POST})
public ModelAndView detailedPage(@PathVariable String menuId, HttpServletRequest request,HttpServletResponse response){
ModelAndView mav=new ModelAndView();
HttpSession session=request.getSession();
String userId=(String) session.getAttribute("userId");
System.out.println("welcome uid:"+userId);
String refectoryId="refectory";
User user=userService.getUserById(userId);
mav.addObject("user", user);
Menu menu=menuService.getMenu(menuId);
mav.addObject("menu", menu);
int page = ServletRequestUtils.getIntParameter(request, "page", 1); // 第几页
CommentaryExample example = new CommentaryExample();
example.createCriteria().andMenuIdEqualTo(menuId).andRefectoryIdEqualTo(refectoryId);
// 分页查询
Pageable pageable = new PageRequest(page, PAGE_SIZE);
Paginator<Commentary> paginator = commentaryService.getAllCommentary(example, pageable);
String queryString = "";
mav.addObject("paginator", paginator);
mav.addObject("paginationHtml", paginator.toPaginationHtml(queryString));
// 分类导航
ClassificationeExample example4 = new ClassificationeExample();
example4.createCriteria().andRefectoryIdEqualTo(refectoryId);//查询条件
example4.setOrderByClause(" classification_id DESC limit 6 ");
List<Classificatione> classificationes = classificationService.getClassificationList(example4);
mav.addObject("classificationes", classificationes);
mav.setViewName("detailedPage");
return mav;
}
2、登录代码:
@RequestMapping(value="/login",method=RequestMethod.POST)
public ModelAndView loginPost(HttpServletRequest request){
String email=ServletRequestUtils.getStringParameter(request, "email","");
String password=ServletRequestUtils.getStringParameter(request, "password","");
ModelAndView mav=new ModelAndView();
RefectorysettingExample example=new RefectorysettingExample();
example.createCriteria().andEmailEqualTo(email);
List<Refectorysetting> list=refectorysettingService.getRefectorySetting(example);
Refectorysetting refectorysetting=new Refectorysetting();
if(list.size()>0){
//存在有该账号
refectorysetting=list.get(0);
if(password.equals(refectorysetting.getPassword())){
//密码正确
if(refectorysetting.getStatus()==1){
//该账号状态可用
Date currentTime = new Date();//当前时间
if(currentTime.before(refectorysetting.getActiveTime())){
refectorysetting.setLoginip("112.113.45.67");
refectorysettingService.updataRefectory(refectorysetting);
mav.setView(new RedirectView("home"));
HttpSession session = request.getSession();//创建session
session.setAttribute("refectoryId", refectorysetting.getRefectoryId());//存值
return mav;
}else{
//账号已过期,开始进行冻结
refectorysetting.setStatus(0);
refectorysetting.setLoginip("112.113.45.67");
refectorysettingService.updataRefectory(refectorysetting);
mav.addObject("result", "账号已到期");
mav.setViewName("manager/loginFailed");
return mav;
}
}else{
System.out.println("该账号已被冻结");
mav.addObject("result", "该账号已被冻结");
mav.setViewName("manager/loginFailed");
return mav;
}
}else{
System.out.println("密码错误");
mav.addObject("result", "密码错误");
mav.setViewName("manager/loginFailed");
return mav;
}
}else{
System.out.println("没有该账号");
mav.addObject("result", "没有该账号");
mav.setViewName("manager/loginFailed");
return mav;
}
}
销售数据统计:
// 日期格式化
private static final DateFormat DF = new SimpleDateFormat("yyyy-MM-dd");
@RequestMapping(value="/home",method={RequestMethod.POST,RequestMethod.GET})
public ModelAndView managerhome(HttpServletRequest request){
ModelAndView mav=new ModelAndView();
HttpSession session=request.getSession();
String refectoryId=(String) session.getAttribute("refectoryId");
if(refectoryId==null){
refectoryId="";
}
Refectorysetting refectorysetting=refectorysettingService.getOneRefectorySetting(refectoryId);
mav.addObject("refectorysetting", refectorysetting);
// 预定义日期区间
Date startDate = new Date();
Date endDate = new Date();
String dateRange = ServletRequestUtils.getStringParameter(request, "dateRange", "thisWeek");
if ("thisWeek".equals(dateRange)) {
startDate = MenuDateUtil.getThisWeekStart();
endDate = MenuDateUtil.getThisWeekEnd();
} else if ("lastWeek".equals(dateRange)) {
startDate = MenuDateUtil.getLastWeekStart();
endDate = MenuDateUtil.getLastWeekEnd();
} else if ("thisMonth".equals(dateRange)) {
startDate = MenuDateUtil.getThisMonthStart();
endDate = MenuDateUtil.getThisMonthEnd();
} else if ("lastMonth".equals(dateRange)) {
startDate = MenuDateUtil.getLastMonthStart();
endDate = MenuDateUtil.getLastMonthEnd();
}else if ("today".equals(dateRange)) {
startDate = MenuDateUtil.getTodayStart();
endDate = MenuDateUtil.getTodayEnd();
}else if ("yesterday".equals(dateRange)) {
startDate = MenuDateUtil.getYesterdayStart();
endDate = MenuDateUtil.getYesterdayEnd();
}
OrderformExample example=new OrderformExample();
OrderformExample.Criteria criteria= example.createCriteria().andRefectoryIdEqualTo(refectoryId);
criteria.andAddTimeGreaterThanOrEqualTo(startDate);
criteria.andAddTimeLessThanOrEqualTo(endDate);
List<Orderform> list=orderService.getOrderList(example);
System.out.println("--------"+list.size());
Map<String,Integer> data=new HashMap<String, Integer>();
Map<String,String> categories=new HashMap<String, String>();
if(list.size()>0){
for (int i=0;i<list.size();i++) {
Orderform order=list.get(i);
String menuid=order.getMenuId();
if(data.containsKey(menuid)){
Integer value=data.get(menuid);
Integer num=order.getNumber();
data.put(menuid, value+num);
}else{
Integer num=order.getNumber();
data.put(menuid, num);
}
if(categories.containsKey(menuid)){
String name=order.getMenuname();
categories.put(menuid, name);
}else{
String name=order.getMenuname();
categories.put(menuid, name);
}
}
}
List<Integer> data2=new ArrayList<Integer>();
List<String> categories2=new ArrayList<String>();
Iterator<Entry<String, Integer>> iter = data.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Integer> entry = iter.next();
data2.add(entry.getValue());
}
Iterator<Entry<String, String>> iter2 = categories.entrySet().iterator();
while (iter2.hasNext()) {
Map.Entry<String, String> entry = iter2.next();
categories2.add(entry.getValue());
}
mav.addObject("data", JSONArray.fromObject(data2).toString());
mav.addObject("categories", JSONArray.fromObject(categories2).toString());
mav.addObject("dateRange", dateRange);
mav.setViewName("manager/home");
System.out.println("manage");
return mav;
}
四、 运行效果图
1、系统首页:
2、注册页面
3、个人主页页面
4、饭盒管理页面
5、后台首页
1、后台登录界面:
2、后台首页界面
3、评论管理界面
4、菜谱修改页面