首页 > 学院 > 开发设计 > 正文

第24天(就业班) 餐馆王项目需求(一)

2019-11-08 03:00:16
字体:
来源:转载
供稿:网友

1.项目需求分析

javaWeb增强:

    过滤器、监听器、国际化、文件上传与下载、JavaMail邮件开发

回顾项目开发设计模式之mvc模式:

    M  model   模型层   【entity/dao/service】

    V   view    视图层   【jsp/html…】

    C   control  控制器    【servlet】

优缺点:

    每一层各司其职! 更容易更换具体的实现,而对其他层代码影响较小!

目标:

    1. 掌握mvc开发模式

    2. 需求分析

       《需求分析说明书.doc》

    3. 设计数据库

       每一组用同一个数据库。

    4. 编码

       组长:分配任务,每个人要做什么 (项目计划)

项目开发生命周期

软件项目开发模式:

    螺旋开发模式

       适合于项目前期部分需求不确定的情况, 对于每一个模块一个个开发:分析、设计、编码、测试、上线; 

       好处: 降低软件风险! (做出的产品要尽量满足客户需求!)

    瀑布模式:

       先进行所有模块的需求分析,当分析结束后,才进入项目下一个阶段, 即设计、编码、测试、上线;

       好处: 更容易进行项目把控,即项目质量控制!

需求分析:

软件工程师: 了解需求的途径?

    1. 需求文档

    2. 项目经理

    3. 项目的系统原型 (美工设计师)

    4. 客户

“餐馆王”系统功能:

  1. 餐桌模块

  2. 菜类别模块(菜系)

  3. 菜信息    (菜品)

  4. 订单

详细分析:

    1. 后台录入的餐桌, 要在前台首页显示; 且只显示未预定

    2. 后台录入的菜类别, 在前台主页显示

    3. 后台录入的菜信息,在前台主页显示

    4. 前台生成订单后,在后台显示订单详细

2.数据库设计

-- 创建数据库

CREATE DATABASE hotel CHARACTER SET utf8;USE hotel;-- 1. 餐桌表CREATE TABLE dinnerTable(   id INT PRIMARY KEY AUTO_INCREMENT,  -- 餐桌主键   tableName VARCHAR(20),	       -- 餐桌名   tableStatus INT DEFAULT 0,          -- 餐桌状态:0,空闲; 1,预定   orderDate DATETIME);-- 2.菜类别表CREATE TABLE foodType(	id INT PRIMARY KEY AUTO_INCREMENT, -- 类别主键	typeName VARCHAR(20));-- 3. 菜品种表CREATE TABLE food(  id INT PRIMARY KEY AUTO_INCREMENT,  -- 主键  foodName VARCHAR(20),		      -- 菜名称  foodType_id INT,		      -- 所属菜系, 外键字段  price DOUBLE,			      -- 价格  mprice DOUBLE,		      -- 会员价格  remark VARCHAR(200),		      -- 简介  img VARCHAR(100) 		      -- 图片);-- 4. 订单表      (订单基本信息)CREATE TABLE orders(   id INT PRIMARY KEY AUTO_INCREMENT,  -- 主键   table_id INT,		       -- 外键: 餐桌编号   orderDate DATETIME,		       -- 下单日期   totalPrice DOUBLE,		       -- 订单所有菜需要的总金额   orderStatus INT DEFAULT 0           -- 订单状态: 0,未结账; 1,已结账);-- 5. 订单明细表  (主要是菜品种)CREATE TABLE orderDetail(   id INT PRIMARY KEY AUTO_INCREMENT,  -- 主键   orderId INT,			       -- 外键:引入的是订单表的主键   food_id INT,			       -- 外键:引用的是菜信息表的主键   foodCount INT                       -- 菜的数量   );-- 添加菜品与菜类别的关系约束ALTER TABLE food ADD CONSTRAINT fk_food_foodType_id FOREIGN KEY(foodType_id) REFERENCES foodType(id);-- 订单表: 与餐桌表的关系ALTER TABLE orders ADD CONSTRAINT order_table_id FOREIGN KEY(table_id) REFERENCES dinnertable(id);-- 订单明细: 与订单表的关系ALTER TABLE orderDetail ADD CONSTRAINT orderDetail_order_id FOREIGN KEY(orderId) REFERENCES orders(id);-- 订单明细: 与菜信息的关系ALTER TABLE orderDetail ADD CONSTRAINT orderDetail_food_id FOREIGN KEY(food_id) REFERENCES food(id);

