批量导入数据:
1.在webapp下的template文件下导入excel模板文件
1.前端:提供下载模板文件
<!DOCTYPE html>
<html>
<head>
<!-- 页面meta -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>传智健康</title>
<meta name="description" content="传智健康">
<meta name="keywords" content="传智健康">
<meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport">
<!-- 引入样式 -->
<link rel="stylesheet" href="../plugins/elementui/index.css">
<link rel="stylesheet" href="../plugins/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="../css/style.css">
<link rel="stylesheet" href="../css/orderset.css">
<!-- 引入组件库 -->
<script src="../js/vue.js"></script>
<script src="../plugins/elementui/index.js"></script>
<script type="text/javascript" src="../js/jquery.min.js"></script>
<script src="../js/axios-0.18.0.js"></script>
</head>
<body class="hold-transition">
<div id="app">
<div class="content-header">
<h1>预约管理<small>预约设置</small></h1>
<el-breadcrumb separator-class="el-icon-arrow-right" class="breadcrumb">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item>预约管理</el-breadcrumb-item>
<el-breadcrumb-item>预约设置</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="app-container">
<div class="box">
<div class="box ordersetting">
<el-card class="box-card">
<div class="boxMain">
<el-button style="margin-bottom: 20px;margin-right: 20px" type="primary" @click="downloadTemplate()">模板下载</el-button>
<el-upload action="/ordersetting/upload.do"
name="excelFile"
:show-file-list="false"
:on-success="handleSuccess"
:before-upload="beforeUpload">
<el-button type="primary">上传文件</el-button>
</el-upload>
</div>
<div>
操作说明:请点击"模板下载"按钮获取模板文件,在模板文件中录入预约设置数据后点击"上传文件"按钮上传模板文件。
</div>
</el-card>
<div class="calendar">
<!-- 年份 月份 -->
<div class="month">
<div class="currentdate">
<span class="choose-year">{{ currentYear }}年</span>
<span class="choose-month">{{ currentMonth }}月</span>
</div>
<div class="choose">
<span @click="goCurrentMonth(currentYear,currentMonth)" class="gotoday">今天</span>
<span @click="pickPre(currentYear,currentMonth)">?</span>
<span @click="pickNext(currentYear,currentMonth)">?</span>
</div>
<div class="clearfix"></div>
</div>
<!-- 星期 -->
<div class="caldate">
<ul class="weekdays">
<li>周一</li>
<li>周二</li>
<li>周三</li>
<li>周四</li>
<li>周五</li>
<li>周六</li>
<li>周日</li>
</ul>
<!-- 日期 -->
<ul class="days">
<!-- v-for循环 每一次循环用<li>标签创建一天 -->
<li v-for="dayobject in days">
<template>
<!-- 非当前月份 -->
<div class="other-month" v-if="dayobject.day.getMonth()+1 != currentMonth">
{{ dayobject.day.getDate() }}
</div>
<!-- 当前月 -->
<div class="everyday" v-if="dayobject.day.getMonth()+1 == currentMonth">
<span class="datenumber">{{ dayobject.day.getDate()}}</span>
<template>
<template v-for="obj in leftobj">
<template v-if="obj.date == dayobject.day.getDate()">
<template v-if="obj.number > obj.reservations">
<div class="usual">
<p>可预约{{obj.number}}人</p>
<p>已预约{{obj.reservations}}人</p>
</div>
</template>
<template v-else>
<div class="fulled">
<p>可预约{{obj.number}}人</p>
<p>已预约{{obj.reservations}}人</p>
<p>已满</p>
</div>
</template>
</template>
</template>
<button v-if="dayobject.day > today" @click="handleOrderSet(dayobject.day)" class="orderbtn">设置</button>
</template>
</div>
</template>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<!-- 引入组件库 -->
<script src="../js/vue.js"></script>
<script src="../plugins/elementui/index.js"></script>
<script type="text/javascript" src="../js/jquery.min.js"></script>
<script>
new Vue({
el: '#app',
data:{
today:new Date(),//当前日期
currentDay: 1,
currentMonth: 1,
LocalMonth: 1,
currentYear: 1970,
currentWeek: 1,
days: [],
leftobj: []//用于装载页面显示的月份已经进行预约设置的数据
},
created: function () {//在vue初始化时调用
// 1:初始化当前时间对应的日期,在页面上展示日历
this.initData(null);
// 2:初始化当前月对应的预约设置的数据,把预约设置信息,显示到页面上,对模型leftobj赋值
this.createData();
},
methods: {
createData(){
// 传递当前月(date=2020-2),返回Map(json形式)
axios.get("/ordersetting/findOrderSettingMapByMonth.do?date="+this.currentYear+"-"+this.currentMonth).then(response=>{
// 返回Result(flag,message,data) data:Map(map结构的key:date、number、reservations)
if(response.data.flag){
this.leftobj = response.data.data; // 组织数据结构
this.$message({
type:"success",
message:response.data.message
})
}else{
this.$message({
type:"error",
message:response.data.message
})
}
}).catch((error)=>{
})
},
//预约设置
handleOrderSet(day){
},
//上传之前进行文件格式校验
beforeUpload(file){
const isXLS = file.type === 'application/vnd.ms-excel';
if(isXLS){
return true;
}
const isXLSX = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
if (isXLSX) {
return true;
}
this.$message.error('上传文件只能是xls或者xlsx格式!');
return false;
},
//下载模板文件
downloadTemplate(){
window.location.href="../../template/ordersetting_template.xlsx";
},
//上传成功提示(ElementUI)
handleSuccess(response, file) {
// 返回Result(flag,message,data)
if(response.flag){
this.$message({
message: response.message,
type: 'success'
});
}else{
this.$message.error(response.message);
}
// console.log(response, file, fileList);
},
//初始化当前页要展示的日期
initData: function (cur) {
var date;
var index = 0; //控制显示预定的天数
if (cur) {
date = new Date(cur);
} else {
var now = new Date();
var d = new Date(this.formatDate(now.getFullYear(), now.getMonth()+1, 1));
d.setDate(35);
date = new Date(this.formatDate(d.getFullYear(), d.getMonth(), 1));
}
this.currentDay = date.getDate();
this.currentYear = date.getFullYear();
this.currentMonth = date.getMonth() + 1;
this.currentWeek = date.getDay(); // //本月第一天是周几(周日0 周六 6)
var today = new Date();
this.LocalMonth = today.getMonth() + 1;
if (this.currentWeek == 0) {
this.currentWeek = 7;
}
var str = this.formatDate(this.currentYear, this.currentMonth, this.currentDay);
this.days.length = 0;
// 今天是周日,放在第一行第7个位置,前面6个
//初始化本周
for (var i = this.currentWeek - 1; i >= 0; i--) {
var d = new Date(str);
d.setDate(d.getDate() - i);
var dayobject = {};
dayobject.day = d;
var now = new Date();
if (d.getDate() === (now.getDate()) && d.getMonth() === now.getMonth() && d.getFullYear() === now.getFullYear()) {
dayobject.index = index++;//从今天开始显示供预定的数量
}
else if (index != 0 && index < 3)
dayobject.index = index++;//从今天开始3天内显示供预定的数量
this.days.push(dayobject);//将日期放入data 中的days数组 供页面渲染使用
}
//其他周
for (var i = 1; i <= 35 - this.currentWeek; i++) {
var d = new Date(str);
d.setDate(d.getDate() + i);
var dayobject = {};//dayobject {day:date,index:2}
dayobject.day = d;
var now = new Date();
if (d.getDate() === (now.getDate()) && d.getMonth() === now.getMonth() && d.getFullYear() === now.getFullYear()) {
dayobject.index = index++;
}
else if (index != 0 && index < 3)
dayobject.index = index++;
this.days.push(dayobject);
}
/**this.leftobj = [
{ date: 1, number: 120, reservations: 1 },
{ date: 3, number: 120, reservations: 1 },
{ date: 4, number: 120, reservations: 120 },
{ date: 6, number: 120, reservations: 1 },
{ date: 8, number: 120, reservations: 1 }
];*/
},
//切换到当前月份
goCurrentMonth: function (year, month) {
var d = new Date();
// 初始化日历
this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
// 初始化当前月的预约设置信息
this.createData();
},
//向前一个月
pickPre: function (year, month) {
// setDate(0); 上月最后一天
// setDate(-1); 上月倒数第二天
// setDate(dx) 参数dx为 上月最后一天的前后dx天
var d = new Date(this.formatDate(year, month, 1));
d.setDate(0);
this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
// 初始化当前月的预约设置信息
this.createData();
},
//向后一个月
pickNext: function (year, month) {
var d = new Date(this.formatDate(year, month, 1));
d.setDate(35);////获取指定天之后的日期
this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
// 初始化当前月的预约设置信息
this.createData();
},
// 返回 类似 2016-01-02 格式的字符串
formatDate: function (year, month, day) {
var y = year;
var m = month;
if (m < 10) m = "0" + m;
var d = day;
if (d < 10) d = "0" + d;
return y + "-" + m + "-" + d
}
}
})
</script>
</html>
后端:实体类封装模板文件对应的数据
1.模板对应的实体类:
package com.itheima.health.pojo;
import java.io.Serializable;
import java.util.Date;
/**
* 预约设置
*/
public class OrderSetting implements Serializable{
private Integer id ;
private Date orderDate;//预约设置日期
private int number;//可预约人数
private int reservations ;//已预约人数
public OrderSetting() {
}
public OrderSetting(Date orderDate, int number) {
this.orderDate = orderDate;
this.number = number;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getReservations() {
return reservations;
}
public void setReservations(int reservations) {
this.reservations = reservations;
}
}
2.Controller
package com.itheima.health.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.health.constant.MessageConstant;
import com.itheima.health.entity.Result;
import com.itheima.health.pojo.OrderSetting;
import com.itheima.health.service.OrderSettingService;
import com.itheima.health.utils.POIUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @ClassName OrderSettingContoller
* @Description TODO
* @Author ly
* @Company 深圳黑马程序员
* @Date 2020/2/13 16:04
* @Version V1.0
*/
@RestController
@RequestMapping(value = "/ordersetting")
public class OrderSettingContoller {
@Reference// 订阅 dubbo注解
OrderSettingService orderSettingService;
// 批量导入预约设置(通过Excel完成)
@RequestMapping(value = "/upload")
public Result upload(MultipartFile excelFile){
try {
// 读取Excel文件,并批量导入到数据库
List<String[]> list = POIUtils.readExcel(excelFile);
// 将List<String[]>集合,转换成List<OrderSetting>
if(list!=null && list.size()>0){
List<OrderSetting> orderSettingList = new ArrayList<>();
for (String[] strings : list) {
OrderSetting orderSetting = new OrderSetting(new Date(strings[0]),Integer.parseInt(strings[1]));
orderSettingList.add(orderSetting);
}
// 批量导入
orderSettingService.addList(orderSettingList);
}
return new Result(true, MessageConstant.IMPORT_ORDERSETTING_SUCCESS);
} catch (Exception e) {
e.printStackTrace();
return new Result(false, MessageConstant.IMPORT_ORDERSETTING_FAIL);
}
}
// 根据传递的年月(2020-2),获取当前月对应的日期数据
@RequestMapping(value = "/findOrderSettingMapByMonth")
public Result findOrderSettingMapByMonth(String date){
try {
List<Map<String,Object>> list = orderSettingService.findOrderSettingMapByMonth(date);
return new Result(true, MessageConstant.GET_ORDERSETTING_SUCCESS,list);
} catch (Exception e) {
e.printStackTrace();
return new Result(false, MessageConstant.GET_ORDERSETTING_FAIL);
}
}
}
2.Service:
package com.itheima.health.service;
import com.itheima.health.pojo.OrderSetting;
import java.util.List;
import java.util.Map;
public interface OrderSettingService {
void addList(List<OrderSetting> orderSettingList);
List<Map<String,Object>> findOrderSettingMapByMonth(String date);
}
impl:
package com.itheima.health.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.health.dao.OrderSettingDao;
import com.itheima.health.pojo.OrderSetting;
import com.itheima.health.service.OrderSettingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @ClassName OrderSettingServiceImpl
* @Description TODO
* @Author ly
* @Company 深圳黑马程序员
* @Date 2020/2/13 16:03
* @Version V1.0
*/
@Service // dubbo提供
@Transactional
public class OrderSettingServiceImpl implements OrderSettingService {
@Autowired
OrderSettingDao orderSettingDao;
@Override
public void addList(List<OrderSetting> orderSettingList) {
// 批量导入
if(orderSettingList!=null && orderSettingList.size()>0){
for (OrderSetting orderSetting : orderSettingList) {
// 判断当前预约设置时间是否已经存在,如果已经存在,执行更新;如果不存在,再执行新增
// 1:使用预约设置时间,查询预约设置,判断是否存在
long count = orderSettingDao.findOrderSettingCountByOrderDate(orderSetting.getOrderDate());
// 2:如果已经存在,执行更新
if(count>0){
// 根据预约设置时间(orderDate字段),更新最多预约人数(number)
orderSettingDao.updateNumberByOrderDate(orderSetting);
}
// 3:如果不存在,再执行新增
else{
// 保存预约设置表
orderSettingDao.add(orderSetting);
}
}
}
}
@Override
public List<Map<String,Object>> findOrderSettingMapByMonth(String date) {
// 根据当前年月,获取日期(也可以完成)
// 开始时间
String beginDate = date+"-1";
// 结束时间
String endDate = date+"-31";
// 组织查询条件
Map paramsMap = new HashMap();
paramsMap.put("beginDate",beginDate);
paramsMap.put("endDate",endDate);
// 使用查询条件完成查询
List<OrderSetting> list = orderSettingDao.findOrderSettingByMonthBetween(paramsMap);
// 组织需要返回的数据
List<Map<String,Object>> mapList = new ArrayList<>();
if(list!=null && list.size()>0){
for (OrderSetting orderSetting : list) {
Map<String,Object> map = new HashMap<>();
map.put("date",orderSetting.getOrderDate().getDate()); // 获取当前日期(1-31)
map.put("number",orderSetting.getNumber());
map.put("reservations",orderSetting.getReservations());
mapList.add(map);
}
}
return mapList;
}
}
Dao:
package com.itheima.health.dao;
import com.itheima.health.pojo.OrderSetting;
import java.util.Date;
import java.util.List;
import java.util.Map;
public interface OrderSettingDao {
void add(OrderSetting orderSetting);
long findOrderSettingCountByOrderDate(Date orderDate);
void updateNumberByOrderDate(OrderSetting orderSetting);
List<OrderSetting> findOrderSettingByMonthBetween(Map paramsMap);
}
Dao.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" >
<mapper namespace="com.itheima.health.dao.OrderSettingDao">
<!--新增保存-->
<insert id="add" parameterType="ordersetting">
insert into t_ordersetting(orderDate,number,reservations) values (#{orderDate},#{number},#{reservations})
</insert>
<!--根据预约设置时间,查询预约设置的数量-->
<select id="findOrderSettingCountByOrderDate" parameterType="date" resultType="long">
SELECT COUNT(*) FROM t_ordersetting WHERE orderDate = #{orderDate}
</select>
<!--根据预约设置时间,更新最多预约人数-->
<update id="updateNumberByOrderDate" parameterType="ordersetting">
update t_ordersetting set number = #{number} where orderDate = #{orderDate}
</update>
<!--根据当前年月,查询当前年月对应的预约设置数据(范围查询)-->
<select id="findOrderSettingByMonthBetween" parameterType="map" resultType="ordersetting">
SELECT * FROM t_ordersetting WHERE orderDate BETWEEN #{beginDate} AND #{endDate}
</select>
</mapper>
层级结构数据模板:https://blog.csdn.net/zyq1084577627/article/details/78727623