作者主页:Java毕设网
简介:Java领域优质创作者、Java项目、学习资料、技术互助
文末获取源码
一、相关文档
问卷调查法是当今社会调查中被广泛使用的一项调查研究方法,它以固定的问题、固定的选项来采集大量研究调查的数据,有效地帮助到各种科学社会研究。传统的纸质问卷调查虽然能实现不同的调查对象填写问卷,但是后期对采集到的问卷数据整理、统计和分析的工作量十分庞大,调查过程需要耗费大量的人力物力。
本项目开发了一个基于Spring Boot的在线问卷调查系统,设计以Web形式进行问卷调查,实现调查问卷网络化,让问卷调查的形式、时间和地点不受限制,调查问卷数据的收集变得更加方便。项目采用Spring Boot、Vue、 Element UI、Axios和MySQL等多种互联网前沿技术,具有操作简单、界面和谐美观等优点。
本项目开发的在线问卷调查系统大概分为四个模块,分别是用户登录注册模块、用户信息管理模块、调查问卷管理模块和调查数据管理模块。
调查问卷管理模块主要是负责对系统中的调查问卷操作的管理。该模块主要负责向调查对象提供获取系统中的调查问卷列表,使用者通过查看调查问卷列表,来查找自己的感兴趣的调查问卷,并查看详情。使用者也可以通过搜索关键字来对目标问卷进行快速查找。此外,该模块还负责向系统用户提供获取使用者创建的调查问卷列表、建立新的调查问卷、调查问卷的编辑和查看调查问卷详情的功能。研究人员在登录账号进入系统之后就可以查看使用者个人建立的调查问卷列表,该列表向使用者展示了问卷调查的详细信息,包括问卷标题、问卷的创建日期、问卷最后的修改日期,以及问卷的状态等。使用者可以根据自己的需求对调查问卷进行设计、修改、发布和删除等操作。
使用者若需要进行新的一项问卷调查,可以建立一份新的调查问卷。在找到建立问卷的入口后,确定好新问卷的标题和简介,就可以对问卷进行设计和编辑。系统给调查问卷的问题设置了三个类别,分别是单选题、多选题和简答题,用户根据问卷问题的内容选择添加不同的类别表单,然后进行问题内容的编辑。在问卷的设计和编辑结束之后,用户可以选择对问卷进行发布和保存的操作。发布问卷,则该调查问卷的状态设为公开,调查对象可以查找到该问卷并回答问卷。保存问卷,该调查问卷的状态设为私密,用户后续可以继续对调查问卷进行编辑和设计。
该在线问卷调查系统一共有六个实体,分别是用户、调查问卷、问卷问题、问题选项、问卷作答和问卷统计[7]。数据库的E-R图采用ERStudio软件来进行绘制,该软件是一款可视化数据建模工具,可以根据系统的业务需求来实现高质量的数据库结构,同时还可以帮助开发人员建立初步的数据库模型。
二、项目介绍
> * 本项目的在线问卷调查调查系统是基于SpringBoot开发的,采用了前后端分离模式来开发。
> * 前端开发使用了Vue、Element UI,后端的开发则是使用了SpringBoot、MyBatis技术。
三、环境需要
> * 下载项目压缩包,在IDEA或者Eclipse软件中打开,并修改**application.yml**文件中数据库的用户和密码
> * 创建对应sql文件名称的数据库,在本地的MySQL 5.7 数据库中导入项目的**sql文件**
> * 在编译器中运行该项目:此为SpringBoot框架,启动主类Main方法
> * 在浏览器中输入**localhost:8181**后按回车键进入系统
> * 管理员测试账号:admin 密码:456789
四、技术栈
前端开发使用了Vue、Element UI
后端的开发则是使用了SpringBoot、MyBatis技术
五、使用说明
1.运行 npm install
2.在运行 npm run serve 即可
3.运行项目成功后,即可登录;
六、运行截图
前台页面
七、相关代码
用户管理控制器
@Controller
public class UserCtrl {
@Resource
private UserService userService;
@PostMapping(value = "/allUser")
@ResponseBody //获取所有用户
public JSONObject selectAllUsers(){
JSONObject json = new JSONObject();
//获取所有用户信息
List<User> users = userService.selectAllUsers();
//把结果json化
JSONObject userList = (JSONObject) JSON.toJSON(users);
json.put("userlist",userList);
return json;
}
@CrossOrigin
@PostMapping(value = "api/login")
@ResponseBody //用户登录
public JSONObject login(@RequestBody User loginUser){
JSONObject res = new JSONObject();
//获取输入的用户名
String username = loginUser.getUsername();
username = HtmlUtils.htmlEscape(username);
//获取输入的密码
String password = loginUser.getPassword();
password = HtmlUtils.htmlEscape(password);
//在数据库查找
User curUser = userService.findUser(username,password);
if (curUser==null){
//用户名或密码输入错误
res.put("msg","fail");
}else{
//登录成功
res.put("msg","success");
// 把登录用户的id和name传过去
int id = curUser.getId();
String name = curUser.getUsername();
res.put("id",id);
res.put("name",name);
}
return res;
}
@CrossOrigin
@PostMapping(value = "api/register")
@ResponseBody //用户注册
public JSONObject register(@RequestBody User registerUser){
JSONObject data = new JSONObject();
// 获取注册用户的用户名
String username = registerUser.getUsername();
username = HtmlUtils.htmlEscape(username);
if (!"".equals(username)){
User temp = userService.findUserByName(username);//查找用户名是否被占用
if (temp == null){
//可以进行注册
int res = userService.addUser(registerUser);
if (res > 0) // 注册成功
data.put("msg", "success");
else // 注册失败
data.put("msg","fail");
}else {
//用户名不可用
data.put("msg","unusable");
}
}
return data;
}
@CrossOrigin
@PostMapping(value = "api/getName")
@ResponseBody // 获取当前用户的用户名
public JSONObject getName(@RequestBody User user){
JSONObject json = new JSONObject();
int id = user.getId();
String username = userService.getNameById(id);
if (username != null && !"".equals(username))
json.put("username",username);
else
json.put("username","error");
return json;
}
@CrossOrigin
@PostMapping(value = "api/userInfo")
@ResponseBody //获取当前用户信息
public JSONObject getUserInfo(@RequestBody User curUser){
JSONObject json = new JSONObject();
int id = curUser.getId();
//根据id获取当前用户信息
User user = userService.findUserById(id);
//将结果json化
JSONObject userInfo = (JSONObject) JSON.toJSON(user);
json.put("user",userInfo);
return json;
}
@CrossOrigin
@PostMapping(value = "api/resetPass")
@ResponseBody // 重置账号密码
public JSONObject resetPassword(@RequestBody User user){
JSONObject json = new JSONObject();
//获取账号的用户名
String username = user.getUsername();
//获取账号的手机号
String telephone = user.getTelephone();
//获取账号的新密码
String newPass = user.getPassword();
//调用业务逻辑层接口,检查系统中是否存在与用户名对应的账号
User res = userService.findUserByName(username);
//1.存在该账号
if (res!=null){
if (res.getTelephone().equals(telephone)){
//1.1 手机号与该账号的手机号对应,可以重置密码
int count = userService.resetPass(res.getId(),newPass);
if (count > 0){
//1.1.1 密码重置成功,返回操作结果
json.put("msg","success");
}else{
//1.1.2 出现错误,重置失败,返回操作结果
json.put("msg","fail");
}
}else{
//1.2 手机号不匹配,返回错误信息
json.put("msg","phone-err");
}
}else{
//2.用户名输入错误,不存在该账号,返回错误信息
json.put("msg","name-err");
}
return json;
}
@CrossOrigin
@PostMapping(value = "api/setPass")
@ResponseBody // 修改账号密码
public JSONObject setPass(@RequestBody JSONObject user){
JSONObject json = new JSONObject();
//获取当前用户的账号编号
int id = user.getInteger("uid");
//获取当前账号原本的密码
String oldPass = user.getString("oldPass");
//获取当前账号新的密码
String newPass = user.getString("newPass");
//调用业务逻辑层接口,检查当前用户输入的旧密码是否正确
User res = userService.findUserById(id);
if (res!=null){
if (res.getPassword().equals(oldPass)){
//旧密码正确,可以修改账号密码
int count = userService.resetPass(res.getId(),newPass);
if (count > 0){
//密码修改成功,返回操作结果
json.put("msg","success");
}else{
//出现错误,修改失败,返回错误信息
json.put("msg","fail");
}
}else{
//旧密码错误,返回错误信息
json.put("msg","oldPass-err");
}
}else{
//当前用户不存在,返回错误信息
json.put("msg","user-err");
}
return json;
}
@CrossOrigin
@PostMapping(value = "api/setName")
@ResponseBody // 修改用户名(保持username的唯一性)
public JSONObject setUsername(@RequestBody User user){
JSONObject json = new JSONObject();
int id = user.getId();//获取用户的id
String username = user.getUsername();
if (!"".equals(username) && username != null){
String before = userService.getNameById(id);//获取原本的username值
if (before.equals(username)){
json.put("msg","same");// 用户名没有变化
}else{
User temp = userService.findUserByName(username);//检测用户名是否被占用
if (temp==null){
//查找为空,用户名可以修改
int res = userService.setUsername(id,username);//修改当前账号的用户名
if (res > 0){
json.put("msg","success");//修改成功
json.put("username",username);
}else{
json.put("msg","error");//出现错误,修改失败
}
}else{
//用户名已存在,修改失败
json.put("msg","fail");
}
}
}else{
//出现错误,修改失败
json.put("msg","error");
}
return json;
}
@CrossOrigin
@PostMapping(value = "api/setTel")
@ResponseBody // 修改手机号(保持telephone的唯一性)
public JSONObject setTelephone(@RequestBody User user){
JSONObject json = new JSONObject();
int id = user.getId(); //获取用户的id
String phone = user.getTelephone();
if (!"".equals(phone) && phone != null){
String before = userService.getBeforePhone(id);//获取原本的phone值
if (before.equals(phone)){
json.put("msg","same");//phone没有改变,修改失败
return json;
}else{
// 检测该手机号是否已绑定其他账号
User temp = userService.getUserByPhone(phone);
if (temp == null){
//查找结果为空,该手机号可以修改
int res = userService.setPhone(id,phone);
if (res > 0){
//修改成功,返回信息
json.put("msg","success");
json.put("phone",phone);
}else{
//出现错误,修改失败
json.put("msg","error");
}
}else {
// 该手机号已被绑定,修改失败
json.put("msg","fail");
}
}
}else{
//出现错误,修改失败
json.put("msg","error");
}
return json;
}
@CrossOrigin
@PostMapping(value = "api/setSex")
@ResponseBody // 修改性别
public JSONObject setSex(@RequestBody User user){
JSONObject json = new JSONObject();
int id = user.getId(); //获取用户的id
int sex = user.getSex();
if (sex>-1 && sex<2){//检测sex的值是否有效
int before = userService.getBeforeSex(id);//获取原本的sex值
if (before == sex ){
json.put("msg","same");//sex没有改变,修改失败
}else{
//sex变化了,可以修改
int res = userService.setSex(id,sex);
if (res > 0){
json.put("msg","success");//修改成功
json.put("sex",String.valueOf(sex));
}else
json.put("msg","error");//出现错误,修改失败
}
}else{
json.put("msg","fail");//sex值为无效,修改失败
}
return json;
}
@CrossOrigin
@PostMapping(value = "api/setBirthdate")
@ResponseBody // 修改出生日期
public JSONObject setBirthdate(@RequestBody User user){
JSONObject json = new JSONObject();
int id = user.getId(); //获取用户的id
String date = user.getBirthdate();
if (!"".equals(date) && date != null){//检测birthdate的值是否有效
String before = userService.getBeforeDate(id);//获取原本的sex值
if (date.equals(before)){
json.put("msg","same");//sex没有改变,修改失败
}else{
//可以修改
int res = userService.setDate(id,date);
if (res > 0){
json.put("msg","success");//修改成功
json.put("birthdate",date);
}else {
json.put("msg","error");//出现错误,修改失败
}
}
}else{
//出现错误,修改失败
json.put("msg","fail");
}
return json;
}
}
问卷管理控制器
@Controller
public class QuestionCtrl {
@Resource
private QuestionService questionService;
@Resource
private OptionService optionService;
@Resource
private ResponseService responseService;
@Resource
private SurveyService surveyService;
//给新问卷添加题目列表
@CrossOrigin
@PostMapping(value = "api/addQuesList")
@ResponseBody
public JSONObject addQuesList(@RequestBody JSONObject data){
JSONObject json = new JSONObject();
//获取问卷编号
int sid = data.getInteger("sid");
//获取问题列表
JSONObject quesList = data.getJSONObject("quesList");
JSONArray ques = quesList.getJSONArray("question");
//设置flag记录问题记录过程
boolean flag = false;
//遍历问题列表
for (Object q:ques) {
//强制转换
JSONObject que = (JSONObject) q;
//获取该问题的题目类型
int qtype = que.getInteger("qtype");
//获取该问题内容
String qtitle = que.getString("qtitle");
if (qtype==1||qtype==2){
//问题为选择题,先添加问题信息,并获取问题编号
Question quesChos = new Question();
quesChos.setQtype(qtype);
quesChos.setQtitle(qtitle);
quesChos.setSid(sid);
int qid = questionService.addQueChos(quesChos);//添加选择题
if (qid>0){
//问题添加成功,获取对应的选项列表
JSONArray ops = que.getJSONArray("options");
for (Object o:ops) {
//强制转换
JSONObject op = (JSONObject) o;
//获取选项值
String value = op.getString("value");
//添加问题选项
int res = optionService.addOption(value,qid);
if (res>0)
flag = true;//选项添加成功
else{
flag=false;
break;
}
}
}
if (!flag) break;
}else if (qtype==3){
//问题为简答题,直接添加问题信息
int count = questionService.addQueText(qtitle,3,sid);//添加简答题
if (count > 0)
flag = true;//添加成功
else{
flag=false;
break;
}
}
}
if (flag){
//操作成功
json.put("msg","success");
}else{
json.put("msg","fail");
}
return json;
}
//修改问卷的问题及选项信息
@CrossOrigin
@PostMapping(value = "api/editSurvey")
@ResponseBody
public JSONObject editSurvey(@RequestBody JSONObject data){
JSONObject json = new JSONObject();
//设置flag记录操作过程
boolean flag = false;
//获取该问卷的编号
int sid = data.getInteger("sid");
JSONObject queList = data.getJSONObject("quesList");
//先做删除操作,再做修改操作
JSONArray delQues = queList.getJSONArray("delQues");//获取要删除的问题编号数组
JSONArray delOps = queList.getJSONArray("delOps");//获取要删除的选项编号数组
//删除问题操作
if (delQues.size()>0){
//遍历数组
for (int i = 0; i < delQues.size(); i++) {
JSONObject que = delQues.getJSONObject(i);
//获取问题编号、题目类型
int qid = que.getInteger("qid");
int qtype = que.getInteger("qtype");
//若题目为选择题
if (qtype==1||qtype==2){
//先删除对应题目的所有选项信息
int countOps = optionService.delOptionsByQid(qid);
if (countOps>0){
flag = true;
}else {
flag = false;
break;
}
}else if(qtype==3){
//再删除该条问题信息
int countQue = questionService.delQuestionByQid(qid);
System.out.println("删除问题:"+qtype);
//保险一点,删掉该条问题的回答数据
responseService.delResponseByQid(qid);
if (countQue>0){
flag = true;
}else {
flag = false;
break;
}
}
questionService.delQuestionByQid(qid);
//保险一点,删掉该条问题的回答数据
responseService.delResponseByQid(qid);
}
}
//删除选项操作
if (delOps.size()>0){
//遍历数组
for (int i = 0; i < delOps.size(); i++) {
int oid = delOps.getInteger(i);//获取选项编号
//删除对应的选项信息
int count = optionService.delOptionByOid(oid);
if (count>0) flag=true;
else {
flag=false;
break;
}
//保险一点,删除对应选项的回答数据
responseService.delResponseByOid(oid);
}
}
//修改或添加问题和选项信息
JSONArray ques = queList.getJSONArray("question");//获取问题列表
//遍历问题数组
for (int i = 0; i < ques.size(); i++) {
JSONObject que = ques.getJSONObject(i);
int qtype = que.getInteger("qtype");//获取该问题的题目类型
String qtitle = que.getString("qtitle");//获取该问题内容
//判断该问题是否为新添加
if (que.getInteger("qid")==null){
//添加问题操作
if (qtype==1||qtype==2){
//问题为选择题,先添加问题信息,并获取问题编号
Question quesChos = new Question();
quesChos.setQtype(qtype);
quesChos.setQtitle(qtitle);
quesChos.setSid(sid);
int qid = questionService.addQueChos(quesChos);//添加选择题
if (qid>0){
//问题添加成功,获取对应的选项列表
JSONArray ops = que.getJSONArray("options");
for (int j = 0; j < ops.size(); j++) {
JSONObject op = ops.getJSONObject(j);
String option = op.getString("option");//获取选项值
//添加问题选项
int res = optionService.addOption(option,qid);
if (res>0)
flag = true;//选项添加成功
else{
flag=false;
break;
}
}
}
if (!flag) break;
}else if (qtype==3){
//问题为简答题,直接添加问题信息
int count = questionService.addQueText(qtitle,3,sid);//添加简答题
if (count > 0)
flag = true;//添加成功
else{
flag=false;
break;
}
}
}else{
//修改问题操作
int qid = que.getInteger("qid");//获取问题编号
//选择题
if (qtype==1 || qtype==2){
// 更新选项信息
JSONArray ops = que.getJSONArray("options");
for (int j = 0; j < ops.size(); j++) {
JSONObject op = ops.getJSONObject(j);//获取选项
String option = op.getString("option");
//先判断该选项是否为新添加
if (op.getInteger("oid")==null){
System.out.println("添加新的选项");
//为该问题添加新的选项
int res = optionService.addOption(option,qid);//添加问题选项
if (res>0)
flag = true;//选项添加成功
else{
flag=false;
break;
}
}else {
int oid = op.getInteger("oid");//获取选项编号
int countOp = optionService.updateOption(option,oid);
if (countOp>0){
flag=true;
}else {
flag=false;
break;
}
}
}
}
if (flag){
//更新问题信息
int countQue = questionService.updateQuestion(qtitle,qid);
if (countQue>0){
flag=true;
}else {
flag=false;
break;
}
}
}
}
//更新该问卷的最后修改时间
surveyService.updateLastTime(sid);
if (flag)
json.put("msg","success");
else
json.put("msg","fail");
return json;
}
}