旅游网后台管理系统(二)订单操作

1. 创建表

1.1 表之间的关系

在这里插入图片描述

  • 订单表和产品表之间的关系为:多对一
  • 订单表和会员表之间的关系为:多对一
  • 订单表和旅客表之间的关系为:多对多

1.2 会员表

序号 字段名称 字段类型 字段描述
1 id int(11) 主键,自增长
2 name varchar(20) 姓名
3 nickName varchar(20) 昵称
4 phoneNum varchar(20) 电话号码
5 email varchar(50) 邮箱
DROP TABLE IF EXISTS `member`;
CREATE TABLE `member` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `nickName` varchar(20) DEFAULT NULL,
  `phoneNum` varchar(20) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO `member` VALUES ('1', '张三', '小三', '18888888888', '[email protected]');

1.3 旅客表

序号 字段名称 字段类型 字段描述
1 id int(11) 主键,自增长
2 name varchar(20) 姓名
3 sex varchar(20) 性别
4 phoneNum varchar(20) 电话号码
5 credentialsType int(11) 证件类型:0身份证 1护照 2军官证
6 credentialsNum varchar(50) 证件号码
7 travellerType int(11) 旅客类型:0成人 1儿童
DROP TABLE IF EXISTS `traveller`;
CREATE TABLE `traveller` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `sex` varchar(20) DEFAULT NULL,
  `phoneNum` varchar(20) DEFAULT NULL,
  `credentialsType` int(11) DEFAULT NULL,
  `credentialsNum` varchar(50) DEFAULT NULL,
  `travellerType` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `traveller` VALUES ('1', '张龙', '男', '13333333333', '0', '123456789009876543', '0');
INSERT INTO `traveller` VALUES ('2', '张小龙', '男', '15555555555', '0', '987654321123456789', '1');

1.4 订单表

序号 字段名称 字段类型 字段描述
1 id int(11) 主键,自增长
2 orderNum varchar(50) 订单编号,唯一,不为空
3 orderTime datetime 下单时间
4 peopleCount int(11) 出行人数
5 orderDesc varchar(255) 订单描述
6 payType int(11) 支付方式(0支付宝 1 微信 2其它)
7 orderStatus int(11) 订单状态(0未支付 1已支付)
8 productId int(11) 产品 id(外键)
9 memberId int(11) 会员 id(外键)
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orderNum` varchar(50) NOT NULL,
  `orderTime` datetime DEFAULT NULL,
  `peopleCount` int(11) DEFAULT NULL,
  `orderDesc` varchar(255) DEFAULT NULL,
  `payType` int(11) DEFAULT NULL,
  `orderStatus` int(11) DEFAULT NULL,
  `productId` int(11) DEFAULT NULL,
  `memberId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `orderNum` (`orderNum`),
  KEY `memberId` (`memberId`),
  KEY `productId` (`productId`),
  CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`memberId`) REFERENCES `member` (`id`),
  CONSTRAINT `orders_ibfk_2` FOREIGN KEY (`productId`) REFERENCES `product` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

INSERT INTO `orders` VALUES ('1', '12345', '2019-10-19 16:15:05', '2', '没什么', '0', '1', '1', '1');
INSERT INTO `orders` VALUES ('2', '54321', '2019-10-26 16:17:41', '2', '没什么', '0', '1', '3', '1');
INSERT INTO `orders` VALUES ('3', '56789', '2019-10-23 16:19:26', '3', '没什么', '1', '1', '7', '1');
INSERT INTO `orders` VALUES ('4', '98765', '2019-10-22 16:20:56', '3', '没什么', '2', '1', '8', '1');
INSERT INTO `orders` VALUES ('5', '11111', '2019-10-25 16:22:52', '4', '没什么', '2', '1', '8', '1');
INSERT INTO `orders` VALUES ('6', '22222', '2019-10-19 16:23:26', '4', '没什么', '0', '1', '2', '1');
INSERT INTO `orders` VALUES ('7', '33333', '2019-10-26 16:24:14', '4', '没什么', '0', '1', '3', '1');

1.5 订单与旅客中间表

