说明:

  因为项目(OA)的需要,我负责开发日程的模块,相信大家用过谷歌的日历了吧,是不是觉得挺好用,但又苦于无法实现?

  这里告诉你一个很好的插件,Wijmo,而里面有一个类似谷歌的日历事件插件,真的很好很强大,注意,我不是托。

  当时找到这个插件的时候,真心佩服那些牛逼的外国开发员,能做到这么厉害,并且还开源了。

  因为菜鸟,苦苦做了一个多星期才完成,个中原因能归结为:

1、没有中文的介绍和帮助,百度谷歌就是找不到很好的例子。

2、英文不行,看官网API很吃力,没有认真看官网的Demo。

3、不是很熟悉js。

技术要点:

1、基本的js、jQuery使用

2、正则表达式的使用(确实很好很强大)

3、wijmo 日历事件插件的基本使用

4、JSON的基本使用

废话不说,先上几张效果图,还在完善中,希望能帮到有需要的人。

我的Demo 图:

开始上代码,首先这个日历中的数据是要存到本地的,所以要创建数据库。

贴上数据库代码:代码是用SQL 2008的,里面的注释很清楚了,仅供参考。

  1. /*********************************************************
  2.  
  3. 说明:日历事件表:保存日历事件的信息
  4.  
  5. 作者:Frank
  6.  
  7. 2013-6-17 17:34:05
  8.  
  9. *********************************************************/
  10.  
  11. USE HFOA
  12. IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tsk_calendar_events]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
  13. DROP TABLE [dbo].[tsk_calendar_events]
  14. GO
  15.  
  16. CREATE TABLE [dbo].[tsk_calendar_events]
  17. (
  18. --除了id不是插件的关键字,所有的都是插件的关键字,都要注意转换,有些不用转,带c开头的都要转,不然插件会显示错误
  19. id int identity (1,1) NOT NULL, --日历事件编号
  20. allday VARCHAR(10) NULL, --是否为全天事件
  21. calendar VARCHAR(20) NULL, --该事件属于哪个日程的,有 My Work
  22. csubject VARCHAR(100) NULL, --事件主题,显示时必须转为 subject
  23. color VARCHAR(20) NULL, --该事件的重要程度,以颜色来区分
  24. cdescription varchar(250) NULL, --日程事件的描述,显示时必须转为 description
  25. cstart VARCHAR(50) NOT NULL, --开始时间,页面显示时必须转为 start 格式为 new Date(2013,5,17,6,0)
  26. cend VARCHAR(50) NOT NULL, --结束时间,注意,页面显示到页面的时候必须把字段名改为 end ,否则该日历插件会报错 格式为 new Date(2013,5,17,6,0)
  27. cid VARCHAR(50) NOT NULL, --日历插件的 id,页面显示时必须转为 id
  28. isNewEvent VARCHAR(10) NULL, --是否为新事件
  29. location VARCHAR(100) NULL, --事件地点
  30. recurrenceState VARCHAR(20) NULL, --当有重复事件的时候,该事件为主事件还是派生的 重复事件
  31. parentRecurrenceId VARCHAR(50) NULL, --重复事件的主事件 Id
  32.  
  33. ) ON [PRIMARY]
  34.  
  35. GO
  36.  
  37. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日历事件编号' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'id'
  38. GO
  39. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否为全天事件' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'allday'
  40. GO
  41. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'该事件属于哪个日程的,有 My 和 Work' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'calendar'
  42. GO
  43. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'事件主题,显示时必须转为 subject' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'csubject'
  44. GO
  45. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'该事件的重要程度,以颜色来区分' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'color'
  46. GO
  47. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日程事件的描述,显示时必须转为 description' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'cdescription'
  48. GO
  49. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'开始时间,页面显示时必须转为 start 格式为 new Date(2013,5,17,6,0)' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'cstart'
  50. GO
  51. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'结束时间,注意,页面显示到页面的时候必须把字段名改为 end ,否则该日历插件会报错 格式为 new Date(2013,5,17,6,0)' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'cend'
  52. GO
  53. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日历插件的 id,页面显示时必须转为 id ' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'cid'
  54. GO
  55. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否为新事件' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'isNewEvent'
  56. GO
  57. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'事件地点' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'location'
  58. GO
  59. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'当有重复事件的时候,该事件为主事件还是派生的 重复事件' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'recurrenceState'
  60. GO
  61. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'重复事件的主事件 Id' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_events', @level2type=N'COLUMN', @level2name=N'parentRecurrenceId'
  62. GO
  63.  
  64. /*********************************************************
  65.  
  66. 说明:日历事件重复表:保存日历事件重复的信息
  67.  
  68. 作者:Frank
  69.  
  70. 2013-6-17 17:34:05
  71.  
  72. *********************************************************/
  73.  
  74. USE HFOA
  75. IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tsk_calendar_recu]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
  76. DROP TABLE [dbo].[tsk_calendar_recu]
  77. GO
  78.  
  79. CREATE TABLE [dbo].[tsk_calendar_recu]
  80. (
  81. id int identity (1,1) NOT NULL, --重复事件的id
  82. startTime VARCHAR(50) NULL, --开始时间 格式为 Date(2013,5,17,6,0)
  83. endTime VARCHAR(50) NULL, --结束时间 格式为 Date(2013,5,17,6,0)
  84. parentRecurrenceId VARCHAR(50) NULL, --重复事件的主事件 Id
  85. recurrenceType VARCHAR(20) NULL, --事件重复的类型,有每天、每周等
  86. patternStartDate VARCHAR(50) NULL, --主事件的开始时间 格式为 new Date(2013,5,17,6,0)
  87. event_id int NOT NULL, --日历主表主键 Id
  88.  
  89. ) ON [PRIMARY]
  90.  
  91. GO
  92. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'重复事件的id' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_recu', @level2type=N'COLUMN', @level2name=N'id'
  93. GO
  94. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'开始时间 格式为 Wed Jun 19 2013 20:30:00' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_recu', @level2type=N'COLUMN', @level2name=N'startTime'
  95. GO
  96. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'结束时间 格式为 Wed Jun 19 2013 20:30:00' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_recu', @level2type=N'COLUMN', @level2name=N'endTime'
  97. GO
  98. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'重复事件的主事件 Id' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_recu', @level2type=N'COLUMN', @level2name=N'parentRecurrenceId'
  99. GO
  100. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'事件重复的类型,有每天、每周等' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_recu', @level2type=N'COLUMN', @level2name=N'recurrenceType'
  101. GO
  102. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主事件的开始时间 格式为 Wed Jun 19 2013 20:30:00' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_recu', @level2type=N'COLUMN', @level2name=N'patternStartDate'
  103. GO
  104. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日历主表主键 Id' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tsk_calendar_recu', @level2type=N'COLUMN', @level2name=N'event_id'
  105. GO

  好了,最重要的数据库咱们已经设计好了,现在就来执行代码实施吧!

