Browse Source

1.增加H5端登录以及跨域配置;2.优化H5端设备统计信息查询

jiuling 11 months ago
parent
commit
4a9e4ee881
18 changed files with 157 additions and 25 deletions
  1. 10 0
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java
  2. 5 0
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java
  3. 2 2
      ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
  4. 12 0
      ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java
  5. 27 4
      ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
  6. 1 0
      ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
  7. 25 0
      ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CorsConfig.java
  8. 5 0
      ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
  9. 26 0
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
  10. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
  11. 8 0
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
  12. 12 0
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  13. 6 2
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
  14. 3 3
      ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/controller/DeviceController.java
  15. 3 2
      ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/service/IDeviceService.java
  16. 3 2
      ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/service/impl/DeviceServiceImpl.java
  17. 1 1
      ruoyi-modules/ruoyi-uniapp/src/main/resources/bootstrap.yml
  18. 6 9
      ruoyi-modules/ruoyi-uniapp/src/main/resources/mapper/DeviceMapper.xml

+ 10 - 0
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java

@@ -51,4 +51,14 @@ public interface RemoteUserService
      */
     @PutMapping("/user/recordlogin")
     public R<Boolean> recordUserLogin(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * 通过用户手机号询用户信息
+     *
+     * @param phoneNumber 手机号
+     * @param source 请求来源
+     * @return 结果
+     */
+    @GetMapping("/user/infoWeb/{phoneNumber}")
+    R<LoginUser> getUserByPhoneNumber(@PathVariable("phoneNumber") String phoneNumber, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 }

+ 5 - 0
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java

@@ -42,6 +42,11 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
             {
                 return R.fail("记录用户登录信息失败:" + throwable.getMessage());
             }
+
+            @Override
+            public R<LoginUser> getUserByPhoneNumber(String phoneNumber, String source) {
+                return R.fail("获取用户失败:" + throwable.getMessage());
+            }
         };
     }
 }

+ 2 - 2
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java

@@ -35,7 +35,7 @@ public class TokenController
     public R<?> login(@RequestBody LoginBody form)
     {
         // 用户登录
-        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
+        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(),form.getPhoneNumber());
         // 获取登录token
         return R.ok(tokenService.createToken(userInfo));
     }
@@ -72,7 +72,7 @@ public class TokenController
     public R<?> register(@RequestBody RegisterBody registerBody)
     {
         // 用户注册
-        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword());
+        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(),registerBody.getPhoneNumber());
         return R.ok();
     }
 }

+ 12 - 0
ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java

@@ -16,6 +16,18 @@ public class LoginBody
      * 用户密码
      */
     private String password;
+    /*
+    * 手机号
+    * */
+    private String phoneNumber;
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
 
     public String getUsername()
     {

+ 27 - 4
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java

@@ -19,6 +19,8 @@ import com.ruoyi.system.api.RemoteUserService;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.model.LoginUser;
 
+import java.util.regex.Pattern;
+
 /**
  * 登录校验方法
  * 
@@ -42,7 +44,7 @@ public class SysLoginService
     /**
      * 登录
      */
-    public LoginUser login(String username, String password)
+    public LoginUser login(String username, String password,String phoneNumber)
     {
         // 用户名或密码为空 错误
         if (StringUtils.isAnyBlank(username, password))
@@ -71,8 +73,13 @@ public class SysLoginService
             recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单");
             throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
         }
-        // 查询用户信息
-        R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
+        R<LoginUser> userResult;
+        if (phoneNumber != null){// H5 登录根据手机号查询出用户信息进行后续流程
+            userResult = remoteUserService.getUserByPhoneNumber(phoneNumber, SecurityConstants.INNER);
+        }else {
+            // 查询用户信息
+            userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
+        }
 
         if (R.FAIL == userResult.getCode())
         {
@@ -91,12 +98,23 @@ public class SysLoginService
             recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
             throw new ServiceException("对不起,您的账号:" + username + " 已停用");
         }
+        // 验证手机号格式
+        if (isMobile(username)) {
+            if (!user.getPhonenumber().equals(username)) {
+                recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "手机号不匹配");
+                throw new ServiceException("手机号不匹配");
+            }
+        }
         passwordService.validate(user, password);
         recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
         recordLoginInfo(user.getUserId());
         return userInfo;
     }
 
+    private boolean isMobile(String str) {
+    // 使用正则表达式验证手机号
+    return Pattern.matches("^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0-8]|18[0-9]|19[89])\\d{8}$", str);
+}
     /**
      * 记录登录信息
      *
@@ -121,7 +139,7 @@ public class SysLoginService
     /**
      * 注册
      */
-    public void register(String username, String password)
+    public void register(String username, String password,String phoneNumber)
     {
         // 用户名或密码为空 错误
         if (StringUtils.isAnyBlank(username, password))
@@ -138,11 +156,16 @@ public class SysLoginService
         {
             throw new ServiceException("密码长度必须在5到20个字符之间");
         }
+        // 验证手机号格式
+        if (!isMobile(phoneNumber)) {
+            throw new ServiceException("手机号不匹配");
+        }
 
         // 注册用户信息
         SysUser sysUser = new SysUser();
         sysUser.setUserName(username);
         sysUser.setNickName(username);
+        sysUser.setPhonenumber(phoneNumber);
         sysUser.setPassword(SecurityUtils.encryptPassword(password));
         R<?> registerResult = remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER);
 

