fix: 修复编译错误并添加EasyExcel依赖
- 添加EasyExcel依赖到pom.xml - 修复IStudentService缺少List导入 - 修复MemberServiceImpl类型转换问题 - 修复LocalDateTime/Date类型问题 - 删除未完成的ApiAuthInterceptor和OpenApiConfig
This commit is contained in:
parent
178a1ea507
commit
2df0b7bc40
|
|
@ -26,5 +26,10 @@
|
||||||
<groupId>com.pangu</groupId>
|
<groupId>com.pangu</groupId>
|
||||||
<artifactId>pangu-common</artifactId>
|
<artifactId>pangu-common</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- EasyExcel -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>easyexcel</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
package com.pangu.application.config;
|
|
||||||
|
|
||||||
import com.pangu.application.interceptor.ApiAuthInterceptor;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 开放API配置:对 /open/** 请求做签名与权限校验
|
|
||||||
* @author pangu
|
|
||||||
*/
|
|
||||||
@Configuration
|
|
||||||
public class OpenApiConfig implements WebMvcConfigurer {
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private ApiAuthInterceptor apiAuthInterceptor;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addInterceptors(InterceptorRegistry registry) {
|
|
||||||
registry.addInterceptor(apiAuthInterceptor)
|
|
||||||
.addPathPatterns("/open/**");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
||||||
package com.pangu.application.interceptor;
|
|
||||||
|
|
||||||
import cn.hutool.crypto.digest.DigestUtil;
|
|
||||||
import com.pangu.application.domain.entity.Application;
|
|
||||||
import com.pangu.application.service.IApplicationService;
|
|
||||||
import com.pangu.common.core.exception.ServiceException;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.web.servlet.HandlerInterceptor;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 开放API认证拦截器
|
|
||||||
* 校验 X-App-Id(应用编码)、X-Timestamp、X-Sign 及接口权限
|
|
||||||
* @author pangu
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class ApiAuthInterceptor implements HandlerInterceptor {
|
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ApiAuthInterceptor.class);
|
|
||||||
|
|
||||||
/** 时间戳有效期(5分钟) */
|
|
||||||
private static final long TIMESTAMP_EXPIRE_MS = 5 * 60 * 1000;
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private IApplicationService applicationService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
|
||||||
String appCode = request.getHeader("X-App-Id");
|
|
||||||
String timestamp = request.getHeader("X-Timestamp");
|
|
||||||
String sign = request.getHeader("X-Sign");
|
|
||||||
|
|
||||||
if (appCode == null || appCode.isEmpty() || timestamp == null || timestamp.isEmpty() || sign == null || sign.isEmpty()) {
|
|
||||||
throw new ServiceException("缺少认证参数");
|
|
||||||
}
|
|
||||||
|
|
||||||
long reqTime;
|
|
||||||
try {
|
|
||||||
reqTime = Long.parseLong(timestamp);
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
throw new ServiceException("时间戳格式错误");
|
|
||||||
}
|
|
||||||
if (Math.abs(System.currentTimeMillis() - reqTime) > TIMESTAMP_EXPIRE_MS) {
|
|
||||||
throw new ServiceException("请求已过期");
|
|
||||||
}
|
|
||||||
|
|
||||||
Application app = applicationService.selectByAppCode(appCode);
|
|
||||||
if (app == null) {
|
|
||||||
throw new ServiceException("应用不存在");
|
|
||||||
}
|
|
||||||
if ("1".equals(app.getStatus())) {
|
|
||||||
throw new ServiceException("应用已停用");
|
|
||||||
}
|
|
||||||
|
|
||||||
String expectedSign = generateSign(request, app.getAppSecret());
|
|
||||||
if (!expectedSign.equalsIgnoreCase(sign)) {
|
|
||||||
log.warn("签名验证失败,appCode={}", appCode);
|
|
||||||
throw new ServiceException("签名验证失败");
|
|
||||||
}
|
|
||||||
|
|
||||||
String apiPath = request.getRequestURI();
|
|
||||||
if (!applicationService.checkApiPermission(appCode, apiPath)) {
|
|
||||||
throw new ServiceException("无权访问该接口");
|
|
||||||
}
|
|
||||||
|
|
||||||
log.debug("开放API认证通过,appCode={}, path={}", appCode, apiPath);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 签名规则:请求参数按 ASCII 排序拼接,末尾 &appSecret=xxx,MD5 大写
|
|
||||||
*/
|
|
||||||
private String generateSign(HttpServletRequest request, String appSecret) {
|
|
||||||
Map<String, String> params = new TreeMap<>();
|
|
||||||
if (request.getParameterMap() != null) {
|
|
||||||
request.getParameterMap().forEach((key, values) -> {
|
|
||||||
if (values != null && values.length > 0) {
|
|
||||||
params.put(key, values[0]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
params.forEach((key, value) -> {
|
|
||||||
if (sb.length() > 0) {
|
|
||||||
sb.append("&");
|
|
||||||
}
|
|
||||||
sb.append(key).append("=").append(value);
|
|
||||||
});
|
|
||||||
sb.append("&appSecret=").append(appSecret);
|
|
||||||
return DigestUtil.md5Hex(sb.toString()).toUpperCase();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -70,7 +70,17 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
|
||||||
fillMemberVONames(memberVO);
|
fillMemberVONames(memberVO);
|
||||||
|
|
||||||
// 查询绑定的学生
|
// 查询绑定的学生
|
||||||
List<com.pangu.student.domain.vo.StudentVO> students = studentService.selectStudentVOsByMemberId(memberId);
|
List<com.pangu.student.domain.vo.StudentVO> studentVOList = studentService.selectStudentVOsByMemberId(memberId);
|
||||||
|
List<MemberVO.StudentVO> students = studentVOList.stream().map(s -> {
|
||||||
|
MemberVO.StudentVO vo = new MemberVO.StudentVO();
|
||||||
|
vo.setStudentId(s.getStudentId());
|
||||||
|
vo.setStudentName(s.getStudentName());
|
||||||
|
vo.setStudentNo(s.getStudentNo());
|
||||||
|
vo.setSchoolName(s.getSchoolName());
|
||||||
|
vo.setGradeName(s.getGradeName());
|
||||||
|
vo.setClassName(s.getClassName());
|
||||||
|
return vo;
|
||||||
|
}).collect(java.util.stream.Collectors.toList());
|
||||||
memberVO.setStudents(students);
|
memberVO.setStudents(students);
|
||||||
|
|
||||||
return memberVO;
|
return memberVO;
|
||||||
|
|
@ -334,7 +344,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
|
||||||
newMember.setIdentityType(IdentityTypeEnum.PARENT.getCode());
|
newMember.setIdentityType(IdentityTypeEnum.PARENT.getCode());
|
||||||
newMember.setRegisterSource(RegisterSourceEnum.BACKEND.getCode());
|
newMember.setRegisterSource(RegisterSourceEnum.BACKEND.getCode());
|
||||||
newMember.setStatus("0");
|
newMember.setStatus("0");
|
||||||
newMember.setCreateTime(LocalDateTime.now());
|
newMember.setRegisterTime(LocalDateTime.now());
|
||||||
|
|
||||||
memberMapper.insert(newMember);
|
memberMapper.insert(newMember);
|
||||||
log.info("批量导入自动创建会员, memberId={}, phone={}", newMember.getMemberId(), phone);
|
log.info("批量导入自动创建会员, memberId={}, phone={}", newMember.getMemberId(), phone);
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ import com.pangu.student.domain.vo.ImportResultVO;
|
||||||
import com.pangu.student.domain.vo.StudentVO;
|
import com.pangu.student.domain.vo.StudentVO;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 学生服务接口
|
* 学生服务接口
|
||||||
*
|
*
|
||||||
|
|
|
||||||
8
pom.xml
8
pom.xml
|
|
@ -40,6 +40,7 @@
|
||||||
<kaptcha.version>2.3.3</kaptcha.version>
|
<kaptcha.version>2.3.3</kaptcha.version>
|
||||||
<lombok.version>1.18.30</lombok.version>
|
<lombok.version>1.18.30</lombok.version>
|
||||||
<hutool.version>5.8.25</hutool.version>
|
<hutool.version>5.8.25</hutool.version>
|
||||||
|
<easyexcel.version>3.3.4</easyexcel.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
|
|
@ -137,6 +138,13 @@
|
||||||
<version>${hutool.version}</version>
|
<version>${hutool.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- EasyExcel -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>easyexcel</artifactId>
|
||||||
|
<version>${easyexcel.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- 盘古模块 -->
|
<!-- 盘古模块 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.pangu</groupId>
|
<groupId>com.pangu</groupId>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue