前言你的世界大多充满了混乱和单调。虽然你的身体不胖,但不会让你觉得有力量;悲伤和自我否定,你的过去和未来没有惊喜。你想要一个新的生命,一个重生,没有行动,一切都是幻想,你还忍受着痛苦和软弱。只有一点一滴地积累,才能感受到飞轮转动时的顺畅,才会有彩虹般的动力。一点一滴的积累,需要签到功能。签到在生活中的应用还是很多的,工作签到,健身签到,学习签到等等,其实签到功能的开发还是挺容易的,下面我们一起来实现一下,让我们自己开发它的功能吧!为什么要写一篇关于登录的功能性文章?一个小功能,需要公司的一个系统来实现,也是为了方便日后的审查和优化。特此记录。让我们毫不费力地实施它。数据库设计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){//返回的数据类型Result