+ 1 - 0
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java

@@ -67,6 +67,7 @@ public class TokenService
         Map<String, Object> rspMap = new HashMap<String, Object>();
         rspMap.put("access_token", JwtUtils.createToken(claimsMap));
         rspMap.put("expires_in", TOKEN_EXPIRE_TIME);
+        rspMap.put("userInfo", loginUser);// 返回用户信息 H5端使用
         return rspMap;
     }
     /**

+ 25 - 0
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CorsConfig.java

@@ -0,0 +1,25 @@
+package com.ruoyi.gateway.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.util.pattern.PathPatternParser;
+
+@Configuration
+public class CorsConfig {
+
+    @Bean
+    public CorsWebFilter corsWebFilter() {
+        CorsConfiguration config = new CorsConfiguration();
+        config.addAllowedOrigin("http://localhost:9000"); // 只允许H5访问
+        config.addAllowedHeader("*");
+        config.addAllowedMethod("*");
+        config.setAllowCredentials(true); // 允许带上cookie
+
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
+        source.registerCorsConfiguration("/**", config);
+        return new CorsWebFilter(source);
+    }
+}

+ 5 - 0
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java

@@ -49,6 +49,11 @@ public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object>
             {
                 return chain.filter(exchange);
             }
+            // ==== 👇 新增:判断是否为 H5 请求 ====
+            String clientType = request.getHeaders().getFirst("Client-Type");
+            if ("H5".equalsIgnoreCase(clientType)) {
+                return chain.filter(exchange); // H5 请求跳过验证码
+            }
 
             try
             {

+ 26 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java

@@ -133,6 +133,28 @@ public class SysUserController extends BaseController
         sysUserVo.setPermissions(permissions);
         return R.ok(sysUserVo);
     }
+    /**
+     * 获取当前用户信息
+     */
+    @InnerAuth
+    @GetMapping("/infoWeb/{phoneNumber}")
+    public R<LoginUser> infoWeb(@PathVariable("phoneNumber") String phoneNumber)
+    {
+        SysUser sysUser = userService.selectUserByPhoneNumber(phoneNumber);
+        if (StringUtils.isNull(sysUser))
+        {
+            return R.fail("手机号或密码错误");
+        }
+        // 角色集合
+        Set<String> roles = permissionService.getRolePermission(sysUser);
+        // 权限集合
+        Set<String> permissions = permissionService.getMenuPermission(sysUser);
+        LoginUser sysUserVo = new LoginUser();
+        sysUserVo.setSysUser(sysUser);
+        sysUserVo.setRoles(roles);
+        sysUserVo.setPermissions(permissions);
+        return R.ok(sysUserVo);
+    }
 
     /**
      * 注册用户信息
@@ -150,6 +172,10 @@ public class SysUserController extends BaseController
         {
             return R.fail("保存用户'" + username + "'失败,注册账号已存在");
         }
+        if (!userService.checkPhoneUnique(sysUser))
+        {
+            return R.fail("保存用户'" + username + "'失败,注册手机账号已存在");
+        }
         return R.ok(userService.registerUser(sysUser));
     }
 

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -125,4 +125,6 @@ public interface SysUserMapper
      * @return 结果
      */
     public SysUser checkEmailUnique(String email);
+
+    SysUser selectUserByPhoneNumber(String phoneNumber);
 }

+ 8 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java

@@ -47,6 +47,14 @@ public interface ISysUserService
      */
     public SysUser selectUserByUserName(String userName);
 
+    /**
+     * 通过用户手机号查询用户
+     *
+     * @param phoneNumber 手机号
+     * @return 用户对象信息
+     */
+    public SysUser selectUserByPhoneNumber(String phoneNumber);
+
     /**
      * 通过用户ID查询用户
      * 

+ 12 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -131,6 +131,18 @@ public class SysUserServiceImpl implements ISysUserService
         return userMapper.selectUserByUserName(userName);
     }
 
+    /**
+     * 通过用户手机号查询用户
+     *
+     * @param phoneNumber 手机号
+     * @return 用户对象信息
+     */
+    @Override
+    public SysUser selectUserByPhoneNumber(String phoneNumber)
+    {
+        return userMapper.selectUserByPhoneNumber(phoneNumber);
+    }
+
     /**
      * 通过用户ID查询用户
      * 

+ 6 - 2
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -154,8 +154,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
-	
-	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
+    <select id="selectUserByPhoneNumber" parameterType="String" resultMap="SysUserResult">
+		<include refid="selectUserVo"/>
+		where u.phonenumber = #{phoneNumber} and u.del_flag = '0'
+	</select>
+
+    <insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
  			<if test="deptId != null and deptId != 0">dept_id,</if>

+ 3 - 3
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/controller/DeviceController.java

@@ -91,11 +91,11 @@ public class DeviceController extends BaseController {
     }
     
     /**
-     * 获取设备采集器详情(包含气象/土壤数据和告警信息)
+     * 根据设备编号获取设备详情(包含气象/土壤数据和告警信息)
      */
     @GetMapping("/collector/detail/{deviceId}")
