package cn.surveyking.server.impl;
import cn.surveyking.server.core.common.Tuple2;
import cn.surveyking.server.core.constant.*;
import cn.surveyking.server.core.exception.ErrorCodeException;
import cn.surveyking.server.core.security.JwtTokenUtil;
import cn.surveyking.server.core.uitls.*;
import cn.surveyking.server.domain.dto.*;
import cn.surveyking.server.domain.mapper.ProjectViewMapper;
import cn.surveyking.server.domain.model.Answer;
import cn.surveyking.server.domain.model.CommDictItem;
import cn.surveyking.server.domain.model.ProjectPartner;
import cn.surveyking.server.domain.model.UserBook;
import cn.surveyking.server.mapper.ProjectPartnerMapper;
import cn.surveyking.server.service.ProjectService;
import cn.surveyking.server.service.SurveyService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseCookie;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.util.WebUtils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ValidationException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
/**
* @author javahuang
* @date 2021/8/22
*/
@Service
@Transactional
@RequiredArgsConstructor
@Slf4j
public class SurveyServiceImpl implements SurveyService {
private final ProjectService projectService;
private final ProjectViewMapper projectViewMapper;
private final AnswerServiceImpl answerService;
private final ProjectPartnerMapper projectPartnerMapper;
private final AuthenticationManager authenticationManager;
private final JwtTokenUtil jwtTokenUtil;
private final DictItemServiceImpl dictItemService;
private final RepoServiceImpl repoService;
private final UserBookServiceImpl userBookService;
private final TemplateServiceImpl templateService;
private final ObjectMapper objectMapper;
/**
* answerService 如果需要验证密码,则只有密码输入正确之后才开始加载 schema
* @param query
* @return
*/
@Override
public PublicProjectView loadProject(ProjectQuery query) {
ProjectView project = projectService.getProject(query.getId());
PublicProjectView projectView = projectViewMapper.toPublicProjectView(project);
if (project == null) {
throw new ErrorCodeException(ErrorCode.ProjectNotFound);
}
SurveySchema loginFormSchema = null;
if (query.getAnswerId() == null) {
// 表单需要验证
loginFormSchema = convertAndValidateLoginFormIfNeeded(project, null);
// 校验问卷
validateProject(project);
}
else {
// 直接根据答案加载出 schema
AnswerQuery answerQuery = new AnswerQuery();
answerQuery.setId(query.getAnswerId());
AnswerView answerView = answerService.getAnswer(answerQuery);
if (answerView != null) {
projectView.setAnswer(answerView.getAnswer());
if (answerView.getSurvey() != null) {
// 随机问题
projectView.setSurvey(answerView.getSurvey());
}
}
return projectView;
}
// 如果需要登录,将问卷 schema 替换成登录表单的 schema
if (loginFormSchema != null) {
projectView.setSurvey(loginFormSchema);
projectView.setLoginRequired(true);
}
else {
// 随机问题
replaceSchemaIfRandomSchema(project, projectView);
// 允许修改答案
projectView.setAnswer(getLatestAnswer(projectView, null));
}
projectView.setIsAuthenticated(SecurityContextUtils.isAuthenticated());
return projectView;
}
/**
* 验证问卷
* @param query
* @return
*/
@Override
public PublicProjectView validateProject(ProjectQuery query) {
String projectId = query.getId();
ProjectView project = projectService.getProject(projectId);
// 登录验证
convertAndValidateLoginFormIfNeeded(project, query.getAnswer());
PublicProjectView projectView = projectViewMapper.toPublicProjectView(project);
// 随机问题
replaceSchemaIfRandomSchema(project, projectView);
// 校验问卷
validateProject(project);
projectView.setAnswer(getLatestAnswer(projectView, (String) SchemaHelper.getLoginFormAnswer(query.getAnswer(),
SchemaHelper.LoginFormFieldEnum.whitelistName)));
return projectView;
}
@Override
public PublicStatisticsView statProject(ProjectQuery query) {
AnswerQuery answerQuery = new AnswerQuery();
answerQuery.setProjectId(query.getId());
answerQuery.setPageSize(-1);
List<AnswerView> answers = answerService.listAnswer(answerQuery).getList();
ProjectView project = projectService.getProject(query.getId());
return new ProjectStatHelper(project.getSurvey(), answers).stat();
}
@Override
public PublicAnswerView saveAnswer(AnswerRequest request) {
String projectId = request.getProjectId();
PublicAnswerView result = new PublicAnswerView();
ProjectView project = projectService.getProject(projectId);
String answerId = request.getId();
// 随机问卷更新答案
String randomSurveyCookieName = AppConsts.COOKIE_RANDOM_PROJECT_PREFIX + project.getId();
String answerIdFromCookie = ContextHelper.getCookie(randomSurveyCookieName);
if (isNotBlank(answerIdFromCookie)) {
answerId = answerIdFromCookie;
}
else if (isNotBlank(request.getQueryId())) {
// 公开查询修改答案
validateAndMergeAnswer(project, request);
}
else if (isNotBlank(request.getId())) {
// 传入答案ID 并且设置了允许修改答案,则可以修改问卷答案
boolean enableUpdate = Boolean.TRUE.equals(project.getSetting().getSubmittedSetting().getEnableUpdate());
if (!enableUpdate) {
throw new ErrorCodeException(ErrorCode.AnswerChangeDisabled);
}
}
else {
// 问卷允许修改答案 开关修改答案
AnswerView latestAnswer = validateAndGetLatestAnswer(project, request);
if (latestAnswer != null) {
answerId = latestAnswer.getId();
}
}
// 保存答案
request.setId(answerId);
AnswerView answerView = answerService.saveAnswer(request);
result.setAnswerId(answerView.getId());
// 考试模式,计算分值传给前端
if (ProjectModeEnum.exam.equals(project.getMode())) {
result.setExamScore(answerView.getExamScore());
result.setQuestionScore(answerView.getExamInfo().getQuestionScore());
// 计算错题
AnswerExamInfo answerExamInfo = answerView.getExamInfo();
LinkedHashMap<String, Double> questionScore = answerExamInfo.getQuestionScore();
userBookService.saveWrongQuestion(questionScore);
}
// 白名单更新答题信息
request.setId(answerView.getId());
updateProjectPartnerByAnswer(request, project);
// 完事儿删除 cookie 标识
if (isNotBlank(answerIdFromCookie)) {
Cookie cookie = new Cookie(randomSurveyCookieName, answerIdFromCookie);
cookie.setMaxAge(0);
ContextHelper.getCurrentHttpResponse().addCookie(cookie);
}
return result;
}
/**
* @param request
* @return
*/
@Override
@SneakyThrows
public PublicQueryVerifyView loadQuery(PublicQue
没有合适的资源?快使用搜索试试~ 我知道了~
卷王问卷系统考试系统源码SurveyKing开源调查问卷和考试系统源码适用于各行业支持多种问卷设置
共802个文件
java:336个
js:95个
png:71个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 2 下载量 59 浏览量
2023-08-09
14:25:16
上传
评论 1
收藏 26.13MB ZIP 举报
温馨提示
卷王问卷考试系统/SurveyKing是一个功能最强大的开源调查问卷和考试系统,可以快速部署,并适用于各行业。该系统提供了在线表单设计、数据收集、统计和分析等功能,支持20多种题型,多种创建问卷方式和多种问卷设置。 无论您是需要进行市场调研、学术研究还是组织内部员工培训,卷王问卷考试系统都能满足您的需求。安装和部署非常简单,最快只需1分钟即可完成部署。 系统支持多种部署方式,包括一键Windows部署、一键Docker部署、前后端分离部署、单JAR部署和二级目录部署。
资源推荐
资源详情
资源评论
收起资源包目录
卷王问卷系统考试系统源码SurveyKing开源调查问卷和考试系统源码适用于各行业支持多种问卷设置 (802个子文件)
gradlew.bat 3KB
CNAME 14B
3834.dd66df88.chunk.css 558KB
umi.5e8ec97d.css 202KB
4409.89416762.chunk.css 68KB
2920.7c438190.chunk.css 66KB
4854.d0ac8220.chunk.css 65KB
4535.483dd199.chunk.css 55KB
7118.8d599d7e.chunk.css 55KB
2259.509f5def.chunk.css 51KB
8463.1b0f7aaf.chunk.css 49KB
7981.21fdeb31.chunk.css 48KB
596.14d4da36.chunk.css 41KB
p__Answer__ExamResult.e6a8281a.chunk.css 38KB
5724.42111a83.chunk.css 38KB
p__survey__Poster.be219a9b.chunk.css 34KB
4919.52eec1d1.chunk.css 33KB
p__survey__Report.752642a9.chunk.css 29KB
p__Project.ecdfc930.chunk.css 28KB
p__Template.0e872053.chunk.css 27KB
p__survey__Setting.879411c2.chunk.css 25KB
1495.15bdac53.chunk.css 24KB
p__repo__Repo.ae000a17.chunk.css 24KB
p__repo__Template.ae000a17.chunk.css 24KB
4663.dfe3210e.chunk.css 23KB
9389.9d014cca.chunk.css 22KB
6779.6f4487c9.chunk.css 21KB
7291.8778f514.chunk.css 19KB
p__system__Role.f4e4cecf.chunk.css 18KB
9999.b34ff125.chunk.css 18KB
3136.4b6574be.chunk.css 18KB
3125.5d0fab13.chunk.css 17KB
6830.ca000bae.chunk.css 17KB
4177.fb3b66d5.chunk.css 17KB
7462.0c6d1541.chunk.css 15KB
p__system__User.913ee53e.chunk.css 14KB
p__system__Dept.913ee53e.chunk.css 14KB
p__system__Position.913ee53e.chunk.css 14KB
p__system__Dict.913ee53e.chunk.css 14KB
p__survey__Data.3a7b7fa3.chunk.css 12KB
p__survey__Overview.2fc86499.chunk.css 12KB
p__survey__Flow.417a4f7c.chunk.css 12KB
1508.cde4308d.chunk.css 10KB
p__survey.5933c11a.chunk.css 9KB
custom.css 9KB
6853.7695a9b6.chunk.css 8KB
p__Answer__PublicQuery.f57b3b87.chunk.css 7KB
p__user__Login.5b3bbb1f.chunk.css 6KB
6545.1cab54e4.chunk.css 4KB
9452.1cab54e4.chunk.css 4KB
p__user__Register.903826bb.chunk.css 4KB
p__Answer.b90f0660.chunk.css 3KB
p__account__settings.be716907.chunk.css 2KB
styles.module.css 1KB
p__404.b88066b1.chunk.css 966B
utility-patterns.css 622B
styles.module.css 559B
6147.5a32eea1.chunk.css 481B
tailwind.css 110B
survey.mv.db 296KB
Dockerfile 238B
preview.gif 2.34MB
logic-calculate.gif 501KB
logic-validate.gif 492KB
logic-show.gif 338KB
.gitignore 360B
.gitignore 254B
build.gradle 2KB
build.gradle 1KB
build.gradle 1KB
build.gradle 1KB
build.gradle 480B
build.gradle 295B
settings.gradle 244B
gradlew 6KB
index.html 5KB
favicon.ico 15KB
favicon.ico 15KB
favicon-32x32.ico 4KB
gradle-wrapper.jar 58KB
SurveyServiceImpl.java 48KB
AnswerServiceImpl.java 27KB
UserServiceImpl.java 23KB
SchemaHelper.java 20KB
FlowServiceImpl.java 19KB
AbstractTaskHandler.java 11KB
RepoServiceImpl.java 10KB
DatabaseInitHelper.java 9KB
ScriptRunner.java 9KB
SurveySchema.java 9KB
RepoTemplateExcelParseHelper.java 8KB
SystemApi.java 8KB
AnswerScoreEvaluator.java 8KB
FileServiceImpl.java 8KB
ProjectPartnerServiceImpl.java 8KB
ProjectServiceImpl.java 7KB
ProjectApi.java 6KB
ProjectSetting.java 6KB
NanoIdUtils.java 5KB
TemplateServiceImpl.java 5KB
共 802 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9
资源评论
- wgqhbbd2024-03-11发现一个宝藏资源,资源有很高的参考价值,赶紧学起来~
- code51cn2024-04-24资源质量不错,和资源描述一致,内容详细,对我很有用。
百创科技
- 粉丝: 1477
- 资源: 230
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功