O sistema de exame/resposta baseado em SpringBoot, por fazer parte da função interceptada de um grande projeto, o código de negócio específico é muito complicado e não será listado aqui.Aqui apresentamos principalmente a ideia de design do sistema, que pode ser usado como design de curso ou design final, consulte
Projeto de banco de dados
Design de classe de entidade
- teste (papel de teste): registre as informações de um único papel de teste
- quiz (pergunta): registre as informações de uma única pergunta, um teste corresponde a várias perguntas
- test_record (conclusão da prova): registre a resposta de um único aluno e gere uma cópia após o envio de cada aluno
- quiz_record (status de conclusão da pergunta): registre o status de conclusão da pergunta de um determinado aluno, cada aluno gerará uma cópia após o envio, e o status de conclusão de um teste corresponde ao status de conclusão de várias perguntas
Tabelas e campos de dados
DROP TABLE IF EXISTS `t_test`;
CREATE TABLE `t_test` (
`id` char(19) NOT NULL,
`title` varchar(20) NOT NULL COMMENT '试卷标题',
`type` int NOT NULL COMMENT '试卷类型',
`score` int NOT NULL COMMENT '总分',
`suggest_time` int NOT NULL COMMENT '建议用时',
`deadline` datetime NOT NULL COMMENT '截止时间',
`status` int NOT NULL COMMENT '状态',
`is_deleted` int NOT NULL DEFAULT '0',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
DROP TABLE IF EXISTS `t_test_record`;
CREATE TABLE `t_test_record` (
`id` char(19) NOT NULL,
`uid` char(19) NOT NULL COMMENT '做题人',
`test_id` char(19) NOT NULL,
`type` int NOT NULL COMMENT '试卷类型',
`system_score` int NOT NULL COMMENT '系统评分',
`final_score` int DEFAULT NULL COMMENT '最终得分',
`score` int NOT NULL COMMENT '总分',
`quiz_count` int NOT NULL COMMENT '题目数量',
`correct_count` int NOT NULL COMMENT '正确数量',
`finish_time` int NOT NULL COMMENT '完成时间',
`is_deleted` int NOT NULL DEFAULT '0',
`gmt_create` datetime NOT NULL COMMENT '提交时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
DROP TABLE IF EXISTS `t_quiz`;
CREATE TABLE `t_quiz` (
`id` char(19) NOT NULL COMMENT '题目ID',
`test_id` char(19) NOT NULL COMMENT '试卷ID',
`question` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '问题',
`options` varchar(800) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '选项',
`type` int NOT NULL COMMENT '题目类型',
`answer` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '答案',
`score` int NOT NULL COMMENT '分数',
`is_deleted` int NOT NULL DEFAULT '0',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
DROP TABLE IF EXISTS `t_quiz_record`;
CREATE TABLE `t_quiz_record` (
`id` char(19) NOT NULL,
`test_record_id` char(19) NOT NULL,
`uid` char(19) NOT NULL COMMENT '做题人',
`quiz_id` char(19) NOT NULL,
`user_answer` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户答案',
`correct_answer` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '正确答案',
`status` int DEFAULT NULL COMMENT '是否正确',
`is_deleted` int NOT NULL DEFAULT '0',
`gmt_create` datetime NOT NULL COMMENT '提交时间',
`score` int NOT NULL COMMENT '获得分数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
realização de função
Tratamento de opções
Eu uso apenas um campo da tabela de dados para as opções aqui. A ideia é conectar múltiplas opções através de '/' durante a leitura e depois armazená-las no banco de dados; ao ler, use o método split de String para dividir múltiplas opções em uma lista. passe para o front-end
Verifique a conclusão do trabalho e a pontuação
Depois que os alunos enviam as provas, o front-end transmite as informações das provas e as respostas às perguntas dos alunos para o back-end, e o back-end consulta as respostas corretas às perguntas correspondentes no banco de dados e as compara com as respostas enviadas pelos alunos para obter o status de conclusão das perguntas dos alunos. Após os dados correspondentes serem armazenados no banco de dados, uma cópia dos dados é devolvida ao front end para que os alunos possam verificar suas respostas
Otimização de função
Para aumentar o rigor do exame e evitar que os alunos compartilhem as respostas, decidi embaralhar aleatoriamente as opções de cada questão quando diferentes alunos recebem as provas. A dificuldade aqui é: o embaralhamento aleatório aqui não pode ser completamente aleatório, porque o mesmo aluno deve ser garantida A consistência entre a interface de atendimento e a interface de resultado de atendimento, por exemplo, escolhi C na hora de fazer a pergunta, mas quando verifiquei o resultado descobri que ficou D...
Idéia de implementação : o front-end adiciona o número de ID do aluno atual ao objeto transmitido ao back-end. Como o ID é fixo, o último dígito do ID é considerado a semente do número aleatório quando as opções são embaralhadas, e o O método shuffle de Collections é chamado para embaralhar as opções, de modo que possa ser garantido que, para um trabalho de teste, a ordem de embaralhamento do mesmo aluno seja a mesma e as ordens de embaralhamento de alunos diferentes sejam diferentes
efeito final
Nesta base, combinado com CRUD e página front-end, o efeito final é o seguinte: