《问卷业务协议规范》
版本
1.0.0
版本规范
版本号使用 MAJOR.MINOR.PATCH:
- 大版本:协议结构修订且不兼容时使用 MAJOR
- 小版本:协议结构修订且向下兼容时使用 MINOR
- 打补丁:协议结构修订问题或者缺陷时使用 PATCH
名词术语
名词 | 含义 |
---|---|
编辑器 | 将 JSON 结构渲染显示为用户可交互的界面,主要用于编辑问卷 |
渲染器 | 将 JSON 结构渲染显示为用户可视化的界面,主要用于预览和回收问卷 |
协议 | 协议是指问卷的字段、类型和结构定义,用于自描述问卷的题型和回收数据类型 |
题型 | 题目类型,根据问卷领域提供一系列符合用户习惯的交互组件,如输入框、单选框、复选框、下拉框等等 |
必填 | 该题目是否必须填写 |
格式 | 限制文本输入的内容 |
限制 | 限制问卷回收数量 |
背景
问卷协议规范,用于约束编辑问卷、回收问卷、数据分析的一套规范,让编辑器、渲染器、以及未来功能扩展时能够保持一致性。
协议概述
协议主要分为两组:
- 问卷协议:定义整份问卷的协议结构,如标题、提示语、答题方式、结果页,包括页面样式等等
- 题型协议:定义题型的协议结构,如开放题型的输入类题型,封闭式题型的选项类等等
协议结构
顶级结构
字段 | 类型 | 描述 |
---|---|---|
version | String(Semver) | 版本号 |
baseConf | Object | 基本配置 |
dataConf | Object | 题目配置 |
submitConf | Object | 提交设置 |
bannerConf | Object | 页面头部设置 |
bottomConf | Object | 页面尾部设置 |
skinConf | Object | 样式设置 |
示例:
{
"version": "1.0.0",
"baseConf": {
"begTime": "",
"endTime": "",
"language": "chinese",
"showVoteProcess": "allow",
"tLimit": 0,
"answerBegTime": "",
"answerEndTime": "",
"answerLimitTime": 0
},
"dataConf": {
"dataList": [
{
"field": "data560",
"showIndex": false,
"showType": false,
"showSpliter": true,
"type": "text",
"title": "姓名",
"placeholder": "",
"valid": "",
"isRequired": true,
"minNum": "",
"maxNum": "",
"starStyle": "star",
"starMin": 1,
"starMax": 5,
"rangeConfig": {},
"npsMin": 0,
"npsMax": 0,
"numberRange": {
"min": { "placeholder": "0", "value": 0 },
"max": { "placeholder": "1000", "value": 1000 }
},
"title": "姓名",
"othersKeyMap": {}
}
]
},
"bannerConf": {
"titleConfig": {
"mainTitle": "<h3 style='text-align: center'>欢迎填写问卷</h3>",
"subTitle": "<p>为了给您提供更好的服务,希望您能抽出几分钟时间,将您的感受和建议告诉我们,<span style='color: rgb(204, 0, 0)'>期待您的参与!</span></p>",
"applyTitle": ""
},
"bannerConfig": {
"bgImage": "",
"bgImageAllowJump": false,
"bgImageJumpLink": "",
"videoLink": "",
"postImg": ""
}
},
"bottomConf": {
"logoImage": "",
"logoImageWidth": "28%"
},
"skinConf": {
"skinColor": "#4a4c5b",
"inputBgColor": "ffffff"
},
"submitConf": {
"submitTitle": "",
"msgContent": {},
"confirmAgain": {
"isAgain": true
},
"buttonList": [
{
"title": "",
"url": ""
}
],
"link": ""
}
}
基础设置
字段 | 类型 | 默认值 | 枚举值 | 描述 |
---|---|---|---|---|
begTime | Datetime | 当前时间 | 问卷有效期,开始时间,示例:2023-01-01 00:00:00 | |
endTime | Datetime | 当前时间加 10 年 | 问卷有效期,结束时间,示例:2038-01-01 00:00:00 | |
answerBegTime | Time | 00:00:00 | 答题时段,开始时间,8:00:00 | |
answerEndTime | Time | 23:59:59 | 答题时段,截止时间,16:00:00 | |
answerLimitTime | Integer | 0 | 答题限时(分钟),0 为无限制,问卷必须在规定时间内填完,超时自动提交 | |
tLimit | Integer | 0 | 总提交次数限制,0 为无限制,此功能用于限制该问卷总提交的数据量。当数据量达到限额时,该问卷将不能继续提交 | |
language | Enum<String> | chinese | chinese | 问卷语言 |
showVoteProcess | Enum<String> | allow | allow notallow | 是否显示投票进度 |
题目设置
基本结构
字段 | 类型 | 描述 |
---|---|---|
field | String | 题目 ID,规则:data{RAND(number)},示例:data36 |
type | Enum<String> | 题型,如 text、radio、radio-star、matrix-checkbox |
title | String | 题目标题,如果是特殊题型,title 可以为空 |
题型功能
字段 | 类型 | 描述 |
---|---|---|
isRequired | Boolean | 必填项 |
showType | Boolean | 显示题型 |
showIndex | Boolean | 显示题目序号 |
showSpliter | Boolean | 显示分割线 |
输入类题型
字段 | 子字段 | 类型 | 枚举值 | 描述 |
---|---|---|---|---|
valid | Enum<String> | * 任意格式 n 数值格式 m 手机号格式 e Email 格式 idcard 身份证格式 licensePlate 车牌格式 | 内容格式限制 | |
textRange | Object | 文本长度区间限制,当限制内容为*时生效 | ||
min.value | Number | 最短文本长度 | ||
min.placeholder | String | 输入提示文案 | ||
max.value | Number | 最长文本长度 | ||
max.placholder | String | 输入提示文案 | ||
numberRange | Object | 数值区间限制,当限制内容为 n 时生效 | ||
min.value | Number | 最小值 | ||
min.placeholder | String | 输入提示文案 | ||
max.value | Number | 最大值 | ||
max.placholder | String | 输入提示文案 | ||
placeholder | String | 引导提示文案 |
单行输入框
通用字段
多行输入框
通用字段
选项类题型
字段 | 子字段 | 类型 | 描述 |
---|---|---|---|
options | hash | String | 选项 ID |
text | String | 选项文本 | |
others | Boolean | 是否支持自定义输入内容 | |
othersKey | String | 自定义输入内容 ID | |
mustOthers | Boolean | 自定义输入内容是否必填 | |
mutex | Boolean | 选项互斥 | |
placeholder | String | 输入提示文案,当 others 为 true 时生效 |
单选题
通用字段
多选题
{
name: 'minNum',
propType: Number,
description: '最少选择数'
},
{
name: 'maxNum',
propType: Number,
description: '最多选择数'
}
判断题
同单选题
投票题
{
name: 'innerType',
propType: String,
description: '描述单选投票还是多选投票'
},
{
name: 'minNum',
propType: Number,
description: '最少选择数'
},
{
name: 'maxNum',
propType: Number,
description: '最多选择数'
}
评分类题型
字段 | 子字段 | 类型 | 描述 |
---|---|---|---|
rangeConfig | Object<value, Object> | 自定义输入内容,当题型为评分题、NPS 题时生效,value 为评分值或 NPS 值 | |
isShowInput | Boolean | 是否支持自定义输入内容 | |
required | Boolean | 是否必填 | |
text | String | 评分或 NPS 值 | |
explain | String | 输入提示文案 |
评分题
{
name: 'starMin',
propType: Number,
description: '这是用于描述评分最小值'
},
{
name: 'starMax',
propType: Number,
description: '这是用于描述评分最大值'
},
{
name: 'starStyle',
propType: String,
description: ''
}
NPS 评分题
{
name: 'min',
propType: Number,
description: '这是用于描述NPS量表最小值',
},
{
name: 'max',
propType: Number,
description: '这是用于描述NPS量表最大值',
},
{
name: 'minMsg',
propType: String,
description: '这是用于描述最小值文案',
},
{
name: 'maxMsg',
propType: String,
description: '这是用于描述最大值文案',
}
提交设置
字段 | 子字段 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
submitTitle | String | 提交按钮名称 | ||
msgContent | Object | 成功/错误提示消息 | ||
msg_200 | String | 提交成功 | ||
msg_9003 | String | 您来晚了,已经满额! | ||
msg_9004 | String | 提交失败! | ||
confirmAgain | Object | 提交确认按钮配置 | ||
isAgain | Boolean | 是否继续 | ||
buttonList | Array<Object> | 自定义按钮 | ||
title | String | 按钮标题 | ||
url | String | 按钮链接 |
页面头部设置
字段 | 子字段 | 类型 | 描述 |
---|---|---|---|
titleConfig | Object | 标题设置 | |
mainTitle | String | 主标题 | |
subTitle | String | 页头文案 | |
applyTitle | String | 提交文案 | |
bannerConfig | Object | Banner 设置 | |
bgImage | String | 背景图片 | |
bgImageAllowJump | Boolean | 背景图片是否支持点击跳转 | |
bgImageJumpLink | String | 背景图片跳转链接 | |
videoLink | String | 背景视频链接 | |
postImg | String | 视频海报地址 |
页面尾部设置
字段 | 类型 | 描述 |
---|---|---|
logoImage | String | Logo URL |
logoImageWidth | String | Logo 大小设置 |
样式设置
字段 | 类型 | 默认值 | 描述 |
---|---|---|---|
skinColor | String | #4a4c5b | 页面主色调 |
inputBgColor | String | #ffffff | 按钮背景颜色 |