基于Spring,MyBatis,SpringBoot,Thymeleaf,Ajax技术实现活动模块的查询,添加等操作。
1. MySQL(5.7) 2. JDK (1.8) 3. Maven (3.6.3) 4. STS(4.7.1)
打开mysql控制台,然后按如下步骤执行goods.sql文件。
第一步:登录mysql。
mysql –uroot –proot
第二步:设置控制台编码方式。
set names utf8;
第三步:执行activity.sql文件(切记不要打开文件复制到mysql客户端运行)。
source d:/activity.sql
其中activity.sql文件内容如下:
drop database if exists dbactivity; create database dbactivity default character set utf8; use dbactivity; create table tb_activity( id bigint primary key auto_increment, title varchar(100) not null, category varchar(100) not null, startTime datetime not null, endTime datetime not null, remark text, state tinyint, createdTime datetime not null, createdUser varchar(100) )engine=InnoDB; insert into tb_activity values (null,'ABS','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli'); insert into tb_activity values (null,'VALIDATE','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli'); insert into tb_activity values (null,'VALIDATE','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli'); insert into tb_activity values (null,'ABS','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli'); insert into tb_activity values (null,'ACCESS','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli');
第一步:基于start.spring.io 创建项目并设置基本信息。
第二步:创建项目时指定项目核心依赖。
第三步:项目创建以后分析其结构。
#server server.port=80 #server.servlet.context-path=/ #spring datasource spring.datasource.url=jdbc:mysql:///dbactivity?serverTimezone=GMT%2B8&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root #spring mybatis mybatis.mapper-locations=classpath:/mapper/*/*.xml #spring logging logging.level.com.cy=debug #spring thymeleaf spring.thymeleaf.prefix=classpath:/templates/modules/ spring.thymeleaf.suffix=.html spring.thymeleaf.cache=false
其API架构设计,如图所示:
从数据库查询所有活动(Activity)信息,然后呈现在页面上(基于JS方式进行呈现)
在浏览器地址栏输入查询活动信息的url获取活动信息,其时序过程如图所示:
定义活动模块数据层接口及查询方法,代码如下:
package com.cy.pj.activity.dao; import com.cy.pj.activity.pojo.Activity; @Mapper public interface ActivityDao { @Select("select * from tb_activity order by createdTime desc") List<Activity> findActivitys(); }
定义service接口以及获取活动信息的方法,代码如下:
package com.cy.pj.activity.service; import java.util.List; import com.cy.pj.activity.pojo.Activity; //引入包中的类:ctrl+shift+o public interface ActivityService { List<Activity> findActivitys(); }
定义service接口实现类,并重写接口方法,代码如下:
package com.cy.pj.activity.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.cy.pj.activity.dao.ActivityDao; import com.cy.pj.activity.pojo.Activity; import com.cy.pj.activity.service.ActivityService; @Service public class ActivityServiceImpl implements ActivityService { @Autowired private ActivityDao activityDao; @Override public List<Activity> findActivitys() { return activityDao.findActivitys(); } }
package com.cy.pj.activity.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.cy.pj.activity.pojo.Activity; import com.cy.pj.activity.service.ActivityService; @Controller public class ActivityController { @Autowired private ActivityService activityService; /**查询所有活动信息*/ @RequestMapping("/activity/doFindActivitys") public String doFindActivitys(Model model) { List<Activity> list=activityService.findActivitys(); model.addAttribute("list", list); return "activity"; } }
本次页面样式基于bootstrap(一个前端框架,官网为bootcss.com)进行实现,首先在项目工程中添加静态资源,如图所示:
设计activity.html页面,引入bootstrap,jquery等相关资源,如图所示:
在activity.html页面中添加呈现Activity数据的html元素:
<table class="table"> <thead> <tr> <th>title</th> <th>Category</th> <th>StartTime</th> <th>EndTime</th> <th>State</th> <th>Operation</th> </tr> </thead> <tbody id="tbodyId"> <tr><td colspan="6">数据正在加载中.......</td></tr> </tbody> </table>
基于Ajax异步加载服务端活动数据并进行局部刷新
<script type="text/javascript"> function doFindActivitys(){ var url="/activity/doFindActivitys" //启动ajax技术,基于GET请求方式获取服务端json数据 //getJSON函数默认会将服务端返回的json串转换为js对象 $.getJSON(url,function(result){ var tBody=$("#tbodyId"); tBody.empty();//清空原有body内容 for(var i=0;i<result.length;i++){//循环一次,迭代一行 //构建当前行对象 var tr=`<tr> <td>${result[i].title}</td> <td>${result[i].category}</td> <td>${result[i].startTime}</td> <td>${result[i].endTime}</td> <td>${result[i].state==1?'有效':'无效'}</td> <td><button type='button' class='btn btn-danger btn-sm'>delete</button></td> </tr>` //将每一行的内容都追加tbody中 tBody.append(tr); } }); }; doFindActivitys(); </script>
在活动列表页面,设计添加按钮,点击添加按钮时弹出模态框,在模态框中呈现活动添加表单元素,其添加表单原型设计,
如图所示:
活动添加业务,其时序分析,如图所示:
在ActivityDao接口中添加持久化活动信息的方法,代码如下:
int insertObject(Activity activity);
在ActivityMapper映射文件中添加映射元素,代码如下:
<insert id="insertObject" parameterType="com.cy.pj.activity.pojo.Activity" useGeneratedKeys="true" keyProperty="id"> insert into tb_activity (title,category,startTime,endTime,remark,state,createdUser,createdTime) values (#{title},#{category},#{startTime},#{endTime}, #{remark},#{state},#{createdUser},now()) </insert>
相关属性的应用说明,如图所示:
当然,也可以以注解的方式进行SQL映射,如图所示:
当活动创建好以后,假如到了结束时间,动态更新活动的状态,代码如下:
@Update("update tb_activity set state=0 where id=#{id}") int updateState(Long id);
在ActivityService接口中,添加保存活动信息的方法,代码如下:
int saveActivity(Activity entity);
在ActivityServiceImpl实现类中添加,接口方法的实现,代码如下:
@Override public int saveActivity(Activity entity) { int rows=activityDao.insertObject(entity); Timer timer=new Timer(); //此对象可以负责去执行一些任务(这个对象内置一个线程和一个任务队列) //启动线程执行任务调度 timer.schedule(new TimerTask() {//TimerTask为任务 @Override public void run() { //一旦调用此任务的线程获得了CPU就会执行这个任务的run方法 activityDao.updateState(entity.getId()); timer.cancel();//退出任务调度(后续线程也会销毁) } }, entity.getEndTime());//按指定时间执行任务. return rows; }
在ActivityController中添加,处理添加请求的方法,代码如下:
@RequestMapping("/activity/doSaveActivity") public String doSaveActivity(Activity activity) { activityService.saveActivity(activity); return "redirect:/activity/doFindActivitys"; }
在activity.html页面中添加表单元素,用于实现与用户交互,首先在activity页面上添加一个添加按钮,代码如下:
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal">创建活动 </button>
在指定位置添加模态框(可参考bootcss.com),代码如下:
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> <h4 class="modal-title" id="myModalLabel">创建活动</h4> </div> <div class="modal-body"> </div> <div class="modal-footer"> <button type="button" class="btn btn-default"data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary" onclick="doSaveObject()"> Save Changes</button> </div> </div> </div> </div>
在模态框”modal-body”位置,添加form表单,代码如下:
<form class="form-horizontal" th:action="@{/activity/doSaveActivity}" method="post"> <div class="form-group"> <label for="titleId" class="col-sm-2 control-label">标题</label> <div class="col-sm-10"> <input type="text" class="form-control" name="title" id="titleId" placeholder="title"> </div> </div> <div class="form-group"> <label for="categoryId" class="col-sm-2 control-label">类型</label> <div class="col-sm-10"> <select id="categoryId" name="category" class="form-control"> <option value="教育培训">教育培训</option> <option value="企业活动">企业活动</option> <option value="交友活动">交友活动</option> </select> </div> </div> <div class="form-group" > <label for="startTimeId" class="col-sm-2 control-label">开始时间</label> <div class="col-sm-10"> <input type="text" class="form-control form_datetime" name="startTime" id="startTimeId" placeholder="start time"> </div> </div> <div class="form-group"> <label for="endTimeId" class="col-sm-2 control-label">结束时间</label> <div class="col-sm-10"> <input type="text" class="form-control form_datetime" name="endTime" id="endTimeId" placeholder="end time"> </div> </div> <div class="form-group"> <label for="remarkId" class="col-sm-2 control-label">备注</label> <div class="col-sm-10"> <textarea type="text" class="form-control" rows="5" name="remark" id="remarkId"> </textarea> </div> </div> </form>
添加JS代码,处理模态框Save按钮事件,代码如下:
<script type="text/javascript"> function doSaveObject(){ //表单校验(可考虑使用正则表达式) //提交表单 //$(form)基于标签名(例如这里的标签名form)称获取表单对象 //submit为jquery中的一个对象函数,通过此函数可以提交表单. $("form").submit();//提交表单 } </script>
启动tomcat ,访问活动列表页面,如图所示:
在活动列表页面,点击添加按钮,然后启动活动添加模块框,执行添加操作如图所示:
日历控件拓展实现(开始时间和结束时间通过选择实现),效果展示,如图所示:
Bootstrap-datapicker控件的实现过程,如图所示:
本模块中讲解了活动模块中类的设计,映射设计,交互设计以及实现,然后可以基于此模块的练习加强对业务和技术上的设计及是实现。