說明:javascript
由於項目(OA)的須要,我負責開發日程的模塊,相信你們用過谷歌的日曆了吧,是否是以爲挺好用,但又苦於沒法實現?css
這裏告訴你一個很好的插件,Wijmo,而裏面有一個相似谷歌的日曆事件插件,真的很好很強大,注意,我不是託。html
當時找到這個插件的時候,真心佩服那些牛逼的外國開發員,能作到這麼厲害,而且還開源了。java
由於菜鳥,苦苦作了一個多星期才完成,箇中緣由能歸結爲:jquery
一、沒有中文的介紹和幫助,百度谷歌就是找不到很好的例子。正則表達式
二、英文不行,看官網API很吃力,沒有認真看官網的Demo。sql
三、不是很熟悉js。數據庫
技術要點:json
一、基本的js、jQuery使用框架
二、正則表達式的使用(確實很好很強大)
三、wijmo 日曆事件插件的基本使用
四、JSON的基本使用
廢話不說,先上幾張效果圖,還在完善中,但願能幫到有須要的人。
個人Demo 圖:
開始上代碼,首先這個日曆中的數據是要存到本地的,因此要建立數據庫。
貼上數據庫代碼:代碼是用SQL 2008的,裏面的註釋很清楚了,僅供參考。
/********************************************************* 說明:日曆事件表:保存日曆事件的信息 做者:Frank 2013-6-17 17:34:05 *********************************************************/ USE HFOA IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tsk_calendar_events]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [dbo].[tsk_calendar_events] GO CREATE TABLE [dbo].[tsk_calendar_events] ( --除了id不是插件的關鍵字,全部的都是插件的關鍵字,都要注意轉換,有些不用轉,帶c開頭的都要轉,否則插件會顯示錯誤 id int identity (1,1) NOT NULL, --日曆事件編號 allday VARCHAR(10) NULL, --是否爲全天事件 calendar VARCHAR(20) NULL, --該事件屬於哪一個日程的,有 My 和 Work csubject VARCHAR(100) NULL, --事件主題,顯示時必須轉爲 subject color VARCHAR(20) NULL, --該事件的重要程度,以顏色來區分 cdescription varchar(250) NULL, --日程事件的描述,顯示時必須轉爲 description cstart VARCHAR(50) NOT NULL, --開始時間,頁面顯示時必須轉爲 start 格式爲 new Date(2013,5,17,6,0) cend VARCHAR(50) NOT NULL, --結束時間,注意,頁面顯示到頁面的時候必須把字段名改成 end ,不然該日曆插件會報錯 格式爲 new Date(2013,5,17,6,0) cid VARCHAR(50) NOT NULL, --日曆插件的 id,頁面顯示時必須轉爲 id isNewEvent VARCHAR(10) NULL, --是否爲新事件 location VARCHAR(100) NULL, --事件地點 recurrenceState VARCHAR(20) NULL, --當有重複事件的時候,該事件爲主事件仍是派生的 重複事件 parentRecurrenceId VARCHAR(50) NULL, --重複事件的主事件 Id ) ON [PRIMARY] GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' GO /********************************************************* 說明:日曆事件重複表:保存日曆事件重複的信息 做者:Frank 2013-6-17 17:34:05 *********************************************************/ USE HFOA IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tsk_calendar_recu]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [dbo].[tsk_calendar_recu] GO CREATE TABLE [dbo].[tsk_calendar_recu] ( id int identity (1,1) NOT NULL, --重複事件的id startTime VARCHAR(50) NULL, --開始時間 格式爲 Date(2013,5,17,6,0) endTime VARCHAR(50) NULL, --結束時間 格式爲 Date(2013,5,17,6,0) parentRecurrenceId VARCHAR(50) NULL, --重複事件的主事件 Id recurrenceType VARCHAR(20) NULL, --事件重複的類型,有天天、每週等 patternStartDate VARCHAR(50) NULL, --主事件的開始時間 格式爲 new Date(2013,5,17,6,0) event_id int NOT NULL, --日曆主表主鍵 Id ) ON [PRIMARY] GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' GO 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' 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 117 successCallback(b); 118 119 } 120 } 121 }); 122 123 124 }); 125 126 127 </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 >= 35) 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 >= 35) 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(0, 0, 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 }
頁面代碼說明:
一、首先我知道js樣式調用那樣寫是不符合規範的,不建議你們像我這樣,我這樣寫是由於框架(整個OA)的框架搭建問題,只有這樣寫才能生效,就整個問題我也糾結了好一會。
二、代碼不是很規範,效率有點低,但願各位看官將就着看。
入題:
一、初始化日曆控件:
a:引包,注意順着不能亂(頁面加載順序有關),否則,出事你負責。。。。。。我已經深受其害了。
b:初始化靜態的日曆控件(很差意思啊,最近在作 ASP.NET ,常常控件控件這樣叫的,望你們理解理解。。。)
放置一個div,用來初始化日曆的
<div id="eventscalendar"> </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,你們在頁面中下載吧。
二、獲取數據,並把數據提交到數據庫。
封裝一個獲取數據的方法:
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);
由於這些是咱們框架封裝好的方法,^_^,是否是羨慕嫉妒恨?。。。 --!
注:
一、Newtonsoft.Json.Net20.dll 爲引用,能夠轉換 JSON格式。
二、善用正則表達式,提升效率,把數據轉爲日曆所需的格式。
三、注意有了重複事件(數據表2)的處理,這個表是日曆主表的附屬表,是 obj裏的子對象。 obj.recurrencePattern,若是沒有建立重複事件,是沒有 recurrencePattern的對象的。
四、別把這個東西看太難了,我當時百度谷歌找不到教程,這不,一個星期也研究些皮毛了,你們加油啊!
五、數據庫設計,由於這個日曆有他的 Id,可是咱們能夠用自增的Id,只作一些處理就行了。
六、字段設計最好跟日曆的屬性對應,個別的處理一下,在顯示的時候用 正則表達式處理就能夠了。
七、學會用火狐調試,斷點調試,能夠看出有什麼對象,有什麼屬性。
最後幾點建議:
一、有官網API,即便是英文的,也儘可能去看,由於官網是最全面的,誰叫他是開發者,難道官網會比一個通過本身學習後翻譯出來的差嗎?
二、多看官網的Demo ,對了 Wijmo 還有不少 jQuery 特效,都不錯的。
三、學會用狐火的FireBug,這樣才能調試程序,知道有什麼對象,有什麼屬性!
四、多寫博客,多與人分享交流,那麼這個世界就會更加美好了!
五、代碼注意註釋和風格,最好一屏能讀完,提升可讀性,方便維護!
六、多上博客園(沒有打廣告的嫌疑),真的,即便你不是學習,也能瞭解到不少東西,最重要的是有不少妹子圖 ^.^!
如下附上源代碼,你們快來拍磚!。。。
下載地址:http://download.csdn.net/detail/hyd8480188/5614657
要一分,給我掙掙分好嗎,沒有分了。
若是你也沒有分,給我郵箱我給你發。