Browse Source

地图功能迁移

ZHOUTD 1 năm trước cách đây
mục cha
commit
ee40f25629
40 tập tin đã thay đổi với 2813 bổ sung896 xóa
  1. 14 14
      sql/init.sql
  2. 20 0
      xzl-admin/pom.xml
  3. 79 0
      xzl-admin/src/main/java/com/xzl/web/controller/common/ApiController.java
  4. 1 1
      xzl-admin/src/main/java/com/xzl/web/core/config/SwaggerConfig.java
  5. 12 0
      xzl-admin/src/main/java/com/xzl/web/mapper/CustomerTerminalMapper.java
  6. 11 0
      xzl-admin/src/main/java/com/xzl/web/model/monitor/CustomerSearchDTO.java
  7. 17 0
      xzl-admin/src/main/java/com/xzl/web/model/monitor/CustomerSearchVO.java
  8. 138 0
      xzl-admin/src/main/java/com/xzl/web/utils/BaiduMapAreaUtil.java
  9. 158 0
      xzl-admin/src/main/java/com/xzl/web/utils/CommonUtils.java
  10. 72 0
      xzl-admin/src/main/java/com/xzl/web/utils/Constant.java
  11. 58 0
      xzl-admin/src/main/java/com/xzl/web/utils/Constants.java
  12. 101 0
      xzl-admin/src/main/java/com/xzl/web/utils/ConstructUtils.java
  13. 55 0
      xzl-admin/src/main/java/com/xzl/web/utils/DistanceUtils.java
  14. 59 0
      xzl-admin/src/main/java/com/xzl/web/utils/ExcelReader.java
  15. 373 0
      xzl-admin/src/main/java/com/xzl/web/utils/HttpsUtil.java
  16. 131 0
      xzl-admin/src/main/java/com/xzl/web/utils/JsonUtil.java
  17. 19 0
      xzl-admin/src/main/java/com/xzl/web/utils/MyX509TrustManager.java
  18. 132 0
      xzl-admin/src/main/java/com/xzl/web/utils/RequestUtils.java
  19. 186 0
      xzl-admin/src/main/java/com/xzl/web/utils/StreamClosedHttpResponse.java
  20. 62 0
      xzl-admin/src/main/java/com/xzl/web/utils/StreamUtil.java
  21. 50 0
      xzl-admin/src/main/java/com/xzl/web/utils/StringUtil.java
  22. 57 0
      xzl-admin/src/main/java/com/xzl/web/utils/UrlUtils.java
  23. 382 0
      xzl-admin/src/main/java/com/xzl/web/utils/WorkWxUtils.java
  24. 133 0
      xzl-admin/src/main/java/com/xzl/web/utils/baidu/BaiduUtils.java
  25. 65 0
      xzl-admin/src/main/java/com/xzl/web/utils/baidu/Base64Util.java
  26. 72 0
      xzl-admin/src/main/java/com/xzl/web/utils/baidu/FileUtil.java
  27. 77 0
      xzl-admin/src/main/java/com/xzl/web/utils/baidu/HttpUtil.java
  28. 32 0
      xzl-admin/src/main/resources/mapper/CustomerTerminalMapper.xml
  29. 1 1
      xzl-generator/src/main/java/com/xzl/generator/util/GenUtils.java
  30. 2 2
      xzl-ui/.env.development
  31. 2 2
      xzl-ui/.env.production
  32. 2 2
      xzl-ui/.env.staging
  33. 6 5
      xzl-ui/package.json
  34. 2 1
      xzl-ui/public/index.html
  35. 0 8
      xzl-ui/src/layout/components/Navbar.vue
  36. 24 857
      xzl-ui/src/views/index.vue
  37. 1 1
      xzl-ui/src/views/login.vue
  38. 205 0
      xzl-ui/src/views/monitor/map/customerPositionBmap.vue
  39. 1 1
      xzl-ui/src/views/register.vue
  40. 1 1
      xzl-ui/vue.config.js

+ 14 - 14
sql/init.sql

