Compare commits

..

13 Commits

Author SHA1 Message Date
chenxudong c9394fcc60 解决文件导入的问题。 2024-11-28 13:42:49 +08:00
chenxudong 74b3d9714f clean code 2024-11-28 12:03:41 +08:00
chenxudong 8344baed68 解决下载文件乱码的问题 2024-11-28 09:48:31 +08:00
chenxudong df92c856af Merge branch 'develop' into test 2024-11-27 16:58:43 +08:00
578646533@qq.com 464f46cbf7 Merge branch 'develop' into test
# Conflicts:
#	bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java
#	domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/impl/EDDataServiceImpl.java
#	service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java
2024-11-27 11:23:15 +08:00
s2042968 010eb97a26 登出接口 2024-11-26 11:06:17 +08:00
s2042968 39a279b96b 解决冲突 2024-11-25 16:44:53 +08:00
s2042968 cea8c222a2 增加用户校验,未发布用户不能登录 2024-11-25 14:28:54 +08:00
578646533@qq.com a72c47581b 打包发布 2024-11-22 13:48:31 +08:00
578646533@qq.com dc26b61e18 去除无效的引用 2024-11-22 10:10:44 +08:00
578646533@qq.com a580177800 增加导入和导出步骤 2024-11-21 19:01:52 +08:00
578646533@qq.com bf06d60796 Merge remote-tracking branch 'origin/develop' into test 2024-11-21 19:00:18 +08:00
578646533@qq.com 306bf091e7 增加导入和导出步骤 2024-11-21 18:58:58 +08:00
37 changed files with 260 additions and 179 deletions

View File

@ -149,9 +149,8 @@
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.13.RELEASE</version> <version>2.1.13.RELEASE</version>
<configuration> <configuration>
<!-- executable fat jar --> <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7087</jvmArguments>
<outputDirectory>../target</outputDirectory> <executable>true</executable>
<!-- <classifier>executable</classifier>-->
</configuration> </configuration>
<executions> <executions>
<execution> <execution>
@ -161,6 +160,14 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>

View File

@ -1,17 +1,13 @@
package com.electromagnetic.industry.software.data.manage.controller.user; package com.electromagnetic.industry.software.data.manage.controller.user;
import com.electromagnetic.industry.software.data.manage.facade.user.UserFacade; import com.electromagnetic.industry.software.data.manage.facade.user.UserFacade;
import com.electromagnetic.industry.software.data.manage.request.user.GetSingleUserRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserModiRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserPublishRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserLoginRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserRequest;
import electromagnetic.data.framework.share.model.ElectromagneticResult;
import com.electromagnetic.industry.software.data.manage.request.user.*; import com.electromagnetic.industry.software.data.manage.request.user.*;
import electromagnetic.data.framework.share.model.ElectromagneticResult;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@RequestMapping("/data/ed/user") @RequestMapping("/data/ed/user")
@RestController @RestController
@ -65,4 +61,10 @@ public class UserController {
public ElectromagneticResult<?> deleteUser(@RequestBody UserDeleteRequest userDeleteRequest) { public ElectromagneticResult<?> deleteUser(@RequestBody UserDeleteRequest userDeleteRequest) {
return userFacade.deleteUser(userDeleteRequest); return userFacade.deleteUser(userDeleteRequest);
} }
@ApiOperation(value="登出", notes = "")
@RequestMapping(value = "/logout", method = RequestMethod.POST)
public ElectromagneticResult<?> logout(@RequestHeader("Authorization") String token) {
return userFacade.logout(token);
}
} }

View File

