「简记往来」开发历程系列:邀请码机制设计——有效期控制的完整方案

发布时间:2026/6/28 2:45:25
「简记往来」开发历程系列:邀请码机制设计——有效期控制的完整方案 一、为什么需要有效期简记往来的多人协作功能通过邀请码让用户加入账本。如果邀请码永久有效会有什么问题安全风险很久以前发出的邀请码可能被意外使用管理混乱创建者不知道哪些邀请码还有效权限过期当初设定的“临时帮忙”权限可能被长期使用所以邀请码必须有有效期。二、邀请码生成方案邀请码的生成规则functiongenerateInviteCode(){// 6位随机字符字母数字constcharsABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789letcodefor(leti0;i6;i){codechars[Math.floor(Math.random()*chars.length)]}returncode}6位字符的组合数约568亿62^6足够保证唯一性。如果生成时发现重复重新生成即可。三、有效期存储邀请码的数据库结构{code:aB3xZ9,bookId:book_xxx,role:editor,createdAt:2026-06-20T10:00:00Z,expiresAt:2026-06-23T10:00:00Z,used:false,usedAt:null,usedBy:null}expiresAt过期时间创建时根据用户选择计算used是否已被使用usedAt使用时间usedBy使用者的用户ID四、过期校验逻辑用户输入邀请码时进行三重校验functionvalidateInviteCode(code){constinviteawaitdb.invites.findOne({code})// 校验1邀请码是否存在if(!invite)return{valid:false,reason:邀请码不存在}// 校验2是否已被使用if(invite.used)return{valid:false,reason:邀请码已被使用}// 校验3是否已过期if(newDate()newDate(invite.expiresAt)){return{valid:false,reason:邀请码已过期}}return{valid:true,invite}}五、定时清理过期的邀请码不需要立即删除但需要定期清理减少数据库存储。简记往来的清理策略// 每天凌晨2点执行asyncfunctioncleanExpiredInvites(){constresultawaitdb.invites.deleteMany({expiresAt:{$lt:newDate()}})console.log(清理了${result.deletedCount}个过期邀请码)}也可以使用MongoDB的TTL索引自动清理db.invites.createIndex({expiresAt:1},{expireAfterSeconds:0})六、用户体验设计过期校验失败时给用户清晰的提示“邀请码已过期请联系创建者重新生成”“邀请码已被使用”“邀请码不存在请检查是否输入正确”而不是统一的“邀请码无效”。七、总结邀请码机制的设计要点生成唯一码6位随机字符足够唯一设置有效期1-3天过期自动失效三重校验存在性、使用状态、有效期自动清理减少数据库存储这套方案已经在简记往来中稳定运行可以直接复用。