热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于javaweb的调查问卷管理系统(java+springboot+vue+elementui+mysql)

基于javaweb的调查问卷管理系统(javaspringbootvueelementuimysql)运行环境Java≥8、MySQL≥5.7、Node.js≥10开发工具




基于javaweb的调查问卷管理系统(java+springboot+vue+elementui+mysql)

运行环境

Java≥8、MySQL≥5.7、Node.js≥10

开发工具

后端:eclipse/idea/myeclipse/sts等均可配置运行

前端:WebStorm/VSCode/HBuilderX等均可

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

20220819215918

20220819215919

20220819215920

20220819215921

20220819215922

20220819215923

基于javaweb+mysql的调查问卷管理系统(java+SpringBoot+Vue+ElementUI+Maven+mysql)

项目介绍



  • 本项目的在线问卷调查调查系统是基于SpringBoot开发的,采用了前后端分离模式来开发。



  • 前端开发使用了Vue、Element UI,后端的开发则是使用了SpringBoot、MyBatis技术。

项目配置



  • 下载项目压缩包,在IDEA或者Eclipse软件中打开,并修改application.yml文件中数据库的用户和密码 > * 在本地的MySQL数据库中导入项目的sql文件 > * 在编译器中运行该项目:此为SpringBoot框架,启动主类Main方法



  • 在浏览器中输入localhost:8181后按回车键进入系统

用户管理控制器:

/**


  • 用户管理控制器

*/

@RequestMapping(“/user/”)

@Controller

