基于 Gin 的会议室预约 API 设计 (二)

会议室预约功能模块大概可以分为三大部分
预约模块
黑名单模块
日志模块

预约模块
  1. 请求占用时间表,验证请求时间是否被占用,没有则进行第2步,有则返回失败
  2. 创建预约,并将请求写入操作日志
  3. 向占用时间表插入数据

  • 假设用户选中 2018-08-30 08:00~09:00 的时间在一号会议室开会
  • 在创建订单的时候我会先从占用时间表 used_time 查找 一号会议室 2018-08-30 里有没有 08:0008:30
  • 如果有返回时间已被占用,创建失败
  • 没有就创建预约,并纪录日志
  • 然后再占用时间表里插入 一号会议室 2018-08-3008:0008:30 时间段
  • 最后返回 201 给前端

黑名单模块
  1. 统计用户的违约次数,若一个自然季度内违约超过3次,则纳入黑名单,一个月内禁止预约
  2. 什么为违约,会议室预定审批通过后,需要在会议开始前30分钟再次登录预约平台确认方可生效,如会议开始后15分钟仍未做确认,系统自动取消预定申请。被系统自动取消则为违约
  3. 怎么统计一个季度内订单违约的次数呢,这里我使用Mysq 时间函数 QUARTER
SELECT id,user,erp,COUNT('status') AS count
FROM  `meeting_books` 
WHERE QUARTER(DAY) = QUARTER(NOW()) 
AND YEAR(DAY) = YEAR(NOW())  
AND  status=5 ANd  GROUP BY user  HAVING COUNT('user')>3

这里我是非实时计算,每隔4小时统计一次
如果要实时统计由于使用不了索引效率非常底,因为这里使用了内置函数还使用了 GROUP BY HAVING COUNT

  • 优化的话可以使用redis string类型INCR 作为原子计数器,例如以 blacklist:用户名:用户id 为键
    违约一次就增一,以三个月为过期时间 ,但要记得控制如果值大于3 了,要控制程序把键的值清零

  • 这里还需要考虑的问题是我封禁了用户一个月是根据他在黑名单,但例如我 1月15号 封禁了用户 2月15号 就解除了封禁
  • 那我需要把之前违约的纪录给清除掉,不然只要该用户当季度在违约就会立刻加入黑名单
  • 所以我们需要统计预约违约的时候知道这个预约是否之前被纳入过黑名单
  • 没有我们就统计,有的话就忽略
  • 我的做法是在订单表加一个字段is_blacklist,统计的时候只统计is_blacklist = 0 的,即不在黑名单的
  • 但要记得在统计用户违约纪录大于3的时候,把用户违约的预定的 is_blacklist 置为 1

日志模块
  • 因为预约会议室的行为是一种资源操作的行为
  • 对于这种行为我们是要纪录日志的
  • 纪录日志确实非常简单,就是在每一步操作后,向 日志表 纪录谁谁谁,什么什么时候,干了什么什么即可
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值