移动端的部分内容

soul2/mobile_api
soul2 1 year ago
parent 8de9482790
commit b122d6b1c6
  1. 53
      src/main/java/cn/soul2/jyjc/admin/config/CorsConfig.java
  2. 23
      src/main/java/cn/soul2/jyjc/admin/controller/SubjectController.java
  3. 20
      src/main/java/cn/soul2/jyjc/admin/dto/GetSubjectDTO.java
  4. 26
      src/main/java/cn/soul2/jyjc/admin/repository/IQuestionnaireRepository.java
  5. 1
      src/main/java/cn/soul2/jyjc/admin/repository/ISubjectRepository.java
  6. 8
      src/main/java/cn/soul2/jyjc/admin/repository/impl/QuestionnaireRepositoryImpl.java
  7. 3
      src/main/java/cn/soul2/jyjc/admin/repository/impl/SubjectRepositoryImpl.java
  8. 23
      src/main/java/cn/soul2/jyjc/admin/service/ISubjectService.java
  9. 68
      src/main/java/cn/soul2/jyjc/admin/service/impl/SubjectServiceImpl.java
  10. 3
      src/main/java/cn/soul2/jyjc/admin/utils/MybatisFastGenerator.java
  11. 31
      src/main/java/cn/soul2/jyjc/admin/utils/Test.java
  12. 7
      src/main/resources/application-cors.yml

@ -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<String> 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<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
// while (networkInterfaces.hasMoreElements()) {
// NetworkInterface networkInterface = networkInterfaces.nextElement();
// Enumeration<InetAddress> 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);
}
}

@ -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<Boolean> saveOrUpdate(@RequestBody SubjectDTO dto) {
@ -71,6 +78,7 @@ public class SubjectController {
List<SubjectItemsDO> 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<List<SubjectVO>> 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));
}
}

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

@ -17,10 +17,36 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IQuestionnaireRepository extends IService<QuestionnaireDO> {
/**
* 分页查询
*
* @param dto 查询条件
* @return {@link VPage}<{@link QuestionnaireVO}>
*/
VPage<QuestionnaireVO> 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();
}

@ -61,4 +61,5 @@ public interface ISubjectRepository extends IService<SubjectDO> {
* @return {@link VPage}<{@link SubjectChooseListDO}>
*/
VPage<SubjectChooseListDO> chooseList(QnSubjectRefItemDTO dto);
}

@ -66,4 +66,12 @@ public class QuestionnaireRepositoryImpl extends ServiceImpl<QuestionnaireMapper
update.set(QuestionnaireDO::getStatus, dto.getStatus()).eq(QuestionnaireDO::getId, dto.getId());
return super.update(update);
}
@Override
public QuestionnaireDO getTheLatestOne() {
LambdaQueryWrapper<QuestionnaireDO> query = Wrappers.lambdaQuery();
query.eq(QuestionnaireDO::getStatus, 1);
query.orderByDesc(QuestionnaireDO::getUpdatedTime);
return super.getOne(query);
}
}

@ -46,6 +46,7 @@ public class SubjectRepositoryImpl extends ServiceImpl<SubjectMapper, SubjectDO>
@Resource
private SubjectMapper subjectMapper;
@Override
@Transactional
public Boolean saveOrUpdate(SubjectDTO dto) {
@ -87,6 +88,7 @@ public class SubjectRepositoryImpl extends ServiceImpl<SubjectMapper, SubjectDO>
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<SubjectMapper, SubjectDO>
return PageUtils.to(subjectMapper.useCounts(PageUtils.build(dto), query, dto.getQnId()));
}
}

@ -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<SubjectVO> getSubject(GetSubjectDTO dto);
}

@ -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<SubjectVO> getSubject(GetSubjectDTO dto) {
if (StringUtils.isBlank(dto.getQnId())) {
return new ArrayList<>();
}
LambdaQueryWrapper<RefQuestionnaireSubjectDO> query = Wrappers.lambdaQuery();
query.eq(RefQuestionnaireSubjectDO::getQnId, dto.getQnId());
List<RefQuestionnaireSubjectDO> refs = refQuestionnaireSubjectRepository.list(query);
Set<String> idSet = refs.stream().map(RefQuestionnaireSubjectDO::getSubjectId).collect(Collectors.toSet());
List<SubjectItemsDO> itemsDos = itemsRepository.listBySubjectIds(idSet);
List<SubjectDO> list = subjectRepository.listByIds(idSet);
return list.stream().map(e -> {
SubjectVO vo = new SubjectVO();
BeanUtils.copyProperties(e, vo);
List<SubjectItemVO> 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());
}
}

@ -27,7 +27,8 @@ public class MybatisFastGenerator {
* 设置需要生成的表名
*/
private static final String[] TABLE_NAMES = {
"tb_subject_items",
"tb_user",
"tb_user_login_out",
};
/**
* 是否为表更新

@ -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<String> 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<String> 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());
// }
}

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

Loading…
Cancel
Save