@ -0,0 +1,28 @@
#required
spring.application.name=electromagnetic-data
spring.profiles.active=test
# security
run.mode=NORMAL
com.alipay.env=shared
#log
logging.path=./logs
loggerPath=electromagnetic-data
logging.level.com.aliyun.fsi.insurance=${LOG_LEVEL:INFO}
#日志配置
logging.config=classpath:${LOG_CONFIG:log4j2-spring.xml}
spring.datasource.typd=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/em_data?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true
spring.datasource.username=comac
spring.datasource.password=2024*Comac
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
mybatis.mapper-locations=classpath:sqlmapper/*.xml
pagehelper.helperDialect=mysql
pagehelper.reasonable=false
server.port=8888

View File

@ -12,9 +12,6 @@ logging.config=classpath:${LOG_CONFIG:log4j2-spring.xml}
spring.datasource.typd=com.alibaba.druid.pool.DruidDataSource spring.datasource.typd=com.alibaba.druid.pool.DruidDataSource
#spring.datasource.url=jdbc:mysql://${DATASOURCE_URL:obproxy-0c63.ops.cloud.cic.inter}:3306/${DATASOURCE_HOST:dataplatform_ptst}?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true
#spring.datasource.username=${DATASOURCE_NAME:dataplatform@ProjectTest_tenant5#testdb}
#spring.datasource.password=${DATASOURCE_PASSWORD:Y7G6v4_3ijn77K_Kbl_U85}
spring.datasource.url=jdbc:mysql://139.224.43.89:3306/em_data?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true spring.datasource.url=jdbc:mysql://139.224.43.89:3306/em_data?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true
spring.datasource.username=comac spring.datasource.username=comac
spring.datasource.password=2024*Comac spring.datasource.password=2024*Comac
@ -27,7 +24,6 @@ mybatis.mapper-locations=classpath:sqlmapper/*.xml
pagehelper.helperDialect=mysql pagehelper.helperDialect=mysql
pagehelper.reasonable=false pagehelper.reasonable=false
server.port=8888 server.port=8888
zip.password=~~BYE6cWGBJJjsU9DczYtZIQ==
#windows文件存储目录 #windows文件存储目录
data.windows.path=E:/comacFileStorage/ data.windows.path=E:/comacFileStorage/
@ -41,3 +37,4 @@ data.upload.cache.dir=upload
data.export.cache.dir=export data.export.cache.dir=export
#导入数据时文件的缓存文件夹名称 #导入数据时文件的缓存文件夹名称
data.import.cache.dir=import data.import.cache.dir=import
file.encode.passwd=adknfhkj87654knd

View File

@ -5,7 +5,6 @@ package com.electromagnetic.industry.software.data.manage.domain.boardservice.in
import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.model.EDDataInfo; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.model.EDDataInfo;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.parames.EDDataParams; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.parames.EDDataParams;
import com.github.pagehelper.PageInfo;
import java.util.List; import java.util.List;

View File

@ -54,15 +54,11 @@ import java.util.*;
@Slf4j @Slf4j
public class EDDataServiceImpl implements EDDataService { public class EDDataServiceImpl implements EDDataService {
// private static final Logger LOGGER = LoggerFactory.getLogger(LoggerConstant.DOMAIN_SERVICE);
@Resource @Resource
private EDDataRepository edDataRepository; private EDDataRepository edDataRepository;
@Resource @Resource
private CategoryRepository categoryRepository; private CategoryRepository categoryRepository;
@Value("${zip.password}")
private String passwordZIP;
@Value("${data.windows.path}") @Value("${data.windows.path}")
private String windowsDir; private String windowsDir;
@Value("${data.file.cache.dir}") @Value("${data.file.cache.dir}")
@ -73,6 +69,8 @@ public class EDDataServiceImpl implements EDDataService {
private String uploadCacheDir; private String uploadCacheDir;
@Value("${data.export.cache.dir}") @Value("${data.export.cache.dir}")
private String exportCacheDir; private String exportCacheDir;
@Value("${file.encode.passwd}")
private String encodePasswd;
// 文件夹名称分隔符 // 文件夹名称分隔符
private static final String FOLDER_NAME_SEPARATOR = "_"; private static final String FOLDER_NAME_SEPARATOR = "_";
@ -537,7 +535,6 @@ public class EDDataServiceImpl implements EDDataService {
log.info("文件数据已成功复制到目标目录。"); log.info("文件数据已成功复制到目标目录。");
// 将目录树数据 文件夹及文件夹内数据 进行压缩打包 // 将目录树数据 文件夹及文件夹内数据 进行压缩打包
Date date = new Date(); Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
@ -545,11 +542,10 @@ public class EDDataServiceImpl implements EDDataService {
zipPathFileName = dataCachePath + "/exportData_" + dateString; zipPathFileName = dataCachePath + "/exportData_" + dateString;
enCodeZipPathFileName = dataCachePath + "/exportData_" + dateString + ".comac"; enCodeZipPathFileName = dataCachePath + "/exportData_" + dateString + ".comac";
// EleZipUtil.zipFile(exportDataDirectory, zipPathFileName, passwordZIP);
ZipUtil.zip(exportDataCachePath, zipPathFileName); ZipUtil.zip(exportDataCachePath, zipPathFileName);
String password = "adknfhkj87654knd";
AES aes = SecureUtil.aes(password.getBytes()); // aesKey是加密密钥 AES aes = SecureUtil.aes(encodePasswd.getBytes()); // aesKey是加密密钥
try ( try (
InputStream inputStream = new FileInputStream(zipPathFileName); InputStream inputStream = new FileInputStream(zipPathFileName);
OutputStream outputStream = new FileOutputStream(enCodeZipPathFileName); OutputStream outputStream = new FileOutputStream(enCodeZipPathFileName);
@ -565,8 +561,6 @@ public class EDDataServiceImpl implements EDDataService {
log.error("导出数据异常..", e); log.error("导出数据异常..", e);
} }
finally { finally {
//删除临时文件
//FileUtil.del(zipPathFileName);
// 删除 导出数据的 缓存目录 // 删除 导出数据的 缓存目录
FileUtil.del(exportDataCachePath); FileUtil.del(exportDataCachePath);
} }

View File

@ -0,0 +1,24 @@
package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 发布状态枚举
*/
@AllArgsConstructor
@Getter
public enum PublishEnum {
/**
* 已发布
*/
PUBLISHED(1,"已发布"),
/**
* 未发布
*/
UNPUBLISHED(0,"未发布"),
;
private Integer code;
private String desc;
}

