我正在使用Mongo DB在React中为客户创建一个事件日历。在面向公众的一方,用户将能够查看事件,并将其添加到他我们工作的手机上的日历中。我遇到的问题是事件很少每周都会发生变化,如果它们可能是教师的名字,或者房间的变化。因此,在管理员方面,当管理员创建事件时,他们将能够点击重复事件直到“X”日期。在服务器上,我需要重新创建文档,直到事件的开始时间或结束时间等于重复日期的日期。
我的事件架构如下所示:
var activitySchema = mongoose.Schema({
"room": String,
"type": String,
"title" : String,
"start": {type: Date},
"end": {type: Date},
"instructor" : String,
"desc": String,
"image": String,
"style": {
"backgroundColor": String
}
})
当用户点击创建表单上的提交时,这就是火灾:
onSubmit() {
var startTime = {start: this.state.start || this.state.data};
var endTime = {end: this.state.end || this.state.data};
var color = {style: {backgroundColor: this.state.color || this.state.data}}
var image ={image: this.state.image || this.state.data};
var myForm = this.refs.MyForm.getValue();
var payload = _.merge(myForm, startTime, endTime, color, image);
if (payload._id) {
superagent.put("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
});
} else {
delete payload._id; //remove the empty id object from the post since it's blank.
superagent.post("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
this.refs.MyForm.reset();
});
}
},
所以我需要发生的是当他们点击提交时,它会一遍又一遍地重复该文件,但是日期增加了7天,所以它在一周的同一天每周重复一次。
现在,它只是为所选日期和时间一次创建一个事件,并在日历上显示。我正在使用MomentJS进行时间处理,我将尝试使用Moment-Recur,但安装时出现错误,但它似乎是一个尚未解决的常见问题。
任何帮助或建议都会很棒,我不是一个后端人,并且不知道如何做到这一点。
答案 0 :(得分:0)
我们有非常相似的要求,最终使用了这个npm包:
https://github.com/tritech/node-icalendar
这允许管理真实的iCal对象,这些对象可以被典型的日历应用程序识别,例如Outlook,Google Calendar等。是支持重复发生的事件,因此您只需要一个具有重复定义的事件对象。
如果您需要重复发生的事件,则会有getOccurences()
函数。不幸的是,文档很少,单元测试是最好的起点。
您可能不得不重新考虑事件的数据模型 - 在iCal,Outlook的世界中......反复出现的事件只是一个事件,而不是多个事件。
在客户端(网络应用),我们使用此服务:https://www.addevent.com/
以允许用户将定期事件添加到他的日历中。
答案 1 :(得分:0)
所以我最终解决了我的问题。虽然这可能不是重复事件的最佳方式,但我所知道的是让我周围的多个人做事。
if(this.refs.repeatCheckbox.checked){
//let endRepeat = moment().endOf("month").format();
let endRepeat = moment(this.state.repeat).add({days: 1}).format();
let start = moment(this.state.start).format();
let end = moment(this.state.end).format();
do {
let newStart = {start: start};
let newEnd = {end: end};
var myForm = this.refs.MyForm.getValue();
var payload = _.merge(myForm, newStart, newEnd, color, image);
if (payload._id) {
superagent.put("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
});
} else {
delete payload._id; //remove the empty id object from the post since it's blank.
superagent.post("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
this.refs.MyForm.reset();
});
}
start = moment(start).add({days: 7}).format();
end = moment(end).add({days: 7}).format();
} while (end < endRepeat);
} else {
var myForm = this.refs.MyForm.getValue();
var payload = _.merge(myForm, startTime, endTime, color, image);
if (payload._id) {
superagent.put("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
});
} else {
delete payload._id; //remove the empty id object from the post since it's blank.
superagent.post("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
this.refs.MyForm.reset();
});
}
};
因此,如果用户选中了重复框,并输入了他们希望重复的日期,它将循环提交功能并添加7天,直到结束日期等于所选的重复日期。如果他们不检查框并选择日期,它将只创建一个事件。可能不是最好的解决方案,但它可以工作,它适用于我正在使用的日历。