考试功能

sale
tianea 3 years ago
parent c9160253b4
commit ef83c6b961

@ -0,0 +1,41 @@
package com.tz.platform.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean(name = "template")
public RedisTemplate<String, Object> template(RedisConnectionFactory factory) {
// 创建RedisTemplate<String, Object>对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 配置连接工厂
template.setConnectionFactory(factory);
// 定义Jackson2JsonRedisSerializer序列化对象
Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域field,get和set,以及修饰符范围ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型类必须是非final修饰的final修饰的类比如String,Integer等会报异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
StringRedisSerializer stringSerial = new StringRedisSerializer();
// redis key 序列化方式使用stringSerial
template.setKeySerializer(stringSerial);
// redis value 序列化方式使用jackson
template.setValueSerializer(jacksonSeial);
// redis hash key 序列化方式使用stringSerial
template.setHashKeySerializer(stringSerial);
// redis hash value 序列化方式使用jackson
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
}

@ -24,6 +24,10 @@
<groupId>com.tz</groupId>
<artifactId>user-feign</artifactId>
</dependency>
<dependency>
<groupId>com.tz</groupId>
<artifactId>exam-feign</artifactId>
</dependency>
</dependencies>
</project>

@ -125,7 +125,8 @@ public class TeamBiz {
private void updatePeopleCount(Long competitionId){
int peopleCount = memberDao.countByCompetitionId(competitionId);
competitionDao.updatePeopleCount(peopleCount,competitionId);
int teamCount = teamDao.countByCompetitionId(competitionId);
competitionDao.updatePeopleCount(peopleCount,teamCount,competitionId);
}
public Result<String> updateTeamInfo(TeamInfoVO vo){

@ -8,6 +8,7 @@ import com.tz.platform.competitiion.pc.bo.TeamInfo;
import com.tz.platform.entity.CompetitionMember;
import com.tz.platform.entity.CompetitionTeam;
import com.tz.platform.feign.user.IFeignUser;
import com.tz.platform.repository.CompetitionDao;
import com.tz.platform.repository.CompetitionMemberDao;
import com.tz.platform.repository.CompetitionTeamDao;
import lombok.extern.slf4j.Slf4j;
@ -33,6 +34,9 @@ public class TeamTemplateImportBiz {
@Autowired
private CompetitionMemberDao memberDao;
@Autowired
private CompetitionDao competitionDao;
public Result<String> excelImport(MultipartFile file,Long userNo,Long competitionId,Integer stageId){
if(competitionId==null||stageId == null){
return Result.error("大赛或赛段不能为空");
@ -117,11 +121,9 @@ public class TeamTemplateImportBiz {
}
});
memberDao.saveAll(memberList);
updatePeopleCount(competitionId);
});
} catch (Exception e) {
e.printStackTrace();
return Result.error("上传失败");
@ -131,6 +133,13 @@ public class TeamTemplateImportBiz {
return Result.success("success");
}
private void updatePeopleCount(Long competitionId){
int peopleCount = memberDao.countByCompetitionId(competitionId);
int teamCount = teamDao.countByCompetitionId(competitionId);
competitionDao.updatePeopleCount(peopleCount,teamCount,competitionId);
}
public Result<String> importMember(MultipartFile file,Long userNo,Long competitionId,Integer stageId){
if(competitionId==null||stageId == null){
@ -189,6 +198,7 @@ public class TeamTemplateImportBiz {
memberList.add(member);
});
memberDao.saveAll(memberList);
updatePeopleCount(competitionId);
return Result.success("导入成功");
} catch (Exception e) {

@ -28,6 +28,7 @@ public class Competition {
private Integer teamMaxCount;
private Integer status;
private Integer peopleCount;
private Integer teamCount;
private boolean enableSignup;
@Column(columnDefinition = "TIMESTAMP")
private Date startTime;

@ -18,6 +18,6 @@ public interface CompetitionDao extends JpaRepository<Competition,Long> {
@Transactional
@Modifying
@Query(value = "update competition set people_count =:pcount where id=:id",nativeQuery = true)
int updatePeopleCount( @Param("pcount") Integer pcount ,@Param("id") Long id);
@Query(value = "update competition set people_count =:pcount,team_count=:tcount where id=:id",nativeQuery = true)
int updatePeopleCount( @Param("pcount") Integer pcount ,@Param("tcount") Integer tcount , @Param("id") Long id);
}

@ -16,6 +16,8 @@ public interface CompetitionMemberDao extends JpaRepository<CompetitionMember,In
List<CompetitionMember> findAllByCompetitionIdAndStageIdAndUserIdIn(Long cmpId,Integer stageId,List<Long> ids);
List<CompetitionMember> findAllByCompetitionIdAndStageId(Long compId,Integer stageId);
Page<CompetitionMember> findAllByCompetitionIdAndStageId(Long cmpid, Integer stageId , Pageable pageable);
Page<CompetitionMember> findAllByStudentNoOrName(String studentNo,String name,Pageable pageable);

@ -10,4 +10,5 @@ import java.util.List;
public interface CompetitionTaskDao extends JpaRepository<CompetitionTask,Integer> {
CompetitionTask getById(Integer id);
List<CompetitionTask> findAllByCompetitionId(Long competitionId);
CompetitionTask getByCompetitionIdAndStageId(Long cmpId,Integer stageId);
}

@ -8,4 +8,5 @@ import org.springframework.stereotype.Repository;
public interface CompetitionTeamDao extends JpaRepository<CompetitionTeam,Integer> {
CompetitionTeam getById(Integer id);
CompetitionTeam getByTeamName(String teamName);
int countByCompetitionId(Long competitionId);
}

@ -1,12 +1,32 @@
package com.tz.platform.exam.feign.biz;
import com.tz.platform.entity.Question;
import com.tz.platform.repository.QuestionDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class FeignExamBiz {
@Autowired
private QuestionDao questionDao;
@Autowired
private RedisTemplate<String,List<Question>> redisTemplate;
public boolean putToCache(List<Long> ids,String key,long seconds){
try {
List<Question> questionList = questionDao.findAllByIdIn(ids);
redisTemplate.opsForValue().set(key, questionList, seconds, TimeUnit.SECONDS);
}catch (Exception ex){
log.info("试题预热失败:{}",ex.getMessage());
return false;
}
return true;
}
}

@ -28,4 +28,7 @@ public interface IFeignUser {
@PostMapping(value = "feign/user/listByIds")
List<MemberInfo> listByIds(@RequestBody List<Long> ids);
@PostMapping(value = "feign/user/putToCache")
boolean putToCache(List<Long> ids);
}

@ -0,0 +1,41 @@
package com.tz.platform.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class MyRedisConfig {
@Bean(name = "template")
public RedisTemplate<String, Object> template(RedisConnectionFactory factory) {
// 创建RedisTemplate<String, Object>对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 配置连接工厂
template.setConnectionFactory(factory);
// 定义Jackson2JsonRedisSerializer序列化对象
Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域field,get和set,以及修饰符范围ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型类必须是非final修饰的final修饰的类比如String,Integer等会报异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
StringRedisSerializer stringSerial = new StringRedisSerializer();
// redis key 序列化方式使用stringSerial
template.setKeySerializer(stringSerial);
// redis value 序列化方式使用jackson
template.setValueSerializer(jacksonSeial);
// redis hash key 序列化方式使用stringSerial
template.setHashKeySerializer(stringSerial);
// redis hash value 序列化方式使用jackson
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
}

@ -33,7 +33,7 @@ public interface UserDao extends JpaRepository<User,Long> , JpaSpecificationExec
User getByUsername(String username);
/**
*
*
* @param pageable
* @return
*/

@ -16,6 +16,7 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.Date;
import java.util.concurrent.TimeUnit;
@ -28,7 +29,7 @@ public class ApiUserLoginBiz {
private LoginLogDao loginLogDao;
@Autowired
private RedisTemplate redisTemplate;
private RedisTemplate<String,Object> template;
/**
*
* @param userLoginPasswordBO
@ -45,9 +46,15 @@ public class ApiUserLoginBiz {
// 密码错误次数校验
User user = null;
user = (User) template.opsForValue().get("user_"+userLoginPasswordBO.getUsername());
// 用户校验
User user = userDao.getByUsername(userLoginPasswordBO.getUsername());
if(user == null){
user = userDao.getByUsername(userLoginPasswordBO.getUsername());
}
if (null == user) {
return Result.error("账号或者密码不正确");
}

@ -41,4 +41,9 @@ public class FeignUserController implements IFeignUser {
public List<MemberInfo> listByIds(List<Long> ids) {
return feignUserBiz.findByIds(ids);
}
@Override
public boolean putToCache(List<Long> ids) {
return feignUserBiz.putToCache(ids);
}
}

@ -14,17 +14,22 @@ import com.tz.platform.feign.vo.ProvinceVO;
import com.tz.platform.feign.vo.StudentLevelVo;
import com.tz.platform.repository.UserDao;
import com.tz.platform.feign.user.vo.UserVo;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.implementation.bytecode.Throw;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Component
@Slf4j
public class FeignUserBiz {
@Autowired
private UserDao userDao;
@ -34,6 +39,9 @@ public class FeignUserBiz {
@Autowired
private IFeignStudentLevel feignStudentLevel;
@Autowired
private RedisTemplate<String,Object> template;
public UserVo getByUserNo(Long userNo){
User user = userDao.findById(userNo).orElse(null);
if(user == null) {
@ -52,6 +60,19 @@ public class FeignUserBiz {
return BeanUtils.copyProperties(userList,MemberInfo.class);
}
public boolean putToCache(List<Long> ids){
try {
List<User> userList = userDao.findAllByIdIn(ids);
userList.forEach(user -> {
template.opsForValue().set("user_"+user.getUsername(), user, 4, TimeUnit.HOURS);
});
}catch (Exception ex){
log.error("用户预热失败: {}",ex.getMessage());
return false;
}
return true;
}
public List<MemberInfo> batchSave(List<MemberImport> list){
if(list.size()==0){
throw new BaseException("导入数据为空");

Loading…
Cancel
Save