当前位置: 首页 > Linux

来吧,你想要的签到功能

时间:2023-04-06 22:52:23 Linux

前言大多数情况下,你的世界充满了混乱和单调。虽然你的身体不胖,但不会让你觉得有力量;你的过去平淡无奇,充满了很多悲伤和自我否定,你的过去或未来都没有惊喜。你想要一个新的生命,一个重生,没有行动,一切都是幻想,你还忍受着痛苦和软弱。只有一点一滴地积累,才能感受到飞轮转动时的顺畅,才会有彩虹般的动力。一点一滴的积累,需要签到功能。签到在生活中还是有很多应用的,比如工作签到、健身签到、学习签到……等等。其实签到功能的开发还是挺容易的,下面我们来实现把它放在一起,让我们用自己的开发为什么要写一篇关于签到功能的文章?一个小功能,需要公司的一个系统来实现,也是为了方便日后的审查和优化。特此记录。让我们毫不费力地实施它。数据库设计1.为什么要设计数据库,节省数据存储空间,保证数据完整性,方便基于数据库的系统开发2.设计数据库签到功能日志表(签到用户,签到项号,签到-及时)根据要求。签到项目字段不是必需的。添加此字段只是为了方便将来扩展。其他两个字段是必需的项目表(项目编号、项目名称和创建时间)。该表不是必须的,只是为了以后的扩展,可以添加或不添加统计表(项目数、总签到数、连续签到数、签到用户数、签到时间)。本表除货品编号字段外,其他字段均为必填字段。我喜欢这种三表的设计,只是为了方便以后的扩展。除了project表外,其他两个表是最基本的,也是必须的。一、创建数据库clockinCHARACTERSET:指定数据库使用的字符集,utf8不能写成utf-8COLLATE:指定数据库字符集的排序规则,utf8默认的排序规则是utf8_general_ci(通过showcharacterset查看)dropdatabaseifEXISTSclockin;createdatabaseclockinCHARACTERSETutf8COLLATEutf8_general_ci;sql语句如下DROPTABLEIFEXISTS`clockin_count`;CREATETABLE`clockin_count`(`id`int(11)NOTNULLAUTO_INCREMENT,`pid`int(11)DEFAULTNULLCOMMENT'check-initem',`sum`int(11)DEFAULTNULLCOMMENT'totalcheck-intimes',`cloop`int(11)DEFAULTNULLCOMMENT'Consecutivecheck-intimes',`name`varchar(25)COLLATEutf8_binDEFAULTNULLCOMMENT'Sign-inperson',`dtime`datetimeDEFAULTNULLONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8COLLATE=utf8_bin;如果存在`clockin_log`则删除表;创建表`clockin_log`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(25)COLLATEutf8_binDEFAULTNULLCOMMENT'sign-in',`pid`int(11)DEFAULTNULLCOMMENT'check-inproject',`dtime`datetimeDEFAULTNULLCOMMENT'check-intime',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8COLLATE=utf8_bin;DROPTABLEIFEXISTS`clockin_project`;CREATETABLE`clockin_project`(`id`int(11)NOTNULLAUTO_INCREMENT,`pid`int(11)NOTNULL,`project`varchar(25)COLLATEutf8_binNOTNULL,`dtime`datetimeDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8COLLATE=utf8_bin;3、看清楚数据表之间的映射关系table比较高,特此提出单独的表使用clockin_project:项目表,在哪个项目上签到,不是没有必要,只是为了以后扩展方便,另外增加了clockin_count:统计表,用户的签到信息在统计日志表,数据比较少,提取起来比较直观,查询数据使用比较频繁。实现思路先判断item是否存在,如果存在则checkin,再判断今天是否checkin。如果今天没有签到,插入数据,然后判断昨天是否签到。连续天数和总天数加一。如果昨天没有签到,则连续天数设置为1,总天数加1。思维导图如下。这里主要是SQL语句的编写。我这里主要使用SQL中的LEFT语法,对应oracle中的substr(),主要用于判断今天签到还是昨天签到语法:==LEFT(ARG,LENGTH)==ARG源数据,LENGTH个字符串,ARG可以是CHAR或BINARYSTRING例如:left('12345',2)-->12SELECT*FROMclockin_logwherename=#{name}andpid=#{pid}andLEFT(dtime,10)=LEFT(NOW(),10)SELECT*FROMclockin_logwherename=#{name}andpid=#{pid}andLEFT(dtime,10)=LEFT(#{dtime},10)2020-10-10T10:30:51从2020-10-10得到的主要代码我这里用的是MybatisPlus,具体用法大家可以参考。结果是我定义了一个结果集包含code——状态码,msg——返回信息,data——数据信息//nameusernamepiditemNumberpublicResultclock(Stringname,Stringpid){//返回的数据类型Result<对象>结果=新结果<>();//获取昨天的日期Calendarcal=Calendar.getInstance();cal.add(日历.DATE,-1);昨天的日期=cal.getTime();//判断今天是否签到Booleanisexit=clockinLogService.selectClockinIsexit(name,Integer.parseInt(pid));LambdaQueryWrapperwrapper=newLambdaQueryWrapper<>();wrapper.eq(ClockinCount::getName,name).eq(ClockinCount::getPid,Integer.parseInt(pid));ClockinCountone=clockinCountService.getOne(wrapper);LambdaQueryWrapperwrapper1=newLambdaQueryWrapper<>();wrapper1.eq(ClockinProject::getPid,Integer.parseInt(pid));ClockinProject项目=clockinProjectService.getOne(wrapper1);//打卡项目是否存在if(!StringUtils.isEmpty(project)){if(isexit){//判断今天是否打卡result.setRetCode(Result.ERROR);result.setRetMsg("我今天入住了");结果.setRowData(一);返回结果;}别的{//记录签到信息ClockinLogclockinLog=newClockinLog();clockinLog.setName(name).setPid(Integer.parseInt(pid)).setDtime(LocalDateTime.now());布尔保存=clockinLogService.save(clockinLog);if(save){//数据是否插入成功BooleanyesterdayIsexit=clockinLogService.selectClockinYesterdayIsexit(name,Integer.parseInt(pid),yesterday);System.err.println("yesterdayIsexit->"+yesterdayIsexit);if(yesterdayIsexit){//判断昨天是否有签到System.err.println("昨天签到");//更新签到数ClockinCountcc=newClockinCount();LambdaUpdateWrapperupdateWrapper=newLambdaUpdateWrapper<>();updateWrapper.eq(ClockinCount::getPid,Integer.parseInt(pid)).eq(ClockinCount::getName,名称);cc.setSum(one.getSum()+1).setCloop(one.getCloop()+1);clockinCountService.update(cc,updateWrapper);}else{if(!StringUtils.isEmpty(one)){//统计用户是否存在于表中//更新签到次数ClockinCountcc=newClockinCount();LambdaUpdateWrapperupdateWrapper=newLambdaUpdateWrapper<>();updateWrapper.eq(ClockinCount::getPid,Integer.parseInt(pid)).eq(ClockinCount::getName,名称);cc.setSum(one.getSum()+1).setCloop(1);clockinCountService.update(cc,updateWrapper);}else{//插入数据信息ClockinCountcc=newClockinCount();cc.setCloop(1).setName(名称).setPid(Integer.parseInt(pid)).setSum(1).setDtime(LocalDateTime.now());clockinCountService.save(cc);}}one=clockinCountService.getOne(wrapper);结果.setRetCode(Result.SUCCESS);result.setRetMsg("成功");结果.setRowData(一);返回结果;}}}else{result.setRetCode(Result.ERROR);result.setRetMsg("失败");result.setRowData("签到项不存在");}返回空值;主要流程写一个签到功能,签到主要是记录一个人的阶段性努力,如果自己的计划学习能力不高,自我监督能力不强,那么这个签到功能可以完美解决督促自己学习等问题以上就是本文的主要代码和思路。感谢您阅读到这里。我希望这个想法能对你有所帮助。如果你有更好的想法,欢迎在评论区留言。让我们一起讨论研究优化。最后,最近有很多朋友找我要一份Linux学习路线图,所以我结合自己的经验,利用业余时间熬夜一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以加入我的行列,把这本电子书做得更加完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站

最新推荐
猜你喜欢