View File

@ -1,9 +1,9 @@
package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params; package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params;
import java.util.List;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class PublishParam { public class PublishParam {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -2,8 +2,6 @@ package com.electromagnetic.industry.software.data.manage.domain.boardservice.us
import lombok.Data; import lombok.Data;
import java.util.Date;
@Data @Data
public class UserDeleteKeyWords { public class UserDeleteKeyWords {

View File

@ -17,4 +17,11 @@ public interface TokenRepository {
* @return * @return
*/ */
public Token selectToken(String token); public Token selectToken(String token);
/**
* 删除令牌
* @param token
* @return
*/
public int deleteToken(String token);
} }

View File

@ -1,8 +1,8 @@
package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository; package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords;
import java.util.List; import java.util.List;

View File

@ -24,4 +24,9 @@ public interface TokenService {
* 查看token是否有效 * 查看token是否有效
*/ */
public Boolean isTokenValid(String tokenStr); public Boolean isTokenValid(String tokenStr);
/**
* 删除token
*/
public int deleteToken(String tokenStr);
} }

View File

@ -1,8 +1,8 @@
package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service; package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords;
import java.util.List; import java.util.List;
@ -69,8 +69,15 @@ public interface UserService {
/** /**
* 根据userId逻辑删除用户 * 根据userId逻辑删除用户
* @param userId * @param userDeleteKeyWords
* @return * @return
*/ */
Boolean deleteUser(UserDeleteKeyWords userDeleteKeyWords); Boolean deleteUser(UserDeleteKeyWords userDeleteKeyWords);
/**
* 检查用户是否有效未发布的用户无效实习到期的用户无效
* @param user
* @return
*/
Boolean checkUserValid(User user);
} }

View File

@ -71,4 +71,12 @@ public class TokenServiceImpl implements TokenService {
} }
return false; return false;
} }
/**
* 删除token
*/
@Override
public int deleteToken(String tokenStr){
return tokenRepository.deleteToken(tokenStr);
}
} }

View File

