# 百占百胜(图书馆在线预约,失物招领,问答聊天) **Repository Path**: xkoderlab/bzbs ## Basic Information - **Project Name**: 百占百胜(图书馆在线预约,失物招领,问答聊天) - **Description**: 我的第一个码云仓库 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-04-12 - **Last Updated**: 2021-04-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 百占百胜 ## 背景 该系统是参加全国大学生电子商务“创新 创意 创业”挑战赛做的项目,是为了解决图书馆占座问题的一种构想,是一种理想状态下内心想法的一种落地实现。内含占座优选、在线商城、失物招领、问答聊天四大模块功能。 因为我们学校小,图书馆更小,图书馆自习室就那么几间,一到期末或者考研,尤其考研期间,大清早的五六点就去占座,还有的压根不回来了,直接在那安了家,校园墙的吐槽也层出不穷,桌子上有书,但人却不知了去向,所以借着比赛的契机,我们能不能想一个办法解决图书馆占座的问题 ### 占座优选 #### 执行逻辑 我们最终的目的是保证每一个座位上有人,不会出现人走了座位还不能被其他人使用的现象,整个流程是现在系统上提前预约空座位,假如预约时候后10分钟没有去签到,则超时违规,违规次数+1,当违规次数超过3次则禁止预约三天加入黑名单,三天后将是否为黑名单属性设置为false。 当然,这种中途离开的情况是允许的,最大离开时间为一个小时,这样保证了吃饭等长时间特殊情况,使系统更加人性化,同样没有及时回来的话违规次数+1,累积违规次数超3次以上会加入黑名单。并且预约的位置将释放,允许他人继续使用。 #### 预约操作 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0324/224636_18edea61_6553664.png "image-20210324221215556.png") 预约成功后,会自动生成一个预约ID,后台通过预约ID生成一个二维码,可以通过该二维码在自习室闸机上识别,然后通过后台设置签到成功。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0324/224658_0f76b17e_6553664.png "image-20210324221734935.png") #### 定时任务 本模块最大的难点是定时任务的实现,如何去判断是否违规,由于数量比较少,我们采用了刷表的形式,定时任务则使用了SpringTask来实现,每个一段时间对数据库进行刷表,读取预约表未签到的数据,然后根据预约时间一一判断,是否违规。 具体逻辑如下: > * 每隔1分钟进行刷表,对是否签到进行验证 > * 在签到表查询今天的签到信息且签到状态为未签,然后与当前时间对比 > * 假如当前时间大于应签到时间(即未按照签到时间签到),签到状态改为违规 > * 违约表记录违约信息,个人违约次数+1,预约表状态为无效,释放座位,违约信息只能通过该定时器添加 > * > * 违约次数+1后 判断是否已满3次, 因为违规次数是累积的,所以要通过illegalNum%3==0 判断 > * 满足改条件即3,6,9记录黑名单,禁止预约7天 > * 还要查询黑名单表,判断修改黑名单状态(在创建一个定时器实现此业务,判断是否取消黑名单) 黑名单时间到期的判断,同样也是采用刷表的方式。 > * 定时任务,每10分钟刷表一次 > * 改变黑名单状态 > * 假如是黑名单禁止预约三天,三天后将isBlack(是否是黑名单)改为否 > * 在学生表内查询黑名单时间,条件:isBlack='是' > * 与当前时间相比,假如超过,则将isBlack='否' #### 不足优化 当数据量很大的情况下,刷表的方式显然是效率很低下的。另外频繁的刷表,比如每一分钟刷一次预约表,每十分钟刷一次黑名单表,会导致时间产生误差不会那么精确,用户体验十分不友好。 后来在学习Redis的时候(当时做本项目的时候还没有接触Redis),我发现Redis的过期淘汰策略出奇的相似,过期淘汰策略有三种:定时、懒惰、定期。而正是考虑定时需要为每一次预约设置一个定时器,效率不低所以才采用刷表的方式也就是定期的策略。 所以为了实现定时任务,我们完全可以使用Redis的过期键,具体实现还需要思考。 ### 在线商城 主要是一个商品展示的功能。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0324/224715_acaf2730_6553664.png "image-20210324223626570.png") 点击商品可以出现商品的详细信息,然后通过联系方式找到我们,我们可以提供上门服务,实现盈利。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0324/224725_1e990309_6553664.png "image-20210324223739379.png") ## 总结 通过该项目的开发,一是对之前学的知识一个综合的应用,使理论知识彻彻底底的活了起来。不仅对知 识的了解更加的深入了,二更重要的是提高了自己解决问题的能力以及自学的能力。 同时也意识到了自己很多的不足,因为这是一个“单机版”应用,锻炼大于实际应用。那么今后如何去 优化,多线程情况下该怎么解决?权限控制、缓存等等这都需要考虑,只能说长路漫漫仍需要付出很多 努力。