Преглед на файлове

停车场手机管理端接口:验证码获取、登录验证,基础组件

chenwen преди 3 години
родител
ревизия
e71e0c6d61

+ 13 - 0
src/main/java/com/charging/chargingparking/mapper/mobile/ParkingSiteMapper.java

@@ -0,0 +1,13 @@
+package com.charging.chargingparking.mapper.mobile;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+public interface ParkingSiteMapper {
+
+	List<Map<String,Object>> loadMyParkingSites(String usId);
+	
+	Integer getUsingCount(@Param("parkingIds") String[] parkingIds);
+}

+ 63 - 0
src/main/java/com/charging/chargingparking/modules/mobileController/MobileAuthController.java

@@ -0,0 +1,63 @@
+package com.charging.chargingparking.modules.mobileController;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.charging.chargingparking.dto.MessageResult;
+import com.charging.chargingparking.utils.RespVO;
+import com.charging.chargingparking.utils.RespVOBuilder;
+import com.charging.chargingparking.utils.SMSUtil;
+
+@RestController
+@Validated
+@RequestMapping("/mobileApi/auth")
+public class MobileAuthController {
+	
+	
+	
+	@Autowired
+    private VerifyCoder verifyCoder;
+
+	/**
+	 * 获取验证码
+	 * @param phoneNum
+	 * @return
+	 */
+	@RequestMapping("/getVerifyCode")
+	public RespVO getVerifyCode(@NotNull(message = "手机号不能为空") @Pattern(regexp = "^1[3-9]\\d{9}", message = "手机号无效") String phoneNum) {
+		String newCode=verifyCoder.generate(phoneNum);
+		MessageResult msgRst=SMSUtil.send(phoneNum, SMSUtil.REG_TEMPLATE_CODE, "{\"code\":\""+newCode+"\"}");
+		if(msgRst.isResult()) {
+			return RespVOBuilder.ok();
+		}
+		else {
+			return RespVOBuilder.error(msgRst.getMessage());
+		}
+		
+	}
+	
+	/**
+	   *  验证登录信息
+	 * @param phoneNum
+	 * @param verifyCode
+	 * @return
+	 */
+	@RequestMapping("/checkLogin")
+	public RespVO checkLogin(@NotNull(message = "手机号不能为空") @Pattern(regexp = "^1[3-9]\\d{9}", message = "手机号无效") String phoneNum,String verifyCode) {
+		String refVerifyCode=verifyCoder.getFromSession(phoneNum);
+		if(refVerifyCode==null) {
+			return RespVOBuilder.error("验证码错误或已过期");
+		}
+		if(!verifyCode.equals(refVerifyCode)) {
+			return RespVOBuilder.error("验证码输入错误");
+		}
+		//验证通过后,清除验证码缓存
+		verifyCoder.clear(phoneNum);
+		return RespVOBuilder.ok();
+	}
+}

+ 42 - 0
src/main/java/com/charging/chargingparking/modules/mobileController/ParkingSiteController.java

@@ -0,0 +1,42 @@
+package com.charging.chargingparking.modules.mobileController;
+
+import javax.validation.constraints.NotBlank;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.charging.chargingparking.modules.mobileservice.ParkingSiteService;
+import com.charging.chargingparking.utils.RespVO;
+import com.charging.chargingparking.utils.RespVOBuilder;
+
+@RestController
+@Validated
+@RequestMapping("/mobileApi/parkingSite")
+public class ParkingSiteController {
+
+	@Autowired
+	private ParkingSiteService  service;
+	
+	/**
+	 * 加载当前用户的所有停车场基本信息
+	 * @param usId
+	 * @return
+	 */
+	@RequestMapping("/loadMy")
+	public RespVO  loadMy(@NotBlank(message = "usId【用户编号】不能为空") String usId) {
+			return RespVOBuilder.ok(service.loadMyParkingSites(usId));
+	}
+	
+	/**
+	 * 获取指定停车场已用车位数
+	 * @param parkingIds
+	 * @return
+	 */
+	@RequestMapping("/getUsingCount")
+	public RespVO  getUsingCount(@NotBlank(message = "parkingIds【停车场编号】不能为空") String parkingIds) {
+			return RespVOBuilder.ok(service.getUsingCount(StringUtils.split(parkingIds, ",")));
+	}
+}

