Hello EveryBody,今天向大家介绍通过Springboot+themleaf实现投票相关的操作,此次投票功能主要涉及注册,登录,参与投票,图形展示,邮件发送,数据库连接。
下图是整个投票功能整体的代码结构:

现在我们介绍具体的细节。

一、 注册

1.1 页面使用的是Thymeleaf,Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎,在页面的头部需要先导入,另外还需要引入jquery,用于事件处理,HTML文档遍历,Ajax交互:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
<head><meta charset="UTF-8"><title>投票系统</title><img src="companylog.png" title="yoka" alt="youka" border="1" width="211" height="78"/><script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script><script type="text/javascript">

1.2 通过正则对用户在输入框输入的账号,密码,邮箱,验证码进行校验:

$("#sub_btn").click(function () {//获取用户名并校验var usernameText = $("#username").val();var usernamePatt = /^\w{5,12}$/;if (!usernamePatt.test(usernameText)){//提示用户结果$("span.errorMsg").text("用户名不合法");return false;alert(usernameText);}

1.3 通过Ajax将数据传递给后端,接口返回:注册成功,页面跳转到投票页面:

 $.ajax({url : "http://localhost:8080/registerData",type : "POST",data : {"userName" : usernameText,"passWord" : passwordText,"email"    : email,},contentType: "application/x-www-form-urlencoded;charset=UTF-8",success : function (data) {if (data == "注册成功"){url = "book_manager?phone="+usernameText;window.location.href = url;}else {alert("参数错误");}},error:function (errorThrown) {alert("参数错误");}})
});

