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>
|
||||
<artifactId>pangu-common</artifactId>
|
||||
</dependency>
|
||||
<!-- EasyExcel -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>easyexcel</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</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);
|
||||
|
||||
// 查询绑定的学生
|
||||
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);
|
||||
|
||||
return memberVO;
|
||||
|
|
@ -334,7 +344,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
|
|||
newMember.setIdentityType(IdentityTypeEnum.PARENT.getCode());
|
||||
newMember.setRegisterSource(RegisterSourceEnum.BACKEND.getCode());
|
||||
newMember.setStatus("0");
|
||||
newMember.setCreateTime(LocalDateTime.now());
|
||||
newMember.setRegisterTime(LocalDateTime.now());
|
||||
|
||||
memberMapper.insert(newMember);
|
||||
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 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>
|
||||
<lombok.version>1.18.30</lombok.version>
|
||||
<hutool.version>5.8.25</hutool.version>
|
||||
<easyexcel.version>3.3.4</easyexcel.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
|
|
@ -137,6 +138,13 @@
|
|||
<version>${hutool.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- EasyExcel -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>easyexcel</artifactId>
|
||||
<version>${easyexcel.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 盘古模块 -->
|
||||
<dependency>
|
||||
<groupId>com.pangu</groupId>
|
||||
|
|
|
|||
Loading…
Reference in New Issue