SSM框架实现简单门店管理系统

一、创建数据库

/*
 Navicat Premium Data Transfer

 Source Server         : MySQL
 Source Server Type    : MySQL
 Source Server Version : 50743
 Source Host           : localhost:3306
 Source Schema         : yonghe

 Target Server Type    : MySQL
 Target Server Version : 50743
 File Encoding         : 65001

 Date: 14/02/2024 15:16:09
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_cashier
-- ----------------------------
DROP TABLE IF EXISTS `tb_cashier`;
CREATE TABLE `tb_cashier`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `telephone` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `work_time` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `door_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_cashier
-- ----------------------------
INSERT INTO `tb_cashier` VALUES (1, '张鱼与', '男', 24, '13827364723', '8:00-18:00', 1);
INSERT INTO `tb_cashier` VALUES (2, '李四', '男', 25, '18732364732', '8:00-18:00', 2);
INSERT INTO `tb_cashier` VALUES (3, '王五', '男', 30, '13764738273', '8:00-18:00', 3);
INSERT INTO `tb_cashier` VALUES (4, '赵六', '男', 28, '16273647231', '8:00-18:00', 4);
INSERT INTO `tb_cashier` VALUES (5, '周七', '女', 22, '13748548319', '8:00-18:00', 5);
INSERT INTO `tb_cashier` VALUES (6, '周红', '女', 22, '16937200932', '8:00-18:00', 6);
INSERT INTO `tb_cashier` VALUES (7, '冯鱼鱼', '女', 27, '17623609212', '8:00-18:00', 7);
INSERT INTO `tb_cashier` VALUES (8, '王小花', '女', 21, '18723642909', '8:00-18:00', 8);
INSERT INTO `tb_cashier` VALUES (9, '张小草', '男', 37, '17823762109', '8:00-18:00', 9);
INSERT INTO `tb_cashier` VALUES (10, '陈虎', '男', 32, '16723647109', '8:00-18:00', 10);
INSERT INTO `tb_cashier` VALUES (11, '刘雨燕', '女', 30, '13872378472', '8:00-18:00', 11);

-- ----------------------------
-- Table structure for tb_category
-- ----------------------------
DROP TABLE IF EXISTS `tb_category`;
CREATE TABLE `tb_category`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `category` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_category
-- ----------------------------
INSERT INTO `tb_category` VALUES (1, '主菜');
INSERT INTO `tb_category` VALUES (2, '前菜');
INSERT INTO `tb_category` VALUES (3, '甜品');
INSERT INTO `tb_category` VALUES (4, '饮料');
INSERT INTO `tb_category` VALUES (5, '主食');

-- ----------------------------
-- Table structure for tb_door
-- ----------------------------
DROP TABLE IF EXISTS `tb_door`;
CREATE TABLE `tb_door`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `tel` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `addr` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_door
-- ----------------------------
INSERT INTO `tb_door` VALUES (1, '永和大王(北三环西路店)', '010-62112313', '北三环西路甲18号院-1号大钟寺中坤广场d座');
INSERT INTO `tb_door` VALUES (2, '永和大王(知春路店)', '010-82356537', '知春路29号大运金都');
INSERT INTO `tb_door` VALUES (3, '永和大王(东直门)', '010-84477746', '东直门外大街48号东方银座b2-08');
INSERT INTO `tb_door` VALUES (4, '永和大王(北京站)', '010-65286602', '毛家湾胡同甲13号北京站候车大厅2层');
INSERT INTO `tb_door` VALUES (5, '永和大王(西直门)', '010-62152539', '西直门地铁站C口');
INSERT INTO `tb_door` VALUES (6, '永和大王(王府井)', '010-62152539', '王府井小吃街');
INSERT INTO `tb_door` VALUES (7, '永和大王(四道口)', '010-62152539', '学院南路37号超市发四道口店四道口西北角');
INSERT INTO `tb_door` VALUES (8, '永和大王(灯市口)', '010-62152539', '灯市口地铁站A口');
INSERT INTO `tb_door` VALUES (9, '永和大王(北大)', '010-62152539', '北京大学西门');
INSERT INTO `tb_door` VALUES (10, '永和大王(苏州街)', '010-62152539', '苏州街地铁站B口');
INSERT INTO `tb_door` VALUES (11, '永和大王(莲池区店)', '010-05151533', '莲池路123号');

-- ----------------------------
-- Table structure for tb_menu
-- ----------------------------
DROP TABLE IF EXISTS `tb_menu`;
CREATE TABLE `tb_menu`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dish_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `dish_price` double(10, 2) DEFAULT NULL,
  `discription` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `img` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `category_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_menu
-- ----------------------------
INSERT INTO `tb_menu` VALUES (1, '红烧肉', 56.00, '红烧肉属于中华传统名菜之一,以五花肉为主料,加入糖色、酱油等调料慢炖而成,口感软糯、肥而不腻。', 'uploads/C76E68E0B50245B390398F4B15B4AC80_lunbo4.jpg', 1);
INSERT INTO `tb_menu` VALUES (2, '鱼香肉丝', 48.00, '川菜中的代表性菜品之一,由猪里脊肉丝、木耳、胡萝卜等蔬菜烹制而成,味道酸甜辣香四味俱全,鱼香味浓郁但并不含鱼。', 'uploads/83A06A42A00A4346BEF1AE6EB7E4AE4A_`Y4N_UNJMLFCHX_GA94KMKL.png', 1);
INSERT INTO `tb_menu` VALUES (3, '清蒸鲈鱼', 55.00, '一道清淡而鲜美的菜肴,选用新鲜的鲈鱼清蒸而成,肉质细嫩、口感爽滑,搭配葱姜蒜提味,营养丰富。', 'uploads/53E02DD07511401A877E97494E82E24D_MN]PP$5}TPP5O$_`_6TENQT.png', 1);
INSERT INTO `tb_menu` VALUES (4, '麻婆豆腐', 30.00, '四川传统名菜之一,以豆腐为主料,搭配豆瓣酱、花椒等调料炒制而成,口感麻辣鲜香,色泽红亮诱人。', 'uploads/E88EBC3F47F24858B31E2DA7E7B663F6_C1@6DISF]Q83XIOP4)@JY0Y.png', 1);
INSERT INTO `tb_menu` VALUES (5, '米饭', 2.00, '大米饭单人份', 'uploads/221755AA32E74452A867BAB03F789CD5_~C)@@08}F1BZ{H~MQ]U5H7V.png', 5);
INSERT INTO `tb_menu` VALUES (6, '酸梅汁', 5.00, '80ml一份', 'uploads/54F0218F4B8444DA9C5AC92E8F70C965_C1@6DISF]Q83XIOP4)@JY0Y.png', 4);
INSERT INTO `tb_menu` VALUES (7, '橙汁', 6.00, '85ml一份', 'uploads/AC6953C939724D71B21CCE09CDAF46A7__@780W8Z4}GT8K`}BNI]93V.png', 4);
INSERT INTO `tb_menu` VALUES (8, '凉拌海蜇', 18.00, '这是一道清爽的凉菜,以海蜇皮为主料,搭配醋、蒜泥、芝麻等调料凉拌而成。口感爽滑,味道酸辣可口,是夏季消暑的佳品。', 'uploads/9E4DDB3CB5A3463C8E4EAEDF7884B3E3__@780W8Z4}GT8K`}BNI]93V.png', 2);
INSERT INTO `tb_menu` VALUES (9, '拍黄瓜', 18.00, '简单的家常菜,以黄瓜为主料,用刀拍松后加入蒜泥、醋、香油等调料拌匀而成。口感清脆爽口,味道清新宜人,是夏季常见的开胃小菜。', 'uploads/E9D785930EE8417FA90CD445A5E4B526_MN]PP$5}TPP5O$_`_6TENQT.png', 2);
INSERT INTO `tb_menu` VALUES (10, '泡菜', 10.00, '在韩餐或一些中式餐厅中,泡菜也是常见的前菜之一。泡菜以蔬菜为主料,经过腌制发酵而成,口感酸辣可口,有助于增进食欲。', 'uploads/005F76B33ACF47CC9719F81E3523DEEA__@780W8Z4}GT8K`}BNI]93V.png', 2);
INSERT INTO `tb_menu` VALUES (11, '法式焦糖布丁', 15.00, '这是一款法国传统甜品,也被称为“焦糖蛋糕”。它的外层覆盖着一层焦糖,酥脆的外壳与布丁的细腻口感形成完美对比,让人上瘾。', 'uploads/CD2CE06F6F5541AAA5C38CA6188BBF1D_MN]PP$5}TPP5O$_`_6TENQT.png', 3);
INSERT INTO `tb_menu` VALUES (12, '奶油泡芙', 12.00, '泡芙皮酥脆,内馅奶油丰富,口感轻盈不腻人,无论是孩子还是甜品爱好者都非常喜欢。', 'uploads/F1CB70F15DD4449CAFF6FF089EFE0437_C1@6DISF]Q83XIOP4)@JY0Y.png', 3);
INSERT INTO `tb_menu` VALUES (18, '当归蛋', 190.00, '拉拉', 'uploads/E6E1911DBA614912BA8DAFEC0DA7A412_lunbo1.jpg', 1);

-- ----------------------------
-- Table structure for tb_order
-- ----------------------------
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `door_id` int(11) DEFAULT NULL,
  `order_no` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `order_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `pnum` int(11) DEFAULT NULL,
  `cashier_id` int(11) DEFAULT NULL,
  `order_time` datetime(0) DEFAULT NULL,
  `pay_time` datetime(0) DEFAULT NULL,
  `pay_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `price` double DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `door_id`(`door_id`) USING BTREE,
  CONSTRAINT `tb_order_ibfk_1` FOREIGN KEY (`door_id`) REFERENCES `tb_door` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_order
-- ----------------------------
INSERT INTO `tb_order` VALUES (1, 1, 'P001', '堂食', 1, 11, '2018-04-26 14:49:07', '2018-04-26 14:50:38', '微支付', 16);
INSERT INTO `tb_order` VALUES (2, 1, 'P003', '外卖', 3, 1, '2018-04-27 13:34:07', '2018-04-27 13:34:38', '现金', 60);
INSERT INTO `tb_order` VALUES (3, 2, 'P005', '打包', 1, 2, '2019-01-22 11:59:22', '2019-01-22 11:59:22', '微支付', 28);
INSERT INTO `tb_order` VALUES (4, 2, 'P007', '堂食', 4, 3, '2019-01-23 13:01:26', '2019-01-23 13:01:26', '现金', 149);
INSERT INTO `tb_order` VALUES (6, 3, 'P008', '堂食', 2, 4, '2020-05-23 13:01:26', '2019-01-23 13:01:26', '支付宝', 56);
INSERT INTO `tb_order` VALUES (7, 4, 'P005', '打包', 1, 5, '2020-05-22 16:56:22', '2019-01-22 11:59:22', '支付宝', 28);
INSERT INTO `tb_order` VALUES (8, 5, 'P007', '堂食', 2, 6, '2020-07-23 16:09:26', '2019-01-23 13:01:26', '现金', 59);
INSERT INTO `tb_order` VALUES (9, 5, 'P007', '食堂', 2, 10, '2020-07-23 17:01:26', '2019-01-23 13:01:26', '微支付', 48);
INSERT INTO `tb_order` VALUES (10, 6, 'P007', '外卖', 2, 8, '2020-09-23 17:06:26', '2019-01-23 13:01:26', '现金', 33);
INSERT INTO `tb_order` VALUES (11, 7, 'P007', '堂食', 2, 9, '2020-09-23 17:06:26', '2019-01-23 13:01:26', '现金', 89);
INSERT INTO `tb_order` VALUES (14, 1, 'P004', '堂食', 1, 10, '2019-01-23 13:01:26', '2019-01-23 13:01:26', '支付宝', 112);

SET FOREIGN_KEY_CHECKS = 1;

二、文件配置

1、创建maven java web项目,在pom.xml文件中引入相关依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.qcby</groupId>
	<artifactId>yonghe</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>8</source>
					<target>8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<packaging>war</packaging>
	<dependencies>
		<!-- 单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
		</dependency>
		<!-- 整合log4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.6.4</version>
		</dependency>
		<!-- Servlet/JSP/JSTL -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- 整合spring框架(包含springmvc) 这个jar文件包含springmvc开发时的核心类, 同时也会将依赖的相关jar文件引入进来(spring的核心jar文件也包含在内) -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.1.3.RELEASE</version>
		</dependency>
		<!--这个jar文件包含对Spring对JDBC数据访问进行封装的所有类 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.1.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>4.1.3.RELEASE</version>
		</dependency>
		<!-- 整合mybatis框架 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.8</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.2</version>
		</dependency>
		<!-- mysql驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.32</version>
		</dependency>
		<!-- druid连接池 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.6</version>
		</dependency>
		<!--文件上传-->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
	</dependencies>


</project>

2、配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<display-name>day17-springmvc</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		 <welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file> 
	</welcome-file-list>
	
	<!-- 配置全站500异常跳转页面 -->
	<error-page>
		<error-code>500</error-code>
		<location>/WEB-INF/pages/500.jsp</location>
	</error-page>
	
	<!-- 配置全站404跳转页面 -->
	 <error-page>
		<error-code>404</error-code>
		<location>/WEB-INF/pages/404.jsp</location>
	</error-page>
	
	<!-- 配置springmvc的前端控制器(DispatcherServlet) ctrl+shift+T -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<!-- 配置springmvc核心配置文件的位置(contextConfigLocation是固定的名字,不能写错!) -->
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/*.xml</param-value>
		</init-param>
		<!--启动加载-->
        <load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<!-- 配置前端控制器拦截对当前应用下的所有资源的访问(除了JSP) -->
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- 配置(启用)springmvc的乱码处理过滤器,用于处理POST提交中文参数的乱码问题! -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<!-- /*表示拦截所有的请求,对所有请求都进行过滤 -->
		<url-pattern>/*</url-pattern>
	</filter-mapping>
    
</web-app>

3、创建spring文件夹,在spring文件夹下创建并配置applicationContext.xml和springsmv-config.xml文件

applicationContext.xml文件配置

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
	
	<!-- 1.加载jdbc.properties文件的位置 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	
	<!-- 2.配置druid连接池 ,id是固定值,class是druid连接池类的全路径 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<!-- 配置连接数据库的基本信息 -->
		<property name="driverClassName" value="${db.driverClassName}"></property>
		<property name="url" value="${db.url}"></property>
		<property name="username" value="${db.username}"></property>
		<property name="password" value="${db.password}"></property>
	</bean>
	
	<!-- 3.整合spring和mybatis框架	
		将SqlSession等对象的创建交给Spring容器
		id值(sqlSessionFactory)是固定值
	 -->
	<bean id="sqlSessionFactory" 
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 3.1.指定mybatis核心配置文件的位置 -->
		<property name="configLocation" 
				value="classpath:mybatis/mybatis-config.xml"></property>
		<!-- 3.2.配置连接池(数据源) ref指向连接池bean对象的id值 -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- 3.3、扫描所有的 XxxMapper.xml映射文件,读取其中配置的SQL语句 -->
		<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"/>
	</bean>
	
	<!-- 4、定义mapper接口扫描器
		如果bean标签上没有id,默认id值是当前类的类名,首字母小写
		扫描 com.qcby.dao包下的所有接口,由框架负责提供接口的子类
		由spring容器负责创建接口的子类实例(spring会将创建好的接口子类实例存到map中)
	 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 扫描所有XxxMapper接口,将接口实例的创建交给spring容器 -->
		<property name="basePackage" 
			value="com.qcby.dao"/>
	</bean>

</beans>

springsmv-config.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc
						http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
						http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
						http://www.springframework.org/schema/context
          				http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	
	<!-- 1.配置前端控制器放行静态资源(html/css/js等,否则静态资源将无法访问) -->
	<mvc:default-servlet-handler/>
	
	<!-- 2.启用默认配置, 配置注解驱动,用于识别注解(比如@Controller) -->
	<mvc:annotation-driven></mvc:annotation-driven>

	
	<!-- 3.配置需要扫描的包:spring自动去扫描 base-package 下的类,
		如果扫描到的类上有 @Controller、@Service、@Component等注解,
		将会自动将类注册为bean 
	 -->
	<context:component-scan base-package="com.qcby"></context:component-scan>
	
	<!-- 4.配置内部资源视图解析器
		prefix:配置路径前缀
		suffix:配置文件后缀
	 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/pages/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	<mvc:view-controller path="/" view-name="index"/>

	<!--配置文件上传的解析器组件。id的名称是固定,不能乱写-->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!--设置上传文件的总大小 8M = 8 * 1024 * 1024 -->
		<property name="maxUploadSize" value="8388608" />
	</bean>
</beans>

4、jdbc.properties文件配置

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql:///yonghe?characterEncoding=utf-8
db.username=root
db.password=123456

三、编写实体类

1、门店Door

package com.qcby.pojo;

/** 用于封装门店信息 */
public class Door {
	//声明门店的属性
	private Integer id;
	private String name;
	private String tel;
	private String addr;
	//提供get和set方法
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	//重写toString方法
	@Override
	public String toString() {
		return "Door [id=" + id + ", name=" + name + ", tel=" + tel + ", addr=" + addr + "]";
	}
}

