试卷生成
如何做到试卷的题目选项随机:
最近接到一个需求,就是根据题库中的题目,生成试卷,不过有随机题目这种生成,可以选择多种要求,例如: 各个题型的数量要求,题目乱序,选项乱序。
针对此需求,数据库表结构该如何设计,实现呢?
一、设计思路
- 首先题目的录入应该考虑,答案不能固定,应该考虑根据答案的需要来确定题目的正确性,然后选项乱序后,仍然可以根据序号,来确定正确答案
- 选项乱序后的展示效果, 例如 选项为 ABCD ,乱序后其实也应该为ABCD ,不过每个选项内容要变,所以这里也采用顺序来处理,而非固定值
- 根据题目生产试卷后,移除题目,应该不影响历史试卷,所以这里应该考虑采用一种快照方式,将题目保存到试卷中,而且要做到乱序后,明确正确答案
- 根据题目生产试卷后,修改题目,应该考虑已经生成的试卷,应该同步修改这个被修改过的题的题目内容或者选项
二、具体表设计
这里大概一共有如下几张表: 题目表,题目选项表,试卷表,试卷题目关系表
题目表
CREATE TABLE `question` (
`id` bigint(20) NOT NULL COMMENT '问题id',
`title` mediumtext NOT NULL COMMENT '题干',
`question_type` varchar(55) DEFAULT NULL COMMENT '试题类型 单选 多选 填空 主观题',
`analysis` mediumtext COMMENT '试题解析',
`answer_order` tinyint(2) DEFAULT '0' COMMENT '答案严格顺序:0-不需要 1-需要(只作用于填空题)',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
`del_flag` char(1) DEFAULT '0' COMMENT '0-正常,1-删除',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='题目表';
题目选项表
CREATE TABLE `question_option` (
`id` bigint(20) NOT NULL COMMENT '答案主键',
`question_id` bigint(20) NOT NULL COMMENT '问题id',
`content` varchar(255) DEFAULT NULL COMMENT '答案内容',
`answer` tinyint(1) NOT NULL DEFAULT '0' COMMENT '正确答案: 0-否 1-是',
`sort` int(4) DEFAULT NULL COMMENT '答案顺序',
`del_flag` char(1) DEFAULT '0' COMMENT '0-正常,1-删除',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='题目选项';
由于选项可以乱序,这里采用一对多实现题目和选项的关联,并标记正确答案,其中答案顺序sort与答案answer同样重要
试卷表
CREATE TABLE `assignment` (
`id` bigint(20) NOT NULL COMMENT '试卷主键',
`name` varchar(55) DEFAULT NULL COMMENT '考试名称',
`score` int(4) NOT NULL DEFAULT '100' COMMENT '考试总分值',
`mark` varchar(255) DEFAULT NULL COMMENT '作业要求',
`question_order` tinyint(2) DEFAULT '0' COMMENT '题目顺序: 0-乱序 1-有序',
`option_order` tinyint(2) DEFAULT '0' COMMENT '选项顺序: 0-乱序 1-有序 (单选,多选)',
`del_flag` char(1) DEFAULT '0' COMMENT '0-正常,1-删除',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='试卷';
试卷题目表
CREATE TABLE `assignment_item` (
`id` bigint(20) NOT NULL COMMENT '题id',
`assignment_id` bigint(20) NOT NULL COMMENT '试卷id',
`question_id` bigint(20) NOT NULL COMMENT '问题id',
`answer_json` text COMMENT '问题答案json:[{"optionId":1,"content":3,"answer":0},{"optionId":2,"content":4,"answer":1}]',
`sort` int(2) NOT NULL DEFAULT '0' COMMENT '排序',
`score` decimal(5,2) NOT NULL DEFAULT '0.00' COMMENT '题目分值',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='试卷题目';
这里采用answer_json 类似json的方式,记录每个题目的选项以及正确答案,处理方式更加灵活,可以做到即使乱序后,依然能知道正确答案,当然这json内容,也是根据之前的题目和选项生成的(乱序与否均可)
总结
如上就实现了对于目前需求的数据库设计,这里简单说下,前端展示的问题:
对于题目的展示
返回的数据为(题目–对应多个题目选项),前段可以根据选项遍历,展示选项内容,根据题目是否为正确答案,选择是否标记正确选项,而选项的项目名称例如: ABCD 这种应该忽略,弱化,按照顺序根据长度,遍历的时候,按照正常 A B C D 的顺序展示即可
对于试卷中的题目展示
其实与上面同理,不同的是,这次后端需要对于题目中的 answer_json解析,解析后数据格式仍然与上面的题目中的题目选项内容保持一致,所以依然展示选项的时候,还是根据选项的长度来展示 ABCD ,然后每个后边直接展示选项内容即可,选项的正确答案,依然根据answer 为1 处理