序号 字段名称 字段类型 字段描述
1 orderId int(11) 订单 id(外键)
2 travellerId int(11) 旅客 id(外键)
DROP TABLE IF EXISTS `order_traveller`;
CREATE TABLE `order_traveller` (
  `orderId` int(11) NOT NULL,
  `travellerId` int(11) NOT NULL,
  PRIMARY KEY (`orderId`,`travellerId`),
  KEY `travellerId` (`travellerId`),
  CONSTRAINT `order_traveller_ibfk_1` FOREIGN KEY (`orderId`) REFERENCES `orders` (`id`),
  CONSTRAINT `order_traveller_ibfk_2` FOREIGN KEY (`travellerId`) REFERENCES `traveller` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `order_traveller` VALUES ('1', '1');
INSERT INTO `order_traveller` VALUES ('2', '1');
INSERT INTO `order_traveller` VALUES ('3', '1');
INSERT INTO `order_traveller` VALUES ('1', '2');
INSERT INTO `order_traveller` VALUES ('2', '2');
INSERT INTO `order_traveller` VALUES ('3', '2');

2. 实现查询订单操作

2.1 编写实体类

/**
 * 会员实体类
 */
public class Member implements Serializable {
    private Integer id; // 主键
    private String name; // 会员姓名
    private String nickName; //会员昵称
    private String phoneNum; //会员电话
    private String email; // 会员邮箱

    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 getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Member{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                ", phoneNum='" + phoneNum + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

/**
 * 旅客实体类
 */
public class Traveller implements Serializable {
    private Integer id; // 主键
    private String name; // 旅客姓名
    private String sex; // 旅客性别
    private String phoneNum; // 旅客电话
    private Integer credentialsType; // 旅客证件类型(0身份证 1护照 2军官证)
    private String credentialsTypeStr; // 旅客证件类型字符串
    private String credentialsNum; // 旅客证件号
    private Integer travellerType; // 旅客类型(0成人 1儿童)
    private String travellerTypeStr; //旅客类型字符串

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    public Integer getCredentialsType() {
        return credentialsType;
    }

    public void setCredentialsType(Integer credentialsType) {
        this.credentialsType = credentialsType;
    }

    public String getCredentialsTypeStr() {
        if (credentialsType != null) {
            if (credentialsType == 0) {
                credentialsTypeStr = "身份证";
            }
            if (credentialsType == 1) {
                credentialsTypeStr = "护照";
            }
            if (credentialsType == 2) {
                credentialsTypeStr = "军官证";
            }
        }
        return credentialsTypeStr;
    }

    public void setCredentialsTypeStr(String credentialsTypeStr) {
        this.credentialsTypeStr = credentialsTypeStr;
    }

    public String getCredentialsNum() {
        return credentialsNum;
    }

    public void setCredentialsNum(String credentialsNum) {
        this.credentialsNum = credentialsNum;
    }

    public Integer getTravellerType() {
        return travellerType;
    }

    public void setTravellerType(Integer travellerType) {
        this.travellerType = travellerType;
    }

    public String getTravellerTypeStr() {
        if (travellerType != null) {
            if (travellerType == 0) {
                travellerTypeStr = "成人";
            }
            if (travellerType == 1) {
                travellerTypeStr = "儿童";
            }
        }
        return travellerTypeStr;
    }

    public void setTravellerTypeStr(String travellerTypeStr) {
        this.travellerTypeStr = travellerTypeStr;
    }

    @Override
    public String toString() {
        return "Traveller{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", phoneNum='" + phoneNum + '\'' +
                ", credentialsType=" + credentialsType +
                ", credentialsTypeStr='" + credentialsTypeStr + '\'' +
                ", credentialsNum='" + credentialsNum + '\'' +
                ", travellerType=" + travellerType +
                ", travellerTypeStr='" + travellerTypeStr + '\'' +
                '}';
    }
}

/**
 * 订单实体类
 */
public class Orders implements Serializable {
    private Integer id; // 主键
    private String orderNum; // 订单编号
    private Date orderTime; // 下单时间
    private String orderTimeStr; // 下单时间字符串
    private Integer peopleCount; // 出行人数
    private String orderDesc; // 订单描述
    private Integer payType; // 支付方式(0支付宝 1 微信 2其它)
    private String payTypeStr; // 支付方式字符串
    private Integer orderStatus; // 订单状态(0未支付 1 已支付)
    private String orderStatusStr; // 订单状态字符串
    private Product product; // 产品
    private Member member; // 会员
    private List<Traveller> travellers; // 旅客

    public Integer getId() {
        return id;
    }

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

    public String getOrderNum() {
        return orderNum;
    }

    public void setOrderNum(String orderNum) {
        this.orderNum = orderNum;
    }

    public Date getOrderTime() {
        return orderTime;
    }

    public void setOrderTime(Date orderTime) {
        this.orderTime = orderTime;
    }

    public String getOrderTimeStr() {
        if (orderTime != null) {
            orderTimeStr = DateUtils.date2String(orderTime, "yyyy-MM-dd HH:mm:ss");
        }
        return orderTimeStr;
    }

    public void setOrderTimeStr(String orderTimeStr) {
        this.orderTimeStr = orderTimeStr;
    }

    public Integer getPeopleCount() {
        return peopleCount;
    }

    public void setPeopleCount(Integer peopleCount) {
        this.peopleCount = peopleCount;
    }

    public String getOrderDesc() {
        return orderDesc;
    }

    public void setOrderDesc(String orderDesc) {
        this.orderDesc = orderDesc;
    }

    public Integer getPayType() {
        return payType;
    }

    public void setPayType(Integer payType) {
        this.payType = payType;
    }

    public String getPayTypeStr() {
        if (payType != null) {
            if (payType == 0) {
                payTypeStr = "支付宝";
            } else if (payType == 1) {
                payTypeStr = "微信";
            } else if (payType == 2) {
                payTypeStr = "其他";
            }
        }
        return payTypeStr;
    }

    public void setPayTypeStr(String payTypeStr) {
        this.payTypeStr = payTypeStr;
    }

    public Integer getOrderStatus() {
        return orderStatus;
    }

    public void setOrderStatus(Integer orderStatus) {
        this.orderStatus = orderStatus;
    }

    public String getOrderStatusStr() {
        if (orderStatus != null) {
            if (orderStatus == 0) {
                orderStatusStr = "未支付";
            } else if (orderStatus == 1) {
                orderStatusStr = "已支付";
            }
        }
        return orderStatusStr;
    }

    public void setOrderStatusStr(String orderStatusStr) {
        this.orderStatusStr = orderStatusStr;
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public Member getMember() {
        return member;
    }

    public void setMember(Member member) {
        this.member = member;
    }

    public List<Traveller> getTravellers() {
        return travellers;
    }

    public void setTravellers(List<Traveller> travellers) {
        this.travellers = travellers;
    }

    @Override
    public String toString() {
        return "Orders{" +
                "id='" + id + '\'' +
                ", orderNum='" + orderNum + '\'' +
                ", orderTime=" + orderTime +
                ", orderTimeStr='" + orderTimeStr + '\'' +
                ", peopleCount=" + peopleCount +
                ", orderDesc='" + orderDesc + '\'' +
                ", payType=" + payType +
                ", payTypeStr='" + payTypeStr + '\'' +
                ", orderStatus=" + orderStatus +
                ", orderStatusStr='" + orderStatusStr + '\'' +
                ", product=" + product +
                ", member=" + member +
                ", travellers=" + travellers +
                '}';
    }
}

2.2 编写持久层接口

@Repository
public interface OrdersDao {
    /**
     * 查询所有订单
     * @return
     */
    @Select("select * from orders")
    @Results({
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "orderNum", column = "orderNum"),
            @Result(property = "orderTime", column = "orderTime"),
            @Result(property = "peopleCount", column = "peopleCount"),
            @Result(property = "orderDesc", column = "orderDesc"),
            @Result(property = "payType", column = "payType"),
            @Result(property = "orderStatus", column = "orderStatus"),
            @Result(property = "product", column = "productId",one = @One(select = "com.zt.dao.ProductDao.findById")),
    })
    List<Orders> findAll() throws Exception;
}

@Repository
public interface ProductDao {

    /**
     * 查询单个产品
     * @param id
     * @return
     * @throws Exception
     */
    @Select("select * from product where id=#{id}")
    Product findById(Integer id) throws Exception;
}

2.3 编写业务层接口和实现类

public interface OrdersService {
    /**
     * 查询所有订单
     * @return
     * @throws Exception
     */
    List<Orders> findAll() throws Exception;
}
@Transactional
@Service("ordersService")
public class OrdersServiceImpl implements OrdersService {
    @Autowired
    private OrdersDao ordersDao;

    /**
     * 查询所有订单
     * @return
     * @throws Exception
     */
    @Override
    public List<Orders> findAll() throws Exception {
        return ordersDao.findAll();
    }
}

2.4 编写控制层

@Controller
@RequestMapping("/orders")
public class OrdersController {
    @Autowired
    private OrdersService ordersService;

    @RequestMapping("/findAll.do")
    public ModelAndView findAll() throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        List<Orders> orders = ordersService.findAll();
        modelAndView.addObject("ordersList",orders);
        modelAndView.setViewName("orders-list");

        return modelAndView;
    }
}

2.5 编写 JSP 页面

在 pages 包中创建 orders-list.jsp

3. 实现分页查询订单操作

3.1 PageHelper 介绍

PageHelper 是国内非常优秀的一款开源的 MyBatis 分页插件,它支持基本主流与常用的数据库。

3.2 PageHelper 的使用

  1. 导入依赖坐标

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.2</version>
    </dependency>
    
  2. 在 applicationContext.xml 中,在配置 SqlSessionFactory 工厂中传入 PageHelper 的插件

    <!-- 配置 SqlSessionFactory 工厂 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 传入PageHelper的插件 -->
        <property name="plugins">
            <array>
                <!-- 传入插件的对象 -->
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            <prop key="helperDialect">mysql</prop>
                            <prop key="reasonable">true</prop>
                        </props>
                    </property>
                </bean>
            </array>
        </property>
    </bean>
    
  3. 编写业务层

    public interface OrdersService {
        /**
         * 分页查询所有订单
         * @param pageNum 当前页数
         * @param pageSize 每页条数
         * @return
         * @throws Exception
         */
        List<Orders> findAllByPage(int pageNum, int pageSize) throws Exception;
    }
    
    @Transactional
    @Service("ordersService")
    public class OrdersServiceImpl implements OrdersService {
        @Autowired
        private OrdersDao ordersDao;
    
        /**
         * 分页查询所有订单
         * @param pageNum 当前页数
         * @param pageSize 每页条数
         * @return
         * @throws Exception
         */
        @Override
        public List<Orders> findAllByPage(int pageNum, int pageSize) throws Exception {
            PageHelper.startPage(pageNum,pageSize);
            return ordersDao.findAll();
        }
    
    
    }
    
    
  4. 编写控制层

    @Controller
    @RequestMapping("/orders")
    public class OrdersController {
        @Autowired
        private OrdersService ordersService;
        
        /**
         * 分页查询所有订单
         * @param pageNum 当前页数
         * @param pageSize 每页条数
         * @return
         * @throws Exception
         */
        @RequestMapping("/findAllByPage.do")
        public ModelAndView findAllByPage(@RequestParam(name = "pageNum", defaultValue = "1") int pageNum, @RequestParam(name = "pageSize", defaultValue = "5") int pageSize) throws Exception {
            ModelAndView modelAndView = new ModelAndView();
            List<Orders> orders = ordersService.findAllByPage(pageNum, pageSize);
            PageInfo<Orders> ordersPageInfo = new PageInfo<>(orders);
            modelAndView.addObject("pageInfo", ordersPageInfo);
            modelAndView.setViewName("orders-page-list");
    
            return modelAndView;
        }
    }
    
    
  5. 编写 JSP 页面

    在 pages 包中创建 orders-page-list.jsp

4. 实现查询订单详情操作

4.1 编写持久层接口

@Repository
public interface OrdersDao {

    /**
     * 查询单个订单详细信息
     *
     * @return
     * @throws Exception
     */
    @Select("select * from orders where id=#{id}")
    @Results({
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "orderNum", column = "orderNum"),
            @Result(property = "orderTime", column = "orderTime"),
            @Result(property = "peopleCount", column = "peopleCount"),
            @Result(property = "orderDesc", column = "orderDesc"),
            @Result(property = "payType", column = "payType"),
            @Result(property = "orderStatus", column = "orderStatus"),
            @Result(property = "product", column = "productId", one = @One(select = "com.zt.dao.ProductDao.findById")),
            @Result(property = "member", column = "memberId", one = @One(select = "com.zt.dao.MemberDao.findById")),
            @Result(property = "travellers", column = "id",many = @Many(select = "com.zt.dao.TravellerDao.findById"))
    })
    Orders findById(int id) throws Exception;
}

public interface MemberDao {
    /**
     * 查询单个会员
     * @param id
     */
    @Select("select * from member where id=#{id}")
    Member findById(int id) throws Exception;
}

public interface TravellerDao {
    /**
     * 查询旅客
     * @param id
     * @return
     * @throws Exception
     */
    @Select("select * from traveller where id in(select travellerId from order_traveller where orderId = #{id})")
    List<Traveller> findById(int id) throws Exception;
}

4.2 编写业务层接口和实现类

public interface OrdersService {

    /**
     * 查询单个订单详细信息
     * @param id
     * @return
     * @throws Exception
     */
    Orders findById(int id) throws Exception;
}

@Transactional
@Service("ordersService")
public class OrdersServiceImpl implements OrdersService {
    @Autowired
    private OrdersDao ordersDao;

    /**
     * 查询单个订单详细信息
     * @param id
     * @return
     * @throws Exception
     */
    @Override
    public Orders findById(int id) throws Exception {
        return ordersDao.findById(id);
    }
}

4.3 编写控制层

@Controller
@RequestMapping("/orders")
public class OrdersController {
    @Autowired
    private OrdersService ordersService;

    /**
     * 查询单个订单详细信息
     * @param id
     * @return
     * @throws Exception
     */
    @RequestMapping("/findById.do")
    public ModelAndView findById(@RequestParam(name = "id") int id) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        Orders orders = ordersService.findById(id);
        modelAndView.addObject("orders",orders);
        modelAndView.setViewName("orders-show");

        return modelAndView;
    }
}

4.4 编写 JSP 页面

在 pages 包中创建 orders-show.jsp

发布了64 篇原创文章 · 获赞 20 · 访问量 6488

猜你喜欢

转载自blog.csdn.net/bm1998/article/details/102825934