-    public R<WeatherRealtimeData> getDeviceCollectorDetail(@PathVariable("deviceId") String deviceId) {
-        WeatherRealtimeData detail = deviceService.getDeviceDetail(deviceId);
+    public R<WeatherRealtimeData> getDeviceCollectorDetail(@PathVariable("deviceId") String deviceId,String deviceTypeId) {
+        WeatherRealtimeData detail = deviceService.getDeviceDetail(deviceId,deviceTypeId);
         return R.ok(detail);
     }
 } 

+ 3 - 2
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/service/IDeviceService.java

@@ -40,10 +40,11 @@ public interface IDeviceService {
     public DeviceOverviewVO getDeviceOverview(String userId, String fieldId);
 
     /**
-     * 获取设备详情(包含气象/土壤数据和告警信息)
+     * 根据设备编号获取设备详情(包含气象/土壤数据和告警信息)
      *
      * @param deviceId 设备编号
+     * @param deviceTypeId 设备类型编号
      * @return 设备详情数据
      */
-    public WeatherRealtimeData getDeviceDetail(String deviceId);
+    public WeatherRealtimeData getDeviceDetail(String deviceId,String deviceTypeId);
 } 

+ 3 - 2
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/service/impl/DeviceServiceImpl.java

@@ -117,15 +117,16 @@ public class DeviceServiceImpl implements IDeviceService {
      * 获取设备详情(包含气象/土壤数据和告警信息)
      *
      * @param deviceId 设备编号
+     * @param deviceTypeId 设备类型编号
      * @return 设备详情数据
      */
     @Override
-    public WeatherRealtimeData getDeviceDetail(String deviceId) {
+    public WeatherRealtimeData getDeviceDetail(String deviceId,String deviceTypeId) {
         //获取最新的气象/土壤数据 /告警数据
         WeatherRealtimeData weatherRealtimeData = weatherRealtimeDataMapper.selectLatestDataByDeviceId(deviceId);
 
         if (weatherRealtimeData == null) {
-            return null;
+            weatherRealtimeData = new WeatherRealtimeData();
         }
         // 获取当前设备的告警信息(未处理且最近三条;后续考虑增加分页查询)
         List<AlertRecord> alertRecords = alertRecordMapper.selectAlertRecordsByDeviceId(deviceId);

+ 1 - 1
ruoyi-modules/ruoyi-uniapp/src/main/resources/bootstrap.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9203
+  port: 9400
 
 # Spring
 spring: 

+ 6 - 9
ruoyi-modules/ruoyi-uniapp/src/main/resources/mapper/DeviceMapper.xml

@@ -32,9 +32,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectDeviceList" parameterType="com.ruoyi.uniapp.domain.dto.DeviceDto" resultMap="DeviceResult">
         <include refid="selectDeviceVo"/>
-        LEFT JOIN field_device fd ON fd.device_id = d.id
-        LEFT JOIN field f ON f.id = fd.field_id
-        LEFT JOIN field_personnel fp ON fd.id = fp.field_id
+        INNER JOIN field_device fd ON fd.device_id = d.id AND fd.status = 0
+        INNER JOIN field f ON f.id = fd.field_id
+        INNER JOIN field_personnel fp ON fp.field_id = f.id AND fp.status = 0
         <where>  
             <if test="deviceId != null  and deviceId != ''"> and d.device_id = #{deviceId}</if>
             <if test="fieldId != null  and fieldId != ''"> and fd.field_id = #{fieldId}</if>
@@ -48,8 +48,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 d.device_id like concat('%', #{deviceQueryParams}, '%')
                 )
             </if>
-            AND fd.`status` = 0
-            AND fp.`status` = 0
         </where>
         order by create_time desc
     </select>
@@ -65,8 +63,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SUM(CASE WHEN d.status = 1 THEN 1 ELSE 0 END) AS onlineDevices,
         SUM(CASE WHEN d.status = 0 THEN 1 ELSE 0 END) AS offlineDevices
         FROM device d
-        LEFT JOIN field_device fd ON fd.device_id = d.id
-        LEFT JOIN field_personnel fp ON fd.id = fp.field_id
+        INNER JOIN field_device fd ON fd.device_id = d.id AND fd.status = 0
+        INNER JOIN field f ON f.id = fd.field_id
+        INNER JOIN field_personnel fp ON fp.field_id = f.id AND fp.status = 0
         <where>
             <if test="fieldId != null and fieldId != ''">
                 AND fd.field_id = #{fieldId}
@@ -74,8 +73,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userId != null and userId != ''">
                 AND fp.user_id = #{userId}
             </if>
-            AND fp.`status` = 0
-            AND fd.`status` = 0
         </where>
     </select>