系统设计

开源组件及jar文件:

    数据库驱动包(1个)

    C3P0连接池包(2 个)

    DbUtils组件 (1个)

    BeanUtils组件(2个)

    FileUpload组件(2个)

配置

    C3p0配置文件

分层:

    Entity/dao/service/servlet

3.页面显示如图

4.编码如下package com.xp.utils;import javax.sql.DataSource;import org.apache.commons.dbutils.QueryRunner;import com.mchange.v2.c3p0.ComboPooledDataSource;/** * 封装jdbc常用的操作 * @author xiongpan * 2017年2月16日 */public class JdbcUtils {	// 初始化连接池	private static DataSource dataSource;	static {		dataSource = new ComboPooledDataSource();	}	public static DataSource getDataSource() {		return dataSource;	}	/**	 * 创建DbUtils常用工具类对象	 */	public static QueryRunner getQuerrRunner() {		return new QueryRunner(dataSource);	}}<c3p0-config>  <default-config>     <property name="driverClass">com.MySQL.jdbc.Driver</property>      <property name="jdbcUrl">jdbc:mysql:///hotel</property>      <property name="user">root</property>      <property name="passWord">xiongpan</property>      <property name="initialPoolSize">5</property>      <property name="maxPoolSize">10</property>   </default-config>  <named-config name="OracleConfig">    <property name="driverClass">com.mysql.jdbc.Driver</property>      <property name="jdbcUrl">jdbc:mysql:///hotel</property>      <property name="user">root</property>      <property name="password">xiongpan</property>      <property name="initialPoolSize">5</property>      <property name="maxPoolSize">10</property>    </named-config></c3p0-config>package com.xp.entity;/** * 1.菜系模块,实体类设计 * @author xiongpan * 2017年2月16日 */public class FoodType {	private int id;//类别主键	private String typeName;//类别名称	public int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	public String getTypeName() {		return typeName;	}	public void setTypeName(String typeName) {		this.typeName = typeName;	}}package com.xp.dao;import java.util.List;import com.xp.entity.FoodType;/** * 菜系模块,dao接口设计 * @author xiongpan */public interface IFoodTypeDao {	/**	 * 添加	 */	void save(FoodType foodType);	/**	 * 更新	 */	void update(FoodType foodType);	/**	 * 删除	 */	void delete(int id);	/**	 * 根据主键查询	 */	FoodType findById(int id);	/**	 * 查询全部菜谱	 */	List<FoodType> getAll();	/**	 * 按照菜系名称查询	 */	List<FoodType> getAll(String typeName);}package com.xp.dao.impl;import java.util.List;import org.apache.commons.dbutils.handlers.BeanHandler;import org.apache.commons.dbutils.handlers.BeanListHandler;import com.xp.dao.IFoodTypeDao;import com.xp.entity.FoodType;import com.xp.utils.JdbcUtils;public class FoodTypeDao implements IFoodTypeDao {	@Override	public void delete(int id) {		String sql = "delete from foodType where id=?";		try {			JdbcUtils.getQuerrRunner().update(sql, id);		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public FoodType findById(int id) {		String sql = "select * from foodType where id=?";		try {			return JdbcUtils.getQuerrRunner().query(sql, new BeanHandler<FoodType>(FoodType.class), id);		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public List<FoodType> getAll() {		String sql = "select * from foodType";		try {			return JdbcUtils.getQuerrRunner().query(sql, new BeanListHandler<FoodType>(FoodType.class));		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public List<FoodType> getAll(String typeName) {		String sql = "select * from foodType where typeName like ?";		try {			return JdbcUtils.getQuerrRunner()				.query(sql, new BeanListHandler<FoodType>(FoodType.class),"%" + typeName + "%");		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public void save(FoodType foodType) {		String sql = "INSERT INTO foodType(typeName) VALUES(?);";		try {			JdbcUtils.getQuerrRunner().update(sql,foodType.getTypeName());		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public void update(FoodType foodType) {		String sql = "update foodType set typeName=? where id=?";		try {			JdbcUtils.getQuerrRunner().update(sql, foodType.getTypeName(),foodType.getId());		} catch (Exception e) {			throw new RuntimeException(e);		}	}}package com.xp.service;import java.util.List;import com.xp.entity.FoodType;public interface IFoodTypeService {	/**	 * 添加	 */	void save(FoodType foodType);		/**	 * 更新	 */	void update(FoodType foodType);		/**	 * 删除	 */	void delete(int id);	/**	 * 根据主键查询	 */	FoodType findById(int id);		/**	 * 查询全部	 */	List<FoodType> getAll();		/**	 * 根据菜系名称查询	 */	List<FoodType> getAll(String typeName);}package com.xp.factory;import java.util.ResourceBundle;/*** 工厂:创建dao或service实例*/public class BeanFactory {		// 加载配置文件	private static ResourceBundle bundle;	static {		bundle = ResourceBundle.getBundle("instance");	}	/**	 * 根据指定的key,读取配置文件获取类的全路径; 创建对象	 * @return	 */	public static <T> T getInstance(String key,Class<T> clazz) {		String className = bundle.getString(key);		try {			return (T) Class.forName(className).newInstance();		} catch (Exception e) {			throw new RuntimeException(e);		}	}}package com.xp.service.impl;import java.util.List;import com.xp.dao.IFoodTypeDao;import com.xp.entity.FoodType;import com.xp.factory.BeanFactory;import com.xp.service.IFoodTypeService;public class FoodTypeService implements IFoodTypeService {		//private IFoodTypeDao foodTypeDao = new FoodTypeDao();// 对象的创建,不能写死。		// 工厂创建对象		private IFoodTypeDao foodTypeDao = BeanFactory.getInstance("foodtypeDao", IFoodTypeDao.class);	@Override	public void save(FoodType foodType) {		try {			foodTypeDao.save(foodType);		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public void update(FoodType foodType) {		try {			foodTypeDao.update(foodType);		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public void delete(int id) {		try {			foodTypeDao.delete(id);		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public FoodType findById(int id) {		try {			return foodTypeDao.findById(id);		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public List<FoodType> getAll() {		try {			return foodTypeDao.getAll();		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public List<FoodType> getAll(String typeName) {		try {			return foodTypeDao.getAll(typeName);		} catch (Exception e) {			throw new RuntimeException(e);		}	}}Instance.properties#  dao  instancefoodtypeDao = com.xp.dao.impl.FoodTypeDao#  service instance foodTypeService =com.xp.service.impl.FoodTypeServicepackage com.xp.servlet;import java.io.IOException;import java.util.List;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.xp.entity.FoodType;import com.xp.factory.BeanFactory;import com.xp.service.IFoodTypeService;/** * 4. 菜系管理Servlet开发 * a. 添加菜系  * b. 菜系列表展示 * c. 进入更新页面 * d. 删除 * e. 更新 */public class FoodTypeServlet extends HttpServlet {	private static final long serialVersionUID = 1L;	// 调用的菜系Service		private IFoodTypeService foodTypeService = BeanFactory.getInstance("foodTypeService",IFoodTypeService.class);		// 跳转资源		private Object uri;		public void doGet(HttpServletRequest request, HttpServletResponse response)				throws ServletException, IOException {			// 设置编码			request.setCharacterEncoding("UTF-8");			response.setContentType("text/html;charset=UTF-8");						// 获取操作的类型			String method = request.getParameter("method");			// 判断			if ("addFoodType".equals(method)) {				// 添加				addFoodType(request, response);			}			else if ("list".equals(method)) {				// 列表展示				list(request, response);			}						else if ("viewUpdate".equals(method)) {				// 进入更新页面				viewUpdate(request, response);			}						else if ("delete".equals(method)) {				// 删除				delete(request, response);			}						else if ("update".equals(method)) {				// 更新				update(request, response);			}		}				//a. 添加菜系		public void addFoodType(HttpServletRequest request, HttpServletResponse response)				throws ServletException, IOException {						try {				// 1. 获取请求数据封装				String foodTypeName = request.getParameter("foodTypeName");				FoodType ft = new FoodType();				ft.setTypeName(foodTypeName);								// 2. 调用service处理业务逻辑				foodTypeService.save(ft);								// 3. 跳转				uri = request.getRequestDispatcher("/foodType?method=list");			} catch (Exception e) {				e.printStackTrace();				uri = "/error/error.jsp";			}						goTo(request, response, uri);									}		//b. 菜系列表展示		public void list(HttpServletRequest request, HttpServletResponse response)				throws ServletException, IOException {						try {				// 调用Service查询所有的类别				List<FoodType> list = foodTypeService.getAll();				// 保存				request.setAttribute("listFoodType", list);				// 跳转的菜系列表页面				uri = request.getRequestDispatcher("/sys/type/foodtype_list.jsp");			} catch (Exception e) {				e.printStackTrace();				uri = "/error/error.jsp";			}						// 跳转			goTo(request, response, uri);		}		//c. 进入更新页面		public void viewUpdate(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {			try {				// 1. 获取请求id				String id = request.getParameter("id");				// 2. 根据id查询对象				FoodType ft = foodTypeService.findById(Integer.parseInt(id));				// 3. 保存				request.setAttribute("foodType", ft);				// 4. 跳转				uri = request.getRequestDispatcher("/sys/type/foodtype_update.jsp");			} catch (Exception e) {				e.printStackTrace();				uri = "/error/error.jsp";			}						goTo(request, response, uri);		}				//d. 删除		public void delete(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {						try {				// 1. 获取请求id				String id = request.getParameter("id");				// 2. 调用Service				foodTypeService.delete(Integer.parseInt(id));				// 3. 跳转				uri = "/foodType?method=list";			} catch (Exception e) {				e.printStackTrace();				uri = "/error/error.jsp";			}						goTo(request, response, uri);		}				// e. 更新		public void update(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {						try {				//1. 获取请求数据封装				int id = Integer.parseInt(request.getParameter("id"));				String name = request.getParameter("foodTypeName");				FoodType foodType = new FoodType();				foodType.setId(id);				foodType.setTypeName(name);								//2. 调用Service更新				foodTypeService.update(foodType);				//3. 跳转				//list(request,response);				uri = "/foodType?method=list";			} catch (Exception e) {				e.printStackTrace();				uri = "/error/error.jsp";			}						// 跳转			goTo(request, response, uri);		}		/**		 * 跳转的通用方法		 */		private void goTo(HttpServletRequest request, HttpServletResponse response, Object uri)				throws ServletException, IOException {			if (uri instanceof RequestDispatcher){				((RequestDispatcher)uri).forward(request, response);			} else if (uri instanceof String) {				response.sendRedirect(request.getContextPath() + uri);			} 		}				public void doPost(HttpServletRequest request, HttpServletResponse response)				throws ServletException, IOException {			this.doGet(request, response);		}	}<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>	<!-- 包含公共的JSP代码片段 --><title>无线点餐平台</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/Javascript" src="${pageContext.request.contextPath }/sys/style/js/jquery.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/sys/style/js/page_common.js"></script><link href="${pageContext.request.contextPath }/sys/style/CSS/common_style_blue.css" rel="stylesheet" type="text/css"><link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/sys/style/css/index_1.css" /></head><body>	<!-- 页面标题 -->	<div id="TitleArea">		<div id="TitleArea_Head"></div>		<div id="TitleArea_Title">			<div id="TitleArea_Title_Content">				<img border="0" width="13" height="13"					src="${pageContext.request.contextPath }/sys/style/images/title_arrow.gif" /> 菜系列表			</div>		</div>		<div id="TitleArea_End"></div>	</div>	<!-- 过滤条件 -->	<div id="QueryArea">		<form action="/wirelessplatform/cuisine.html" method="get">			<input type="hidden" name="method" value="search">			<input type="text" name="keyword" title="请输入菜系名称">			<input type="submit" value="搜索">		</form>	</div>	<!-- 主内容区域(数据列表或表单显示) -->	<div id="MainArea">		<table class="MainArea_Content" align="center" cellspacing="0" cellpadding="0">			<!-- 表头-->			<thead>				<tr align="center" valign="middle" id="TableTitle">					<td>菜系编号</td>					<td>菜系名称</td>					<td>操作</td>				</tr>			</thead>			<!--显示数据列表 -->			<tbody id="TableData">					<c:choose>						<c:when test="${not empty requestScope.listFoodType}">														<c:forEach var="foodType" items="${requestScope.listFoodType}">								<tr>									<td>${foodType.id }</td>									<td>${foodType.typeName }</td>									<td>										<a href="${pageContext.request.contextPath }/foodType?id=${foodType.id}&method=viewUpdate" class="FunctionButton">更新</a> 										<a href="${pageContext.request.contextPath }/foodType?id=${foodType.id}&method=delete" class="FunctionButton">删除</a>									</td>								</tr>							</c:forEach>												</c:when>						<c:otherwise>							<tr>								<td colspan="3">没有你要找找的数据,请先保存记录再查看!</td>							</tr>						</c:otherwise>					</c:choose>							</tbody>		</table>		<!-- 其他功能超链接 -->		<div id="TableTail" align="center">			<div class="FunctionButton">				<a href="${pageContext.request.contextPath }/sys/type/foodtype_save.jsp">添加</a>			</div>		</div>	</div></body></html><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>    <!-- 包含公共的JSP代码片段 --><title>无线点餐平台</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript" src="${pageContext.request.contextPath }/sys/style/js/jquery.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/sys/style/js/page_common.js"></script><link href="${pageContext.request.contextPath }/sys/style/css/common_style_blue.css" rel="stylesheet" type="text/css"><link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/sys/style/css/index_1.css" /></head><body><!-- 页面标题 --><div id="TitleArea">	<div id="TitleArea_Head"></div>	<div id="TitleArea_Title">		<div id="TitleArea_Title_Content">																<img border="0" width="13" height="13" src="${pageContext.request.contextPath }/sys/style/images/title_arrow.gif"/>  添加菜系									</div>    </div>	<div id="TitleArea_End"></div></div><!-- 主内容区域(数据列表或表单显示) --><div id="MainArea">	<!-- 表单内容 -->	<form action="${pageContext.request.contextPath }/foodType?method=addFoodType" method="post">			<!-- 本段标题(分段标题) -->		<div class="ItemBlock_Title">        	<img width="4" height="7" border="0" src="${pageContext.request.contextPath }/sys/style/images/item_point.gif"> 菜系信息         </div>		<!-- 本段表单字段 -->        <div class="ItemBlockBorder">            <div class="ItemBlock">				<div class="ItemBlock2">					<table cellpadding="0" cellspacing="0" class="mainForm">						<tr>							<td width="80px">菜系名称</td>							<td>								<input type="text" name="foodTypeName" class="InputStyle" value=""/> *							</td>						</tr>					</table>				</div>            </div>        </div>				<!-- 表单操作 -->		<div id="InputDetailBar">																 <input type="submit" value="添加" class="FunctionButtonInput">							            <a href="javascript:history.go(-1);" class="FunctionButton">返回</a>        </div>	</form>	</div></body></html><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>    <!-- 包含公共的JSP代码片段 -->	<title>无线点餐平台</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript" src="${pageContext.request.contextPath }/sys/style/js/jquery.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/sys/style/js/page_common.js"></script><link href="${pageContext.request.contextPath }/sys/style/css/common_style_blue.css" rel="stylesheet" type="text/css"><link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/sys/style/css/index_1.css" /></head><body><!-- 页面标题 --><div id="TitleArea">	<div id="TitleArea_Head"></div>	<div id="TitleArea_Title">		<div id="TitleArea_Title_Content">												<img border="0" width="13" height="13" src="${pageContext.request.contextPath }/sys/style/images/title_arrow.gif"/>  更新菜系													</div>    </div>	<div id="TitleArea_End"></div></div><!-- 主内容区域(数据列表或表单显示) --><div id="MainArea">	<!-- 表单内容 -->	<form action="${pageContext.request.contextPath }/foodType?method=update" method="post">			<!-- 本段标题(分段标题) -->		<div class="ItemBlock_Title">        	<img width="4" height="7" border="0" src="${pageContext.request.contextPath }/sys/style/images/item_point.gif"> 菜系信息         </div>		<!-- 本段表单字段 -->        <div class="ItemBlockBorder">            <div class="ItemBlock">				<div class="ItemBlock2">					<table cellpadding="0" cellspacing="0" class="mainForm">						<tr>							<td width="80px">菜系名称</td>							<td>								<input type="text" name="foodTypeName" class="InputStyle" value="${foodType.typeName }"/> *								<input type="hidden" name="id" value="${foodType.id }"/>							</td>						</tr>					</table>				</div>            </div>        </div>				<!-- 表单操作 -->		<div id="InputDetailBar">					 <input type="submit" value="修改" class="FunctionButtonInput">            <a href="javascript:history.go(-1);" class="FunctionButton">返回</a>        </div>	</form></div></body></html>


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表