注意,涉及到2个表,一个是日历主事件表,一个是用来记录重复事件的表。

代码实施:

页面有2个:

1. tsk_EventsCalendar.aspx

2. tsk_EventsCalendar.aspx.cs

没错,就是用C#来写的,哈哈,被你发现了!不过原理都差不多的,我之前搞SSH,无奈公司不用Java开发,只好学学 ASP.NET 了。

1. tsk_EventsCalendar.aspx

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="tsk_EventsCalendar.aspx.cs"
  2. Inherits="Web.General.tsk.tsk_EventsCalendar" %>
  3.  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head runat="server">
  7. <title>日历控件</title>
  8. <!-- Theme -->
  9. <link href="../../js/Wijmo/Theme/cobalt/jquery-wijmo.css" rel="stylesheet" type="text/css" />
  10. <style type="text/css">
  11. #eventscalendar
  12. {
  13. width: 750px;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <form id="form1" runat="server">
  19. <span id="strjson">
  20. <%=GetStringJSON()%>
  21. <!-- style="display: none;" -->
  22. </span>
  23. <div id="eventscalendar">
  24. </div>
  25. </form>
  26. </body>
  27. </html>
  28. <!-- External dependencies -->
  29. <script src="../../js/Wijmo/External/jquery-1.9.1.min.js" type="text/javascript"></script>
  30. <script src="../../js/Wijmo/External/jquery-ui-1.10.1.custom.min.js" type="text/javascript"></script>
  31. <script src="../../js/Wijmo/External/globalize.min.js" type="text/javascript"></script>
  32. <!--这个加载太大了,看看不要行不行
  33. <script src="Wijmo/External/globalize.cultures.js" type="text/javascript"></script>-->
  34. <script src="../../js/Wijmo/External/jquery.mousewheel.min.js" type="text/javascript"></script>
  35. <!-- Enable built-in datastorage -->
  36. <script src="../../js/Wijmo/datastorage/amplify.core.min.js" type="text/javascript"></script>
  37. <script src="../../js/Wijmo/datastorage/amplify.request.min.js" type="text/javascript"></script>
  38. <script src="../../js/Wijmo/datastorage/amplify.store.min.js" type="text/javascript"></script>
  39. <!-- Wijmo-Open dependencies -->
  40. <script src="../../js/Wijmo/Open/jquery.wijmo.wijutil.min.js" type="text/javascript"></script>
  41. <link href="../../js/Wijmo/Open/jquery.wijmo.wijutil.css" rel="stylesheet" type="text/css" />
  42. <script src="../../js/Wijmo/Open/jquery.wijmo.widget.min.js" type="text/javascript"></script>
  43. <script src="../../js/Wijmo/Open/jquery.wijmo.wijtouchutil.min.js" type="text/javascript"></script>
  44. <script src="../../js/Wijmo/Open/jquery.wijmo.wijcalendar.min.js" type="text/javascript"></script>
  45. <link href="../../js/Wijmo/Open/jquery.wijmo.wijcalendar.css" rel="stylesheet" type="text/css" />
  46. <script src="../../js/Wijmo/Open/jquery.wijmo.wijdropdown.min.js" type="text/javascript"></script>
  47. <link href="../../js/Wijmo/Open/jquery.wijmo.wijdropdown.css" rel="stylesheet" type="text/css" />
  48. <script src="../../js/Wijmo/Open/jquery.wijmo.wijdialog.min.js" type="text/javascript"></script>
  49. <link href="../../js/Wijmo/Open/jquery.wijmo.wijdialog.css" rel="stylesheet" type="text/css" />
  50. <script src="../../js/Wijmo/Open/jquery.wijmo.wijtextbox.min.js" type="text/javascript"></script>
  51. <link href="../../js/Wijmo/Open/jquery.wijmo.wijtextbox.css" rel="stylesheet" type="text/css" />
  52. <script src="../../js/Wijmo/Open/jquery.wijmo.wijcheckbox.min.js" type="text/javascript"></script>
  53. <link href="../../js/Wijmo/Open/jquery.wijmo.wijcheckbox.css" rel="stylesheet" type="text/css" />
  54. <script src="../../js/Wijmo/Open/jquery.wijmo.wijpopup.min.js" type="text/javascript"></script>
  55. <script src="../../js/Wijmo/Open/jquery.wijmo.wijsuperpanel.min.js" type="text/javascript"></script>
  56. <link href="../../js/Wijmo/Open/jquery.wijmo.wijsuperpanel.css" rel="stylesheet"
  57. type="text/css" />
  58. <!-- Wijmo-Pro dependencies -->
  59. <script src="../../js/Wijmo/Pro/jquery.plugin.wijtextselection.min.js" type="text/javascript"></script>
  60. <script src="../../js/Wijmo/Pro/jquery.wijmo.wijinputcore.min.js" type="text/javascript"></script>
  61. <link href="../../js/Wijmo/Pro/jquery.wijmo.wijinput.css" rel="stylesheet" type="text/css" />
  62. <script src="../../js/Wijmo/Pro/jquery.wijmo.wijinputdate.min.js" type="text/javascript"></script>
  63. <script src="../../js/Wijmo/Pro/jquery.wijmo.wijdatepager.min.js" type="text/javascript"></script>
  64. <link href="../../js/Wijmo/Pro/jquery.wijmo.wijdatepager.css" rel="stylesheet" type="text/css" />
  65. <script src="../../js/Wijmo/Pro/jquery.wijmo.wijevcal.min.js" type="text/javascript"></script>
  66. <link href="../../js/Wijmo/Pro/jquery.wijmo.wijevcal.css" rel="stylesheet" type="text/css" />
  67. <script src="../../js/Wijmo/json.js" type="text/javascript"></script>
  68. <script type="text/javascript">
  69. $(document).ready(function () {
  70.  
  71. var b = eval($("#strjson").text());
  72.  
  73. //获取日历插件里的属性
  74. function getData2(obj) {
  75. //取得日历的开始和结束的时间变量传到后台,添加操作
  76. var stime = "new Date(" + obj.start.getFullYear() + "," + obj.start.getMonth() + "," + obj.start.getDate() + "," + obj.start.getHours() + "," + obj.start.getMinutes() + ")";
  77. var etime = "new Date(" + obj.end.getFullYear() + "," + obj.end.getMonth() + "," + obj.end.getDate() + "," + obj.end.getHours() + "," + obj.end.getMinutes() + ")";
  78. //没有重复事件时的属性值
  79. var strGet1 = "&strId=" + obj.id + "&strDes=" + obj.description + "&strEnd=" + etime + "&strLocation=" + obj.location + "&strStart=" + stime + "&strSubject=" + obj.subject + "&strColor=" + obj.color + "&strAllday=" + obj.allday + "&strCalendar=" + obj.calendar + "&strisNewEvent=" + obj.isNewEvent;
  80.  
  81. if (obj.recurrencePattern != null) {
  82. alert(obj.recurrencePattern.endTime + "结束");
  83. var strGet2 = "&strrecurrenceState=" + obj.recurrenceState + "&strendTime=" + obj.recurrencePattern.endTime + "&strpatternStartDate=" + obj.recurrencePattern.patternStartDate + "&strRecurrenceId=" + obj.recurrencePattern.parentRecurrenceId + "&strrecurrenceType=" + obj.recurrencePattern.recurrenceType + "&strstartTime=" + obj.recurrencePattern.startTime;
  84. return strGet2 + strGet1;
  85. } else {
  86. return strGet1;
  87. }
  88. };
  89. $("#eventscalendar").wijevcal({
  90.  
  91. visibleCalendars: ["My", "Work"],
  92. dataStorage: {
  93. addEvent: function (obj, successCallback, errorCallback) {//添加事件
  94. var strData = getData2(obj);
  95. //如果是重复事件则把重复事件加进来
  96. if (obj.recurrencePattern != null) {
  97. $.post("tsk_EventsCalendar.aspx?dol=addmore" + strData);
  98. }
  99. else {
  100. $.post("tsk_EventsCalendar.aspx?dol=add" + strData);
  101. }
  102. successCallback();
  103. },
  104. updateEvent: function (obj, successCallback, errorCallback) {
  105. var strData = getData2(obj);
  106. $.post("tsk_EventsCalendar.aspx?dol=update" + strData);
  107. successCallback();
  108. },
  109. deleteEvent: function (obj, successCallback, errorCallback) {
  110. //删除操作
  111. $.post("tsk_EventsCalendar.aspx?dol=del" + "&strId=" + obj.id);
  112. successCallback();
  113. },
  114. loadEvents: function (visibleCalendars, successCallback, errorCallback) {
  115.  
  116. successCallback(b);
  117.  
  118. }
  119. }
  120. });
  121.  
  122. });
  123.  
  124. </script>

2. tsk_EventsCalendar.aspx.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Collections;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.Web.UI.HtmlControls;
  11. using DBUtility;
  12. using Tools;
  13. using Entity;
  14. using System.Data;
  15. using Newtonsoft.Json;
  16. using System.Text.RegularExpressions;
  17.  
  18. namespace Web.General.tsk
  19. {
  20. public partial class tsk_EventsCalendar : BLL.BasePage
  21. {
  22. //创建一个日历对象
  23. tsk_calendar_eventsBean entity = new tsk_calendar_eventsBean();
  24. protected int id;
  25. protected void Page_Load(object sender, EventArgs e)
  26. {
  27. if (!Page.IsPostBack)
  28. {
  29. string ss = Get<string>("dol");
  30. entity.cid = Get<string>("strId");
  31. entity.cdescription = Get<string>("strDes");
  32. entity.cend = Get<string>("strEnd");
  33. entity.location = Get<string>("strLocation");
  34. entity.cstart = Get<string>("strStart");
  35. entity.csubject = Get<string>("strSubject");
  36. entity.cdescription = Get<string>("strDes");
  37. entity.color = Get<string>("strColor");
  38. entity.allday = Get<string>("strAllday");
  39. entity.calendar = Get<string>("strCalendar");
  40. entity.isNewEvent = Get<string>("strisNewEvent");
  41.  
  42. if (ss == "add")
  43. {
  44. addEvents();
  45. }
  46. if (ss == "addmore")
  47. {
  48. addEventsMore();
  49. }
  50. if (ss == "del")
  51. {
  52. deleteEvents();
  53. }
  54. if (ss == "update")
  55. {
  56. updateEvents();
  57. }
  58. }
  59. }
  60.  
  61. //添加数据,没有重复的事件
  62. protected void addEvents()
  63. {
  64. Factory<tsk_calendar_eventsBean>.Instance.Insert(entity);
  65. }
  66.  
  67. //添加数据,日历被定为重复的事件
  68. protected void addEventsMore()
  69. {
  70. //该事件的姿态,主 或 从
  71. entity.recurrenceState = Get<string>("strrecurrenceState");
  72. //重复事件的对象
  73. tsk_calendar_recuBean entity2 = new tsk_calendar_recuBean();
  74. entity2.endTime = Get<string>("strendTime");
  75. entity2.patternStartDate = Get<string>("strpatternStartDate");
  76. entity2.parentRecurrenceId = Get<string>("strRecurrenceId");
  77. entity2.recurrenceType = Get<string>("strrecurrenceType");
  78. entity2.startTime = Get<string>("strstartTime");
  79. Factory<tsk_calendar_eventsBean>.Instance.Insert(entity);
  80. //把主表的 id 设置为重复表的 外键 id
  81. entity2.event_id = entity.id;
  82. Factory<tsk_calendar_recuBean>.Instance.Insert(entity2);
  83. }
  84.  
  85. //删除数据
  86. protected void deleteEvents()
  87. {
  88. string strd = Get<string>("strId");
  89.  
  90. if (strd.Length >= )
  91. {
  92. entity.cid = Get<string>("strId");
  93. entity = Factory<tsk_calendar_eventsBean>.Instance.Select("cid='" + strd + "'");
  94. }
  95. else
  96. {
  97. entity.id = Convert.ToInt32(strd);
  98. }
  99. Factory<tsk_calendar_eventsBean>.Instance.Delete(entity.id);
  100. }
  101.  
  102. //修改数据
  103. protected void updateEvents()
  104. {
  105. string strd = Get<string>("strId");
  106.  
  107. if (strd.Length >= )
  108. {
  109. entity.cid = Get<string>("strId");
  110. entity = Factory<tsk_calendar_eventsBean>.Instance.Select("cid='" + strd + "'");
  111. }
  112. else
  113. {
  114. entity.id = Convert.ToInt32(strd);
  115. }
  116. Factory<tsk_calendar_eventsBean>.Instance.Update(entity);
  117. }
  118.  
  119. protected string GetStringJSON()
  120. {
  121. int count;
  122. DataTable table = Factory<vw_tsk_calendar_eventsBean>.Instance.SelectDataTable(, , GetSearchWhere() + "order by id desc", out count);
  123. string strJSON = JsonConvert.SerializeObject(table);
  124.  
  125. //先去掉空的重复事件
  126. string strReg = ",\"recurrenceState\":null,\"endTime\":null,\"event_id\":null,\"cuId\":null,\"parentRecurrenceId\":null,\"patternStartDate\":null,\"recurrenceType\":null,\"startTime\":null";
  127. Regex rx = new Regex(strReg);
  128. strJSON = rx.Replace(strJSON, "");
  129.  
  130. ////去掉关键字前的c 和 时间的引号和 GMT 0800
  131. strReg = "(\\w)(description)|(\\w)(start)|(\\w)(subject)|(\")(\\w)(end)(\")|\"(new [^\"]*)\"| GMT 0800";
  132. rx = new Regex(strReg);
  133. strJSON = rx.Replace(strJSON, @"$2$4$6$9$11");
  134.  
  135. strReg = "(\"startTime\":\"[^\"]*\")";
  136. rx = new Regex(strReg);
  137. strJSON = rx.Replace(strJSON, "$1}");
  138.  
  139. //////把重复事件的对象加上去
  140. strReg = "\"endTime";
  141. rx = new Regex(strReg);
  142. strJSON = rx.Replace(strJSON, "\"recurrencePattern\":{\"endTime");
  143. return strJSON;
  144. }
  145. }
  146.  
  147. }

页面代码说明:

1、首先我知道js样式调用那样写是不符合规范的,不建议大家像我这样,我这样写是因为框架(整个OA)的框架搭建问题,只有这样写才能生效,就整个问题我也纠结了好一会。

2、代码不是很规范,效率有点低,希望各位看官将就着看。

入题:

1、初始化日历控件:

  a:引包,注意顺着不能乱(页面加载顺序有关),不然,出事你负责。。。。。。我已经深受其害了。

  b:初始化静态的日历控件(不好意思啊,最近在做 ASP.NET ,经常控件控件这样叫的,望大家理解理解。。。)

 放置一个div,用来初始化日历的   

  1. <div id="eventscalendar">
  2.  
  3. </div>

用js来添加日历

  1. <script type="text/javascript">
  2. $(document).ready(function () {
  3. $("#eventscalendar").wijevcal({
  4. visibleCalendars: ["My", "Work"],
  5. dataStorage: {
  6. addEvent: function (obj, successCallback, errorCallback) {
  7. successCallback();
  8. },
  9. updateEvent: function (obj, successCallback, errorCallback) {
  10. successCallback();
  11. },
  12. deleteEvent: function (obj, successCallback, errorCallback) {
  13. successCallback();
  14. },
  15. loadEvents: function (visibleCalendars, successCallback, errorCallback) {
  16. successCallback();
  17.  
  18. }
  19. }
  20. });
  21. });
  22. </script>

好了,一个静态的页面已经弄好了,这里为了大家能看到效果,给大家一个静态数据的 Demo,大家在页面中下载吧。

2、获取数据,并把数据提交到数据库。

封装一个获取数据的方法:

  1. //获取日历插件里的属性
  2. function getData2(obj) {
  3. //取得日历的开始和结束的时间变量传到后台,添加操作
  4. var stime = "new Date(" + obj.start.getFullYear() + "," + obj.start.getMonth() + "," + obj.start.getDate() + "," + obj.start.getHours() + "," + obj.start.getMinutes() + ")";
  5. var etime = "new Date(" + obj.end.getFullYear() + "," + obj.end.getMonth() + "," + obj.end.getDate() + "," + obj.end.getHours() + "," + obj.end.getMinutes() + ")";
  6. //没有重复事件时的属性值
  7. var strGet1 = "&strId=" + obj.id + "&strDes=" + obj.description + "&strEnd=" + etime + "&strLocation=" + obj.location + "&strStart=" + stime + "&strSubject=" + obj.subject + "&strColor=" + obj.color + "&strAllday=" + obj.allday + "&strCalendar=" + obj.calendar + "&strisNewEvent=" + obj.isNewEvent;
  8.  
  9. if (obj.recurrencePattern != null) {
  10. alert(obj.recurrencePattern.endTime + "结束");
  11. var strGet2 = "&strrecurrenceState=" + obj.recurrenceState + "&strendTime=" + obj.recurrencePattern.endTime + "&strpatternStartDate=" + obj.recurrencePattern.patternStartDate + "&strRecurrenceId=" + obj.recurrencePattern.parentRecurrenceId + "&strrecurrenceType=" + obj.recurrencePattern.recurrenceType + "&strstartTime=" + obj.recurrencePattern.startTime;
  12. return strGet2 + strGet1;
  13. } else {
  14. return strGet1;
  15. }
  16. };

到此,能够获取到数据,相信你应该知道怎么做了吧。。。。哈哈我就不多说了,大家看后台代码吧,

不过有些方法你不能直接写的,比如:Factory<tsk_calendar_eventsBean>.Instance.Update(entity);

因为这些是我们框架封装好的方法,^_^,是不是羡慕嫉妒恨?。。。 --!

注:

1、Newtonsoft.Json.Net20.dll 为引用,可以转换 JSON格式。

2、善用正则表达式,提高效率,把数据转为日历所需的格式。

3、注意有了重复事件(数据表2)的处理,这个表是日历主表的附属表,是 obj里的子对象。 obj.recurrencePattern,如果没有创建重复事件,是没有 recurrencePattern的对象的。

4、别把这个东西看太难了,我当时百度谷歌找不到教程,这不,一个星期也研究些皮毛了,大家加油啊!

5、数据库设计,因为这个日历有他的 Id,但是我们可以用自增的Id,只做一些处理就好了。

6、字段设计最好跟日历的属性对应,个别的处理一下,在显示的时候用 正则表达式处理就可以了。

7、学会用火狐调试,断点调试,可以看出有什么对象,有什么属性。

最后几点建议:

1、有官网API,即使是英文的,也尽量去看,因为官网是最全面的,谁叫他是开发者,难道官网会比一个经过自己学习后翻译出来的差吗?

2、多看官网的Demo ,对了 Wijmo 还有很多 jQuery 特效,都不错的。

3、学会用狐火的FireBug,这样才能调试程序,知道有什么对象,有什么属性!

4、多写博客,多与人分享交流,那么这个世界就会更加美好了!

5、代码注意注释和风格,最好一屏能读完,提高可读性,方便维护!

6、多上博客园(没有打广告的嫌疑),真的,即使你不是学习,也能了解到很多东西,最重要的是有很多妹子图 ^.^!

以下附上源代码,大家快来拍砖!。。。

下载地址:http://download.csdn.net/detail/hyd8480188/5614657

要一分,给我挣挣分好吗,没有分了。

如果你也没有分,给我邮箱我给你发。

Wijmo 日历插件的更多相关文章

  1. 被逼着写的jquery工作日管理日历插件

    因为工作原因,在我刚进入新公司之后,立马要求让我做一个jquery的插件demo.我的天,我面试的可是.net工程师啊.虽然以前接触过js,jquery,但也只是接触过一丢丢啊,没办法,只好硬着头皮上 ...

  2. 日历插件FullCalendar应用:(二)数据增删改

    接上一篇 日历插件FullCalendar应用:(一)数据展现. 这一篇主要讲使用fullcalendar插件如何做数据的增删改,用到了art.dialog web对话框组件,上一篇用到的webFor ...

  3. 一款基于jQuery日历插件的开发过程

    这个插件的设置选项,所有样式都设置成自定义,提供回调函数,方便在外部进行扩展 css设置是可变的  也就是说  日历的样式是定制的: /******************************** ...

  4. 一款简洁大气的jquery日期日历插件

    本jquery插件名为manhuaDate,暂时只支持jquery 1.9.0以下版本,比如jquery-1.8.3.min.js 查看效果网址:http://keleyi.com/a/bjad/em ...

  5. 【UI插件】简单的日历插件(下)—— 学习MVC思想

    前言 我们上次写了一个简单的日历插件,但是只是一个半成品,而且做完后发现一些问题,于是我们今天尝试来解决这些问题 PS:距离上次貌似很久了 上次,我们大概遇到哪些问题呢: ① 既然想做一套UI库,那么 ...

  6. 【UI插件】开发一个简单日历插件(上)

    前言 最近开始整理我们的单页应用框架了,虽然可能比不上MVVM模式的开发效率,也可能没有Backbone框架模块清晰,但是好歹也是自己开发出来 而且也用于了这么多频道的东西,如果没有总结,没有整理,没 ...

  7. Jquery中的日历插件

    这个插件很简单:只需要在HTML代码中引入插件如下,CLASS名和click事件函数固定! <!doctype html> <html lang="en"> ...

  8. 仿iphone日历插件(beta)

    前言 小伙伴们好,很久不见了.最近工作进入正常期了,所以慢慢的悠闲的时间久没有了,所以不能每天水一篇了. 最近也在听师傅(http://home.cnblogs.com/u/aaronjs/)的教导开 ...

  9. js日历插件 中文、英文日历

    日历插件 来源网站:http://www.cnblogs.com/yank/archive/2008/08/14/1267746.html 六款英文日历 http://www.bobd.cn/desi ...

随机推荐

  1. Redis学习 - 入门

    业精于勤,荒于嬉:行成于思,毁于随 -- 韩愈·<进学解>   因为工作中需要用到Redis,所以最近抽点时间看了一下,现在将学习的内容整理一下.   一.简介 1.Redis是什么? R ...

  2. CentOS6.5安装LAMP环境APACHE的安装

    1.卸载apr.apr-util [root@centos6 LAMP]# yum remove apr apr-util 2.编译安装apr-1.5.1.tar.gz [root@centos6 L ...

  3. JQuery执行函数与window.onload函数

    JavaScript和HTML之间的交互: 1.通过用户和浏览器操作页面时引发的事件来处理的. 2.当文档或者它的某些元素发生某些变化时,浏览器会自动生成一个事件. 例如:当浏览器装载完一个文档后,会 ...

  4. php 手机电话正则表达式验证

            function check_telnum1($telnum)        {                             $b1 = (preg_match(" ...

  5. 栈的讲解 和 栈的生长方向 源代码技巧分析,简直没SEI 啦

    函数的局部变量,都是存放在"栈"里面,栈的英文是:STACK.STACK的大小,我们可以在stm32的启动文件里面设置,以战舰stm32开发板为例,在startup_stm32f1 ...

  6. python的sorted相关

    Python 字典排序 在python里,字典是内置的数据类型,是个无序的存储结构,每一个元素是key-value对: 有关key的解释: sorted(L,key=by_name)中的key即by_ ...

  7. PHP 5.6正式发布:新特性、及功能改进介绍

    经过了长时间的开发测试,新版本PHP程序(PHP5.6正式版)终于发布了.新版本中加入了一些实用的新特性,也摒弃了一些冗余的功能.同时,也对部分原有功能进行了改进.下面就一起看看PHP 5.6正式版到 ...

  8. 转:Backbone与Angular的比较

    原文来自于:http://www.infoq.com/cn/articles/backbone-vs-angular 将不同的思想和工具进行对比,是一种更好地理解它们的方式.在本文中,我首先将列举在创 ...

  9. 转:更改 centos yum 源

    centos下可以通过yum很方便快捷的安装所需的软件和库,如果yum的源不好,安装速度会非常慢,centos默认官方源似乎都是国外的,所以速度无法保证,我一直使用163的源,感觉速度不错.下面就说说 ...

  10. 用c语言程序对显存进行操作

    一.基础研究 我们之前研究过变量.数组.函数和指针,他们都可以看作是内存中存储的一段数据,当程序需要用到它们时,会通过它们的地址找到它们并进行调用,只是调用的用途不同而已:变量和数组元素是作为常量来处 ...