From 62084eec6b372ffce8ffe86900fb545e2ff1bd90 Mon Sep 17 00:00:00 2001 From: xback <1516748650@qq.com> Date: Fri, 3 Apr 2020 08:03:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90excel=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=EF=BC=8C=E5=AE=8C=E6=88=90token=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=EF=BC=8C=E5=AE=8C=E6=88=90=E8=A1=A8=E5=8D=95=E9=AA=8C?= =?UTF-8?q?=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 29 +- .../com/syq/Interceptor/LoginInterceptor.java | 59 ++ src/main/java/com/syq/config/CorsConfig.java | 14 + .../syq/controller/ComputersController.java | 18 + .../com/syq/controller/ExcelController.java | 66 ++ .../syq/controller/StudentsController.java | 19 +- .../com/syq/controller/SystemController.java | 21 +- .../syq/controller/TeachersController.java | 23 + .../com/syq/controller/loginController.java | 44 +- src/main/java/com/syq/entity/Admin.java | 43 ++ src/main/java/com/syq/entity/Computers.java | 2 +- src/main/java/com/syq/entity/Students.java | 22 + src/main/java/com/syq/entity/Systeminfo.java | 1 - .../syq/repository/ComputersRepository.java | 4 + .../com/syq/repository/StudentRepository.java | 4 +- .../syq/repository/TeachersRepository.java | 18 + .../java/com/syq/service/BooksService.java | 3 +- .../com/syq/service/ComputersService.java | 7 + .../java/com/syq/service/StudentsService.java | 20 + .../java/com/syq/service/TeachersService.java | 21 + .../syq/service/impl/BooksServiceImpl.java | 11 +- .../service/impl/ComputersServiceImpl.java | 11 +- .../syq/service/impl/StudentsServiceImpl.java | 51 ++ .../syq/service/impl/TeachersServiceImpl.java | 13 + src/main/java/com/syq/util/PoiHandler.java | 52 ++ src/main/java/com/syq/util/PoiUtils.java | 631 ++++++++++++++++++ src/main/java/com/syq/util/Result.java | 34 + .../java/com/syq/util/ResultInfoUtil.java | 62 ++ src/main/java/com/syq/util/TokenUtil.java | 94 +++ 29 files changed, 1361 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/syq/Interceptor/LoginInterceptor.java create mode 100644 src/main/java/com/syq/controller/ExcelController.java create mode 100644 src/main/java/com/syq/entity/Admin.java create mode 100644 src/main/java/com/syq/util/PoiHandler.java create mode 100644 src/main/java/com/syq/util/PoiUtils.java create mode 100644 src/main/java/com/syq/util/Result.java create mode 100644 src/main/java/com/syq/util/ResultInfoUtil.java create mode 100644 src/main/java/com/syq/util/TokenUtil.java diff --git a/pom.xml b/pom.xml index 5e19226..34c90e5 100644 --- a/pom.xml +++ b/pom.xml @@ -1,12 +1,13 @@ - 4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.13.RELEASE - + com.example springBoot @@ -28,6 +29,30 @@ spring-boot-starter-web + + org.json + json + 20180130 + + + + org.apache.poi + poi-ooxml-schemas + 3.15 + + + org.apache.poi + poi-ooxml + 3.15 + + + + + com.auth0 + java-jwt + 3.9.0 + + org.springframework.boot spring-boot-devtools diff --git a/src/main/java/com/syq/Interceptor/LoginInterceptor.java b/src/main/java/com/syq/Interceptor/LoginInterceptor.java new file mode 100644 index 0000000..869430e --- /dev/null +++ b/src/main/java/com/syq/Interceptor/LoginInterceptor.java @@ -0,0 +1,59 @@ +package com.syq.Interceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.JSONObject; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import com.syq.entity.Admin; +import com.syq.util.TokenUtil; + +@Component +public class LoginInterceptor implements HandlerInterceptor{ + + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + // 如果不是映射到方法直接通过 + if (!(handler instanceof HandlerMethod)) { + return true; + } + + response.setCharacterEncoding("utf-8"); +// String tokenStr = request.getParameter("token"); + String tokenStr2 = request.getHeader("token"); + if (tokenStr2 != null && tokenStr2 != "") { + try { + Admin admin = TokenUtil.unsign(tokenStr2, Admin.class); + if (admin != null) { + return true; + } + } catch (Exception e) { + + } + } +// if (tokenStr != null && tokenStr != "") { +// try { +// Admin admin = TokenUtil.unsign(tokenStr, Admin.class); +// if (admin != null) { +// return true; +// } +// } catch (Exception e) { +// +// } +// } + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json; charset=utf-8"); + JSONObject json = new JSONObject(); + json.put("success", "false"); + json.put("msg", "认证失败"); + json.put("code", "500"); + response.getWriter().append(json.toString()); + System.out.println("认证失败"); + return false; + } +} diff --git a/src/main/java/com/syq/config/CorsConfig.java b/src/main/java/com/syq/config/CorsConfig.java index e377e6a..9dbf436 100644 --- a/src/main/java/com/syq/config/CorsConfig.java +++ b/src/main/java/com/syq/config/CorsConfig.java @@ -1,12 +1,26 @@ package com.syq.config; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import com.syq.Interceptor.LoginInterceptor; + + @Configuration public class CorsConfig extends WebMvcConfigurerAdapter { + @Autowired + private LoginInterceptor loginInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(loginInterceptor) + .addPathPatterns("/**").excludePathPatterns("/login"); + } + public void addCorsMappings(CorsRegistry registry) { //设值可以跨域请求的方法allowedMethods() //restfull风格里的方法:"GET","POST","PUT","DELETE" (注意:大写) diff --git a/src/main/java/com/syq/controller/ComputersController.java b/src/main/java/com/syq/controller/ComputersController.java index 1935cee..7a34832 100644 --- a/src/main/java/com/syq/controller/ComputersController.java +++ b/src/main/java/com/syq/controller/ComputersController.java @@ -1,5 +1,8 @@ package com.syq.controller; +import java.util.ArrayList; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -15,6 +18,8 @@ import com.syq.entity.Computers; import com.syq.entity.ResourcesRoom; import com.syq.service.ComputersService; import com.syq.util.FenyeUtil; +import com.syq.util.Result; +import com.syq.util.ResultInfoUtil; @RestController @@ -23,6 +28,19 @@ public class ComputersController { @Autowired private ComputersService computersService; + + + @GetMapping("/unique") + public ResultInfoUtil findComputersByIp(String ip) { + Computers com = computersService.findByIp(ip); + List list = new ArrayList(); + list.add(com); + if(com!=null) { + return new ResultInfoUtil<>(0, 1, list, "该IP地址已存在", 1); + }else { + return new ResultInfoUtil<>(0, 0, list, "ok", 0); + } + } /** * 条件分页查询电脑信息 diff --git a/src/main/java/com/syq/controller/ExcelController.java b/src/main/java/com/syq/controller/ExcelController.java new file mode 100644 index 0000000..145dd7b --- /dev/null +++ b/src/main/java/com/syq/controller/ExcelController.java @@ -0,0 +1,66 @@ +package com.syq.controller; + +import java.io.IOException; +import java.util.List; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +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 com.syq.entity.Students; +import com.syq.service.StudentsService; +import com.syq.util.PoiUtils; +import com.syq.util.Result; +import com.syq.util.ResultInfoUtil; + +@RestController +@RequestMapping("/admin/excel") +public class ExcelController { + + @Autowired + private StudentsService studentsService; + + @GetMapping + public void exporExcel(HttpServletResponse response, String ids) { + System.out.println(ids); + String downloadName = "student.xls"; + response.setCharacterEncoding("UTF-8");// 设置响应的字符编码格式 + response.setContentType("application/vnd.ms-excel");// 指明响应文件为excel类型 + ServletOutputStream out = null; + try { + // 文件名编码处理,防止浏览器下载文件名乱码 + response.setHeader("Content-disposition", + "attachment;filename=" + new String(downloadName.getBytes("GB2312"), "ISO8859-1")); + out = response.getOutputStream(); + } catch (Exception e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + List students = studentsService.exporExcel(ids); + + try { + PoiUtils p = new PoiUtils(); + p.createExcel(students, Students.class, out); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + @RequestMapping("/importExcel") + public Result importExcel(@RequestParam(value = "file") MultipartFile file) { + Students student = studentsService.importExcel(file); + if(student!=null) { + return new Result(0, "操作成功"); + } + return new Result(1, "操作失败"); + } + +} diff --git a/src/main/java/com/syq/controller/StudentsController.java b/src/main/java/com/syq/controller/StudentsController.java index fa4c6c2..e8a3df4 100644 --- a/src/main/java/com/syq/controller/StudentsController.java +++ b/src/main/java/com/syq/controller/StudentsController.java @@ -1,6 +1,8 @@ package com.syq.controller; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; @@ -15,7 +17,9 @@ import org.springframework.web.bind.annotation.RestController; import com.syq.entity.Students; import com.syq.entity.Systeminfo; +import com.syq.entity.Teachers; import com.syq.service.StudentsService; +import com.syq.util.ResultInfoUtil; @RequestMapping("students") @RestController @@ -25,20 +29,19 @@ public class StudentsController { private StudentsService studentsService; @GetMapping("/unique") - public Map unique(String cardno,String idnumber) { - Map map = new HashMap(); - System.out.println(idnumber); + public ResultInfoUtil unique(String cardno,String idnumber) { Students stu = studentsService.findByCardno(cardno); Students stu2 = studentsService.findByIdnumber(idnumber); + List list = new ArrayList(); if(stu!=null) { - map.put("msg", "此卡号已存在"); - map.put("code", "1"); + list.add(stu); + return new ResultInfoUtil<>(0, 1, list, "此卡号已存在",1); } if(stu2!=null) { - map.put("msg", "此身份证号已存在"); - map.put("code", "1"); + list.add(stu2); + return new ResultInfoUtil<>(0, 1, list, "此身份证号已存在",1); } - return map; + return new ResultInfoUtil<>(0, 1, list, "ok",0); } /** diff --git a/src/main/java/com/syq/controller/SystemController.java b/src/main/java/com/syq/controller/SystemController.java index defb764..f1ab13e 100644 --- a/src/main/java/com/syq/controller/SystemController.java +++ b/src/main/java/com/syq/controller/SystemController.java @@ -12,13 +12,19 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.syq.entity.Students; import com.syq.entity.Systeminfo; +import com.syq.service.StudentsService; import com.syq.service.SystemService; +import com.syq.util.Result; @RequestMapping("system") @RestController public class SystemController { + @Autowired // 注入service层数据 + private StudentsService studentsService; + @Autowired private SystemService systemService; @@ -73,14 +79,15 @@ public class SystemController { * @param sys 删除的参数 返回数值 1:成功 0:失败 */ @DeleteMapping - public Integer deleteSystem(Integer sysid) { - Systeminfo sys = new Systeminfo(); - sys.setSysid(sysid); - try { + public Result deleteSystem(Integer sysid) { + List students = studentsService.listBySysid(sysid); + if(students.size()==0) { + Systeminfo sys = new Systeminfo(); + sys.setSysid(sysid); systemService.deleteSystem(sys); - return 1; - } catch (Exception e) { - return 0; + return new Result(0,"删除成功"); + }else { + return new Result(1,"删除失败,该系别下有学生"); } } } diff --git a/src/main/java/com/syq/controller/TeachersController.java b/src/main/java/com/syq/controller/TeachersController.java index 010fc19..a54abf5 100644 --- a/src/main/java/com/syq/controller/TeachersController.java +++ b/src/main/java/com/syq/controller/TeachersController.java @@ -1,5 +1,9 @@ package com.syq.controller; + +import java.util.ArrayList; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -10,9 +14,11 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.syq.entity.Computers; import com.syq.entity.Sections; import com.syq.entity.Teachers; import com.syq.service.TeachersService; +import com.syq.util.ResultInfoUtil; @RestController @RequestMapping("/teachers") @@ -21,6 +27,23 @@ public class TeachersController { @Autowired private TeachersService teachersService; + + @GetMapping("/unique") + public ResultInfoUtil unique(String cardNo,String idnumber) { + Teachers tec = teachersService.findByCardno(cardNo); + Teachers tec2 = teachersService.findByIdnumber(idnumber); + List list = new ArrayList(); + if(tec!=null) { + list.add(tec); + return new ResultInfoUtil<>(0, 1, list, "此卡号已存在",1); + } + if(tec2!=null) { + list.add(tec2); + return new ResultInfoUtil<>(0, 1, list, "此身份证号已存在",1); + } + return new ResultInfoUtil<>(0, 1, list, "ok",0); + } + /** * 分页查询老师信息 * @param tea 查询条件 diff --git a/src/main/java/com/syq/controller/loginController.java b/src/main/java/com/syq/controller/loginController.java index 9048c6c..1e20332 100644 --- a/src/main/java/com/syq/controller/loginController.java +++ b/src/main/java/com/syq/controller/loginController.java @@ -1,10 +1,18 @@ package com.syq.controller; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.syq.entity.Admin; +import com.syq.util.TokenUtil; + @RestController @RequestMapping("login") public class loginController { @@ -15,15 +23,35 @@ public class loginController { * @param password * @return */ + TokenUtil token = new TokenUtil(); @GetMapping - public Integer login(String username,String password) { - System.out.println(username); - System.out.println(password); - if("admin".equals(username) && "pwd123".equals(password)) { - System.out.println(2); - return 1; + public Map login(String username,String password) { + Map map = new HashMap(); + Admin admin = new Admin(); + if(admin.getUname().equals(username) && admin.getUpassword().equals(password)) { + try { + String sign = token.sign(admin, 1000*60*60); + map.put("token", sign); + map.put("username", admin.getUname()); + map.put("code", 0); + System.out.println(sign); + try { + Admin unsign = token.unsign(sign, Admin.class); + System.out.println(unsign); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (JsonProcessingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return map; }else { - return 0; + return map; } } } diff --git a/src/main/java/com/syq/entity/Admin.java b/src/main/java/com/syq/entity/Admin.java new file mode 100644 index 0000000..74b3c11 --- /dev/null +++ b/src/main/java/com/syq/entity/Admin.java @@ -0,0 +1,43 @@ +package com.syq.entity; + +public class Admin{ + + private Integer uid = 1; + private String uname = "admin"; + private String upassword = "pwd123"; + + public Admin(Integer uid, String uname, String upassword) { + super(); + this.uid = uid; + this.uname = uname; + this.upassword = upassword; + } + public Admin() { + super(); + // TODO Auto-generated constructor stub + } + public Integer getUid() { + return uid; + } + public void setUid(Integer uid) { + this.uid = uid; + } + public String getUname() { + return uname; + } + public void setUname(String uname) { + this.uname = uname; + } + public String getUpassword() { + return upassword; + } + public void setUpassword(String upassword) { + this.upassword = upassword; + } + @Override + public String toString() { + return "AdminUser [uid=" + uid + ", uname=" + uname + ", upassword=" + upassword + "]"; + } + + +} diff --git a/src/main/java/com/syq/entity/Computers.java b/src/main/java/com/syq/entity/Computers.java index 297c20c..0fff358 100644 --- a/src/main/java/com/syq/entity/Computers.java +++ b/src/main/java/com/syq/entity/Computers.java @@ -25,7 +25,7 @@ public class Computers { @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer comid;//电脑编号 private String comname;//电脑名称 - private String IP;//IP地址 + private String ip;//IP地址 private Integer status;//状态,0:正常,1:报修,2:报废 private String remark;//备注 diff --git a/src/main/java/com/syq/entity/Students.java b/src/main/java/com/syq/entity/Students.java index fe4d965..d4a18ce 100644 --- a/src/main/java/com/syq/entity/Students.java +++ b/src/main/java/com/syq/entity/Students.java @@ -10,9 +10,14 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.syq.util.PoiHandler; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import net.bytebuddy.implementation.bind.annotation.Pipe; @Data @@ -24,16 +29,33 @@ public class Students { @Id @GeneratedValue(strategy = GenerationType.IDENTITY)//设置自增 + @PoiHandler(excelIgnore = true) private Integer sid;//学生编号 + + @PoiHandler(excelHeader = "学生姓名") private String sname;//学生姓名 + @Column(unique = true) + @PoiHandler(excelHeader = "卡号") private String cardno;//卡号 + @Column(unique = true) + @PoiHandler(excelHeader = "身份证号") private String idnumber;//身份证号 + + @PoiHandler(excelHeader = "性别") private String sex;//性别 + + @PoiHandler(excelHeader = "学历") + private String degree;//学历 + + @PoiHandler(excelHeader = "状态") private Integer status;//状态 + + @PoiHandler(excelHeader = "备注") private String remark;//备注 + @PoiHandler(excelHeader = "系别") @JoinColumn(name = "sysid") @ManyToOne(fetch = FetchType.EAGER) private Systeminfo systeminfo; diff --git a/src/main/java/com/syq/entity/Systeminfo.java b/src/main/java/com/syq/entity/Systeminfo.java index ea90eae..04439b2 100644 --- a/src/main/java/com/syq/entity/Systeminfo.java +++ b/src/main/java/com/syq/entity/Systeminfo.java @@ -22,6 +22,5 @@ public class Systeminfo { private Integer sysid;//系别id private String sysname;//系别名称 private String specialty;//专业 - private String degree;//学历 } diff --git a/src/main/java/com/syq/repository/ComputersRepository.java b/src/main/java/com/syq/repository/ComputersRepository.java index 7abc539..75533c9 100644 --- a/src/main/java/com/syq/repository/ComputersRepository.java +++ b/src/main/java/com/syq/repository/ComputersRepository.java @@ -2,9 +2,13 @@ package com.syq.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; import com.syq.entity.Computers; +import com.syq.entity.Students; public interface ComputersRepository extends JpaRepository,JpaSpecificationExecutor{ + @Query(value = "select * from computers c where c.ip = ?1 ",nativeQuery = true) + Computers findByIp(String ip); } diff --git a/src/main/java/com/syq/repository/StudentRepository.java b/src/main/java/com/syq/repository/StudentRepository.java index 907c6f3..8fe1587 100644 --- a/src/main/java/com/syq/repository/StudentRepository.java +++ b/src/main/java/com/syq/repository/StudentRepository.java @@ -7,10 +7,12 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import com.syq.entity.Students; -import com.syq.entity.Teachers; public interface StudentRepository extends JpaRepository,JpaSpecificationExecutor{ + + @Query(value = "select * from students s where s.sysid = ?1 ",nativeQuery = true) + List findStudentsBySysid(Integer sysid); /** * 根据卡号查询 * @param cardno diff --git a/src/main/java/com/syq/repository/TeachersRepository.java b/src/main/java/com/syq/repository/TeachersRepository.java index fb76fad..6cbf445 100644 --- a/src/main/java/com/syq/repository/TeachersRepository.java +++ b/src/main/java/com/syq/repository/TeachersRepository.java @@ -6,10 +6,28 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; +import com.syq.entity.Students; import com.syq.entity.Teachers; public interface TeachersRepository extends JpaRepository, JpaSpecificationExecutor { @Query(value = "select * from teachers t where t.secid = ?1 ",nativeQuery = true) List findTeachersBySecid(Integer secid); + + + /** + * 根据卡号查询 + * @param cardno + * @return + */ + @Query(value = "select * from teachers t where t.card_no = ?1 ",nativeQuery = true) + Teachers findByCardno(String cardno); + + /** + * 根据身份证号查询 + * @param cardno + * @return + */ + @Query(value = "select * from teachers t where t.idnumber = ?1 ",nativeQuery = true) + Teachers findByIdnumber(String idnumber); } \ No newline at end of file diff --git a/src/main/java/com/syq/service/BooksService.java b/src/main/java/com/syq/service/BooksService.java index 5b946e6..0175aa6 100644 --- a/src/main/java/com/syq/service/BooksService.java +++ b/src/main/java/com/syq/service/BooksService.java @@ -4,6 +4,7 @@ import org.springframework.data.domain.Pageable; import com.syq.entity.Books; import com.syq.util.FenyeUtil; +import com.syq.util.ResultInfoUtil; public interface BooksService { @@ -13,7 +14,7 @@ public interface BooksService { * @param pageable 分页条件 * @return 分页工具类(layui所需要的格式) */ - FenyeUtil listBooksByPage(Books book,Integer btid,Pageable pageable); + ResultInfoUtil listBooksByPage(Books book,Integer btid,Pageable pageable); /** * 添加或修改图书信息 diff --git a/src/main/java/com/syq/service/ComputersService.java b/src/main/java/com/syq/service/ComputersService.java index 7187372..8861427 100644 --- a/src/main/java/com/syq/service/ComputersService.java +++ b/src/main/java/com/syq/service/ComputersService.java @@ -30,4 +30,11 @@ public interface ComputersService { * @param com 删除的参数 无返回值 */ void deleteComputer(Computers com); + + /** + * 根据ip地址查询,用于做即时验证 + * @param ip + * @return + */ + Computers findByIp(String ip); } diff --git a/src/main/java/com/syq/service/StudentsService.java b/src/main/java/com/syq/service/StudentsService.java index 8c169e6..2fa0441 100644 --- a/src/main/java/com/syq/service/StudentsService.java +++ b/src/main/java/com/syq/service/StudentsService.java @@ -1,12 +1,27 @@ package com.syq.service; +import java.util.List; + +import javax.servlet.http.HttpServletResponse; + import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; import com.syq.entity.Students; import com.syq.util.FenyeUtil; public interface StudentsService { + /** + * 导出excel + */ + List exporExcel(String ids); + + /** + * 导入 + */ + Students importExcel(MultipartFile file); + /** * 根据卡号查询学生 * 创建人:孙玉全 @@ -15,6 +30,11 @@ public interface StudentsService { */ Students findByCardno(String cardno); + /** + * 根据系别id查询学生信息 + */ + List listBySysid(Integer sysid); + /** * 根据省份证号查询学生 * 创建人:孙玉全 diff --git a/src/main/java/com/syq/service/TeachersService.java b/src/main/java/com/syq/service/TeachersService.java index 60d8a25..e87296f 100644 --- a/src/main/java/com/syq/service/TeachersService.java +++ b/src/main/java/com/syq/service/TeachersService.java @@ -9,6 +9,27 @@ import com.syq.util.FenyeUtil; public interface TeachersService { + /** + * 根据卡号查询学生 + * 创建人:孙玉全 + * @param cardno 卡号 + * @return + */ + Teachers findByCardno(String cardno); + + /** + * 根据省份证号查询学生 + * 创建人:孙玉全 + * @param idnumber 身份证号 + * @return + */ + Teachers findByIdnumber(String idnumber); + + /** + * 根据科室id查询教师 + * @param secid + * @return + */ List getAllTeacher(Integer secid); /** diff --git a/src/main/java/com/syq/service/impl/BooksServiceImpl.java b/src/main/java/com/syq/service/impl/BooksServiceImpl.java index c21d35e..2aa92dd 100644 --- a/src/main/java/com/syq/service/impl/BooksServiceImpl.java +++ b/src/main/java/com/syq/service/impl/BooksServiceImpl.java @@ -19,6 +19,7 @@ import com.syq.entity.Books; import com.syq.repository.BooksRepository; import com.syq.service.BooksService; import com.syq.util.FenyeUtil; +import com.syq.util.ResultInfoUtil; @Service public class BooksServiceImpl implements BooksService { @@ -34,13 +35,13 @@ public class BooksServiceImpl implements BooksService { * @return 分页工具类(layui所需要的格式) */ @Override - public FenyeUtil listBooksByPage(Books book,Integer btid, Pageable pageable) { + public ResultInfoUtil listBooksByPage(Books book,Integer btid, Pageable pageable) { // TODO Auto-generated method stub Page books = booksRepository.findAll(get(book,btid), pageable); - FenyeUtil fy = new FenyeUtil(); - fy.setData(books.getContent()); - fy.setCount((int)books.getTotalElements()); - return fy; + ResultInfoUtil rf = new ResultInfoUtil(); + rf.setData(books.getContent()); + rf.setCount((int)books.getTotalElements()); + return rf; } private Specification get(Books book,Integer btid) { diff --git a/src/main/java/com/syq/service/impl/ComputersServiceImpl.java b/src/main/java/com/syq/service/impl/ComputersServiceImpl.java index 83d514a..5aa9150 100644 --- a/src/main/java/com/syq/service/impl/ComputersServiceImpl.java +++ b/src/main/java/com/syq/service/impl/ComputersServiceImpl.java @@ -37,6 +37,12 @@ public class ComputersServiceImpl implements ComputersService { return computersRepository.saveAndFlush(com); } + @Override + public Computers findByIp(String ip) { + // TODO Auto-generated method stub + return computersRepository.findByIp(ip); + } + /** * 删除电脑西信息 * 创建人:孙玉全 @@ -84,12 +90,13 @@ public class ComputersServiceImpl implements ComputersService { } } //当IP地址不为空时进行模糊查询 - if(!StringUtils.isEmpty(com.getIP())) { - expressions.add(criteriaBuilder.like(root.get("IP"), "%"+com.getIP()+"%")); + if(!StringUtils.isEmpty(com.getIp())) { + expressions.add(criteriaBuilder.like(root.get("IP"), "%"+com.getIp()+"%")); } return predicate; } }; } + } diff --git a/src/main/java/com/syq/service/impl/StudentsServiceImpl.java b/src/main/java/com/syq/service/impl/StudentsServiceImpl.java index 4dbc637..b536ef5 100644 --- a/src/main/java/com/syq/service/impl/StudentsServiceImpl.java +++ b/src/main/java/com/syq/service/impl/StudentsServiceImpl.java @@ -1,12 +1,15 @@ package com.syq.service.impl; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -14,11 +17,13 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; import com.syq.entity.Students; import com.syq.repository.StudentRepository; import com.syq.service.StudentsService; import com.syq.util.FenyeUtil; +import com.syq.util.PoiUtils; @Service public class StudentsServiceImpl implements StudentsService{ @@ -26,6 +31,41 @@ public class StudentsServiceImpl implements StudentsService{ @Autowired private StudentRepository studentRepository; + @Override + public List exporExcel(String ids) { + List sList = new ArrayList(); + if(ids !=null && ids != "") { + for(int i =0;i stu = studentRepository.findById(id); + sList.add(stu.get()); + } + }else { + sList = studentRepository.findAll(); + } + return sList; + } + + @Override + public Students importExcel(MultipartFile file) { + String originalFilename = file.getOriginalFilename();// 得到上传文件的名称 + //把上传的Excel文件里的数据解析出来,调用方法,存入数据库 + PoiUtils poiUtils = new PoiUtils();// Excel工具类 + List list = null; + Students student = null; + try { + list = (List) poiUtils.parseExcel(Students.class,file.getInputStream(), originalFilename); + for (Students s : list) { + student = studentRepository.save(s); + } + } catch (Exception e) { + e.printStackTrace(); + } + return student; + } + + /** * 添加或修改学生信息 * 创建人:孙玉全 @@ -111,12 +151,23 @@ public class StudentsServiceImpl implements StudentsService{ return studentRepository.findByCardno(cardno); } + /** + * 根据身份证号查询 + */ @Override public Students findByIdnumber(String idnumber) { // TODO Auto-generated method stub return studentRepository.findByIdnumber(idnumber); } + /** + * 根据系列id查询 + */ + @Override + public List listBySysid(Integer sysid) { + // TODO Auto-generated method stub + return studentRepository.findStudentsBySysid(sysid); + } } diff --git a/src/main/java/com/syq/service/impl/TeachersServiceImpl.java b/src/main/java/com/syq/service/impl/TeachersServiceImpl.java index e20ac5a..2bf02ba 100644 --- a/src/main/java/com/syq/service/impl/TeachersServiceImpl.java +++ b/src/main/java/com/syq/service/impl/TeachersServiceImpl.java @@ -15,6 +15,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import com.syq.entity.Students; import com.syq.entity.Teachers; import com.syq.repository.TeachersRepository; import com.syq.service.TeachersService; @@ -101,5 +102,17 @@ public class TeachersServiceImpl implements TeachersService { return teachersRepository.findTeachersBySecid(secid); } + @Override + public Teachers findByCardno(String cardno) { + // TODO Auto-generated method stub + return teachersRepository.findByCardno(cardno); + } + + @Override + public Teachers findByIdnumber(String idnumber) { + // TODO Auto-generated method stub + return teachersRepository.findByIdnumber(idnumber); + } + } diff --git a/src/main/java/com/syq/util/PoiHandler.java b/src/main/java/com/syq/util/PoiHandler.java new file mode 100644 index 0000000..a64f579 --- /dev/null +++ b/src/main/java/com/syq/util/PoiHandler.java @@ -0,0 +1,52 @@ +package com.syq.util; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 创建解析Excel的辅助注解 对PoiUtils的辅助注解 支持Excel2007和2010,并且兼容Java任意对象类型 + * + * @Description: POI操作工具类 + * @author Mashuai + * @Date 2018-5-28 上午12:51:07 + * @Email 1119616605@qq.com + * + */ +@Target({ ElementType.FIELD }) +// 注解位置:字段 +@Retention(RetentionPolicy.RUNTIME) +// 运行时可以读取.反射机制可读 +@Documented +// 包含在生成的JavaDoc中 +public @interface PoiHandler { + + /** + * Excel表格的表头 创建Excel表格的表头 + */ + String excelHeader() default ""; + + /** + * java.util.Date 格式化模型 默认 yyyy-MM-dd HH:mm:ss 创建或者解析Excel中日期时注明格式 + */ + String dateTimePattern() default "yyyy-MM-dd HH:mm:ss"; + + /** + * java.sql.Timestamp 格式化模型 默认 yyyy-MM-dd HH:mm:ss 创建或者解析Excel中日期时注明格式 + */ + String timestampPattern() default "yyyy-MM-dd HH:mm:ss"; + + /** + * 数字格式化模型 默认 ##.## 创建或者解析Excel中数值时注明格式 + */ + String numberPattern() default "##.##"; + + /** + * 是否忽略该字段 Excel表格中不生成该字段列 默认为false很重要,写了其它注解不一定是要不生成该字段 + * 创建或者解析Excel时注明是否忽略该字段的创建和解析 + */ + boolean excelIgnore() default false; + +} diff --git a/src/main/java/com/syq/util/PoiUtils.java b/src/main/java/com/syq/util/PoiUtils.java new file mode 100644 index 0000000..df6ea6a --- /dev/null +++ b/src/main/java/com/syq/util/PoiUtils.java @@ -0,0 +1,631 @@ +package com.syq.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +/** + * 创建解析Excel + * 对POI技术的封装 + * 该工具类的扩展功能请参考 @PoiHandler 注解 + * 支持Excel2007和2010,并且兼容Java任意对象类型 + * @Description: POI操作工具类 + * @author Mashuai + * @Date 2018-5-28 上午12:51:07 + * @Email 1119616605@qq.com + * + */ +public class PoiUtils { + + + + + + + //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 创建Excel 返回Excel文件^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + + /** + * 实体类需要使用@PoiHandler注解excel表头 + * 把List集合转为Excel文件,并输出字节输出流 + * @note headers excel表头值取注解的中的值 + * @param list 对象集合 + * @param clazz 集合中的对象类型 例如:User.class + * @param filePath Excel文件输出路径 + * @throws IOException + */ + public void createExcel(List list,Class clazz,File filePath) throws IOException{ + //获取Excel表头,excelHeader() + String[] headers = getHeaders(clazz); + createExcel(list, clazz, filePath, headers); + } + + + /** + * 把List集合转为Excel文件,并输出字节输出流 + * @param list 对象集合 + * @param clazz 集合中的对象类型 例如:User.class + * @param filePath Excel文件输出路径 + * @param headers excel表头值 + * @throws IOException + */ + public void createExcel(List list,Class clazz,File filePath,String... headers) throws IOException{ + //判断集合为空则不创建Excel表格 + if(isEmpty(list))return; + //判断文件输出路径是否存在 + if(!filePath.exists()){ + filePath.createNewFile(); + } + FileOutputStream out = new FileOutputStream(filePath); + //创建Excel表格 + Workbook workbook = createWorkbook(list, clazz, headers); + workbook.write(out); + } + /** + * 实体类需要使用@PoiHandler注解excel表头 + * 把List集合转为Excel文件,并输出字节输出流 + * @note headers excel表头值取注解的中的值 + * @param list 对象集合 + * @param clazz 集合中的对象类型 例如:User.class + * @param outputStream 字节输出流 + * @throws IOException + */ + public void createExcel(List list,Class clazz,OutputStream outputStream) throws IOException{ + //获取Excel表头,excelHeader() + String[] headers = getHeaders(clazz); + createExcel(list, clazz, outputStream, headers); + + + } + + /** + * 把List集合转为Excel文件,并输出字节输出流 + * @param list 对象集合 + * @param clazz 集合中的对象类型 例如:User.class + * @param outputStream 字节输出流 + * @param headers excel表头值 + * @throws IOException + */ + public void createExcel(List list,Class clazz,OutputStream outputStream,String... headers) throws IOException{ + //判断集合为空则不创建Excel表格 + //if(isEmpty(list))return; + //创建Excel表格 + Workbook workbook = createWorkbook(list, clazz, headers); + workbook.write(outputStream); + + + } + /** + * 判断集合为空 + * @param list + * @return + */ + private Boolean isEmpty(List list){ + if(list == null || list.isEmpty()){ + System.err.println("需要转换的集合不能为空!!!"); + return true; + }else { + return false; + } + } + /** + * 创建 WorkBook + * @param list + * @param clazz + * @param headers + * @return + */ + private Workbook createWorkbook(List list,Class clazz,String[] headers) { + Workbook workbook = null ; + //创建一个Excel文件 + try { + workbook =new HSSFWorkbook();//构造一个xls后缀的EXCEL文件对象,2007 + } catch (Exception e) { + e.printStackTrace(); + workbook=new XSSFWorkbook();//构造一个xlsx后缀的EXCEL文件对象,2010 + } + Sheet sheet=workbook.createSheet(clazz.getSimpleName());//创建一个sheet表,并设置Sheet表名称,默认使用简类名 + // 设置表格默认列宽度为20个字节 + sheet.setDefaultColumnWidth(10); + //创建表头字段 + Row row=sheet.createRow(0);//创建第一行表头,创建索引为0的Row对象 + row.setHeightInPoints((short)18);//设置表头行高度 +// headers = {"姓名","性别","年龄","出生日期","住址"}; + int head_length=headers.length; + Cell[] cells=new HSSFCell[head_length]; + //填入表头的值 + for (int i=0;i"+c+"|f=>"+f); + try { + if( excelIgnore(fields[f]) ){//如果该字段f不需要导出excel + c--;continue; + } + } catch (ArrayIndexOutOfBoundsException e) { + + e.printStackTrace(); + }catch (Exception e) { + e.printStackTrace(); + } + + row.createCell(c);//创建一个单元格对象 + row.getCell(c).setCellType(CellType.STRING);//设置单元格类型为字符文本 + row.getCell(c).setCellStyle(defaultCellStyle(workbook));//设置单元格默认样式 + try { + fields[f].setAccessible(true);//把private私有字段设置为允许访问 + cellValue = getFieldValue(fields[f], obj); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //设置单元格的值 +// row.getCell(c).setCellValue(cellValue);//设置第rowNumber行的第c列单元格的字符文本值,默认列宽可能文本显示不全 + setCellValue(row, c, cellValue, sheet);//设置单元格的值,并自适应列宽 + + } + return row;//第rowNumber行对象 + } + /** + * 设置单元格的值,并自适应列宽 + * @param row 单元格所在的行 + * @param c 单元格所在的列索引 + * @param value 单元格的值 + * @param sheet 单元格所在的表 + */ + private void setCellValue(Row row,int c,String value,Sheet sheet){ + System.out.println("{value:"+value+",length:"+(value.getBytes().length * 256)+"}"); + if(value != null && !"".equals(value)){ + int beforeWidth = sheet.getColumnWidth(c);//以前单元格宽度 + int nowWidth = value.getBytes().length * 256;//现在要设置的值需要的单元格宽度 + System.out.println("{beforeWidth:"+beforeWidth+",nowWidth:"+nowWidth+"}"); + if(nowWidth > beforeWidth)sheet.setColumnWidth(c, nowWidth );//如果宽度不足以显示现在的值,则设置为需要的宽度 + row.getCell(c).setCellValue(value);//设置第rowNumber行的第c列单元格的字符文本值 + } + + } + + /** + * 根据字段和对象,获取该对象的字段文本值 + * @param field 字段 + * @param obj 对象 + * @return 该对象的字段文本值 + * @throws IllegalAccessException + * @throws IllegalArgumentException + */ + private String getFieldValue(Field field,Object obj) throws IllegalArgumentException, IllegalAccessException{ +// String fieldValue = ""; + Class ft = null;//字段类型 + ft = field.getType(); + System.out.println(field.getName()+" : "+ft); + + field.setAccessible(true);//设置对象属性允许访问,以便设置值 + if(ft == String.class){ + return String.valueOf(field.get(obj)); + }else if(ft == Date.class){ + PoiHandler poi = field.getAnnotation(PoiHandler.class); + return new SimpleDateFormat( poi==null ?"yyyy-MM-dd HH:mm:ss":poi.dateTimePattern()).format(field.get(obj)); + }else if(ft == Timestamp.class){ + String timeStr = ""; + try { + PoiHandler poi = field.getAnnotation(PoiHandler.class); + timeStr = new SimpleDateFormat(poi==null ?"yyyy-MM-dd HH:mm:ss":poi.timestampPattern()).format(field.get(obj)); + } catch (Exception e) { + e.printStackTrace(); + timeStr = String.valueOf(field.get(obj)); + } + return timeStr; + }else if(ft == Boolean.class || ft == boolean.class){ + return (Boolean) field.get(obj) ? "是":"否"; + }else if(ft == String[].class){//字符串数组 + return Arrays.asList(field.get(obj)).toString(); + }else { + return String.valueOf(field.get(obj)); + } + } + + /** + * 是否忽略该字段:Excel表格中不生成该字段列 + * @param field + * @return + */ + private boolean excelIgnore(Field field){ + PoiHandler poi = field.getAnnotation(PoiHandler.class); + if(poi == null)return false;//不忽略 + return poi.excelIgnore(); + } + + /** + * 是否忽略该字段:Excel表格中不生成该字段列 + * @param field + * @return + */ + private String excelHeader(Field field){ + PoiHandler poi = field.getAnnotation(PoiHandler.class); + if(poi == null){ + System.err.println("POI工具异常!!!用法错误!!! 请传入Excel表头或者在实体类上写入表头注解,例如:@PoiHandler(excelHeader=\"学生姓名\")"); + } + return poi.excelHeader(); + } + + /** + * 获取表头 + * @param clazz + * @return + */ + private String[] getHeaders(Class clazz){ + List fields = Arrays.asList( clazz.getDeclaredFields() );//类的所有属性 + //收集excel表头 + List headerList = new ArrayList(); + //去掉要忽略的excel字段 + for( Field f:fields){ + if(!excelIgnore(f)) headerList.add(excelHeader(f));//不忽略的字段才取出表头值 + } + String[] headers = new String[headerList.size()]; + return headerList.toArray(headers); + } + /** + * 单元格默认样式 + * 文本剧中显示 + * @param workbook + * @return + */ + private CellStyle defaultCellStyle(Workbook workbook){ + CellStyle style = workbook.createCellStyle();//创建一个单元格样式 + //设置单元格填充样式 + style.setAlignment(HorizontalAlignment.CENTER);//水平剧中显示 + style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直剧中显示 + return style; + } + + /** + * 默认表头单元格样式 + * @param workbook + * @return + */ + /** + * @param workbook + * @return + */ + private CellStyle defaultHeaderCellStyle(Workbook workbook){ + CellStyle style = workbook.createCellStyle();//创建一个单元格样式 + //设置单元格填充样式 + style.setFillPattern(FillPatternType.SOLID_FOREGROUND);//可以填充单元格样式 + //style.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index);//填充背景色 + //style.setFillForegroundColor(HSSFColor.GOLD); + //style.setFillForegroundColor(HSSFColor.HSSFColorPredefined.BLUE); + //style.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index); + style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + //style.setFillPattern(CellStyle.SOLID_FOREGROUND); + style.setAlignment(HorizontalAlignment.CENTER);//水平剧中显示 + style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直剧中显示 + style.setBorderBottom(BorderStyle.SLANTED_DASH_DOT);//双实线下边框 + //设置单元格字体样式 + Font font = workbook.createFont(); + font.setFontHeightInPoints((short)10);//字体大小 + font.setFontName("华文中宋");//字体 + font.setBold(true);//粗体 + //font.setColor(HSSFColor.BLACK.index);//字体颜色 + style.setFont(font);//设置单元格字体样式 + return style; + } + + //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 解析Excel 返回实体类集合^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + + /** + * 把 Excel 文件解析为实体集合 + * @param clazz 需要解析出的实体类型 + * @param inputStream Excel文件的字节输入流 + * @return + */ + public T parseExcel(Class clazz ,File filePath,String originalFilename){ + InputStream inputStream = null;//文件字节输入流 + try { + inputStream = new FileInputStream(filePath); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + if(inputStream == null){//如果文件路径中没有Excel文件 + System.err.println("请检查文件路径是否包含一个Excel文件!!!"); + return null; + } + return (T) parseExcel(clazz, inputStream, originalFilename); + } + /** + * 把 Excel 文件解析为实体集合 + * @param clazz 需要解析出的实体类型 + * @param inputStream Excel文件的字节输入流 + * @return + */ + public T parseExcel(Class clazz ,InputStream inputStream,String originalFilename){ + Workbook workbook=null;//一个EXCEL文件对象 + Sheet sheet = null;//EXCEL文件的sheet表 + List list = null; + //从字节输入流中解析出 Workbook + workbook = getWorkbook(inputStream, originalFilename); + // 解析 Workbook 的 Sheet 表 + sheet = workbook.getSheetAt(0);//获取Excel文件的第一个Sheet表 + //解析 Sheet 表头 + String[] headerArr = this.getSheetHeader(sheet); + System.out.println("表头是=>"+Arrays.asList(headerArr));//把数组转为集合输出,测试 解析数据是否异常 + //把 Sheet表格中的数据转为实体类 对应的 对象集合 + list = (List) parseSheet(sheet, clazz); + + return (T) list; + } + /** + * 从字节输入流中解析出 Workbook + * @param inputStream Excel文件的字节输入流 + * @param originalFilename Excel文件的名称 + * @return Workbook + * @throws IOException + */ + private Workbook getWorkbook(InputStream inputStream,String originalFilename){ + Workbook workbook=null;//一个EXCEL文件对象 + try { + //判断文件是否以xls后缀 + if(originalFilename.toLowerCase().endsWith("xls"))workbook = new HSSFWorkbook(inputStream);//构造一个HSSFWorkbook实例 + //判断文件是否以xlsx后缀 + if(originalFilename.toLowerCase().endsWith("xlsx"))workbook = new XSSFWorkbook(inputStream);//构造一个XSSFWorkbook实例 + }catch (IOException e) { + // TODO: handle exception + e.printStackTrace(); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + } + return workbook; + } + /** + * 解析 Sheet 表头 + * @param sheet + * @return + */ + private String[] getSheetHeader(Sheet sheet){ + List headerList = new ArrayList(); + Row firstrow=sheet.getRow(0);//获取第一个sheet表的第一行Row + //--------测试代码开始----------------------测试EXCEL表格中是否有数据 + Iterator cIterator=firstrow.iterator();//调用Row对象的迭代器方法 + while(cIterator.hasNext()){ + headerList.add(cIterator.next().getStringCellValue());//把表头添加到集合中 + } + String[] headerArr = new String[headerList.size()];//创建一个和集合长度一样的数组 +// System.out.println("表头是=>"+Arrays.asList(headerArr));//把数组转为集合输出 + return headerList.toArray(headerArr);//把集合转为数组返回 + } + + /** + * 把 Sheet表格中的数据转为实体类 对应的 对象集合 + * @param sheet Excel表格 + * @param clazz 实体类类型 + * @return 实体类 对应的 对象集合 + */ + private T parseSheet(Sheet sheet,Class clazz){ + List list = new ArrayList();//对象集合 + Object object = null;//Sheet表中每一行对应的一个数据对象 + Row row= null;//Sheet表中每一行 + //获取当前对象的所有属性 + Field[] fields = clazz.getDeclaredFields(); + + int rowNum = sheet.getLastRowNum();//得到EXCEL表中数据的行数,索引从0开始,得到3其实是指共有4行数据 + System.out.println("Sheet表中行数 LastRowNum=> "+rowNum); + row = sheet.getRow(1);//得到EXCEL表中的第2行,第一行是表头 + int celNum = row.getLastCellNum();//得到一行中单元格的数量,索引从1开始 + System.out.println("Sheet表中列数 celNum=> "+celNum); + + //Sheet表格中 r行 c列 ;clazz 对象 中第f个字段 +// for (int r=1,c=0,f = 0; r < rowNum && c < celNum && f < field_length; r++,c++,f++) {//c代表第r行的第c列单元格;f代表类的第f个字段 + for (int r=1; r <= rowNum; r++) { + row = sheet.getRow(r); + if(row==null){break;}//如果取到没有数据的row就不再解析 + for(int j=0;jT parseRow(Row row,Class clazz,int celNum,Field[] fields){ + Object object = null; + String fieldValue = ""; + int field_length = fields.length;//clazz 对象字段总数 + //创建一个对象 + try { + object = clazz.newInstance();//构造一个对象实例 + } catch (InstantiationException e) { + // TODO 此处省略记录日志 + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO 此处省略记录日志 + e.printStackTrace(); + } + //Sheet表格中 r行 c列 ;clazz 对象 中第f个字段 + for (int c=0,f = 0; c < celNum && f < field_length; c++,f++) {//c代表第r行的第c列单元格;f代表类的第f个字段 + + System.out.println("解析Excel取出单元格的值给字段 c=>"+c+"|f=>"+f); + try { + if( excelIgnore(fields[f]) ){//如果该字段f不需要导出excel,也不需要解析出来该字段 + c--;continue; + } + } catch (ArrayIndexOutOfBoundsException e) { + + e.printStackTrace(); + }catch (Exception e) { + e.printStackTrace(); + } + //获取每一个单元格的字符串文本值 + fieldValue = row.getCell(c).getStringCellValue(); + //设置字段的值 + try { + setFieldValue(fieldValue, fields[f], object);//设置字段的值 + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return (T) object; + } + + /** + * 设置字段的值 + * @param fieldValue 设置的值 + * @param field 设置字段 + * @param obj 设置字段值的对象 + * @throws IllegalAccessException + * @throws IllegalArgumentException + */ + private void setFieldValue(String fieldValue,Field field,Object object) throws IllegalArgumentException, IllegalAccessException{ + Class ft = field.getType();//字段类型 + field.setAccessible(true);//设置对象属性允许访问,以便设置值 + //开始设置值 + if( fieldValue != null && !"".equals(fieldValue) ){//值不为空 + if(ft == String.class){ + field.set(object, fieldValue);//给对象的该字段设置对应的值 + }else if(ft == Integer.class || ft == int.class) { + field.set(object, Integer.valueOf(fieldValue));//给对象的该字段设置对应的值 + }else if(ft == BigDecimal.class){ + field.set(object, new BigDecimal(fieldValue));//给对象的该字段设置对应的值 + }else if(ft == Date.class){ + PoiHandler poi = field.getAnnotation(PoiHandler.class); + Date dateValue = str2Date(fieldValue,poi==null ?null:poi.dateTimePattern()); + field.set(object, dateValue);//给对象的该字段设置对应的值 + }else if(ft == Timestamp.class){ + PoiHandler poi = field.getAnnotation(PoiHandler.class); + Date dateValue = str2Date(fieldValue,poi==null ?null:poi.timestampPattern()); + Timestamp timestamp = new Timestamp(dateValue.getTime()); + field.set(object, timestamp);//给对象的该字段设置对应的值 + }else if(ft == Boolean.class || ft == boolean.class){ + field.set(object, Boolean.valueOf(fieldValue));//给对象的该字段设置对应的值 + }else if(ft == Float.class || ft == float.class){ + field.set(object, Float.valueOf(fieldValue));//给对象的该字段设置对应的值 + }else if(ft == Double.class || ft == double.class){ + field.set(object, Double.valueOf(fieldValue));//给对象的该字段设置对应的值 + }else if(ft == Long.class || ft == long.class){ + field.set(object, Long.valueOf(fieldValue));//给对象的该字段设置对应的值 + }else if(ft == Short.class || ft == short.class){ + field.set(object, Short.valueOf(fieldValue));//给对象的该字段设置对应的值 + }else if(ft == Byte.class || ft == byte.class){ + field.set(object, Byte.valueOf(fieldValue));//给对象的该字段设置对应的值 + }else { + System.err.println(field.getName()+"XXXXXXXXXXX该单元格值{"+fieldValue+"} 对应的字段类型是=>{"+ft+"}"); + field.set(object, fieldValue);//给对象的该字段设置对应的值 + } + } + } + + /** + * 尝试把日期字符串java.lang.String转为java.util.Date + * @param value + * @return + */ + private Date str2Date(String value,String dateTimePattern){ +// System.out.println("开始 日期转换 {value:"+value+",dateTimePattern:"+dateTimePattern+"}"); + Date date = null; + SimpleDateFormat formatDateTime = null; + SimpleDateFormat formatDate = null; + if( value != null && !"".equals(value) && !"null".equals(value)){//单元格中的文本值不为空 + + if(dateTimePattern != null && !"".equals(dateTimePattern) && !"null".equals(value)){ + formatDateTime = new SimpleDateFormat(dateTimePattern); + }else { + formatDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + formatDate = new SimpleDateFormat("yyyy-MM-dd"); + } + //把单元格中的文本值转为日期类型 + try { + date = formatDateTime.parse(value); + } catch (ParseException e) { + try { + date = formatDate.parse(value); + } catch (ParseException e2) { + e2.printStackTrace(); + System.err.println("XXXXXXX请检查你Excel表格中日期的格式是否正确~~~"); + } + } + } + + return date; + } + + + +} diff --git a/src/main/java/com/syq/util/Result.java b/src/main/java/com/syq/util/Result.java new file mode 100644 index 0000000..18f7c69 --- /dev/null +++ b/src/main/java/com/syq/util/Result.java @@ -0,0 +1,34 @@ +package com.syq.util; + +public class Result { + private Integer code; + private String msg;//返回的消息 + public Result() { + super(); + // TODO Auto-generated constructor stub + } + public Result(Integer code, String msg) { + super(); + this.code = code; + this.msg = msg; + } + @Override + public String toString() { + return "Result [code=" + code + ", msg=" + msg + "]"; + } + public Integer getCode() { + return code; + } + public void setCode(Integer code) { + this.code = code; + } + public String getMsg() { + return msg; + } + public void setMsg(String msg) { + this.msg = msg; + } + + + +} diff --git a/src/main/java/com/syq/util/ResultInfoUtil.java b/src/main/java/com/syq/util/ResultInfoUtil.java new file mode 100644 index 0000000..940e7d8 --- /dev/null +++ b/src/main/java/com/syq/util/ResultInfoUtil.java @@ -0,0 +1,62 @@ +package com.syq.util; + +import java.util.List; + +public class ResultInfoUtil { + + private Integer page=1;//当前页码 默认 + private Integer count;//总条数 + private List data ;//查询的返回的数据集合 + private String msg="";//返回的消息 + private Integer code;//返回的状态码 + public ResultInfoUtil() { + super(); + // TODO Auto-generated constructor stub + } + public ResultInfoUtil(Integer page, Integer count, List data, String msg, Integer code) { + super(); + this.page = page; + this.count = count; + this.data = data; + this.msg = msg; + this.code = code; + } + @Override + public String toString() { + return "ResultInfoUtil [page=" + page + ", count=" + count + ", data=" + data + ", msg=" + msg + ", code=" + + code + "]"; + } + public Integer getPage() { + return page; + } + public void setPage(Integer page) { + this.page = page; + } + public Integer getCount() { + return count; + } + public void setCount(Integer count) { + this.count = count; + } + public List getData() { + return data; + } + public void setData(List data) { + this.data = data; + } + public String getMsg() { + return msg; + } + public void setMsg(String msg) { + this.msg = msg; + } + public Integer getCode() { + return code; + } + public void setCode(Integer code) { + this.code = code; + } + + + +} diff --git a/src/main/java/com/syq/util/TokenUtil.java b/src/main/java/com/syq/util/TokenUtil.java new file mode 100644 index 0000000..088de7d --- /dev/null +++ b/src/main/java/com/syq/util/TokenUtil.java @@ -0,0 +1,94 @@ +package com.syq.util; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTCreator; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class TokenUtil { + + // 密钥 + private static final String SECRET = "secret"; + + // jackson + private static ObjectMapper mapper = new ObjectMapper(); + + /** + * header数据 + * + * @return + */ + private static Map createHead() { + Map map = new HashMap(); + map.put("typ", "JWT"); + map.put("alg", "HS256"); + return map; + } + + /** + * 生成token + * + * @param obj 对象数据 + * @param maxAge 有效期单位毫秒 + * @param + * @return + */ + public static String sign(T obj, long maxAge) throws UnsupportedEncodingException, JsonProcessingException { + JWTCreator.Builder builder = JWT.create(); + builder.withHeader(createHead())// header + .withSubject(mapper.writeValueAsString(obj)); // payload + if (maxAge >= 0) { + long expMillis = System.currentTimeMillis() + maxAge; + Date exp = new Date(expMillis); + builder.withExpiresAt(exp); + } + return builder.sign(Algorithm.HMAC256(SECRET)); + } + + /** + * 解密 + * @param token token字符串 + * @param classT 解密后的类型 + * @param + * @return + */ + public static T unsign(String token, Class classT) throws IOException { + JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build(); + DecodedJWT jwt = verifier.verify(token); + Date exp = jwt.getExpiresAt(); + if (exp != null && exp.after(new Date())) { + String subject = jwt.getSubject(); + System.out.println("解密后:" + mapper.readValue(subject, classT)); + return mapper.readValue(subject, classT); + } + return null; + } + + + /** + * 解密 + * @param token token字符串 + * @param classT 解密后的类型 + * @param + * @return + */ + public static boolean unsign1(String token, Class classT) throws IOException { + JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build(); + DecodedJWT jwt = verifier.verify(token); + Date exp = jwt.getExpiresAt(); + if (exp != null && exp.after(new Date())) { + String subject = jwt.getSubject(); + System.out.println("解密后:" + mapper.readValue(subject, classT)); + return true; + } + return false; + } +} -- Gitee