登录用户“商家”使用的Meteor网络应用程序需要创建链接并将短信/电子邮件发送给他的客户。该链接打开一个表单。客户填写表单并提交表单,以便使用属性merchantId
插入数据,因为许多商家可以向许多客户发送。
此单页应用程序不使用路由器,但能够短信/电子邮件。如何优雅地完成商家与客户之间的表格链接,以便来自正确客户的数据与正确的商家“链接”?感谢
答案 0 :(得分:1)
商家部分
成功发送电子邮件/短信后,您可以触发一个流媒体方法,该方法将已发送的电子邮件/短信的记录存储在一个集合中(在此示例中名为Record
)。这可能是它的架构:
记录集合架构(服务器/客户端)
{
merchantId:String, // the id of the sender
customer:String, //id or name or address or phone num of receiver
opened:Boolean, //when the link is opened can be set to true
link:String, // the link to be send,
type:Number, //0=sms, 1=email,
expires:Date, //in case the link is not opened
}
例如,您可以创建一个Meteor方法,在发送后插入记录:
插入记录(服务器)
Meteor.methods({
insertRecord:function(recordData) {
//... check recordData by schmema and permissions here
return Records.insert(recordData);
}
})
发送电子邮件/短信
因此,应用的商家部分通过短信/电子邮件发送链接,并调用insertRecord
方法存储已保存的记录。
保存记录(客户端或服务器)
const callback=function(err, res) {
if (res) { // assume your sent was successful here
Meteor.call("insertRecord", {
//... your record credentials
});
}
}
// a little bit of pseudocode
if (sms)
sms.send(form, callback);
else
email.send(form, callback);
客户部分
当客户打开链接时,它会触发一个模板,该模板将呈现您的表单。您最初可以运行meteor方法来检查Record集合中是否有与链接URL匹配的文档。
通过网址方法(服务器)获取记录
Meteor.methods({
getRecordByUrl:function(url) {
//... do your input checks here
return Records.findOne({link:url});
},
});
表单模板(客户端)
Template.customerForm.onCreated(function(){
const instance = this;
instance.state = new ReactiveDict();
instance.state.set("record", null);
instance.autorun(function(){
// if no record loaded yet
if (!instance.state.get("record")) {
Meteor.call("getRecordByUrl", window.location.href, function(err, res) {
if (err || !res) {
//...handle err
}
this.state.set("record", res);
}.bind(instance));
}
});
});
Template.customerForm.helpers({
getRecord() {
return Template.instance().state.get("record");
},
getMerchantId() {
const record = Template.instance().state.get("record");
return record.merchantId;
}
});
然后,您可以使用此文档将merchantId
作为隐藏输入或通过html数据属性添加到表单中。
{{#if getRecord}}
<form id="...">
<input type="hidden" name="merchantId" value="{{getMerchantId}}" />
<!-- other inputs here -->
</form>
{{/if}}
这些例子当然可以进行优化,但我认为这样可以更清楚地理解。