@ -1,8 +1,10 @@
package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.impl; package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.impl;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.enums.EffectFlagEnum;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.enums.PublishEnum;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository.UserRepository; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository.UserRepository;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.UserService; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.UserService;
@ -11,9 +13,10 @@ import electromagnetic.data.framework.share.util.SignUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.lang.String;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
import static cn.hutool.core.date.DateTime.now;
@Service @Service
public class UserServiceImpl implements UserService { public class UserServiceImpl implements UserService {
@ -111,4 +114,22 @@ public class UserServiceImpl implements UserService {
public Boolean deleteUser(UserDeleteKeyWords userDeleteKeyWords) { public Boolean deleteUser(UserDeleteKeyWords userDeleteKeyWords) {
return userRepository.deleteUser(userDeleteKeyWords)>0; return userRepository.deleteUser(userDeleteKeyWords)>0;
} }
/**
* 检查用户是否有效未发布,实习到期,已被逻辑删除的用户无效
* @param user
* @return
*/
@Override
public Boolean checkUserValid(User user){
if ( user == null
|| user.getIsPublished() == PublishEnum.UNPUBLISHED.getCode()
|| user.getEffectFlag() == EffectFlagEnum.EFFECT_FLAG_0.getCode()
) {
return false;
} else if( user.getInternshipEndDate()!=null && user.getInternshipEndDate().before(now())) {
return false;
}
return true;
}
} }

View File

@ -8,14 +8,15 @@ package electromagnetic.data.framework.share.sign;
* @version $Id: AESUtils.java, v 0.1 2022-07-06 14:57 * @version $Id: AESUtils.java, v 0.1 2022-07-06 14:57
*/ */
import org.apache.tomcat.util.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.*; import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom; import java.security.SecureRandom;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.apache.tomcat.util.codec.binary.Base64;
import java.security.Security; import java.security.Security;
/** /**

View File

@ -1,6 +1,5 @@
package com.electromagnetic.industry.software.data.manage.facade.Category; package com.electromagnetic.industry.software.data.manage.facade.Category;
import java.util.List;
import electromagnetic.data.framework.share.model.ElectromagneticResult; import electromagnetic.data.framework.share.model.ElectromagneticResult;
public interface CategoryFacade { public interface CategoryFacade {

View File

@ -1,12 +1,9 @@
package com.electromagnetic.industry.software.data.manage.facade.user; package com.electromagnetic.industry.software.data.manage.facade.user;
import com.electromagnetic.industry.software.data.manage.request.user.GetSingleUserRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserModiRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserPublishRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserLoginRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserRequest;
import electromagnetic.data.framework.share.model.ElectromagneticResult;
import com.electromagnetic.industry.software.data.manage.request.user.*; import com.electromagnetic.industry.software.data.manage.request.user.*;
import electromagnetic.data.framework.share.model.ElectromagneticResult;
import javax.servlet.http.HttpServletRequest;
public interface UserFacade { public interface UserFacade {
@ -66,4 +63,11 @@ public interface UserFacade {
* @return * @return
*/ */
ElectromagneticResult<?> deleteUser(UserDeleteRequest userDeleteRequest); ElectromagneticResult<?> deleteUser(UserDeleteRequest userDeleteRequest);
/**
* 用户登出
* @param token
* @return
*/
ElectromagneticResult<?> logout(String token);
} }

View File

@ -1,8 +1,8 @@
package com.electromagnetic.industry.software.data.manage.request.indicator; package com.electromagnetic.industry.software.data.manage.request.indicator;
import org.springframework.web.multipart.MultipartFile;
import electromagnetic.data.framework.share.model.BaseRequest; import electromagnetic.data.framework.share.model.BaseRequest;
import lombok.Data; import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
import java.util.Date; import java.util.Date;

View File

@ -1,6 +1,5 @@
package com.electromagnetic.industry.software.data.manage.request.user; package com.electromagnetic.industry.software.data.manage.request.user;
import cn.hutool.core.date.DateTime;
import electromagnetic.data.framework.share.model.BaseRequest; import electromagnetic.data.framework.share.model.BaseRequest;
import lombok.Data; import lombok.Data;

View File

@ -1,11 +1,9 @@
package com.electromagnetic.industry.software.data.manage.request.user; package com.electromagnetic.industry.software.data.manage.request.user;
import cn.hutool.core.date.DateTime;
import electromagnetic.data.framework.share.model.BaseRequest; import electromagnetic.data.framework.share.model.BaseRequest;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
@Data @Data

View File

@ -1,11 +1,9 @@
package com.electromagnetic.industry.software.data.manage.request.user; package com.electromagnetic.industry.software.data.manage.request.user;
import cn.hutool.core.date.DateTime;
import electromagnetic.data.framework.share.model.BaseRequest; import electromagnetic.data.framework.share.model.BaseRequest;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
import java.util.List; import java.util.List;

View File

@ -1,11 +1,9 @@
package com.electromagnetic.industry.software.data.manage.request.user; package com.electromagnetic.industry.software.data.manage.request.user;
import cn.hutool.core.date.DateTime;
import electromagnetic.data.framework.share.model.BaseRequest; import electromagnetic.data.framework.share.model.BaseRequest;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
@Data @Data

