# questionnaire_online **Repository Path**: liu_yong_chang_tc/questionnaire_online ## Basic Information - **Project Name**: questionnaire_online - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-21 - **Last Updated**: 2023-11-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 在线问卷系统 > 这是个前后端分离的、支持跨域访问的REST风格的`Vue.js`+`Spring Boot`项目,开发工具为`IDEA`,数据库为`MySQL`。由于当时时间匆忙及能力有限,部分功能实现有待进一步优化,可移步参考我最近整理的[SpringBoot 2.x+Maven多模块项目示例](https://github.com/BlueDriver/SpringBoot-rest-demo)进行修改。 》[前端地址](https://github.com/Nice-Ming/Questionnaire-management/tree/master_online)《 》[体验地址](http://www.niceming.cn/questionnaire/)《 # 数据库名称:questionnaire 字符集:UTF-8 ## user表 字段 | 类型 | 长度 |Null| 默认 | 主键 | 唯一 | 说明 :--- |:--- |:--- |:--- |:--- |:--- |:--- |:--- id |varchar|64| not | | Y | |用户ID username |varchar|64| not | | | |用户昵称 password |varchar|64| not | | | |md5加密后的密码 email |varchar|64| not | | | Y |邮箱 create_time |datetime| | not | | | |用户创建时间 last_login_time|datetime| | null |null | | |用户最后登录时间 status |int| | not | 0 | | |用户账号状态
0:未激活
1:已激活 random_code |varchar|64| not | | |Y |随机码(用户激活邮箱) ## paper表 字段 | 类型 | 长度 |Null| 默认 | 主键 | 唯一 | 说明 :--- |:--- |:--- |:--- |:--- |:--- |:--- |:--- id |varchar|64| not | | Y | |问卷ID user_id|varchar|64| not | | | |用户ID,外键 title|varchar|64| not | | | |问卷标题 create_time|datetime| | not | | | |问卷创建时间 status|int| | not | 0 | | |问卷状态
0:未发布
1:已发布
2:已结束
3:已删除 start_time|datetime| | null | null | | |开始时间 end_time|datetime| | null | null | | |截止时间 ## question表 字段 | 类型 | 长度 |Null| 默认 | 主键 | 唯一 | 说明 :--- |:--- |:--- |:--- |:--- |:--- |:--- |:--- id |varchar|64| not | | Y | |问题ID paper_id|varchar|64| not | | | |问卷ID,外键 create_time|datetime| | not | | | |问题创建时间 question_type|int| | not | | | |问题类型
1:单选
2:多选
3:简答 question_title|varchar|128| not | | | |问题标题 question_option|varchar|512| not | | | |问题选项
1:选择题,数组字符串
[option1,option2,option3...]
2:简答题,空数组字符串
[] ## answer表 字段 | 类型 | 长度 |Null| 默认 | 主键 | 唯一 | 说明 :--- |:--- |:--- |:--- |:--- |:--- |:--- |:--- id |varchar|64| not | | Y | |答案ID paper_id|varchar|64| not | | | |问卷ID,外键 question_id|varchar|64| not | | | |问题ID,外键 question_type|int| | not | | | |问题类型
1:单选
2:多选
3:简答 create_time|datetime| | not | | | |答题时间 answer_option|varchar|512| not | | | |答题选项
1:选择题,来自question表的问题选项,单选题只有一个option,多选至少一个
[option1,option2,option3...]
2:简答题,至多一个元素的数组字符串
["只能有一个元素"]
若未达,则无元素
[] # API 编码方式均为UTF-8 ## 1.管理员相关 ### 1.1 注册 #### 接口地址 ``` domain/api/v1/register ``` #### 请求方式 HTTP POST #### 请求示例 ``` { "username": "Alice", "password": "123456", "email": "alice@gmail.com" } ``` > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- username|String|Y| 2-64个字符 |用户名(昵称) password|String|Y| 6-64个字符 |登录密码 email |String|Y| 5-64个字符且格式正确 |邮箱 #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok", "data": 0 } ``` > #### 参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- code |int |Y | - |请求状态码 msg |String|Y | - |消息提示 data |int |N | - |结果数据 #### code说明 状态值 |说明 :--- |:--- -1 |token失效或未登录(用于需要登录后才能进行的操作) 0 |请求成功(全文适用,下文不再赘述) 1 |系统异常(全文适用,下文不再赘述) 2 |参数不正确(全文适用,下文不再赘述) > #### code的补充 * code非0时,无data参数,可通过msg判断问题原因 * code取0时,若data中有值,则data参数存在,否则无data参数 #### data说明 状态值 |说明 :--- |:--- 0 |注册成功,等待邮件激活 1 |邮箱已被注册过且被激活 2 |邮箱被注册过,但未激活,重新发送激活邮件 ### 1.2 激活 #### 接口地址 ``` domain/api/v1/activate ``` #### 请求方式 HTTP GET 请求示例 ``` domain/api/v1/activate/code ``` > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- code |String|Y| - |激活码(即随机码) #### 返回参数 无 #### 说明 1. 若激活成功,跳转success页面 2. 若激活码已失效,跳转invalid页面 ### 1.3 登录 #### 接口地址 ``` domain/api/v1/login ``` #### 请求方式 HTTP POST #### 请求示例 ``` { "email": "alice@gmail.com", "password": "123456" } ``` > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- email |String|Y| 5-64个字符 |邮箱 password|String|Y| 6-64个字符 |登录密码 #### 返回参数 返回示例 ``` //登录成功 { "code": 0, "msg": "ok", "data": { "result": 0, "token": "abcdefghijkl12345", "username": "Alice", "email": "abc@gmail.com } } //登录失败 { "code": 0, "msg": "password error", "data": { "result": 1 } } ``` > #### 参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- code |int |Y | - |请求状态码 msg |String|Y | - |消息提示 data |Object|N | - |结果 #### data说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- result |int |Y | - |结果 token |String |N | - |**登陆成功后用于身份识别,凡请求的URL中含`admin`都需要将token放入请求header** username|String |N | - |昵称 email |String |N | - |邮箱 #### result说明 取值 |说明 :--- |:--- 0 |登录成功 1 |密码错误 2 |用户不存在 3 |账号未激活 > header使用token示例 ``` ... headers: {'token': token } ... ``` ### 1.4 退出登录 #### 接口地址 ``` domain/api/v1/admin/logout ``` #### 请求方式 HTTP GET #### 请求示例 无 > #### 请求参数 无 #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok", "data": 0 } ``` > #### 参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- code |int |Y | - |请求状态码 msg |String|Y | - |消息提示 data |int |N | - |结果:0.退出成功,1.失败(未登录或登录已超时) ## 2.问卷相关 ### 2.1 管理员获取问卷列表 #### 接口地址 ``` domain/api/v1/admin/paper-lists ``` #### 请求方式 HTTP GET #### 请求示例 无 > #### 请求参数 无 #### 返回参数 返回示例 ``` //成功 { "code": 0, "msg": "ok", "data": [ {"id": "12345678910","title": "问卷", "status": 0, "createTime": 1536887397173, "startTime": "2018-09-20", "endTime": "2018-10-01"}, {"id": "22345678910","title": "问卷标题", "status": 1, "createTime": 1536887397666, "startTime": "2018-09-10", "endTime": "2018-10-01"}, {"id": "32345678910","title": "问题", "status": 2, "createTime": 1536887397888, "startTime": "2018-09-10", "endTime": "2018-09-12"}, {"id": "42345678910","title": "标题", "status": 0, "createTime": 1536887397173, "startTime": "", "endTime": ""} ] } //失败 { "code": 1, "msg": "server exception" } //token过期或未登录,下同 { "code": -1, "msg": "token expired or not login", } ``` > #### 参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- id |String|Y | - |问卷ID title |String|Y | - |问卷标题 status|int |Y | - |问卷状态:0.未发布,1.已发布,2.已结束 createTime|long |Y | - |问卷创建时的时间戳 startTime |String|Y | - |问卷开达日期,若未设置则是空字符串 endTime |String|Y | - |问卷结束日期,若未设置则是空字符串 ### 2.2 查看问卷 #### 接口地址 ``` domain/api/v1/admin/view-paper ``` #### 请求方式 HTTP POST #### 请求示例 ``` { "id": "4askfj1093jfi9348oueir932" } ``` > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - | 问卷id #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok", "data": { "id": "4askfj1093jfi9348oueir932", "title": "你幸福吗的调查", "status": 0, "createTime": 1536887397173, "startTime": "2018-09-12", "endTime": "2018-10-01", "questions": [ {"id": "1234", "questionType":1, "questionTitle": "你的收入是多少?", "questionOption": ["2000以下", "2000-5000", "5000+"]}, {"id": "2234", "questionType":2, "questionTitle": "你家里有哪些家电?", "questionOption": ["冰箱", "洗衣机", "空调", "麻将机"]}, {"id": "3234", "questionType":3, "questionTitle": "说一说你觉得最幸福的事", "questionOption": []} ] } } ``` > #### data参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - |问卷ID title |String|Y | - |问卷标题 status|int |Y | - |问卷状态:0.未发布,1.已发布,2.已结束 createTime|long |Y | - |问卷创建时的时间戳 startTime |String|Y | - |问卷开达日期,若未设置则是空字符串 endTime |String|Y | - |问卷结束日期,若未设置则是空字符串 questions |Array |Y | - |问题列表 > #### questions参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - |问题ID questionType |int |Y | - |问题类型:1.单选题,2.多选题,3.简答题 questionTitle |String|Y | - |问题标题 questionOption|Array |Y | - |问题选项:简答题为空的Array ### 2.3 新增问卷 #### 接口地址 ``` //与更新问卷共用接口 domain/api/v1/admin/update-paper ``` #### 请求方式 HTTP POST #### 请求示例 ``` { "title": "你幸福吗的调查", "startTime": "2018-09-12", "endTime": "2018-10-01", "status": 0, "questions": [ {"questionType":1, "questionTitle": "你的收入是多少?", "questionOption": ["2000以下", "2000-5000", "5000+"]}, {"questionType":2, "questionTitle": "你家里有哪些家电?", "questionOption": ["冰箱", "洗衣机", "空调", "麻将机"]}, {"questionType":3, "questionTitle": "说一说你觉得最幸福的事", "questionOption": []} ] } ``` > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- title |String|Y| 2-64个字符 | 问卷名称 startTime |String|Y| 10个字符 | 开始日期,若未设置则是空字符串 endTime |String|Y| 10个字符 | 结束日期,若未设置则是空字符串 status |int |Y| 0或1 | 问卷状态,0:不发布仅保存;1:发布(此时start_time和end_time必须有合法取值); > #### questions参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- questionType |int |Y | - |问题类型:1.单选题,2.多选题,3.简答题 questionTitle |String|Y | 1-128字符 |问题标题 questionOption|Array |Y | - |问题选项, 是选择题则至少有两个元素,简答题无元素 #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok", "data": 0 } ``` > #### 参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- code |int |Y | - |-1.token失效或未登录,0.请求成功,1.系统异常 msg |String|Y | - |提示消息 data |int |N | - |0.成功 ### 2.4 修改问卷 #### 接口地址 ``` //与新增问卷共用接口,仅多一个参数id domain/api/v1/admin/update-paper ``` #### 请求方式 HTTP POST #### 请求示例 ``` //页面中的数据来自view-paper接口,若管理员选择更新,则删除原id的paper的问题,再为该id的paper插入questions的新题目 { "id": "4askfj1093jfi9348oueir932", //在add-paper中无此参数 "title": "你幸福吗的调查", "status": 0, "startTime": "2018-09-12", "endTime": "2018-10-01", "questions": [ {"questionType":1, "questionTitle": "你的收入是多少?", "questionOption": ["2000以下", "2000-5000", "5000+"]}, {"questionType":2, "questionTitle": "你家里有哪些家电?", "questionOption": ["冰箱", "洗衣机", "空调", "麻将机"]}, {"questionType":3, "questionTitle": "说一说你觉得最幸福的事", "questionOption": []} ] } } ``` > #### 请求参数 > #### 参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - |问卷ID title |String|Y | - |问卷标题 status|int |Y | - |问卷状态:0.未发布,1.发布 startTime |String|Y | - |问卷开达日期,若未设置则是空字符串 endTime |String|Y | - |问卷结束日期,若未设置则是空字符串 questions |Array |Y | - |问题列表 > #### questions参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- questionType |int |Y | - |问题类型:1.单选题,2.多选题,3.简答题 questionTitle |String|Y | - |问题标题 questionOption|Array |Y | - |问题选项, 是选择题则至少有两个元素,简答题无元素 #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok", "data": 0 } ``` > #### data参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- data |int |Y | - |0.操作成功,1.操作失败,2.paper的id非法(无此问卷) ### 2.5 删除问卷 #### 接口地址 ``` domain/api/v1/admin/delete-paper ``` #### 请求方式 HTTP POST #### 请求示例 ``` { "idList": ["4askfj1093jfi9348oueir932", "sfs6f465vfsdf65sf654s6sf"] } ``` > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- idList |Array|Y | - | 问卷id列表,至少一个元素 #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok", "data": 0 } ``` > #### data参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- data |int |Y | - |0.操作成功,1.操作失败,2.paper的id非法(无此问卷) ### 2.6 用户查看问卷(答卷页面) #### 接口地址 ``` domain/api/v1/user/view-paper?id=4askfj1093jfi9348oueir932 ``` #### 请求方式 HTTP GET #### 请求示例 无 > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - | 问卷id #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok", "data": { "status": 0, //只有status为1时才可作答 "id": "4askfj1093jfi9348oueir932", "title": "你幸福吗的调查", "createTime": 1536887397173, "startTime": "2018-09-12", "endTime": "2018-10-01", "questions": [ {"id": "1234", "questionType":1, "questionTitle": "你的收入是多少?", "questionOption": ["2000以下", "2000-5000", "5000+"]}, {"id": "2234", "questionType":2, "questionTitle": "你家里有哪些家电?", "questionOption": ["冰箱", "洗衣机", "空调", "麻将机"]}, {"id": "3234", "questionType":3, "questionTitle": "说一说你觉得最幸福的事", "questionOption": []} ] } } ``` > #### data参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- status|int |Y | - |问卷状态:0.未发布,1.发布中(可作答),2.已结束,3.无此问卷,4.已发布但未到开始时间 id |String|N | - |问卷ID title |String|N | - |问卷标题 createTime|long |N | - |问卷创建时的时间戳 startTime |String|N | - |问卷开达日期,若未设置则是空字符串 endTime |String|N | - |问卷结束日期,若未设置则是空字符串 questions |Array |N | - |问题列表 > #### questions参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - |问题ID questionType |int |Y | - |问题类型:1.单选题,2.多选题,3.简答题 questionTitle |String|Y | - |问题标题 questionOption|Array |Y | - |问题选项, 是选择题则至少有两个元素,简答题无元素 > #### 补充说明 1. status为必须参数 2. 若status为0或3,则data中除status外无其他参数 3. 若status为1,data中包含全部参数,用户可正常作答 4. 若status为2或4,data中只包含title、startTime、endTime,用于提示用户 ### 2.7 提交问卷答案 #### 接口地址 ``` domain/api/v1/user/commit-paper ``` #### 请求方式 HTTP POST #### 请求示例 ``` //页面中的数据来自view-paper接口 { "id": "4askfj1093jfi9348oueir932", "answers": [ {"id": "1234", "questionType":1, "answerContent": ["2000-5000"]}, //单选题,Array中仅一个元素 {"id": "2234", "questionType":2, "answerContent": ["空调", "麻将机"]}, //多选,Array中至少一个元素 {"id": "3234", "questionType":3, "answerContent": ["上了王者"]} //简答 ] } } ``` > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - |问卷ID answers |Array |Y | - |答案列表 > #### answers参数说明 参数 |类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- id |String|Y | - |问题id questionType |int |Y | - |问题类型:1.单选,2.多选,3.简答 answerContent |- |Y | 0-512字符 |答题选项, 是选择题则至少有一个元素,简答题最多一个元素(不答则为无元素) #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok" } ``` > #### data参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- code |int |Y | - |0.操作成功,1.操作失败,2.问卷id无效 ### 2.8 查看问卷数据 #### 接口地址 ``` domain/api/v1/admin/paper-data ``` #### 请求方式 HTTP POST #### 请求示例 ``` { "id": "4askfj1093jfi9348oueir932" } ``` > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - | 问卷id #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok", "data": { "id": "4askfj1093jfi9348oueir932", "title": "你幸福吗的调查", "status": 0, "createTime": 1536887397173, "startTime": "2018-09-12", "endTime": "2018-10-01", "totalCount": 140, "questions": [ { "id": "1234", "questionType":1, "questionTitle": "你的收入是多少?", "questionOption": ["2000以下", "2000-5000", "5000+"], "answerContent": [10, 30, 100] }, { "id": "2234", "questionType":2, "questionTitle": "你家里有哪些家电?", "questionOption": ["冰箱", "洗衣机", "空调", "麻将机"], "answerContent": [30, 40, 80, 20] }, { "id": "3234", "questionType":3, "questionTitle": "说一说你觉得最幸福的事", "questionOption": [], "answerContent": [ "从青铜", "到黄金", "到王者" ] }, { "id": "4234", "questionType":3, "questionTitle": "说一说你觉得最难过的事", "questionOption": [], "answerContent": [ "从王者", "到青铜" ] } ] } } ``` > #### data参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - |问卷ID title |String|Y | - |问卷标题 status|int |Y | - |问卷状态:0.未发布,1.已发布,2.已结束 createTime|long |Y | - |问卷创建时的时间戳 startTime |String|Y | - |问卷开达日期,若未设置则是空字符串 endTime |String|Y | - |问卷结束日期,若未设置则是空字符串 totalCount |int |Y | - |问卷被达总次数(人次) questions |Array |Y | - |问题列表 > #### questions参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- id |String|Y | - |问题ID questionType |int |Y | - |问题类型:1.单选题,2.多选题,3.简答题 questionTitle |String|Y | - |问题标题 questionOption|Array |Y | - |问题选项,选择题是Array,简答题为空字符串 answerContent |Array |Y | - |答案内容,选择题中的元素为int,简答题为String ### 2.9 下载问卷模板文件 #### 文件地址 ``` domain/template.xls ``` #### 使用方式 ```html 下载模板 ``` ### 2.10 上传问卷模板文件生成问卷 #### 接口地址 ``` domain/api/v1/admin/upload ``` #### 请求方式 HTTP POST #### 请求示例 ``` { "file": FILE //文件 } ``` > #### 请求参数 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:---|:---|:---|:--- file |FILE|Y | - |文件模板文件(Excel) #### 返回参数 返回示例 ``` { "code": 0, "msg": "ok" } ``` > #### data参数说明 参数 | 类型 | 是否必须 | 取值范围 | 说明 :--- |:--- |:--- |:--- |:--- code |int |Y | - |0.操作成功,1.系统异常,2.文件不合法 > #### 常见返回值情形 code | msg :--- |:--- | -1 | 账号未登录或登录已经失效 0 | ok 1 | 异常的具体信息 2 | 未选择文件! 2 | 文件类型不支持! 2 | 文件大小限制在100KB以内! 2 | 文件转换失败,请注意格式要求!