+ 50 - 0
src/main/java/com/charging/chargingparking/modules/mobileController/VerifyCoder.java

@@ -0,0 +1,50 @@
+package com.charging.chargingparking.modules.mobileController;
+
+import java.util.concurrent.TimeUnit;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+@Component
+public class VerifyCoder {
+	
+	public static final String VERIFY_CODE_KEY="verify_code";
+	
+	public static final int VERIFY_CODE_TIMEOUT_MIN=5;  //有效时间,分钟
+	
+	@Autowired
+    private ValueOperations<String, Object> valueOperations;
+	
+	//根据资料重复set,超时时间会重新计算
+	public  String generate(String phoneNum) {
+		String newCode=String.valueOf(VerifyCoder.generate());
+		valueOperations.set(getKey(phoneNum), newCode, VERIFY_CODE_TIMEOUT_MIN, TimeUnit.MINUTES);
+		return newCode;
+	}
+	
+	public String getFromSession(String phoneNum) {
+		return (String)valueOperations.get(getKey(phoneNum));
+	}
+	
+	public void clear(String phoneNum) {
+		valueOperations.getOperations().delete(getKey(phoneNum));
+	}
+	
+	private String getKey(String phoneNum) {
+		return VERIFY_CODE_KEY+"_"+phoneNum;
+	}
+
+	public static int generate(){
+		int code=(int)Math.floor(Math.random()*1000000);
+		if(code<100000){ //保证为6位
+			code=code*10;
+		}
+		return code;
+	}
+	
+	public static void main(String[] args){
+		System.out.println(String.format("[\"%d\"]",VerifyCoder.generate()));
+		//System.out.println(String.format("%06d", 47879));
+	}
+}

+ 21 - 0
src/main/java/com/charging/chargingparking/modules/mobileservice/ParkingSiteService.java

@@ -0,0 +1,21 @@
+package com.charging.chargingparking.modules.mobileservice;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ParkingSiteService {
+
+	/**
+	 * 加载当前用户的所有停车场基本信息
+	 * @param usId
+	 * @return
+	 */
+	List<Map<String,Object>> loadMyParkingSites(String usId);
+	
+	/**
+	 * 获取指定停车场已用车位数
+	 * @param parkingIds
+	 * @return
+	 */
+	Integer getUsingCount(String[] parkingIds);
+}

+ 31 - 0
src/main/java/com/charging/chargingparking/modules/mobileservice/impl/ParkingSiteServiceImp.java

@@ -0,0 +1,31 @@
+package com.charging.chargingparking.modules.mobileservice.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.charging.chargingparking.mapper.mobile.ParkingSiteMapper;
+import com.charging.chargingparking.modules.mobileservice.ParkingSiteService;
+
+@Service
+@Transactional(readOnly = true)
+public class ParkingSiteServiceImp implements ParkingSiteService {
+
+	@Autowired
+	private ParkingSiteMapper mapper;
+	
+	@Override
+	public List<Map<String, Object>> loadMyParkingSites(String usId) {
+		return mapper.loadMyParkingSites(usId);
+	}
+
+	@Override
+	public Integer getUsingCount(String[] parkingIds) {
+		
+		return mapper.getUsingCount(parkingIds);
+	}
+
+}

+ 60 - 0
src/main/java/com/charging/chargingparking/utils/RequestValidateExceptionHandler.java

