最近项目需要做一个会议日程安排的功能,通过日历控件查询日程安排。找到了dhtmlxScheduler这个控件,java下的官方网站http://javaplanner.com/docs/index.html ,最终效果是这样的:

由于网上关于这个控件的中文资料比较少,分享自己经验供同样需求的人使用。

项目框架是spring MVC + hibernate,使用此控件方法如下:

首先是准备工作,下载并导入各种相关的包:dhtmlxScheduler library files (控件的js/css文件);

javaplanner.jar file (you can download it here).

然后,处理需要在控件中显示的日程,分为两部分:建立表结构和定义对应实体类。日程bean(即上图表示Event的类,在我的项目中是会议Meeting类)继承DHXEvent类,日程类会继承DHXEvent类中的四个变量,分别是id,start_date,end_date,text,id为整型。

Meeting.java

import java.util.Date;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.PrePersist;

import javax.persistence.PreUpdate;

import javax.persistence.Table;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;

import javax.validation.constraints.NotNull;

import org.apache.commons.lang3.StringUtils;

import org.hibernate.annotations.Cache;

import org.hibernate.annotations.CacheConcurrencyStrategy;

import org.hibernate.annotations.DynamicInsert;

import org.hibernate.annotations.DynamicUpdate;

import org.hibernate.annotations.GenericGenerator;

import org.hibernate.annotations.NotFound;

import org.hibernate.annotations.NotFoundAction;

import org.hibernate.search.annotations.Analyze;

import org.hibernate.search.annotations.DateBridge;

import org.hibernate.search.annotations.Field;

import org.hibernate.search.annotations.Index;

import org.hibernate.search.annotations.Resolution;

import org.hibernate.search.annotations.Store;

import org.hibernate.validator.constraints.Length;

import com.dhtmlx.planner.DHXEvent;

import com.fasterxml.jackson.annotation.JsonFormat;

import com.fasterxml.jackson.annotation.JsonIgnore;

import com.thinkgem.jeesite.common.persistence.DataEntity;

import com.thinkgem.jeesite.modules.sys.entity.User;

import com.thinkgem.jeesite.modules.sys.utils.UserUtils;

/**

* @author MuQiong

* Class Description

* 会议实体

*/

@Entity

@Table(name = "oa_meeting")

@DynamicInsert @DynamicUpdate

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

