浏览代码

解决git问题

zxy 3 年之前
父节点
当前提交
a3110a8a46

+ 12 - 0
light-application-server/sql/biz.sql

@@ -127,3 +127,15 @@ CREATE TABLE `qrcode_show_config`
     PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '二维码展示配置' ROW_FORMAT = DYNAMIC;
 
+DROP TABLE IF EXISTS `config_info`;
+CREATE TABLE `config_info`
+(
+    `id`          bigint(20) NOT NULL AUTO_INCREMENT,
+    `config_key`         varchar(128) DEFAULT NULL COMMENT '配置key',
+    `config_value`       varchar(512) DEFAULT NULL COMMENT '配置value',
+    `remark`      varchar(256) DEFAULT NULL COMMENT '配置描述',
+    `create_time` datetime     DEFAULT NULL COMMENT '创建时间',
+    `update_time` datetime     DEFAULT NULL COMMENT '修改时间',
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `UK_CONFIGKEY`(`config_key`) USING BTREE,
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统配置表' ROW_FORMAT = DYNAMIC;

+ 3 - 0
light-application-server/sql/sys.sql

@@ -116,6 +116,8 @@ INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`
 INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`, `orderNum`, `created`, `updated`, `statu`) VALUES ('27', '17', '巡检模板管理', '/page/inspectionTemplateManage', 'biz:inspectionTemplateManage:list', 'page/inspectionTemplateManage', '1', NULL, '2', '2022-04-20 13:47:02', '2022-04-20 16:09:31', '1');
 INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`, `orderNum`, `created`, `updated`, `statu`) VALUES ('28', '17', '故障处理', '/page/faultHandlingManage', 'biz:faultHandling:list', 'page/faultHandlingManage', '1', NULL, '8', '2022-04-29 10:32:29', NULL, '1');
 INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`, `orderNum`, `created`, `updated`, `statu`) VALUES ('29', '17', '二维码管理', '/page/qrcodeShowConfig', 'qrcode:list', 'page/qrcodeShowConfig', '1', NULL, '9', '2022-05-07 11:12:21', NULL, '1');
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`, `orderNum`, `created`, `updated`, `statu`) VALUES ('30', '17', '配置管理', '/page/configManage', 'biz:config:list', 'page/configManage', 1, NULL, 10, '2022-05-13 14:26:04', NULL, 1);
+
 
 #角色基础数据
 INSERT INTO `light_application_db`.`sys_role` (`id`, `name`, `code`, `remark`, `created`, `updated`, `statu`) VALUES ('1', '工作人员', 'ADMIN', '工作人员,默认最高权限', '2021-01-04 10:09:14', '2022-04-21 10:49:26', '1');
@@ -161,5 +163,6 @@ INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
 INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (27, 1, 26);
 INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (28, 1, 28);
 INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (29, 1, 29);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (30, 1, 30);
 
 

+ 1 - 1
light-application-server/src/main/java/com/jd/lightapplication/common/emnu/MeetingStatus.java

@@ -8,7 +8,7 @@ public enum MeetingStatus {
     private int value;
 
     // 构造方法
-    private MeetingStatus(String title, int value) {
+    MeetingStatus(String title, int value) {
         this.title = title;
         this.value = value;
     }

+ 69 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/ConfigInfoController.java

@@ -0,0 +1,69 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.ConfigInfo;
+import com.jd.lightapplication.service.ConfigInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/config")
+@Api(tags = "系统配置表")
+public class ConfigInfoController {
+
+    @Resource
+    private ConfigInfoService configInfoService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page, ConfigInfo configInfo) {
+        return R.success(configInfoService.page(page, configInfo));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody ConfigInfo configInfo) {
+        //判断key是否重复
+        if (configInfoService.findByKey(configInfo.getConfigKey()) != null) {
+            return R.fail("当前配置key已存在:" + configInfo.getConfigKey());
+        }
+        configInfo.setCreateTime(DateUtil.now());
+        configInfoService.save(configInfo);
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody ConfigInfo configInfo) {
+        //判断key是否重复
+        ConfigInfo bean = configInfoService.findByKey(configInfo.getConfigKey());
+        if (bean != null && bean.getId() != configInfo.getId()) {
+            return R.fail("当前配置key已存在:" + configInfo.getConfigKey());
+        }
+        configInfo.setUpdateTime(DateUtil.now());
+        configInfoService.updateById(configInfo);
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        configInfoService.removeById(id);
+        return R.success();
+    }
+
+    @GetMapping("/find/{key}")
+    @ApiOperation(value = "5、根据配置key查询配置信息")
+    public R findByKey(String key) {
+        return R.success(configInfoService.findByKey(key));
+    }
+
+}

+ 13 - 5
light-application-server/src/main/java/com/jd/lightapplication/controller/SmsController.java

@@ -5,6 +5,7 @@ import com.jd.lightapplication.config.SmsConfig;
 import com.jd.lightapplication.model.SysUser;
 import com.jd.lightapplication.service.SysUserService;
 import com.jd.lightapplication.utils.SmsUtil;
+import com.jd.lightapplication.utils.ValidateLoginAreaUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -26,9 +27,16 @@ public class SmsController {
     private StringRedisTemplate stringRedisTemplate;
     @Resource
     private SysUserService sysUserService;
+    @Resource
+    private ValidateLoginAreaUtil validateLoginAreaUtil;
+
+    @PostMapping("/sendSms/{phone}/{longitude}/{latitude}")
+    public R sendSms(@PathVariable("phone") String phone,
+                     @PathVariable("longitude") Double longitude,
+                     @PathVariable("latitude") Double latitude) {
+        //验证经纬度
+        validateLoginAreaUtil.checkCoordinate(longitude, latitude);
 
-    @PostMapping("/sendSms/{phone}")
-    public R sendSms(@PathVariable("phone") String phone) {
         SysUser sysUser = sysUserService.getByPhone(phone);
         if (sysUser == null) {
             return R.fail("没有找到相关用户信息");
@@ -42,14 +50,14 @@ public class SmsController {
                 content, smsConfig.getSmsSign(), "");
         if (result == null) {
             log.error("短信发送失败");
-            return R.fail( "短信发送失败");
+            return R.fail("短信发送失败");
         } else if ("".equals(result)) {
             //把验证码存到redis
             stringRedisTemplate.opsForValue().set(phone, code, 10, TimeUnit.MINUTES);
-            return R.success( "短信发送成功。有效期为十分钟。");
+            return R.success("短信发送成功。有效期为十分钟。");
         } else {
             log.error("短信发送失败,错误信息:" + result);
-            return R.fail( "短信发送失败");
+            return R.fail("短信发送失败");
         }
     }
 

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/ConfigInfoMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.ConfigInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ConfigInfoMapper extends BaseMapper<ConfigInfo>  {
+	
+}

+ 45 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/ConfigInfo.java

@@ -0,0 +1,45 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel("系统配置表")
+@TableName("config_info")
+public class ConfigInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("配置key")
+    @TableField("config_key")
+    private String configKey;
+
+    @ApiModelProperty("配置value")
+    @TableField("config_value")
+    private String configValue;
+
+    @ApiModelProperty("配置描述")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+    @ApiModelProperty("修改时间")
+    @TableField("update_time")
+    private String updateTime;
+
+}

+ 78 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/MobileLoginFilter.java

@@ -2,27 +2,36 @@ package com.jd.lightapplication.security;
 
 import cn.hutool.core.codec.Base64;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jd.lightapplication.common.exception.CaptchaException;
 import com.jd.lightapplication.common.lang.R;
 import com.jd.lightapplication.common.lang.WeChatConfig;
 import com.jd.lightapplication.easemob.EasemobComtroller;
 import com.jd.lightapplication.easemob.dto.EasemobUserAddDto;
+import com.jd.lightapplication.model.ConfigInfo;
 import com.jd.lightapplication.model.SysRole;
 import com.jd.lightapplication.model.SysUser;
 import com.jd.lightapplication.model.SysUserRole;
+import com.jd.lightapplication.service.ConfigInfoService;
 import com.jd.lightapplication.service.SysRoleService;
 import com.jd.lightapplication.service.SysUserRoleService;
 import com.jd.lightapplication.service.SysUserService;
+import com.jd.lightapplication.utils.ValidateLoginAreaUtil;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.security.SecurityProperties;
+import org.springframework.data.geo.Distance;
+import org.springframework.data.geo.Point;
+import org.springframework.data.redis.connection.RedisGeoCommands;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.authentication.AuthenticationFailureHandler;
@@ -34,6 +43,7 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.stream.Collectors;
 
 @Data
 @AllArgsConstructor
@@ -41,6 +51,9 @@ import java.io.IOException;
 @Slf4j
 public class MobileLoginFilter extends OncePerRequestFilter implements InitializingBean {
 
+    private ValidateLoginAreaUtil validateLoginAreaUtil;
+
+    private ConfigInfoService configInfoService;
     private SysUserService sysUserService;
     private SysRoleService sysRoleService;
     private SysUserRoleService sysUserRoleService;
@@ -67,6 +80,9 @@ public class MobileLoginFilter extends OncePerRequestFilter implements Initializ
 
         if (url.equals("/login/mobile") && request.getMethod().equals("POST")) {
             try {
+                //验证地理位置
+                validateMap(request);
+                //验证手机号
                 validate(request);
             } catch (AuthenticationException e) {
                 //验证出现异常,使用自定义的失败处理器来处理,并且直接return,不执行后面的过滤器
@@ -77,6 +93,68 @@ public class MobileLoginFilter extends OncePerRequestFilter implements Initializ
         filterChain.doFilter(request, response);
     }
 
+    private void validateMap(HttpServletRequest request) {
+        //获取手机号
+        String phone = request.getParameter("phone");
+        SysUser sysUser = sysUserService.getByPhone(phone);
+        //判断是不是来宾登录,判断条件:sysUser为空或者角色里面包括来宾
+        if (sysUser == null
+                || sysRoleService.list(
+                Wrappers.lambdaQuery(new SysRole())
+                        .inSql(SysRole::getId, "SELECT role_id FROM sys_user_role WHERE user_id = " + sysUser.getId())
+        ).stream().filter(t -> {
+            return "GUEST".equals(t.getCode());
+        }).collect(Collectors.toList()).size() > 0) {
+            //表示是来宾登录,需要验证地理位置
+            Double longitude = Double.parseDouble(request.getParameter("longitude"));
+            Double latitude = Double.parseDouble(request.getParameter("latitude"));
+            log.info("获取到的经纬度【" + longitude + "," + latitude + "】");
+            //判断坐标是否符合登录条件
+            validateLoginAreaUtil.checkCoordinate(longitude, latitude);
+        }
+
+    }
+
+    /**
+     * 判断经坐标是否符合登录条件,这里使用Redis特殊数据类型来做
+     *
+     * @param longitude 经度
+     * @param latitude  纬度
+     */
+    /*private void checkCoordinate(Double longitude, Double latitude) {
+        //先获取系统配置里面的登录区域是否开启
+        ConfigInfo configInfo = configInfoService.findByKey("LOGIN_AREA_ISENABLE");
+        if (configInfo != null && "false".equals(configInfo.getConfigValue())) {
+            //未开启直接放行
+            return;
+        }
+        //查询经度、纬度、距离配置
+        String lgt = configInfoService.findByKey("LOGIN_AREA_LONGITUDE").getConfigValue(),
+                lat = configInfoService.findByKey("LOGIN_AREA_LATITUDE").getConfigValue(),
+                range = configInfoService.findByKey("LOGIN_AREA_RANGE").getConfigValue();
+        if (StrUtil.isBlank(lgt) || StrUtil.isBlank(lat) || StrUtil.isBlank(range)) {
+            throw new CaptchaException("系统配置异常,请联系管理员。");
+        }
+        Double lgtDouble;
+        Double latDouble;
+        Double rangeDouble;
+        try {
+            lgtDouble = Double.parseDouble(lgt);
+            latDouble = Double.parseDouble(lat);
+            rangeDouble = Double.parseDouble(range);
+        } catch (Exception e) {
+            throw new CaptchaException("系统配置异常,请联系管理员。");
+        }
+        //判断坐标是否符合登录要求
+        redisTemplate.opsForGeo().add("geo", new Point(lgtDouble, latDouble), "basic");
+        redisTemplate.opsForGeo().add("geo", new Point(longitude, latitude), "user");
+
+        Distance rangeDistance = redisTemplate.opsForGeo().distance("geo", "basic", "user", RedisGeoCommands.DistanceUnit.METERS);
+        if (rangeDistance.getValue() >= rangeDouble) {
+            throw new CaptchaException("请在城管局范围内使用小程序");
+        }
+    }*/
+
     /**
      * 短信验证码的验证逻辑
      *

+ 33 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/ConfigInfoService.java

@@ -0,0 +1,33 @@
+package com.jd.lightapplication.service;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import  com.jd.lightapplication.model.ConfigInfo;
+import  com.jd.lightapplication.mapper.ConfigInfoMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class ConfigInfoService extends ServiceImpl<ConfigInfoMapper,ConfigInfo> {
+    public IPage<ConfigInfo> page(Page page, ConfigInfo configInfo){
+        LambdaQueryWrapper<ConfigInfo> wrapper = new LambdaQueryWrapper<>();
+        if(StrUtil.isNotBlank(configInfo.getRemark())){
+            wrapper.like(ConfigInfo::getRemark,configInfo.getRemark());
+        }
+        wrapper.orderByDesc(ConfigInfo::getCreateTime);
+        return baseMapper.selectPage(page,wrapper);
+    }
+
+    public ConfigInfo findByKey(String key) {
+        if(StrUtil.isBlank(key))
+            return null;
+        LambdaQueryWrapper<ConfigInfo> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ConfigInfo::getConfigKey,key);
+        return baseMapper.selectOne(wrapper);
+    }
+}

+ 62 - 0
light-application-server/src/main/java/com/jd/lightapplication/utils/ValidateLoginAreaUtil.java

@@ -0,0 +1,62 @@
+package com.jd.lightapplication.utils;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.jd.lightapplication.common.exception.CaptchaException;
+import com.jd.lightapplication.model.ConfigInfo;
+import com.jd.lightapplication.service.ConfigInfoService;
+import lombok.AllArgsConstructor;
+import org.springframework.data.geo.Distance;
+import org.springframework.data.geo.Point;
+import org.springframework.data.redis.connection.RedisGeoCommands;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+@Component
+@AllArgsConstructor
+public class ValidateLoginAreaUtil {
+
+    private RedisTemplate redisTemplate;
+    private ConfigInfoService configInfoService;
+
+    /**
+     * 判断经坐标是否符合登录条件,这里使用Redis特殊数据类型来做
+     *
+     * @param longitude 经度
+     * @param latitude  纬度
+     */
+    public void checkCoordinate(Double longitude, Double latitude) {
+        //先获取系统配置里面的登录区域是否开启
+        ConfigInfo configInfo = configInfoService.findByKey("LOGIN_AREA_ISENABLE");
+        if (configInfo != null && "false".equals(configInfo.getConfigValue())) {
+            //未开启直接放行
+            return;
+        }
+        //查询经度、纬度、距离配置
+        String lgt = configInfoService.findByKey("LOGIN_AREA_LONGITUDE").getConfigValue(),
+                lat = configInfoService.findByKey("LOGIN_AREA_LATITUDE").getConfigValue(),
+                range = configInfoService.findByKey("LOGIN_AREA_RANGE").getConfigValue();
+        if (StrUtil.isBlank(lgt) || StrUtil.isBlank(lat) || StrUtil.isBlank(range)) {
+            throw new CaptchaException("系统配置异常,请联系管理员。");
+        }
+        Double lgtDouble;
+        Double latDouble;
+        Double rangeDouble;
+        try {
+            lgtDouble = Double.parseDouble(lgt);
+            latDouble = Double.parseDouble(lat);
+            rangeDouble = Double.parseDouble(range);
+        } catch (Exception e) {
+            throw new CaptchaException("系统配置异常,请联系管理员。");
+        }
+        //判断坐标是否符合登录要求
+        redisTemplate.opsForGeo().add("geo", new Point(lgtDouble, latDouble), "basic");
+        redisTemplate.opsForGeo().add("geo", new Point(longitude, latitude), "user");
+
+        Distance rangeDistance = redisTemplate.opsForGeo().distance("geo", "basic", "user", RedisGeoCommands.DistanceUnit.METERS);
+        if (rangeDistance.getValue() >= rangeDouble) {
+            throw new CaptchaException("请在城管局范围内使用小程序");
+        }
+
+    }
+}

+ 13 - 4
light-application-server/src/main/resources/application.yml

@@ -4,14 +4,14 @@ server:
 spring:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.0.100:3306/light_application_db?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://127.0.0.1:3306/light_application_db?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
     #url: jdbc:mysql://192.168.1.253:3306/light_application_db?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
     username: root
-    password: jd123456
+    password: 123456
   redis:
-    host: 192.168.0.100
+    host: 127.0.0.1
     port: 6379
-    password: jd123456
+    password:
     jedis:
       pool:
         max-active: 200
@@ -69,3 +69,12 @@ sms:
 weChat:
   appId: wxc4466f468dcf82a5
   appSecret: b8b63b8d5bd3c1d18d450109bde3f0b2
+
+#登录区域限制配置
+map:
+  #坐标经度
+  longitude: 106.524273
+  #坐标纬度
+  latitude: 29.623253
+  #判断范围
+  range:

+ 16 - 0
light-application-server/src/main/resources/mapper/ConfigInfoMapper.xml

@@ -0,0 +1,16 @@
+<?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.jd.lightapplication.mapper.ConfigInfoMapper">
+
+	<!-- 可根据自己的需求,是否要使用 -->
+   <resultMap type="com.jd.lightapplication.model.ConfigInfo" id="configInfoMap">
+        <result property="id" column="id"/>
+        <result property="key" column="key"/>
+        <result property="value" column="value"/>
+        <result property="remark" column="remark"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+</mapper>