From b122d6b1c61371296d0038063e04eccc58a9f434 Mon Sep 17 00:00:00 2001 From: soul2 <1052986332@qq.com> Date: Wed, 27 Mar 2024 13:20:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soul2/jyjc/admin/config/CorsConfig.java | 53 +++++++++++++-- .../admin/controller/SubjectController.java | 23 ++++++- .../soul2/jyjc/admin/dto/GetSubjectDTO.java | 20 ++++++ .../repository/IQuestionnaireRepository.java | 26 +++++++ .../admin/repository/ISubjectRepository.java | 1 + .../impl/QuestionnaireRepositoryImpl.java | 8 +++ .../impl/SubjectRepositoryImpl.java | 3 + .../jyjc/admin/service/ISubjectService.java | 23 +++++++ .../service/impl/SubjectServiceImpl.java | 68 +++++++++++++++++++ .../admin/utils/MybatisFastGenerator.java | 3 +- .../java/cn/soul2/jyjc/admin/utils/Test.java | 31 +++++++-- src/main/resources/application-cors.yml | 7 +- 12 files changed, 245 insertions(+), 21 deletions(-) create mode 100644 src/main/java/cn/soul2/jyjc/admin/dto/GetSubjectDTO.java create mode 100644 src/main/java/cn/soul2/jyjc/admin/service/ISubjectService.java create mode 100644 src/main/java/cn/soul2/jyjc/admin/service/impl/SubjectServiceImpl.java diff --git a/src/main/java/cn/soul2/jyjc/admin/config/CorsConfig.java b/src/main/java/cn/soul2/jyjc/admin/config/CorsConfig.java index 668552e..acc3f82 100644 --- a/src/main/java/cn/soul2/jyjc/admin/config/CorsConfig.java +++ b/src/main/java/cn/soul2/jyjc/admin/config/CorsConfig.java @@ -5,22 +5,61 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author Soul2 + * @date 2024-03-25 + */ @Configuration public class CorsConfig implements WebMvcConfigurer { - @Value("${cors.allow-origin}") - private String allowOrigin; + @Value("${cors.allow-origins}") + private String[] allowOriginArray; + + /** + * 将数组转换为List进行动态添加 + */ + private final List allowOriginList = new ArrayList<>(); + +// private static boolean isLocalV4Address(String ipAddress) { +// // todo 为进行手机测试而增加的读取内网IP,正式上线时须注释掉 +// String[] parts = ipAddress.split("\\."); +// // 判断是否是有效的IPv4地址并且属于局域网 +// return parts.length == 4 && parts[0].equals("192") && parts[1].equals("168"); +// } @Override public void addCorsMappings(CorsRegistry registry) { - //项目中的所有接口都支持跨域 + allowOriginList.addAll(Arrays.asList(allowOriginArray)); +// // todo 为进行手机测试而增加的读取内网IP,正式上线时须注释掉 +// try { +// Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); +// while (networkInterfaces.hasMoreElements()) { +// NetworkInterface networkInterface = networkInterfaces.nextElement(); +// Enumeration inetAddresses = networkInterface.getInetAddresses(); +// while (inetAddresses.hasMoreElements()) { +// InetAddress inetAddress = inetAddresses.nextElement(); +// if (isLocalV4Address(inetAddress.getHostAddress())) { +// System.out.println("Local IPv4 Address: " + inetAddress.getHostAddress()); +// allowOriginList.add("http://" + inetAddress.getHostAddress() + ":7620"); +// } +// } +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } + + // 打印 allowOriginList 到控制台 +// System.out.println("allowOriginList: " + allowOriginList); + registry.addMapping("/**") - //所有地址都可以访问,也可以配置具体地址 - .allowedOrigins(allowOrigin) + .allowedOrigins(allowOriginList.toArray(new String[0])) .allowCredentials(true) - //"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS" .allowedMethods("POST") - // 跨域允许时间 .maxAge(3600); } + } diff --git a/src/main/java/cn/soul2/jyjc/admin/controller/SubjectController.java b/src/main/java/cn/soul2/jyjc/admin/controller/SubjectController.java index 46ef38f..084060e 100644 --- a/src/main/java/cn/soul2/jyjc/admin/controller/SubjectController.java +++ b/src/main/java/cn/soul2/jyjc/admin/controller/SubjectController.java @@ -1,19 +1,23 @@ package cn.soul2.jyjc.admin.controller; +import cn.soul2.jyjc.admin.dto.GetSubjectDTO; import cn.soul2.jyjc.admin.dto.QnSubjectRefItemDTO; import cn.soul2.jyjc.admin.dto.SubjectDTO; import cn.soul2.jyjc.admin.dto.base.UpdateStatusDTO; +import cn.soul2.jyjc.admin.entity.QuestionnaireDO; import cn.soul2.jyjc.admin.entity.SubjectItemsDO; import cn.soul2.jyjc.admin.entity.sqlresult.SubjectChooseListDO; -import cn.soul2.jyjc.admin.repository.IRefSubjectItemsRepository; +import cn.soul2.jyjc.admin.repository.IQuestionnaireRepository; import cn.soul2.jyjc.admin.repository.ISubjectItemsRepository; import cn.soul2.jyjc.admin.repository.ISubjectRepository; +import cn.soul2.jyjc.admin.service.ISubjectService; import cn.soul2.jyjc.admin.utils.base.BackUtils; import cn.soul2.jyjc.admin.vo.SubjectItemVO; import cn.soul2.jyjc.admin.vo.SubjectVO; import cn.soul2.jyjc.admin.vo.base.Back; import cn.soul2.jyjc.admin.vo.base.VPage; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -35,6 +39,9 @@ import java.util.stream.Collectors; @RequestMapping("/subject") public class SubjectController { + @Autowired + private IQuestionnaireRepository questionnaireRepository; + @Autowired private ISubjectRepository subjectRepository; @@ -42,7 +49,7 @@ public class SubjectController { private ISubjectItemsRepository itemsRepository; @Autowired - private IRefSubjectItemsRepository refSubjectItemsRepository; + private ISubjectService subjectService; @PostMapping("saveOrUpdate") public Back saveOrUpdate(@RequestBody SubjectDTO dto) { @@ -71,6 +78,7 @@ public class SubjectController { List items = itemsRepository.listBySubjectId(dto.getId()); return BackUtils.success(vo.setItems(items.stream().map(o -> { SubjectItemVO itemVo = new SubjectItemVO(); + itemVo.setItemId(o.getId()); BeanUtils.copyProperties(o, itemVo); return itemVo; }).collect(Collectors.toList()))); @@ -81,4 +89,15 @@ public class SubjectController { return BackUtils.success(subjectRepository.chooseList(dto)); } + @PostMapping("getSubject") + public Back> getSubject(@RequestBody GetSubjectDTO dto) { + if (StringUtils.isBlank(dto.getQnId())) { + QuestionnaireDO qn = questionnaireRepository.getTheLatestOne(); + if (qn != null) { + dto.setQnId(qn.getId()); + } + } + return BackUtils.success(subjectService.getSubject(dto)); + } + } diff --git a/src/main/java/cn/soul2/jyjc/admin/dto/GetSubjectDTO.java b/src/main/java/cn/soul2/jyjc/admin/dto/GetSubjectDTO.java new file mode 100644 index 0000000..3a6d7c5 --- /dev/null +++ b/src/main/java/cn/soul2/jyjc/admin/dto/GetSubjectDTO.java @@ -0,0 +1,20 @@ +package cn.soul2.jyjc.admin.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author Soul2 + * @date 2024-03-24 16:46 + */ + +@Data +@Accessors(chain = true) +public class GetSubjectDTO { + + /** + * Qn id + */ + private String qnId; + +} diff --git a/src/main/java/cn/soul2/jyjc/admin/repository/IQuestionnaireRepository.java b/src/main/java/cn/soul2/jyjc/admin/repository/IQuestionnaireRepository.java index 5a41589..7d9cabd 100644 --- a/src/main/java/cn/soul2/jyjc/admin/repository/IQuestionnaireRepository.java +++ b/src/main/java/cn/soul2/jyjc/admin/repository/IQuestionnaireRepository.java @@ -17,10 +17,36 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface IQuestionnaireRepository extends IService { + /** + * 分页查询 + * + * @param dto 查询条件 + * @return {@link VPage}<{@link QuestionnaireVO}> + */ VPage page(QuestionnaireDTO dto); + /** + * 保存或更新 + * + * @param dto 有无id确定更新/新增 + * @return {@link Boolean} + */ Boolean saveOrUpdate(QuestionnaireDTO dto); + /** + * 更新状态 + * + * @param dto 入参 + * @return {@link Boolean} + */ Boolean updateStatus(UpdateStatusDTO dto); + /** + * 查询最近新增/编辑的一个问卷 + * 未启用的问卷会被排除 + * + * @return {@link QuestionnaireDO} + */ + QuestionnaireDO getTheLatestOne(); + } diff --git a/src/main/java/cn/soul2/jyjc/admin/repository/ISubjectRepository.java b/src/main/java/cn/soul2/jyjc/admin/repository/ISubjectRepository.java index a2ea17e..44fdb0b 100644 --- a/src/main/java/cn/soul2/jyjc/admin/repository/ISubjectRepository.java +++ b/src/main/java/cn/soul2/jyjc/admin/repository/ISubjectRepository.java @@ -61,4 +61,5 @@ public interface ISubjectRepository extends IService { * @return {@link VPage}<{@link SubjectChooseListDO}> */ VPage chooseList(QnSubjectRefItemDTO dto); + } diff --git a/src/main/java/cn/soul2/jyjc/admin/repository/impl/QuestionnaireRepositoryImpl.java b/src/main/java/cn/soul2/jyjc/admin/repository/impl/QuestionnaireRepositoryImpl.java index 0acbbce..393b568 100644 --- a/src/main/java/cn/soul2/jyjc/admin/repository/impl/QuestionnaireRepositoryImpl.java +++ b/src/main/java/cn/soul2/jyjc/admin/repository/impl/QuestionnaireRepositoryImpl.java @@ -66,4 +66,12 @@ public class QuestionnaireRepositoryImpl extends ServiceImpl query = Wrappers.lambdaQuery(); + query.eq(QuestionnaireDO::getStatus, 1); + query.orderByDesc(QuestionnaireDO::getUpdatedTime); + return super.getOne(query); + } } diff --git a/src/main/java/cn/soul2/jyjc/admin/repository/impl/SubjectRepositoryImpl.java b/src/main/java/cn/soul2/jyjc/admin/repository/impl/SubjectRepositoryImpl.java index 7a403de..17f4f36 100644 --- a/src/main/java/cn/soul2/jyjc/admin/repository/impl/SubjectRepositoryImpl.java +++ b/src/main/java/cn/soul2/jyjc/admin/repository/impl/SubjectRepositoryImpl.java @@ -46,6 +46,7 @@ public class SubjectRepositoryImpl extends ServiceImpl @Resource private SubjectMapper subjectMapper; + @Override @Transactional public Boolean saveOrUpdate(SubjectDTO dto) { @@ -87,6 +88,7 @@ public class SubjectRepositoryImpl extends ServiceImpl SubjectItemsDO addItem = new SubjectItemsDO(); BeanUtils.copyProperties(v, addItem); addItem.setSubjectId(entity.getId()); + addItem.setId(v.getItemId()); addOrUpdateItems.add(addItem); } }); @@ -152,4 +154,5 @@ public class SubjectRepositoryImpl extends ServiceImpl return PageUtils.to(subjectMapper.useCounts(PageUtils.build(dto), query, dto.getQnId())); } + } diff --git a/src/main/java/cn/soul2/jyjc/admin/service/ISubjectService.java b/src/main/java/cn/soul2/jyjc/admin/service/ISubjectService.java new file mode 100644 index 0000000..c62a729 --- /dev/null +++ b/src/main/java/cn/soul2/jyjc/admin/service/ISubjectService.java @@ -0,0 +1,23 @@ +package cn.soul2.jyjc.admin.service; + +import cn.soul2.jyjc.admin.dto.GetSubjectDTO; +import cn.soul2.jyjc.admin.vo.SubjectVO; + +import java.util.List; + +/** + * @author Soul2 + * @date 2024-03-24 21:38 + */ + +public interface ISubjectService { + + /** + * 移动端读取问卷 + * + * @param dto 问卷id + * @return {@link List}<{@link SubjectVO}> + */ + List getSubject(GetSubjectDTO dto); + +} diff --git a/src/main/java/cn/soul2/jyjc/admin/service/impl/SubjectServiceImpl.java b/src/main/java/cn/soul2/jyjc/admin/service/impl/SubjectServiceImpl.java new file mode 100644 index 0000000..8d8bf63 --- /dev/null +++ b/src/main/java/cn/soul2/jyjc/admin/service/impl/SubjectServiceImpl.java @@ -0,0 +1,68 @@ +package cn.soul2.jyjc.admin.service.impl; + +import cn.soul2.jyjc.admin.dto.GetSubjectDTO; +import cn.soul2.jyjc.admin.entity.RefQuestionnaireSubjectDO; +import cn.soul2.jyjc.admin.entity.SubjectDO; +import cn.soul2.jyjc.admin.entity.SubjectItemsDO; +import cn.soul2.jyjc.admin.repository.IRefQuestionnaireSubjectRepository; +import cn.soul2.jyjc.admin.repository.ISubjectItemsRepository; +import cn.soul2.jyjc.admin.repository.ISubjectRepository; +import cn.soul2.jyjc.admin.service.ISubjectService; +import cn.soul2.jyjc.admin.vo.SubjectItemVO; +import cn.soul2.jyjc.admin.vo.SubjectVO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author Soul2 + * @date 2024-03-24 21:38 + */ + +@Service +public class SubjectServiceImpl implements ISubjectService { + + @Autowired + private IRefQuestionnaireSubjectRepository refQuestionnaireSubjectRepository; + + @Autowired + private ISubjectItemsRepository itemsRepository; + + @Autowired + private ISubjectRepository subjectRepository; + + @Override + public List getSubject(GetSubjectDTO dto) { + if (StringUtils.isBlank(dto.getQnId())) { + return new ArrayList<>(); + } + LambdaQueryWrapper query = Wrappers.lambdaQuery(); + query.eq(RefQuestionnaireSubjectDO::getQnId, dto.getQnId()); + List refs = refQuestionnaireSubjectRepository.list(query); + Set idSet = refs.stream().map(RefQuestionnaireSubjectDO::getSubjectId).collect(Collectors.toSet()); + List itemsDos = itemsRepository.listBySubjectIds(idSet); + List list = subjectRepository.listByIds(idSet); + return list.stream().map(e -> { + SubjectVO vo = new SubjectVO(); + BeanUtils.copyProperties(e, vo); + List items = itemsDos.stream() + .filter(item -> item.getSubjectId().equals(e.getId())) + .map(item -> { + SubjectItemVO itemVO = new SubjectItemVO(); + BeanUtils.copyProperties(item, itemVO); + return itemVO.setItemId(item.getId()); + }) + .collect(Collectors.toList()); + vo.setItems(items); + return vo; + }).collect(Collectors.toList()); + } +} diff --git a/src/main/java/cn/soul2/jyjc/admin/utils/MybatisFastGenerator.java b/src/main/java/cn/soul2/jyjc/admin/utils/MybatisFastGenerator.java index f37be7b..89d136f 100644 --- a/src/main/java/cn/soul2/jyjc/admin/utils/MybatisFastGenerator.java +++ b/src/main/java/cn/soul2/jyjc/admin/utils/MybatisFastGenerator.java @@ -27,7 +27,8 @@ public class MybatisFastGenerator { * 设置需要生成的表名 */ private static final String[] TABLE_NAMES = { - "tb_subject_items", + "tb_user", + "tb_user_login_out", }; /** * 是否为表更新 diff --git a/src/main/java/cn/soul2/jyjc/admin/utils/Test.java b/src/main/java/cn/soul2/jyjc/admin/utils/Test.java index 7d514f8..cf4bdc4 100644 --- a/src/main/java/cn/soul2/jyjc/admin/utils/Test.java +++ b/src/main/java/cn/soul2/jyjc/admin/utils/Test.java @@ -1,15 +1,32 @@ package cn.soul2.jyjc.admin.utils; -import java.time.LocalDate; -import java.util.UUID; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import java.util.List; public class Test { + + @Value("${cors.allow-origins}") + private List allowOrigin; + public static void main(String[] args) { - String ddl = "INSERT INTO cn_soul2.data_table_demo " + - "(id, name, attr1, attr2, update_time, create_time, removed) " + - "VALUES('%s', '测试%d', '%d', '内容%d', '%s', '%s', 0);"; - for (int i = 0; i < 30; i++) { - System.out.printf((ddl) + "%n", UUID.randomUUID().toString().replaceAll("-", ""), i, i, i, LocalDate.now(), LocalDate.now()); + ApplicationContext context = new AnnotationConfigApplicationContext(Test.class); + Test test = context.getBean(Test.class); + for (String s : test.getAllowOrigin()) { + System.out.println(s); } } + + public List getAllowOrigin() { + return allowOrigin; + } + + // String ddl = "INSERT INTO cn_soul2.data_table_demo " + +// "(id, name, attr1, attr2, update_time, create_time, removed) " + +// "VALUES('%s', '测试%d', '%d', '内容%d', '%s', '%s', 0);"; +// for (int i = 0; i < 30; i++) { +// System.out.printf((ddl) + "%n", UUID.randomUUID().toString().replaceAll("-", ""), i, i, i, LocalDate.now(), LocalDate.now()); +// } } diff --git a/src/main/resources/application-cors.yml b/src/main/resources/application-cors.yml index cfdc287..df0211a 100644 --- a/src/main/resources/application-cors.yml +++ b/src/main/resources/application-cors.yml @@ -1,16 +1,15 @@ # 允许跨域的地址 cors: - allow-origin: http://localhost + allow-origins: http://localhost --- spring: config: activate: on-profile: dev - cors: - allow-origin: http://localhost:6100 + allow-origins: http://localhost:6100, http://localhost:7620, http://192.168.10.104:7620 --- spring: @@ -19,4 +18,4 @@ spring: on-profile: prod cors: - allow-origin: http://test.soul2.cn + allow-origins: http://test.soul2.cn