public class Meeting extends DHXEvent {

private static final long serialVersionUID = 1L;

private User user;//创建用户

private Room room;//会议房间

//private String text;//会议主题

private String description;//会议描述

private String status;//处理状态

private String location;//和平里or二基地

private String opinion;//审批意见

private int attendance;//参会人数

private User createBy;// 创建者

private Date createDate;// 创建日期

private User updateBy;// 更新者

private Date updateDate;// 更新日期

private String delFlag; // 删除标记(0:正常;1:删除;2:审核)

public Meeting(){

super();

this.delFlag = DataEntity.DEL_FLAG_NORMAL;

}

public Meeting(int id){

this();

this.id = id;

this.delFlag = DataEntity.DEL_FLAG_NORMAL;

}

public Meeting(int id, User user, Room room){

this(id);

this.user = user;

this.room = room;

this.delFlag = DataEntity.DEL_FLAG_NORMAL;

}

@PrePersist

public void prePersist(){

User user = UserUtils.getUser();

if (StringUtils.isNotBlank(user.getId())){

this.updateBy = user;

this.createBy = user;

}

this.updateDate = new Date();

this.createDate = this.updateDate;

}

@PreUpdate

public void preUpdate(){

User user = UserUtils.getUser();

if (StringUtils.isNotBlank(user.getId())){

this.updateBy = user;

}

this.updateDate = new Date();

}

public void setId(int id){

this.id = id;

}

@Id

@GenericGenerator(name = "idGenerator", strategy = "increment")

@GeneratedValue(generator = "idGenerator")

public Integer getId(){

return id;

}

public void setUser(User user){

this.user = user;

}

@ManyToOne

@JoinColumn(name="user_id")

@NotFound(action = NotFoundAction.IGNORE)

@NotNull

public User getUser(){

return user;

}

public void setRoom(Room room){

this.room = room;

}

@ManyToOne

@JoinColumn(name="room_id")

@NotFound(action = NotFoundAction.IGNORE)

@NotNull

public Room getRoom(){

return room;

}

public void setStartDate(Date startDate){

this.start_date = startDate;

}

@Temporal(TemporalType.TIMESTAMP)

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

public Date getStartDate(){

return start_date;

}

public void setEndDate(Date endDate){

this.end_date = endDate;

}

@Temporal(TemporalType.TIMESTAMP)

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

public Date getEndDate(){

return end_date;

}

public void setTitle(String title){

this.text = title;

}

@Column(name = "text")

public String getTitle(){

return text;

}

public void setDescription(String description){

this.description = description;

}

public String getDescription(){

return description;

}

public void setStatus(String status){

this.status = status;

}

public String getStatus(){

return status;

}

public void setLocation(String location){

this.location = location;

}

public String getLocation(){

return location;

}

public void setOpinion(String opinion){

this.opinion = opinion;

}

public String getOpinion(){

return opinion;

}

public void setAttendance(int attendance){

this.attendance = attendance;

}

public int getAttendance(){

return this.attendance;

}

@JsonIgnore

@ManyToOne(fetch=FetchType.LAZY)

@NotFound(action = NotFoundAction.IGNORE)

public User getCreateBy() {

return createBy;

}

public void setCreateBy(User createBy) {

this.createBy = createBy;

}

@Temporal(TemporalType.TIMESTAMP)

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

public Date getCreateDate() {

return createDate;

}

public void setCreateDate(Date createDate) {

this.createDate = createDate;

}

@JsonIgnore

@ManyToOne(fetch=FetchType.LAZY)

@NotFound(action = NotFoundAction.IGNORE)

public User getUpdateBy() {

return updateBy;

}

public void setUpdateBy(User updateBy) {

this.updateBy = updateBy;

}

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

@Field(index=Index.YES, analyze=Analyze.NO, store=Store.YES)

@DateBridge(resolution = Resolution.DAY)

public Date getUpdateDate() {

return updateDate;

}

public void setUpdateDate(Date updateDate) {

this.updateDate = updateDate;

}

@Length(min=1, max=1)

@Field(index=Index.YES, analyze=Analyze.NO, store=Store.YES)

public String getDelFlag() {

return delFlag;

}

public void setDelFlag(String delFlag) {

this.delFlag = delFlag;

}

}

数据库用的mySQL:CREATE TABLE oa_meeting

(

id int(64) NOT NULL COMMENT '编号',

user_id varchar(64) NOT NULL COMMENT '创建用户编号',

room_id varchar(64) NOT NULL COMMENT '会议房间编号',

start_date datetime COMMENT '开始时间',

end_date datetime COMMENT '结束时间',

text varchar(64) COMMENT '会议主题',

description varchar(64) COMMENT '会议描述',

status varchar(64) COMMENT '处理状态',

location varchar(64) COMMENT '会议室区域',

opinion varchar(64) COMMENT '审批意见',

attendance int(32) COMMENT '参会人数',

create_by varchar(64) COMMENT '创建者',

create_date datetime COMMENT '创建时间',

update_by varchar(64) COMMENT '更新者',

update_date datetime COMMENT '更新时间',

del_flag char(1) DEFAULT '0' NOT NULL COMMENT '删除标记',

PRIMARY KEY (id)

) COMMENT = '会议室预订表';

下一步,利用hibernate连接数据库,hibernate配置文件和hibernateUtils类如下:hibernate.cfg.xml

hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

false

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/jeesite

root

root

1

org.hibernate.dialect.MySQLDialect

thread

org.hibernate.cache.NoCacheProvider

true

true

true

org.hibernate.connection.C3P0ConnectionProvider

20

5

Test

100

120

1

true

18000

25000

……

……

HibernateUtil.java

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

import org.hibernate.cfg.ImprovedNamingStrategy;

import org.hibernate.service.ServiceRegistry;

import org.hibernate.service.ServiceRegistryBuilder;

