《网上订餐系统》开发全程回忆

  • Post author:
  • Post category:其他



一、需求分析

随着信息经济的发展,许多上班族因工作繁忙导致就餐时间紧凑,而没法享受各种美味。传统的订餐方式过于乏味。而不能满足当今社会快速的生活节凑。然而,把餐饮与互联网结合起来正好解决了这一问题。网上订餐系统对广大顾客提供网上订餐服务,既方便了上班族、游客这些特定群体就餐,又帮助餐饮企业提高服务质量、扩大营业范围,增加知名度等。同时也有利于餐饮企业的管理和售后服务。

网上订餐研究的内容主要是提供饮食信息、优惠信息的浏览和产品的订购、订单确认及付款、产品配送等。顾客可以通过订餐系统实现店铺浏览、饮食资讯浏览、网上预定和付款、送餐服务等;商家(网站管理员)可以实现店铺展示,顾客需求信息管理,发放广告以及对相关信息进行添加、删除、修改和导出等。要使网上订餐系统能够从架构变成能使用。网上订餐系统需要解决的关键问题是实现以下的功能模块,其中包括:

(1)菜单管理:访客登录网上订餐系统进行菜单浏览,对的菜单进行添加、删除和修改。

(2)用户管理:访客注册为会员,会员、系统管理员可以对自己的个人账号信息进行设置、更改。

(3)饭盒管理:(类似购物车)会员可以管理自己的饭盒,如增 、删、改、查。

(4)评论管理:会员可以对菜单进行评价、系统管理员对评论进行管理。

(5)订单管理:系统管理员对订单进行管理,确定订单的生成 。

(6)销售统计管理:日销售统计、月销售统计、导出销售统计数据。

(7)角色管理:超级管理员(软件服务商)管理系统管理员、会员。

本研究课题主要包括了七大模块:菜单管理、用户管理、菜单管理、饭盒管理、评论管理,销售统计管理管理、销售统计管理、角色管理。这七个模块相互独立又存在着一定的联系


二、

系统模块设计



三、 数据字典

数据项是数据库的关系中不可再分的数据单位,下表分别列出了数据的名称、数据类型、长度、取值能否为空。利用mysql建立“网上订餐系统”数据库,其基本表清单及表结构描述如下:

数据库中用到的表:

1、软件服务商(超级管理员admin)


字段


类型


约束


说明

admin_id

varchar(64)

not null

ID

email

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

餐馆的二级域名

Email

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

帐号状态(冻结、删除、)




last_modified

datetime

null

上次修改的时间

3、会员数据表(user)


字段


类型


约束


说明

user_id

varchar(64)

not null

ID

Refectory_id

varchar(64)

not null

餐馆ID (外键)

email

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

支付方式


order _Status

int

not null

订单状态

Add_time

datatime

not null

订单下订时间


Send_Status

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


Auditing _Status

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

单价


Sum

Float

not null

金额


time


datetime


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、菜谱修改页面