2、订单Order

package com.qcby.pojo;

import java.util.Date;

/** 用于封装订单信息的实体类 */
public class Order {
	private Integer id;		//订单编号
	private Integer doorId;	//订单所属的门店编号
	private String orderNo;	//下单号
	private String orderType;	//订单类型
	private Integer pnum;	//用餐人数
	private Integer cashierId;	//收银员编号
	private Date orderTime;	//下单时间
	private Date payTime;	//支付时间
	private String payType;	//支付类型
	private Double price;	//支付金额
	//提供get和set方法
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Integer getDoorId() {
		return doorId;
	}
	public void setDoorId(Integer doorId) {
		this.doorId = doorId;
	}
	public String getOrderNo() {
		return orderNo;
	}
	public void setOrderNo(String orderNo) {
		this.orderNo = orderNo;
	}
	public String getOrderType() {
		return orderType;
	}
	public void setOrderType(String orderType) {
		this.orderType = orderType;
	}
	public Integer getPnum() {
		return pnum;
	}
	public void setPnum(Integer pnum) {
		this.pnum = pnum;
	}

	public Integer getCashierId() {
		return cashierId;
	}

	public void setCashierId(Integer cashierId) {
		this.cashierId = cashierId;
	}

	public Date getOrderTime() {
		return orderTime;
	}
	public void setOrderTime(Date orderTime) {
		this.orderTime = orderTime;
	}
	public Date getPayTime() {
		return payTime;
	}
	public void setPayTime(Date payTime) {
		this.payTime = payTime;
	}
	public String getPayType() {
		return payType;
	}
	public void setPayType(String payType) {
		this.payType = payType;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		this.price = price;
	}
	
	//重写toString方法
	@Override
	public String toString() {
		return "Order [id=" + id + ", doorId=" + doorId + ", orderNo=" + orderNo + ", orderType=" + orderType
				+ ", pnum=" + pnum + ", cashierId=" + cashierId + ", orderTime=" + orderTime + ", payTime=" + payTime
				+ ", payType=" + payType + ", price=" + price + "]";
	}
	
}

3、收银员Cashier

package com.qcby.pojo;

/** 用于封装收银员信息 */
public class Cashier {
    private Integer id;   //收银员编号
    private String cname;  //姓名
    private String gender;   //性别
    private Integer age;   //年龄
    private String telephone;   //联系电话
    private String work_time;   //工作时间段
    private Integer door_id;   //所属门店id

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getWork_time() {
        return work_time;
    }

    public void setWork_time(String work_time) {
        this.work_time = work_time;
    }

    public Integer getDoor_id() {
        return door_id;
    }

    public void setDoor_id(Integer door_id) {
        this.door_id = door_id;
    }

    @Override
    public String toString() {
        return "Cashier{" +
                "id=" + id +
                ", cname='" + cname + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", telephone='" + telephone + '\'' +
                ", work_time='" + work_time + '\'' +
                ", door_id=" + door_id +
                '}';
    }
}

4、菜单Menu

package com.qcby.pojo;

/** 用于封装菜单信息 */
public class Menu {
    private Integer id;		//菜名编号
    private String dish_name;	//菜名
    private Double dish_price;	//价格
    private String discription;	//描述
    private String img;	//图片
    private Integer category_id;	//类别编号

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDish_name() {
        return dish_name;
    }

    public void setDish_name(String dish_name) {
        this.dish_name = dish_name;
    }

    public Double getDish_price() {
        return dish_price;
    }

    public void setDish_price(Double dish_price) {
        this.dish_price = dish_price;
    }

    public String getDiscription() {
        return discription;
    }

    public void setDiscription(String discription) {
        this.discription = discription;
    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }

    public Integer getCategory_id() {
        return category_id;
    }

    public void setCategory_id(Integer category_id) {
        this.category_id = category_id;
    }

    @Override
    public String toString() {
        return "Menu{" +
                "id=" + id +
                ", dish_name='" + dish_name + '\'' +
                ", dish_price=" + dish_price +
                ", discription='" + discription + '\'' +
                ", img='" + img + '\'' +
                ", category_id=" + category_id +
                '}';
    }
}