1.4 后端通过查询数据库,是否存在该用户,不存在:将用户信息存入数据库:
//注册页面数据处理

 @ResponseBody@RequestMapping(value = "/registerData",method = RequestMethod.POST)public String registerData(@RequestParam(value = "userName") String name,@RequestParam(value = "passWord") String password,@RequestParam(value = "email") String email){//判断用户是否注册List list = new ArrayList();list = userResipository.selectUser(name,password);System.out.println("----这是用户数据:"+list);
//        ModelAndView modelAndView = new ModelAndView();
//        modelAndView.setViewName("book_manager");if (list.size() == 0){//将注册的用户信息添加到数据库UserInfo user = new UserInfo();user.setIphone(name);user.setPasswd(password);user.setEmail(email);//设置日期格式SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// new Date()为获取当前系统时间String time = df.format(new Date());System.out.println(time);user.setTime(time);//调用封装好的方法进行保存userResipository.save(user);System.out.println("新增用户添加到数据库中,请查看。");System.out.println("注册用户信息:"+name+" "+password+" " + email);return "注册成功";}else {return "存在该用户";}}

细心的同学可能会有疑问,前端传参为什么没有传验证码进行校验,哈哈哈,因为验证码是前端页面写死的,后期再由后端生成。

下面附注册页面:

二、 登录

登录功能和注册差不多,拿账号和密码去数据库查询,存在:跳转至登录页面,不存在:跳转注册页面,就不详细的介绍了。附图。

三、投票

页面主要内容:倒计时时间,目前书籍的总投票数,支持搜索和按票数排序的功能,支持多选,另外每个用户每天只能投一次,此外,还支持背景音乐功能,哈哈哈…这个小淘(si)气(gui)。

下面是投票页面的头部,JS中实现倒计时的方法,通过search,sort方法对应的Ajax与后端进行交互,返回对应值(这里现在有个问题:返回的页面不能在当前页面重新打开,或者需要根据返回数据重新渲染当前页面,渲染这个词听起来有点高大上,不要问我怎么知道的,问就是公共支持部的大佬说的,解决了,后面会持续更新的,真是个贴心的小棉袄):

<bodySTYLE="BACKGROUND-COLOR:lightblue;">
<br/>
倒计时:<div id="timer"></div>
//背景音乐
<audio autoplay="autoplay" loop="loop" preload="auto" controls="controls"src="http://p4.music.126.net/HvB44MNINoLar8HFbRjIGQ==/109951165142435842.jpg?param=50y50&amp;quality=100">
</audio>
<embed src=" " autostart="false" loop="false" />
<div class="search">
<!--<input type="submit" value="搜索" name="vote" id="search" class="search" οnclick="search()">--><input class="itxt" type="text" placeholder="根据书名进行查找" autocomplete="off"tabindex="1" name="seach" id="search"/><input type="submit" value="搜索" name="seachbtn" id="seachbtn" onclick="search()"><input type="submit" value="票数排序" name="sortNum" id="sortNum" class="sortNum" onclick="sort()">
</div><div id="header" align="center"><!--<img src="static/img/companylog.png" title="yoka" alt="youka" border="1" width="211" height="78"/>--><div class="content" align="center">

后端通过判断是否到截止时间+该用户是否投过票,符合条件:进入将用户选择的书籍list循环插入数据库,可能有点笨的,如果有更好的思路,请私我,请遵循女士优先的原则。
//接受前端传参,并进行处理

 @RequestMapping(value = "/data",method = RequestMethod.GET)@ResponseBodypublic String handleData(@RequestParam(value = "check_val[]") String[] params,@RequestParam(value = "phone") String phone){//判断时间是否过期boolean is_time = isEndTime();//判断当天是否投过票
//        VoteDay voteDay = new VoteDay();boolean is_flag1 = voteDay.isVoted(phone);if (is_time){if (is_flag1){System.out.println("没有到截止时间");System.out.println("前端页面传过来的手机号:"+ phone);//设置日期格式SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");// new Date()为获取当前系统时间String time = df.format(new Date());UserRecorde userRecorde = new UserRecorde();userRecorde.setPhone(phone);userRecorde.setVotetime(time);recordResipository.save(userRecorde);for (String book : params){System.out.println("for循环获得每一本书:"+book);userResipository.updateBookNum(book);System.out.println("update成功");}System.out.println("即将进入return");return "投票成功";}else {return "您已经投过票啦";}}else {return "已过截止时间";}}

下面附出投票页面的效果图:

四、图形展示

在用户刚完成投票,或者判断用户已经投过票,页面会跳转到书籍得票统计页面,目前采用的是Echarts:支持常规的折线图、柱状图、散点图、饼图、K线图。

// y轴配置
yAxis: {},
legend: {data: ['票数']
},
series: [{// 数据集data: [[${dataList}]],// 图表类型,这里使用bar,柱状图type: 'bar',name:'票数',
}]

type:‘bar’—柱状图 type:‘pie’—饼图 type:‘category’—饼图 type: ‘map’—全图地图…
后端从数据库获取书籍的信息存入到一个List,传递给前端,前端接收后展示(支持左右滑动):

五、邮件通知

邮件发送很多同学都接触过,我们使用的是qq,所以需要先开启qq的SMTP服务,然后生成授权码,这里是获取数据库中用户的邮箱信息,定期发送邮件,目前是每隔一天发送一次, @Scheduled(cron = “0 0 0 0/1 * *”),大家有时间可以了解下cron的规则,@EnableScheduling:这个注解用来开启定时任务。

@Slf4j
@Component
@EnableScheduling
public class SendEmailJob {@Resourceprivate MailService mailService;@Scheduled(cron = "0 0 0 0/1 * *")public void sendEmail(){String to = "2421712196@qq.com";String subject = "hello, 这是投票统计邮件";String content = "详情请见地址:http://localhost:8080/resultChartLine";mailService.sendSimpleMail(to, subject, content);

六、 连接数据库

通过采用JPA连接数据库,JPA是用于对象持久化的 API,主要是为了简化现有的持久化开发工作和整合ORM技术,提供封装好的查询数据库的方法,可以直接调用,另外也支持我们自定义sql语句进行查询:

public interface UserResipository extends JpaRepository<UserInfo,String> {//    @Query(value = "select * from voter_test vt where vt.phone=?1",nativeQuery = true)@Modifying@Transactional@Query(value = "update vote_book set num = num + 1 where book =?1",nativeQuery = true)void updateBookNum(String book);//查询数据库有无此用户@Query(value = "select * from voter_test where phone = ?1 and ?2",nativeQuery = true)List<UserInfo> selectUser(String phone,String password);@Query(value = "select * from voter_test ",nativeQuery = true)

编写持久化类:

@Entity//告诉JPA这是一个实体类
@Table(name="voter_test")
public class UserInfo {@Id//这是一个主键@GeneratedValue(strategy = GenerationType.AUTO)//自增主键private int id;@Column(name = "phone")private String phone;@Columnprivate String passwd;@Columnprivate String email;public String getTime() {return time;}public void setTime(String time) {this.time = time;}@Columnprivate String time;

我们按照JPA的规范开发持久层代码,而不用关心究竟是哪种框架实现的,极大地提高我们工作的效率,减少不必要的操作时间。

七、踩坑

1、新建springboot项目没有生效—一直提示:failed for ‘https://start.spring.io’ Please check URL, network and proxy settings.

解决方法:Choose Initializr Service URL选择Custom,输入:http://start.springboot.io/,然后Next

2、新建springboot创建项目后,Controller跳转不到对应的页面,配置后代码都是正确的
原因:pom.xml中的thymeleaf.version不对

需要改成3.0.11,然后在Maven里面进行更新

3、页面找不到jquery.js文件,页面直接打开是ok的,但是通过后端转发后打开页面,会报错:

解决方案:不采取读文件的文法,通过网页去加载,不推荐,因为弱网时会有影响

4、建立2个实体类,需要建立两个对应的RecordResipositor

5、springboot中,一个类调用另一个类中的方法,不通过过new,需要通过注入的方式

6、将项目push到github上,提示:Push rejected: Push to origin/master was rejected

解决方法:找到项目对应的目录:打开git bash,敲以下下三行命令

。。。。。。多踩坑,多百度,多总结。。。。。。

八、 总结

这篇文章简述了投票功能的大致思路,还有一些没有提到,比如:pom.xml,如果大家想看完整版的代码,可以访问:https://github.com/limeng000111/yoka-java。
其实先前选择的构架是tomcat+servlet+jsp,弄了一个月,发现很繁琐,很绕,不得其解,然后开始网上调研,决心推到重来,采取现在的构架,简洁,快速,很多现有的工具类,封装好的方法。感悟:方向比过程更重要,希望大家引以为戒。

Springboot+Thymeleaf实现投票功能相关推荐

  1. springboot+thymeleaf模糊查询功能和分页实现以及input前端回显(前台到后台)

    先放图 实体类 import lombok.Data;@Data public class Word {private Integer wordId;private String wordName;p ...

  2. 自己动手在Spring-Boot上加强国际化功能

    前言 公司将项目由Struts2转到Springmvc了,由于公司业务是境外服务,所以对国际化功能需求很高.Struts2自带的国际化功能相对Springmvc来说更加完善,不过spring很大的特性 ...

  3. 基于springboot+thymeleaf+mybatis的员工管理系统 —— 增删改查

    员工管理系统 - 增删改查 entity 查询所有功能 查询所有的页面 emplist.html 保存员工 保存员工的页面 addEmp.html 删除员工 修改员工 根据id查询员工 修改员工信息 ...

  4. 基于springboot+thymeleaf+mybatis的员工管理系统 —— 登录与注册

    员工管理系统 - 登录与注册功能 创建项目 pom.xml 数据库表设计和环境准备 建表SQL application.properties 用户注册与登录功能 entity dao service ...

  5. springBoot+thymeleaf框架实现cms内容管理和商城系统

    springBoot+thymeleaf框架实现cms内容管理和商城系统 概要介绍 基于开源框架springBoot2.3+thymeleaf+springSecurity+lucene8.5.2 是 ...

  6. springboot+thymeleaf+bootstrap+mybatis-Plus+mysql 情侣空间网站源代码

    前言 最近刷短视频,因为那个程序员电视剧中表白爱心很火,短视频很多表白程序.看了之后很感兴趣,想着自己做一个情侣空间网站,于是就花了两个星期写了一个.因为前端使用bootstrap可以兼容手机端.话不 ...

  7. 基于javaweb的蓝天幼儿园管理系统(java+springboot+thymeleaf+html+mysql)

    基于javaweb的蓝天幼儿园管理系统(java+springboot+thymeleaf+html+mysql) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse/idea/my ...

  8. Java项目:在线电子商城管理系统(java+SpringBoot+Thymeleaf+bootstrap+jQ+layui+maven+mysql)

    源码获取:博客首页 "资源" 里下载! 项目介绍 本项目分为管理员与普通用户两种角色, 管理员角色包含以下功能: 发货,后台登录后首页,商品管理,商城类别增删改查,用户管理,管理员 ...

  9. SpringBoot + Thymeleaf + Bootstrap + 随手记 实现自动记账

    SpringBoot + Thymeleaf + Bootstrap + 随手记 实现自动记账 一 前情提要 思路 实现 项目大体分以下7个部分 1.搭建后台框架 2.数据库表设计 3.引入JavaM ...

最新文章

  1. 0x55. 动态规划 - 环形与后效性处理(例题详解 × 6)
  2. R Learnilng 十八讲1-6
  3. gan semi conductor
  4. V8 Promise源码全面解读
  5. Scala入门到精通——第五节 函数、高阶函数与闭包
  6. 时序约束基础 和 quartusII 中的设置
  7. POJ 1258 Agri-Net (最小生成树)
  8. Office Web Apps安装部署(一)
  9. RecyclerView(六)设置下拉刷新
  10. Android系统(45)--Monkey 测试相关知识
  11. Javascript 中的变量作用域问题
  12. 命令行登录防止MySQL密码泄露的几个小妙招。
  13. 一个oracle并发性问题的分析和解决
  14. 中考计算机excel考点,信息技术中考excel操作题部分操作要求及操作要点指导
  15. 浅谈GOF设计模式之建造者模式(五)
  16. package.json文件^和~区别
  17. 和黄医药宣布获霸菱亚洲投资基金1亿美元股权投资
  18. IDL---批量波段合成(只要点击运行,自动化处理,解放生产力)
  19. 如何使用html、css制作一个期末作业网站【羽毛球体育运动主题html网页设计】
  20. 调教ChatGPT提取公众号封面

热门文章

  1. 广州的11个辖区_广州有多少个区
  2. 将prezi试用期无限延长的办法
  3. CTL文件格式及生成字段
  4. VC 生成时将指定文件一并拷贝到输出文件夹
  5. Camtasia Studio2022电脑屏幕录制工具详细功能介绍
  6. 语言c1和c2,工程绘图c2(机械制图中C1表示什么?它和C2的区别是什么?)
  7. 技术系统进化法则是_6技术系统进化法则教程讲解.ppt
  8. TeamViewer Host无人值守远程控制手机,无需root。
  9. Winform嵌入Web网页-CefSharp组件
  10. 使用Qt写一个简单的五子棋单机小游戏