public class UserController {

@Autowired

private IUserService userService;

@Autowired

private IRoleService roleService;

@Resource

private ProcessEngineConfiguration configuration;

@Resource

private ProcessEngine engine;

@GetMapping(“/index”)

@ApiOperation(“跳转用户页接口”)

@PreAuthorize(“hasRole(‘管理员’)”)

public String index(String menuid,Model model){

List roles = queryAllRole();

model.addAttribute(“roles”,roles);

model.addAttribute(“menuid”,menuid);

//用户首页

return “views/user/user_list”;

@GetMapping(“/listpage”)

@ApiOperation(“查询用户分页数据接口”)

@ApiImplicitParams({

@ApiImplicitParam(name = “UserQuery”, value = “用户查询对象”, defaultValue = “userQuery对象”)

})

@ResponseBody

@PreAuthorize(“hasRole(‘管理员’)”)

public PageList listpage(UserQuery userQuery){

return userService.listpage(userQuery);

//添加用户

@PostMapping(“/addUser”)

@ApiOperation(“添加用户接口”)

@ResponseBody

public Map addUser(User user){

Map ret &#61; new HashMap<>();

ret.put(“code”,-1);

if(StringUtils.isEmpty(user.getUsername())){

ret.put(“msg”,“请填写用户名”);

return ret;

if(StringUtils.isEmpty(user.getPassword())){

ret.put(“msg”,“请填写密码”);

return ret;

if(StringUtils.isEmpty(user.getEmail())){

ret.put(“msg”,“请填写邮箱”);

return ret;

if(StringUtils.isEmpty(user.getTel())){

ret.put(“msg”,“请填写手机号”);

return ret;

if(StringUtils.isEmpty(user.getHeadImg())){

ret.put(“msg”,“请上传头像”);

return ret;

if(userService.addUser(user)<&#61;0) {

ret.put(“msg”, “添加用户失败”);

return ret;

ret.put(“code”,0);

ret.put(“msg”,“添加用户成功”);

return ret;

/**


  • 修改用户信息操作

  • &#64;param user

  • &#64;return

*/

&#64;PostMapping(“/editSaveUser”)

&#64;ApiOperation(“修改用户接口”)

&#64;PreAuthorize(“hasRole(‘管理员’)”)

&#64;ResponseBody

public Message editSaveUser(User user){

if(StringUtils.isEmpty(user.getUsername())){

return Message.error(“请填写用户名”);

if(StringUtils.isEmpty(user.getEmail())){

return Message.error(“请填写邮箱”);

if(StringUtils.isEmpty(user.getTel())){

return Message.error(“请填写手机号”);

try {

userService.editSaveUser(user);

return Message.success();

} catch (Exception e) {

e.printStackTrace();

return Message.error(“修改用户信息失败”);

//添加用户

&#64;GetMapping(“/deleteUser”)

&#64;ApiOperation(“删除用户接口”)

&#64;ApiImplicitParams({

&#64;ApiImplicitParam(name &#61; “id”, value &#61; “如:88”,required &#61; true)

})

&#64;PreAuthorize(“hasRole(‘管理员’)”)

&#64;ResponseBody

public AjaxResult deleteUser(&#64;RequestParam(required &#61; true) Long id){

AjaxResult ajaxResult &#61; new AjaxResult();

try {

userService.deleteUser(id);

} catch (Exception e) {

e.printStackTrace();

return new AjaxResult(“删除失败”);

return ajaxResult;

&#64;PostMapping(value&#61;“/deleteBatchUser”)

&#64;ApiOperation(“批量删除用户接口”)

&#64;PreAuthorize(“hasRole(‘管理员’)”)

&#64;ResponseBody

public AjaxResult deleteBatchUser(String ids){

String[] idsArr &#61; ids.split(“,”);

List list &#61; new ArrayList();

for(int i&#61;0;i

list.add(idsArr[i]);

try{

userService.batchRemove(list);

return new AjaxResult();

}catch(Exception e){

return new AjaxResult(“批量删除失败”);

//查询所有角色

public List queryAllRole(){

return roleService.queryAll();

//添加用户的角色

&#64;PostMapping(“/addUserRole”)

&#64;ApiOperation(“添加用户角色接口”)

&#64;ApiImplicitParams({

&#64;ApiImplicitParam(name &#61; “paramMap”, value &#61; “如:{userId:1,[1,2,3,4]]}”)

})

&#64;ResponseBody

public AjaxResult addUserRole(&#64;RequestBody Map paramMap){

AjaxResult ajaxResult &#61; new AjaxResult();

String userId &#61; (String)paramMap.get(“userId”);

List roleIds &#61; (List) paramMap.get(“roleIds”);

try {

//添加用户对应的角色

roleService.addUserRole(userId,roleIds);

return ajaxResult;

}catch (Exception e){

e.printStackTrace();

return new AjaxResult(“保存角色失败”);

//添加用户

&#64;RequestMapping(“/regSaveUser”)

&#64;ResponseBody

public Long addTeacher(User user){

System.out.println(“保存用户…”&#43;user);

userService.addUser(user);

//保存工作流程操作

IdentityService is &#61; engine.getIdentityService();

// 添加用户组

org.activiti.engine.identity.User userInfo &#61; userService.saveUser(is, user.getUsername());

// 添加用户对应的组关系

Group stuGroup &#61; new GroupEntityImpl();

stuGroup.setId(“stuGroup”);

Group tGroup &#61; new GroupEntityImpl();

tGroup.setId(“tGroup”);

if(user.getType() &#61;&#61; 2) {

//保存老师组

userService.saveRel(is, userInfo, tGroup);

if(user.getType() &#61;&#61; 3) {

//保存学生组

userService.saveRel(is, userInfo, stuGroup);

Long userId &#61; user.getId();

return userId;

/**


  • 修改密码页面

  • &#64;return

*/

&#64;RequestMapping(value&#61;“/update_pwd”,method&#61;RequestMethod.GET)

public String updatePwd(){

return “views/user/update_pwd”;

/**


  • 修改密码操作

  • &#64;param oldPwd

  • &#64;param newPwd

  • &#64;return

*/

&#64;ResponseBody

&#64;PostMapping(“/update_pwd”)

public Message updatePassword(&#64;RequestParam(name&#61;“oldPwd”,required&#61;true)String oldPwd,

&#64;RequestParam(name&#61;“newPwd”,required&#61;true)String newPwd){

String username &#61; CommonUtils.getLoginUser().getUsername();

User userByUserName &#61; userService.findUserByUserName(username);

if(userByUserName!&#61;null){

String password &#61; userByUserName.getPassword();

BCryptPasswordEncoder bCryptPasswordEncoder &#61; new BCryptPasswordEncoder();

boolean matches &#61; bCryptPasswordEncoder.matches(oldPwd, password);

if(!matches){

return Message.error(“旧密码不正确”);//true

userByUserName.setPassword(bCryptPasswordEncoder.encode(newPwd));

if(userService.editUserPassword(userByUserName)<&#61;0){

return Message.error(“密码修改失败”);

return Message.success();

/**


  • 清除缓存

  • &#64;param request

  • &#64;param response

  • &#64;return

*/

&#64;ResponseBody

&#64;PostMapping(“/clear_cache”)

public Message clearCache(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setHeader(“Cache-Control”,“no-store”);

response.setHeader(“Pragrma”,“no-cache”);

response.setDateHeader(“Expires”,0);

return Message.success();

登录管理控制层&#xff1a;

&#64;Controller

public class LonginController {

private final static Logger LOGGER &#61; LoggerFactory.getLogger(LonginController.class);

public final static String LOGIN_TYPE &#61; “loginType”;

&#64;Autowired

&#64;Qualifier(“captchaProducer”)

DefaultKaptcha captchaProducer;

&#64;Autowired

UserService userService;

&#64;Autowired

MenuService menuService;

public enum LoginTypeEnum {

PAGE,ADMIN;

// &#64;RequestMapping(value &#61; “”)

// public String welcome() {

// return “redirect:admin”;

// }

&#64;RequestMapping(value &#61; {“admin”,“admin/index”})

public String adminIndex(RedirectAttributes attributes, ModelMap map) {

Subject s &#61; SecurityUtils.getSubject();

attributes.addFlashAttribute(LOGIN_TYPE, LoginTypeEnum.ADMIN);

if(s.isAuthenticated()) {

return “redirect:index”;

return “redirect:toLogin”;

&#64;RequestMapping(value &#61; “toLogin”)

public String adminToLogin(HttpSession session, &#64;ModelAttribute(LOGIN_TYPE) String loginType) {

if(StringUtils.isBlank(loginType)) {

LoginTypeEnum attribute &#61; (LoginTypeEnum) session.getAttribute(LOGIN_TYPE);

loginType &#61; attribute &#61;&#61; null ? loginType : attribute.name();

if(LoginTypeEnum.ADMIN.name().equals(loginType)) {

session.setAttribute(LOGIN_TYPE,LoginTypeEnum.ADMIN);

return “admin/login”;

}else {

session.setAttribute(LOGIN_TYPE,LoginTypeEnum.PAGE);

return “login”;

&#64;RequestMapping(value &#61; “index”)

public String index(HttpSession session, &#64;ModelAttribute(LOGIN_TYPE) String loginType) {

if(StringUtils.isBlank(loginType)) {

LoginTypeEnum attribute &#61; (LoginTypeEnum) session.getAttribute(LOGIN_TYPE);

loginType &#61; attribute &#61;&#61; null ? loginType : attribute.name();

if(LoginTypeEnum.ADMIN.name().equals(loginType)) {

AuthRealm.ShiroUser principal &#61; (AuthRealm.ShiroUser) SecurityUtils.getSubject().getPrincipal();

session.setAttribute(“icon”,StringUtils.isBlank(principal.getIcon()) ? “/static/admin/img/face.jpg” : principal.getIcon());

return “admin/index”;

}else {

AuthRealm.ShiroUser principal &#61; (AuthRealm.ShiroUser) SecurityUtils.getSubject().getPrincipal();

return “admin/index”;

&#64;RequestMapping(“/getCaptcha”)

public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {

//设置页面不缓存

response.setHeader(“Pragma”, “no-cache”);

response.setHeader(“Cache-Control”, “no-cache”);

response.setDateHeader(“Expires”, 0);

String verifyCode &#61; captchaProducer.createText();

//将验证码放到HttpSession里面

request.getSession().setAttribute(Constants.VALIDATE_CODE, verifyCode);

LOGGER.info(“本次生成的验证码为[” &#43; verifyCode &#43; “],已存放到HttpSession中”);

//设置输出的内容的类型为JPEG图像

response.setContentType(“image/jpeg”);

BufferedImage bufferedImage &#61; captchaProducer.createImage(verifyCode);

//写给浏览器

ImageIO.write(bufferedImage, “JPEG”, response.getOutputStream());

&#64;PostMapping(“admin/login”)

&#64;SysLog(“用户登录”)

&#64;ResponseBody

public ResponseEntity adminLogin(HttpServletRequest request) {

String username &#61; request.getParameter(“username”);

String password &#61; request.getParameter(“password”);

String rememberMe &#61; request.getParameter(“rememberMe”);

String code &#61; request.getParameter(“code”);

String driver &#61; request.getParameter(“driver”);

String errorMsg &#61; null;

//判断登陆设备

if(StringUtils.isBlank(driver)){

//电脑登录

if(StringUtils.isBlank(username) || StringUtils.isBlank(password)){

return ResponseEntity.failure(“用户名或者密码不能为空”);

}else if(StringUtils.isBlank(code)){

return ResponseEntity.failure(“验证码不能为空”);

HttpSession session &#61; request.getSession();

if(session &#61;&#61; null){

return ResponseEntity.failure(“session超时”);

String trueCode &#61; (String)session.getAttribute(Constants.VALIDATE_CODE);

if(StringUtils.isBlank(trueCode)){

return ResponseEntity.failure(“验证码超时”);

if(StringUtils.isBlank(code) || !trueCode.toLowerCase().equals(code.toLowerCase())){

return ResponseEntity.failure(“验证码错误”);

}else {

Subject user &#61; SecurityUtils.getSubject();

UsernamePasswordToken token &#61; new UsernamePasswordToken(username,password,Boolean.valueOf(rememberMe));

try {

user.login(token);

}catch (IncorrectCredentialsException e) {

errorMsg &#61; “用户名密码错误!”;

}catch (UnknownAccountException e) {

errorMsg &#61; “账户不存在!”;

}catch (LockedAccountException e) {

errorMsg &#61; “账户已被锁定!”;

}catch (UserTypeAccountException e) {

errorMsg &#61; “账户不是管理用户!”;

if(StringUtils.isBlank(errorMsg)) {

ResponseEntity responseEntity &#61; new ResponseEntity();

responseEntity.setSuccess(Boolean.TRUE);

responseEntity.setAny(“url”,“index”);

return responseEntity;

}else {

return ResponseEntity.failure(errorMsg);

}else{

//小程序或APP登录

if(StringUtils.isBlank(username) || StringUtils.isBlank(password)){

return ResponseEntity.failure(“用户名或者密码不能为空”);

Subject user &#61; SecurityUtils.getSubject();

UsernamePasswordToken token &#61; new UsernamePasswordToken(username,password,Boolean.valueOf(rememberMe));

try {

user.login(token);

}catch (IncorrectCredentialsException e) {

errorMsg &#61; “用户名或密码错误!”;

}catch (UnknownAccountException e) {

errorMsg &#61; “账户不存在!”;

}catch (LockedAccountException e) {

errorMsg &#61; “账户已被锁定!”;

}catch (UserTypeAccountException e) {

errorMsg &#61; “账户不是管理用户!”;

if(StringUtils.isBlank(errorMsg)) {

ResponseEntity responseEntity &#61; new ResponseEntity();

responseEntity.setSuccess(Boolean.TRUE);

responseEntity.setAny(“url”,“index”);

return responseEntity;

}else {

return ResponseEntity.failure(errorMsg);

&#64;RequestMapping(“admin/main”)

public String main(ModelMap map){

return “admin/main”;

/***


  • 获得用户所拥有的菜单列表

  • &#64;return

*/

&#64;RequestMapping(“/admin/user/getUserMenu”)

&#64;ResponseBody

public List getUserMenu(){

String userId &#61; MySysUser.id();

List list &#61; menuService.getShowMenuByUser(userId);

return list;

&#64;RequestMapping(“systemLogout”)

&#64;SysLog(“退出系统”)

public String logOut(){

SecurityUtils.getSubject().logout();

return “redirect:home”;









推荐阅读
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 如何运用蒙特卡洛方法计算NPV:计算机专业毕业设计遇到难题怎么办?
    许多计算机科学专业的学生在大学期间都会遇到这样的困扰:课堂上教授的内容往往偏向理论,实际应用的知识点讲解得较为浅显和概括,导致在进行毕业设计时,如运用蒙特卡洛方法计算净现值(NPV)等复杂问题时感到无从下手。本文旨在探讨如何通过深入理解和实践蒙特卡洛模拟技术,解决这类计算难题,为学生的毕业设计提供实用指导。 ... [详细]
  • 本文深入探讨了 Vue.js 中异步组件的应用与优化策略。首先,文章介绍了异步组件的基本概念及其在现代前端开发中的重要性。为了确保最佳实践,建议使用 Webpack 作为模块打包工具,因为 Browserify 默认不支持异步组件的加载。接着,详细解释了异步组件的使用方法,并提供了官方文档的相关链接以供参考。此外,文章还讨论了多种优化技巧,包括代码分割、懒加载和性能调优,以提升应用的整体性能和用户体验。 ... [详细]
  • Java 点餐系统源代码附带管理后台(免费提供)
    本项目提供了一套基于 Java 的点餐系统,包括前端小程序和后端管理平台。采用 Spring Boot 和 SSM 框架,结合 MySQL 和 Redis 数据库技术,适用于学习和二次开发。有需要源代码的开发者可以通过私信联系,免费获取下载链接。 ... [详细]
  • 基于Java的微信小程序:Spring Boot驱动的中小学家校互动与电子作业管理平台
    基于Java的微信小程序,采用Spring Boot作为后端框架,构建了一个高效的中小学家校互动与电子作业管理平台。前端使用了uni-app框架,确保跨平台兼容性。该平台集成了家校沟通、作业发布与管理、学生成绩查询等功能,旨在提升教育管理效率和家长参与度。后端开发环境配置完善,采用Spring Boot、MyBatis等技术栈,确保系统的稳定性和扩展性。 ... [详细]
  • 【漫画解析】数据已删,存储空间为何未减?揭秘背后真相
    在数据迁移过程中,即使删除了原有数据,存储空间却未必会相应减少。本文通过漫画形式解析了这一现象背后的真相。具体来说,使用 `mysqldump` 命令进行数据导出时,该工具作为 MySQL 的逻辑备份工具,通过连接数据库并查询所需数据,将其转换为 SQL 语句。然而,这种操作并不会立即释放存储空间,因为数据库系统可能保留了已删除数据的碎片信息。文章进一步探讨了如何优化存储管理,以确保数据删除后能够有效回收存储空间。 ... [详细]
  • 开发日志:在插入数据到一张表的同时更新另一张表的技术细节与最佳实践 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • MySQL 数据变更后如何实现实时同步至 Elasticsearch
    在 MySQL 数据变更后,如何实现与 Elasticsearch 的实时同步是一个常见的需求。本文介绍了通过配置 MySQL 的 Binlog 功能,结合中间件如 Canal 或 Debezium,将数据变更事件实时捕获并同步到 Elasticsearch 中的方法。此外,还探讨了如何处理数据删除操作,确保 Elasticsearch 中的数据与 MySQL 保持一致。文章还简要对比了 VSCode 和 Dev 两种开发环境的优缺点,为开发者提供参考。 ... [详细]
  • 机顶盒,即数字电视机顶盒(Digital TV Set-Top Box,简称STB),是一种放置在电视机旁的设备。它主要用于将数字信号转换为电视能够识别的模拟信号,从而实现高质量的视频和音频播放。机顶盒不仅支持基本的电视节目接收功能,还具备多种增值服务,如互动点播、网络浏览等。随着技术的发展,现代机顶盒集成了更多的智能功能,成为家庭娱乐的重要组成部分。 ... [详细]
  • 基于Java和JSP的电子医疗记录管理平台
    随着信息技术的快速发展,各类管理系统已在各行各业得到广泛应用。传统的人工管理模式已逐渐无法满足现代需求。本文介绍了一种基于Java和JSP技术开发的电子医疗记录管理平台,旨在提高医疗行业的信息化水平和管理效率。该平台通过整合先进的数据库技术和Web开发框架,实现了医疗记录的高效存储、查询和管理,为医护人员提供了便捷的操作界面和强大的数据支持。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • SpringBoot启动脚本详解:BAT文件应用与基础入门指南(SpringBoot系列第1篇)
    如果你还在为SSM框架的复杂搭建过程和繁琐的配置文件而烦恼,那么SpringBoot将是你的一大福音。作为SpringBoot系列的第一篇文章,本文详细介绍了如何使用BAT文件来启动SpringBoot应用,并提供了基础入门指南,帮助开发者快速上手,简化开发流程。 ... [详细]
author-avatar
幸运的anan本人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有