@@ -23,16 +23,16 @@ create table sys_dept (
 -- ----------------------------
 -- 初始化-部门表数据
 -- ----------------------------
-insert into sys_dept values(100,  0,   '0',          '若依科技',   0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
-insert into sys_dept values(101,  100, '0,100',      '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
-insert into sys_dept values(102,  100, '0,100',      '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
-insert into sys_dept values(103,  101, '0,100,101',  '研发部门',   1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
-insert into sys_dept values(104,  101, '0,100,101',  '市场部门',   2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
-insert into sys_dept values(105,  101, '0,100,101',  '测试部门',   3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
-insert into sys_dept values(106,  101, '0,100,101',  '财务部门',   4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
-insert into sys_dept values(107,  101, '0,100,101',  '运维部门',   5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
-insert into sys_dept values(108,  102, '0,100,102',  '市场部门',   1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
-insert into sys_dept values(109,  102, '0,100,102',  '财务部门',   2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(100,  0,   '0',          '科技',   0, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(101,  100, '0,100',      '深圳总公司', 1, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(102,  100, '0,100',      '长沙分公司', 2, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(103,  101, '0,100,101',  '研发部门',   1, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(104,  101, '0,100,101',  '市场部门',   2, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(105,  101, '0,100,101',  '测试部门',   3, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(106,  101, '0,100,101',  '财务部门',   4, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(107,  101, '0,100,101',  '运维部门',   5, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(108,  102, '0,100,102',  '市场部门',   1, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(109,  102, '0,100,102',  '财务部门',   2, '', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
 
 
 -- ----------------------------
@@ -65,8 +65,8 @@ create table sys_user (
 -- ----------------------------
 -- 初始化-用户信息表数据
 -- ----------------------------
-insert into sys_user values(1,  103, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '管理员');
-insert into sys_user values(2,  105, 'ry',    '若依', '00', 'ry@qq.com',  '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '测试员');
+insert into sys_user values(1,  103, 'admin', '', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '管理员');
+insert into sys_user values(2,  105, 'ry',    '', '00', 'ry@qq.com',  '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '测试员');
 
 
 -- ----------------------------
@@ -634,8 +634,8 @@ create table sys_notice (
 -- ----------------------------
 -- 初始化-公告信息表数据
 -- ----------------------------
-insert into sys_notice values('1', '温馨提醒:2018-07-01 若依新版本发布啦', '2', '新版本内容', '0', 'admin', sysdate(), '', null, '管理员');
-insert into sys_notice values('2', '维护通知:2018-07-01 若依系统凌晨维护', '1', '维护内容',   '0', 'admin', sysdate(), '', null, '管理员');
+insert into sys_notice values('1', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 'admin', sysdate(), '', null, '管理员');
+insert into sys_notice values('2', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容',   '0', 'admin', sysdate(), '', null, '管理员');
 
 
 -- ----------------------------

+ 20 - 0
xzl-admin/pom.xml

@@ -16,6 +16,22 @@
     </description>
 
     <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.5</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.28</version>
+        </dependency>
 
         <!-- spring-boot-devtools -->
         <dependency>
@@ -60,6 +76,10 @@
             <groupId>com.xzl</groupId>
             <artifactId>xzl-generator</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 79 - 0
xzl-admin/src/main/java/com/xzl/web/controller/common/ApiController.java

@@ -0,0 +1,79 @@
+package com.xzl.web.controller.common;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.xzl.web.mapper.CustomerTerminalMapper;
+import com.xzl.web.model.monitor.CustomerSearchDTO;
+import com.xzl.web.model.monitor.CustomerSearchVO;
+import com.xzl.web.utils.ConstructUtils;
+import com.xzl.web.utils.RequestUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/api")
+public class ApiController {
+
+  private Logger logger = LoggerFactory.getLogger(this.getClass());
+
+  @Autowired
+  private SqlSessionTemplate template;
+
+  @Autowired
+  private CustomerTerminalMapper customerTerminalMapper;
+
+  @RequestMapping("/map/search")
+  @ResponseBody
+  public List<Map> mapSearch(String key) throws Exception {
+    if(StringUtils.isBlank(key)) {
+      logger.info("无关键字 ...");
+      return new ArrayList<>();
+    }
+    logger.info("1. key : {} ", key);
+    key = java.net.URLEncoder.encode(key, "utf-8");
+    logger.info("1. key : {} ", key);
+    // 调用百度地图
+    List<Map> list = new ArrayList<>();
+//    String gaodeMapApi = "https://restapi.amap.com/v3/place/text?keywords=" + key + "&city=1728&citylimit=true&offset=20&page=1&key=af8155885e43e4151e3b543f677056a7&extensions=all";
+    String baiduMapApi = "https://api.map.baidu.com/place/v2/search?query="+key+"&region=仙桃&output=json&offset=20&page=1&ak=UOO4u2Ex4WI5IDUUROdEMMg64elF5Itc&extensions=all";
+    logger.info("根据关键字查询 : {}", baiduMapApi );
+    JSONObject json = RequestUtils.httpRequest(baiduMapApi, "get", null, null);
+    if (json != null) {
+      JSONArray results = json.getJSONArray("results");
+      if (results != null || results.size() > 0) {
+        results.forEach(o -> {
+          JSONObject location = (JSONObject) o;
+//          String[] locations = location.getString("location").split(",");
+          String longitute=location.getJSONObject("location").getString("lng");
+          String latitude=location.getJSONObject("location").getString("lat");
+          list.add(ConstructUtils.map("value", location.getString("name"), "latitude", latitude, "longitude", longitute, "address", location.getString("address")));
+        });
+      }
+    }
+    return list;
+  }
+
+  /**
+   * 根据指定经纬度查零售户信息
+   *
+   * @return
+   * @throws Exception
+   */
+  @RequestMapping("/map/customer/search")
+  @ResponseBody
+  public List<CustomerSearchVO> mapCustomerSearch(@RequestBody CustomerSearchDTO searchDTO) throws Exception {
+    List<CustomerSearchVO> data = customerTerminalMapper.getCustomerListByPosition(searchDTO);
+    return data;
+  }
+}

+ 1 - 1
xzl-admin/src/main/java/com/xzl/web/core/config/SwaggerConfig.java

@@ -113,7 +113,7 @@ public class SwaggerConfig
         // 用ApiInfoBuilder进行定制
         return new ApiInfoBuilder()
                 // 设置标题
-                .title("标题:若依管理系统_接口文档")
+                .title("标题:管理系统_接口文档")
                 // 描述
                 .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
                 // 作者信息

+ 12 - 0
xzl-admin/src/main/java/com/xzl/web/mapper/CustomerTerminalMapper.java

@@ -0,0 +1,12 @@
+package com.xzl.web.mapper;
+
+import com.xzl.web.model.monitor.CustomerSearchDTO;
+import com.xzl.web.model.monitor.CustomerSearchVO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface CustomerTerminalMapper {
+    List<CustomerSearchVO> getCustomerListByPosition(CustomerSearchDTO searchDTO);
+}

+ 11 - 0
xzl-admin/src/main/java/com/xzl/web/model/monitor/CustomerSearchDTO.java

@@ -0,0 +1,11 @@
+package com.xzl.web.model.monitor;
+
+import lombok.Data;
+
+@Data
+public class CustomerSearchDTO {
+    private Double latitude;
+    private Double longitude;
+    private Integer count;
+    private Double distance;
+}

+ 17 - 0
xzl-admin/src/main/java/com/xzl/web/model/monitor/CustomerSearchVO.java

@@ -0,0 +1,17 @@
+package com.xzl.web.model.monitor;
+
+import lombok.Data;
+
+@Data
+public class CustomerSearchVO {
+    private String clientCode;
+    private String clientName;
+    private String shortName;
+    private String simplyName;
+    private String cnname;
+    private String telphonea;
+    private String address;
+    private String latitude;
+    private String longitude;
+    private String distance;
+}

+ 138 - 0
xzl-admin/src/main/java/com/xzl/web/utils/BaiduMapAreaUtil.java

@@ -0,0 +1,138 @@
+package com.xzl.web.utils;
+
+import java.awt.geom.Point2D;
+import java.util.List;
+
+public class BaiduMapAreaUtil {
+
+    private BaiduMapAreaUtil() {
+    }
+
+
+//    /**
+//     * 判断当前位置是否在多边形区域内
+//     * @param orderLocation 当前点
+//     * @param partitionLocation 区域顶点
+//     * @return
+//     */
+//    public static boolean isInPolygon(Map orderLocation, String[] strList){
+//
+//        double p_x =Double.parseDouble((String) orderLocation.get("X"));
+//        double p_y =Double.parseDouble((String) orderLocation.get("Y"));
+//        Point2D.Double point = new Point2D.Double(p_x, p_y);
+//
+//        List<Point2D.Double> pointList= new ArrayList<Point2D.Double>();
+//        for (String str : strList){
+//            String[] points = str.split("_");
+//            double polygonPoint_x=Double.parseDouble(points[1]);
+//            double polygonPoint_y=Double.parseDouble(points[0]);
+//            Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x,polygonPoint_y);
+//            pointList.add(polygonPoint);
+//        }
+//        return IsPtInPoly(point,pointList);
+//    }
+    /**
+     * 返回一个点是否在一个多边形区域内, 如果点位于多边形的顶点或边上,不算做点在多边形内,返回false
+     * @param point
+     * @param polygon
+     * @return
+     */
+    public static boolean checkWithJdkGeneralPath(Point2D.Double point, List<Point2D.Double> polygon) {
+        java.awt.geom.GeneralPath p = new java.awt.geom.GeneralPath();
+        Point2D.Double first = polygon.get(0);
+        p.moveTo(first.x, first.y);
+        polygon.remove(0);
+        for (Point2D.Double d : polygon) {
+            p.lineTo(d.x, d.y);
+        }
+        p.lineTo(first.x, first.y);
+        p.closePath();
+        return p.contains(point);
+    }
+
+    /**
+     * 判断点是否在多边形内,如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
+     * @param point 检测点
+     * @param pts 多边形的顶点
+     * @return 点在多边形内返回true,否则返回false
+     */
+    public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts){
+
+        int N = pts.size();
+        boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
+        int intersectCount = 0;//cross points count of x
+        double precision = 2e-10; //浮点类型计算时候与0比较时候的容差
+        Point2D.Double p1, p2;//neighbour bound vertices
+        Point2D.Double p = point; //当前点
+
+        p1 = pts.get(0);//left vertex
+        for(int i = 1; i <= N; ++i){//check all rays
+            if(p.equals(p1)){
+                return boundOrVertex;//p is an vertex
+            }
+
+            p2 = pts.get(i % N);//right vertex
+            if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){//ray is outside of our interests
+                p1 = p2;
+                continue;//next ray left point
+            }
+
+            if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){//ray is crossing over by the algorithm (common part of)
+                if(p.y <= Math.max(p1.y, p2.y)){//x is before of ray
+                    if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal ray
+                        return boundOrVertex;
+                    }
+
+                    if(p1.y == p2.y){//ray is vertical
+                        if(p1.y == p.y){//overlies on a vertical ray
+                            return boundOrVertex;
+                        }else{//before ray
+                            ++intersectCount;
+                        }
+                    }else{//cross point on the left side
+                        double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//cross point of y
+                        if(Math.abs(p.y - xinters) < precision){//overlies on a ray
+                            return boundOrVertex;
+                        }
+
+                        if(p.y < xinters){//before ray
+                            ++intersectCount;
+                        }
+                    }
+                }
+            }else{//special case when ray is crossing through the vertex
+                if(p.x == p2.x && p.y <= p2.y){//p crossing over p2
+                    Point2D.Double p3 = pts.get((i+1) % N); //next vertex
+                    if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x
+                        ++intersectCount;
+                    }else{
+                        intersectCount += 2;
+                    }
+                }
+            }
+            p1 = p2;//next ray left point
+        }
+
+        if(intersectCount % 2 == 0){//偶数在多边形外
+            return false;
+        } else { //奇数在多边形内
+            return true;
+        }
+    }
+
+    private static final double EARTH_RADIUS =6371393;
+
+    public static double getDistance(Point2D pointA, Point2D pointB) {
+        // 经纬度&#xff08;角度&#xff09;转弧度。弧度用作参数&#xff0c;以调用Math.cos和Math.sin
+        double radiansAX = Math.toRadians(pointA.getX()); // A经弧度
+        double radiansAY = Math.toRadians(pointA.getY()); // A纬弧度
+        double radiansBX = Math.toRadians(pointB.getX()); // B经弧度
+        double radiansBY = Math.toRadians(pointB.getY()); // B纬弧度
+
+        // cosβ1cosβ2cos&#xff08;α1-α2&#xff09;&#43;sinβ1sinβ2
+        double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX)
+                + Math.sin(radiansAY) * Math.sin(radiansBY);
+        double acos = Math.acos(cos); // 反余弦值
+        return EARTH_RADIUS * acos; // 最终结果
+    }
+}

+ 158 - 0
xzl-admin/src/main/java/com/xzl/web/utils/CommonUtils.java

@@ -0,0 +1,158 @@
+package com.xzl.web.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @Description:
+ * @Author: gl
+ * @CreateDate: 2018/9/4 11:32
+ * @UpdateUser:
+ * @UpdateDate: 2018/9/4 11:32
+ * @UpdateRemark:
+ * @Version: 1.0
+ */
+public class CommonUtils {
+    public static void Copy(Object source, Object dest) throws Exception {
+        // 获取属性
+        BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass(), Object.class);
+        PropertyDescriptor[] sourceProperty = sourceBean.getPropertyDescriptors();
+
+        BeanInfo destBean = Introspector.getBeanInfo(dest.getClass(), Object.class);
+        PropertyDescriptor[] destProperty = destBean.getPropertyDescriptors();
+
+        try {
+            for (int i = 0; i < sourceProperty.length; i++) {
+
+                for (int j = 0; j < destProperty.length; j++) {
+
+                    if (sourceProperty[i].getName().equals(destProperty[j].getName()) && sourceProperty[i].getPropertyType() == destProperty[j].getPropertyType()) {
+                        // 调用source的getter方法和dest的setter方法
+                        destProperty[j].getWriteMethod().invoke(dest, sourceProperty[i].getReadMethod().invoke(source));
+                        break;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw new Exception("属性复制失败:" + e.getMessage());
+        }
+    }
+
+    public static String frontCompWithZore(int sourceDate, int formatLength) {
+        /*
+         * 0 指前面补充零
+         * formatLength 字符总长度为 formatLength
+         * d 代表为正数。
+         */
+        String newString = String.format("%0" + formatLength + "d", sourceDate);
+        return newString;
+    }
+
+    /*将一个 JavaBean 对象转化为一个  Map*/
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public static Map convertBean(Object bean)
+            throws IntrospectionException, IllegalAccessException, InvocationTargetException {
+        Class type = bean.getClass();
+        Map returnMap = new HashMap();
+        BeanInfo beanInfo = Introspector.getBeanInfo(type);
+
+        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+        for (int i = 0; i < propertyDescriptors.length; i++) {
+            PropertyDescriptor descriptor = propertyDescriptors[i];
+            String propertyName = descriptor.getName();
+            if (!propertyName.equals("class")) {
+                Method readMethod = descriptor.getReadMethod();
+                Object result = readMethod.invoke(bean, new Object[0]);
+                if (result != null) {
+                    returnMap.put(propertyName, result);
+                } else {
+                    returnMap.put(propertyName, "");
+                }
+            }
+        }
+        return returnMap;
+    }
+
+    /*将一个 Map 对象转化为一个 JavaBean*/
+    @SuppressWarnings("rawtypes")
+    public static Object convertMap(Class type, Map map)
+            throws IntrospectionException, IllegalAccessException,
+            InstantiationException, InvocationTargetException {
+        BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性
+        Object obj = type.newInstance(); // 创建 JavaBean 对象
+
+        // 给 JavaBean 对象的属性赋值
+        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+        for (int i = 0; i < propertyDescriptors.length; i++) {
+            PropertyDescriptor descriptor = propertyDescriptors[i];
+            String propertyName = descriptor.getName();
+
+            if (map.containsKey(propertyName)) {
+                // 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。
+                Object value = map.get(propertyName);
+
+                Object[] args = new Object[1];
+                args[0] = value;
+
+                descriptor.getWriteMethod().invoke(obj, args);
+            }
+        }
+        return obj;
+    }
+
+    //讲map中值为“”转为null
+    public static Map<String, Object> emptyToNull(Map<String, Object> map) {
+        Set<String> set = map.keySet();
+        if (set != null && !set.isEmpty()) {
+            for (String key : set) {
+                if (map.get(key) == "") {
+                    map.put(key, null);
+                }
+            }
+        }
+        return map;
+    }
+
+
+    //生成订单号
+    public static String generatOrderNo(String preOrder, String orderNo) {
+        if (StringUtils.isEmpty(orderNo)) {
+            return preOrder + getCurrDate() + "0001";
+        } else {
+            int i = Integer.parseInt(orderNo);
+            i++;
+            String num = String.valueOf(i);
+            return preOrder + getCurrDate() + numString(num);
+        }
+    }
+
+    public static String numString(String str) {//递归生成后五位字符串
+        if (str.length() == 4) {
+            return str;
+        } else {
+            return numString("0" + str);
+        }
+    }
+
+    public static String getCurrDate() {
+        SimpleDateFormat sf = new SimpleDateFormat("yyMMdd");
+        String date = sf.format(new Date());
+        return date;
+    }
+
+    public static Date addDays(Date date, int amount) {
+        Calendar now = Calendar.getInstance();
+        now.setTime(date);
+        now.set(Calendar.DATE, now.get(Calendar.DATE) + amount);
+        return now.getTime();
+    }
+
+}

+ 72 - 0
xzl-admin/src/main/java/com/xzl/web/utils/Constant.java

@@ -0,0 +1,72 @@
+/*
+ * File Name: com.huawei.utils.Constant.java
+ *
+ * Copyright Notice:
+ *      Copyright  1998-2008, Huawei Technologies Co., Ltd.  ALL Rights Reserved.
+ *
+ *      Warning: This computer software sourcecode is protected by copyright law
+ *      and international treaties. Unauthorized reproduction or distribution
+ *      of this sourcecode, or any portion of it, may result in severe civil and
+ *      criminal penalties, and will be prosecuted to the maximum extent
+ *      possible under the law.
+ */
+package com.xzl.web.utils;
+
+public class Constant {
+
+    // purchase and get : base_url,appid,secret
+
+    // please replace the IP and Port, when you use the demo.
+//    https://rtccall.cn-north-1.myhuaweicloud.cn:443
+    public static final String BASE_URL = "https://rtccall.cn-north-1.myhuaweicloud.cn:443";
+
+    // please replace the appId and secret, when you use the demo.
+    public static final String CLICK2CALL_APPID = "VL4u4ipBYERwDOBIRDIO7Q4Ur2vz";
+    public static final String CLICK2CALL_SECRET = "sSZJIb4zbe7a4NQhXzXdyEMgrNze";
+    public static final String CALLNOTIFY_APPID = "*****";
+    public static final String CALLNOTIFY_SECRET = "*****";
+    public static final String CALLVERIFY_APPID = "*****";
+    public static final String CALLVERIFY_SECRET = "*****";
+    public static final String TRANSPARENTLY_TRANSMITS_APPID = "*****";
+    public static final String TRANSPARENTLY_TRANSMITS_SECRET = "*****";
+
+    /*
+     *IP and port of callback url.
+     *please replace the IP and Port of your Application deployment environment address, when you use the demo.
+     */
+    public static final String CALLBACK_BASE_URL = "http://192.88.88.88:9999";
+
+    /*
+     * complete callback url
+     * please replace uri, when you use the demo.
+     */
+    public static final String STATUS_CALLBACK_URL = CALLBACK_BASE_URL + "/status";
+    public static final String FEE_CALLBACK_URL = CALLBACK_BASE_URL + "/fee";
+
+    // *************************** The following constants do not need to be
+    // modified *********************************//
+
+    /*
+     * request header
+     * 1. HEADER_APP_AUTH
+     * 2. HEADER_APP_WSSE
+     * 3. AUTH_HEADER_VALUE
+     * 4. WSSE_HEADER_FORMAT
+     */
+    public static final String HEADER_APP_AUTH = "Authorization";
+    public static final String HEADER_APP_WSSE = "X-WSSE";
+    public static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\"";
+    public static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"";
+
+    /*
+     * Voice Call:
+     * 1. VOICE_CALL_COMERCIAL
+     * 2. VOICE_VERIFICATION_COMERCIAL
+     * 3. CALL_NOTIFY_COMERCIAL
+     * 4. VOICE_FILE_DOWNLOAD
+     */
+    public static final String VOICE_CALL_COMERCIAL = BASE_URL + "/rest/httpsessions/click2Call/v2.0";
+    public static final String VOICE_VERIFICATION_COMERCIAL = BASE_URL + "/rest/httpsessions/callVerify/v1.0";
+    public static final String CALL_NOTIFY_COMERCIAL = BASE_URL + "/rest/httpsessions/callnotify/";
+    public static final String VOICE_FILE_DOWNLOAD = BASE_URL + "/rest/provision/voice/record/v1.0";
+}

+ 58 - 0
xzl-admin/src/main/java/com/xzl/web/utils/Constants.java

@@ -0,0 +1,58 @@
+package com.xzl.web.utils;
+
+
+public interface Constants {
+
+  /*
+  interface WORK_WX {
+    String CORP_ID = "ww5ea99d7de8737594";
+    String AGENT_ID = "1000002";
+    String APP_SECRET = "WmUdM2ZqfGhn86g_hKF8TIPhdjta2nEVPuCFYA-ia0U";
+    String APP_CONTACT_SECRET = "dS7HAi6pWDzXpFOLnRo9b1G9nS3kroI8KTP9E56NFuU"; // 客户联系
+    String APP_CONTACT_SYNC_SECRET = "FmW3W3eCDj0thKY12ByvASmEFp7T3xV0jUv-tTYo_Iw"; // 通讯录同步
+  }
+  */
+
+  interface WORK_WX {
+    String CORP_ID = "ww6c559ce6a08d8e7e";
+    String AGENT_ID = "1000116";
+    String APP_SECRET = "8iF0-JnsOM491AoE-UxfH26nx-RI_qv3AiBpgQGS99k";
+    String APP_CONTACT_SYNC_SECRET = "pm3dVjyCga0CHduxNqkvzhinLQmH5PshVQSNJiK7zWk"; // 通讯录同步
+  }
+
+  interface OSS {
+    String accessKeyId = "LTAI4Fq9piDhjyBprDkq6LCy";
+    String accessKeySecret = "WaWQOn6gXod13WLEp8cr4ljUdvcbXJ";
+  }
+
+  interface STATUS {
+    int INIT = 0; // 初始状态
+    int VALID = 1; // 有效
+    int INVALID = 2; // 无效
+  }
+
+  interface TERMINAL_STATUS {
+    int APPLY = 0;  // 终端店申请
+    int ENABLED = 1; // 正式终端店
+  }
+
+  interface WORKFLOW_TYPE {
+    int APPLY = 1;  // 终端点申请流程
+    int REPAIR = 2; // 报修流程
+    int DESTORY = 3; // 报废流程
+  }
+
+  interface WORKFLOW_STATUS {
+    int INIT = 0; // 流程初始状态,待审核
+    int PASS = 1; // 审核通过
+    int REJECT = 2; // 审核驳回
+  }
+
+
+  interface EMPLOYEE_ROLE {
+    String MARKET_LEADER = "2ec838be59e2486c9ad4072c9c9e9fa5"; // 市场部主任
+    String STATION_LEADER = "455b7620c2a943bf81bd0f76b4089f4f"; // 管理所所长
+    String SALE_LEADER = "012943fd6be34ea09fb1b1c250b10124"; // 营销部主任
+  }
+
+}

+ 101 - 0
xzl-admin/src/main/java/com/xzl/web/utils/ConstructUtils.java

@@ -0,0 +1,101 @@
+package com.xzl.web.utils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.collections.CollectionUtils;
+
+public final class ConstructUtils {
+    private static final int MAP_PAIR_LEN = 2;
+
+    private ConstructUtils() {
+    }
+
+    public static <String, T> Map<String, T> map(Object... args) {
+        if (args != null && args.length != 0) {
+            if (args.length % 2 != 0) {
+                throw new RuntimeException("数组长度必须为2的倍数");
+            } else {
+                Map<String, T> result = new HashMap<>(args.length / 2);
+
+                for(int i = 0; i < args.length - 1; i += 2) {
+                    result.put((String) args[i], (T) args[i + 1]);
+                }
+
+                return result;
+            }
+        } else {
+            return new HashMap<>();
+        }
+    }
+
+    @SafeVarargs
+    public static <T> List<T> list(T... args) {
+        if (args != null && args.length != 0) {
+            List<T> result = new ArrayList<>(args.length);
+            Collections.addAll(result, args);
+            return result;
+        } else {
+            return new ArrayList<>();
+        }
+    }
+
+    @SafeVarargs
+    public static <T> List<T> list(Collection<T>... args) {
+        if (args != null && args.length != 0) {
+            List<T> result = new ArrayList<>();
+            Collection[] var2 = args;
+            int var3 = args.length;
+
+            for(int var4 = 0; var4 < var3; ++var4) {
+                Collection<T> o = var2[var4];
+                result.addAll(o);
+            }
+
+            return result;
+        } else {
+            return new ArrayList<>();
+        }
+    }
+
+    @SafeVarargs
+    public static <T> Set<T> set(T... args) {
+        if (args != null && args.length != 0) {
+            Set<T> result = new HashSet<>(args.length);
+            Collections.addAll(result, args);
+            return result;
+        } else {
+            return new HashSet<>();
+        }
+    }
+
+    @SafeVarargs
+    public static <T> Set<T> set(Collection<T>... args) {
+        if (args != null && args.length != 0) {
+            Set<T> result = new HashSet<>();
+            Collection[] var2 = args;
+            int var3 = args.length;
+
+            for(int var4 = 0; var4 < var3; ++var4) {
+                Collection<T> o = var2[var4];
+                result.addAll(o);
+            }
+
+            return result;
+        } else {
+            return new HashSet<>();
+        }
+    }
+
+    public static List<Map<String, Object>> cast(List<Map> list) {
+        List<Map<String, Object>> result = new ArrayList<>(list.size());
+        CollectionUtils.addAll(result, list.iterator());
+        return result;
+    }
+}
+

+ 55 - 0
xzl-admin/src/main/java/com/xzl/web/utils/DistanceUtils.java

@@ -0,0 +1,55 @@
+package com.xzl.web.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ClassName: DistanceUtils
+ * @Description: 用于
+ * Modification History:
+ * Date                  Author                 Version       Description
+ * ---------------------------------------------------------
+ * 2023/6/9             ZhangShuling      v1.0.0
+ */
+public class DistanceUtils {
+  public final static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
+
+  /**
+   * 高德坐标转百度坐标
+   *
+   * @param gd_lon 经度
+   * @param gd_lat 纬度
+   * @return
+   */
+  public static Map<String, Double> gd2bd(double gd_lon, double gd_lat) {
+    Map<String, Double> data = new HashMap<>();
+    double x = gd_lon, y = gd_lat;
+    double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
+    double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
+    double bd_lon = z * Math.cos(theta) + 0.0065;
+    double bd_lat = z * Math.sin(theta) + 0.006;
+    data.put("lon", bd_lon);
+    data.put("lat", bd_lat);
+    return data;
+  }
+
+
+  /**
+   * 百度坐标转换高德坐标
+   *
+   * @param bd_lon 经度
+   * @param bd_lat 纬度
+   * @return
+   */
+  public static Map<String, Double> bd2gd(double bd_lon, double bd_lat) {
+    double x = bd_lon - 0.0065, y = bd_lat - 0.006;
+    double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
+    double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
+    double gd_lon = z * Math.cos(theta);
+    double gd_lat = z * Math.sin(theta);
+    Map<String, Double> data = new HashMap<>();
+    data.put("lon", gd_lon);
+    data.put("lat", gd_lat);
+    return data;
+  }
+}

+ 59 - 0
xzl-admin/src/main/java/com/xzl/web/utils/ExcelReader.java

@@ -0,0 +1,59 @@
+package com.xzl.web.utils;
+
+
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ExcelReader {
+
+    public static Object[][][] parseExcel(InputStream fis) throws IOException {
+        // 读取Excel文件
+        HSSFWorkbook workbook = new HSSFWorkbook(fis);
+
+        // 遍历所有工作表
+        int sheetCount = workbook.getNumberOfSheets();
+        Object[][][] resultArray = new Object[sheetCount][][];
+        for (int i = 0; i < sheetCount; i++) {
+            HSSFSheet sheet = workbook.getSheetAt(i);
+            int rowCount = sheet.getPhysicalNumberOfRows();
+            HSSFRow firstRow = sheet.getRow(0);
+            if(firstRow==null){
+                continue;
+            }
+            int colCount = firstRow.getPhysicalNumberOfCells();
+            Object[][] sheetArray = new Object[rowCount][colCount];
+
+            // 遍历所有行和列,将单元格数据存储到数组中
+            for (int j = 0; j < rowCount; j++) {
+                HSSFRow row = sheet.getRow(j);
+                if (row != null) {
+                    for (int k = 0; k < colCount; k++) {
+                        HSSFCell cell = row.getCell(k);
+                        if (cell != null) {
+                            switch (cell.getCellTypeEnum()) {
+                                case NUMERIC:
+                                    sheetArray[j][k] = cell.getNumericCellValue();
+                                    break;
+                                case STRING:
+                                    sheetArray[j][k] = cell.getStringCellValue();
+                                    break;
+                                default:
+                                    sheetArray[j][k] = null;
+                            }
+                        }
+                    }
+                }
+            }
+            // 将工作表数组存储到结果数组中
+            resultArray[i] = sheetArray;
+        }
+        // 关闭文件流
+        fis.close();
+        return resultArray;
+    }
+}

+ 373 - 0
xzl-admin/src/main/java/com/xzl/web/utils/HttpsUtil.java

@@ -0,0 +1,373 @@
+package com.xzl.web.utils;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.*;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContextBuilder;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.FileBody;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+
+import javax.net.ssl.*;
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@SuppressWarnings("deprecation")
+public class HttpsUtil extends DefaultHttpClient {
+    public final static String HTTPGET = "GET";
+
+    public final static String HTTPPUT = "PUT";
+
+    public final static String HTTPPOST = "POST";
+
+    public final static String HTTPDELETE = "DELETE";
+
+    public final static String HTTPACCEPT = "Accept";
+
+    public final static String CONTENT_LENGTH = "Content-Length";
+
+    public final static String CHARSET_UTF8 = "UTF-8";
+
+    private static CloseableHttpClient httpClient = getHttpClient();
+
+    public static CloseableHttpClient getHttpClient() {
+        SSLContext sslcontext = null;
+        try {
+            sslcontext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+
+                @Override
+                public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+                    return true;
+                }
+            }).build();
+        } catch (KeyManagementException e) {
+            return null;
+        } catch (NoSuchAlgorithmException e) {
+            return null;
+        } catch (KeyStoreException e) {
+            return null;
+        }
+
+        // Allow TLSv1, TLSv1.1, TLSv1.2 protocol only
+        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,
+                new String[] { "TLSv1", "TLSv1.1", "TLSv1.2" }, null,
+                SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+
+        CloseableHttpClient httpclient = HttpClients.custom()
+                .setDefaultRequestConfig(RequestConfig.custom().setRedirectsEnabled(false).build())
+                .setSSLSocketFactory(sslsf).build();
+
+        return httpclient;
+    }
+
+    public HostnameVerifier hv = new HostnameVerifier() {
+        public boolean verify(String urlHostName, SSLSession session) {
+            return true;
+        }
+    };
+
+    public void trustAllHttpsCertificates() throws Exception {
+        TrustManager[] trustAllCerts = new TrustManager[1];
+        TrustManager tm = new miTM();
+        trustAllCerts[0] = tm;
+        SSLContext sc = SSLContext.getInstance("SSL");
+        sc.init(null, trustAllCerts, null);
+        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+    }
+
+    static class miTM implements TrustManager, X509TrustManager {
+        public X509Certificate[] getAcceptedIssuers() {
+            return null;
+        }
+
+        public boolean isServerTrusted(X509Certificate[] certs) {
+            return true;
+        }
+
+        public boolean isClientTrusted(X509Certificate[] certs) {
+            return true;
+        }
+
+        public void checkServerTrusted(X509Certificate[] certs, String authType)
+                throws CertificateException {
+            return;
+        }
+
+        public void checkClientTrusted(X509Certificate[] certs, String authType)
+                throws CertificateException {
+            return;
+        }
+    }
+
+    public HttpResponse doPostJson(String url, Map<String, String> headerMap, String content) {
+        HttpPost request = new HttpPost(url);
+        addRequestHeader(request, headerMap);
+
+        request.setEntity(new StringEntity(content, ContentType.APPLICATION_JSON));
+
+        return executeHttpRequest(request);
+    }
+
+    public StreamClosedHttpResponse doPostMultipartFile(String url, Map<String, String> headerMap, File file) {
+        HttpPost request = new HttpPost(url);
+        addRequestHeader(request, headerMap);
+
+        FileBody fileBody = new FileBody(file);
+        // Content-Type:multipart/form-data;
+        // boundary=----WebKitFormBoundarypJTQXMOZ3dLEzJ4b
+        HttpEntity reqEntity = (HttpEntity) MultipartEntityBuilder.create().addPart("file", fileBody).build();
+        request.setEntity(reqEntity);
+
+        return (StreamClosedHttpResponse) executeHttpRequest(request);
+    }
+
+    public StreamClosedHttpResponse doPostJsonGetStatusLine(String url, Map<String, String> headerMap, String content) {
+        HttpPost request = new HttpPost(url);
+        addRequestHeader(request, headerMap);
+
+        request.setEntity(new StringEntity(content, ContentType.APPLICATION_JSON));
+
+        HttpResponse response = executeHttpRequest(request);
+        if (null == response) {
+            System.out.println("The response body is null.");
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    public StreamClosedHttpResponse doPostJsonGetStatusLine(String url, String content) {
+        HttpPost request = new HttpPost(url);
+
+        request.setEntity(new StringEntity(content, ContentType.APPLICATION_JSON));
+
+        HttpResponse response = executeHttpRequest(request);
+        if (null == response) {
+            System.out.println("The response body is null.");
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    public List<NameValuePair> paramsConverter(Map<String, Object> params) {
+        List<NameValuePair> nvps = new LinkedList<NameValuePair>();
+        Set<Map.Entry<String, Object>> paramsSet = params.entrySet();
+        for (Map.Entry<String, Object> paramEntry : paramsSet) {
+            nvps.add(new BasicNameValuePair(paramEntry.getKey(), paramEntry.getValue().toString()));
+        }
+
+        return nvps;
+    }
+
+    public StreamClosedHttpResponse doPostFormUrlEncodedGetStatusLine(String url) throws Exception {
+        HttpPost request = new HttpPost(url);
+
+        HttpResponse response = executeHttpRequest(request);
+        if (null == response) {
+            System.out.println("The response body is null.");
+            throw new Exception();
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    public StreamClosedHttpResponse doPostFormUrlEncodedGetStatusLine(String url, Map<String, String> headerMap)
+            throws Exception {
+        HttpPost request = new HttpPost(url);
+        addRequestHeader(request, headerMap);
+
+        HttpResponse response = executeHttpRequest(request);
+        if (null == response) {
+            System.out.println("The response body is null.");
+            throw new Exception();
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    public StreamClosedHttpResponse doPostFormUrlEncodedGetStatusLine(String url, List<NameValuePair> formParams)
+            throws Exception {
+        HttpPost request = new HttpPost(url);
+
+        request.setEntity(new UrlEncodedFormEntity(formParams));
+
+        HttpResponse response = executeHttpRequest(request);
+        if (null == response) {
+            System.out.println("The response body is null.");
+            throw new Exception();
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    public StreamClosedHttpResponse doPostFormUrlEncodedGetStatusLine(String url, Map<String, String> headerMap,
+            List<NameValuePair> formParams) throws Exception {
+        HttpPost request = new HttpPost(url);
+        addRequestHeader(request, headerMap);
+
+        request.setEntity(new UrlEncodedFormEntity(formParams));
+
+        HttpResponse response = executeHttpRequest(request);
+        if (null == response) {
+            System.out.println("The response body is null.");
+            throw new Exception();
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    public HttpResponse doPutJson(String url, Map<String, String> headerMap, String content) {
+        HttpPut request = new HttpPut(url);
+        addRequestHeader(request, headerMap);
+
+        request.setEntity(new StringEntity(content, ContentType.APPLICATION_JSON));
+
+        return executeHttpRequest(request);
+    }
+
+    public HttpResponse doPut(String url, Map<String, String> headerMap) {
+        HttpPut request = new HttpPut(url);
+        addRequestHeader(request, headerMap);
+
+        return executeHttpRequest(request);
+    }
+
+    public StreamClosedHttpResponse doPutJsonGetStatusLine(String url, Map<String, String> headerMap, String content) {
+        HttpResponse response = doPutJson(url, headerMap, content);
+        if (null == response) {
+            System.out.println("The response body is null.");
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    public StreamClosedHttpResponse doPutGetStatusLine(String url, Map<String, String> headerMap) {
+        HttpResponse response = doPut(url, headerMap);
+        if (null == response) {
+            System.out.println("The response body is null.");
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    public HttpResponse doGetWithParas(String url, List<NameValuePair> queryParams, Map<String, String> headerMap)
+            throws Exception {
+        HttpGet request = new HttpGet();
+        addRequestHeader(request, headerMap);
+
+        URIBuilder builder;
+        try {
+            builder = new URIBuilder(url);
+        } catch (URISyntaxException e) {
+            System.out.printf("URISyntaxException: {}", e);
+            throw new Exception(e);
+        }
+
+        if (queryParams != null && !queryParams.isEmpty()) {
+            builder.setParameters(queryParams);
+        }
+        request.setURI(builder.build());
+
+        return executeHttpRequest(request);
+    }
+
+    public StreamClosedHttpResponse doGetWithParasGetStatusLine(String url, List<NameValuePair> queryParams,
+            Map<String, String> headerMap) throws Exception {
+        HttpResponse response = doGetWithParas(url, queryParams, headerMap);
+        if (null == response) {
+            System.out.println("The response body is null.");
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    public HttpResponse doDelete(String url, Map<String, String> headerMap) {
+        HttpDelete request = new HttpDelete(url);
+        addRequestHeader(request, headerMap);
+
+        return executeHttpRequest(request);
+    }
+
+    public StreamClosedHttpResponse doDeleteGetStatusLine(String url, Map<String, String> headerMap) {
+        HttpResponse response = doDelete(url, headerMap);
+        if (null == response) {
+            System.out.println("The response body is null.");
+        }
+
+        return (StreamClosedHttpResponse) response;
+    }
+
+    private static void addRequestHeader(HttpUriRequest request, Map<String, String> headerMap) {
+        if (headerMap == null) {
+            return;
+        }
+
+        for (String headerName : headerMap.keySet()) {
+            if (CONTENT_LENGTH.equalsIgnoreCase(headerName)) {
+                continue;
+            }
+
+            String headerValue = headerMap.get(headerName);
+            request.addHeader(headerName, headerValue);
+        }
+    }
+
+    private HttpResponse executeHttpRequest(HttpUriRequest request) {
+        HttpResponse response = null;
+
+        try {
+            response = httpClient.execute(request);
+        } catch (Exception e) {
+            System.out.println("executeHttpRequest failed.");
+            System.out.println(e.getStackTrace());
+        } finally {
+            try {
+                response = new StreamClosedHttpResponse(response);
+            } catch (IOException e) {
+                System.out.println("IOException: " + e.getMessage());
+            }
+        }
+
+        return response;
+    }
+
+    public String getHttpResponseBody(HttpResponse response) throws UnsupportedOperationException, IOException {
+        if (response == null) {
+            return null;
+        }
+
+        String body = null;
+
+        if (response instanceof StreamClosedHttpResponse) {
+            body = ((StreamClosedHttpResponse) response).getContent();
+        } else {
+            HttpEntity entity = response.getEntity();
+            if (entity != null && entity.isStreaming()) {
+                String encoding = entity.getContentEncoding() != null ? entity.getContentEncoding().getValue() : null;
+                body = StreamUtil.inputStream2String(entity.getContent(), encoding);
+            }
+        }
+
+        return body;
+    }
+}

+ 131 - 0
xzl-admin/src/main/java/com/xzl/web/utils/JsonUtil.java

@@ -0,0 +1,131 @@
+/*
+ * Copyright Notice:
+ *      Copyright  1998-2008, Huawei Technologies Co., Ltd.  ALL Rights Reserved.
+ *
+ *      Warning: This computer software sourcecode is protected by copyright law
+ *      and international treaties. Unauthorized reproduction or distribution
+ *      of this sourcecode, or any portion of it, may result in severe civil and
+ *      criminal penalties, and will be prosecuted to the maximum extent
+ *      possible under the law.
+ */
+
+package com.xzl.web.utils;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import java.io.IOException;
+
+public class JsonUtil {
+
+    private static ObjectMapper objectMapper;
+
+    static {
+        objectMapper = new ObjectMapper();
+
+        // 设置FAIL_ON_EMPTY_BEANS属性,当序列化空对象不要抛异常
+        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+
+        // 设置FAIL_ON_UNKNOWN_PROPERTIES属性,当JSON字符串中存在Java对象没有的属性,忽略
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+    }
+
+    /**
+     * Convert Object to JsonString
+     * 
+     * @param jsonObj
+     * @return
+     */
+    public static String jsonObj2Sting(Object jsonObj) {
+        String jsonString = null;
+
+        try {
+            jsonString = objectMapper.writeValueAsString(jsonObj);
+        } catch (IOException e) {
+            System.out.printf("pasre json Object[{}] to string failed.", jsonString);
+        }
+
+        return jsonString;
+    }
+
+    /**
+     * Convert JsonString to Simple Object
+     * 
+     * @param jsonString
+     * @param cls
+     * @return
+     */
+    public static <T> T jsonString2SimpleObj(String jsonString, Class<T> cls) {
+        T jsonObj = null;
+
+        try {
+            jsonObj = objectMapper.readValue(jsonString, cls);
+        } catch (IOException e) {
+            System.out.printf("pasre json Object[{}] to string failed.", jsonString);
+        }
+
+        return jsonObj;
+    }
+
+    /**
+     * Method that will convert object to the ObjectNode.
+     *
+     * @param value the source data; if null, will return null.
+     * @return the ObjectNode data after converted.
+     * @throws JsonException
+     */
+    public static <T> ObjectNode convertObject2ObjectNode(T object) throws Exception {
+        if (null == object) {
+            return null;
+        }
+
+        ObjectNode objectNode = null;
+
+        if (object instanceof String) {
+            objectNode = convertJsonStringToObject((String) object, ObjectNode.class);
+        } else {
+            objectNode = convertValue(object, ObjectNode.class);
+        }
+
+        return objectNode;
+    }
+
+    /**
+     * Method that will convert the json string to destination by the type(cls).
+     * 
+     * @param jsonString the source json string; if null, will return null.
+     * @param cls        the destination data type.
+     * @return
+     * @throws JsonException
+     */
+    public static <T> T convertJsonStringToObject(String jsonString, Class<T> cls) throws Exception {
+        if (StringUtil.strIsNullOrEmpty(jsonString)) {
+            return null;
+        }
+
+        try {
+            T object = objectMapper.readValue(jsonString, cls);
+            return object;
+        } catch (Exception e) {
+            throw new Exception(e);
+        }
+    }
+
+    /**
+     * Method that will convert from given value into instance of given value type.
+     * 
+     * @param fromValue
+     * @param toValueType
+     * @return
+     * @throws JsonException
+     */
+    private static <T> T convertValue(Object fromValue, Class<T> toValueType) throws Exception {
+        try {
+            return objectMapper.convertValue(fromValue, toValueType);
+        } catch (IllegalArgumentException e) {
+            throw new Exception(e);
+        }
+    }
+}

+ 19 - 0
xzl-admin/src/main/java/com/xzl/web/utils/MyX509TrustManager.java

@@ -0,0 +1,19 @@
+package com.xzl.web.utils;
+
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+public class MyX509TrustManager implements X509TrustManager {
+
+    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+    }
+
+    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+    }
+
+    public X509Certificate[] getAcceptedIssuers() {
+        return null;
+    }
+
+}

+ 132 - 0
xzl-admin/src/main/java/com/xzl/web/utils/RequestUtils.java

@@ -0,0 +1,132 @@
+package com.xzl.web.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.util.Map;
+
+public class RequestUtils {
+
+    private static final Logger LOG = LoggerFactory.getLogger(RequestUtils.class);
+
+    public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr, Map<String, String> headers) {
+        JSONObject jsonObject = null;
+        StringBuffer buffer = new StringBuffer();
+        try {
+            TrustManager[] tm = {new MyX509TrustManager()};
+            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+            SSLSocketFactory ssf = sslContext.getSocketFactory();
+            URL url = new URL(requestUrl);
+            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
+            httpUrlConn.setSSLSocketFactory(ssf);
+            httpUrlConn.setDoOutput(true);
+            httpUrlConn.setDoInput(true);
+            httpUrlConn.setUseCaches(false);
+            httpUrlConn.setRequestMethod(requestMethod.toUpperCase());
+
+            if (headers != null) {
+                for (Map.Entry<String, String> entry : headers.entrySet()) {
+                    httpUrlConn.setRequestProperty(entry.getKey(), entry.getValue());
+                }
+            }
+
+            if ("GET".equalsIgnoreCase(requestMethod)) httpUrlConn.connect();
+            if ("POST".equalsIgnoreCase(requestMethod)) {
+                httpUrlConn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
+                httpUrlConn.setRequestProperty("accept", "application/json");
+            }
+
+            if (null != outputStr) {
+                OutputStream outputStream = httpUrlConn.getOutputStream();
+                outputStream.write(outputStr.getBytes("UTF-8"));
+                outputStream.close();
+            }
+            InputStream inputStream = httpUrlConn.getInputStream();
+            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
+            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+            String str = null;
+            while ((str = bufferedReader.readLine()) != null) {
+                buffer.append(str);
+            }
+            if (LOG.isDebugEnabled()) {
+                LOG.debug(buffer.toString());
+            }
+            bufferedReader.close();
+            inputStreamReader.close();
+            inputStream.close();
+            inputStream = null;
+            httpUrlConn.disconnect();
+            jsonObject = JSON.parseObject(buffer.toString());
+        } catch (Exception e) {
+            LOG.error("", e);
+            Object o = JSON.parse(buffer.toString());
+            if (o instanceof JSONArray) {
+                jsonObject = new JSONObject(ConstructUtils.map("items", JSON.parseArray(buffer.toString())));
+            }
+        }
+        return jsonObject;
+    }
+
+    /**
+     * 方法名:httpRequest</br>
+     * 详述:发送http请求</br>
+     *
+     * @param requestUrl
+     * @param requestMethod
+     * @param outputStr
+     * @return 说明返回值含义
+     */
+    public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
+        return httpRequest(requestUrl, requestMethod, outputStr, null);
+    }
+
+
+    public static String getIpAddress(HttpServletRequest request) {
+        if (request == null) {
+            return "0.0.0.0";
+        }
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+            if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
+                //根据网卡取本机配置的IP
+                InetAddress inet = null;
+                try {
+                    inet = InetAddress.getLocalHost();
+                } catch (UnknownHostException e) {
+                    // e.printStackTrace();
+                }
+                ip = inet.getHostAddress();
+            }
+        }
+        return ip;
+    }
+}

+ 186 - 0
xzl-admin/src/main/java/com/xzl/web/utils/StreamClosedHttpResponse.java

@@ -0,0 +1,186 @@
+/*
+ * Copyright Notice:
+ *      Copyright  1998-2008, Huawei Technologies Co., Ltd.  ALL Rights Reserved.
+ *
+ *      Warning: This computer software sourcecode is protected by copyright law
+ *      and international treaties. Unauthorized reproduction or distribution
+ *      of this sourcecode, or any portion of it, may result in severe civil and
+ *      criminal penalties, and will be prosecuted to the maximum extent
+ *      possible under the law.
+ */
+package com.xzl.web.utils;
+
+import org.apache.http.*;
+import org.apache.http.params.HttpParams;
+
+import java.io.IOException;
+import java.util.Locale;
+
+@SuppressWarnings("deprecation")
+public class StreamClosedHttpResponse implements HttpResponse {
+
+    private final HttpResponse original;
+
+    private final String content;
+
+    public StreamClosedHttpResponse(final HttpResponse original) throws UnsupportedOperationException, IOException {
+        this.original = original;
+
+        HttpEntity entity = original.getEntity();
+        if (entity != null && entity.isStreaming()) {
+            String encoding = entity.getContentEncoding() != null ? entity.getContentEncoding().getValue() : null;
+            content = StreamUtil.inputStream2String(entity.getContent(), encoding);
+        } else {
+            content = null;
+        }
+    }
+
+    @Override
+    public StatusLine getStatusLine() {
+        return original.getStatusLine();
+    }
+
+    @Override
+    public void setStatusLine(final StatusLine statusline) {
+        original.setStatusLine(statusline);
+    }
+
+    @Override
+    public void setStatusLine(final ProtocolVersion ver, final int code) {
+        original.setStatusLine(ver, code);
+    }
+
+    @Override
+    public void setStatusLine(final ProtocolVersion ver, final int code, final String reason) {
+        original.setStatusLine(ver, code, reason);
+    }
+
+    @Override
+    public void setStatusCode(final int code) throws IllegalStateException {
+        original.setStatusCode(code);
+    }
+
+    @Override
+    public void setReasonPhrase(final String reason) throws IllegalStateException {
+        original.setReasonPhrase(reason);
+    }
+
+    @Override
+    public HttpEntity getEntity() {
+        return original.getEntity();
+    }
+
+    @Override
+    public void setEntity(final HttpEntity entity) {
+        original.setEntity(entity);
+    }
+
+    @Override
+    public Locale getLocale() {
+        return original.getLocale();
+    }
+
+    @Override
+    public void setLocale(final Locale loc) {
+        original.setLocale(loc);
+    }
+
+    @Override
+    public ProtocolVersion getProtocolVersion() {
+        return original.getProtocolVersion();
+    }
+
+    @Override
+    public boolean containsHeader(final String name) {
+        return original.containsHeader(name);
+    }
+
+    @Override
+    public Header[] getHeaders(final String name) {
+        return original.getHeaders(name);
+    }
+
+    @Override
+    public Header getFirstHeader(final String name) {
+        return original.getFirstHeader(name);
+    }
+
+    @Override
+    public Header getLastHeader(final String name) {
+        return original.getLastHeader(name);
+    }
+
+    @Override
+    public Header[] getAllHeaders() {
+        return original.getAllHeaders();
+    }
+
+    @Override
+    public void addHeader(final Header header) {
+        original.addHeader(header);
+    }
+
+    @Override
+    public void addHeader(final String name, final String value) {
+        original.addHeader(name, value);
+    }
+
+    @Override
+    public void setHeader(final Header header) {
+        original.setHeader(header);
+    }
+
+    @Override
+    public void setHeader(final String name, final String value) {
+        original.setHeader(name, value);
+    }
+
+    @Override
+    public void setHeaders(final Header[] headers) {
+        original.setHeaders(headers);
+    }
+
+    @Override
+    public void removeHeader(final Header header) {
+        original.removeHeader(header);
+    }
+
+    @Override
+    public void removeHeaders(final String name) {
+        original.removeHeaders(name);
+    }
+
+    @Override
+    public HeaderIterator headerIterator() {
+        return original.headerIterator();
+    }
+
+    @Override
+    public HeaderIterator headerIterator(final String name) {
+        return original.headerIterator(name);
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("HttpResponseProxy{");
+        sb.append(original);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    @Deprecated
+    public HttpParams getParams() {
+        return original.getParams();
+    }
+
+    @Override
+    @Deprecated
+    public void setParams(final HttpParams params) {
+        original.setParams(params);
+    }
+
+    public String getContent() {
+        return content;
+    }
+}

+ 62 - 0
xzl-admin/src/main/java/com/xzl/web/utils/StreamUtil.java

@@ -0,0 +1,62 @@
+/*
+ * Copyright Notice:
+ *      Copyright  1998-2008, Huawei Technologies Co., Ltd.  ALL Rights Reserved.
+ *
+ *      Warning: This computer software sourcecode is protected by copyright law
+ *      and international treaties. Unauthorized reproduction or distribution
+ *      of this sourcecode, or any portion of it, may result in severe civil and
+ *      criminal penalties, and will be prosecuted to the maximum extent
+ *      possible under the law.
+ */
+package com.xzl.web.utils;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class StreamUtil {
+
+    private static final String DEFAULT_ENCODING = "utf-8";
+
+    public static String inputStream2String(InputStream in, String charsetName) {
+        if (in == null) {
+            return null;
+        }
+
+        InputStreamReader inReader = null;
+
+        try {
+            if (StringUtil.strIsNullOrEmpty(charsetName)) {
+                inReader = new InputStreamReader(in, DEFAULT_ENCODING);
+            } else {
+                inReader = new InputStreamReader(in, charsetName);
+            }
+
+            int readLen = 0;
+            char[] buffer = new char[1024];
+            StringBuffer strBuf = new StringBuffer();
+            while ((readLen = inReader.read(buffer)) != -1) {
+                strBuf.append(buffer, 0, readLen);
+            }
+
+            return strBuf.toString();
+        } catch (IOException e) {
+            System.out.println(e);
+        } finally {
+            closeStream(inReader);
+        }
+
+        return null;
+    }
+
+    public static void closeStream(Closeable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (IOException e) {
+                System.out.println(e);
+            }
+        }
+    }
+}

+ 50 - 0
xzl-admin/src/main/java/com/xzl/web/utils/StringUtil.java

@@ -0,0 +1,50 @@
+/*
+ * Copyright Notice:
+ *      Copyright  1998-2008, Huawei Technologies Co., Ltd.  ALL Rights Reserved.
+ *
+ *      Warning: This computer software sourcecode is protected by copyright law
+ *      and international treaties. Unauthorized reproduction or distribution
+ *      of this sourcecode, or any portion of it, may result in severe civil and
+ *      criminal penalties, and will be prosecuted to the maximum extent
+ *      possible under the law.
+ */
+package com.xzl.web.utils;
+
+//import java.nio.charset.Charset;
+
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.codec.digest.DigestUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.Base64;
+import java.util.Date;
+import java.util.UUID;
+
+//import org.apache.commons.codec.binary.Base64; //JDK version<1.8
+
+public class StringUtil {
+
+    public static boolean strIsNullOrEmpty(String s) {
+        return (null == s || s.trim().length() < 1);
+    }
+
+    public static String buildWsseHeader(String appKey, String appSecret) {
+        if (StringUtil.strIsNullOrEmpty(appKey) || StringUtil.strIsNullOrEmpty(appSecret)) {
+            return null;
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+        String time = sdf.format(new Date()); // Created
+        String nonce = UUID.randomUUID().toString().replace("-", ""); // Nonce
+
+        byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret);
+        String hexDigest = Hex.encodeHexString(passwordDigest);
+
+        String passwordDigestBase64Str = Base64.getEncoder().encodeToString(hexDigest.getBytes()); // JDK version≥1.8
+//        String passwordDigestBase64Str = Base64.encodeBase64String(hexDigest.getBytes(Charset.forName("utf-8"))); //JDK version<1.8
+
+//        passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", ""); //clean \t\n\r in passwordDigestBase64Str
+
+        return String.format(Constant.WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);
+    }
+}

+ 57 - 0
xzl-admin/src/main/java/com/xzl/web/utils/UrlUtils.java

@@ -0,0 +1,57 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+package com.xzl.web.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+public final class UrlUtils {
+  public UrlUtils() {
+  }
+
+  public static String getFull(String url, String params) {
+    if (StringUtils.isBlank(params)) {
+      return url;
+    } else {
+      String mark = StringUtils.contains(url, "?") ? "&" : "?";
+      if (params.indexOf("/admin/nav/index") > -1) {
+        return url + mark + "redirect=/admin/nav/index";
+      }
+      return url + mark + params;
+    }
+  }
+
+  public static String getFull(String url, Map<String, Object> params) {
+    String mark = StringUtils.contains(url, "?") ? "&" : "?";
+    StringBuilder result = new StringBuilder(url);
+    Iterator var4 = params.entrySet().iterator();
+
+    while (var4.hasNext()) {
+      Entry<String, Object> e = (Entry) var4.next();
+      result.append(mark + (String) e.getKey() + "=" + e.getValue());
+    }
+
+    return result.toString();
+  }
+
+  public static String deleteParams(String url, String param) {
+    String before = StringUtils.substringBefore(url, param);
+    String after = StringUtils.substringAfter(url, param);
+    if (after.indexOf("&") == -1) {
+      after = "";
+      if ("?".equals(before.substring(before.length() - 1, before.length()))) {
+        before = before.substring(0, before.length() - 1);
+      }
+    } else {
+      after = StringUtils.substringAfter(after, "&");
+    }
+
+    return before + after;
+  }
+}

+ 382 - 0
xzl-admin/src/main/java/com/xzl/web/utils/WorkWxUtils.java

@@ -0,0 +1,382 @@
+package com.xzl.web.utils;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.collections.MapUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.net.URL;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+public class WorkWxUtils {
+
+  private static final Logger LOG = LoggerFactory.getLogger(WorkWxUtils.class);
+
+  public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr, Map<String, String> headers) {
+    JSONObject jsonObject = null;
+    StringBuffer buffer = new StringBuffer();
+    try {
+      TrustManager[] tm = {new MyX509TrustManager()};
+      SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+      sslContext.init(null, tm, new java.security.SecureRandom());
+      SSLSocketFactory ssf = sslContext.getSocketFactory();
+      URL url = new URL(requestUrl);
+      HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
+      httpUrlConn.setSSLSocketFactory(ssf);
+      httpUrlConn.setDoOutput(true);
+      httpUrlConn.setDoInput(true);
+      httpUrlConn.setUseCaches(false);
+      httpUrlConn.setRequestMethod(requestMethod.toUpperCase());
+
+      if (headers != null) {
+        for (Map.Entry<String, String> entry : headers.entrySet()) {
+          httpUrlConn.setRequestProperty(entry.getKey(), entry.getValue());
+        }
+      }
+
+      if ("GET".equalsIgnoreCase(requestMethod)) httpUrlConn.connect();
+      if ("POST".equalsIgnoreCase(requestMethod)) {
+        httpUrlConn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
+        httpUrlConn.setRequestProperty("accept", "application/json");
+      }
+
+      if (null != outputStr) {
+        OutputStream outputStream = httpUrlConn.getOutputStream();
+        outputStream.write(outputStr.getBytes("UTF-8"));
+        outputStream.close();
+      }
+      InputStream inputStream = httpUrlConn.getInputStream();
+      InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
+      BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+      String str = null;
+      while ((str = bufferedReader.readLine()) != null) {
+        buffer.append(str);
+      }
+      if (LOG.isDebugEnabled()) {
+        LOG.debug(buffer.toString());
+      }
+      bufferedReader.close();
+      inputStreamReader.close();
+      inputStream.close();
+      inputStream = null;
+      httpUrlConn.disconnect();
+      jsonObject = JSON.parseObject(buffer.toString());
+    } catch (Exception e) {
+      LOG.error("", e);
+      Object o = JSON.parse(buffer.toString());
+      if (o instanceof JSONArray) {
+        jsonObject = new JSONObject(ConstructUtils.map("items", JSON.parseArray(buffer.toString())));
+      }
+    }
+    return jsonObject;
+  }
+
+  /**
+   * 方法名:httpRequest</br>
+   * 详述:发送http请求</br>
+   *
+   * @param requestUrl
+   * @param requestMethod
+   * @param outputStr
+   * @return 说明返回值含义
+   */
+  public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
+    return httpRequest(requestUrl, requestMethod, outputStr, null);
+  }
+
+  public static String getAccessToken() {
+    return getAccessToken(Constants.WORK_WX.CORP_ID, Constants.WORK_WX.APP_SECRET);
+  }
+
+
+  public static String getContactAccessToken() {
+    return getAccessToken(Constants.WORK_WX.CORP_ID, Constants.WORK_WX.APP_CONTACT_SYNC_SECRET);
+  }
+
+
+  private static String getAccessToken(String corpId, String secret) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpId + "&corpsecret=" + secret;
+    JSONObject json = httpRequest(url, "GET", null);
+    if (json != null) {
+      return json.getString("access_token");
+    }
+    return null;
+  }
+
+
+  public static Map getUserInfo(String code) {
+    String accessToken = getAccessToken();
+    return getUserInfo(code, accessToken);
+  }
+
+
+  public static Map getUserInfo(String code, String accessToken) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=" + accessToken + "&code=" + code;
+    JSONObject json = httpRequest(url, "GET", null);
+    return json;
+  }
+
+
+  /**
+   * 设置工作台显示样式
+   *
+   * @param accessToken
+   */
+  public static void setWorkBench(String accessToken) {
+    Map data = ConstructUtils.map("agentid", Constants.WORK_WX.AGENT_ID, "type", "keydata");
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/agent/set_workbench_template?access_token=" + accessToken;
+    httpRequest(url, "POST", JSON.toJSONString(data));
+  }
+
+  /**
+   * 设置工作台数据(定时任务调用,每 10分钟执行一次,到个人)
+   *
+   * @param accessToken
+   */
+  public static void setWorkBenchData(String accessToken, String userId) {
+    List<Map> menus = new ArrayList<>();
+
+    Map m1 = ConstructUtils.map("key", "终端选点申请", "data", "0", "jump_url", "http://www.qq.com");
+    Map m2 = ConstructUtils.map("key", "终端打标验收", "data", "0", "jump_url", "http://www.baidu.com");
+    Map m3 = ConstructUtils.map("key", "设备报修", "data", "0", "jump_url", "http://www.schoolwisdoms.com");
+    //Map m4 = ConstructUtils.map("key", "菜单4", "data", "2", "jump_url", "https://demo.schoolwisdoms.com/schoolbaby/api/wx/index");
+
+    menus.add(m1);
+    menus.add(m2);
+    menus.add(m3);
+    //menus.add(m4);
+
+    Map keydata = ConstructUtils.map("items", menus);
+    Map data = ConstructUtils.map("agentid", Constants.WORK_WX.AGENT_ID, "userid", userId, "type", "keydata", "keydata", keydata);
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/agent/set_workbench_data?access_token=" + accessToken;
+    httpRequest(url, "POST", JSON.toJSONString(data));
+  }
+
+  public static String getJsapiTicket(String accessToken) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=" + accessToken;
+    JSONObject json = httpRequest(url, "GET", null);
+    if (json != null) {
+      return json.getString("ticket");
+    }
+    return null;
+  }
+
+
+  public static String getAgentJsapiTicket(String accessToken) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=" + accessToken + "&type=agent_config";
+    JSONObject json = httpRequest(url, "GET", null);
+    if (json != null) {
+      return json.getString("ticket");
+    }
+    return null;
+  }
+
+
+  /**
+   * 创建通员工,需要 通讯录管理secret。在“管理工具”-“通讯录同步”里面查看(需开启“API接口同步”);
+   *
+   * @param accessToken
+   * @param employee
+   */
+  public static void createEmployee(String accessToken, Map employee) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token=" + accessToken;
+    httpRequest(url, "POST", JSON.toJSONString(employee));
+  }
+
+
+  /**
+   * 先创建,再邀请员工
+   *
+   * @param accessToken
+   * @param userId
+   */
+  public static void inviteEmployee(String accessToken, String userId) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/batch/invite?access_token=" + accessToken;
+    String[] users = new String[]{userId};
+    Map data = ConstructUtils.map("user", users);
+    httpRequest(url, "POST", JSON.toJSONString(data));
+  }
+
+
+  public static void deleteEmployee(String accessToken, String userId) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/user/delete?access_token=" + accessToken + "&userid=" + userId;
+    httpRequest(url, "GET", null);
+  }
+
+  public static Map getEmployee(String accessToken, String userId) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken + "&userid=" + userId;
+    return httpRequest(url, "GET", null);
+  }
+
+  public static Map getEmployee(String userId) {
+    return getEmployee(getContactAccessToken(), userId);
+  }
+
+
+  /**
+   * 创建通部门,需要 通讯录管理secret。在“管理工具”-“通讯录同步”里面查看(需开启“API接口同步”);
+   *
+   * @param accessToken
+   * @param department
+   */
+  public static void createDepartment(String accessToken, Map department) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=" + accessToken;
+    httpRequest(url, "POST", JSON.toJSONString(department));
+  }
+
+  public static void deleteDepartment(String accessToken, String id) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/department/delete?access_token=" + accessToken + "&id=" + id;
+    httpRequest(url, "GET", null);
+  }
+
+  private static String getUrl(HttpServletRequest request) {
+    StringBuilder url = new StringBuilder(request.getRequestURL().toString());
+    String queryString = request.getQueryString();
+    if (queryString != null) {
+      url.append("?").append(queryString);
+    }
+    return url.toString();
+  }
+
+  /**
+   * 方法名:getWxConfig</br>
+   * 详述:获取微信的配置信息 </br>
+   *
+   * @param request
+   * @return 说明返回值含义
+   */
+  public static Map<String, Object> getWxConfig(HttpServletRequest request) {
+    Map<String, Object> ret = new HashMap<String, Object>();
+    String access_token = getAccessToken();
+    String jsapi_ticket = null;
+    if (access_token != null) {
+      jsapi_ticket = getJsapiTicket(access_token);
+      ret.put("jsapi_ticket", jsapi_ticket);
+    }
+    String requestUrl = getUrl(request);
+    // 阿里云对于 Nigix 无法配置,导致 tomcat 获取https的协议仍未http
+    requestUrl = requestUrl.replaceAll("http:", "https:");
+    String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成签名的时间戳
+    String nonceStr = UUID.randomUUID().toString(); // 必填,生成签名的随机串
+    String signature = null;
+    // 注意这里参数名必须全部小写,且必须有序
+    String sign = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url="
+      + requestUrl;
+    ret.put("sign", sign);
+    try {
+      MessageDigest crypt = MessageDigest.getInstance("SHA-1");
+      crypt.reset();
+      crypt.update(sign.getBytes("UTF-8"));
+      signature = byteToHex(crypt.digest());
+    } catch (NoSuchAlgorithmException e) {
+      e.printStackTrace();
+    } catch (UnsupportedEncodingException e) {
+      e.printStackTrace();
+    }
+    ret.put("appId", Constants.WORK_WX.CORP_ID);
+    ret.put("timestamp", timestamp);
+    ret.put("nonceStr", nonceStr);
+    ret.put("signature", signature);
+    return ret;
+  }
+
+
+  public static Map<String, Object> getWxAgentConfig(HttpServletRequest request) {
+    Map<String, Object> ret = new HashMap<String, Object>();
+    String access_token = getAccessToken();
+    String jsapi_ticket = null;
+    if (access_token != null) {
+      jsapi_ticket = getAgentJsapiTicket(access_token);
+      ret.put("jsapi_ticket", jsapi_ticket);
+    }
+    String requestUrl = getUrl(request);
+    // 阿里云对于 Nigix 无法配置,导致 tomcat 获取https的协议仍未http
+    requestUrl = requestUrl.replaceAll("http:", "https:");
+    String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成签名的时间戳
+    String nonceStr = UUID.randomUUID().toString(); // 必填,生成签名的随机串
+    String signature = null;
+    // 注意这里参数名必须全部小写,且必须有序
+    String sign = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url="
+      + requestUrl;
+    ret.put("sign", sign);
+    try {
+      MessageDigest crypt = MessageDigest.getInstance("SHA-1");
+      crypt.reset();
+      crypt.update(sign.getBytes("UTF-8"));
+      signature = byteToHex(crypt.digest());
+    } catch (NoSuchAlgorithmException e) {
+      e.printStackTrace();
+    } catch (UnsupportedEncodingException e) {
+      e.printStackTrace();
+    }
+    ret.put("appId", Constants.WORK_WX.CORP_ID);
+    ret.put("agentId", Constants.WORK_WX.AGENT_ID);
+    ret.put("timestamp", timestamp);
+    ret.put("nonceStr", nonceStr);
+    ret.put("signature", signature);
+    return ret;
+  }
+
+  private static String byteToHex(final byte[] hash) {
+    Formatter formatter = new Formatter();
+    for (byte b : hash) {
+      formatter.format("%02x", b);
+    }
+    String result = formatter.toString();
+    formatter.close();
+    return result;
+  }
+
+
+  public static void sendTextCardMessage(String accessToken, String userId, String title, String content, String pageUrl) {
+
+    sendMessage(accessToken, "textcard", userId, title, content, pageUrl);
+
+  }
+
+  private static void sendMessage(String accessToken, String msgType, String userId, String title, String content, String pageUrl) {
+    String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken;
+    Map textcard = ConstructUtils.map("title", title, "description", content, "url", pageUrl);
+    Map data = ConstructUtils.map("touser", userId, "msgtype", msgType, "agentid", Constants.WORK_WX.AGENT_ID, "textcard", textcard);
+    System.out.println(JSON.toJSONString(data));
+    httpRequest(url, "POST", JSON.toJSONString(data));
+  }
+
+  public static void main(String[] args) {
+    //  String accessToken = getAccessToken();
+    // setWorkBench(accessToken);
+    // setWorkBenchData(accessToken, "ZhangShuLing");
+
+    // sendTextCardMessage(accessToken, "ZhangShuling", "审核title", "sdsdsdsdsdsd", "http://www.baidu.com");
+
+    String accessToken = getContactAccessToken();
+
+    // Map department = ConstructUtils.map("name", "信息部", "name_en", "xxb", "parentid", 1, "order", 1, "id", 10001);
+    // createDepartment(accessToken, department);
+    // deleteDepartment(accessToken, "2");
+
+//    int[] deptIds = new int[]{10001};
+//    Map employee = ConstructUtils.map("userid", "12345678891", "name", "张三", "department", deptIds, "mobile", "15671668917");
+//    createEmployee(accessToken, employee);
+
+    // inviteEmployee(accessToken, "ZhangShuLing");
+
+    //  deleteEmployee(accessToken, "0cd8605f59204532963dbb5a75109a97");
+    Map result = getEmployee(accessToken, "114200900908");
+    System.out.println(JSON.toJSONString(result));
+    System.out.println(MapUtils.getString(result, "mobile"));
+
+  }
+
+}

+ 133 - 0
xzl-admin/src/main/java/com/xzl/web/utils/baidu/BaiduUtils.java

@@ -0,0 +1,133 @@
+package com.xzl.web.utils.baidu;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: BaiduUtils
+ * @Description: 用于
+ * Modification History:
+ * Date                  Author                 Version       Description
+ * ---------------------------------------------------------
+ * 2021/11/10             ZhangShuling      v1.0.0
+ */
+public class BaiduUtils {
+
+  private final static String APP_ID = "G9L07n73wGGsKML5i7Q8HlYv";
+  private final static String APP_SECRET = "KTZh76eK713K98ddSOSNMVL2hOuvWqZ0";
+
+  /**
+   * 获取API访问token
+   * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
+   *
+   * @param ak - 百度云官网获取的 API Key
+   * @param sk - 百度云官网获取的 Securet Key
+   * @return assess_token 示例:
+   * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
+   */
+  public static String getAuth(String ak, String sk) {
+    // 获取token地址
+    String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
+    String getAccessTokenUrl = authHost
+      // 1. grant_type为固定参数
+      + "grant_type=client_credentials"
+      // 2. 官网获取的 API Key
+      + "&client_id=" + ak
+      // 3. 官网获取的 Secret Key
+      + "&client_secret=" + sk;
+    try {
+      URL realUrl = new URL(getAccessTokenUrl);
+      // 打开和URL之间的连接
+      HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
+      connection.setRequestMethod("GET");
+      connection.connect();
+      // 获取所有响应头字段
+      Map<String, List<String>> map = connection.getHeaderFields();
+      // 遍历所有的响应头字段
+      for (String key : map.keySet()) {
+//        System.err.println(key + "--->" + map.get(key));
+      }
+      // 定义 BufferedReader输入流来读取URL的响应
+      BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+      String result = "";
+      String line;
+      while ((line = in.readLine()) != null) {
+        result += line;
+      }
+      /**
+       * 返回结果示例
+       */
+//      System.err.println("result:" + result);
+      JSONObject jsonObject = JSONObject.parseObject(result);
+      String access_token = jsonObject.getString("access_token");
+      return access_token;
+    } catch (Exception e) {
+//      System.err.printf("获取token失败!");
+//      e.printStackTrace(System.err);
+    }
+    return null;
+  }
+
+
+  public static JSONObject parseIdCard(String url) {
+    // 请求url
+    String apiUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
+    try {
+      String param = "url=" + URLEncoder.encode(url, "UTF-8") + "&id_card_side=front";
+      String accessToken = getAuth(APP_ID, APP_SECRET);
+      String result = HttpUtil.post(apiUrl, accessToken, param);
+      // System.out.println(result);
+      return JSON.parseObject(result);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  public static JSONObject parseLicenceNo(String url) {
+    // 请求url
+    String apiUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic";
+    try {
+      String param = "url=" + URLEncoder.encode(url, "UTF-8") + "&id_card_side=front";
+      String accessToken = getAuth(APP_ID, APP_SECRET);
+      String result = HttpUtil.post(apiUrl, accessToken, param);
+      // System.out.println(result);
+      return JSON.parseObject(result);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  public static void main(String[] args) {
+    JSONObject idCardJson = parseIdCard("https://dataproject.oss-cn-beijing.aliyuncs.com/image/a691d768-11bc-48c9-adfa-39c682e97f82.jpg");
+//     JSONObject idCardJson = parseIdCard("https://dataproject.oss-cn-beijing.aliyuncs.com/file/a5214486-ba8f-40fe-95b7-f4d74c4942ce.jpeg");
+    System.out.println(idCardJson);
+    System.out.println(idCardJson.getJSONObject("words_result").getJSONObject("公民身份号码").getString("words"));
+
+    //JSONObject licenceJson = parseLicenceNo("https://dataproject.oss-cn-beijing.aliyuncs.com/file/96209a77-19de-4d18-b1f7-c3aabe52f058.jpeg");
+    /*
+    JSONObject licenceJson = parseLicenceNo("https://dataproject.oss-cn-beijing.aliyuncs.com/file/f1d33170-b312-4856-910a-11ba61be4baf.jpeg");
+    JSONArray words = licenceJson.getJSONArray("words_result");
+    String licenceNo = null;
+    for (Object o : words) {
+      String word = ((JSONObject) o).getString("words");
+      int i = 0;
+      String prefix = "许可证号";
+      if ((i = word.indexOf(prefix)) > -1) {
+        licenceNo = word.substring(i + prefix.length());
+      }
+    }
+    System.out.println(licenceNo);
+    System.out.println(licenceJson);
+     */
+  }
+}

+ 65 - 0
xzl-admin/src/main/java/com/xzl/web/utils/baidu/Base64Util.java

@@ -0,0 +1,65 @@
+package com.xzl.web.utils.baidu;
+
+/**
+ * Base64 工具类
+ */
+public class Base64Util {
+    private static final char last2byte = (char) Integer.parseInt("00000011", 2);
+    private static final char last4byte = (char) Integer.parseInt("00001111", 2);
+    private static final char last6byte = (char) Integer.parseInt("00111111", 2);
+    private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
+    private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
+    private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
+    private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
+
+    public Base64Util() {
+    }
+
+    public static String encode(byte[] from) {
+        StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);
+        int num = 0;
+        char currentByte = 0;
+
+        int i;
+        for (i = 0; i < from.length; ++i) {
+            for (num %= 8; num < 8; num += 6) {
+                switch (num) {
+                    case 0:
+                        currentByte = (char) (from[i] & lead6byte);
+                        currentByte = (char) (currentByte >>> 2);
+                    case 1:
+                    case 3:
+                    case 5:
+                    default:
+                        break;
+                    case 2:
+                        currentByte = (char) (from[i] & last6byte);
+                        break;
+                    case 4:
+                        currentByte = (char) (from[i] & last4byte);
+                        currentByte = (char) (currentByte << 2);
+                        if (i + 1 < from.length) {
+                            currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
+                        }
+                        break;
+                    case 6:
+                        currentByte = (char) (from[i] & last2byte);
+                        currentByte = (char) (currentByte << 4);
+                        if (i + 1 < from.length) {
+                            currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);
+                        }
+                }
+
+                to.append(encodeTable[currentByte]);
+            }
+        }
+
+        if (to.length() % 4 != 0) {
+            for (i = 4 - to.length() % 4; i > 0; --i) {
+                to.append("=");
+            }
+        }
+
+        return to.toString();
+    }
+}

+ 72 - 0
xzl-admin/src/main/java/com/xzl/web/utils/baidu/FileUtil.java

@@ -0,0 +1,72 @@
+package com.xzl.web.utils.baidu;
+
+import java.io.*;
+
+/**
+ * 文件读取工具类
+ */
+public class FileUtil {
+
+    /**
+     * 读取文件内容,作为字符串返回
+     */
+    public static String readFileAsString(String filePath) throws IOException {
+        File file = new File(filePath);
+        if (!file.exists()) {
+            throw new FileNotFoundException(filePath);
+        } 
+
+        if (file.length() > 1024 * 1024 * 1024) {
+            throw new IOException("File is too large");
+        } 
+
+        StringBuilder sb = new StringBuilder((int) (file.length()));
+        // 创建字节输入流  
+        FileInputStream fis = new FileInputStream(filePath);  
+        // 创建一个长度为10240的Buffer
+        byte[] bbuf = new byte[10240];  
+        // 用于保存实际读取的字节数  
+        int hasRead = 0;  
+        while ( (hasRead = fis.read(bbuf)) > 0 ) {  
+            sb.append(new String(bbuf, 0, hasRead));  
+        }  
+        fis.close();  
+        return sb.toString();
+    }
+
+    /**
+     * 根据文件路径读取byte[] 数组
+     */
+    public static byte[] readFileByBytes(String filePath) throws IOException {
+        File file = new File(filePath);
+        if (!file.exists()) {
+            throw new FileNotFoundException(filePath);
+        } else {
+            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
+            BufferedInputStream in = null;
+
+            try {
+                in = new BufferedInputStream(new FileInputStream(file));
+                short bufSize = 1024;
+                byte[] buffer = new byte[bufSize];
+                int len1;
+                while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
+                    bos.write(buffer, 0, len1);
+                }
+
+                byte[] var7 = bos.toByteArray();
+                return var7;
+            } finally {
+                try {
+                    if (in != null) {
+                        in.close();
+                    }
+                } catch (IOException var14) {
+                    var14.printStackTrace();
+                }
+
+                bos.close();
+            }
+        }
+    }
+}

+ 77 - 0
xzl-admin/src/main/java/com/xzl/web/utils/baidu/HttpUtil.java

@@ -0,0 +1,77 @@
+package com.xzl.web.utils.baidu;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * http 工具类
+ */
+public class HttpUtil {
+
+  public static String post(String requestUrl, String accessToken, String params)
+    throws Exception {
+    String contentType = "application/x-www-form-urlencoded";
+    return HttpUtil.post(requestUrl, accessToken, contentType, params);
+  }
+
+  public static String post(String requestUrl, String accessToken, String contentType, String params)
+    throws Exception {
+    String encoding = "UTF-8";
+    if (requestUrl.contains("nlp")) {
+      encoding = "GBK";
+    }
+    return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);
+  }
+
+  public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)
+    throws Exception {
+    String url = requestUrl + "?access_token=" + accessToken;
+    return HttpUtil.postGeneralUrl(url, contentType, params, encoding);
+  }
+
+  public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)
+    throws Exception {
+    URL url = new URL(generalUrl);
+    // 打开和URL之间的连接
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestMethod("POST");
+    // 设置通用的请求属性
+    connection.setRequestProperty("Content-Type", contentType);
+    connection.setRequestProperty("Connection", "Keep-Alive");
+    connection.setUseCaches(false);
+    connection.setDoOutput(true);
+    connection.setDoInput(true);
+
+    // 得到请求的输出流对象
+    DataOutputStream out = new DataOutputStream(connection.getOutputStream());
+    out.write(params.getBytes(encoding));
+    out.flush();
+    out.close();
+
+    // 建立实际的连接
+    connection.connect();
+    // 获取所有响应头字段
+    Map<String, List<String>> headers = connection.getHeaderFields();
+    // 遍历所有的响应头字段
+    for (String key : headers.keySet()) {
+      // System.err.println(key + "--->" + headers.get(key));
+    }
+    // 定义 BufferedReader输入流来读取URL的响应
+    BufferedReader in = null;
+    in = new BufferedReader(
+      new InputStreamReader(connection.getInputStream(), encoding));
+    String result = "";
+    String getLine;
+    while ((getLine = in.readLine()) != null) {
+      result += getLine;
+    }
+    in.close();
+    // System.err.println("result:" + result);
+    return result;
+  }
+}

+ 32 - 0
xzl-admin/src/main/resources/mapper/CustomerTerminalMapper.xml

@@ -0,0 +1,32 @@
+<?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.xzl.web.mapper.CustomerTerminalMapper">
+
+    <select id="getCustomerListByPosition"  resultType="com.xzl.web.model.monitor.CustomerSearchVO" parameterType="com.xzl.web.model.monitor.CustomerSearchDTO">
+        select t.* from (
+            select a.client_code as "clientCode",
+                   a.client_name as "clientName",
+                   a.short_name as "shortName",
+                   c.simply_name as "simplyName" ,
+                   b.cnname as "cnname",
+                   a.telphonea as "telphonea",
+                   a.address as "address",
+                   a.latitude as "latitude",
+                   a.longitude as "longitude",
+            (
+                (
+                    acos(
+                        sin((#{latitude}*3.1415)/180) * sin((a.latitude*3.1415)/180) +
+                        cos((#{latitude}*3.1415)/180) * cos((a.latitude*3.1415)/180) * cos((#{longitude}*3.1415)/180 - (a.longitude*3.1415)/180)
+                    ) * 6370.996
+                )
+            ) as "distance"
+            from v_b_client a
+            join t_b_employee b on a.regie_manager_code=b.employee_code
+            join t_b_corp c on a.market_code=c.corp_code
+        ) t
+        where t.distance <![CDATA[ <= ]]> #{distance}
+        order by  t.distance asc
+        LIMIT #{count}
+    </select>
+</mapper>

+ 1 - 1
xzl-generator/src/main/java/com/xzl/generator/util/GenUtils.java

@@ -215,7 +215,7 @@ public class GenUtils
      */
     public static String replaceText(String text)
     {
-        return RegExUtils.replaceAll(text, "(?:表|若依)", "");
+        return RegExUtils.replaceAll(text, "(?:表|)", "");
     }
 
     /**

+ 2 - 2
xzl-ui/.env.development

@@ -1,10 +1,10 @@
 # 页面标题
-VUE_APP_TITLE = 若依管理系统
+VUE_APP_TITLE = 管理系统
 
 # 开发环境配置
 ENV = 'development'
 
-# 若依管理系统/开发环境
+# 管理系统/开发环境
 VUE_APP_BASE_API = '/dev-api'
 
 # 路由懒加载

+ 2 - 2
xzl-ui/.env.production

@@ -1,8 +1,8 @@
 # 页面标题
-VUE_APP_TITLE = 若依管理系统
+VUE_APP_TITLE = 管理系统
 
 # 生产环境配置
 ENV = 'production'
 
-# 若依管理系统/生产环境
+# 管理系统/生产环境
 VUE_APP_BASE_API = '/prod-api'

+ 2 - 2
xzl-ui/.env.staging

@@ -1,10 +1,10 @@
 # 页面标题
-VUE_APP_TITLE = 若依管理系统
+VUE_APP_TITLE = 管理系统
 
 NODE_ENV = production
 
 # 测试环境配置
 ENV = 'staging'
 
-# 若依管理系统/测试环境
+# 管理系统/测试环境
 VUE_APP_BASE_API = '/stage-api'

+ 6 - 5
xzl-ui/package.json

@@ -5,11 +5,11 @@
   "author": "XZL",
   "license": "MIT",
   "scripts": {
-    "dev": "vue-cli-service serve",
-    "build:prod": "vue-cli-service build",
-    "build:stage": "vue-cli-service build --mode staging",
-    "preview": "node build/index.js --preview",
-    "lint": "eslint --ext .js,.vue src"
+    "dev": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
+    "build:prod": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
+    "build:stage": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --mode staging",
+    "preview": "SET NODE_OPTIONS=--openssl-legacy-provider && node build/index.js --preview",
+    "lint": "SET NODE_OPTIONS=--openssl-legacy-provider && eslint --ext .js,.vue src"
   },
   "husky": {
     "hooks": {
@@ -45,6 +45,7 @@
     "file-saver": "2.0.5",
     "fuse.js": "6.4.3",
     "highlight.js": "9.18.5",
+    "jquery": "^3.7.1",
     "js-beautify": "1.13.0",
     "js-cookie": "3.0.1",
     "jsencrypt": "3.0.0-rc.1",

+ 2 - 1
xzl-ui/public/index.html

@@ -203,6 +203,7 @@
 		    <div class="loader-section section-right"></div>
 		    <div class="load_title">正在加载系统资源,请耐心等待</div>
         </div>
-	</div>
+	  </div>
+    <script src="http://api.map.baidu.com/getscript?v=3.0&ak=UOO4u2Ex4WI5IDUUROdEMMg64elF5Itc" type="text/javascript"></script>
   </body>
 </html>

+ 0 - 8
xzl-ui/src/layout/components/Navbar.vue

@@ -9,14 +9,6 @@
       <template v-if="device!=='mobile'">
         <search id="header-search" class="right-menu-item" />
 
-        <el-tooltip content="源码地址" effect="dark" placement="bottom">
-          <ruo-yi-git id="xzl-git" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
-        <el-tooltip content="文档地址" effect="dark" placement="bottom">
-          <ruo-yi-doc id="xzl-doc" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
         <el-tooltip content="布局大小" effect="dark" placement="bottom">

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 24 - 857
xzl-ui/src/views/index.vue


+ 1 - 1
xzl-ui/src/views/login.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="login">
     <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
-      <h3 class="title">若依后台管理系统</h3>
+      <h3 class="title">后台管理系统</h3>
       <el-form-item prop="username">
         <el-input
           v-model="loginForm.username"

+ 205 - 0
xzl-ui/src/views/monitor/map/customerPositionBmap.vue

@@ -0,0 +1,205 @@
+<template>
+  <div>
+    <div class="app-container" style="padding-left: 20px;width: 100%;height: 60px;">
+      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
+        <el-form-item label="地址" prop="address">
+          <el-autocomplete
+            class="inline-input"
+            v-model="address"
+            :fetch-suggestions="querySearch"
+            placeholder="请输入内容"
+            :trigger-on-focus="false"
+            @select="handleSelect"
+          ></el-autocomplete>
+        </el-form-item>
+        <el-form-item label="距离" prop="distance">
+          <el-select v-model="queryParams.distance" clearable>
+            <el-option
+              v-for="item in distanceOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div id="container" v-bind:style="'width: 100%;border: 1px solid #cecece;height:'+pageHeight*0.797+'px;'">
+    </div>
+  </div>
+</template>
+<script>
+import $ from 'jquery'
+import request from '@/utils/request'
+
+
+export default {
+  data() {
+    return {
+      address:"",
+      queryParams: {
+        address: {},
+        distance: "50"
+      },
+      placeInfo: [
+        {value: "", label: ""}
+      ],
+      distanceOptions: [
+        {value: "50", label: "50米"},
+        {value: "100", label: "100米"},
+        {value: "200", label: "200米"}
+      ],
+      map: null,
+      pageHeight:document.documentElement.clientHeight
+    }
+  },
+  created() {
+    setTimeout(()=>{
+      this.initMap()
+    },100)
+  },
+  methods: {
+    addMarker(points) {
+      //循环建立标注点
+      var customerListHtml = ''
+      var len = points.length;
+      for (var i = 0, pointsLen = points.length; i < pointsLen; i++) {
+        var point = points[i];
+        this.addMarkerPoint(point);
+      }
+    },
+    addTargetMarkerPoint(pointInfo, distance) {
+      console.log('pointInfo', pointInfo)
+      let pt = new BMap.Point(pointInfo.longitude, pointInfo.latitude);
+      let icon = new BMap.Icon(new BMap.Size(16, 16));
+      let options = {
+        icon: icon
+      }
+      var marker = new BMap.Marker(pt, options)
+      var circle = new BMap.Circle(pt, distance, {
+        strokeColor: 'blue',
+        strokeWeight: 2,
+        strokeOpacity: 0.5
+      });
+      var content =
+        '<ul class="map-customer-info">'
+        + '<li ><span>名称:</span>' + pointInfo.name + '</li>'
+        + '<li ><span>地址:</span>' + pointInfo.address + '</li>'
+        + '</ul>';
+      marker.addEventListener("mouseover", () => {
+        var infoWindow = new BMap.InfoWindow(content);
+        marker.openInfoWindow(infoWindow);
+      });
+      marker.addEventListener("mouseout", () => {
+        marker.closeInfoWindow();
+      });
+      this.map.addOverlay(marker)
+      this.map.addOverlay(circle)
+      this.map.setZoom(20);
+      // 移动到目标点
+      this.map.setCenter(pt)
+    },
+    addMarkerPoint(pointInfo) {
+      let pt = new BMap.Point(pointInfo.longitude, pointInfo.latitude);
+      var marker = new BMap.Marker(pt)
+
+      this.showInfo(marker, pointInfo)
+      this.map.addOverlay(marker)
+    },
+    showInfo(thisMarker, point) {
+      if (!point.client_code) {
+        console.log('未取到值 ...')
+        return;
+      }
+      let pt = new BMap.Point(point.longitude, point.latitude);
+      //获取点的信息
+      var content =
+        '<ul class="map-customer-info">'
+        + '<li ><span>许可证号:</span>' + point.client_code + '</li>'
+        + '<li ><span>名称:</span>' + point.short_name + '</li>'
+        + '<li ><span>店名:</span>' + point.client_name + '</li>'
+        + '<li ><span>电话:</span>' + point.telphonea + '</li>'
+        + '<li ><span>地址:</span>' + point.address + '</li>'
+        + '<li ><span>客户经理:</span>' + point.cnname + '</li>'
+        + '<li ><span>距离:</span>' + showDist(point.distance) + '</li>'
+        + '</ul>';
+      thisMarker.addEventListener("mouseover", () => {
+        var infoWindow = new BMap.InfoWindow(content);
+        thisMarker.openInfoWindow(infoWindow);
+      });
+      thisMarker.addEventListener("mouseout", () => {
+        thisMarker.closeInfoWindow();
+      });
+    },
+    showDist(d) {
+      return d ? d.toFixed(2) * 1000 + 'M' : '未知';
+    },
+    initMap() {
+      var longitude = 113.450713
+      var latitude = 30.366039
+      let pt = new BMap.Point(longitude, latitude);
+      var marker = new BMap.Marker(pt)
+
+      // 鼠标经过窗口模板
+      let tem = `<ul class="map-customer-info">
+	                <li>仙桃市烟草专卖局</li>
+	                </ul>`;
+
+      marker.addEventListener("mouseover", () => {
+        var infoWindow = new BMap.InfoWindow(tem);
+        marker.openInfoWindow(infoWindow);
+      });
+      marker.addEventListener("mouseout", () => {
+        marker.closeInfoWindow();
+      });
+
+      this.map = new BMap.Map("container", {enableMapClick: false});        // 创建Map实例 命名空间为BMAP
+      this.map.centerAndZoom(new BMap.Point(113.465771, 30.368834), 13);  // 初始化地图,设置中心点坐标和地图级别
+      this.map.setCurrentCity("仙桃");
+      this.map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
+      this.map.disableDoubleClickZoom();    //禁用双击放大
+      this.map.addOverlay(marker);
+
+      console.log(2222)
+    },
+    querySearch(queryString, cb) {
+      request({
+        url: '/api/map/search?key='+queryString,
+        method: 'get'
+      }).then(function (res) {
+        console.log(res)
+        cb(res);
+      })
+    },
+    handleSelect(item){
+      if (item) {
+        this.map.clearOverlays();
+        this.addTargetMarkerPoint(item,this.queryParams.distance*1000);
+        // 查询周围选定距离distance 以内的零售户
+        request({
+          url: "/api/map/customer/search",
+          method: 'post',
+          data: {latitude: item.latitude, longitude: item.longitude, count: 10, distance: this.queryParams.distance}
+        }).then(function (rs) {
+          console.log(1111,rs)
+          if (rs && rs.length) {
+            this.addMarker(rs);
+          } else {
+            this.$modal.msgError("未找到附近零售户");
+          }
+        })
+      }
+    }
+  }
+};
+</script>
+
+<style rel="stylesheet/scss" lang="scss">
+.BMap_cpyCtrl {
+  display: none;
+}
+
+.anchorBL {
+  display: none;
+}
+</style>

+ 1 - 1
xzl-ui/src/views/register.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="register">
     <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
-      <h3 class="title">若依后台管理系统</h3>
+      <h3 class="title">后台管理系统</h3>
       <el-form-item prop="username">
         <el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号">
           <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />

+ 1 - 1
xzl-ui/vue.config.js

@@ -7,7 +7,7 @@ function resolve(dir) {
 
 const CompressionPlugin = require('compression-webpack-plugin')
 
-const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
+const name = process.env.VUE_APP_TITLE || '管理系统' // 网页标题
 
 const port = process.env.port || process.env.npm_config_port || 80 // 端口