View File

@ -4,7 +4,6 @@
package com.electromagnetic.industry.software.data.manage.response.user; package com.electromagnetic.industry.software.data.manage.response.user;
import lombok.Data; import lombok.Data;
import org.apache.catalina.User;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;

View File

@ -2,8 +2,6 @@ package com.electromagnetic.industry.software.data.manage.repository.dao;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.model.EDDataInfo; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.model.EDDataInfo;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.parames.EDDataParams; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.parames.EDDataParams;
import com.electromagnetic.industry.software.data.manage.request.indicator.EDDataRequest;
import electromagnetic.data.framework.share.model.ElectromagneticResult;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;

View File

@ -19,4 +19,11 @@ public interface TokenMapper {
* @return Token * @return Token
*/ */
Token selectToken(String token); Token selectToken(String token);
/**
* 删除token
* @param token
* @return
*/
int deleteToken(String token);
} }

View File

@ -1,8 +1,8 @@
package com.electromagnetic.industry.software.data.manage.repository.dao; package com.electromagnetic.industry.software.data.manage.repository.dao;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;

View File

@ -7,8 +7,6 @@ import com.electromagnetic.industry.software.data.manage.domain.boardservice.ind
import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.parames.EDDataParams; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.parames.EDDataParams;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.repository.EDDataRepository; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.repository.EDDataRepository;
import com.electromagnetic.industry.software.data.manage.repository.dao.EDDataMapper; import com.electromagnetic.industry.software.data.manage.repository.dao.EDDataMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import javax.annotation.Resource; import javax.annotation.Resource;

View File

@ -30,4 +30,12 @@ public class TokenRepositoryImpl implements TokenRepository {
*/ */
@Override @Override
public Token selectToken(String token) {return tokenMapper.selectToken(token);} public Token selectToken(String token) {return tokenMapper.selectToken(token);}
/**
* 删除令牌
* @param token
* @return
*/
@Override
public int deleteToken(String token) {return tokenMapper.deleteToken(token);};
} }

View File