@@ -0,0 +1,60 @@
+package com.charging.chargingparking.utils;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.validation.BindException;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class RequestValidateExceptionHandler {
+	
+	private static final Logger logger=LoggerFactory.getLogger(RequestValidateExceptionHandler.class);
+
+	//处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
+	@ExceptionHandler(ConstraintViolationException.class)
+	public RespVO constraintViolationExceptionHandler(ConstraintViolationException e) {
+		//e.printStackTrace();
+		Set<ConstraintViolation<?>> constraintViolations=e.getConstraintViolations();
+		StringBuilder error=new StringBuilder();
+		for(ConstraintViolation<?> itm : constraintViolations) {
+			//System.out.println(itm.getInvalidValue()+":"+itm.getPropertyPath()+":"+itm.getMessage());
+			error.append(itm.getMessage()+";");
+		}
+		//jdk8  写法:String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
+		return RespVOBuilder.error(error.toString());//
+	}
+	
+	@ExceptionHandler(BindException.class)
+	public RespVO validationExceptionHandler(BindException e) {
+		//e.printStackTrace();
+		BindingResult bindingResult = e.getBindingResult();
+		StringBuilder error=new StringBuilder();
+		for (FieldError fieldError : bindingResult.getFieldErrors()) {
+			error.append(fieldError.getDefaultMessage()+";");
+		}
+		return RespVOBuilder.error(error.toString());
+	}
+	
+	@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+	public RespVO methodUnsupportExceptionHandler(HttpRequestMethodNotSupportedException e) {
+		logger.error("不支持该请求方式",e);
+		return RespVOBuilder.error("不支持该请求方式");
+		
+	}
+	
+	@ExceptionHandler(Exception.class)
+	public RespVO otherExceptionHandler(Exception e) {
+		logger.error("服务出错",e);
+		return RespVOBuilder.error("服务出错");
+		
+	}
+}

+ 47 - 0
src/main/java/com/charging/chargingparking/utils/RespVO.java

@@ -0,0 +1,47 @@
+package com.charging.chargingparking.utils;
+
+public class RespVO {
+
+	private Boolean success;
+	
+	private Object  data;
+	
+	private String  msg;
+	
+	
+	public RespVO() {
+		this.success=true;
+	}
+	
+	public RespVO(Boolean success,Object  data,String  msg) {
+		this.success=success;
+		this.data=data;
+		this.msg=msg;
+	}
+
+	public Boolean getSuccess() {
+		return success;
+	}
+
+	public void setSuccess(Boolean success) {
+		this.success = success;
+	}
+
+	public Object getData() {
+		return data;
+	}
+
+	public void setData(Object data) {
+		this.data = data;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+	
+	
+}

+ 20 - 0
src/main/java/com/charging/chargingparking/utils/RespVOBuilder.java

@@ -0,0 +1,20 @@
+package com.charging.chargingparking.utils;
+
+public class RespVOBuilder {
+
+	public static RespVO  ok() {  //默认只设置success=true
+		return new RespVO();
+	}
+	
+	public static RespVO  ok(Object data) {
+		return new RespVO(true,data,null);
+	}
+	
+	public static RespVO  error(String msg) {
+		return new RespVO(false,null,msg);
+	}
+	
+	public static RespVO  error(String msg,Object data) {
+		return new RespVO(false,data,msg);
+	}
+}

+ 25 - 0
src/main/resources/mapper/api/ParkingSiteMapper.xml

@@ -0,0 +1,25 @@
+<?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.charging.chargingparking.mapper.mobile.ParkingSiteMapper">
+    
+    <!-- 加载当前用户所有的停车场基本信息 -->
+    <select id="loadMyParkingSites" resultType="java.util.HashMap">
+        select a.parking_name,a.id from base_parking_info a
+        inner join base_parking_user_relation b on a.id = b.parking_id
+        where b.reg_user_id = #{0} and a.del_flag=false and b.del_flag=false
+        order by a.parking_name
+    </select>
+    
+    <!-- 获取指定停车场已用车位数 可传多个停车场id参数,根据是否有出场时间判断是否占用车位 -->
+    <select id="getUsingCount" resultType="java.lang.Integer">
+    	select count(distinct car_num) from base_parking_record  pr
+		where pr.del_flag=false 
+		and pr.out_parking_time is null
+		and park_id in 
+		<foreach collection="parkingIds" item="id" index="index" open="(" close=")" separator=",">
+           #{id}
+    	</foreach>
+    </select>
+</mapper>