当前位置: 首页 > 科技观察

来吧,你想要的签到功能

时间:2023-03-21 18:11:43 科技观察

前言你的世界大多充满了混乱和单调。虽然你的身体不胖,但不会让你觉得有力量;悲伤和自我否定,你的过去和未来没有惊喜。你想要一个新的生命,一个重生,没有行动,一切都是幻想,你还忍受着痛苦和软弱。只有一点一滴地积累,才能感受到飞轮转动时的顺畅,才会有彩虹般的动力。一点一滴的积累,需要签到功能。签到在生活中的应用还是很多的,工作签到,健身签到,学习签到等等,其实签到功能的开发还是挺容易的,下面我们一起来实现一下,让我们自己开发它的功能吧!为什么要写一篇关于登录的功能性文章?一个小功能,需要公司的一个系统来实现,也是为了方便日后的审查和优化。特此记录。让我们毫不费力地实施它。数据库设计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)NOTNCRULLAint(11)DEFAULTNULLCOMMENT'签到项',`sum`int(11)DEFAULTNULLCOMMENT'总签到次数',`cloop`int(11)DEFAULTNULLCOMMENT'连续签到次数',`name`varchar(25)COLLATEutf8_binDEFAULTNULLCOMMENT'签到人',`dtime`datetimeDEFAULTNULLONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8COLLATE=utf8_bin;DROPTABLEIFEXISTS`clockin_log`;CREATETABLE`clockin_log`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(25)COLLATEutf8_binDEFAULTNULLCOMMENT'checkinperson',`pid`int(11)DEFAULTNULLCOMMENT'checkinitem',`dtime`datetimeDEFAULTNULLCOMMENT'入住时间',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、理解数据表之间的映射关系clockin_log:日志表,存放用户每天的日志信息,该表的数据更新率比较高。在此建议单独使用clockin_project:项目表,在哪个项目上的签到不是必须的,但是为了方便以后的扩展,增加clockin_count:统计表,用户的签到信息在统计日志表比较小,提取起来比较直观。查询数据的使用频率更高。实现思路先判断item是否存在,如果存在则签到,再判断今天是否签到。如果今天没有签到则插入数据,然后判断昨天是否签到。如果您昨天入住,则连续天数和总天数加一。如果您昨天没有入住,请将连续天数设置为1,并将总天数加1。对于语句的写法,我主要使用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-10major这里的代码我用的是MybatisPlus,具体使用可以参考这里Result是我定义了一个结果集包含code-状态码,msg-返回信息,data-数据信息//nameusernamepidprojectnumberpublicResultclock(Stringname,Stringpid){//返回的数据类型Resultresult=newResult<>();//获取昨天的日期Calendarcal=Calendar.getInstance();cal.add(Calendar.DATE,-1);Dateyesterday=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));ClockinProjectproject=clockinProjectService.getOne(wrapper1);//打卡项目是否存在if(!StringUtils.isEmpty(project)){if(isexit){//判断今天是否签到result.setRetCode(Result.ERROR);result.setRetMsg("今天已签到");result.setRowData(one);returnresult;}else{//记录签到信息ClockinLogclockinLog=newClockinLog();clockinLog.setName(name).setPid(Integer.parseInt(pid)).setDtime(LocalDateTime.now());booleansave=clockinLogService.save(clockinLog);if(save){//数据是否插入成功BooleanyesterdayIsexit=clockinLogService.selectClockinYesterdayIsexit(name,Integer.parseInt(pid),yesterday);System.err.println("yesterdayIsexit->"+yesterdayIsexit);if(yesterdayIsexit){//判断你昨天是否登录过System.err.println("Isignedinyesterday");//更新签到数ClockinCountcc=newClockinCount();LambdaUpdateWrapperupdateWrapper=newLambdaUpdateWrapper<>();updateWrapper.eq(ClockinCount::getPid,Integer.parseInt(pid)).eq(ClockinCount::getName,name);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,name);cc.setSum(one.getSum()+1).setCloop(1);clockinCountService.update(cc,updateWrapper);}else{//插入数据信息ClockinCountcc=newClockinCount();cc.setCloop(1).setName(name).setPid(Integer.parseInt(pid)).setSum(1).setDtime(LocalDateTime.now());clockinCountService.save(cc);}}one=clockinCountService.getOne(wrapper);result.setRetCode(Result.SUCCESS);result.setRetMsg("成功");result.setRowData(one);returnresult;}}}else{result.setRetCode(Result.ERROR);result.setRetMsg("失败");result.setRowData("签到项没有notexist");}returnnull;}小结本文主要介绍用Java编写一个登录功能的主要过程。签到主要是记录一个人阶段性的努力。签到功能可以完美解决督促自己学习等问题。以上就是本文的主要代码和思路。本文经授权转载自公众号“良墟Linux”。世界500强外企Linux开发工程师梁旭,在公众号分享大量Linux干货,欢迎关注!