资讯动态

第5章:预约设置

发布时间:2026/8/13 16:59:43 来源:尧图企业网站定制
第5章 数据管理-预约设置1. 需求分析前面我们已经完成了检查项设置、检查组设置、套餐设置等。接下来我们需要进行预约设置其实就是设置每一天的体检预约最大数量。客户可以通过微信端在线预约在线预约时需要选择体检的时间如果客户选择的时间已经预约满则无法进行预约。2. Apache POI2.1 POI介绍Apache POI是用Java编写的免费开源的跨平台的Java APIApache POI提供API给Java程序对Microsoft Office格式档案读和写的功能其中使用最多的就是使用POI操作Excel文件。jxl专门操作Excelmaven坐标dependency groupIdorg.apache.poi/groupId artifactIdpoi/artifactId version3.14/version /dependency dependency groupIdorg.apache.poi/groupId artifactIdpoi-ooxml/artifactId version3.14/version /dependencyPOI结构HSSF 提供读写Microsoft Excel XLS格式档案的功能 XSSF 提供读写Microsoft Excel OOXML XLSX格式档案的功能 HWPF 提供读写Microsoft Word DOC格式档案的功能 HSLF 提供读写Microsoft PowerPoint格式档案的功能 HDGF 提供读Microsoft Visio格式档案的功能 HPBF 提供读Microsoft Publisher格式档案的功能 HSMF 提供读Microsoft Outlook格式档案的功能2.2 入门案例2.2.1 从Excel文件读取数据使用POI可以从一个已经存在的Excel文件中读取数据在health_common项目中添加测试类test.POITestpackage com.liusp.test; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.IOException; public class POITest { public static void main(String[] args) throws IOException { //创建工作簿 XSSFWorkbook workbook new XSSFWorkbook(D:\\hello.xlsx); //获取工作表既可以根据工作表的顺序获取也可以根据工作表的名称获取 XSSFSheet sheet workbook.getSheetAt(0); //遍历工作表获得行对象 for (Row row : sheet) { //遍历行对象获取单元格对象 for (Cell cell : row) { //获得单元格中的值 String value cell.getStringCellValue(); System.out.println(value); } } workbook.close(); } }运行执行通过上面的入门案例可以看到POI操作Excel表格封装了几个核心对象XSSFWorkbook工作簿 XSSFSheet工作表 Row行 Cell单元格上面案例是通过遍历工作表获得行遍历行获得单元格最终获取单元格中的值。还有一种方式就是获取工作表最后一个行号从而根据行号获得行对象通过行获取最后一个单元格索引从而根据单元格索引获取每行的一个单元格对象.POITest2 代码如下package com.liusp.test; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.IOException; public class POITest2 { public static void main(String[] args) throws IOException { //创建工作簿 XSSFWorkbook workbook new XSSFWorkbook(D:\\hello.xlsx); //获取工作表既可以根据工作表的顺序获取也可以根据工作表的名称获取 XSSFSheet sheet workbook.getSheetAt(0); //获取当前工作表最后一行的行号行号从0开始 int lastRowNum sheet.getLastRowNum(); for(int i0;ilastRowNum;i){ //根据行号获取行对象 XSSFRow row sheet.getRow(i); short lastCellNum row.getLastCellNum(); for(short j0;jlastCellNum;j){ String value row.getCell(j).getStringCellValue(); System.out.println(value); } } workbook.close(); } }2.2.2 向Excel文件写入数据使用POI可以在内存中创建一个Excel文件并将数据写入到这个文件最后通过输出流将内存中的Excel文件下载到磁盘POITest3package com.liusp.test; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class POITest3 { public static void main(String[] args) throws IOException { //在内存中创建一个Excel文件 XSSFWorkbook workbook new XSSFWorkbook(); //创建工作表指定工作表名称 XSSFSheet sheet workbook.createSheet(用户信息); //创建行0表示第一行 XSSFRow row sheet.createRow(0); //创建单元格0表示第一个单元格 row.createCell(0).setCellValue(编号); row.createCell(1).setCellValue(名称); row.createCell(2).setCellValue(年龄); XSSFRow row1 sheet.createRow(1); row1.createCell(0).setCellValue(1); row1.createCell(1).setCellValue(小明); row1.createCell(2).setCellValue(10); XSSFRow row2 sheet.createRow(2); row2.createCell(0).setCellValue(2); row2.createCell(1).setCellValue(小王); row2.createCell(2).setCellValue(20); //通过输出流将workbook对象下载到磁盘 FileOutputStream out new FileOutputStream(D:\\userinfo.xlsx); workbook.write(out); out.flush(); out.close(); workbook.close(); } }进行运行3. 批量导入预约设置信息预约设置信息对应的数据表为t_ordersetting预约设置操作对应的页面为ordersetting.htmlt_ordersetting表结构orderDate预约日期number可预约人数reservations已预约人数批量导入预约设置信息操作过程1、点击模板下载按钮下载Excel模板文件2、将预约设置信息录入到模板文件中3、点击上传文件按钮将录入完信息的模板文件上传到服务器4、通过POI读取上传文件的数据并保存到数据库3.1 完善页面3.1.1 提供模板文件资料中已经提供了Excel模板文件ordersetting_template.xlsx将文件放在health_backend工程的resources\static\template\ordersetting_template.xlsx目录3.1.2 实现模板文件下载为模板下载按钮绑定事件实现模板文件下载el-button stylemargin-bottom: 20px;margin-right: 20px typeprimary clickdownloadTemplate()模板下载/el-button//模板文件下载 downloadTemplate(){ window.location.href../template/ordersetting_template.xlsx; }3.1.3 文件上传使用ElementUI的上传组件实现文件上传并绑定相关事件el-upload action/ordersetting/upload.do nameexcelFile :show-file-listfalse :on-successhandleSuccess :before-uploadbeforeUpload el-button typeprimary上传文件/el-button /el-uploadhandleSuccess(response, file) { if(response.flag){ this.$message({ message: response.message, type: success }); }else{ this.$message.error(response.message); } } //上传之前进行文件格式校验 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; }3.2 后台代码3.2.1 Controller将资料中的POIUtils工具类复制到health_common工程在health_backend工程创建OrderSettingController并提供upload方法package com.liusp.controller; import com.alibaba.dubbo.config.annotation.Reference; import com.liusp.constant.MessageConstant; import com.liusp.entity.Result; import com.liusp.pojo.OrderSetting; import com.liusp.service.OrderSettingService; import com.liusp.utils.POIUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * 预约设置 */ RestController RequestMapping(/ordersetting) public class OrderSettingController { Reference private OrderSettingService orderSettingService; /** * Excel文件上传并解析文件内容保存到数据库 * param excelFile * return */ RequestMapping(/upload.do) public Result upload(RequestParam(excelFile) MultipartFile excelFile){ try { //读取Excel文件数据 ListString[] list POIUtils.readExcel(excelFile); if(list ! null list.size() 0){ ListOrderSetting orderSettingList new ArrayList(); for (String[] strings : list) { OrderSetting orderSetting new OrderSetting(new Date(strings[0]), Integer.parseInt(strings[1])); orderSettingList.add(orderSetting); } orderSettingService.add(orderSettingList); } } catch (IOException e) { e.printStackTrace(); return new Result(false, MessageConstant.IMPORT_ORDERSETTING_FAIL); } return new Result(true,MessageConstant.IMPORT_ORDERSETTING_SUCCESS); } }3.2.2 服务接口创建OrderSettingService服务接口并提供新增方法package com.liusp.service; import com.liusp.pojo.OrderSetting; import java.util.List; import java.util.Map; public interface OrderSettingService { public void add(ListOrderSetting list); }3.2.3 服务实现类创建服务实现类OrderSettingServiceImpl并实现新增方法package com.liusp.service.impl; import com.alibaba.dubbo.config.annotation.Service; import com.liusp.dao.OrderSettingDao; import com.liusp.pojo.OrderSetting; import com.liusp.service.OrderSettingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** * 预约设置服务 */ Service(interfaceClass OrderSettingService.class) Transactional public class OrderSettingServiceImpl implements OrderSettingService { Autowired private OrderSettingDao orderSettingDao; //批量添加 public void add(ListOrderSetting list) { if(list ! null list.size() 0){ for (OrderSetting orderSetting : list) { //检查此数据日期是否存在 long count orderSettingDao.findCountByOrderDate(orderSetting.getOrderDate()); if(count 0){ //已经存在执行更新操作 orderSettingDao.editNumberByOrderDate(orderSetting); }else{ //不存在执行添加操作 orderSettingDao.add(orderSetting); } } } } }3.2.4 Dao接口创建Dao接口OrderSettingDao并提供更新和新增方法package com.liusp.dao; import com.liusp.pojo.OrderSetting; import java.util.Date; public interface OrderSettingDao { public void add(OrderSetting orderSetting); public void editNumberByOrderDate(OrderSetting orderSetting); public long findCountByOrderDate(Date orderDate); }3.2.5 Mapper映射文件创建Mapper映射文件OrderSettingDao.xml并提供相关SQL?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.liusp.dao.OrderSettingDao !--新增-- insert idadd parameterTypecom.liusp.pojo.OrderSetting insert into t_ordersetting (orderDate,number,reservations) values (#{orderDate},#{number},#{reservations}) /insert !--根据日期更新预约人数-- update ideditNumberByOrderDate parameterTypecom.liusp.pojo.OrderSetting update t_ordersetting set number #{number} where orderDate #{orderDate} /update !--根据预约日期查询-- select idfindCountByOrderDate parameterTypejava.util.Date resultTypelong select count(*) from t_ordersetting where orderDate #{orderDate} /select /mapper测试项目在表格中添加测试数据–》点击上传文件–》查看数据库t_ordersetting表中数据是否插入成功。4. 日历展示预约设置信息前面已经完成了预约设置功能现在就需要通过日历的方式展示出来每天设置的预约人数。在页面中已经完成了日历的动态展示我们只需要查询当前月份的预约设置信息并展示到日历中即可同时在日历中还需要展示已经预约的人数效果如下4.1 完善页面4.1.1 使用静态数据调试为了能够快速看到效果我们可以先使用静态数据模拟然后再改为发送ajax请求查询数据库。实现步骤1预约设置数据对应的模型数据为leftobj在initData方法最后为leftobj模型数据赋值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 } ];其中date表示日期number表示可预约人数reservations表示已预约人数2使用VUE的v-for标签遍历上面的leftobj模型数据展示到日历上template template v-forobj in leftobj template v-ifobj.date dayobject.day.getDate() template v-ifobj.number obj.reservations div classusual p可预约{{obj.number}}人/p p已预约{{obj.reservations}}人/p /div /template template v-else div classfulled p可预约{{obj.number}}人/p p已预约{{obj.reservations}}人/p p已满/p /div /template /template /template button v-ifdayobject.day today clickhandleOrderSet(dayobject.day) classorderbtn设置/button /template4.1.2 发送ajax获取动态数据将上面的静态模拟数据去掉改为发送ajax请求根据当前页面对应的月份查询数据库获取预约设置信息将查询结果赋值给leftobj模型数据//发送ajax请求根据当前页面对应的月份查询预约设置信息 axios.post( /ordersetting/getOrderSettingByMonth.do?datethis.currentYear-this.currentMonth ).then((response){ if(response.data.flag){ //为模型数据赋值通过双向绑定展示到日历中 this.leftobj response.data.data; }else{ this.$message.error(response.data.message); } });4.2 后台代码4.2.1 Controller在OrderSettingController中提供getOrderSettingByMonth方法根据月份查询预约设置信息/** * 根据日期查询预约设置数据(获取指定日期所在月份的预约设置数据) * param date * return */ RequestMapping(/getOrderSettingByMonth.do) public Result getOrderSettingByMonth(String date){//参数格式为2019-03 try{ ListMap list orderSettingService.getOrderSettingByMonth(date); //获取预约设置数据成功 return new Result(true,MessageConstant.GET_ORDERSETTING_SUCCESS,list); }catch (Exception e){ e.printStackTrace(); //获取预约设置数据失败 return new Result(false,MessageConstant.GET_ORDERSETTING_FAIL); } }4.2.2 服务接口在OrderSettingService服务接口中扩展方法getOrderSettingByMonthpublic ListMap getOrderSettingByMonth(String date);//参数格式为2019-034.2.3 服务实现类在OrderSettingServiceImpl服务实现类中实现方法getOrderSettingByMonth//根据日期查询预约设置数据 public ListMap getOrderSettingByMonth(String date) {//2019-3 String dateBegin date -1;//2019-3-1 String dateEnd ; String temp date.substring(date.length() - 1); if (temp.equals(6) || temp.equals(9)|| temp.equals(11)){ dateEnd date -30;//2019-3-31 }else{ dateEnd date -31;//2019-3-31 } Map map new HashMap(); map.put(dateBegin,dateBegin); map.put(dateEnd,dateEnd); ListOrderSetting list orderSettingDao.getOrderSettingByMonth(map); ListMap data new ArrayList(); for (OrderSetting orderSetting : list) { Map orderSettingMap new HashMap(); orderSettingMap.put(date,orderSetting.getOrderDate().getDate());//获得日期几号 orderSettingMap.put(number,orderSetting.getNumber());//可预约人数 orderSettingMap.put(reservations,orderSetting.getReservations());//已预约人数 data.add(orderSettingMap); } return data; }4.2.4 Dao接口在OrderSettingDao接口中扩展方法getOrderSettingByMonthpublic ListOrderSetting getOrderSettingByMonth(Map date);4.2.5 Mapper映射文件在OrderSettingDao.xml文件中扩展SQL!--根据月份查询预约设置信息-- select idgetOrderSettingByMonth parameterTypehashmap resultTypecom.liusp.pojo.OrderSetting select * from t_ordersetting where orderDate between #{dateBegin} and #{dateEnd} /select停掉服务重启还有maven也要已经成功实现UPDATE t_ordersetting SET reservations 104 WHERE id 88;此时更新查看5. 基于日历实现预约设置本章节要完成的功能为通过点击日历中的设置按钮来设置对应日期的可预约人数。效果如下5.1 完善页面5.1.1 为设置按钮绑定事件为日历中的设置按钮绑定单击事件当前日期作为参数button v-ifdayobject.day today clickhandleOrderSet(dayobject.day) classorderbtn设置/button//预约设置 handleOrderSet(day){ alert(day); }5.1.2 弹出预约设置窗口并发送ajax请求完善handleOrderSet方法弹出预约设置窗口用户点击确定按钮则发送ajax请求//预约设置 handleOrderSet(day){ this.$prompt(请输入可预约人数, 预约设置, { confirmButtonText: 确定, cancelButtonText: 取消, inputPattern: /^[0-9]*[1-9][0-9]*$/, inputErrorMessage: 只能输入正整数 }).then(({ value }) { //发送ajax请求根据日期修改可预约人数 axios.post(/ordersetting/editNumberByDate.do,{ orderDate:this.formatDate(day.getFullYear(),day.getMonth()1,day.getDate()), //日期 number:value //可预约人数 }).then((response){ if(response.data.flag){ this.initData(this.formatDate(day.getFullYear(), day.getMonth() 1, 1)); this.$message({ type: success, message: response.data.message }); }else{ this.$message.error(response.data.message); } }); }).catch(() { this.$message({ type: info, message: 已取消 }); }); }5.2 后台代码5.2.1 Controller在OrderSettingController中提供方法editNumberByDate/** * 根据指定日期修改可预约人数 * param orderSetting * return */ RequestMapping(/editNumberByDate.do) public Result editNumberByDate(RequestBody OrderSetting orderSetting){ try{ orderSettingService.editNumberByDate(orderSetting); //预约设置成功 return new Result(true,MessageConstant.ORDERSETTING_SUCCESS); }catch (Exception e){ e.printStackTrace(); //预约设置失败 return new Result(false,MessageConstant.ORDERSETTING_FAIL); } }5.2.2 服务接口在OrderSettingService服务接口中提供方法editNumberByDatepublic void editNumberByDate(OrderSetting orderSetting);5.2.3 服务实现类在OrderSettingServiceImpl服务实现类中实现editNumberByDate//根据日期修改可预约人数 public void editNumberByDate(OrderSetting orderSetting) { long count orderSettingDao.findCountByOrderDate(orderSetting.getOrderDate()); if(count 0){ //当前日期已经进行了预约设置需要进行修改操作 orderSettingDao.editNumberByOrderDate(orderSetting); }else{ //当前日期没有进行预约设置进行添加操作 orderSettingDao.add(orderSetting); } }5.2.4 Dao接口在OrderSettingDao接口中提供方法public void editNumberByOrderDate(OrderSetting orderSetting); public long findCountByOrderDate(Date orderDate);停止服务进行测试5.2.5 Mapper映射文件在OrderSettingDao.xml映射文件中提供SQL!--根据日期更新可预约人数-- update ideditNumberByOrderDate parameterTypecom.liusp.pojo.OrderSetting update t_ordersetting set number #{number} where orderDate #{orderDate} /update !--根据预约日期查询-- select idfindCountByOrderDate parameterTypejava.util.Date resultTypelong select count(*) from t_ordersetting where orderDate #{orderDate} /select

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价