Browse Source

Merge branch 'dev' of ssh://10.10.100.21/source/smartschool-platform into dev

FANGLH 6 years ago
parent
commit
f33b5dd3d7
78 changed files with 3996 additions and 141 deletions
  1. 1 0
      .gitignore
  2. 4 0
      applications/school/school-server/pom.xml
  3. 13 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/SchoolApplication.java
  4. 2 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/controller/GradeController.java
  5. 2 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/GradeService.java
  6. 1 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/ClassServiceImpl.java
  7. 38 7
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/GradeServiceImpl.java
  8. 5 2
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/SchoolServiceImpl.java
  9. 1 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/StudentServiceImpl.java
  10. 1 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/TeacherServiceImpl.java
  11. 79 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/controller/ExcelController.java
  12. 8 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/controller/MessageLogController.java
  13. 14 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/ExcelService.java
  14. 8 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/MessageLogService.java
  15. 517 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/impl/ExcelServiceImpl.java
  16. 11 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/impl/MessageLogServiceImpl.java
  17. 1 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/exception/BizExceptionCode.java
  18. 20 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/DataImportMapper.java
  19. 9 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/DataTempletMapper.java
  20. 100 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/DataImport.java
  21. 109 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/DataImportDetail.java
  22. 78 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/DataTemplet.java
  23. 22 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/SCHOOLTYPE.java
  24. 72 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/TempletSet.java
  25. 57 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/TreeNode.java
  26. 151 0
      applications/school/school-server/src/main/resources/mapper/DataImportMapper.xml
  27. 17 0
      applications/school/school-server/src/main/resources/mapper/DataTempletMapper.xml
  28. 71 1
      applications/websocket/websocket-server/pom.xml
  29. 5 1
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/WebsocketApplication.java
  30. 28 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/FeignBeanFactoryPostProcessor.java
  31. 67 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/MybatisConfigurer.java
  32. 33 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/SwaggerConfig.java
  33. 16 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/WebSocketConfigurer.java
  34. 32 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/controller/IndexController.java
  35. 362 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/controller/WebSocketController.java
  36. 76 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/AbstractService.java
  37. 17 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Mapper.java
  38. 16 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ProjectConstant.java
  39. 44 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Result.java
  40. 22 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ResultCode.java
  41. 27 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ResultGenerator.java
  42. 22 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Service.java
  43. 22 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ServiceException.java
  44. 8 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/DeviceDOMapper.java
  45. 8 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/OutInRecordDOMapper.java
  46. 8 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/StudentDOMapper.java
  47. 56 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/Command.java
  48. 310 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/DeviceDO.java
  49. 200 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/OutInRecordDO.java
  50. 344 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/StudentDO.java
  51. 233 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/server/WebSocket.java
  52. 12 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/DeviceDOService.java
  53. 12 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/OutInRecordDOService.java
  54. 12 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/StudentDOService.java
  55. 24 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/DeviceDOServiceImpl.java
  56. 24 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/OutInRecordDOServiceImpl.java
  57. 22 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/StudentDOServiceImpl.java
  58. 53 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/utils/ImgUtil.java
  59. 77 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/utils/WebSocketUtil.java
  60. 4 1
      applications/websocket/websocket-server/src/main/resources/application.yml
  61. 22 0
      applications/websocket/websocket-server/src/main/resources/mapper/DeviceDOMapper.xml
  62. 17 0
      applications/websocket/websocket-server/src/main/resources/mapper/OutInRecordDOMapper.xml
  63. 23 0
      applications/websocket/websocket-server/src/main/resources/mapper/StudentDOMapper.xml
  64. 63 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/smartschool/account/dto/RoleDTO.java
  65. 2 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/AuthApplication.java
  66. 2 2
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/mapper/AuthorizeLogMapper.java
  67. 1 1
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/AuthorizeCountService.java
  68. 5 4
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/AuthorizeLogService.java
  69. 9 9
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/impl/AuthorizeLogServiceImpl.java
  70. 1 1
      base-servers/auth/auth-server/src/main/resources/application.yml
  71. 27 0
      frontend/pc-web/app/view/basic/staff/StaffList.js
  72. 21 20
      frontend/pc-web/app/view/core/base/ImportWindow.js
  73. 11 6
      frontend/wechat-web/src/configs/api.config.js
  74. 1 1
      frontend/wechat-web/src/configs/router.config.js
  75. 103 53
      frontend/wechat-web/src/modules/phonesBook/PhonesList.jsx
  76. 67 17
      frontend/wechat-web/src/modules/phonesBook/PhonesSearch.jsx
  77. 10 8
      frontend/wechat-web/src/modules/phonesBook/PhonesSelect.jsx
  78. 3 3
      frontend/wechat-web/src/modules/user/UserInfo.js

+ 1 - 0
.gitignore

@@ -17,6 +17,7 @@ framework/**/target/
 .springBeans
 
 ### IntelliJ IDEA ###
+
 .idea/
 *.iws
 *.iml

+ 4 - 0
applications/school/school-server/pom.xml

@@ -73,6 +73,10 @@
             <groupId>com.usoftchina.smartschool</groupId>
             <artifactId>school-dto</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 13 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/SchoolApplication.java

@@ -6,6 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 
 /**
  * @author: guq
@@ -16,8 +18,18 @@ import org.springframework.context.annotation.ComponentScan;
 @EnableEurekaClient
 @EnableFeignClients("com.usoftchina.smartschool")
 @ComponentScan(basePackages = {"com.usoftchina.smartschool"})
-public class SchoolApplication {
+public class SchoolApplication extends WebMvcConfigurerAdapter {
     public static void main(String[] args) {
         SpringApplication.run(SchoolApplication.class, args);
     }
+
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+
+        registry.addMapping("/**")
+                .allowCredentials(true)
+                .allowedHeaders("*")
+                .allowedOrigins("*")
+                .allowedMethods("*");
+    }
 }

+ 2 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/controller/GradeController.java

@@ -3,6 +3,7 @@ package com.usoftchina.smartschool.school.basic.controller;
 import com.usoftchina.smartschool.base.Result;
 import com.usoftchina.smartschool.school.basic.service.GradeService;
 import com.usoftchina.smartschool.school.po.SysSchool;
+import com.usoftchina.smartschool.school.po.TreeNode;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -28,7 +29,7 @@ public class GradeController {
     */
     @RequestMapping("/read/{id}")
     public Result getSchoolTree(@PathVariable("id") Long id) {
-        SysSchool school = gradeService.getSchoolTree(id);
+        TreeNode school = gradeService.getSchoolTree(id);
         return Result.success(school);
     }
 

+ 2 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/GradeService.java

@@ -1,7 +1,8 @@
 package com.usoftchina.smartschool.school.basic.service;
 
 import com.usoftchina.smartschool.school.po.SysSchool;
+import com.usoftchina.smartschool.school.po.TreeNode;
 
 public interface GradeService {
-    SysSchool getSchoolTree(Long id);
+    TreeNode getSchoolTree(Long id);
 }

+ 1 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/ClassServiceImpl.java

@@ -33,6 +33,7 @@ public class ClassServiceImpl implements ClassService{
             throw new BizException(BizExceptionCode.USELESS_DATA);
         }
         Long school_id = BaseContextHolder.getSchoolId();
+        school_id = 1l;
         ClassForm cf = new ClassForm();
         SysClazz clazz = sysClazzMapper.selectByPrimaryKey(id);
         List<SysStudent> students = sysStudentMapper.selectByConditon("clazz_id=" + id, school_id);

+ 38 - 7
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/GradeServiceImpl.java

@@ -6,12 +6,11 @@ import com.usoftchina.smartschool.school.exception.BizExceptionCode;
 import com.usoftchina.smartschool.school.mapper.SysClazzMapper;
 import com.usoftchina.smartschool.school.mapper.SysGradeMapper;
 import com.usoftchina.smartschool.school.mapper.SysSchoolMapper;
-import com.usoftchina.smartschool.school.po.SysClazz;
-import com.usoftchina.smartschool.school.po.SysGrade;
-import com.usoftchina.smartschool.school.po.SysSchool;
+import com.usoftchina.smartschool.school.po.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -31,19 +30,51 @@ public class GradeServiceImpl implements GradeService{
     private SysClazzMapper sysClazzMapper;
 
     @Override
-    public SysSchool getSchoolTree(Long id) {
+    public TreeNode getSchoolTree(Long id) {
         if (null == id || "0".equals(id)) {
             throw new BizException(BizExceptionCode.USELESS_DATA);
         }
+        id = 1l;
+
         SysSchool school = sysSchoolMapper.selectByPrimaryKey(id);
+        TreeNode schoolTree = new TreeNode();
+        TreeNode gradeNode = null;
+        TreeNode classNode = null;
+        List<TreeNode> gradesTree = new ArrayList<>();
+        List<TreeNode> classesTree = new ArrayList<>();
+        schoolTree.setId(school.getSchool_id());
+        schoolTree.setLeaf(false);
+        schoolTree.setText(school.getSchool_name());
+        schoolTree.setType(SCHOOLTYPE.SCHOOL.name());
+
         List<SysGrade> grades = sysGradeMapper.selectBySchool(id);
         if (null != grades && grades.size() > 0) {
+
             for (SysGrade grade : grades) {
+                gradeNode = new TreeNode();
+                gradeNode.setType(SCHOOLTYPE.GRADE.name());
+                gradeNode.setLeaf(false);
+                gradeNode.setText(grade.getGrade_name());
+                gradeNode.setId(grade.getGrade_id());
+
                 List<SysClazz> classes = sysClazzMapper.selectBygrade(grade.getGrade_id());
-                grade.setChildren(classes);
+                if (null != classes && classes.size() > 0) {
+                    for (SysClazz class_ : classes) {
+                        classNode = new TreeNode();
+                        classNode.setId(class_.getClazz_id());
+                        classNode.setLeaf(true);
+                        classNode.setText(class_.getClazz_name());
+                        classNode.setType(SCHOOLTYPE.CALSS.name());
+                        classesTree.add(classNode);
+                    }
+                }
+                gradeNode.setChildren(classesTree);
+                gradesTree.add(gradeNode);
+                //grade.setChildren(classes);
             }
         }
-        school.setChildren(grades);
-        return school;
+        schoolTree.setChildren(gradesTree);
+        //school.setChildren(grades);
+        return schoolTree;
     }
 }

+ 5 - 2
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/SchoolServiceImpl.java

@@ -1,5 +1,6 @@
 package com.usoftchina.smartschool.school.basic.service.impl;
 
+import com.usoftchina.smartschool.context.BaseContextHolder;
 import com.usoftchina.smartschool.exception.BizException;
 import com.usoftchina.smartschool.school.basic.service.SchoolService;
 import com.usoftchina.smartschool.school.exception.BizExceptionCode;
@@ -24,7 +25,9 @@ public class SchoolServiceImpl implements SchoolService {
         if (null == id || "0".equals(id)) {
             throw new BizException(BizExceptionCode.USELESS_DATA);
         }
-        SysSchool school = sysSchoolMapper.selectByPrimaryKey(id);
+        Long school_id = BaseContextHolder.getSchoolId();
+        school_id = 1l;
+        SysSchool school = sysSchoolMapper.selectByPrimaryKey(school_id);
         return school;
     }
 
@@ -33,6 +36,6 @@ public class SchoolServiceImpl implements SchoolService {
         if (StringUtils.isEmpty(school) || StringUtils.isEmpty(school.getSchool_id())) {
             throw new BizException(BizExceptionCode.USELESS_DATA);
         }
-        sysSchoolMapper.updateByPrimaryKey(school);
+        sysSchoolMapper.updateByPrimaryKeySelective(school);
     }
 }

+ 1 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/StudentServiceImpl.java