/**

* @author MuQiong

* @version 2014-9-4 上午11:26:52

* hibernate 工具类 for日历查询

*/

public class HibernateUtil {

private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {

try {

Configuration cfg = new Configuration().setNamingStrategy(

ImprovedNamingStrategy.INSTANCE).configure();

ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()

.applySettings(cfg.getProperties()).buildServiceRegistry();

return cfg.buildSessionFactory(serviceRegistry);

} catch (Throwable e) {

throw new ExceptionInInitializerError(e);

}

}

private HibernateUtil() {

}

public static SessionFactory getSessionFactory() {

return sessionFactory;

}

}

下一步,写一个service类继承DHXEventsManager类,该类负责利用HibernateUtil实现对实体的CRUD功能,这里暂时只完成了读取数据即getEvents方法。MeetingEventsManager.java

/**

* @author MuQiong

* 日历查询会议室预定情况service

*/

@Service

@Transactional(readOnly = true)

public class MeetingEventsManager extends DHXEventsManager {

public MeetingEventsManager(HttpServletRequest request) {

super(request);

}

@Override

public Iterable getEvents() {

Session session = HibernateUtil.getSessionFactory().openSession();

List evs = new ArrayList();

try {

//session.clear();

Criteria criteria = session.createCriteria(Meeting.class);

evs = criteria/*.setCacheMode(CacheMode.IGNORE)*/.list();

// System.out.println(evs.size());

} catch (RuntimeException e) {

e.printStackTrace();

} finally {

session.flush();

session.close();

}

return evs;

}

@Override

@Transactional(readOnly = false)

public DHXStatus saveEvent(DHXEv event, DHXStatus status) {

Session session = HibernateUtil.getSessionFactory().openSession();

try {

session = HibernateUtil.getSessionFactory().openSession();

session.beginTransaction();

if (status == DHXStatus.UPDATE)

session.update(event);

else if (status == DHXStatus.DELETE)

session.delete(event);

else if (status == DHXStatus.INSERT)

session.save(event);

session.getTransaction().commit();

} catch (RuntimeException e) {

e.printStackTrace();

} finally {

session.flush();

session.close();

}

return status;

}

@Override

@Transactional(readOnly = false)

public DHXEv createEvent(String id, DHXStatus status) {

return new DHXEvent();

}

}

后台的最后一步也是关键一步,spring的controller类,许多关于控件界面的设置都是在这里完成的,比如说,你可以这样s.calendars.attachMiniCalendar();添加选择日期控件,更多设置请参见http://javaplanner.com/docs/index.html :QueryController.java

/**

* @author MuQiong

* 日历查询controller

*/

@Controller

@RequestMapping(value = "${adminPath}/oa/query")

public class QueryController {

/*

* @Autowired private CustomEventsManager customEventsManager;

*/

@RequestMapping(value = {"list", "/"})

public ModelAndView scheduler(HttpServletRequest request) throws Exception {

DHXPlanner s = new DHXPlanner("/jeesite/static/dhtmlxScheduler/",

DHXSkin.TERRACE);

s.config.setScrollHour(8);

s.setWidth(900);

s.config.setTimeStep(60);

s.config.setFirstHour(8);

s.config.setLastHour(19);

s.config.setLimitTimeSelect(true);

// clear default lightbox fields

s.lightbox.clear();

// contact details field

DHXLightboxText title = new DHXLightboxText("text", "会议主题");

title.setFocus(true);

title.setHeight(40);

s.lightbox.add(title);

// time field

DHXLightboxTime time = new DHXLightboxTime("time", "时长");

s.lightbox.add(time);

s.load("meetings", DHXDataFormat.JSON);

s.data.dataprocessor.setURL("meetings");

ModelAndView mnv = new ModelAndView("modules/oa/queryList");

mnv.addObject("body", s.render());

return mnv;

}

@RequestMapping("/meetings")

@ResponseBody public String meetings(HttpServletRequest request) {

MeetingEventsManager evs = new MeetingEventsManager(request);

return evs.run();

}

}

最后就是前端页面jsp文件了queryList.jsp

