fix: 修复编译错误并添加EasyExcel依赖

- 添加EasyExcel依赖到pom.xml
- 修复IStudentService缺少List导入
- 修复MemberServiceImpl类型转换问题
- 修复LocalDateTime/Date类型问题
- 删除未完成的ApiAuthInterceptor和OpenApiConfig
This commit is contained in:
神码-方晓辉 2026-01-31 23:52:37 +08:00
parent 178a1ea507
commit 2df0b7bc40
6 changed files with 27 additions and 126 deletions

View File

@ -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>

View File

@ -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/**");
}
}

View File

@ -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-TimestampX-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=xxxMD5 大写
*/
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();
}
}

View File

@ -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);

View File

@ -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;
/**
* 学生服务接口
*

View File

@ -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>