@ -4,16 +4,16 @@
package com.electromagnetic.industry.software.data.manage.repository.impl; package com.electromagnetic.industry.software.data.manage.repository.impl;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository.UserRepository; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository.UserRepository;
import com.electromagnetic.industry.software.data.manage.repository.dao.UserMapper; import com.electromagnetic.industry.software.data.manage.repository.dao.UserMapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
@Repository @Repository
public class UserRepositoryImpl implements UserRepository { public class UserRepositoryImpl implements UserRepository {

View File

@ -36,4 +36,8 @@
where token=#{token} where token=#{token}
</select> </select>
<delete id="deleteToken" parameterType="String">
delete from tokens where token=#{token}
</delete>
</mapper> </mapper>

View File

@ -122,7 +122,7 @@
<if test="isPublished != null and isPublished != ''"> <if test="isPublished != null and isPublished != ''">
<choose> <choose>
<when test="isPublished != 'all'"> <when test="isPublished != 'all'">
AND is_published = CAST(#{isPublished} AS INT) AND is_published = CAST(#{isPublished} AS SIGNED)
</when> </when>
</choose> </choose>
</if> </if>

135
pom.xml
View File

@ -258,89 +258,78 @@
<finalName>electromagnetic</finalName> <finalName>electromagnetic</finalName>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>maven-resources-plugin</artifactId>
<configuration> <configuration>
<includeSystemScope>true</includeSystemScope> <nonFilteredFileExtensions>
<nonFilteredFileExtension>ico</nonFilteredFileExtension>
<mainClass>none</mainClass> <!-- 取消查找本项目下的Main方法为了解决Unable to find main class的问题 --> <nonFilteredFileExtension>eot</nonFilteredFileExtension>
<classifier>execute</classifier> <!-- 为了解决依赖模块找不到此模块中的类或属性 --> <nonFilteredFileExtension>svg</nonFilteredFileExtension>
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
<nonFilteredFileExtension>woff</nonFilteredFileExtension>
<nonFilteredFileExtension>woff2</nonFilteredFileExtension>
<nonFilteredFileExtension>tag</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration> </configuration>
<executions> </plugin>
<execution> <!--<plugin>-->
<goals> <!--<groupId>org.springframework.boot</groupId>-->
<goal>repackage</goal> <!--<artifactId>spring-boot-maven-plugin</artifactId>-->
</goals> <!--<configuration>-->
</execution> <!--<fork>true</fork>-->
</executions> <!--</configuration>-->
<!--</plugin>-->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.0.0</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.2</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<!-- 添加引入本地jar组件 -->
<!-- <compilerArguments>
<extdirs>D:/code/tool/dataplatform-tool-parent/lib/dingtalk-1.0.0.jar</extdirs>
</compilerArguments>-->
<!--<compilerArgs>
<arg>-extdirs</arg>
<arg>${project.basedir}/lib/</arg>
</compilerArgs>-->
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId> <artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration> <configuration>
<encoding>UTF-8</encoding> <delimiters>
</configuration> <delimiter>@</delimiter>
<executions> </delimiters>
<execution> <useDefaultDelimiters>true</useDefaultDelimiters>
<configuration>
<!-- <dataFile>target/jacoco.exec</dataFile>-->
<outputDirectory>/usr/src/target</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<instrumentation>
<excludes>
<exclude>**/*DO.class</exclude>
<exclude>**/*Config.class</exclude>
<exclude>**/*Param.class</exclude>
<exclude>**/*Enum.class</exclude>
</excludes>
</instrumentation>
<check/>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
<resources>
<resource>
<directory>src/main/webapp</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.btl</include>
</includes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>static/**</exclude>
</excludes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>static/**</include>
</includes>
</resource>
</resources>
</build> </build>
</project> </project>

View File

@ -9,6 +9,7 @@
<groupId>com.electromagnetic.data</groupId> <groupId>com.electromagnetic.data</groupId>
<artifactId>electromagnetic-data</artifactId> <artifactId>electromagnetic-data</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
</parent> </parent>
<groupId>com.electromagnetic.data</groupId> <groupId>com.electromagnetic.data</groupId>
@ -32,7 +33,6 @@
<groupId>com.github.pagehelper</groupId> <groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId> <artifactId>pagehelper</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.electromagnetic.data</groupId> <groupId>com.electromagnetic.data</groupId>
<artifactId>electromagnetic-framework</artifactId> <artifactId>electromagnetic-framework</artifactId>

View File

@ -1,9 +1,9 @@
package com.electromagnetic.industry.software.data.manage.service.facade; package com.electromagnetic.industry.software.data.manage.service.facade;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.text.StrFormatter;
import cn.hutool.core.util.ZipUtil; import cn.hutool.core.util.ZipUtil;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES; import cn.hutool.crypto.symmetric.AES;
@ -32,8 +32,6 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.*; import java.io.*;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -46,19 +44,17 @@ public class EDDataFacadeImpl implements EDDataFacade {
@Value("${data.windows.path}") @Value("${data.windows.path}")
private String uploadFilePath; private String uploadFilePath;
@Value("${data.windows.path}")
private String windowsDir;
@Value("${data.file.cache.dir}")
private String fileCacheDir;
@Value("${data.file.storage.dir}") @Value("${data.file.storage.dir}")
private String fileStorageDir; private String fileStorageDir;
@Value("${data.upload.cache.dir}")
private String uploadCacheDir;
@Value("${data.export.cache.dir}")
private String exportCacheDir;
@Value("${data.import.cache.dir}") @Value("${data.import.cache.dir}")
private String importCacheDir; private String importCacheDir;
@Value("${file.encode.passwd}")
private String encodePasswd;
private static final String UPLOAD_FILE_CHUNK_SUFFIX = ".part"; private static final String UPLOAD_FILE_CHUNK_SUFFIX = ".part";
@ -186,28 +182,20 @@ public class EDDataFacadeImpl implements EDDataFacade {
String filePath = storageFilePath + "/" + filePathOfFolder + "/" + edDataInfo.getDataName(); String filePath = storageFilePath + "/" + filePathOfFolder + "/" + edDataInfo.getDataName();
Assert.isTrue(FileUtil.exist(filePath), "下载文件不存在。"); Assert.isTrue(FileUtil.exist(filePath), "下载文件不存在。");
File file = new File(filePath); FileSystemResource fileSystemResource = new FileSystemResource(filePath);
FileSystemResource fileSystemResource = new FileSystemResource(file);
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
String fileName = fileSystemResource.getFilename();
byte[] fileNameBytes = fileName.getBytes(StandardCharsets.UTF_8);
fileName = new String(fileNameBytes, 0, fileNameBytes.length, StandardCharsets.ISO_8859_1);
String attachment = StrFormatter.format("attachment;filename={}", fileName);
//headers.add("Content-Disposition", attachment);
// headers.set("attachment", fileName);
headers.add("Pragma", "no-cache"); headers.add("Pragma", "no-cache");
headers.add("Expires", "0"); headers.add("Expires", "0");
response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8")); String fileName = Base64.encode(fileSystemResource.getFilename());
// response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(fileSystemResource.getFilename().getBytes("UTF-8"), "ISO8859-1")); response.setHeader("content-disposition","attachment;filename=" + fileName);
// 构建响应实体(可以返回<byte[]或Resource返回类型取决body入参类型) // 构建响应实体(可以返回<byte[]或Resource返回类型取决body入参类型)
return ResponseEntity return ResponseEntity
.ok() .ok()
.headers(headers) .headers(headers)
.contentLength(fileSystemResource.contentLength()) .contentLength(fileSystemResource.contentLength())
.contentType(MediaType.parseMediaType("application/octet-stream")) .contentType(MediaType.parseMediaType("application/octet-stream;charset=UTF-8"))
.body(new InputStreamResource(fileSystemResource.getInputStream())); .body(new InputStreamResource(fileSystemResource.getInputStream()));
} }
/** /**
@ -235,13 +223,10 @@ public class EDDataFacadeImpl implements EDDataFacade {
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
String fileName = fileSystemResource.getFilename(); String fileName = Base64.encode(fileSystemResource.getFilename());
byte[] fileNameBytes = fileName.getBytes(StandardCharsets.UTF_8);
fileName = new String(fileNameBytes, 0, fileNameBytes.length, StandardCharsets.ISO_8859_1);
String attachment = StrFormatter.format("attachment;filename={}", fileName);
headers.add("Pragma", "no-cache"); headers.add("Pragma", "no-cache");
headers.add("Expires", "0"); headers.add("Expires", "0");
response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8")); response.setHeader("content-disposition","attachment;filename=" + fileName);
// 构建响应实体(可以返回<byte[]或Resource返回类型取决body入参类型) // 构建响应实体(可以返回<byte[]或Resource返回类型取决body入参类型)
return ResponseEntity return ResponseEntity
@ -310,14 +295,13 @@ public class EDDataFacadeImpl implements EDDataFacade {
String dataCachePath = edDataService.getDataCachePath(); String dataCachePath = edDataService.getDataCachePath();
String importDataCachePath = dataCachePath + importCacheDir; String importDataCachePath = dataCachePath + importCacheDir;
String destPath = importDataCachePath + identifier; String destPath = importDataCachePath + identifier;
if (!FileUtil.exist(new File(destPath))) { if (!FileUtil.exist(new File(destPath))) {
return new ArrayList<>(); return new ArrayList<>();
} }
List<Integer> uploadedFileChunkNums = FileUtil.listFileNames(destPath) List<Integer> uploadedFileChunkNums = FileUtil.listFileNames(destPath)
.stream() .stream()
.filter(e -> !e.endsWith(".zip")) .filter(e -> !e.endsWith(".comac"))
.map(e -> e.replace(UPLOAD_FILE_CHUNK_SUFFIX, "")) .map(e -> e.replace(UPLOAD_FILE_CHUNK_SUFFIX, ""))
.map(Integer::parseInt) .map(Integer::parseInt)
.collect(Collectors.toList()); .collect(Collectors.toList());
@ -369,8 +353,7 @@ public class EDDataFacadeImpl implements EDDataFacade {
// 解密文件 // 解密文件
String decryptFilePath = destZipPath + "_decrypted"; String decryptFilePath = destZipPath + "_decrypted";
String password = "adknfhkj87654knd"; AES aes = SecureUtil.aes(encodePasswd.getBytes()); // aesKey是加密密钥
AES aes = SecureUtil.aes(password.getBytes()); // aesKey是加密密钥
try( try(
InputStream inputStream = new FileInputStream(destZipPath); InputStream inputStream = new FileInputStream(destZipPath);
OutputStream outputStream = new FileOutputStream(decryptFilePath); OutputStream outputStream = new FileOutputStream(decryptFilePath);

View File

@ -11,15 +11,10 @@ import com.electromagnetic.industry.software.data.manage.domain.boardservice.use
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.util.UserConstant; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.util.UserConstant;
import com.electromagnetic.industry.software.data.manage.facade.user.UserFacade; import com.electromagnetic.industry.software.data.manage.facade.user.UserFacade;
import com.electromagnetic.industry.software.data.manage.request.user.*; import com.electromagnetic.industry.software.data.manage.request.user.*;
import com.electromagnetic.industry.software.data.manage.request.user.UserModiRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserPublishRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserLoginRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserRequest;
import com.electromagnetic.industry.software.data.manage.response.user.SingleUserResponse; import com.electromagnetic.industry.software.data.manage.response.user.SingleUserResponse;
import com.electromagnetic.industry.software.data.manage.response.user.UserLoginResponse; import com.electromagnetic.industry.software.data.manage.response.user.UserLoginResponse;
import com.electromagnetic.industry.software.data.manage.response.user.UserSearchResponse; import com.electromagnetic.industry.software.data.manage.response.user.UserSearchResponse;
import com.electromagnetic.industry.software.data.manage.service.mappers.UserMappers; import com.electromagnetic.industry.software.data.manage.service.mappers.UserMappers;
import com.github.pagehelper.PageInfo;
import electromagnetic.data.framework.share.id.IdWorker; import electromagnetic.data.framework.share.id.IdWorker;
import electromagnetic.data.framework.share.model.ElectromagneticResult; import electromagnetic.data.framework.share.model.ElectromagneticResult;
import electromagnetic.data.framework.share.model.ElectromagneticResultUtil; import electromagnetic.data.framework.share.model.ElectromagneticResultUtil;
@ -29,6 +24,7 @@ import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.List;
@Service @Service
@ -49,7 +45,7 @@ public class UserFacadeImpl implements UserFacade {
UserLoginInfo info = UserMappers.INSTANCE.getUserLoginRequestToModel(loginRequest); UserLoginInfo info = UserMappers.INSTANCE.getUserLoginRequestToModel(loginRequest);
String decodePwd = AESUtils.decrypt(info.getUserPwd(), UserConstant.SECRET_KEY); String decodePwd = AESUtils.decrypt(info.getUserPwd(), UserConstant.SECRET_KEY);
User user = userService.getUserByWorkNumber(info.getWorkNumber()); User user = userService.getUserByWorkNumber(info.getWorkNumber());
if ( user!=null && userService.matchPassword(user, decodePwd)) { if ( userService.checkUserValid(user) && userService.matchPassword(user, decodePwd)) {
String tokenStr = tokenService.createToken(info); String tokenStr = tokenService.createToken(info);
tokenService.createUserToken(user, tokenStr); tokenService.createUserToken(user, tokenStr);
UserLoginResponse userLoginResponse = new UserLoginResponse(); UserLoginResponse userLoginResponse = new UserLoginResponse();
@ -200,6 +196,14 @@ public class UserFacadeImpl implements UserFacade {
} }
} }
/**
* 用户登出
* @param token
* @return
*/
@Override
public ElectromagneticResult<?> logout(String token) {
token = token.substring(7);
return ElectromagneticResultUtil.success(tokenService.deleteToken(token));
}
} }

View File

@ -3,15 +3,12 @@
*/ */
package com.electromagnetic.industry.software.data.manage.service.mappers; package com.electromagnetic.industry.software.data.manage.service.mappers;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.UserLoginInfo;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.PublishParam;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.SearchKeyWords;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.params.UserDeleteKeyWords;
import com.electromagnetic.industry.software.data.manage.request.user.UserModiRequest;
import com.electromagnetic.industry.software.data.manage.request.user.*; import com.electromagnetic.industry.software.data.manage.request.user.*;
import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.UserLoginInfo;
import com.electromagnetic.industry.software.data.manage.request.user.UserLoginRequest;
import com.electromagnetic.industry.software.data.manage.request.user.UserRequest;
import com.electromagnetic.industry.software.data.manage.response.user.SingleUserResponse; import com.electromagnetic.industry.software.data.manage.response.user.SingleUserResponse;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;