5、菜类别Category

package com.qcby.pojo;

/** 用于封装菜名种类信息 */
public class Category {
    private Integer id;		//类别编号
    private String category;   //类别名称

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    @Override
    public String toString() {
        return "Category{" +
                "id=" + id +
                ", category='" + category + '\'' +
                '}';
    }
}

四、编写持久层

1、DoorMapper

package com.qcby.dao;

import com.qcby.pojo.Door;

import java.util.List;

/* 接口由我们开发人员负责提供,但接口的实现类(子类)由框架负责提供
 * 如果不整合mybatis和spring框架,接口的子类实例也是由mybatis负责创建
 * 如果整合了mybatis和spring框架,接口的子类实例将会由spring容器负责创建 */
public interface DoorMapper {
	/** 1.查询所有门店信息 */
	public List<Door> findAll();
	
	/** 2.根据id删除门店信息 */
	public void deleteById( Integer id );
	
	/** 3.新增门店信息 */
	public void add( Door door );
	
	/** 4.根据id查询门店信息 */
	public Door findById( Integer id );
	
	/** 5.根据id修改门店信息 */
	public void updateById( Door door );
	
}

DoorMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 门店表的映射文件	namespace值为对应接口的全路径 -->
<mapper namespace="com.qcby.dao.DoorMapper">
	<!-- 1.查询所有门店信息,id值为对应接口中方法的名字
		resultType指定将查询的结果封装到哪个pojo对象中
	 -->
	<select id="findAll" resultType="com.qcby.pojo.Door">
		select * from tb_door
	</select>
	<!-- 2.根据id删除门店信息 -->
	<delete id="deleteById">
		delete from tb_door where id=#{id}
	</delete>
	<!-- 3.新增门店信息 -->
	<insert id="add">
		insert into tb_door value
		(null,#{name},#{tel},#{addr})
	</insert>
	<!-- 4.根据id查询门店信息 -->
	<select id="findById" resultType="com.qcby.pojo.Door">
		select * from tb_door where id=#{id}
	</select>
	<!-- 5.根据id修改门店信息 -->
	<update id="updateById">
		update tb_door set name=#{name},
		tel=#{tel},addr=#{addr}
		where id=#{id}
	</update>
	
	
</mapper>

2、OrderMapper

package com.qcby.dao;

import com.qcby.pojo.Order;

import java.util.List;

/** 订单模块的mapper接口 */
public interface OrderMapper {
	
	/** 1.查询所有订单信息 */
	public List<Order> findAll();
	
	/** 2.根据id删除订单信息 */
	public void deleteById(Integer id);
	
	/** 3.新增订单信息 */
	public void add( Order order );
	
	/** 4.根据id查询订单信息 */
	public Order findById( Integer id );
	
	/** 5.根据id修改订单信息 */
	public void updateById( Order order );
	
}

OrderMapper.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 订单表的映射文件	namespace值为对应接口的全路径 -->
<mapper namespace="com.qcby.dao.OrderMapper">
	<!-- 1.查询所有订单信息,id值为对应接口中方法的名字
		resultType指定将查询的结果封装到哪个pojo对象中
		通过给查询的列指定别名,解决查询的数据封装不到实体对象中的问题!!
	 -->
	<select id="findAll" resultType="com.qcby.pojo.Order">
		select id,door_id as doorId,order_no as orderNo,
		order_type as orderType,pnum,cashier_id as cashierId,
		order_time as orderTime,pay_time as payTime,
		pay_type as payType,price
		from tb_order
	</select>
	
	<!-- 2.根据id删除订单信息 -->
	<delete id="deleteById">
		delete from tb_order where id=#{id}
	</delete>
	<!-- 3.新增订单信息 -->
	<insert id="add">
		insert into tb_order value
		(null,#{doorId},#{orderNo},#{orderType},
		#{pnum},#{cashierId},#{orderTime},#{payTime},
		#{payType},#{price})
	</insert>
	
	<!-- 4.根据id查询订单信息 -->
	<select id="findById" resultType="com.qcby.pojo.Order">
		select id,door_id as doorId,order_no as orderNo,
		order_type as orderType,pnum,cashier_id as cashierId,
		order_time as orderTime,pay_time as payTime,
		pay_type as payType,price
		from tb_order
		where id=#{id}
	</select>
	<!-- 5.根据id修改订单信息 -->
	<update id="updateById">
		update tb_order set door_id=#{doorId},order_no=#{orderNo},
		order_type=#{orderType},pnum=#{pnum},cashier_id=#{cashierId},
		order_time=#{orderTime},pay_time=#{payTime},
		pay_type=#{payType},price=#{price}
		where id=#{id}
	</update>
	
	
</mapper>

3、CashierMapper

package com.qcby.dao;

import com.qcby.pojo.Cashier;

import java.util.List;

public interface CashierMapper {
    /** 1.查询所有收银员信息 */
    public List<Cashier> findAll();

    /** 2.根据id删除收银员信息 */
    public void deleteById( Integer id );

    /** 3.新增收银员信息 */
    public void add( Cashier cashier );

    /** 4.根据id查询收银员信息 */
    public Cashier findById( Integer id );

    /** 5.根据id修改收银员信息 */
    public void updateById( Cashier cashier );
}

CashierMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 订单表的映射文件	namespace值为对应接口的全路径 -->
<mapper namespace="com.qcby.dao.CashierMapper">
    <!-- 1.查询所有收银员信息-->
    <select id="findAll" resultType="com.qcby.pojo.Cashier">
        select * from tb_cashier
    </select>

    <!-- 2.根据id删除收银员信息 -->
    <delete id="deleteById">
        delete from tb_cashier where id=#{id}
    </delete>
    <!-- 3.新增收银员信息 -->
    <insert id="add">
        insert into tb_cashier value
            (null,#{cname},#{gender},#{age},
            #{telephone},#{work_time},#{door_id})
    </insert>

    <!-- 4.根据id查询收银员信息 -->
    <select id="findById" resultType="com.qcby.pojo.Cashier">
        select * from tb_cashier
        where id=#{id}
    </select>
    <!-- 5.根据id修改收银员信息 -->
    <update id="updateById">
        update tb_cashier set cname=#{cname},gender=#{gender},
                            age=#{age},telephone=#{telephone},
                            work_time=#{work_time},door_id=#{door_id}
        where id=#{id}
    </update>

</mapper>

4、MenuMapper

package com.qcby.dao;

import com.qcby.pojo.Menu;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface MenuMapper {
    /** 1.查询所有菜单信息 */
    public List<Menu> findAll();

    /** 2.根据id删除菜单信息 */
    public void deleteById(Integer id);

    /** 3.新增菜单信息 */
    public void add( Menu Menu );

    /** 4.根据id查询菜单信息 */
    public Menu findById( Integer id );

    /** 5.根据id修改菜单信息 */
    public void updateById( Menu menu );

    /** 6.根据菜名模糊查询菜单信息 */
    public List<Menu> findByName(@Param("dish_name") String dish_name, @Param("discription") String discription);
}

MenuMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 订单表的映射文件	namespace值为对应接口的全路径 -->
<mapper namespace="com.qcby.dao.MenuMapper">
    <!-- 1.查询所有菜单信息-->
    <select id="findAll" resultType="com.qcby.pojo.Menu">
        select * from tb_menu
    </select>

    <!-- 2.根据id删除菜单信息 -->
    <delete id="deleteById">
        delete from tb_menu where id=#{id}
    </delete>
    <!-- 3.新增菜单信息 -->
    <insert id="add">
        insert into tb_menu value
            (null,#{dish_name},#{dish_price},#{discription},
            #{img},#{category_id})
    </insert>

    <!-- 4.根据id查询菜单信息 -->
    <select id="findById" resultType="com.qcby.pojo.Menu">
        select * from tb_menu
        where id=#{id}
    </select>
    <!-- 5.根据id修改菜单信息 -->
    <update id="updateById">
        update tb_menu set dish_name=#{dish_name},dish_price=#{dish_price},
                            discription=#{discription},img=#{img},category_id=#{category_id}
        where id=#{id}
    </update>

    <!-- 模糊查询 -->
    <select id="findByName" resultType="com.qcby.pojo.Menu" parameterType="map">
        select * from tb_menu
        <where>
            <if test="dish_name != null and dish_name != ''">
                and dish_name like CONCAT('%', #{dish_name}, '%')
            </if>
            <if test="discription != null and discription != ''">
                and discription like CONCAT('%', #{discription}, '%')
            </if>
        </where>
    </select>

</mapper>

5、CategoryMapper

package com.qcby.dao;

import com.qcby.pojo.Category;

import java.util.List;

public interface CategoryMapper {
    /** 1.查询所有菜单名信息 */
    public List<Category> findAll();
}

CategoryMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 订单表的映射文件	namespace值为对应接口的全路径 -->
<mapper namespace="com.qcby.dao.CategoryMapper">
    <!-- 1.查询所有菜类别信息-->
    <select id="findAll" resultType="com.qcby.pojo.Category">
        select id,category from tb_category
    </select>

</mapper>

五、编写表现层

1、DoorController   门店管理

package com.qcby.controller;

import com.qcby.dao.DoorMapper;
import com.qcby.pojo.Door;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;
/**
 * 门店模块的controller
 */
@Controller
public class DoorController {
	//获取DoorMapper接口的子类实例
	@Autowired //自动装配
	DoorMapper doorMapper;
	
	/** 1.查询所有门店信息
	 * 	点击 "门店管理" 后,访问/doorList,执行当前方法,查询所有门店信息 */
	@RequestMapping("/doorList")
	public String doorList( Model model ) {
		List<Door> list = doorMapper.findAll();
		//将门店信息集合存入Model中,转发带到门店列表页面显示
		model.addAttribute("doorList", list);
		//转发到 door_list.jsp, 显示所有门店信息
		return "door_list";
	}
	/**
	 * 2.根据id删除门店信息
	 * @param id 所要删除门店的id值
	 * @return  */
	@RequestMapping("/doorDelete")
	public String doorDelete(Integer id) {
		doorMapper.deleteById( id );
		//更新成功后,转发到查询所有门店信息的方法,显示最新门店信息
		return "forward:/doorList";
	}
	
	/**
	 * 3.新增门店信息
	 * @param door 接收浏览器提交过来的门店信息(name、tel、addr)
	 * @return */
	@RequestMapping("/doorAdd")
	public String doorAdd( Door door ) {
		doorMapper.add( door );
		//更新成功后,转发到查询所有门店信息的方法,显示最新门店信息
		return "forward:/doorList";
	}
	/**
	 * 4.根据id查询门店信息,将查询到的门店信息转发带到门店修改页面,进行数据的回显
	 * @param id 门店的id值
	 * @return 门店修改页面的jsp的名字
	 */
	@RequestMapping("/doorInfo")
	public String doorInfo( Integer id, Model model ) {
		//根据id查询门店信息,将门店对象存入Model中,转发带到门店修改页面
		Door door = doorMapper.findById( id );
		model.addAttribute( "door", door );
		//转发到门店修改页面
		return "door_update";
	}
	
	/**
	 * 5.根据id修改门店信息
	 * @param door 其中封装了门店的id以及修改后的门店信息
	 * @return "forward:/doorList" 转发到查询所有门店信息的方法
	 */
	@RequestMapping("/doorUpdate")
	public String doorUpdate( Door door ) {
		doorMapper.updateById( door );
		//更新成功后,转发到查询所有门店信息的方法,显示最新门店信息
		return "forward:/doorList";
	}
	
}

2、OrderController   订单管理

package com.qcby.controller;

import com.qcby.dao.CashierMapper;
import com.qcby.dao.DoorMapper;
import com.qcby.dao.OrderMapper;
import com.qcby.pojo.Cashier;
import com.qcby.pojo.Door;
import com.qcby.pojo.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

/** 订单模块的controller */
@Controller
public class OrderController {
	//获取OrderMapper接口的子类实例
	@Autowired
	OrderMapper orderMapper;
	//获取DoorMapper接口的子类实例
	@Autowired
	DoorMapper doorMapper;

	@Autowired
	CashierMapper cashierMapper;
	
	/** 1.查询所有订单信息 */
	@RequestMapping("/orderList")
	public String orderList( Model model ) {
		//查询所有的订单信息,并将订单信息存入model中
		List<Order> orderList = orderMapper.findAll();
		model.addAttribute( "oList", orderList );
		//同时查询所有的门店信息,并将门店信息存入model中
		List<Door> doorList = doorMapper.findAll();
		model.addAttribute( "dList", doorList );
		List<Cashier> cashierList = cashierMapper.findAll();
		model.addAttribute("cList", cashierList);
		//跳转到订单列表页面,显示所有订单信息
		return "order_list";
	}
	/** 2.根据id删除订单信息 */
	@RequestMapping("/orderDelete")
	public String orderDelete(Integer id) {
		orderMapper.deleteById( id );
		//转发到查询所有订单的方法,查询最新的订单信息并显示
		return "forward:/orderList";
	}
	/** 3.查询所有门店信息,将门店信息存入到Model中
	 * 最终跳转到订单新增页面(order_add.jsp) */
	@RequestMapping("/toOrderAdd")
	public String toOrderAdd( Model model ) {
		//查询所有门店信息,将所有门店存入到Model中
		List<Door> doorList = doorMapper.findAll();
		model.addAttribute( "dList", doorList );
		List<Cashier> cashierList = cashierMapper.findAll();
		model.addAttribute("cList", cashierList);
		//转发到 订单新增页面, 在下拉选框中显示所有的门店列表
		return "order_add";
	}
	
	/** 4.点击新增订单页面中的"提交"后,访问当前这个方法,完成新增订单功能 */
	@RequestMapping("/orderAdd")
	public String orderAdd(Order order ) {
		orderMapper.add( order ); //新增订单信息
		//转发到查询所有订单的方法,查询最新的订单信息并显示
		return "forward:/orderList";
	}
	
	/** 5.根据id查询订单信息,将订单信息存入Model中,
	 * 	带到订单修改页面(order_update.jsp)进行回显 */
	@RequestMapping("/orderInfo")
	public String orderInfo( Integer id, Model model ) {
		//根据id查询订单信息,将订单信息存入Model中
		Order order = orderMapper.findById( id );
		model.addAttribute("order", order);
		//查询所有门店信息,将所有门店存入到Model中
		List<Door> doorList = doorMapper.findAll();
		model.addAttribute( "dList", doorList );
		List<Cashier> cashierList = cashierMapper.findAll();
		model.addAttribute("cList", cashierList);
		//转发带到订单修改页面进行回显
		return "order_update";
	}
	
	/** 6.根据id修改订单信息 */
	@RequestMapping("/orderUpdate")
	public String orderUpdate( Order order ) {
		System.out.println(order);
		orderMapper.updateById( order );
		//转发到查询所有订单信息的方法,查询最新的订单信息并显示
		return "forward:/orderList";
	}
	
}

3、CashierCntroller  收银员管理

package com.qcby.controller;

import com.qcby.dao.CashierMapper;
import com.qcby.dao.DoorMapper;
import com.qcby.pojo.Cashier;
import com.qcby.pojo.Door;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

/** 收银员模块的controller */
@Controller
public class CashierController {
    @Autowired
    CashierMapper cashierMapper;

    @Autowired
    DoorMapper doorMapper;

    /** 1.查询所有订单信息 */
    @RequestMapping("/cashierList")
    public String orderList( Model model ) {
        //查询所有的订单信息,并将订单信息存入model中
        List<Cashier> cashierList = cashierMapper.findAll();
        model.addAttribute( "cList", cashierList );
        //同时查询所有的门店信息,并将门店信息存入model中
        List<Door> doorList = doorMapper.findAll();
        model.addAttribute( "dList", doorList );
        //跳转到订单列表页面,显示所有订单信息
        return "cashier_list";
    }
    /** 2.根据id删除订单信息 */
    @RequestMapping("/cashierDelete")
    public String orderDelete(Integer id) {
        cashierMapper.deleteById( id );
        //转发到查询所有订单的方法,查询最新的订单信息并显示
        return "forward:/cashierList";
    }
    /** 3.查询所有门店信息,将门店信息存入到Model中
     * 最终跳转到订单新增页面(order_add.jsp) */
    @RequestMapping("/toCashierAdd")
    public String toCashierAdd( Model model ) {
        //查询所有门店信息,将所有门店存入到Model中
        List<Door> doorList = doorMapper.findAll();
        model.addAttribute( "dList", doorList );
        //转发到 订单新增页面, 在下拉选框中显示所有的门店列表
        return "cashier_add";
    }

    /** 4.点击新增订单页面中的"提交"后,访问当前这个方法,完成新增订单功能 */
    @RequestMapping("/cashierAdd")
    public String orderAdd(Cashier cashier ) {
        cashierMapper.add( cashier ); //新增订单信息
        //转发到查询所有订单的方法,查询最新的订单信息并显示
        return "forward:/cashierList";
    }

    /** 5.根据id查询订单信息,将订单信息存入Model中,
     * 	带到订单修改页面(order_update.jsp)进行回显 */
    @RequestMapping("/cashierInfo")
    public String cashierInfo( Integer id, Model model ) {
        //根据id查询订单信息,将订单信息存入Model中
        Cashier cashier = cashierMapper.findById( id );
        model.addAttribute("cashier", cashier);
        //查询所有门店信息,将所有门店存入到Model中
        List<Door> doorList = doorMapper.findAll();
        model.addAttribute( "dList", doorList );

        //转发带到订单修改页面进行回显
        return "cashier_update";
    }

    /** 6.根据id修改订单信息 */
    @RequestMapping("/cashierUpdate")
    public String orderUpdate( Cashier cashier ) {
        cashierMapper.updateById( cashier );
        //转发到查询所有订单信息的方法,查询最新的订单信息并显示
        return "forward:/cashierList";
    }

}

4、MenuController  菜单管理

package com.qcby.controller;

import com.qcby.dao.CategoryMapper;
import com.qcby.dao.MenuMapper;
import com.qcby.pojo.Category;
import com.qcby.pojo.Menu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/** 菜单模块的controller */
@Controller
public class MenuController {
    //获取OrderMapper接口的子类实例
    @Autowired
    MenuMapper menuMapper;
    //获取DoorMapper接口的子类实例
    @Autowired
    CategoryMapper categoryMapper;

    /** 1.查询所有订单信息 */
    @RequestMapping("/menuList")
    public String orderList( Model model ) {
        //查询所有的订单信息,并将订单信息存入model中
        List<Menu> menuList = menuMapper.findAll();
        model.addAttribute( "mList", menuList );
        //同时查询所有的门店信息,并将门店信息存入model中
        List<Category> categoryList = categoryMapper.findAll();
        model.addAttribute( "cList", categoryList );
        //跳转到订单列表页面,显示所有订单信息
        return "menu_list";
    }
    /** 2.根据id删除订单信息 */
    @RequestMapping("/menuDelete")
    public String menuDelete(Integer id) {
        menuMapper.deleteById( id );
        //转发到查询所有订单的方法,查询最新的订单信息并显示
        return "forward:/menuList";
    }
    /** 3.查询所有菜单种类信息,将菜单信息存入到Model中
     * 最终跳转到订单新增页面(menu_add.jsp) */
    @RequestMapping("/toMenuAdd")
    public String toMenuAdd( Model model ) {
        //查询所有门店信息,将所有门店存入到Model中
        List<Category> categoryList = categoryMapper.findAll();
        model.addAttribute( "cList", categoryList );
        //转发到 订单新增页面, 在下拉选框中显示所有的门店列表
        return "menu_add";
    }

    /** 4.点击新增菜单页面中的"提交"后,访问当前这个方法,完成新增订单功能 */
    @RequestMapping("/menuAdd")
    public String menuAdd(Menu menu ) {
        System.out.println(menu.getImg());
        menuMapper.add( menu ); //新增订单信息
        //转发到查询所有订单的方法,查询最新的订单信息并显示
        return "forward:/menuList";
    }

    /** 5.根据id查询订单信息,将订单信息存入Model中,
     * 	带到订单修改页面(order_update.jsp)进行回显 */
    @RequestMapping("/menuInfo")
    public String menuInfo( Integer id, Model model ) {
        //根据id查询订单信息,将订单信息存入Model中
        Menu menu = menuMapper.findById( id );
        model.addAttribute("menu", menu);
        //查询所有菜单种类信息,将所有门店存入到Model中
        List<Category> categoryList = categoryMapper.findAll();
        model.addAttribute( "cList", categoryList );

        //转发带到订单修改页面进行回显
        return "menu_update";
    }

    /** 6.根据id修改订单信息 */
    @RequestMapping("/menuUpdate")
    public String orderUpdate( Menu menu ) {
        System.out.println("imgurl:"+menu.getImg());
        menuMapper.updateById( menu );
        //转发到查询所有订单信息的方法,查询最新的订单信息并显示
        return "forward:/menuList";
    }

    /** 7.根据条件查询菜单信息 */
    @RequestMapping(value = "/menuSearch", method = RequestMethod.GET)
    public String menuSearch(Model model, @RequestParam("dish_name") String dish_name, @RequestParam("discription") String discription ) {
        List<Menu> menuList = menuMapper.findByName(dish_name,discription);
        System.out.println(menuList);
        model.addAttribute( "mList", menuList );
        List<Category> categoryList = categoryMapper.findAll();
        model.addAttribute( "cList", categoryList );
        return "menu_list";
    }

}

5、PageController  实现通用页面跳转

package com.qcby.controller;

import com.qcby.dao.DoorMapper;
import com.qcby.pojo.Door;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

/* @Controller (1)标识当前类属于Controller层
 * 	(2)spring容器会扫描当前包下的所有类,如果类上有@Controller注解
 * 	将会由spring容器创建该类的实例
 */
@Controller
public class PageController {
	
	/* 1、测试springmvc的运行环境 */
	@RequestMapping("/testmvc")
	public String testmvc() {
		System.out.println("PageController.testmvc()...");
		return "test";
	}
	
	/* 获取DoorMapper接口的子类实例 
	 * 由于前面我们在applicationContext.xml中配置了扫描dao包下的所有接口,由
	 * 	spring框架为接口的创建子类实例,并将接口的子类实例存到spring的map中
	 * @Autowired作用是,根据类型(DoorMapper)到spring的map中找这个接口对应
	 * 	的子类实例,找到之后会将接口的子类实例赋值给当前这个成员变量. */
	@Autowired
	DoorMapper doorMapper;
	/* 2、测试ssm的运行环境 */
	@RequestMapping("/testssm")
	public String testssm() {
		//查询所有的门店信息
		List<Door> doorList = doorMapper.findAll();
		for (Door door : doorList) {
			System.out.println( door );
		}
		return "test";
	}
	
	/* 3.提供通用的页面跳转方法 
	 * 	/{}中的jspName用于获取(接收)访问的路径名
	 * 	例如访问路径为:../_top,那么jspName的值就是 "_top"
	 * 	@PathVariable注解,用于将  /{}中jspName的值 作为实参传递给
	 * 	方法上的形参 jspName, 此时形参jspName的值也为 "_top", 最终将
	 * 	"_top"直接return。即跳转到 _top.jsp
	 * 	总结: 当访问的路径名为 xxx, 就可以跳转到 xxx.jsp
	 */
	@RequestMapping("/{jspName}")
	public String toJspPage( @PathVariable String jspName ) {
		System.out.println("-----执行通用的页面跳转方法,跳转到 ["+jspName+".jsp]...");
		return jspName;
	}
	
	
}

6、UploadController  图片上传

package com.qcby.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
public class UploadController {
    /**
     * 文件上传
     * MultipartFile upload 文件上传解析器对象解析request后,文件上传对象
     * @return
     */
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<String> upload(@RequestParam("imgurl") MultipartFile upload, HttpServletRequest request) throws IOException {
        // 把文件上传到哪个位置
        String realPath = request.getSession().getServletContext().getRealPath("/uploads");
        // 创建该文件夹
        File file = new File(realPath);
        // 判断该文件夹是否存在
        if(!file.exists()){
            // 创建文件夹
            file.mkdirs();
        }

        // 获取到上传文件的名称
        String filename = upload.getOriginalFilename();
        //字符串切割
        //String suffix = filename.substring(filename.lastIndexOf("."));
        // 把文件的名称修改成为一的值 sdfs-csdf-fwer-sdfw
        String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
        // 唯一的值
        filename = uuid+"_"+filename;
        // 上传文件
        upload.transferTo(new File(file,filename));
        String img = "uploads/"+filename;
        System.out.println(img);
        // 使用ResponseEntity返回文件路径
        return new ResponseEntity<>(img, HttpStatus.OK);
    }
}

六、编写JSP页面

1、管理页面(index.jsp、_top.jsp、_right.jsp、_left.jsp)

①index.jsp

<%@ page pageEncoding="utf-8"%>
<!doctype html>
<html>
<head>
	<meta charset="utf-8"/>
</head>
	<!-- 
	frameset标签必须要放在head和body之间
	 -->
	<frameset rows="14%,86%" frameborder="0">
		<frame src="_top" />
		<frameset cols="180px,*">
			<frame src="_left" />
			<frame src="_right" name="rightFrame"/>
		</frameset>
	</frameset>
	
<body>
	
</body>
</html>

②_top.jsp 

<%@ page pageEncoding="utf-8"%>
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<style>
	body{background:#f1a98c;}
	h1{color:#fff;
		text-indent:20px;
		letter-spacing:5px;
		text-shadow:5px 5px 5px #ef6c6c;
		text-align: center;
	}
</style>
</head>
<body>
	<h1>雍禾门店管理系统</h1>
</body>
</html>

③_right.jsp

<%@ page pageEncoding="utf-8"%>
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<style>
	body{ background:#ffffff; }
	#welcome{font-size:36px;color:#f19d64;text-align:center;text-shadow:5px 5px 5px #d6b2b2;margin-top:180px;}
</style>
</head>
<body>
	<div id="welcome">
		欢迎访问雍禾门店管理系统...
	</div>
</body>
</html>

④_left.jsp

<%@ page pageEncoding="utf-8"%>
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<style>
	body{ 
		background:#f1ac97;
		margin:0px; 
	}
	.menu-bar a{ 
		color:#fff;
		text-decoration:none; 
	}
	.menu-bar{ 
		font-size:22px;
		border-bottom:1px solid #fff;
		height:40px;
		line-height:40px;
		text-indent:18px;
		letter-spacing:5px; 
	}
	.menu-bar:first-child{
		border-top:1px solid #fff;
	}
	.menu-bar:hover{
		background:#f46464;
	}
</style>
</head>
<body>
	<div class="menu-bar">
		<a href="doorList" target="rightFrame">› 门店管理</a>
	</div>
	<div class="menu-bar">
		<a href="orderList" target="rightFrame">› 订单管理</a>
	</div>
	<div class="menu-bar">
		<a href="cashierList" target="rightFrame">› 收银员管理</a>
	</div>
	<div class="menu-bar">
		<a href="menuList" target="rightFrame">› 菜单管理</a>
	</div>
</body>
</html>

⑤页面效果

2、门店管理(door_list.jsp、door_add.jsp、door_update.jsp) 

①door_list.jsp

<%@ page pageEncoding="utf-8"%>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML>
<html>
<head>
<title>门店管理</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
	body{ font-family: "微软雅黑"; background-color: #ffff; }
	h2{ text-align: center;color: gray;}
	table{ width:96%; margin: 0 auto; text-align: center; border-collapse:collapse; font-size:16px;border-color: #f0a16c;}
	td, th{ padding: 5px;color: gray;}
	th{ background-color: #efb78d; width:120px;}
	th.width-40{ width: 40px; }
	th.width-70{ width: 70px; }
	th.width-80{ width: 80px; }
	hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
	#add-door{text-align:right;font-size:20px;padding-right: 8%;}
	#add-door a{
		text-decoration: none;
		color: #f7ab07;
	}
	#add-door a:hover{
		color: #f36161;
	}
	td a{
		text-decoration: none;
		color: #f1a98c;
	}
	td a:hover{
		color: #ef6c6c;
	}
</style>
</head>
<body><!-- body-start  -->

<h2>门店管理</h2>
<div id="add-door">
	<a href="door_add" target="rightFrame">新增门店</a>
</div>
<hr/>
<table border="1">
	<tr>
		<th class="width-40">序号</th>
		<th>门店名称</th>
		<th class="width-80">联系电话</th>
		<th>门店地址</th>
		<th class="width-80">操 作</th>
	</tr>

	<!-- 模版数据:  model.addAttribute("doorList", list); -->
<c:forEach items="${ doorList }" var="door" varStatus="vs">
	<tr>
		<td>${ vs.count }</td>
		<td>${ door.name }</td>
		<td>${ door.tel }</td>
		<td>${ door.addr }</td>
		<td>
			<a href="doorDelete?id=${ door.id }" 
				onclick="return doorDelete()">删除</a>
			&nbsp;|&nbsp;
			<a href="doorInfo?id=${ door.id }">修改</a>
		</td>
	</tr>
</c:forEach>	
	

	
</table>
<div style="text-align:center;color:#AAA;line-height:40px;">
	提示:删除门店同时会删除该门店下的所有订单!
</div>

<script type="text/javascript">
	function doorDelete(){
		return confirm("删除门店同时会删除该门店下的所有订单,确定要删除吗?");
	}
</script>

</body><!-- body-end  -->
</html>

页面效果:

 

②door_add.jsp

<%@ page pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>新增门店</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
	body{ font-family: "微软雅黑"; background-color: #fff; }
	h2{ text-align: center;font-size:26px; color: gray;}
	table{ margin: 30px auto; text-align: center; border-collapse:collapse; width:50%; border-color: #f0a16c;}
	td, th{ padding: 7px;font-size:18px;color: gray;}
	hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
	input,select,textarea{ width:284px; height:30px; background:#f7e4d0; border:1px solid #ef9b9b; text-indent:5px; font-size:18px; color: gray;}
	input[type='submit']{ width:130px; height:36px; cursor:pointer; border-radius:5px 5px 5px 5px; background:#f5acac; }
	select{text-indent:0px;}
	textarea{height:100px;font-size:22px;}
</style>
</head>
<body><!-- body-start  -->

<h2>新增门店</h2>
<hr/>
<form action="doorAdd" method="POST">
	<table border="1">
		<tr>
			<td width="30%">门店名称</td>
			<td>
				<input type="text" name="name"/>
			</td>
		</tr>
		<tr>
			<td>联系电话</td>
			<td>
				<input type="text" name="tel"/>
			</td>
		</tr>
		<tr>
			<td>门店地址</td>
			<td>
				<input type="text" name="addr"/>
			</td>
		</tr>
		
		<tr>
			<td colspan="2">
				<input type="submit" value="提 	交"/>
			</td>
		</tr>
	</table>
</form>

</body><!-- body-end  -->
</html>

页面效果:

③door_update.jsp

<%@ page pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>修改门店</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
	body{ font-family: "微软雅黑"; background-color: #fff; }
	h2{ text-align: center;font-size:26px; color:gray; }
	table{ margin: 30px auto; text-align: center; border-collapse:collapse; width:50%; border-color: #f0a16c;}
	td, th{ padding: 7px;font-size:18px;color: gray;}
	hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
	input,select,textarea{ width:284px; height:30px; background:#f7e4d0; border:1px solid #ef9b9b; text-indent:5px; font-size:18px; color: gray;}
	input[type='submit']{ width:130px; height:36px; cursor:pointer; border-radius:5px 5px 5px 5px; background:#f5acac;}
	select{text-indent:0px;}
	textarea{height:100px;font-size:22px;}
</style>
</head>
<body><!-- body-start  -->

<h2>修改门店</h2>
<hr/>
<form action="doorUpdate" method="POST">
	<!-- hidden隐藏域,在提交表单时连door.id一起提交 -->
	<input type="hidden" name="id" value="${ door.id }"/>
	<table border="1">
		<tr>
			<td width="30%">门店名称</td>
			<!-- model.addAttribute("door", door ); -->
			<td>
				<input type="text" name="name" value="${ door.name }"/>
			</td>
		</tr>
		<tr>
			<td>联系电话</td>
			<td>
				<input type="text" name="tel" value="${ door.tel }"/>
			</td>
		</tr>
		<tr>
			<td>门店地址</td>
			<td>
				<input type="text" name="addr" value="${ door.addr }"/>
			</td>
		</tr>
		
		<tr>
			<td colspan="2">
				<input type="submit" value="提	交" />
			</td>
		</tr>
	</table>
</form>

</body><!-- body-end  -->
</html>

页面效果:

3、订单管理(order_list.jsp、order_add.jsp、order_update.jsp) 

①order_list.jsp

<%@ page pageEncoding="utf-8"%>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" 
	uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" 
	uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE HTML>
<html>
<head>
<title>订单管理</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
	body{ font-family: "微软雅黑"; background-color: #ffff; }
	h2{ text-align: center;color: gray;}
	table{ width:96%; margin: 0 auto; text-align: center; border-collapse:collapse; font-size:16px;border-color: #f0a16c;}
	td, th{ padding: 5px;color: gray;}
	th{ background-color: #efb78d; width:120px; }
	th.width-40{ width: 40px; }
	th.width-50{ width: 50px; }
	th.width-64{ width: 64px; }
	th.width-80{ width: 80px; }
	th.width-120{ width: 100px; }
	hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
	#add-order{text-align:right;font-size:20px;padding-right: 5%;}
	#add-order a{
		text-decoration: none;
		color: #f7ab07;
	}
	#add-order a:hover{
		color: #f36161;
	}
	td a{
		text-decoration: none;
		color: #f1a98c;
	}
	td a:hover{
		color: #ef6c6c;
	}
</style>
	
<script type="text/javascript">
	
</script>
</head>
<body>
<h2>订单管理</h2>
<div id="add-order">
	<!-- 点击后查询所有门店信息后再跳转到订单新增页面 -->
	<a href="toOrderAdd" target="rightFrame">新增订单</a>
</div>
<hr/>
<table border="1">
	<tr>
		<th class="width-40">序号</th>
		<th class="width-120">所属门店</th>
		<th class="width-50">订单号</th>
		<th class="width-40">类型</th>
		<th class="width-40">人数</th>
		<th class="width-50">收银员</th>
		<th class="width-120">下单时间</th>
		<th class="width-120">结账时间</th>
		<th class="width-50">支付方式</th>
		<th class="width-50">金额</th>
		<th class="width-80">操 作</th>
	</tr>

<!-- 模版数据 model.addAttribute( "oList", orderList ); -->
<c:forEach items="${ oList }" var="order" varStatus="vs">
	<tr>
		<td>${ vs.count }</td>
		<%-- 
		model.addAttribute( "dList", doorList );
		在order对象中虽然没有记录所属的门店名称,但是有记录所属的门店编号
		遍历门店集合,将每一个门店(${door.id})的编号,与订单中记录的所属门店编号(${order.doorId})
		进行比较, 如果二者相等,就取出这个门店编号所对应的门店名称,显示在下面的td标签内部
		--%>
		<td>
			<c:forEach items="${ dList }" var="door">
				${ door.id==order.doorId ? door.name : "" }
			</c:forEach>
		</td>
		<td>${ order.orderNo }</td>
		<td>${ order.orderType }</td>
		<td>${ order.pnum }</td>
		<td>
			<c:forEach items="${ cList }" var="cashier">
				${ cashier.id==order.cashierId ? cashier.cname : "" }
			</c:forEach>
		</td>
		<td>
			<fmt:formatDate value="${ order.orderTime }"
				pattern="yyyy/MM/dd HH:mm:ss"/>
		</td>
		<td>
			<fmt:formatDate value="${ order.payTime }"
				pattern="yyyy/MM/dd HH:mm:ss"/>
		</td>
		<td>${ order.payType }</td>
		<td>${ order.price }</td>
		<td>
			<a href="orderDelete?id=${ order.id }" onclick="return orderDelete()">删除</a>
			&nbsp;|&nbsp;
			<a href="orderInfo?id=${ order.id }">修改</a>
		</td>
	</tr>
</c:forEach>
</table>
<script type="text/javascript">
	function orderDelete(){
		return confirm("确定要删除此订单吗?");
	}
</script>
</body><!-- body-end  -->
</html>

页面效果:

②order_add.jsp

<%@ page pageEncoding="utf-8"%>
<!-- 引入JSTL标签库 -->
<%@ taglib prefix="c" 
	uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML>
<html>
<head>
<title>新增订单</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
	body{ font-family: "微软雅黑"; background-color: #fff; }
	h2{ text-align: center;font-size:26px; color: gray;}
	table{ margin: 30px auto; text-align: center; border-collapse:collapse; width:50%; border-color: #f0a16c;}
	td, th{ padding: 5px;font-size:18px;color: gray;}
	hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
	input,select,textarea{ width:284px; height:30px; background:#f7e4d0; border:1px solid #ef9b9b; text-indent:5px; font-size:18px; color: gray;}
	input[type='submit']{ width:130px; height:36px; cursor:pointer; border-radius:5px 5px 5px 5px; background:#f5acac; }
	select{text-indent:0px;}
	textarea{height:100px;font-size:22px;}
</style>
</head>
<body><!-- body-start  -->

<h2>新增订单</h2>
<hr/>
<form action="orderAdd" method="POST">
	<table border="1">
		<tr>
			<td width="30%">所属门店</td>
			<!-- model.addAttribute( "dList", doorList );
				通过c:forEach遍历门店集合,将每一个门店作为一个option(选项)添加到
				下拉选框中,每一个选框上显示的是门店名称,但如果选项被选中了,提交的则是
				门店的编号(也就是value值),因为订单表中只有保存门店编号的列,没有保存
				门店名称的列. -->
			<td>
				<select name="doorId">
				  <c:forEach items="${ dList }" var="door">
					<option value="${ door.id }">${ door.name }</option>
				  </c:forEach>
				</select>
			</td>
		</tr>
		<tr>
			<td>订单编号</td>
			<td>
				<input type="text" name="orderNo"/>
			</td>
		</tr>
		<tr>
			<td>订单类型</td>
			<td>
<%--				<input type="text" name="orderType" --%>
<%--						value="堂食"/>--%>
				<select id="orderType" name="orderType">
					<option value="食堂" selected>食堂</option>
					<option value="外卖">外卖</option>
					<option value="打包">打包</option>
				</select>
			</td>
		</tr>
		<tr>
			<td>用餐人数</td>
			<td>
				<input type="text" name="pnum"
						value="1"/>
			</td>
		</tr>
		<tr>
			<td>收银员</td>
			<td>
				<select name="cashierId">
					<c:forEach items="${ cList }" var="cashier">
						<option value="${ cashier.id }">${ cashier.cname }</option>
					</c:forEach>
				</select>
			</td>
		</tr>
		<tr>
			<td>支付方式</td>
			<td>
<%--				<input type="text" name="payType"--%>
<%--						value="微支付"/>--%>
				<select id="payType" name="payType">
					<option value="微支付" selected>微支付</option>
					<option value="支付宝">支付宝</option>
					<option value="现金">现金</option>
				</select>
				
			</td>
		</tr>
		<tr>
			<td>下单时间</td>
			<td>
				<input type="text" name="orderTime" />

			</td>
		</tr>
		<tr>
			<td>结账时间</td>
			<td>
				<input type="text" name="payTime" />

			</td>
		</tr>
		<tr>
			<td>支付金额</td>
			<td>
				<input type="text" name="price"/>
				
			</td>

		</tr>
		<tr>
			<td colspan="2">
				<input type="submit" value="提 	交"/>
			</td>
		</tr>
	</table>
</form>

</body><!-- body-end  -->
</html>



页面效果:

③order_update.jsp

<%@ page pageEncoding="utf-8"%>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE HTML>
<html>
<head>
<title>修改订单</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
	body{ font-family: "微软雅黑"; background-color: #fff; }
	h2{ text-align: center;font-size:26px; color: gray;}
	table{ margin: 30px auto; text-align: center; border-collapse:collapse; width:50%; border-color: #f0a16c;}
	td, th{ padding: 5px;font-size:18px;color: gray;}
	hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
	input,select,textarea{ width:284px; height:30px; background:#f7e4d0; border:1px solid #ef9b9b; text-indent:5px; font-size:18px; color: gray;}
	input[type='submit']{ width:130px; height:36px; cursor:pointer; border-radius:5px 5px 5px 5px; background:#f5acac; }
	select{text-indent:0px;}
	textarea{height:100px;font-size:22px;}
</style>
</head>
<body><!-- body-start  -->

<h2>修改订单</h2>
<hr/>
<form action="orderUpdate" method="POST">
	<!-- hidden隐藏域,在提交表单时连order.id一起提交 -->
	<input type="hidden" name="id" value="${ order.id }"/>
	<table border="1">
		<tr>
			<!-- model.addAttribute( "dList", doorList );
			通过c:forEach遍历门店集合,将每一个门店作为一个option(选项)添加到
			下拉选框中,每一个选框上显示的是门店名称,但如果选项被选中了,提交的则是
			门店的编号(也就是value值),因为订单表中只有保存门店编号的列,没有保存
			门店名称的列. 
			设置所属门店的回显: 将订单中记录的门店编号,和正在遍历的每一个门店的编号
			进行比较,如果相等,就将当前这个option设置为默认被选中(加上selected属性即可!).
			-->
			<td width="30%">所属门店</td>
			<td>
				<select id="doorId" name="doorId">
				  <c:forEach items="${ dList }" var="door">
				  	<%--
					<c:if test="${ order.doorId == door.id }">
					  <option value="${ door.id }" selected="selected">${ door.name }</option>
					</c:if>
					<c:if test="${ order.doorId != door.id }">
					  <option value="${ door.id }">${ door.name }</option>
				  	</c:if> --%>
				  	
				  	<option ${ order.doorId==door.id ? "selected='selected'" : "" } 
				  		value="${ door.id }">${ door.name }</option>
				  	
				  </c:forEach>
				</select>
			</td>
		</tr>
		<!-- model.addAttribute("order", order); -->
		<tr>
			<td>订单编号</td>
			<td>
				<input type="text" name="orderNo" value="${ order.orderNo }"/>
			</td>
		</tr>
		<tr>
			<td>订单类型</td>
			<td>
<%--				<input type="text" name="orderType" value="${ order.orderType }"/>--%>
				<select id="orderType" name="orderType">
					<option ${ order.orderType=='食堂' ? "selected='selected'" : ""} value="食堂">食堂</option>
					<option ${ order.orderType=='外卖' ? "selected='selected'" : ""} value="外卖">外卖</option>
					<option ${ order.orderType=='打包' ? "selected='selected'" : ""} value="打包">打包</option>
				</select>
			</td>
		</tr>
		<tr>
			<td>用餐人数</td>
			<td>
				<input type="text" name="pnum" value="${ order.pnum }"/>
			</td>
		</tr>
		<tr>
			<td>收银员</td>
			<td>
				<select id="cashierId" name="cashierId">
					<c:forEach items="${ cList }" var="cashier">
						<option ${ order.cashierId==cashier.id ? "selected='selected'" : "" }
								value="${ cashier.id }">${ cashier.cname }</option>
					</c:forEach>
				</select>
			</td>
		</tr>
		<tr>
			<td>下单时间</td>
			<td>
				<input type="text" name="orderTime"
					value='<fmt:formatDate
						value="${ order.orderTime }"
						pattern="yyyy/MM/dd HH:mm:ss"/>'/>
<%--						pattern="yyyy-MM-dd'T'HH:mm:ss"/>'/>--%>
			</td>
		</tr>
		<tr>
			<td>结账时间</td>
			<td>
				<input type="text" name="payTime"
					value='<fmt:formatDate 
						value="${ order.payTime }"
						pattern="yyyy/MM/dd HH:mm:ss"/>'/>
			</td>
		</tr>
		<tr>
			<td>支付方式</td>
			<td>
<%--				<input type="text" name="payType" value="${ order.payType }"/>--%>
				<select id="payType" name="payType">
					<option ${ order.payType=='微支付' ? "selected='selected'" : ""} value="微支付">微支付</option>
					<option ${ order.payType=='支付宝' ? "selected='selected'" : ""} value="支付宝">支付宝</option>
					<option ${ order.payType=='现金' ? "selected='selected'" : ""} value="现金">现金</option>
				</select>
			</td>
		</tr>
		<tr>
			<td>支付金额</td>
			<td>
				<input type="text" name="price" value="${ order.price }"/>
			</td>
		</tr>
		<tr>
			<td colspan="2">
				<input type="submit" value="提 	交"/>
			</td>
		</tr>
	</table>
</form>

</body><!-- body-end  -->
</html>

页面效果:

3、收银员管理(cashier_list.jsp、cashier_add.jsp、cashier_update.jsp) 

①cashier_list.jsp

<%@ page pageEncoding="utf-8"%>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c"
           uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"
           uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE HTML>
<html>
<head>
    <title>订单管理</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <style type="text/css">
        body{ font-family: "微软雅黑"; background-color: #ffff; }
        h2{ text-align: center;color: gray;}
        table{ width:96%; margin: 0 auto; text-align: center; border-collapse:collapse; font-size:16px;border-color: #f0a16c;}
        td, th{ padding: 5px;color: gray;}
        th{ background-color: #efb78d; width:120px; }
        th.width-40{ width: 40px; }
        th.width-50{ width: 50px; }
        th.width-30{ width: 30px; }
        th.width-80{ width: 80px; }
        th.width-120{ width: 120px; }
        hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
        #add-cashier{text-align:right;font-size:20px;padding-right: 5%;}
        #add-cashier a{
            text-decoration: none;
            color: #f7ab07;
        }
        #add-order a:hover{
            color: #f36161;
        }
        td a{
            text-decoration: none;
            color: #f1a98c;
        }
        td a:hover{
            color: #ef6c6c;
        }
    </style>

    <script type="text/javascript">

    </script>
</head>
<body>
<h2>收银员管理</h2>
<div id="add-cashier">
    <!-- 点击后查询所有门店信息后再跳转到订单新增页面 -->
    <a href="toCashierAdd" target="rightFrame">新增收银员</a>
</div>
<hr/>
<table border="1">
    <tr>
        <th class="width-30">序号</th>
        <th class="width-50">姓名</th>
        <th class="width-30">性别</th>
        <th class="width-30">年龄</th>
        <th class="width-40">联系电话</th>
        <th class="width-80">工作时间段</th>
        <th class="width-120">所属门店</th>
        <th class="width-80">操 作</th>
    </tr>

    <c:forEach items="${ cList }" var="cashier" varStatus="vs">
        <tr>
            <td>${ vs.count }</td>
            <td>${ cashier.cname }</td>
            <td>${ cashier.gender }</td>
            <td>${ cashier.age }</td>
            <td>${ cashier.telephone }</td>
            <td>${ cashier.work_time }</td>
            <td>
                <c:forEach items="${ dList }" var="door">
                    ${ door.id==cashier.door_id ? door.name : "" }
                </c:forEach>
            </td>
            <td>
                <a href="cashierDelete?id=${ cashier.id }" onclick="return cashierDelete()">删除</a>
                &nbsp;|&nbsp;
                <a href="cashierInfo?id=${ cashier.id }">修改</a>
            </td>
        </tr>
    </c:forEach>
</table>
<script type="text/javascript">
    function cashierDelete(){
        return confirm("确定要删除此收银员信息吗?");
    }
</script>
</body><!-- body-end  -->
</html>

页面效果:

②cashier_add.jsp

<%@ page pageEncoding="utf-8"%>
<!-- 引入JSTL标签库 -->
<%@ taglib prefix="c"
           uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML>
<html>
<head>
    <title>新增菜单</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <style type="text/css">
        body{ font-family: "微软雅黑"; background-color: #fff; }
        h2{ text-align: center;font-size:26px; color: gray;}
        table{ margin: 30px auto; text-align: center; border-collapse:collapse; width:50%; border-color: #f0a16c;}
        td, th{ padding: 5px;font-size:18px;color: gray;}
        hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
        input,select,textarea{ width:284px; height:30px; background:#f7e4d0; border:1px solid #ef9b9b; text-indent:5px; font-size:18px; color: gray;}
        input[type='submit']{ width:130px; height:36px; cursor:pointer; border-radius:5px 5px 5px 5px; background:#f5acac; }
        select{text-indent:0px;}
        textarea{height:100px;font-size:22px;}
    </style>
</head>
<body><!-- body-start  -->

<h2>新增收银员</h2>
<hr/>
<form action="cashierAdd" method="POST">
    <table border="1">
        <tr>
            <td>姓名</td>
            <td>
                <input type="text" name="cname"/>
            </td>
        </tr>
        <tr>
            <td>性别</td>
            <td>
                <select id="gender" name="gender">
                    <option value="男" selected>男</option>
                    <option value="女">女</option>
                </select>
            </td>
        </tr>
        <tr>
            <td>年龄</td>
            <td>
                <input type="number" name="age" min="18" max="60"/>
            </td>
        </tr>
        <tr>
            <td>联系电话</td>
            <td>
                <input type="text" name="telephone"/>
            </td>
        </tr>
        <tr>
            <td>工作时间段</td>
            <td>
                <input type="text" name="work_time"/>
            </td>
        </tr>
        <tr>
            <td width="30%">所属门店</td>
            <td>
                <select name="door_id">
                    <c:forEach items="${ dList }" var="door">
                        <option value="${ door.id }">${ door.name }</option>
                    </c:forEach>
                </select>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提 	交"/>
            </td>
        </tr>
    </table>
</form>
</body>
</html>

页面效果:

③cashier_update.jsp

<%@ page pageEncoding="utf-8"%>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE HTML>
<html>
<head>
    <title>修改收银员信息</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <style type="text/css">
        body{ font-family: "微软雅黑"; background-color: #fff; }
        h2{ text-align: center;font-size:26px; color: gray;}
        table{ margin: 30px auto; text-align: center; border-collapse:collapse; width:50%; border-color: #f0a16c;}
        td, th{ padding: 5px;font-size:18px;color: gray;}
        hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
        input,select,textarea{ width:284px; height:30px; background:#f7e4d0; border:1px solid #ef9b9b; text-indent:5px; font-size:18px; color: gray;}
        input[type='submit']{ width:130px; height:36px; cursor:pointer; border-radius:5px 5px 5px 5px; background:#f5acac; }
        select{text-indent:0px;}
        textarea{height:100px;font-size:22px;}
    </style>
</head>
<body><!-- body-start  -->

<h2>修改收银员信息</h2>
<hr/>
<form action="cashierUpdate" method="POST">
    <!-- hidden隐藏域,在提交表单时连order.id一起提交 -->
    <input type="hidden" name="id" value="${ cashier.id }"/>
    <table border="1">
        <tr>
            <td>姓名</td>
            <td>
                <input type="text" name="cname" value="${ cashier.cname }"/>
            </td>
        </tr>

        <tr>
            <td>性别  </td>
            <td>
                <select id="gender" name="gender">
                    <option ${ cashier.gender=='男' ? "selected='selected'" : ""} value="男">男</option>
                    <option ${ cashier.gender=='女' ? "selected='selected'" : ""} value="女">女</option>
                </select>
            </td>
        </tr>
        <tr>
            <td>年龄</td>
            <td>
                <input type="number" name="age" value="${ cashier.age }"/>
            </td>
        </tr>
        <tr>
            <td>联系电话</td>
            <td>
                <input type="text" name="telephone" value="${ cashier.telephone }"/>
            </td>
        </tr>
        <tr>
            <td>工作时间段</td>
            <td>
                <input type="text" name="work_time" value="${ cashier.work_time }"/>
            </td>
        </tr>
        <tr>
            <td width="30%">所属门店</td>
            <td>
                <select id="door_id" name="door_id">
                    <c:forEach items="${ dList }" var="door">
                        <option ${ cashier.door_id==door.id ? "selected='selected'" : "" }
                                value="${ door.id }">${ door.name }</option>
                    </c:forEach>
                </select>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提 	交"/>
            </td>
        </tr>
    </table>
</form>
</body>
</html>

页面效果:

5、菜单管理(menu_list.jsp、menu_add.jsp、menu_update.jsp) 

①menu_list.jsp

<%@ page pageEncoding="utf-8"%>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c"
           uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"
           uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE HTML>
<html>
<head>
    <title>菜单管理</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <style type="text/css">
        body{ font-family: "微软雅黑"; background-color: #ffff; }
        h2{ text-align: center;color: gray;}
        table{ width:96%; margin: 0 auto; text-align: center; border-collapse:collapse; font-size:16px;border-color: #f0a16c;}
        td, th{ padding: 5px;color: gray;}
        th{ background-color: #efb78d; width:120px; }
        th.width-50{ width: 50px; }
        th.width-30{ width: 30px; }
        th.width-60{ width: 60px; }
        th.width-120{ width: 120px; }
        hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
        .do{
            display: flex;
        }
        #search-menu{
            width: 80%;
            padding-left: 3%;
        }
        #search-menu input{
            height: 30px;
            text-align: center;
            margin-right: 10px;
            border-radius:5px 5px 5px 5px;
            border-color: #f0a16c;
        }
        #search-menu input[type='submit']{
            width:60px;
            cursor:pointer;
            background: #f1a98c;
            border: #ef6c6c;
            color: darkslategray;
            font-size: 16px;
        }
        #add-menu{text-align:right;font-size:20px;width:20%;padding-right: 5%;}
        #add-menu a{
            text-decoration: none;
            color: #f7ab07;
        }
        #add-order a:hover{
            color: #f36161;
        }
        td a{
            text-decoration: none;
            color: #f1a98c;
        }
        td a:hover{
            color: #ef6c6c;
        }

    </style>
<%--    <script src="/js/jquery.min.js" type="text/javascript"></script>--%>
<%--    <script>--%>
<%--        // 页面加载--%>
<%--        $(function(){--%>
<%--            var dish_name = $(".dish_name").val().trim()--%>
<%--            var discription = $(".discription").val().trim()--%>
<%--            $(".search_btn").click(function(){--%>
<%--                // 发送ajax的请求--%>
<%--                $.ajax({--%>
<%--                    url:"menuSearch?dish_name="+dish_name+"&discription="+discription,--%>
<%--                    type:"get",--%>
<%--                    success:function(value){--%>
<%--                        console.log("查询成功")--%>
<%--                    }--%>
<%--                });--%>
<%--            });--%>
<%--        });--%>
<%--    </script>--%>
</head>
<body>
<h2>菜单管理</h2>
<div class="do">
    <div id="search-menu">
        <form action="menuSearch" method="GET">
            <input type="text" placeholder="请输入菜名" name="dish_name">
            <input type="text" placeholder="请输入描述关键字" name="discription">
            <input type="submit" value="查找" class="search_btn">
        </form>
    </div>
    <div id="add-menu">
        <!-- 点击后查询所有菜单信息后再跳转到菜单新增页面 -->
        <a href="toMenuAdd" target="rightFrame">新增菜单</a>
    </div>
</div>
<hr/>
<table border="1">
    <tr>
        <th class="width-30">序号</th>
        <th class="width-50">菜名</th>
        <th class="width-30">价格</th>
        <th class="width-120">描述</th>
        <th class="width-60">照片</th>
        <th class="width-30">类别</th>
        <th class="width-60">操 作</th>
    </tr>

    <c:forEach items="${ mList }" var="menu" varStatus="vs">
        <tr>
            <td>${ vs.count }</td>
            <td>${ menu.dish_name }</td>
            <td>${ menu.dish_price }</td>
            <td>${ menu.discription }</td>
            <td><img src="${ menu.img }" alt="${ menu.dish_name }" width="75px" height="60px"/>  </td>
            <td>
                <c:forEach items="${ cList }" var="category">
                    ${ menu.category_id==category.id ? category.category : "" }
                </c:forEach>
            </td>

            <td>
                <a href="menuDelete?id=${ menu.id }" onclick="return menuDelete()">删除</a>
                &nbsp;|&nbsp;
                <a href="menuInfo?id=${ menu.id }">修改</a>
            </td>
        </tr>
    </c:forEach>
</table>
<script type="text/javascript">
    function menuDelete(){
        return confirm("确定要删除此菜单吗?");
    }
</script>
</body>
</html>

页面效果:

②menu_add.jsp

<%@ page pageEncoding="utf-8"%>
<!-- 引入JSTL标签库 -->
<%@ taglib prefix="c"
           uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML>
<html>
<head>
    <title>新增菜单</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <style type="text/css">
        body{ font-family: "微软雅黑"; background-color: #fff; }
        h2{ text-align: center;font-size:26px; color: gray;}
        table{ margin: 30px auto; text-align: center; border-collapse:collapse; width:50%; border-color: #f0a16c;}
        td, th{ padding: 5px;font-size:18px;color: gray;}
        hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
        input,select,textarea{ width:284px; height:30px; background:#f7e4d0; border:1px solid #ef9b9b; text-indent:5px; font-size:18px; color: gray;}
        input[type='submit']{ width:130px; height:36px; cursor:pointer; border-radius:5px 5px 5px 5px; background:#f5acac; }
        select{text-indent:0px;}
        textarea{height:100px;font-size:22px;}
    </style>
    <script src="/js/jquery.js" type="text/javascript"></script>
    <script>
        $(function(){
            // 上传图片
            $(".imgurl").on("change", function(){
                var upload = new FormData();
                var fileInput = $(this)[0]; // 获取原生的DOM元素

                // 检查是否有文件被选中
                if(fileInput.files && fileInput.files[0]){
                    // 将文件添加到FormData对象中
                    upload.append("imgurl", fileInput.files[0]);

                    $.ajax({
                        url: "/upload",
                        type: "post",
                        data: upload,
                        // 必须设置为false,以便发送正确的数据格式(multipart/form-data)
                        contentType: false,
                        // 必须设置为false,以便jQuery不处理发送的数据
                        processData: false,
                        success: function (value) {
                            $(".imgbox img").attr('src', value)
                            $(".img").empty();
                            // 给隐藏域设置值
                            $(".img").val(value);
                        },
                        error: function () {
                            alert("上传图像出错啦!");
                        }
                    });
                } else {
                    alert("请上传图片");
                }
            });
        });
    </script>
</head>
<body><!-- body-start  -->

<h2>新增菜单</h2>
<hr/>
<form action="menuAdd" method="POST">
    <table border="1">
        <tr>
            <td>菜名</td>
            <td>
                <input type="text" name="dish_name"/>
            </td>
        </tr>
        <tr>
            <td>价格</td>
            <td>
                <input type="text" name="dish_price"/>
            </td>
        </tr>
        <tr>
            <td>描述</td>
            <td>
<%--                <input type="text" name="discription"/>--%>
                <textarea name="discription"></textarea>
            </td>
        </tr>
        <tr>
            <td>图片</td>
            <td>
                <input type="file" name="imgurl" class="imgurl"/>
                <input type="hidden" name="img" class="img"/>
                <div class="imgbox">
                    <img src="" alt="${ menu.dish_name }" width="75px" height="60px"/>
                </div>
            </td>
        </tr>
        <tr>
            <td width="30%">类别</td>
            <td>
                <select name="categoryId">
                    <c:forEach items="${ cList }" var="category">
                        <option value="${ category.id }">${ category.category }</option>
                    </c:forEach>
                </select>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提 	交"/>
            </td>
        </tr>
    </table>
</form>
</body>
</html>

页面效果:

③menu_update.jsp

<%@ page pageEncoding="utf-8"%>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE HTML>
<html>
<head>
    <title>修改菜单</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <style type="text/css">
        body{ font-family: "微软雅黑"; background-color: #fff; }
        h2{ text-align: center;font-size:26px; color: gray;}
        table{ margin: 30px auto; text-align: center; border-collapse:collapse; width:50%; border-color: #f0a16c;}
        td, th{ padding: 5px;font-size:18px;color: gray;}
        hr{ margin-bottom:20px; border:1px solid #f1b5b5; }
        input,select,textarea{ width:284px; height:30px; background:#f7e4d0; border:1px solid #ef9b9b; text-indent:5px; font-size:18px; color: gray;}
        input[type='submit']{ width:130px; height:36px; cursor:pointer; border-radius:5px 5px 5px 5px; background:#f5acac; }
        select{text-indent:0px;}
        textarea{height:100px;font-size:22px;}
    </style>
    <script src="/js/jquery.js" type="text/javascript"></script>
    <script>
        $(function(){
            // 上传图片
            $(".imgurl").on("change", function(){
                var upload = new FormData();
                var fileInput = $(this)[0]; // 获取原生的DOM元素

                // 检查是否有文件被选中
                if(fileInput.files && fileInput.files[0]){
                    // 将文件添加到FormData对象中
                    upload.append("imgurl", fileInput.files[0]);

                    $.ajax({
                        url: "/upload",
                        type: "post",
                        data: upload,
                        // 必须设置为false,以便发送正确的数据格式(multipart/form-data)
                        contentType: false,
                        // 必须设置为false,以便jQuery不处理发送的数据
                        processData: false,
                        success: function (value) {
                            $(".imgbox img").attr('src', value)
                            $(".img").empty();
                            // 给隐藏域设置值
                            $(".img").val(value);
                        },
                        error: function () {
                            alert("上传图像出错啦!");
                        }
                    });
                } else {
                    alert("请上传图片");
                }
            });
        });
    </script>
</head>
<body><!-- body-start  -->

<h2>修改订单</h2>
<hr/>
<form action="menuUpdate" method="POST" enctype="multipart/form-data">
    <!-- hidden隐藏域,在提交表单时连order.id一起提交 -->
    <input type="hidden" name="id" value="${ menu.id }"/>
    <table border="1">
        <tr>
            <td>菜名</td>
            <td>
                <input type="text" name="dish_name" value="${ menu.dish_name }"/>
            </td>
        </tr>

        <tr>
            <td>价格</td>
            <td>
                <input type="text" name="dish_price" value="${ menu.dish_price }"/>
            </td>
        </tr>
        <tr>
            <td>描述</td>
            <td>
<%--                <input type="text" name="discription" value="${ menu.discription }"/>--%>
                <textarea name="discription">${ menu.discription }</textarea>
            </td>
        </tr>
        <tr>
            <td>图片</td>
            <td>
                <input type="file" name="imgurl" class="imgurl"/>
                <input type="hidden" name="img" class="img"/>
                <div class="imgbox">
                    <img src="${menu.img}" alt="${ menu.dish_name }" width="75px" height="60px"/>
                </div>
            </td>
        </tr>
        <tr>
            <td width="30%">类别</td>
            <td>
                <select id="category_id" name="category_id">
                    <c:forEach items="${ cList }" var="category">
                        <option ${ menu.category_id==category.id ? "selected='selected'" : "" }
                                value="${ category.id }">${ category.category }</option>
                    </c:forEach>
                </select>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提 	交"/>
            </td>
        </tr>
    </table>
</form>
</body>
</html>

页面效果:

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值