${body}

以上就完成简单的基本功能了。

如果有什么问题,希望指出。

java 日程日历_dhtmlxscheduler日历日程控件使用相关推荐

  1. 提供完善的类似于Outlook 2003 Calendar的风格日历日程控件Xtreme Calendar

    Xtreme Calendar控件能为 Windows软件开发者提供完善的类似于Outlook 2003 Calendar的风格.Windows开发者能方便的创建可管理指定任务的日程表,对这些任务可按 ...

  2. 【开源】Winform甘特日程控件GanttPlanner V1.0发布

    背景 做过WinForm和Web的朋友们可能都有这个感觉:做用户体验良好的WinForm应用程序要远比Web应用程序困难的多.这是因为Web应用程序毕竟只靠HTML+CSS+JS就能做出各种强大的功能 ...

  3. vue-lunar-full-calendar日程控件加农历、24节气和中国节假日的功能

    依赖包 vue-lunar-full-calendar npm install vue-lunar-full-calendar 即可 例子在 github.com/a306916069/- 上 转载于 ...

  4. 农历 Android Java 节气_Android自定义日历,可以点击、标注日期、节气、旧历等

    /****************从此出开始将代码拷贝到一个文件中*******************/package cc.util.android.view; import java.text. ...

  5. 如何用Java制作一个简易日历

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

  6. 日历记事本java代码_急需日历记事本JAVA源代码

    展开全部 import java.util.Calendar; import javax.swing.*; import java.awt.*; import java.awt.event.*; im ...

  7. Java实训——桌面日历

    java实现<桌面日历>源码,答辩ppt,实习计划书,实习报告下载链接 https://download.csdn.net/download/weixin_43042683/8694956 ...

  8. 怎么用java做日历_如何用Java制作一个简易日历

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

  9. 利用Java Calendar类打印日历

    利用Java Calendar类打印日历 说到日历,我们接触的就多了,每天都在和日历打交道,每年家里都会买日历.那么,大家知道如何用Java打印日历呢?在这里,我说一下如何用Calendar类打印日历 ...

最新文章

  1. 重学 html の meta 标签
  2. 3-1 Apache Shiro权限管理框架介绍
  3. rust tpa_Rust(腐蚀)怎么tp求大神指教。请写在下面
  4. body div js 放大图片_jquery图片放大插件鼠标悬停图片放大效果
  5. 使用loadrunner编写webservice接口请求
  6. W3School 教程整理
  7. jdbc 通过反射和元数据编写通用的查询对象方法
  8. PHP 实现文件上传 php配置
  9. win10 html字体设置,IT之家学院:如何解决Win10屏幕字体缩放模糊问题
  10. Linux常用软件包
  11. JavaScript——反转链表
  12. win10系统安装loadrunner11提示“为了对电脑进行保护,已经阻止此应用”的解决方案
  13. build constraints exclude all Go file GOland 导入“github.com/gin-gonic/gin“ 报红,
  14. redis报错:ERR value is not an integer or out of range
  15. driver: linux下如何模拟按键输入和模拟鼠标
  16. ILI9341的使用之【五】命令一
  17. 啥牌子的蓝牙耳机音质好?2023公认音质最好的蓝牙耳机
  18. Time时间格式化当前时间
  19. 微信支付官方揭开刷脸支付神秘面纱
  20. Navicat-数据库的连接以及使用

热门文章

  1. oracle数据库通过域名链接
  2. 返程高峰正在来临,百度上线新型肺炎患者同行者查询服务
  3. 前端开发中常见的浏览器兼容性问题及解决方案
  4. 浏览器兼容性版本问题与解决方案
  5. PostgreSQL数据库WAL——备机回放checkpoint WAL
  6. CST 2022时间如何格式化
  7. 数据推荐 | 手势识别训练数据集
  8. 24核48线虚拟化服务器,24核48线程的威力:戴尔PowerEdge R910服务器评测
  9. java进阶开发-----Set集合、Map集合(接java集合)
  10. 使用this调用已有的有参构造函数_加倍提升开发效率,继续深挖一下Lombok的使用