@@ -35,6 +35,7 @@ public class StudentServiceImpl implements StudentService{
     public PageInfo<SysStudent> getListData(PageRequest page, ListReqDTO listReqDTO) {
         PageHelper.startPage(page.getNumber(), page.getSize());
         Long schoolId = BaseContextHolder.getSchoolId();
+        schoolId = 1l;
         //condition语句
         String condition = listReqDTO.getFinalCondition();
         if(condition == null){

+ 1 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/TeacherServiceImpl.java

@@ -38,6 +38,7 @@ public class TeacherServiceImpl implements TeacherService{
         if(condition == null){
             condition = "1=1";
         }
+        schoolId = 1l;
         List<SysTeacher> teacherList = sysTeacherMapper.selectByConditon(condition, schoolId);
         PageInfo<SysTeacher> list = new PageInfo<>(teacherList);
         return list;

+ 79 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/controller/ExcelController.java

@@ -0,0 +1,79 @@
+package com.usoftchina.smartschool.school.common.controller;
+
+import com.usoftchina.smartschool.base.Result;
+import com.usoftchina.smartschool.exception.BizException;
+import com.usoftchina.smartschool.school.common.service.ExcelService;
+import com.usoftchina.smartschool.school.exception.BizExceptionCode;
+import com.usoftchina.smartschool.utils.DateUtils;
+import com.usoftchina.smartschool.utils.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author: guq
+ * @create: 2019-01-23 16:25
+ **/
+@RestController
+@RequestMapping("/excel")
+public class ExcelController {
+
+    @Autowired
+    private ExcelService excelService;
+
+    @RequestMapping("/import/templet")
+    public void CreateTemplet(@RequestParam("caller") String caller, HttpServletResponse response) throws IOException {
+        if (StringUtils.isEmpty(caller)) {
+            throw new BizException(BizExceptionCode.USELESS_DATA);
+        }
+        Map<String, Object> map = excelService.CreateTemplet(caller);
+        SXSSFWorkbook workbook = (SXSSFWorkbook)map.get("workbook");
+        String title = map.get("title").toString() + "_" + DateUtils.format(new Date(), "yyyyMMdd");
+        String filename = URLEncoder.encode(title + ".xlsx", "UTF-8");
+        response.setContentType("application/vnd.ms-excel");
+        response.setHeader("Content-Disposition", "attachment;filename=" + filename);
+        OutputStream out;
+        out = response.getOutputStream();
+        workbook.write(out);
+        out.close();
+    }
+
+    @PostMapping(value = "/import/parse", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public Result ParseTemplet(@RequestParam("caller") String caller, @RequestPart(value = "file") MultipartFile file) throws IOException {
+        InputStream is = null;
+        Workbook wb = null;
+        Integer keyvalue = null;
+        long size = file.getSize();
+        if (size > 104857600) {
+            return Result.error(new String(("{error: '文件过大', size:" + size + "}").getBytes("utf-8"), "iso8859-1"));
+        } else {
+            excelService.clearBefore(caller);
+            String ft = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
+            String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+            is = file.getInputStream();
+            if (ft.equals("xlsx")) {
+                wb = new XSSFWorkbook(is);
+            } else if(ft.equals("xls")){
+                wb = new HSSFWorkbook(is);
+            } else {
+                return Result.error(new String("{error: 'excel文件的格式不太规范,导入失败<hr>可以尝试将文件另存为.xls文件,或将数据选择性粘贴到excel模板,然后导入'}".getBytes("utf-8"),
+                        "iso8859-1"));
+            }
+            keyvalue = excelService.parseTemplet(wb, caller, fileName);
+        }
+        return Result.success(keyvalue);
+    }
+}

+ 8 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/controller/MessageLogController.java

@@ -0,0 +1,8 @@
+package com.usoftchina.smartschool.school.common.controller;
+
+/**
+ * @author: guq
+ * @create: 2019-01-23 16:23
+ **/
+public class MessageLogController {
+}

+ 14 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/ExcelService.java

@@ -0,0 +1,14 @@
+package com.usoftchina.smartschool.school.common.service;
+
+import org.apache.poi.ss.usermodel.Workbook;
+
+import java.util.Map;
+
+public interface ExcelService {
+
+    Map<String, Object> CreateTemplet(String caller);
+
+    void clearBefore(String caller);
+
+    Integer parseTemplet(Workbook wb, String caller, String title);
+}

+ 8 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/MessageLogService.java

@@ -0,0 +1,8 @@
+package com.usoftchina.smartschool.school.common.service;
+
+/**
+ * @author: guq
+ * @create: 2019-01-23 16:23
+ **/
+public interface MessageLogService {
+}

+ 517 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/impl/ExcelServiceImpl.java

@@ -0,0 +1,517 @@
+package com.usoftchina.smartschool.school.common.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.usoftchina.smartschool.context.BaseContextHolder;
+import com.usoftchina.smartschool.exception.BizException;
+import com.usoftchina.smartschool.school.common.service.ExcelService;
+import com.usoftchina.smartschool.school.exception.BizExceptionCode;
+import com.usoftchina.smartschool.school.mapper.DataImportMapper;
+import com.usoftchina.smartschool.school.mapper.DataTempletMapper;
+import com.usoftchina.smartschool.school.po.DataImport;
+import com.usoftchina.smartschool.school.po.DataImportDetail;
+import com.usoftchina.smartschool.school.po.DataTemplet;
+import com.usoftchina.smartschool.school.po.TempletSet;
+import com.usoftchina.smartschool.utils.CollectionUtils;
+import com.usoftchina.smartschool.utils.DateUtils;
+import com.usoftchina.smartschool.utils.RegexpUtils;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @author: guq
+ * @create: 2018-11-26 15:19
+ **/
+@Service
+public class ExcelServiceImpl implements ExcelService {
+
+    @Autowired
+    private DataTempletMapper dataTempletMapper;
+    @Autowired
+    private DataImportMapper dataImportMapper;
+
+    @Override
+    public Map<String, Object> CreateTemplet(String caller) {
+        Long companyId = BaseContextHolder.getCompanyId();
+        Map<String, Object> map = new HashMap<>();
+        SXSSFWorkbook workbook = new SXSSFWorkbook();
+        DataTemplet dataTemplet = dataTempletMapper.selectByCaller(caller, companyId);
+        if (null == dataTemplet) {
+            throw new BizException(9876, "没有查询到对应的excel配置");
+        }
+        //列
+        String cols = dataTemplet.getDt_columns();
+        JSONArray array = (JSONArray) JSONArray.parse(cols);
+        //模板数据
+        String remark = dataTemplet.getDt_description();
+        String exampledata = dataTemplet.getDt_exampledata();
+        JSONArray datas = (JSONArray) JSONArray.parse(exampledata);
+        createWorkbook(workbook, 1, array, datas, remark);
+        map.put("workbook", workbook);
+        map.put("title", dataTemplet.getDt_title());
+        return map;
+    }
+
+    @Override
+    public void clearBefore(String caller) {
+        Long schoolId = BaseContextHolder.getSchoolId();
+        String ids = dataImportMapper.selectByCaller(caller, schoolId);
+        if (!StringUtils.isEmpty(ids)) {
+            dataImportMapper.deleteDetailByIds(ids);
+            dataImportMapper.deleteByIds(ids);
+        };
+
+    }
+
+    @Override
+    @Transactional
+    public Integer parseTemplet(Workbook wb, String caller, String fileName) {
+        if (wb == null || StringUtils.isEmpty(caller)) {
+            throw new BizException(BizExceptionCode.EMPTY_DATA);
+        }
+        //Long companyId = BaseContextHolder.getCompanyId();
+        Long school_id = BaseContextHolder.getSchoolId();
+        DataImport di = new DataImport();
+        di.setSchool_id(school_id);
+        di.setDi_caller(caller);
+        di.setDi_date(new Date());
+        di.setDi_man(BaseContextHolder.getUserName());
+        di.setDi_toformal(0);
+        di.setDi_success(0);
+        List<Map<String,String>> datas = new ArrayList<Map<String,String>>();
+        DataTemplet dataTemplet = dataTempletMapper.selectByCaller(caller, school_id);
+        String cols = dataTemplet.getDt_columns();
+        if (StringUtils.isEmpty(cols)) {
+            throw new BizException(12135, "没有查询到对应的excel配置");
+        }
+        //验证标题是否正确
+        String title = dataTemplet.getDt_title();
+        if (StringUtils.isEmpty(fileName) || fileName.indexOf(title) < 0) {
+            throw new BizException(BizExceptionCode.BIZ_IMPORT_ERROREXCEL);
+        }
+        //前端列表信息
+        List<TempletSet> templetSets = JSONArray.parseArray(cols, TempletSet.class);
+        Map<String, List<TempletSet>> columns = CollectionUtils.groupBy(templetSets, TempletSet::getPosition);
+        List<String> positions = SetToList(columns.keySet());
+        String cellData = null;
+        String codeValue = null;
+        //读取默认从第2行开始读取
+        List<String> keys = new ArrayList<>();
+        //获取第一个sheet
+        Sheet sheet = wb.getSheetAt(0);
+        //获取最大行数
+        int rownum = sheet.getPhysicalNumberOfRows();
+        if (rownum < 3) {
+            throw new BizException(12324, "请先填写数据");
+        }
+        //获取第2行
+        Row row = sheet.getRow(1);
+        //获取最大列数
+        int colnum = row.getPhysicalNumberOfCells();
+        String key = null;
+        Map<String,String> map = null;
+        //添加keys
+        for (int j = 0; j < colnum; j++){
+            key = (String) getCellFormatValue(row.getCell(j));
+            keys.add(key);
+        }
+        //存储数据
+        for (int i = 2; i < rownum; i++) {
+            map = new LinkedHashMap<String,String>();
+            row = sheet.getRow(i);
+            if(row !=null){
+                for (int j = 0;j < colnum; j++){
+                    cellData = (String) getCellFormatValue(row.getCell(j));
+                    map.put(keys.get(j), cellData);
+                }
+            }else{
+                break;
+            }
+            datas.add(map);
+        }
+        dataImportMapper.insertSelective(di);
+        Integer keyvalue = di.getDi_id();
+        List<String> validateCode = Lists.newArrayList();
+        //数据转换成字段
+        if (!CollectionUtils.isEmpty(datas)) {
+            StringBuilder err = new StringBuilder();
+            JSONArray mains = new JSONArray();
+            JSONArray details = new JSONArray();
+            //数据行循环
+            for (int i = 0; i < datas.size(); i++) {
+                Map<String,String> data = datas.get(i);
+                DataImportDetail dd = new DataImportDetail();
+                //界面值
+                String value = null;
+                JSONObject mainData = null;
+                JSONObject detailData = null;
+                //标识是否一个主表的数据
+                boolean difference = true;
+                dd.setSchool_id(school_id);
+                dd.setDd_diid(keyvalue);
+                //主从表循环
+                for (int j = 0; j < positions.size(); j++) {
+                    String position = positions.get(j);
+                    //依据主从表分类
+                    if ("main".equals(position)) {
+                        //主表字段配置
+                        List<TempletSet> main = columns.get(position);
+                        for (TempletSet set : main) {
+                            //取excel值
+                            value = data.get(set.getDescription());
+                            //取编号字段
+                            if (set.isCodefield() && !"".equals(value)) {
+                                mainData = new JSONObject();
+                                codeValue = RegexpUtils.replaceSpecialCharacter(value);
+                                difference = true;
+                                validateCode.add(codeValue);
+                                dd.setDd_codevalue(codeValue);
+                            }
+                            //检查是否是同一单
+                            if (set.isCodefield() && "".equals(value)) {
+                                difference = false;
+                                break;
+                            }
+                            //检查主表必填字段是否完整
+                            if (difference) {
+                                if ("true".equals(set.getNecessary()) && "".equals(value)) {
+                                    err.append("第" + (i + 3) + "行 " + set.getDescription() + " 必填字段未填写!<br/> ");
+                                    break;
+                                }
+                            }
+                            //检测日期类型是否规范
+                            if ("date".equals(set.getType()) && !StringUtils.isEmpty(value)) {
+                                value = praseDate(value);
+                                if (null == value) {
+                                    err.append("第" + (i + 3) + "行 " + set.getDescription() + " 日期格式不正确!<br/> ");
+                                    break;
+                                }
+                            }
+                            //如果为数字类型且为空默认赋值0,检测是否为数字类型
+                            if ("number".equals(set.getType())) {
+                                if (StringUtils.isEmpty(value)) {
+                                    value = "0";
+                                } else {
+                                    Boolean numner = isNumner(value);
+                                    if (!numner) {
+                                        err.append("第" + (i + 3) + "行 " + set.getDescription() + " 数字格式不正确!<br/> ");
+                                        break;
+                                    }
+                                }
+                            }
+                            //插入主表数据
+                            if (null != mainData) {
+                                mainData.put(set.getField(), value);
+                            }
+                        }
+                        //所有主表数据进行分类
+                        if (null != mainData) {
+                            //mains.add(mainData);
+                            dd.setDd_maindata(mainData.toJSONString());
+                        }
+                    } else {
+                        //从表字段
+                        List<TempletSet> detail = columns.get(position);
+                        detailData = new JSONObject();
+                        for (TempletSet set : detail) {
+                            //取excel值
+                            value = data.get(set.getDescription());
+                            if ("true".equals(set.getNecessary()) && StringUtils.isEmpty(value)) {
+                                detailData = null;
+                                err.append("第" + (i + 3) + "行 " + set.getDescription() + " 必填字段未填写!<br/> ");
+                                break;
+                            }
+                            //检测日期类型是否规范
+                            if ("date".equals(set.getType()) && !StringUtils.isEmpty(value)) {
+                                value = praseDate(value);
+                                if (null == value) {
+                                    err.append("第" + (i + 3) + "行 " + set.getDescription() + " 日期格式不正确!<br/> ");
+                                    break;
+                                }
+                            }
+                            //如果为数字类型且为空默认赋值0,检测是否为数字类型
+                            if ("number".equals(set.getType())) {
+                                if (StringUtils.isEmpty(value)) {
+                                    value = "0";
+                                } else {
+                                    Boolean numner = isNumner(value);
+                                    if (!numner) {
+                                        err.append("第" + (i + 3) + "行 " + set.getDescription() + " 数字格式不正确!<br/> ");
+                                        break;
+                                    }
+                                }
+                            }
+                            //拼从表数据
+                            if (StringUtils.hasText(value) && !"0".equals(value)) {
+                                detailData.put(set.getField(), value);
+                            }
+                        }
+                        if (null != detailData && detailData.size() > 0) {
+                            dd.setDd_codevalue(codeValue);
+                            dd.setDd_detaildata(detailData.toJSONString());
+                        }
+                    }
+                }
+                //排除编号未填写但是其他字段填写的情况 主表不为空且从表也不为空
+                if (StringUtils.hasText(codeValue) && StringUtils.hasText(dd.getDd_codevalue())) {
+                    dataImportMapper.insertDetailSelective(dd);
+                }
+            }
+            //重复编号检测
+            List<String> samecode = getDuplicateElements(validateCode);
+            if (null != samecode && samecode.size() > 0) {
+                err.append("下列编号重复: " + printList(samecode) + " 请确认无误后再上传!");
+            }
+            //必填项检查
+            if (err.length() > 0) {
+                dataImportMapper.updateErr(err.toString(), keyvalue);
+                throw new BizException(123456789, err.toString());
+            }
+        }
+        return keyvalue;
+    }
+
+    private  <E> List<E> getDuplicateElements(List<E> list) {
+        return list.stream() // list 对应的 Stream
+                .collect(Collectors.toMap(e -> e, e -> 1, (a, b) -> a + b)) // 获得元素出现频率的 Map,键为元素,值为元素出现的次数
+                .entrySet().stream() // 所有 entry 对应的 Stream
+                .filter(entry -> entry.getValue() > 1) // 过滤出元素出现次数大于 1 的 entry
+                .map(entry -> entry.getKey()) // 获得 entry 的键(重复元素)对应的 Stream
+                .collect(Collectors.toList());  // 转化为 List
+    }
+
+    private String printList(List list) {
+        String result = null;
+        if (!StringUtils.isEmpty(list)) {
+            result = list.toString().substring(1, list.toString().length() - 1);
+        }
+        return result;
+    }
+
+
+    private Boolean isNumner(String str) {
+        for(int i=str.length() - 1; i>=0; i--){
+            int chr=str.charAt(i);
+            if(chr < 48 || chr >  57) {
+                if (chr == 46) {
+                    continue;
+                }
+                return false;
+            }
+
+        }
+        return true;
+    }
+
+
+    private boolean validateDateFormat(String date) {
+        boolean flag = false;
+        if (StringUtils.isEmpty(date)) {
+            return false;
+        }
+        String regEx1 = "[0-9]{4}/[0-1][0-9]/[0-3][0-9]";
+        String regEX2 = "[0-9]{4}-[0-1][0-9]-[0-3][0-9]";
+        // 编译正则表达式
+        Pattern pattern1 = Pattern.compile(regEx1);
+        Pattern pattern2 = Pattern.compile(regEX2);
+        Matcher matcher = pattern1.matcher(date);
+        // 字符串是否与正则表达式相匹配
+        flag = matcher.matches();
+        if (!flag) {
+            flag = pattern2.matcher(date).matches();
+        }
+        return flag;
+    }
+
+    private String praseDate(String num) {
+        try {
+            Integer days = Integer.valueOf(num);
+            return DateUtils.plusDay(days, "1899-12-30");
+        }catch (Exception e) {
+            return validateDateFormat(num) ? num : null;
+        }
+    }
+
+    //保证先遍历主表
+    private List<String> SetToList(Set<String> sets) {
+        List<String> list = new ArrayList<>();
+        list.add("main");
+        for (String str : sets) {
+            if (!"main".equals(str)) {
+                list.add(str);
+            }
+        }
+        return list;
+    }
+
+    public static Object getCellFormatValue(Cell cell){
+        Object cellValue = null;
+        if(cell != null){
+            //判断cell类型
+            switch(cell.getCellType()){
+                case Cell.CELL_TYPE_NUMERIC:{
+                    cellValue = String.valueOf(cell.getNumericCellValue());
+                    cellValue = RegexpUtils.replaceSpecialCharacterNotcodefield(cellValue);
+                    //判断是否为INT类型
+                    if (Double.valueOf(cellValue.toString()).intValue() - Double.valueOf(cellValue.toString()) == 0) {
+                        return cellValue.toString().substring(0, cellValue.toString().indexOf("."));
+                    }
+                    break;
+                }
+                case Cell.CELL_TYPE_FORMULA:{
+                    //判断cell是否为日期格式
+                    if(DateUtil.isCellDateFormatted(cell)){
+                        //转换为日期格式YYYY-mm-dd
+                        cellValue = cell.getDateCellValue();
+                        cellValue = RegexpUtils.replaceSpecialCharacterNotcodefield(cellValue);
+                    }else{
+                        //数字
+                        cellValue = String.valueOf(cell.getNumericCellValue());
+                        cellValue = RegexpUtils.replaceSpecialCharacterNotcodefield(cellValue);
+                    }
+                    break;
+                }
+                case Cell.CELL_TYPE_STRING:{
+                    cellValue = cell.getRichStringCellValue().getString();
+                    cellValue = RegexpUtils.replaceSpecialCharacterNotcodefield(cellValue);
+                    break;
+                }
+                default:
+                    cellValue = "";
+            }
+        }else{
+            cellValue = "";
+        }
+        return cellValue;
+    }
+
+
+    protected Cell getCell(Sheet sheet, int row, int col) {
+        Row sheetRow = sheet.getRow(row);
+        if (sheetRow == null) {
+            sheetRow = sheet.createRow(row);
+        }
+        Cell cell = sheetRow.getCell(col);
+        if (cell == null) {
+            cell = sheetRow.createCell(col);
+        }
+        return cell;
+    }
+
+    /**
+     * 生成excel工作表
+     *
+     * 数据
+     */
+    private void createWorkbook(SXSSFWorkbook workbook, int sheetIdx, JSONArray cols, JSONArray datas, String remark){
+        Sheet sheet = workbook.createSheet("sheet" + sheetIdx);
+        CellStyle style = getCellStyle(workbook, true);
+        CellStyle detailStyle = getCellStyle(workbook, false);
+        //sheet.autoSizeColumn(2);
+        // sheet.createFreezePane(0, 1);// 固定列
+        Cell cell = null;
+        int rIdx = 0;
+        int cIdx = 0;
+        short width = 0;
+        DataFormat format = workbook.createDataFormat();
+        Row row = null;
+        if (remark != null) {
+            row = sheet.createRow(rIdx);
+            row.setHeightInPoints((short) 50);
+            sheet.setColumnWidth(cIdx, 500);
+            cell = getCell(sheet, rIdx, cIdx);
+            cell.setCellValue(remark);
+            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cols.size() - 1));
+            rIdx++;
+        }
+        row = sheet.createRow(rIdx);
+        row.setHeightInPoints((short) 22);
+        List<String> keys = new ArrayList<String>();
+        if (!CollectionUtils.isEmpty(cols)) {
+            String value = "";
+            //列出主表的列
+            for (int i = 0; i < cols.size(); i++) {
+                JSONObject obj = (JSONObject) cols.get(i);
+                width = (short) (obj.get("width") == null ? 0 : (int)obj.get("width")*35.7);
+                width = width == 0 ? 4000 : width;
+                sheet.setColumnWidth(cIdx, width);
+                // sheet.createFreezePane(cols.size() + 1, 2);
+                cell = getCell(sheet, rIdx, cIdx);
+                value = obj.get("description") == null ? value : obj.get("description").toString();
+                if ("true".equals(obj.get("necessary"))) {
+                    value = "*" + value;
+                }
+                if ("date".equals(obj.get("type"))) {
+                    short df= workbook.createDataFormat().getFormat("yyyy-MM-dd");
+                    style.setDataFormat(df);
+                }
+                if ("main".equals(obj.get("position"))) {
+                    cell.setCellStyle(style);
+                } else {
+                    cell.setCellStyle(detailStyle);
+                }
+                cell.setCellValue(value);
+                keys.add(String.valueOf(obj.get("description")));
+                cIdx++;
+                value = "";
+            }
+            rIdx++;
+            if (!CollectionUtils.isEmpty(datas)) {
+                for(Object d :datas) {
+                    JSONObject data = (JSONObject)d;
+                    cIdx = 0;
+                    row = sheet.createRow(rIdx);
+                    row.setHeightInPoints((short) 20);
+                    for (String key : keys) {
+                        Cell c = getCell(sheet, rIdx, cIdx);
+                        if (data.get(key) != null) {
+                            String v = String.valueOf(data.get(key));
+                            if ("".equals(v) || "null".equals(v)) {
+                                c.setCellValue(0);
+                            } else if (!v.matches("^-?[0-9]+(.[0-9]+)?")) {
+                                c.setCellValue(v);
+                            } else {
+                                c.setCellValue(Double.parseDouble(v.replace(",", "")));
+                            }
+                        } else {
+                            c.setCellValue("");
+                        }
+                        cIdx++;
+                    }
+                    rIdx++;
+                }
+            }
+        }
+    }
+
+    private CellStyle getCellStyle(SXSSFWorkbook workbook, boolean main) {
+        CellStyle style = workbook.createCellStyle();
+        Font font = workbook.createFont();
+        font.setFontName("仿宋_GB2312");// 字体
+        font.setFontHeightInPoints((short) 12);// 字号
+        font.setBold(true);
+        font.setColor((short)64);// 颜色
+        style.setFont(font);
+        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setFillForegroundColor(main ? HSSFColor.LIGHT_YELLOW.index : HSSFColor.PALE_BLUE.index);
+        style.setBorderBottom(BorderStyle.MEDIUM);
+        style.setBorderLeft(BorderStyle.MEDIUM);
+        style.setBorderRight(BorderStyle.MEDIUM);
+        style.setBorderTop(BorderStyle.MEDIUM);
+        return style;
+    }
+
+}

+ 11 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/impl/MessageLogServiceImpl.java

@@ -0,0 +1,11 @@
+package com.usoftchina.smartschool.school.common.service.impl;
+
+import com.usoftchina.smartschool.school.common.service.MessageLogService;
+
+/**
+ * @author: guq
+ * @create: 2019-01-23 16:24
+ **/
+public class MessageLogServiceImpl implements MessageLogService{
+
+}

+ 1 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/exception/BizExceptionCode.java

@@ -8,7 +8,7 @@ import com.usoftchina.smartschool.exception.BaseExceptionCode;
  **/
 public enum BizExceptionCode implements BaseExceptionCode {
 
-
+    BIZ_IMPORT_ERROREXCEL(500002, "导入内容错误"),
     EMPTY_DATA(76100,"数据为空,请填写后再保存"),
     USELESS_DATA(50001, "无效数据");
 

+ 20 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/DataImportMapper.java

@@ -0,0 +1,20 @@
+package com.usoftchina.smartschool.school.mapper;
+
+import com.usoftchina.smartschool.school.po.DataImport;
+import com.usoftchina.smartschool.school.po.DataImportDetail;
+import org.apache.ibatis.annotations.Param;
+
+public interface DataImportMapper {
+    void deleteByCaller(@Param("caller") String caller, @Param("companyid") Long companyid);
+    int insertSelective(DataImport record);
+
+    void updateErr(@Param("err") String err, @Param("id") Integer id);
+
+    String selectByCaller(@Param("caller") String caller, @Param("companyId") Long companyId);
+
+    void deleteByIds(String ids);
+
+    void deleteDetailByIds(String ids);
+
+    void insertDetailSelective(DataImportDetail dd);
+}

+ 9 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/DataTempletMapper.java

@@ -0,0 +1,9 @@
+package com.usoftchina.smartschool.school.mapper;
+
+import com.usoftchina.smartschool.school.po.DataTemplet;
+import org.apache.ibatis.annotations.Param;
+
+public interface DataTempletMapper {
+
+    DataTemplet selectByCaller(@Param("caller") String caller, @Param("companyid") Long companyid);
+}

+ 100 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/DataImport.java

@@ -0,0 +1,100 @@
+package com.usoftchina.smartschool.school.po;
+
+import java.util.Date;
+
+/**
+ * @author: guq
+ * @create: 2019-01-23 16:47
+ **/
+public class DataImport {
+
+    private Integer di_id;
+
+    private String di_caller;
+
+    private Long school_id;
+
+    private Date di_date;
+
+    private Integer di_count;
+
+    private String di_result;
+
+    private Integer di_success;
+
+    private String di_man;
+
+    private Integer di_toformal;
+
+    public Integer getDi_id() {
+        return di_id;
+    }
+
+    public void setDi_id(Integer di_id) {
+        this.di_id = di_id;
+    }
+
+    public String getDi_caller() {
+        return di_caller;
+    }
+
+    public void setDi_caller(String di_caller) {
+        this.di_caller = di_caller == null ? null : di_caller.trim();
+    }
+
+    public Long getSchool_id() {
+        return school_id;
+    }
+
+    public void setSchool_id(Long school_id) {
+        this.school_id = school_id;
+    }
+
+    public Date getDi_date() {
+        return di_date;
+    }
+
+    public void setDi_date(Date di_date) {
+        this.di_date = di_date;
+    }
+
+    public Integer getDi_count() {
+        return di_count;
+    }
+
+    public void setDi_count(Integer di_count) {
+        this.di_count = di_count;
+    }
+
+    public String getDi_result() {
+        return di_result;
+    }
+
+    public void setDi_result(String di_result) {
+        this.di_result = di_result == null ? null : di_result.trim();
+    }
+
+    public Integer getDi_success() {
+        return di_success;
+    }
+
+    public void setDi_success(Integer di_success) {
+        this.di_success = di_success;
+    }
+
+    public String getDi_man() {
+        return di_man;
+    }
+
+    public void setDi_man(String di_man) {
+        this.di_man = di_man == null ? null : di_man.trim();
+    }
+
+    public Integer getDi_toformal() {
+        return di_toformal;
+    }
+
+    public void setDi_toformal(Integer di_toformal) {
+        this.di_toformal = di_toformal;
+    }
+}

+ 109 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/DataImportDetail.java

@@ -0,0 +1,109 @@
+package com.usoftchina.smartschool.school.po;
+
+/**
+ * @author: guq
+ * @create: 2019-01-23 18:11
+ **/
+public class DataImportDetail {
+
+    private Integer dd_id;
+
+    private String dd_maindata;
+
+    private Integer dd_detno;
+
+    private Integer dd_diid;
+
+    private Integer dd_checked;
+
+    private Integer dd_success;
+
+    private Integer dd_toformal;
+
+    private Long school_id;
+
+    private String dd_detaildata;
+
+    private String dd_codevalue;
+
+    public Integer getDd_id() {
+        return dd_id;
+    }
+
+    public void setDd_id(Integer dd_id) {
+        this.dd_id = dd_id;
+    }
+
+    public String getDd_maindata() {
+        return dd_maindata;
+    }
+
+    public void setDd_maindata(String dd_maindata) {
+        this.dd_maindata = dd_maindata == null ? null : dd_maindata.trim();
+    }
+
+    public Integer getDd_detno() {
+        return dd_detno;
+    }
+
+    public void setDd_detno(Integer dd_detno) {
+        this.dd_detno = dd_detno;
+    }
+
+    public Integer getDd_diid() {
+        return dd_diid;
+    }
+
+    public void setDd_diid(Integer dd_diid) {
+        this.dd_diid = dd_diid;
+    }
+
+    public Integer getDd_checked() {
+        return dd_checked;
+    }
+
+    public void setDd_checked(Integer dd_checked) {
+        this.dd_checked = dd_checked;
+    }
+
+    public Integer getDd_success() {
+        return dd_success;
+    }
+
+    public void setDd_success(Integer dd_success) {
+        this.dd_success = dd_success;
+    }
+
+    public Integer getDd_toformal() {
+        return dd_toformal;
+    }
+
+    public void setDd_toformal(Integer dd_toformal) {
+        this.dd_toformal = dd_toformal;
+    }
+
+
+    public String getDd_detaildata() {
+        return dd_detaildata;
+    }
+
+    public void setDd_detaildata(String dd_detaildata) {
+        this.dd_detaildata = dd_detaildata == null ? null : dd_detaildata.trim();
+    }
+
+    public String getDd_codevalue() {
+        return dd_codevalue;
+    }
+
+    public void setDd_codevalue(String dd_codevalue) {
+        this.dd_codevalue = dd_codevalue == null ? null : dd_codevalue.trim();
+    }
+
+    public Long getSchool_id() {
+        return school_id;
+    }
+
+    public void setSchool_id(Long school_id) {
+        this.school_id = school_id;
+    }
+}

+ 78 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/DataTemplet.java

@@ -0,0 +1,78 @@
+package com.usoftchina.smartschool.school.po;
+
+/**
+ * @author: guq
+ * @create: 2019-01-23 16:42
+ **/
+public class DataTemplet {
+    private Integer dt_id;
+
+    private String dt_caller;
+
+    private String dt_description;
+
+    public String getDt_columns() {
+        return dt_columns;
+    }
+
+    public void setDt_columns(String dt_columns) {
+        this.dt_columns = dt_columns;
+    }
+
+    private String dt_title;
+
+    private String dt_columns;
+
+    public Long getCompanyid() {
+        return companyid;
+    }
+
+    public void setCompanyid(Long companyid) {
+        this.companyid = companyid;
+    }
+
+    private String dt_exampledata;
+
+    private Long companyid;
+
+    public Integer getDt_id() {
+        return dt_id;
+    }
+
+    public void setDt_id(Integer dt_id) {
+        this.dt_id = dt_id;
+    }
+
+    public String getDt_caller() {
+        return dt_caller;
+    }
+
+    public void setDt_caller(String dt_caller) {
+        this.dt_caller = dt_caller == null ? null : dt_caller.trim();
+    }
+
+    public String getDt_description() {
+        return dt_description;
+    }
+
+    public void setDt_description(String dt_description) {
+        this.dt_description = dt_description == null ? null : dt_description.trim();
+    }
+
+    public String getDt_title() {
+        return dt_title;
+    }
+
+    public void setDt_title(String dt_title) {
+        this.dt_title = dt_title == null ? null : dt_title.trim();
+    }
+
+    public String getDt_exampledata() {
+        return dt_exampledata;
+    }
+
+    public void setDt_exampledata(String dt_exampledata) {
+        this.dt_exampledata = dt_exampledata == null ? null : dt_exampledata.trim();
+    }
+
+}

+ 22 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/SCHOOLTYPE.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.school.po;
+
+public enum SCHOOLTYPE {
+
+
+    SCHOOL("学校"),
+
+    GRADE("年纪"),
+
+    CLASS("班级")
+    ;
+
+
+    private String display;
+    private SCHOOLTYPE(String display){
+        this.display = display;
+    }
+
+    public String getDisplay(){
+        return display;
+    }
+}

+ 72 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/TempletSet.java

@@ -0,0 +1,72 @@
+package com.usoftchina.smartschool.school.po;
+
+/**
+ * @author: guq
+ * @create: 2019-01-23 17:57
+ **/
+public class TempletSet {
+    private String description;
+    private int width;
+    private String field;
+    private String necessary;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    private String position;
+    private boolean codefield;
+    private String type;
+
+    public boolean isCodefield() {
+        return codefield;
+    }
+
+    public void setCodefield(boolean codefield) {
+        this.codefield = codefield;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getNecessary() {
+        return necessary;
+    }
+
+    public void setNecessary(String necessary) {
+        this.necessary = necessary;
+    }
+
+    public String getPosition() {
+        return position;
+    }
+
+    public void setPosition(String position) {
+        this.position = position;
+    }
+}

+ 57 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/TreeNode.java

@@ -0,0 +1,57 @@
+package com.usoftchina.smartschool.school.po;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author: guq
+ * @create: 2019-01-24 19:31
+ **/
+public class TreeNode implements Serializable{
+
+    private Long id;
+    private String type;
+    private String text;
+    private boolean leaf;
+    private List<TreeNode> children;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public boolean isLeaf() {
+        return leaf;
+    }
+
+    public void setLeaf(boolean leaf) {
+        this.leaf = leaf;
+    }
+
+    public List<TreeNode> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<TreeNode> children) {
+        this.children = children;
+    }
+}

+ 151 - 0
applications/school/school-server/src/main/resources/mapper/DataImportMapper.xml

@@ -0,0 +1,151 @@
+<?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.usoftchina.smartschool.school.mapper.DataImportMapper" >
+<delete id="deleteByCaller">
+  delete from data_import where di_caller=#{caller} and school_id=#{school_id} and
+  il_toformal=0 and il_result is not null
+</delete>
+  <delete id="deleteByIds">
+    delete from data_import where di_id in (${value});
+  </delete>
+
+  <insert id="insertSelective" parameterType="com.usoftchina.smartschool.school.po.DataImport" >
+    <selectKey  resultType="java.lang.Integer" keyProperty="di_id">
+      SELECT LAST_INSERT_ID() AS ID
+    </selectKey>
+    insert into data_import
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="di_caller != null" >
+        di_caller,
+      </if>
+      <if test="school_id != null" >
+        school_id,
+      </if>
+      <if test="di_date != null" >
+        di_date,
+      </if>
+      <if test="di_count != null" >
+        di_count,
+      </if>
+      <if test="di_result != null" >
+        di_result,
+      </if>
+      <if test="di_success != null" >
+        di_success,
+      </if>
+      <if test="di_man != null" >
+        di_man,
+      </if>
+      <if test="di_toformal != null" >
+        di_toformal,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="di_caller != null" >
+        #{di_caller,jdbcType=VARCHAR},
+      </if>
+      <if test="school_id != null" >
+        #{school_id,jdbcType=INTEGER},
+      </if>
+      <if test="di_date != null" >
+        #{di_date,jdbcType=TIMESTAMP},
+      </if>
+      <if test="di_count != null" >
+        #{di_count,jdbcType=INTEGER},
+      </if>
+      <if test="di_result != null" >
+        #{di_result,jdbcType=VARCHAR},
+      </if>
+      <if test="di_success != null" >
+        #{di_success,jdbcType=INTEGER},
+      </if>
+      <if test="di_man != null" >
+        #{di_man,jdbcType=VARCHAR},
+      </if>
+      <if test="di_toformal != null" >
+        #{di_toformal,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+
+  <update id="updateErr" >
+    update data_import
+    set
+    di_result = #{err},
+    di_success = 0
+    where di_id = #{id}
+  </update>
+
+
+  <select id="selectByCaller" resultType="string">
+    select group_concat(di_id) from data_import where di_caller=#{caller} and di_toformal=0 and di_result is not null
+  </select>
+
+
+
+  <delete id="deleteDetailByIds">
+    delete from data_importdetail where dd_diid in (${value})
+  </delete>
+
+  <insert id="insertDetailSelective" parameterType="com.usoftchina.smartschool.school.po.DataImportDetail" >
+    insert into data_importdetail
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="dd_maindata != null" >
+        dd_maindata,
+      </if>
+      <if test="dd_detno != null" >
+        dd_detno,
+      </if>
+      <if test="dd_diid != null" >
+        dd_diid,
+      </if>
+      <if test="dd_checked != null" >
+        dd_checked,
+      </if>
+      <if test="dd_success != null" >
+        dd_success,
+      </if>
+      <if test="dd_toformal != null" >
+        dd_toformal,
+      </if>
+      <if test="school_id != null" >
+        school_id,
+      </if>
+      <if test="dd_detaildata != null" >
+        dd_detaildata,
+      </if>
+      <if test="dd_codevalue != null" >
+        dd_codevalue,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="dd_maindata != null" >
+        #{dd_maindata,jdbcType=VARCHAR},
+      </if>
+      <if test="dd_detno != null" >
+        #{dd_detno,jdbcType=INTEGER},
+      </if>
+      <if test="dd_diid != null" >
+        #{dd_diid,jdbcType=INTEGER},
+      </if>
+      <if test="dd_checked != null" >
+        #{dd_checked,jdbcType=INTEGER},
+      </if>
+      <if test="dd_success != null" >
+        #{dd_success,jdbcType=INTEGER},
+      </if>
+      <if test="dd_toformal != null" >
+        #{dd_toformal,jdbcType=INTEGER},
+      </if>
+      <if test="school_id != null" >
+        #{school_id,jdbcType=INTEGER},
+      </if>
+      <if test="dd_detaildata != null" >
+        #{dd_detaildata,jdbcType=VARCHAR},
+      </if>
+      <if test="dd_codevalue != null" >
+        #{dd_codevalue,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+</mapper>

+ 17 - 0
applications/school/school-server/src/main/resources/mapper/DataTempletMapper.xml

@@ -0,0 +1,17 @@
+<?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.usoftchina.smartschool.school.mapper.DataTempletMapper" >
+  <resultMap id="BaseResultMap" type="com.usoftchina.smartschool.school.po.DataTemplet" >
+    <id column="dt_id" property="dt_id" jdbcType="INTEGER" />
+    <result column="dt_caller" property="dt_caller" jdbcType="VARCHAR" />
+    <result column="dt_description" property="dt_description" jdbcType="VARCHAR" />
+    <result column="dt_title" property="dt_title" jdbcType="VARCHAR" />
+    <result column="dt_exampledata" property="dt_exampledata" jdbcType="VARCHAR" />
+    <result column="companyid" property="companyid" jdbcType="INTEGER" />
+    <result column="dt_columns" property="dt_columns" jdbcType="VARCHAR"/>
+  </resultMap>
+
+  <select id="selectByCaller" resultMap="BaseResultMap">
+    select * from data_Templet where dt_caller=#{caller}
+  </select>
+</mapper>

+ 71 - 1
applications/websocket/websocket-server/pom.xml

@@ -34,10 +34,31 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
-        <dependency>
+    <!--    <dependency>
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter</artifactId>
+        </dependency>-->
+
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis-spring</artifactId>
+            <version>1.3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis</artifactId>
+            <version>3.4.5</version>
+        </dependency>
+        <dependency>
+            <groupId>tk.mybatis</groupId>
+            <artifactId>mapper</artifactId>
+            <version>3.4.2</version>
         </dependency>
+      <!--  <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper</artifactId>
+            <version>4.2.1</version>
+        </dependency>-->
         <!-- sleuth -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
@@ -69,6 +90,52 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         </dependency>
+
+        <!--websocket-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+        <!--lang3-->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.6</version>
+        </dependency>
+
+        <!--集成swagger2 管理接口文档 -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+
+        <!--spring-boot-devtools -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <!--阿里 FastJson依赖 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.44</version>
+        </dependency>
+        <!--单元测试-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
     <build>
@@ -76,6 +143,9 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                </configuration>
             </plugin>
             <plugin>
                 <groupId>com.spotify</groupId>

+ 5 - 1
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/WebsocketApplication.java

@@ -1,10 +1,12 @@
 package com.usoftchina.smartschool.websocket;
 
+import com.usoftchina.smartschool.websocket.server.WebSocket;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.ComponentScan;
 
 /**
@@ -18,6 +20,8 @@ import org.springframework.context.annotation.ComponentScan;
 @ComponentScan(basePackages = {"com.usoftchina.smartschool"})
 public class WebsocketApplication {
     public static void main(String[] args) {
-        SpringApplication.run(WebsocketApplication.class, args);
+        SpringApplication sa = new SpringApplication(WebsocketApplication.class);
+        ConfigurableApplicationContext configurableApplicationContext =  sa.run(args);
+        WebSocket.setApplicationContext(configurableApplicationContext);
     }
 }

+ 28 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/FeignBeanFactoryPostProcessor.java

@@ -0,0 +1,28 @@
+package com.usoftchina.smartschool.websocket.configurer;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+
+/**
+ * Created by Arison on 2019/1/23.
+ */
+@Component
+public class FeignBeanFactoryPostProcessor  implements BeanFactoryPostProcessor {
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+        if (containsBeanDefinition(beanFactory, "feignContext", "eurekaAutoServiceRegistration")) {
+            BeanDefinition bd = beanFactory.getBeanDefinition("feignContext");
+            bd.setDependsOn("eurekaAutoServiceRegistration");
+        }
+    }
+
+    private boolean containsBeanDefinition(ConfigurableListableBeanFactory beanFactory, String... beans) {
+        return Arrays.stream(beans).allMatch(b -> beanFactory.containsBeanDefinition(b));
+    }
+}

+ 67 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/MybatisConfigurer.java

@@ -0,0 +1,67 @@
+package com.usoftchina.smartschool.websocket.configurer;
+
+import com.github.pagehelper.PageHelper;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import tk.mybatis.spring.mapper.MapperScannerConfigurer;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+import static com.usoftchina.smartschool.websocket.core.ProjectConstant.MAPPER_INTERFACE_REFERENCE;
+import static com.usoftchina.smartschool.websocket.core.ProjectConstant.MAPPER_PACKAGE;
+import static com.usoftchina.smartschool.websocket.core.ProjectConstant.MODEL_PACKAGE;
+
+
+/**
+ * Mybatis & Mapper & PageHelper 配置
+ */
+@Configuration
+public class MybatisConfigurer {
+
+    @Bean
+    public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
+        factory.setDataSource(dataSource);
+        factory.setTypeAliasesPackage(MODEL_PACKAGE);
+
+        //配置分页插件,详情请查阅官方文档
+//        PageHelper pageHelper = new PageHelper();
+//        Properties properties = new Properties();
+//        properties.setProperty("pageSizeZero", "true");//分页尺寸为0时查询所有纪录不再执行分页
+//        properties.setProperty("reasonable", "true");//页码<=0 查询第一页,页码>=总页数查询最后一页
+//        properties.setProperty("supportMethodsArguments", "true");//支持通过 Mapper 接口参数来传递分页参数
+//        pageHelper.setProperties(properties);
+//
+//        //添加插件
+//        factory.setPlugins(new Interceptor[]{pageHelper});
+
+        //添加XML目录
+        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+        factory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
+        return factory.getObject();
+    }
+
+    @Bean
+    public MapperScannerConfigurer mapperScannerConfigurer() {
+        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
+        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
+        mapperScannerConfigurer.setBasePackage(MAPPER_PACKAGE);
+
+        //配置通用Mapper,详情请查阅官方文档
+        Properties properties = new Properties();
+        properties.setProperty("mappers", MAPPER_INTERFACE_REFERENCE);
+        properties.setProperty("notEmpty", "false");//insert、update是否判断字符串类型!='' 即 test="str != null"表达式内是否追加 and str != ''
+        properties.setProperty("IDENTITY", "MYSQL");
+        mapperScannerConfigurer.setProperties(properties);
+
+        return mapperScannerConfigurer;
+    }
+
+}
+

+ 33 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/SwaggerConfig.java

@@ -0,0 +1,33 @@
+package com.usoftchina.smartschool.websocket.configurer;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+	@Bean
+    public Docket createRestApi(){
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.usoftchina.smartschool.websocket"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo(){
+        return new ApiInfoBuilder()
+        		.title("接口文档")     
+                .version("1.0")
+                .build();
+    }
+}

+ 16 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/WebSocketConfigurer.java

@@ -0,0 +1,16 @@
+package com.usoftchina.smartschool.websocket.configurer;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+
+
+@Configuration
+public class WebSocketConfigurer {
+	
+	  @Bean  
+      public ServerEndpointExporter serverEndpointExporter() {  
+          return new ServerEndpointExporter();  
+	  }  
+}

+ 32 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/controller/IndexController.java

@@ -0,0 +1,32 @@
+package com.usoftchina.smartschool.websocket.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.usoftchina.smartschool.websocket.dao.DeviceDOMapper;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * Created by Arison on 2019/1/23.
+ */
+@Api(value = "设备业务", description = "设备业务首页")
+@RestController
+public class IndexController {
+
+    @Resource
+    public DeviceDOMapper deviceDOMapper;
+
+    @RequestMapping("/index")
+    public String index() {
+        return "index";
+    }
+
+    @RequestMapping("/")
+    public String home() {
+
+        return JSON.toJSONString( deviceDOMapper.selectAll());
+    }
+
+}

+ 362 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/controller/WebSocketController.java

@@ -0,0 +1,362 @@
+package com.usoftchina.smartschool.websocket.controller;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import com.usoftchina.smartschool.websocket.core.Result;
+import com.usoftchina.smartschool.websocket.core.ResultGenerator;
+import com.usoftchina.smartschool.websocket.dao.DeviceDOMapper;
+import com.usoftchina.smartschool.websocket.dao.OutInRecordDOMapper;
+import com.usoftchina.smartschool.websocket.dao.StudentDOMapper;
+import com.usoftchina.smartschool.websocket.model.Command;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+import com.usoftchina.smartschool.websocket.model.StudentDO;
+import com.usoftchina.smartschool.websocket.server.WebSocket;
+import com.usoftchina.smartschool.websocket.utils.ImgUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example.Criteria;
+
+@RestController
+@Api(value = "设备业务接口", description = "设备业务接口")
+@RequestMapping("/websocket")
+public class WebSocketController {
+
+	@Autowired
+	private WebSocket webSocketServer;
+	@Resource
+	public DeviceDOMapper deviceDOMapper;
+	@Resource
+	public StudentDOMapper studentDOMapper;
+	@Resource
+	public OutInRecordDOMapper outInRecordDOMapper;
+
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "向设备发送指令", notes = "")
+	@RequestMapping(value = "/send", method = RequestMethod.GET)
+	public Result send(@RequestParam String message, @RequestParam String ip) {
+		try {
+			webSocketServer.sendMessage(message, ip);
+		} catch (Exception e) {
+			return ResultGenerator.genFailResult("发送异常:" + e.toString());
+		}
+
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "查看已连接设备列表", notes = "")
+	@GetMapping("/list")
+	public Result list() {
+		String[] data = webSocketServer
+				.getSessionIP(webSocketServer.getSessionPool());
+		return ResultGenerator.genSuccessResult(data);
+	}
+
+	@ApiOperation(value = "设备列表", notes = "查看所有设备列表数据")
+	@GetMapping("/deviceList")
+	public Result getDeviceList(){
+		List<DeviceDO> data= deviceDOMapper.selectAll();
+		return ResultGenerator.genSuccessResult(data);
+	}
+
+	@ApiOperation(value = "删除设备", notes = "根据设备IP删除设备")
+	@DeleteMapping("/deleteDevice")
+	public Result deleteDevice(@RequestParam String ip){
+		Condition condition = new Condition(DeviceDO.class);
+		Criteria c1 = condition.createCriteria();
+		c1.andCondition("deviceIp=", ip);
+		int i=deviceDOMapper.deleteByCondition(condition);
+		return ResultGenerator.genSuccessResult(i);
+	}
+
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "设置单个设备超时时间", notes = "")
+	@GetMapping("/wsSetTimeOut")
+	public Result setTimeOut(@RequestParam long time, @RequestParam String ip) {
+		try {
+			webSocketServer.setSessionTimeOut(time, ip);
+		} catch (Exception e) {
+			return ResultGenerator.genFailResult("发生异常:" + e.toString());
+		}
+		return ResultGenerator.genSuccessResult("设置成功!");
+	}
+
+	@ApiOperation(value = "设备设置授权码", notes = "设备只有设置好授权码才能正常使用")
+	@SuppressWarnings("static-access")
+	@RequestMapping(value = "/wsSendAuthCode", method = RequestMethod.GET)
+	public Result sendAuthCode(@RequestParam String ip) {
+		String authCode = "{\"cmd\":\"16\",\"data\":\"cDjkGSV8arRqR92ZJOCRQBWU3qShbug2pw9vPb3fgHzJbd7Ka2jFaHXJgeXs8KHhCUaN3AVzjLeF\\nVU79aes8DEVtPUaQJ/2j/gFzWzPeN9nN7OtW4QElN4EHB44jnrH+N4PAhwsEKEtw3XRn5phwUABU\\nmclAmzm83osxyEUCMVM=\"}";
+		webSocketServer.sendMessage(authCode, ip);
+		return ResultGenerator.genSuccessResult("设置成功!");
+	}
+
+	@ApiOperation(value = "设备启动", notes = "设备UDP启动广播")
+	@GetMapping("/setUdp")
+	public Result sendUdp(@RequestParam(required = false) String message) {
+		String host = "255.255.255.255";
+		int port = 10085;
+		if (StringUtils.isEmpty(message)) {
+			// 本服务的ws服务地址
+			message = "10.1.80.196:9620";
+		}
+		try {
+			InetAddress adds = InetAddress.getByName(host);
+			@SuppressWarnings("resource")
+			DatagramSocket ds = new DatagramSocket();
+			DatagramPacket dp = new DatagramPacket(message.getBytes(),
+					message.length(), adds, port);
+			ds.send(dp);
+			return ResultGenerator.genSuccessResult("发送成功!");
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		} catch (SocketException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+
+		}
+		return null;
+	}
+
+	/**
+	 * 断开ws连接
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "断开设备连接", notes = "断开websocket连接")
+	@GetMapping("/wsClose")
+	public Result closeDevice(@RequestParam String ip) {
+		webSocketServer.close(ip);
+		return ResultGenerator.genSuccessResult("关闭成功!");
+	}
+
+	/**
+	 * 
+	 * 上传白名单
+	 * 
+	 * @return
+	 */
+	@ApiOperation(value = "上传学生头像", notes = "上传和更新学生头像")
+	@SuppressWarnings("static-access")
+	@RequestMapping(value = "/wsUploadPerson", method = RequestMethod.POST)
+	public Result wsUploadPerson(@RequestParam String studId,
+			@RequestParam String ip, @RequestParam MultipartFile file) {
+		FileOutputStream fos;
+		FileInputStream fs;
+		System.out.println("文件名:" + file.getOriginalFilename());
+		String filePath = "C://Users//Arison//Desktop//upload//"
+				+ file.getOriginalFilename();
+		try {
+			fos = new FileOutputStream(new File(filePath));
+			fs = (FileInputStream) file.getInputStream();
+			byte[] buffer = new byte[1024];
+			int len = 0;
+			while ((len = fs.read(buffer)) != -1) {
+				fos.write(buffer, 0, len);
+			}
+			fos.close();
+			fs.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		StudentDO stuDao = new StudentDO();
+		stuDao.setStuId(Long.valueOf(studId));
+		stuDao = studentDOMapper.selectOne(stuDao);
+		stuDao.setStuPhoto(filePath);
+		Condition condition = new Condition(DeviceDO.class);
+		Criteria c1 = condition.createCriteria();
+		c1.andCondition("stu_id=", studId);
+		studentDOMapper.updateByCondition(stuDao, condition);
+
+		String stuPhoto = filePath;
+
+		DeviceDO dModel = new DeviceDO();
+		dModel.setDeviceip(ip);
+		DeviceDO fModel = deviceDOMapper.selectOne(dModel);
+
+		System.out.println("存入头像:" + stuPhoto);
+
+		String serialnum = fModel.getSerialnumber();// 设备的序列号
+		String base64 = ImgUtil.imgToBaseStr(stuPhoto);// 图片的Base64图片
+		Map<String, Object> map = new HashMap<>();
+		map.put("code", stuDao.getStuId()); // 工号
+		map.put("name", stuDao.getStuName()); // 姓名
+		map.put("identity", String.valueOf(stuDao.getStuId())); // 身份证号
+		map.put("cardNum", stuDao.getStuId()); // IC卡编号
+		map.put("type", "1"); // 类型(1白名单,2黑名单)
+		map.put("image", base64); // 头像图片(Base64)
+		map.put("photoname", stuDao.getStuName()); // 入库相片名称
+		map.put("sex", "1"); // 性别(男,女)
+		map.put("organization", String.valueOf(stuDao.getSchoolId())); // 所属组织
+		map.put("position", "学生"); // 职位名称
+		map.put("mail", "784602719@qq.com"); // 邮箱
+		map.put("hiredate", stuDao.getStuEnrollDate().toString()); // 入校日期
+		map.put("entrancenum", "01"); // 门禁编号
+		map.put("serialNo", serialnum); // 序列号
+		map.put("time", String.valueOf(new Date().getTime())); // 创建时间
+
+		if (fModel.getIsonline() == 1 && fModel.getIsauthorized() == 1) {
+			webSocketServer.sendMessage(new Command<>("3", map).toJsonStr(),
+					fModel.getDeviceip());
+			return ResultGenerator.genSuccessResult("发送成功!");
+		} else {
+			return ResultGenerator.genSuccessResult("没有上线");
+		}
+
+	}
+
+	/**
+	 * 删除设备注册人员
+	 * 
+	 * @param ip
+	 * @param stuId
+	 * @return
+	 */
+	@ApiOperation(value = "删除设备学生人脸照", notes = "删除设备注册是白名单和黑名单人员")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsDeletePerson")
+	public Result wsDeletePerson(@RequestParam String ip,
+			@RequestParam String stuId) {
+		webSocketServer.sendMessage(new Command<>("9", stuId).toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 刷新 设备的上传识别记录
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "获取设备识别记录", notes = "获取设备识别记录")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsGetPhotoHistory")
+	public Result wsGetPhotoHistory(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("11").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 查询设备是否是手动还是自动
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "查询设备开闸模式", notes = "在设备表中更新开闸状态")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsGetDeviceModel")
+	public Result wsGetDeviceModel(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("18").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 设置设备开闸模式
+	 * 
+	 * @param ip
+	 * @param auto
+	 * @return
+	 */
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "设置设备开闸模式", notes = "自动开闸yes  手动开闸no")
+	@GetMapping("/wsSetDeviceModel")
+	public Result wsSetDeviceModel(@RequestParam String ip,
+			@RequestParam String auto) {
+		Map<String, String> map = new HashMap<>();
+		DeviceDO dModel = new DeviceDO();
+		dModel.setDeviceip(ip);
+		DeviceDO fModel = deviceDOMapper.selectOne(dModel);
+		map.put("auto", auto); // 工号
+		map.put("serialNumber", String.valueOf(fModel.getSerialnumber())); // 设备唯一序列号
+		map.put("url", ""); // 办公检测接口
+		map.put("way", "0"); // 1 进,0 出
+		webSocketServer.sendMessage(new Command<>("17", map).toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 远程设备开门
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "远程设备开门", notes = "")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsDeviceOpen")
+	public Result wsDeviceOpen(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("12").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 远程设备关机
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "远程设备关机", notes = "")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsDeviceShutdown")
+	public Result wsDeviceShutdown(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("13").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 远程设备重启
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "远程设备重启", notes = "")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsDeviceRestart")
+	public Result wsDeviceRestart(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("14").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 手工添加设备
+	 * 
+	 * @return
+	 */
+	@ApiOperation(value = "添加设备", notes = "")
+	@PostMapping("/addDevice")
+	public Result addDevice(@RequestParam String devicename,
+			@RequestParam String serialnumber, @RequestParam String secretkey,
+			@RequestParam int schoolid) {
+		DeviceDO deviceDO = new DeviceDO();
+		deviceDO.setDevicename(devicename);
+		deviceDO.setSerialnumber(serialnumber);
+		deviceDO.setSecretkey(secretkey);
+		deviceDO.setIsonline(0);
+		deviceDO.setIsauthorized(0);
+		deviceDO.setIsautomatic(0);
+		deviceDO.setSchoolid(schoolid);
+		deviceDOMapper.insert(deviceDO);
+		return ResultGenerator.genSuccessResult("添加成功!");
+	}
+}

+ 76 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/AbstractService.java

@@ -0,0 +1,76 @@
+package com.usoftchina.smartschool.websocket.core;
+
+
+import org.apache.ibatis.exceptions.TooManyResultsException;
+import org.springframework.beans.factory.annotation.Autowired;
+import tk.mybatis.mapper.entity.Condition;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.util.List;
+
+/**
+ * 基于通用MyBatis Mapper插件的Service接口的实现
+ */
+public abstract class AbstractService<T> implements Service<T> {
+
+    @Autowired
+    protected Mapper<T> mapper;
+
+    private Class<T> modelClass;    // 当前泛型真实类型的Class
+
+    @SuppressWarnings("unchecked")
+	public AbstractService() {
+        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
+        modelClass = (Class<T>) pt.getActualTypeArguments()[0];
+    }
+
+    public void save(T model) {
+        mapper.insertSelective(model);
+    }
+
+    public void save(List<T> models) {
+        mapper.insertList(models);
+    }
+
+    public void deleteById(Integer id) {
+        mapper.deleteByPrimaryKey(id);
+    }
+
+    public void deleteByIds(String ids) {
+        mapper.deleteByIds(ids);
+    }
+
+    public void update(T model) {
+        mapper.updateByPrimaryKeySelective(model);
+    }
+
+    public T findById(Integer id) {
+        return mapper.selectByPrimaryKey(id);
+    }
+
+    @Override
+    public T findBy(String fieldName, Object value) throws TooManyResultsException {
+        try {
+            T model = modelClass.newInstance();
+            Field field = modelClass.getDeclaredField(fieldName);
+            field.setAccessible(true);
+            field.set(model, value);
+            return mapper.selectOne(model);
+        } catch (ReflectiveOperationException e) {
+            throw new ServiceException(e.getMessage(), e);
+        }
+    }
+
+    public List<T> findByIds(String ids) {
+        return mapper.selectByIds(ids);
+    }
+
+    public List<T> findByCondition(Condition condition) {
+        return mapper.selectByCondition(condition);
+    }
+
+    public List<T> findAll() {
+        return mapper.selectAll();
+    }
+}

+ 17 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Mapper.java

@@ -0,0 +1,17 @@
+package com.usoftchina.smartschool.websocket.core;
+
+import tk.mybatis.mapper.common.BaseMapper;
+import tk.mybatis.mapper.common.ConditionMapper;
+import tk.mybatis.mapper.common.IdsMapper;
+import tk.mybatis.mapper.common.special.InsertListMapper;
+
+/**
+ * 定制版MyBatis Mapper插件接口,如需其他接口参考官方文档自行添加。
+ */
+public interface Mapper<T>
+        extends
+        BaseMapper<T>,
+        ConditionMapper<T>,
+        IdsMapper<T>,
+        InsertListMapper<T> {
+}

+ 16 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ProjectConstant.java

@@ -0,0 +1,16 @@
+package com.usoftchina.smartschool.websocket.core;
+
+/**
+ * 项目常量
+ */
+public final class ProjectConstant {
+    public static final String BASE_PACKAGE = "com.usoftchina.smartschool.websocket";//项目基础包名称,根据自己公司的项目修改
+
+    public static final String MODEL_PACKAGE = BASE_PACKAGE + ".model";//Model所在包
+    public static final String MAPPER_PACKAGE = BASE_PACKAGE + ".dao";//Mapper所在包
+    public static final String SERVICE_PACKAGE = BASE_PACKAGE + ".service";//Service所在包
+    public static final String SERVICE_IMPL_PACKAGE = SERVICE_PACKAGE + ".impl";//ServiceImpl所在包
+    public static final String CONTROLLER_PACKAGE = BASE_PACKAGE + ".web";//Controller所在包
+
+    public static final String MAPPER_INTERFACE_REFERENCE = BASE_PACKAGE + ".core.Mapper";//Mapper插件基础接口的完全限定名
+}

+ 44 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Result.java

@@ -0,0 +1,44 @@
+package com.usoftchina.smartschool.websocket.core;
+
+import com.alibaba.fastjson.JSON;
+
+/**
+ * 统一API响应结果封装
+ */
+public class Result {
+    private int code;
+    private String message;
+    private Object data;
+
+    public Result setCode(ResultCode resultCode) {
+        this.code = resultCode.code();
+        return this;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public Result setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public Result setData(Object data) {
+        this.data = data;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return JSON.toJSONString(this);
+    }
+}

+ 22 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ResultCode.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.websocket.core;
+
+/**
+ * 响应码枚举,参考HTTP状态码的语义
+ */
+public enum ResultCode {
+    SUCCESS(200),//成功
+    FAIL(400),//失败
+    UNAUTHORIZED(401),//未认证(签名错误)
+    NOT_FOUND(404),//接口不存在
+    INTERNAL_SERVER_ERROR(500);//服务器内部错误
+
+    private final int code;
+
+    ResultCode(int code) {
+        this.code = code;
+    }
+
+    public int code() {
+        return code;
+    }
+}

+ 27 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ResultGenerator.java

@@ -0,0 +1,27 @@
+package com.usoftchina.smartschool.websocket.core;
+
+/**
+ * 响应结果生成工具
+ */
+public class ResultGenerator {
+    private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
+
+    public static Result genSuccessResult() {
+        return new Result()
+                .setCode(ResultCode.SUCCESS)
+                .setMessage(DEFAULT_SUCCESS_MESSAGE);
+    }
+
+    public static Result genSuccessResult(Object data) {
+        return new Result()
+                .setCode(ResultCode.SUCCESS)
+                .setMessage(DEFAULT_SUCCESS_MESSAGE)
+                .setData(data);
+    }
+
+    public static Result genFailResult(String message) {
+        return new Result()
+                .setCode(ResultCode.FAIL)
+                .setMessage(message);
+    }
+}

+ 22 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Service.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.websocket.core;
+
+import org.apache.ibatis.exceptions.TooManyResultsException;
+import tk.mybatis.mapper.entity.Condition;
+
+import java.util.List;
+
+/**
+ * Service 层 基础接口,其他Service 接口 请继承该接口
+ */
+public interface Service<T> {
+    void save(T model);//持久化
+    void save(List<T> models);//批量持久化
+    void deleteById(Integer id);//通过主鍵刪除
+    void deleteByIds(String ids);//批量刪除 eg:ids -> “1,2,3,4”
+    void update(T model);//更新
+    T findById(Integer id);//通过ID查找
+    T findBy(String fieldName, Object value) throws TooManyResultsException; //通过Model中某个成员变量名称(非数据表中column的名称)查找,value需符合unique约束
+    List<T> findByIds(String ids);//通过多个ID查找//eg:ids -> “1,2,3,4”
+    List<T> findByCondition(Condition condition);//根据条件查找
+    List<T> findAll();//获取所有
+}

+ 22 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ServiceException.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.websocket.core;
+
+/**
+ * 服务(业务)异常如“ 账号或密码错误 ”,该异常只做INFO级别的日志记录 @see WebMvcConfigurer
+ */
+public class ServiceException extends RuntimeException {
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public ServiceException() {
+    }
+
+    public ServiceException(String message) {
+        super(message);
+    }
+
+    public ServiceException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

+ 8 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/DeviceDOMapper.java

@@ -0,0 +1,8 @@
+package com.usoftchina.smartschool.websocket.dao;
+
+
+import com.usoftchina.smartschool.websocket.core.Mapper;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+
+public interface DeviceDOMapper extends Mapper<DeviceDO> {
+}

+ 8 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/OutInRecordDOMapper.java

@@ -0,0 +1,8 @@
+package com.usoftchina.smartschool.websocket.dao;
+
+
+import com.usoftchina.smartschool.websocket.core.Mapper;
+import com.usoftchina.smartschool.websocket.model.OutInRecordDO;
+
+public interface OutInRecordDOMapper extends Mapper<OutInRecordDO> {
+}

+ 8 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/StudentDOMapper.java

@@ -0,0 +1,8 @@
+package com.usoftchina.smartschool.websocket.dao;
+
+
+import com.usoftchina.smartschool.websocket.core.Mapper;
+import com.usoftchina.smartschool.websocket.model.StudentDO;
+
+public interface StudentDOMapper extends Mapper<StudentDO> {
+}

+ 56 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/Command.java

@@ -0,0 +1,56 @@
+package com.usoftchina.smartschool.websocket.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class Command<T> {
+    private String cmd;
+    private T data = null;//返回数据
+
+    public Command(String cmd) {
+        this.cmd = cmd;
+    }
+
+    public Command(String cmd, T data) {
+        this.cmd = cmd;
+        this.data = data;
+    }
+
+    /**
+     * List装换Clist
+     *
+     * @param cmd
+     * @param list
+     * @return
+     */
+    @SuppressWarnings({"rawtypes", "unchecked"})
+	public static List<Command> toCommandList(String cmd, List list) {
+        List<Command> commandList = new ArrayList<>();
+        for (int i = 0; i < list.size(); i++) {
+            commandList.add(new Command(cmd, list.get(i)));
+        }
+        return commandList;
+    }
+
+    public String getCmd() {
+        return cmd;
+    }
+
+    public void setCmd(String cmd) {
+        this.cmd = cmd;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public String toJsonStr() {
+        return JSONObject.toJSONString(this);
+    }
+}

+ 310 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/DeviceDO.java

@@ -0,0 +1,310 @@
+package com.usoftchina.smartschool.websocket.model;
+
+import javax.persistence.*;
+
+@Table(name = "device")
+public class DeviceDO {
+    /**
+     * 设备ID,自增长
+     */
+    @Id
+    @Column(name = "deviceId")
+    private Integer deviceid;
+
+    /**
+     * 设备名称
+     */
+    @Column(name = "deviceName")
+    private String devicename;
+
+    /**
+     * 设备型号
+     */
+    @Column(name = "deviceModel")
+    private String devicemodel;
+
+    /**
+     * 设备序列号
+     */
+    @Column(name = "serialNumber")
+    private String serialnumber;
+
+    /**
+     * 设备IP
+     */
+    @Column(name = "deviceIp")
+    private String deviceip;
+
+    /**
+     * 设备版本号
+     */
+    private String version;
+
+    /**
+     * 设备Mac地址
+     */
+    @Column(name = "deviceMac")
+    private String devicemac;
+
+    /**
+     * 设备制造商
+     */
+    @Column(name = "deviceMaker")
+    private String devicemaker;
+
+    /**
+     * 设备秘钥
+     */
+    private String secretkey;
+
+    /**
+     * 是否授权   0 未授权,1 授权
+     */
+    @Column(name = "isAuthorized")
+    private Integer isauthorized;
+
+    /**
+     * 是否在线  0不在线  1在线
+     */
+    @Column(name = "isOnline")
+    private Integer isonline;
+
+    /**
+     * 是否自动开闸模式  0 手动  1 自动
+     */
+    @Column(name = "isAutomatic")
+    private Integer isautomatic;
+
+    @Column(name = "schoolId")
+    private Integer schoolid;
+
+    /**
+     * 获取设备ID,自增长
+     *
+     * @return deviceId - 设备ID,自增长
+     */
+    public Integer getDeviceid() {
+        return deviceid;
+    }
+
+    /**
+     * 设置设备ID,自增长
+     *
+     * @param deviceid 设备ID,自增长
+     */
+    public void setDeviceid(Integer deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    /**
+     * 获取设备名称
+     *
+     * @return deviceName - 设备名称
+     */
+    public String getDevicename() {
+        return devicename;
+    }
+
+    /**
+     * 设置设备名称
+     *
+     * @param devicename 设备名称
+     */
+    public void setDevicename(String devicename) {
+        this.devicename = devicename;
+    }
+
+    /**
+     * 获取设备型号
+     *
+     * @return deviceModel - 设备型号
+     */
+    public String getDevicemodel() {
+        return devicemodel;
+    }
+
+    /**
+     * 设置设备型号
+     *
+     * @param devicemodel 设备型号
+     */
+    public void setDevicemodel(String devicemodel) {
+        this.devicemodel = devicemodel;
+    }
+
+    /**
+     * 获取设备序列号
+     *
+     * @return serialNumber - 设备序列号
+     */
+    public String getSerialnumber() {
+        return serialnumber;
+    }
+
+    /**
+     * 设置设备序列号
+     *
+     * @param serialnumber 设备序列号
+     */
+    public void setSerialnumber(String serialnumber) {
+        this.serialnumber = serialnumber;
+    }
+
+    /**
+     * 获取设备IP
+     *
+     * @return deviceIp - 设备IP
+     */
+    public String getDeviceip() {
+        return deviceip;
+    }
+
+    /**
+     * 设置设备IP
+     *
+     * @param deviceip 设备IP
+     */
+    public void setDeviceip(String deviceip) {
+        this.deviceip = deviceip;
+    }
+
+    /**
+     * 获取设备版本号
+     *
+     * @return version - 设备版本号
+     */
+    public String getVersion() {
+        return version;
+    }
+
+    /**
+     * 设置设备版本号
+     *
+     * @param version 设备版本号
+     */
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    /**
+     * 获取设备Mac地址
+     *
+     * @return deviceMac - 设备Mac地址
+     */
+    public String getDevicemac() {
+        return devicemac;
+    }
+
+    /**
+     * 设置设备Mac地址
+     *
+     * @param devicemac 设备Mac地址
+     */
+    public void setDevicemac(String devicemac) {
+        this.devicemac = devicemac;
+    }
+
+    /**
+     * 获取设备制造商
+     *
+     * @return deviceMaker - 设备制造商
+     */
+    public String getDevicemaker() {
+        return devicemaker;
+    }
+
+    /**
+     * 设置设备制造商
+     *
+     * @param devicemaker 设备制造商
+     */
+    public void setDevicemaker(String devicemaker) {
+        this.devicemaker = devicemaker;
+    }
+
+    /**
+     * 获取设备秘钥
+     *
+     * @return secretkey - 设备秘钥
+     */
+    public String getSecretkey() {
+        return secretkey;
+    }
+
+    /**
+     * 设置设备秘钥
+     *
+     * @param secretkey 设备秘钥
+     */
+    public void setSecretkey(String secretkey) {
+        this.secretkey = secretkey;
+    }
+
+    /**
+     * 获取是否授权   0 未授权,1 授权
+     *
+     * @return isAuthorized - 是否授权   0 未授权,1 授权
+     */
+    public Integer getIsauthorized() {
+        return isauthorized;
+    }
+
+    /**
+     * 设置是否授权   0 未授权,1 授权
+     *
+     * @param isauthorized 是否授权   0 未授权,1 授权
+     */
+    public void setIsauthorized(Integer isauthorized) {
+        this.isauthorized = isauthorized;
+    }
+
+    /**
+     * 获取是否在线  0不在线  1在线
+     *
+     * @return isOnline - 是否在线  0不在线  1在线
+     */
+    public Integer getIsonline() {
+        return isonline;
+    }
+
+    /**
+     * 设置是否在线  0不在线  1在线
+     *
+     * @param isonline 是否在线  0不在线  1在线
+     */
+    public void setIsonline(Integer isonline) {
+        this.isonline = isonline;
+    }
+
+    /**
+     * 获取是否自动开闸模式  0 手动  1 自动
+     *
+     * @return isAutomatic - 是否自动开闸模式  0 手动  1 自动
+     */
+    public Integer getIsautomatic() {
+        return isautomatic;
+    }
+
+    /**
+     * 设置是否自动开闸模式  0 手动  1 自动
+     *
+     * @param isautomatic 是否自动开闸模式  0 手动  1 自动
+     */
+    public void setIsautomatic(Integer isautomatic) {
+        this.isautomatic = isautomatic;
+    }
+
+    /**
+     * @return schoolId
+     */
+    public Integer getSchoolid() {
+        return schoolid;
+    }
+
+    /**
+     * @param schoolid
+     */
+    public void setSchoolid(Integer schoolid) {
+        this.schoolid = schoolid;
+    }
+}

+ 200 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/OutInRecordDO.java

@@ -0,0 +1,200 @@
+package com.usoftchina.smartschool.websocket.model;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "out_in_record")
+public class OutInRecordDO {
+    /**
+     * 编号
+     */
+    @Id
+    @Column(name = "record_id")
+    private Long recordId;
+
+    /**
+     * 记录名
+     */
+    @Column(name = "record_name")
+    private String recordName;
+
+    /**
+     * 出校时间
+     */
+    @Column(name = "out_date")
+    private Date outDate;
+
+    /**
+     * 入校时间
+     */
+    @Column(name = "in_date")
+    private Date inDate;
+
+    /**
+     * 详情
+     */
+    @Column(name = "record_details")
+    private String recordDetails;
+
+    /**
+     * 备注
+     */
+    @Column(name = "record_remarks")
+    private String recordRemarks;
+
+    /**
+     * 学生
+     */
+    @Column(name = "stu_id")
+    private Long stuId;
+
+    /**
+     * 学校
+     */
+    @Column(name = "school_id")
+    private Long schoolId;
+
+    /**
+     * 获取编号
+     *
+     * @return record_id - 编号
+     */
+    public Long getRecordId() {
+        return recordId;
+    }
+
+    /**
+     * 设置编号
+     *
+     * @param recordId 编号
+     */
+    public void setRecordId(Long recordId) {
+        this.recordId = recordId;
+    }
+
+    /**
+     * 获取记录名
+     *
+     * @return record_name - 记录名
+     */
+    public String getRecordName() {
+        return recordName;
+    }
+
+    /**
+     * 设置记录名
+     *
+     * @param recordName 记录名
+     */
+    public void setRecordName(String recordName) {
+        this.recordName = recordName;
+    }
+
+    /**
+     * 获取出校时间
+     *
+     * @return out_date - 出校时间
+     */
+    public Date getOutDate() {
+        return outDate;
+    }
+
+    /**
+     * 设置出校时间
+     *
+     * @param outDate 出校时间
+     */
+    public void setOutDate(Date outDate) {
+        this.outDate = outDate;
+    }
+
+    /**
+     * 获取入校时间
+     *
+     * @return in_date - 入校时间
+     */
+    public Date getInDate() {
+        return inDate;
+    }
+
+    /**
+     * 设置入校时间
+     *
+     * @param inDate 入校时间
+     */
+    public void setInDate(Date inDate) {
+        this.inDate = inDate;
+    }
+
+    /**
+     * 获取详情
+     *
+     * @return record_details - 详情
+     */
+    public String getRecordDetails() {
+        return recordDetails;
+    }
+
+    /**
+     * 设置详情
+     *
+     * @param recordDetails 详情
+     */
+    public void setRecordDetails(String recordDetails) {
+        this.recordDetails = recordDetails;
+    }
+
+    /**
+     * 获取备注
+     *
+     * @return record_remarks - 备注
+     */
+    public String getRecordRemarks() {
+        return recordRemarks;
+    }
+
+    /**
+     * 设置备注
+     *
+     * @param recordRemarks 备注
+     */
+    public void setRecordRemarks(String recordRemarks) {
+        this.recordRemarks = recordRemarks;
+    }
+
+    /**
+     * 获取学生
+     *
+     * @return stu_id - 学生
+     */
+    public Long getStuId() {
+        return stuId;
+    }
+
+    /**
+     * 设置学生
+     *
+     * @param stuId 学生
+     */
+    public void setStuId(Long stuId) {
+        this.stuId = stuId;
+    }
+
+    /**
+     * 获取学校
+     *
+     * @return school_id - 学校
+     */
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    /**
+     * 设置学校
+     *
+     * @param schoolId 学校
+     */
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+}

+ 344 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/StudentDO.java

@@ -0,0 +1,344 @@
+package com.usoftchina.smartschool.websocket.model;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "sys_student")
+public class StudentDO {
+    /**
+     * 编号
+     */
+    @Id
+    @Column(name = "stu_id")
+    private Long stuId;
+
+    /**
+     * 学号
+     */
+    @Column(name = "stu_number")
+    private String stuNumber;
+
+    /**
+     * 名字
+     */
+    @Column(name = "stu_name")
+    private String stuName;
+
+    /**
+     * 入学日期
+     */
+    @Column(name = "stu_enroll_date")
+    private Date stuEnrollDate;
+
+    /**
+     * 毕业时间
+     */
+    @Column(name = "stu_graduate_date")
+    private Date stuGraduateDate;
+
+    /**
+     * 生日
+     */
+    @Column(name = "stu_birthday")
+    private Date stuBirthday;
+
+    /**
+     * 年龄
+     */
+    @Column(name = "stu_age")
+    private Integer stuAge;
+
+    /**
+     * 性别   1男  2女
+     */
+    @Column(name = "stu_sex")
+    private Integer stuSex;
+
+    /**
+     * 地址
+     */
+    @Column(name = "stu_address")
+    private String stuAddress;
+
+    /**
+     * 头像
+     */
+    @Column(name = "stu_photo")
+    private String stuPhoto;
+
+    /**
+     * 状态   1正常   2冻结
+     */
+    @Column(name = "stu_status")
+    private Integer stuStatus;
+
+    /**
+     * 备注
+     */
+    @Column(name = "stu_remarks")
+    private String stuRemarks;
+
+    /**
+     * 班级
+     */
+    @Column(name = "clazz_id")
+    private Long clazzId;
+
+    /**
+     * 学校
+     */
+    @Column(name = "school_id")
+    private Long schoolId;
+
+    /**
+     * 获取编号
+     *
+     * @return stu_id - 编号
+     */
+    public Long getStuId() {
+        return stuId;
+    }
+
+    /**
+     * 设置编号
+     *
+     * @param stuId 编号
+     */
+    public void setStuId(Long stuId) {
+        this.stuId = stuId;
+    }
+
+    /**
+     * 获取学号
+     *
+     * @return stu_number - 学号
+     */
+    public String getStuNumber() {
+        return stuNumber;
+    }
+
+    /**
+     * 设置学号
+     *
+     * @param stuNumber 学号
+     */
+    public void setStuNumber(String stuNumber) {
+        this.stuNumber = stuNumber;
+    }
+
+    /**
+     * 获取名字
+     *
+     * @return stu_name - 名字
+     */
+    public String getStuName() {
+        return stuName;
+    }
+
+    /**
+     * 设置名字
+     *
+     * @param stuName 名字
+     */
+    public void setStuName(String stuName) {
+        this.stuName = stuName;
+    }
+
+    /**
+     * 获取入学日期
+     *
+     * @return stu_enroll_date - 入学日期
+     */
+    public Date getStuEnrollDate() {
+        return stuEnrollDate;
+    }
+
+    /**
+     * 设置入学日期
+     *
+     * @param stuEnrollDate 入学日期
+     */
+    public void setStuEnrollDate(Date stuEnrollDate) {
+        this.stuEnrollDate = stuEnrollDate;
+    }
+
+    /**
+     * 获取毕业时间
+     *
+     * @return stu_graduate_date - 毕业时间
+     */
+    public Date getStuGraduateDate() {
+        return stuGraduateDate;
+    }
+
+    /**
+     * 设置毕业时间
+     *
+     * @param stuGraduateDate 毕业时间
+     */
+    public void setStuGraduateDate(Date stuGraduateDate) {
+        this.stuGraduateDate = stuGraduateDate;
+    }
+
+    /**
+     * 获取生日
+     *
+     * @return stu_birthday - 生日
+     */
+    public Date getStuBirthday() {
+        return stuBirthday;
+    }
+
+    /**
+     * 设置生日
+     *
+     * @param stuBirthday 生日
+     */
+    public void setStuBirthday(Date stuBirthday) {
+        this.stuBirthday = stuBirthday;
+    }
+
+    /**
+     * 获取年龄
+     *
+     * @return stu_age - 年龄
+     */
+    public Integer getStuAge() {
+        return stuAge;
+    }
+
+    /**
+     * 设置年龄
+     *
+     * @param stuAge 年龄
+     */
+    public void setStuAge(Integer stuAge) {
+        this.stuAge = stuAge;
+    }
+
+    /**
+     * 获取性别   1男  2女
+     *
+     * @return stu_sex - 性别   1男  2女
+     */
+    public Integer getStuSex() {
+        return stuSex;
+    }
+
+    /**
+     * 设置性别   1男  2女
+     *
+     * @param stuSex 性别   1男  2女
+     */
+    public void setStuSex(Integer stuSex) {
+        this.stuSex = stuSex;
+    }
+
+    /**
+     * 获取地址
+     *
+     * @return stu_address - 地址
+     */
+    public String getStuAddress() {
+        return stuAddress;
+    }
+
+    /**
+     * 设置地址
+     *
+     * @param stuAddress 地址
+     */
+    public void setStuAddress(String stuAddress) {
+        this.stuAddress = stuAddress;
+    }
+
+    /**
+     * 获取头像
+     *
+     * @return stu_photo - 头像
+     */
+    public String getStuPhoto() {
+        return stuPhoto;
+    }
+
+    /**
+     * 设置头像
+     *
+     * @param stuPhoto 头像
+     */
+    public void setStuPhoto(String stuPhoto) {
+        this.stuPhoto = stuPhoto;
+    }
+
+    /**
+     * 获取状态   1正常   2冻结
+     *
+     * @return stu_status - 状态   1正常   2冻结
+     */
+    public Integer getStuStatus() {
+        return stuStatus;
+    }
+
+    /**
+     * 设置状态   1正常   2冻结
+     *
+     * @param stuStatus 状态   1正常   2冻结
+     */
+    public void setStuStatus(Integer stuStatus) {
+        this.stuStatus = stuStatus;
+    }
+
+    /**
+     * 获取备注
+     *
+     * @return stu_remarks - 备注
+     */
+    public String getStuRemarks() {
+        return stuRemarks;
+    }
+
+    /**
+     * 设置备注
+     *
+     * @param stuRemarks 备注
+     */
+    public void setStuRemarks(String stuRemarks) {
+        this.stuRemarks = stuRemarks;
+    }
+
+    /**
+     * 获取班级
+     *
+     * @return clazz_id - 班级
+     */
+    public Long getClazzId() {
+        return clazzId;
+    }
+
+    /**
+     * 设置班级
+     *
+     * @param clazzId 班级
+     */
+    public void setClazzId(Long clazzId) {
+        this.clazzId = clazzId;
+    }
+
+    /**
+     * 获取学校
+     *
+     * @return school_id - 学校
+     */
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    /**
+     * 设置学校
+     *
+     * @param schoolId 学校
+     */
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+}

+ 233 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/server/WebSocket.java

@@ -0,0 +1,233 @@
+package com.usoftchina.smartschool.websocket.server;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.annotation.Resource;
+import javax.websocket.EncodeException;
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import com.usoftchina.smartschool.websocket.dao.DeviceDOMapper;
+import com.usoftchina.smartschool.websocket.dao.OutInRecordDOMapper;
+import com.usoftchina.smartschool.websocket.model.Command;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+import com.usoftchina.smartschool.websocket.model.OutInRecordDO;
+import com.usoftchina.smartschool.websocket.service.impl.DeviceDOServiceImpl;
+import com.usoftchina.smartschool.websocket.utils.ImgUtil;
+import com.usoftchina.smartschool.websocket.utils.WebSocketUtil;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.socket.server.standard.SpringConfigurator;
+
+import com.alibaba.fastjson.JSON;
+
+
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example.Criteria;
+
+@SuppressWarnings("unused")
+@ServerEndpoint(value = "/websocket" )
+//,configurator = SpringConfigurator.class
+@Component
+public class WebSocket {
+     
+	
+	//此处是解决无法注入的关键
+	private static ApplicationContext applicationContext;
+	@Autowired
+	public DeviceDOMapper deviceDOMapper;
+	@Autowired
+	public OutInRecordDOMapper outInRecordDOMapper;
+	@Autowired
+	public DeviceDOServiceImpl deviceDOService;
+	private static Map<String, Session> sessionPool = new HashMap<String, Session>();
+	private Session session;
+   
+	public WebSocket() {
+		super();
+	}
+
+	@OnOpen
+	public void onOpen(Session session) {
+		session.setMaxTextMessageBufferSize(10 * 1024 * 1024);
+		session.setMaxBinaryMessageBufferSize(10 * 1024 * 1024);
+		this.session = session;
+		deviceDOMapper= applicationContext.getBean(DeviceDOMapper.class);
+		deviceDOService=applicationContext.getBean(DeviceDOServiceImpl.class);
+		outInRecordDOMapper=applicationContext.getBean(OutInRecordDOMapper.class);
+		System.out.println("设备上线:" + WebSocketUtil.getRemoteAddressStr(session));	
+		sessionPool.put(WebSocketUtil.getRemoteIPAddress(session), session);
+	}
+
+	@OnClose
+	public void onClose() {
+	 System.out.println("设备下线:" + WebSocketUtil.getRemoteAddressStr(session));
+	 sessionPool.remove(WebSocketUtil.getRemoteIPAddress(session));
+	 
+	 DeviceDO dModel=	new DeviceDO();
+   	 dModel.setDeviceip(WebSocketUtil.getRemoteIPAddress(session));
+   	 DeviceDO fModel= deviceDOMapper.selectOne(dModel);
+   	 Condition condition = new Condition(DeviceDO.class);
+     Criteria c1 = condition.createCriteria();
+   	 if(fModel!=null){
+   	     c1.andCondition("serialNumber=",fModel.getSerialnumber());
+   		 fModel.setIsonline(0);//下线
+   		 fModel.setIsauthorized(0);
+   		 deviceDOMapper.updateByCondition(fModel, condition);
+   	 }
+   	 
+	}
+
+	@OnMessage
+	public void onMessage(String message, Session session) {
+		
+		String cmd=JSON.parseObject(message).getString("cmd");
+		switch (cmd) {
+			case "0" ://设备注册
+				System.out.println("来自设备 " + WebSocketUtil.getRemoteAddressStr(session)+ "的消息:\n" + message);
+				 sendMessage(new Command<>("6").toJsonStr(), WebSocketUtil.getRemoteIPAddress(session));
+				
+				 DeviceDO dModel=new DeviceDO();
+			   	 dModel.setSerialnumber(JSON.parseObject(message).getJSONObject("data").getString("serialNumber"));
+			   	 DeviceDO fModel= deviceDOMapper.selectOne(dModel);
+			   	 Condition condition = new Condition(DeviceDO.class);
+			     Criteria c1 = condition.createCriteria();
+			   	 if(fModel!=null){
+			   	     c1.andCondition("serialNumber=",fModel.getSerialnumber());
+			   	     fModel.setDeviceip(WebSocketUtil.getRemoteIPAddress(session));
+			   	     fModel.setDevicemac(JSON.parseObject(message).getJSONObject("data").getString("DeviceMac"));
+			   	     fModel.setDevicemaker(JSON.parseObject(message).getJSONObject("data").getString("DeviceMaker"));
+			   	     fModel.setVersion(JSON.parseObject(message).getJSONObject("data").getString("Version"));
+			   	     fModel.setDevicemodel(JSON.parseObject(message).getJSONObject("data").getString("DeviceModel"));
+			   		 fModel.setIsonline(1);
+			   		 fModel.setIsauthorized(1);
+			   		 deviceDOMapper.updateByCondition(fModel, condition);
+			   	 }
+				break;
+			case "1"://白名单列表
+				String identity=JSON.parseObject(message).getJSONObject("data").getString("identity");
+				String name=JSON.parseObject(message).getJSONObject("data").getString("name");
+				System.out.println("identity:"+identity+"  name:"+name);
+				break;
+			case "19"://进出入校通知
+				System.out.println("来自设备 " + WebSocketUtil.getRemoteAddressStr(session)+ "的消息:\n" + message);
+				 identity=JSON.parseObject(message).getJSONObject("data").getString("identity");
+				 name=JSON.parseObject(message).getJSONObject("data").getString("name");
+				 String photo=JSON.parseObject(message).getJSONObject("data").getString("photo");
+				 String time=JSON.parseObject(message).getJSONObject("data").getString("time");
+				 String serialNumber=JSON.parseObject(message).getJSONObject("data").getString("serialNumber");
+		    	 OutInRecordDO outModel=new OutInRecordDO();
+		    	 //DateUtils.parseDate("2019-08-12 08:00:12", "yyyy-MM-dd HH:mm:ss")
+				 outModel.setInDate(new Date(Long.valueOf(time)));
+				 ImgUtil.baseStrToImg(photo, "C://Users//Arison//Desktop//upload//liuie.jpg");
+		    	 outModel.setRecordDetails("C://Users//Arison//Desktop//upload//liuie.jpg");
+		    	 outModel.setRecordName("进校记录");
+		    	 outModel.setStuId(Long.valueOf(identity));
+		    	 outInRecordDOMapper.insert(outModel);
+				break;
+			case "11"://设备所有的识别记录
+				
+				
+				break;
+			case "100":
+                //{"cmd":"100","data":{"op":"3","serialNumber":"3100-1d17-72be-ed51-cac9","status":"ok"}}
+				String op=JSON.parseObject(message).getJSONObject("data").getString("op");
+			    String status=JSON.parseObject(message).getJSONObject("data").getString("status");
+			    switch (op) {
+					case "3" ://上传白名单设备响应
+						if ("ok".equals(status)) {
+							//更新学生表状态
+							
+							
+						}
+						break;
+
+					default :
+						break;
+				}
+				break;
+			default :
+				System.out.println("来自设备 " + WebSocketUtil.getRemoteAddressStr(session)+ "的消息:\n" + message);
+				break;
+		}
+	}
+
+	@OnError
+	public void onError(Session session, Throwable error) {
+		System.out.println("发生错误:" + WebSocketUtil.getRemoteAddressStr(session));
+	    error.printStackTrace();
+	}
+
+	public static synchronized int getOnlineCount() {
+		return sessionPool.size();
+	}
+
+	public synchronized static void sendMessage(String message, String ip) {
+		Session s = sessionPool.get(ip);
+		synchronized (s) {
+			if (s != null) {
+				try {
+					System.out.println("服务器向" + ip + "发送消息:" + message);
+//					s.getBasicRemote()
+//							.sendBinary(ByteBuffer.wrap(message.getBytes()));
+					s.getBasicRemote().sendText(message);
+
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+	}
+	
+	public synchronized static  void close( String ip){
+		Session s = sessionPool.get(ip);
+		try {
+			s.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public synchronized static void setSessionTimeOut(long time, String ip) {
+		Session s = sessionPool.get(ip);
+		s.setMaxIdleTimeout(time);
+	}
+
+	public static String[] getSessionIP(Map<String, Session> map) {
+		StringBuilder str = new StringBuilder();
+		for (Entry<String, Session> entry : map.entrySet()) {
+			str.append(entry.getKey() + ",");
+		}
+
+		if (StringUtils.isEmpty(str.toString())) {
+			return new String[]{};
+		}
+		return str.toString().split(",");
+	}
+
+	public static Map<String, Session> getSessionPool() {
+		return sessionPool;
+	}
+
+	public static void setApplicationContext(
+			ApplicationContext applicationContext) {
+		WebSocket.applicationContext = applicationContext;
+	}
+
+	
+}

+ 12 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/DeviceDOService.java

@@ -0,0 +1,12 @@
+package com.usoftchina.smartschool.websocket.service;
+
+
+import com.usoftchina.smartschool.websocket.core.Service;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+public interface DeviceDOService extends Service<DeviceDO> {
+
+}

+ 12 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/OutInRecordDOService.java

@@ -0,0 +1,12 @@
+package com.usoftchina.smartschool.websocket.service;
+
+
+import com.usoftchina.smartschool.websocket.core.Service;
+import com.usoftchina.smartschool.websocket.model.OutInRecordDO;
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+public interface OutInRecordDOService extends Service<OutInRecordDO> {
+
+}

+ 12 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/StudentDOService.java

@@ -0,0 +1,12 @@
+package com.usoftchina.smartschool.websocket.service;
+
+
+import com.usoftchina.smartschool.websocket.core.Service;
+import com.usoftchina.smartschool.websocket.model.StudentDO;
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+public interface StudentDOService extends Service<StudentDO> {
+
+}

+ 24 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/DeviceDOServiceImpl.java

@@ -0,0 +1,24 @@
+package com.usoftchina.smartschool.websocket.service.impl;
+
+
+
+import com.usoftchina.smartschool.websocket.core.AbstractService;
+import com.usoftchina.smartschool.websocket.dao.DeviceDOMapper;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+import com.usoftchina.smartschool.websocket.service.DeviceDOService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+@Service
+@Transactional
+public class DeviceDOServiceImpl extends AbstractService<DeviceDO> implements DeviceDOService {
+    @Resource
+    private DeviceDOMapper deviceMapper;
+
+}

+ 24 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/OutInRecordDOServiceImpl.java

@@ -0,0 +1,24 @@
+package com.usoftchina.smartschool.websocket.service.impl;
+
+
+
+import com.usoftchina.smartschool.websocket.core.AbstractService;
+import com.usoftchina.smartschool.websocket.dao.OutInRecordDOMapper;
+import com.usoftchina.smartschool.websocket.model.OutInRecordDO;
+import com.usoftchina.smartschool.websocket.service.OutInRecordDOService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+@Service
+@Transactional
+public class OutInRecordDOServiceImpl extends AbstractService<OutInRecordDO> implements OutInRecordDOService {
+    @Resource
+    private OutInRecordDOMapper outInRecordMapper;
+
+}

+ 22 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/StudentDOServiceImpl.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.websocket.service.impl;
+
+import com.usoftchina.smartschool.websocket.core.AbstractService;
+import com.usoftchina.smartschool.websocket.dao.StudentDOMapper;
+import com.usoftchina.smartschool.websocket.model.StudentDO;
+import com.usoftchina.smartschool.websocket.service.StudentDOService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+@Service
+@Transactional
+public class StudentDOServiceImpl extends AbstractService<StudentDO> implements StudentDOService {
+    @Resource
+    private StudentDOMapper sysStudentMapper;
+
+}

+ 53 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/utils/ImgUtil.java

@@ -0,0 +1,53 @@
+package com.usoftchina.smartschool.websocket.utils;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Base64;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class ImgUtil {
+
+    public static boolean baseStrToImg(String baseStr, String imgFilePath) {
+        if (StringUtils.isBlank(baseStr)) {// 图像数据为空
+            return false;
+        }
+        try {
+            // Base64解码
+            byte[] bytes = Base64.getMimeDecoder().decode(baseStr);
+            for (int i = 0; i < bytes.length; ++i) {
+                if (bytes[i] < 0) {// 调整异常数据
+                    bytes[i] += 256;
+                }
+            }
+            // 生成jpeg图片
+            OutputStream out = new FileOutputStream(imgFilePath);
+            out.write(bytes);
+            out.flush();
+            out.close();
+            return true;
+        }
+        catch (Exception e) {
+            return false;
+        }
+    }
+
+    public static String imgToBaseStr(String imgFilePath) {
+        InputStream in = null;
+        byte[] data = null;
+        try {
+            in = new FileInputStream(imgFilePath);
+            data = new byte[in.available()];
+            in.read(data);
+            in.close();
+        }
+        catch (IOException e) {
+            e.printStackTrace();
+        }
+        return Base64.getMimeEncoder().encodeToString(data);
+    }
+}
+
+

+ 77 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/utils/WebSocketUtil.java

@@ -0,0 +1,77 @@
+package com.usoftchina.smartschool.websocket.utils;
+
+import java.lang.reflect.Field;
+import java.net.InetSocketAddress;
+
+import javax.websocket.RemoteEndpoint.Async;
+import javax.websocket.Session;
+
+public class WebSocketUtil {
+	
+	public static String getRemoteIPAddress(Session session) {
+		if (session == null) {
+			return null;
+		}
+		Async async = session.getAsyncRemote();
+		
+		//在Tomcat 8.0.x版本有效
+//		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress");
+		//在Tomcat 8.5以上版本有效
+		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress");
+		return addr.getHostName();
+	}
+	
+	public static String getRemoteAddressStr(Session session) {
+		if (session == null) {
+			return null;
+		}
+		Async async = session.getAsyncRemote();
+		
+		//在Tomcat 8.0.x版本有效
+//		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress");
+		//在Tomcat 8.5以上版本有效
+		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress");
+		return addr.toString().split("/")[1];
+	}
+
+	
+	public static InetSocketAddress getRemoteAddress(Session session) {
+		if (session == null) {
+			return null;
+		}
+		Async async = session.getAsyncRemote();
+		
+		//在Tomcat 8.0.x版本有效
+//		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress");
+		//在Tomcat 8.5以上版本有效
+		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress");
+		return addr;
+	}
+
+	private static Object getFieldInstance(Object obj, String fieldPath) {
+		String fields[] = fieldPath.split("#");
+		for (String field : fields) {
+			obj = getField(obj, obj.getClass(), field);
+			if (obj == null) {
+				return null;
+			}
+		}
+
+		return obj;
+	}
+
+	private static Object getField(Object obj, Class<?> clazz, String fieldName) {
+		for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
+			try {
+				Field field;
+				field = clazz.getDeclaredField(fieldName);
+				field.setAccessible(true);
+				return field.get(obj);
+			} catch (Exception e) {
+			}
+		}
+
+		return null;
+	}
+
+}

+ 4 - 1
applications/websocket/websocket-server/src/main/resources/application.yml

@@ -1,13 +1,16 @@
 spring:
   application:
     name: websocket-server
+  devtools:
+    restart:
+       enabled: false
   security:
     user:
       name: admin
       password: select111***
   datasource:
     driver-class-name: com.mysql.jdbc.Driver
-    url: jdbc:mysql://10.10.100.166:3306/school?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    url: jdbc:mysql://10.10.100.166:3306/smart_campus?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: root
     password: select111***
     hikari:

+ 22 - 0
applications/websocket/websocket-server/src/main/resources/mapper/DeviceDOMapper.xml

@@ -0,0 +1,22 @@
+<?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.company.project.dao.DeviceDOMapper">
+  <resultMap id="BaseResultMap" type="com.usoftchina.smartschool.websocket.model.DeviceDO">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="deviceId" jdbcType="INTEGER" property="deviceid" />
+    <result column="deviceName" jdbcType="VARCHAR" property="devicename" />
+    <result column="deviceModel" jdbcType="VARCHAR" property="devicemodel" />
+    <result column="serialNumber" jdbcType="VARCHAR" property="serialnumber" />
+    <result column="deviceIp" jdbcType="VARCHAR" property="deviceip" />
+    <result column="version" jdbcType="VARCHAR" property="version" />
+    <result column="deviceMac" jdbcType="VARCHAR" property="devicemac" />
+    <result column="deviceMaker" jdbcType="VARCHAR" property="devicemaker" />
+    <result column="secretkey" jdbcType="VARCHAR" property="secretkey" />
+    <result column="isAuthorized" jdbcType="INTEGER" property="isauthorized" />
+    <result column="isOnline" jdbcType="INTEGER" property="isonline" />
+    <result column="isAutomatic" jdbcType="INTEGER" property="isautomatic" />
+    <result column="schoolId" jdbcType="INTEGER" property="schoolid" />
+  </resultMap>
+</mapper>

+ 17 - 0
applications/websocket/websocket-server/src/main/resources/mapper/OutInRecordDOMapper.xml

@@ -0,0 +1,17 @@
+<?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.company.project.dao.OutInRecordDOMapper">
+  <resultMap id="BaseResultMap" type="com.usoftchina.smartschool.websocket.model.OutInRecordDO">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="record_id" jdbcType="BIGINT" property="recordId" />
+    <result column="record_name" jdbcType="VARCHAR" property="recordName" />
+    <result column="out_date" jdbcType="TIMESTAMP" property="outDate" />
+    <result column="in_date" jdbcType="TIMESTAMP" property="inDate" />
+    <result column="record_details" jdbcType="VARCHAR" property="recordDetails" />
+    <result column="record_remarks" jdbcType="VARCHAR" property="recordRemarks" />
+    <result column="stu_id" jdbcType="BIGINT" property="stuId" />
+    <result column="school_id" jdbcType="BIGINT" property="schoolId" />
+  </resultMap>
+</mapper>

+ 23 - 0
applications/websocket/websocket-server/src/main/resources/mapper/StudentDOMapper.xml

@@ -0,0 +1,23 @@
+<?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.company.project.dao.StudentDOMapper">
+  <resultMap id="BaseResultMap" type="com.usoftchina.smartschool.websocket.model.StudentDO">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="stu_id" jdbcType="BIGINT" property="stuId" />
+    <result column="stu_number" jdbcType="VARCHAR" property="stuNumber" />
+    <result column="stu_name" jdbcType="VARCHAR" property="stuName" />
+    <result column="stu_enroll_date" jdbcType="DATE" property="stuEnrollDate" />
+    <result column="stu_graduate_date" jdbcType="DATE" property="stuGraduateDate" />
+    <result column="stu_birthday" jdbcType="DATE" property="stuBirthday" />
+    <result column="stu_age" jdbcType="INTEGER" property="stuAge" />
+    <result column="stu_sex" jdbcType="INTEGER" property="stuSex" />
+    <result column="stu_address" jdbcType="VARCHAR" property="stuAddress" />
+    <result column="stu_photo" jdbcType="VARCHAR" property="stuPhoto" />
+    <result column="stu_status" jdbcType="INTEGER" property="stuStatus" />
+    <result column="stu_remarks" jdbcType="VARCHAR" property="stuRemarks" />
+    <result column="clazz_id" jdbcType="BIGINT" property="clazzId" />
+    <result column="school_id" jdbcType="BIGINT" property="schoolId" />
+  </resultMap>
+</mapper>

+ 63 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/smartschool/account/dto/RoleDTO.java

@@ -0,0 +1,63 @@
+package com.usoftchina.smartschool.account.dto;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+public class RoleDTO {
+
+    private String role_id;
+    private String role_name;
+    private String role_sign;
+    private String create_date;
+    private String role_remarks;
+    private Long school_id;
+
+    public String getRole_id() {
+        return role_id;
+    }
+
+    public void setRole_id(String role_id) {
+        this.role_id = role_id;
+    }
+
+    public String getRole_name() {
+        return role_name;
+    }
+
+    public void setRole_name(String role_name) {
+        this.role_name = role_name;
+    }
+
+    public String getRole_sign() {
+        return role_sign;
+    }
+
+    public void setRole_sign(String role_sign) {
+        this.role_sign = role_sign;
+    }
+
+    public String getCreate_date() {
+        return create_date;
+    }
+
+    public void setCreate_date(String create_date) {
+        this.create_date = create_date;
+    }
+
+    public String getRole_remarks() {
+        return role_remarks;
+    }
+
+    public void setRole_remarks(String role_remarks) {
+        this.role_remarks = role_remarks;
+    }
+
+    public Long getSchool_id() {
+        return school_id;
+    }
+
+    public void setSchool_id(Long school_id) {
+        this.school_id = school_id;
+    }
+}

+ 2 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/AuthApplication.java

@@ -4,6 +4,7 @@ import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * @author yingp
@@ -11,6 +12,7 @@ import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  */
 @SpringBootApplication
 @EnableEurekaClient
+@EnableFeignClients("com.usoftchina.smartschool")
 @MapperScan(basePackages = "com.usoftchina.smartschool.auth.mapper")
 public class AuthApplication {
     public static void main(String[] args) {

+ 2 - 2
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/mapper/AuthorizeLogMapper.java

@@ -1,7 +1,7 @@
 package com.usoftchina.smartschool.auth.mapper;
 
-import com.usoftchina.saas.auth.po.AuthorizeLog;
-import com.usoftchina.saas.auth.po.VirtualAuthorizeLog;
+import com.usoftchina.smartschool.auth.po.AuthorizeLog;
+import com.usoftchina.smartschool.auth.po.VirtualAuthorizeLog;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;

+ 1 - 1
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/AuthorizeCountService.java

@@ -1,6 +1,6 @@
 package com.usoftchina.smartschool.auth.service;
 
-import com.usoftchina.saas.cache.CacheKeyHelper;
+import com.usoftchina.smartschool.cache.CacheKeyHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;

+ 5 - 4
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/AuthorizeLogService.java

@@ -1,10 +1,11 @@
 package com.usoftchina.smartschool.auth.service;
 
+
 import com.github.pagehelper.PageInfo;
-import com.usoftchina.saas.auth.dto.AuthorizeLogDTO;
-import com.usoftchina.saas.auth.po.AuthorizeLog;
-import com.usoftchina.saas.auth.po.VirtualAuthorizeLog;
-import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.smartschool.auth.dto.AuthorizeLogDTO;
+import com.usoftchina.smartschool.auth.po.AuthorizeLog;
+import com.usoftchina.smartschool.auth.po.VirtualAuthorizeLog;
+import com.usoftchina.smartschool.page.PageRequest;
 
 /**
  * @author yingp

+ 9 - 9
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/impl/AuthorizeLogServiceImpl.java

@@ -2,14 +2,14 @@ package com.usoftchina.smartschool.auth.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.usoftchina.saas.auth.dto.AuthorizeLogDTO;
-import com.usoftchina.saas.auth.mapper.AuthorizeLogMapper;
-import com.usoftchina.saas.auth.po.AuthorizeLog;
-import com.usoftchina.saas.auth.po.VirtualAuthorizeLog;
-import com.usoftchina.saas.auth.service.AuthorizeLogService;
-import com.usoftchina.saas.context.BaseContextHolder;
-import com.usoftchina.saas.page.PageRequest;
-import com.usoftchina.saas.utils.BeanMapper;
+import com.usoftchina.smartschool.auth.dto.AuthorizeLogDTO;
+import com.usoftchina.smartschool.auth.mapper.AuthorizeLogMapper;
+import com.usoftchina.smartschool.auth.po.AuthorizeLog;
+import com.usoftchina.smartschool.auth.po.VirtualAuthorizeLog;
+import com.usoftchina.smartschool.auth.service.AuthorizeLogService;
+import com.usoftchina.smartschool.context.BaseContextHolder;
+import com.usoftchina.smartschool.page.PageRequest;
+import com.usoftchina.smartschool.utils.BeanMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -21,7 +21,7 @@ import java.util.List;
  * @date 2018/11/6
  */
 @Service
-public class AuthorizeLogServiceImpl implements AuthorizeLogService{
+public class AuthorizeLogServiceImpl implements AuthorizeLogService {
 
     @Autowired
     private AuthorizeLogMapper authorizeLogMapper;

+ 1 - 1
base-servers/auth/auth-server/src/main/resources/application.yml

@@ -54,7 +54,7 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:9500/eureka/
 server:
   port: 9720
   tomcat:

+ 27 - 0
frontend/pc-web/app/view/basic/staff/StaffList.js

@@ -48,6 +48,10 @@ Ext.define('school.view.basic.staff.StaffList', {
                 },
                 hiddenTools: false,
                 toolBtns: [{
+                    xtype: 'button',
+                    text: '导入测试按钮',
+                    handler: me.onImport,
+                }, {
                     xtype: 'button',
                     text: '一键开通'
                 }, {
@@ -98,6 +102,29 @@ Ext.define('school.view.basic.staff.StaffList', {
         this.callParent(arguments);
     },
 
+    onImport:function(){
+        var grid = this.ownerCt.ownerCt;
+        var form = grid.ownerCt,panelEl = form.getEl();
+        var box = panelEl.getBox();
+        var height = box.height;
+        var width = box.width;
+        var win = form.add(Ext.create('school.view.core.base.ImportWindow', {  
+            cls:'x-window-dbfind', 
+            belong:form,  
+            modal:true,
+            height: height * 0.8,
+            width: width * 0.8,
+            title: form._title + '导入',
+            scrollable: true,
+            bodyPadding: 10,
+            constrain: true,
+            closable: true,
+            layout:'fit',
+            renderTo:form.getEl()
+        }));
+        win.show();
+    },
+
     /**
      * 处理部分字段值
      */

+ 21 - 20
frontend/pc-web/app/view/core/base/ImportWindow.js

@@ -227,37 +227,38 @@ Ext.define('school.view.core.base.ImportWindow', {
                             }
 
                             //导入权限校验
-                            var hasPower = false;
-                            Ext.Ajax.request({
-                                url: '/api/commons/'+form.ownerCt.caller+'/import',
-                                async:false,
-                                method: 'GET',
-                                success: function(response, opts) {
-                                    var data = Ext.decode(response.responseText);
-                                    if(data.success){
-                                        hasPower = true
-                                    }
-                                },
-                                failure: function(response, opts) {}
-                            }); 
-                            if(!hasPower){
-                                school.util.BaseUtil.showErrorToast('上传失败:没有 导入 权限');
-                                return false;
-                            }
+                            // var hasPower = false;
+                            // Ext.Ajax.request({
+                            //     url: '/api/commons/'+form.ownerCt.caller+'/import',
+                            //     async:false,
+                            //     method: 'GET',
+                            //     success: function(response, opts) {
+                            //         var data = Ext.decode(response.responseText);
+                            //         if(data.success){
+                            //             hasPower = true
+                            //         }
+                            //     },
+                            //     failure: function(response, opts) {}
+                            // }); 
+                            // if(!hasPower){
+                            //     school.util.BaseUtil.showErrorToast('上传失败:没有 导入 权限');
+                            //     return false;
+                            // }
                             
                             var fd = new FormData();
                             fd.append('file', fileEl.files[0]);
-                            fd.append('caller', myForm.ownerCt.ownerCt.caller);
+                            fd.append('caller', 'GradeAndCLass');
                             form.setLoading(true);
+                            debugger
                             Ext.Ajax.request({
-                                url: '/api/commons/excel/import/parse',//这里是填写需要跨域访问的URL
+                                url: '/excel/import/parse',//这里是填写需要跨域访问的URL
                                 cors: true,
                                 useDefaultXhrHeader: false,
                                 method: 'post',
                                 rawData: fd,
                                 headers: {
                                     'Access-Control-Allow-Origin': '*',
-                                    'Authorization':  school.util.State.get('session').token,
+                                    //'Authorization':  school.util.State.get('session').token,
                                     //"Content-Type": 'multipart/form-data'  //文件上传的格式, 
                                     "Content-Type":null
                                 },

+ 11 - 6
frontend/wechat-web/src/configs/api.config.js

@@ -33,12 +33,6 @@ export const API = {
     PAYMENT_PAYMENT_DETAIL: _baseURL + '/payment/paymentDetails',
     //结束收款
     PAYMENT_ENTPAY: _baseURL + '/payment/endPay',
-    //获取所有老师的电话
-    TEACHER_PHONES_LIST: _baseURL + '/user/getTeacherPhoneList',
-    //获取相应班级老师电话号码
-    GET_TEACHER_PHONES: _baseURL + '/user/getTeacherPhones',
-    //获取班级家长手机号
-    GET_PARENT_PHONES: _baseURL + '/user/getParentPhones',
 
     //校园卡充值
     RECHARGE_FORCARD: _baseURL + '/payCard/reChangeForCard',
@@ -186,6 +180,17 @@ export const API = {
     NOTIFY_LIST_TEACHER: _baseURL + '/wxSchool/notify/notifyListByTeacher',
     //通知公告详情
     NOTIFY_DETAIL: _baseURL + '/wxSchool/notify/getNotifyDetails',
+
+
+    //获取所有老师手机号
+    TEACHER_PHONES_LIST: _baseURL + '/wxSchool/clazz/getAllTeacherBySchool',
+    //获取相应班级老师电话号码
+    GET_TEACHER_PHONES: _baseURL + '/wxSchool/clazz/getTeacherByStuId',
+    //获取所教班级家长手机号
+    GET_PARENT_PHONES_BYTEACHER: _baseURL + '/wxSchool/clazz/selectParentPhoneByTeacher',
+    //获取班级家长手机号
+    GET_PARENT_PHONES: _baseURL + '/wxSchool/clazz/getParentByClazzId',
+
 }
 
 

+ 1 - 1
frontend/wechat-web/src/configs/router.config.js

@@ -138,7 +138,7 @@ export default class RouteConfig extends Component {
                     <Route path="/accessnoticedetail/:stuId/:anId?" component={AccessNoticeDetail}/>     {/*出入校通知详情*/}
                     {/*<Route path="/accessnoticedetail" component={AccessNoticeDetail}/> /!*出入校通知详情*!/*/}
                     <Route path='/leaveAddC' component={LeaveAddCPage}/>{/*老师请假*/}
-                    <Route path='/leaveAdd' component={LeaveAddPage}/>   {/*学生请假*/}
+                    <Route path='/leaveAdd' component={LeaveAddPage}/> {/*学生请假*/}
                     <Route path='/leaveList/:role' component={LeaveListPage}/>{/*学生请假列表*/}
 
                     {/*刘杰*/}

+ 103 - 53
frontend/wechat-web/src/modules/phonesBook/PhonesList.jsx

@@ -9,16 +9,17 @@ import {List, Skeleton} from 'antd'
 import PhonesItem from "../../components/PhonesItem";
 import 'css/phones.css'
 import {getStrValue, isObjEmpty} from "../../utils/common";
-import {fetchGet} from "../../utils/fetchRequest";
-import {API} from "../../configs/api.config";
+import {fetchGet, fetchPost} from "../../utils/fetchRequest";
+import {_baseURL, API} from "../../configs/api.config";
 import {Toast, SearchBar} from "antd-mobile";
 import RefreshLayout from "../../components/RefreshLayout";
-
+import {connect} from 'react-redux'
 
 const mPageSize = 10
 let mPageIndex = 0
+let mSearchKey = ''
 
-export default class PhonesList extends Component {
+class PhonesList extends Component {
 
     constructor() {
         super()
@@ -28,6 +29,9 @@ export default class PhonesList extends Component {
             classTitle: '',
             isLoading: true,
             isRefreshing: false,
+            searchKey: '',
+            searchText: '',
+            searchHint: '',
         }
     }
 
@@ -38,8 +42,6 @@ export default class PhonesList extends Component {
         this.mType = this.props.match.params.type
         if (this.props.match.params.classId) {
             this.classId = this.props.match.params.classId;
-        } else {
-            this.classId = 10001
         }
         if (this.title) {
             this.setState({
@@ -47,19 +49,34 @@ export default class PhonesList extends Component {
             })
         }
 
-        Toast.loading('', 0)
+        if (this.mType === 'teacher') {
+            this.setState({
+                searchHint: '搜索学生'
+            })
+        } else if (this.mType === 'parent') {
+            this.setState({
+                searchHint: '搜索老师'
+            })
+        }
 
+        Toast.loading('', 0)
         mPageIndex = 0
         this.loadPhones()
     }
 
+    componentWillUnmount() {
+        Toast.hide()
+    }
+
     render() {
-        const {phonesList, classTitle, isLoading, isRefreshing} = this.state
+        const {phonesList, classTitle, isLoading, isRefreshing, searchHint, searchKey, searchText} = this.state
 
         return (
-            <div className='phone-select-root' style={{height:'100%',maxHeight:'100vh'}}>
+            <div className='phone-select-root' style={{height: '100%', maxHeight: '100vh'}}>
                 <div className='common-fixed-top'>
-                    <SearchBar placeholder="搜索家长" maxLength={20}/>
+                    <SearchBar placeholder={searchHint} maxLength={20}
+                               value={searchText} onSubmit={this.searchSubmit}
+                               onChange={this.searchChange} onClear={this.searchClear}/>
                     <div className={isObjEmpty(classTitle) ? 'displayNone' : 'phones-list-header'}>{classTitle}</div>
                     <div className={isObjEmpty(classTitle) ? 'displayNone' : 'gray-line'} style={{height: '1px'}}></div>
                 </div>
@@ -81,6 +98,36 @@ export default class PhonesList extends Component {
         )
     }
 
+    searchChange = (value) => {
+        mSearchKey = value
+        this.setState({
+            searchText: value
+        })
+    }
+
+    searchClear = (e) => {
+        mPageIndex = 0
+        this.setState({
+            isLoading: true,
+            isRefreshing: false,
+            searchText: '',
+            searchKey: ''
+        }, () => {
+            this.loadPhones()
+        })
+    }
+
+    searchSubmit = (value) => {
+        mPageIndex = 0
+        this.setState({
+            isLoading: true,
+            isRefreshing: false,
+            searchKey: value
+        }, () => {
+            this.loadPhones()
+        })
+    }
+
     loadPhones = () => {
         try {
             this.setState({
@@ -92,13 +139,13 @@ export default class PhonesList extends Component {
         if (this.mType == 'parent') {
             this.url = API.GET_TEACHER_PHONES
             this.params = {
-                stuId: this.classId
+                stuId: this.props.userInfo.user.student.stuId
             }
             this.getPhones()
         } else if (this.mType == 'teacher') {
             this.url = API.GET_PARENT_PHONES
             this.params = {
-                schId: this.classId
+                clazzId: this.classId
             }
             this.getPhones()
         } else {
@@ -113,60 +160,55 @@ export default class PhonesList extends Component {
         mPageIndex++
         console.log(mPageIndex)
 
-        const {phonesList} = this.state
+        const {phonesList, searchKey} = this.state
         if (mPageIndex === 1) {
             phonesList.length = 0
         }
 
-        fetchGet(this.url, {
+        fetchPost(this.url, {
             pageIndex: mPageIndex,
             pageSize: mPageSize,
+            selectKey: searchKey,
             ...this.params
         }).then(response => {
             Toast.hide();
 
             if (response && response.data) {
                 if (this.mType == 'parent') {
-                    if (response.data.teachers && response.data.teachers.length > 0) {
-                        response.data.teachers.forEach((item, index) => {
-                            let phoneBean = new PhonesBean()
-
-                            phoneBean.icon = require('imgs/ic_head' + (index % 15 + 1) + '.png')
-                            phoneBean.name = getStrValue(item, 'userName')
-                            phoneBean.claName = this.title
-                            phoneBean.children = ['']
-
-                            phoneBean.phone = [getStrValue(item, 'UserPhone')]
-                            phonesList.push(phoneBean)
-                        })
-                    }
+                    response.data.forEach((item, index) => {
+                        let phoneBean = new PhonesBean()
+
+                        phoneBean.icon = require('imgs/ic_head' + (index % 15 + 1) + '.png')
+                        phoneBean.icon = _baseURL + getStrValue(item, 'teacherPhoto')
+                        phoneBean.name = getStrValue(item, 'teacherName')
+                        phoneBean.claName = this.title
+                        phoneBean.children = ['']
+
+                        phoneBean.phone = [getStrValue(item, 'userPhone')]
+                        phonesList.push(phoneBean)
+                    })
                 } else if (this.mType == 'teacher') {
-                    if (response.data.students && response.data.students.length > 0) {
-                        response.data.students.forEach((item, index) => {
-                            let phoneBean = new PhonesBean()
-                            let phones = []
-                            phoneBean.icon = require('imgs/ic_head' + (index % 15 + 1) + '.png')
-                            phoneBean.name = getStrValue(item, 'stuName')
-                            phoneBean.claName = this.title
-
-                            if (item.parents && item.parents.length > 0) {
-                                item.parents.forEach((ite, ind) => {
-                                    phoneBean.children.push(getStrValue(ite, 'userName'))
-                                    phones.push(getStrValue(ite, 'userPhone'))
-                                })
-                            }
-
-                            // if (phones.length > 0) {
-                            phoneBean.phone = phones
-                            // }
-
-                            phonesList.push(phoneBean)
-                        })
-                    } else {
-                        if (mPageIndex > 1) {
-                            mPageIndex--
+                    response.data.forEach((item, index) => {
+                        let phoneBean = new PhonesBean()
+                        let phones = []
+                        phoneBean.icon = require('imgs/ic_head' + (index % 15 + 1) + '.png')
+                        phoneBean.icon = _baseURL + getStrValue(item, 'stuPhoto')
+                        phoneBean.name = getStrValue(item, 'stuName')
+                        phoneBean.claName = this.title
+
+                        if (item.parentsDOS && item.parentsDOS.length > 0) {
+                            item.parentsDOS.forEach((ite, ind) => {
+                                phoneBean.children.push(getStrValue(ite, 'parentsName'))
+                                phones.push(getStrValue(ite, 'userPhone'))
+                            })
                         }
-                    }
+
+                        // if (phones.length > 0) {
+                        phoneBean.phone = phones
+                        // }
+
+                        phonesList.push(phoneBean)
+                    })
                 }
             } else {
                 if (mPageIndex > 1) {
@@ -197,4 +239,12 @@ export default class PhonesList extends Component {
             })
         })
     }
-}
+}
+
+let mapStateToProps = (state) => ({
+    userInfo: {...state.redUserInfo},
+})
+
+let mapDispatchToProps = (dispatch) => ({})
+
+export default connect(mapStateToProps, mapDispatchToProps)(PhonesList)

+ 67 - 17
frontend/wechat-web/src/modules/phonesBook/PhonesSearch.jsx

@@ -11,19 +11,24 @@ import PhonesItem from "../../components/PhonesItem";
 import {Toast, SearchBar} from "antd-mobile";
 import {List, Skeleton} from 'antd'
 import {API} from "../../configs/api.config";
-import {fetchGet} from "../../utils/fetchRequest";
+import {fetchGet, fetchPost} from "../../utils/fetchRequest";
+import {connect} from 'react-redux'
 
 const mPageSize = 10
 let mPageIndex = 0
+let mSearchKey = ''
 
-export default class PhonesSearch extends Component {
+class PhonesSearch extends Component {
 
     constructor() {
         super()
 
         this.state = {
             isRefreshing: false,
-            phonesList: []
+            phonesList: [],
+            isLoading: false,
+            searchKey: '',
+            searchText: '',
         }
     }
 
@@ -44,28 +49,63 @@ export default class PhonesSearch extends Component {
     }
 
     render() {
-        const {phonesList, isRefreshing} = this.state
+        const {phonesList, isRefreshing, isLoading, searchText} = this.state
 
         return (
             <div className='phone-select-root' style={{height: '100%'}}>
                 <SearchBar placeholder="搜索家长" maxLength={20}
-                           ref={ref => this.searchInput = ref}/>
+                           ref={ref => this.searchInput = ref}
+                           value={searchText} onSubmit={this.searchSubmit}
+                           onChange={this.searchChange} onClear={this.searchClear}
+                           onCancel={this.searchClear}/>
 
                 <RefreshLayout
                     refreshing={isRefreshing}
                     onRefresh={this.loadPhones}>
-                    <List className='phones-list-layout'
-                          dataSource={phonesList}
-                          renderItem={phonesBean => (
-                              <List.Item>
-                                  <PhonesItem phonesBean={phonesBean}/>
-                              </List.Item>
-                          )}/>
+                    <Skeleton loading={isLoading} active paragraph={{rows: 3}}>
+                        <List className='phones-list-layout'
+                              dataSource={phonesList}
+                              renderItem={phonesBean => (
+                                  <List.Item>
+                                      <PhonesItem phonesBean={phonesBean}/>
+                                  </List.Item>
+                              )}/>
+                    </Skeleton>
                 </RefreshLayout>
             </div>
         )
     }
 
+    searchChange = (value) => {
+        mSearchKey = value
+        this.setState({
+            searchText: value
+        })
+    }
+
+
+    searchClear = (e) => {
+        mPageIndex = 0
+        this.setState({
+            isLoading: true,
+            isRefreshing: false,
+            searchText: '',
+            searchKey: ''
+        }, () => {
+            this.loadPhones()
+        })
+    }
+
+    searchSubmit = (value) => {
+        mPageIndex = 0
+        this.setState({
+            isLoading: true,
+            isRefreshing: false,
+            searchKey: value
+        }, () => {
+            this.loadPhones()
+        })
+    }
 
     loadPhones = () => {
         try {
@@ -76,15 +116,15 @@ export default class PhonesSearch extends Component {
         }
 
         if (this.mType == 'parent') {
-            this.url = API.GET_TEACHER_PHONES
+            this.url = API.GET_PARENT_PHONES_BYTEACHER
             this.params = {
-                stuId: this.classId
+                teacherId: this.props.userInfo.user.userFunId
             }
             this.getPhones()
         } else if (this.mType == 'teacher') {
-            this.url = API.GET_PARENT_PHONES
+            this.url = API.TEACHER_PHONES_LIST
             this.params = {
-                schId: this.classId
+                teacherId: this.props.userInfo.user.userFunId
             }
             this.getPhones()
         } else {
@@ -104,7 +144,7 @@ export default class PhonesSearch extends Component {
             phonesList.length = 0
         }
 
-        fetchGet(this.url, {
+        fetchPost(this.url, {
             pageIndex: mPageIndex,
             pageSize: mPageSize,
             ...this.params
@@ -162,6 +202,7 @@ export default class PhonesSearch extends Component {
 
             this.setState({
                 phonesList,
+                isLoading: false,
                 isRefreshing: false,
             })
         }).catch(error => {
@@ -177,8 +218,17 @@ export default class PhonesSearch extends Component {
             }
 
             this.setState({
+                isLoading: false,
                 isRefreshing: false,
             })
         })
     }
 }
+
+let mapStateToProps = (state) => ({
+    userInfo: {...state.redUserInfo},
+})
+
+let mapDispatchToProps = (dispatch) => ({})
+
+export default connect(mapStateToProps, mapDispatchToProps)(PhonesSearch)

+ 10 - 8
frontend/wechat-web/src/modules/phonesBook/PhonesSelect.jsx

@@ -11,8 +11,8 @@ import 'css/phones.css'
 import {List, Icon, Skeleton, message} from 'antd'
 import PhonesItem from "components/PhonesItem";
 import PhonesBean from 'model/PhonesBean'
-import {fetchGet} from "../../utils/fetchRequest";
-import {API} from "../../configs/api.config";
+import {fetchGet, fetchPost} from "../../utils/fetchRequest";
+import {_baseURL, API} from "../../configs/api.config";
 import {Toast} from "antd-mobile";
 import RefreshLayout from "../../components/RefreshLayout";
 import {getStrValue} from "../../utils/common";
@@ -93,7 +93,7 @@ class PhonesSelect extends Component {
                         <div className='phoneListItem'
                              onClick={this.onParentItemClick.bind(this, index)}>
                             <div
-                                className='phoneItemText'>{item.parentName + item.schName}</div>
+                                className='phoneItemText'>{item.gradeName + item.clazzName}</div>
                             <Icon type="right" theme="outlined"/>
                         </div>
                     </List.Item>
@@ -213,8 +213,9 @@ class PhonesSelect extends Component {
             teacherList.length = 0
         }
 
-        fetchGet(API.TEACHER_PHONES_LIST, {
-            roleId: 3,
+        fetchPost(API.TEACHER_PHONES_LIST, {
+            teacherId: this.props.userInfo.user.userFunId,
+            selectKey: '',
             pageIndex: mPageIndex,
             pageSize: mPageSize
         }).then(response => {
@@ -224,9 +225,10 @@ class PhonesSelect extends Component {
                 response.data.map((item, index) => {
                     let phoneBean = new PhonesBean()
                     phoneBean.icon = require('imgs/ic_head' + (index % 15 + 1) + '.png')
-                    phoneBean.name = getStrValue(item, 'userName')
+                    phoneBean.icon = _baseURL + getStrValue(item,'teacherPhoto')
+                    phoneBean.name = getStrValue(item, 'teacherName')
                     phoneBean.phone = [getStrValue(item, 'userPhone')]
-                    phoneBean.claName = getStrValue(item, 'schName')
+                    // phoneBean.claName = getStrValue(item, 'schName')
                     phoneBean.children = ['']
 
                     teacherList.push(phoneBean)
@@ -262,7 +264,7 @@ class PhonesSelect extends Component {
     onParentItemClick = (index) => {
         const {parentList} = this.state
         let selectItem = parentList[index]
-        this.props.history.push('/phonesList/teacher/' + selectItem.schId + '/' + selectItem.parentName + selectItem.schName)
+        this.props.history.push('/phonesList/teacher/' + selectItem.clazzId + '/' + selectItem.gradeName + selectItem.clazzName)
     }
 
     onTeacherClick = () => {

+ 3 - 3
frontend/wechat-web/src/modules/user/UserInfo.js

@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import 'css/user-info.css'
 import 'css/phones.css'
-import {Icon, Modal, Upload,Avatar} from "antd";
+import {Icon, Modal, Upload, Avatar} from "antd";
 import icon_userInfo_upload from "../../style/imgs/icon_userInfo_upload.png"
 import {API, _baseURL} from "../../configs/api.config";
 import {Toast} from 'antd-mobile'
@@ -133,7 +133,7 @@ class UserInfo extends Component {
         let userPhone = ''
         if (this.type == 1) {
             userPhone = userInfo.teacher.userPhone
-        }else if (this.type == 2) {
+        } else if (this.type == 2) {
             userPhone = userInfo.parent.userPhone
         }
         return <div className={'user-column'}>
@@ -150,7 +150,7 @@ class UserInfo extends Component {
             </div>
             <div className='gray-line' style={{height: '1px'}}></div>
 
-            {this.type == 1 ? '' : <div>
+            {(this.type == 1 || true) ? '' : <div>
                 <div className='user-info-item-top'>
                     <text className='user-info-item-name'>人脸照</text>
                     <div className='gray-line'