小程序(九)后端 签到1

news2024/11/15 22:44:12

文章目录

  • 一、考勤时间表设计
    • 1、表设计
  • 二、缓存考勤时间
    • 1、mapper.xml
    • 2、常量封装类
  • 三、封装检测当天是否可以签到
    • 1、为什么要检测是否可以签到?
    • 2、怎么判断当天是工作日还是节假日?
    • 3、封装持久层代码
      • 1)查询特殊休息日
      • 2)查询特殊工作日
      • 3)查询当天是否已经签到
    • 4、封装业务层代码
    • 5、封装检测当天是否可以签到(Web层)


一、考勤时间表设计

在 sys_config 数据表中保存了系统的常量配置信息,其中就包括了考勤部分的常量信息。例如每天上班考勤从几点开始,截止到几点。下班考勤从几点开始,几点结束。
因为这些常量信息跟考勤模块息息相关,所以我们要编写Java代码,在SpringBoot项目启动的时
候,就去数据库读取这些常量信息,然后缓存成Java对象,全局都可以使用,当然季节性考勤时间会有变动,所以预留对应的接口修改数据库中时间同时刷新缓存中的时间。

1、表设计

在这里插入图片描述

DROP TABLE IF EXISTS `sys_config`;
CREATE TABLE `sys_config`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `param_key` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '参数名',
  `param_value` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数值',
  `status` tinyint(1) UNSIGNED NOT NULL COMMENT '状态',
  `remark` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_param_key`(`param_key`) USING BTREE,
  INDEX `idx_status`(`status`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of sys_config
-- ----------------------------
INSERT INTO `sys_config` VALUES (1, 'attendance_start_time', '06:00', 1, '上班考勤开始时间');
INSERT INTO `sys_config` VALUES (2, 'attendance_time', '08:30', 1, '上班时间');
INSERT INTO `sys_config` VALUES (3, 'attendance_end_time', '09:30', 1, '上班考勤截止时间');
INSERT INTO `sys_config` VALUES (4, 'closing_start_time', '16:30', 1, '下班考勤开始时间');
INSERT INTO `sys_config` VALUES (5, 'closing_time', '17:30', 1, '下班时间');
INSERT INTO `sys_config` VALUES (6, 'closing_end_time', '23:59', 1, '下班考勤截止时间');

二、缓存考勤时间

1、mapper.xml

  <select id="selectAllParam" resultMap="BaseResultMap">
     SELECT param_key, param_value FROM sys_config WHERE status = 1;
  </select>
@Mapper
public interface SysConfigDao {
    
    List<SysConfig> selectAllParam();
}

2、常量封装类

@Data
@Component
public class SystemConstants {
     public String attendanceStartTime;
     public String attendanceTime;
     public String attendanceEndTime;
     public String closingStartTime;
     public String closingTime;
     public String closingEndTime;
}

在 EmosWxApiApplication.java 文件中创建 init() 方法,读取常量数据并缓存

package com.buba.wechatmini;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.PostConstruct;
import java.lang.reflect.Field;

@SpringBootApplication
@Slf4j
public class WeChatMiNiApplication {

    @Autowired
    private SystemConstants selectAllParam;
    @Autowired
    private SysConfigDao sysConfigDao;

    public static void main(String[] args) {
        SpringApplication.run(WeChatMiNiApplication.class, args);
    }

    @PostConstruct
    public void init() {
         List<SysConfig> list = sysConfigDao.selectAllParam();
         list.forEach(one -> {
             String key = one.getParamKey();
             key = StrUtil.toCamelCase(key);
             String value = one.getParamValue();
             try {
                    Field field = selectAllParam.getClass().getDeclaredField(key);
                    field.set(selectAllParam, value);
                } catch (Exception e) {
                    log.error("执行异常", e);
                }
            });
        }
}

三、封装检测当天是否可以签到

1、为什么要检测是否可以签到?

上面通过封装SystemConstants 系统常量信息,从而得知考勤是分为起止时间的。在考勤开始之前,
用户是不能考勤签到的。同理,在当天考勤结束之后,用户也是不能考勤签到的。甚至节假日也
不能考勤,只有正常的工作日才能考勤签到。

2、怎么判断当天是工作日还是节假日?

在数据库中有 tb_workday 和 tb_holidays 两张数据表,记录着哪天是工作日,哪天是休息日。系统默认周一至周五为工作日,周六周日为休息日。但是这两张表不是把所有的工作日和休息日都记录下来,只是记录比特殊的工作日或者休息日。比如说今年的中秋节赶上了礼拜四,于是就把周五和周六设置成休息日,跟中秋节连成三连休,然后周日正常上班。这种特殊情况我们就要记录下来。在tb_workday 记录周日是工作日,在 tb_holidays 表中记录周五那天是休息日。这样系统在中秋三连休期间不会执行考勤签到。

DROP TABLE IF EXISTS `tb_workday`;
CREATE TABLE `tb_workday`  (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `date` DATE NULL DEFAULT NULL COMMENT '日期',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_date`(`date`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;

DROP TABLE IF EXISTS `tb_holidays`;
CREATE TABLE `tb_holidays`  (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `date` DATE NOT NULL COMMENT '日期',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_date`(`date`) USING BTREE
) ENGINE = INNODB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '节假日表' ROW_FORMAT = DYNAMIC;

3、封装持久层代码

1)查询特殊休息日

在 TbHolidaysDao.xml 文件中,添加查询语句

  <select id="searchTodayIsHolidays" resultType="Integer">
   SELECT id FROM tb_holidays WHERE date=CURRENT_DATE LIMIT 1;
  </select>

在 TbHolidaysDao.java 文件中,添加抽象方法

@Mapper
public interface TbHolidaysDao {
    Integer searchTodayIsHolidays();
}

2)查询特殊工作日

在 TbWorkdayDao.xml 文件中,添加查询语句

   <select id="searchTodayIsWorkday" resultType="Integer">
       SELECT id FROM tb_workday WHERE date=CURRENT_DATE LIMIT 1;
   </select>

在 TbWorkdayDao.java 文件中,添加抽象方法

@Mapper
public interface TbWorkdayDao {
    Integer searchTodayIsWorkday();
}

3)查询当天是否已经签到

tb_checkin 表结构如下,系统不仅要记录考勤的人员、时间,还要记录考勤人的地理坐标。
在这里插入图片描述

DROP TABLE IF EXISTS `tb_checkin`;
CREATE TABLE `tb_checkin`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` int(10) UNSIGNED NOT NULL COMMENT '用户ID',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '签到地址',
  `country` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '国家',
  `province` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '省份',
  `city` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '城市',
  `district` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '区划',
  `status` tinyint(3) UNSIGNED NOT NULL COMMENT '考勤结果',
  `risk` int(255) UNSIGNED NULL DEFAULT 0 COMMENT '风险等级',
  `date` date NOT NULL COMMENT '签到日期',
  `create_time` datetime(0) NOT NULL COMMENT '签到时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_user_id`(`user_id`, `date`) USING BTREE,
  INDEX `idx_date`(`date`) USING BTREE,
  INDEX `idx_status`(`status`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '签到表' ROW_FORMAT = DYNAMIC;

在 TbCheckinDao.xml 文件中,添加查询语句

  <select id="haveCheckin" parameterType="HashMap" resultType="Integer">
     SELECT id
          FROM tb_checkin
          WHERE user_id = #{userId} AND date = CURRENT_DATE
          AND create_time BETWEEN #{start} AND #{end}
          LIMIT 1;
 </select>

在 TbCheckinDao.java 文件中,添加抽象方法

@Mapper
public interface TbCheckinDao {
    Integer haveCheckin(HashMap param);
}

4、封装业务层代码

检测是否可以考勤

@Service
@Scope("prototype")
@Slf4j
public class CheckinService {
   @Autowired
    private SystemConstants systemConstants;
    @Autowired
    private TbHolidaysDao holidaysDao;
    @Autowired
    private TbWorkdayDao workdayDao;
    @Autowired
    private TbCheckinDao checkinDao;

 public String validCanCheckIn(int userId, String date) {
       boolean bool_1 = holidaysDao.searchTodayIsHolidays() != null ? true : false;
       boolean bool_2 = workdayDao.searchTodayIsWorkday() != null ? true : false;
       String type = "工作日";
      if (DateUtil.date().isWeekend()) {
          type = "节假日";
      }
      if (bool_1) {
          type = "节假日";
      } else if (bool_2) {
          type = "工作日";
      }
      if (type.equals("节假日")) {
         return "节假日不需要考勤";
      } else {
         DateTime now = DateUtil.date();
         String start = DateUtil.today() + " " + systemConstants.attendanceStartTime;
         String end = DateUtil.today() + " " + systemConstants.attendanceEndTime;
         DateTime attendanceStart = DateUtil.parse(start);
         DateTime attendanceEnd = DateUtil.parse(end);
         if (now.isBefore(attendanceStart)) {
            return "没有到上班考勤开始时间";
         } else if (now.isAfter(attendanceEnd)) {
            return "超过了上班考勤结束时间";
         } else {
            HashMap map = new HashMap();
            map.put("userId", userId);
            map.put("date", date);
            map.put("start", start);
            map.put("end", end);
            boolean bool = checkinDao.haveCheckin(map) != null ? true : false;
            return bool ? "今日已经考勤,不用重复考勤" : "可以考勤";
         }
      }
   }
}

5、封装检测当天是否可以签到(Web层)

/**
 * @author qlx
 */
@RequestMapping("/checkin")
@RestController
@Api("签到模块Web接口")
@Slf4j
public class CheckinController {
    @Autowired
    private JwtUtil jwtUtil;
    @Autowired
    private CheckinService checkinService;
    
    @GetMapping("/validCanCheckIn")
    @ApiOperation("查看用户今天是否可以签到")
    public Result validCanCheckIn(@RequestHeader("token") String token) {
          int userId = jwtUtil.getUserId(token);
          String result = checkinService.validCanCheckIn(userId, DateUtil.today());
          return Result.ok(result);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jjava企业级开发-01

一、Spring容器演示 采用Spring配置文件管理Bean 1、创建Maven项目 修改项目的Maven配置 2、添加Spring依赖 在Maven仓库里查找Spring框架&#xff08;https://mvnrepository.com&#xff09; 同上添加其他依赖 <?xml version"1.0" encoding"UTF-8…

stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)

文章目录一、uart_init&#xff08;串口初始化&#xff09;二、USART1_IRQHandler&#xff08;串口1中断服务程序&#xff09;三、main.c&#xff08;主函数&#xff09;四、关于printf的支持一、uart_init&#xff08;串口初始化&#xff09; 就是根据上一篇的一样的步骤&…

数据结构之树

树是一种数据结构 包括&#xff1a; 根节点 度&#xff1a;每一个节点的子节点个数 左子节点&#xff1a;左下方的节点 右子节点&#xff1a;右下方的节点 左子树 右子树 树的内部结构 二叉查找树 又称二叉搜索树或者二叉排序树 特点 每一个节点最多只有两个节点 任…

【强化学习】解决gym安装Atari2600环境gym[atari,accept-rom-license] RuntimeError 无法下载Roms的问题

先上Roms.tar.gz安装地址&#xff1a;Roms.tar.gz 以下内容是解决问题的思路&#xff0c;如果已经完全知道问题原因可以直接跳过 安装gym[accept-rom-license]时会出现安装失败的情况: 先是卡在&#xff1a;Building wheel for AutoROM.accept-rom-license 然后是显示安装失败…

非常优秀的网站设计案例,设计师必备

厚积才能薄发&#xff0c;一个优秀的设计师的天性一定是想要获得更多网站设计灵感&#xff0c;擅于为新项目寻找创意切入点、搜索设计参考资源、最新的设计趋势。今天为大家带来了一组免费可商用的网站设计案例&#xff0c;通过这些网站设计案例&#xff0c;你可以获得&#xf…

To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

java项目发布到kubernetes集群中&#xff0c;报错 SEVERE: The web application [] registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has …

Obsidium一键编码作业,Obsidia惊人属性

Obsidium一键编码作业,Obsidia惊人属性 每个区域都包含几个可定制的功能&#xff0c;允许用户确定如何完全执行应用程序的安全性。Obsidia的功能区允许用户存储任何调整或一键编码作业。 Obsidia惊人属性&#xff1a; 代码虚拟化&#xff1a;代码虚拟化允许您转换程序代码的特定…

【电商】库存管理

库存管理&#xff0c;简单的说&#xff0c;就是管理商品和数量之间的关系。库存系统是电商后台系统中不可或缺的一部分 在电商系统中商品库存是非常重要的&#xff0c;在财务进销存系统中也梳理过存货的内容&#xff0c;在销售系统和仓库中的库存有什么区别&#xff1f; 一、什…

SSH 服务支持弱加密算法

漏洞扫描有SSH 服务支持弱加密算法&#xff0c;解决方案有两个&#xff1a; 方案一&#xff1a;修改 SSH 配置文件&#xff0c;添加加密算法&#xff1a; vi /etc/ssh/sshd_config 最后添加一下内容&#xff08;去掉 arcfour、arcfour128、arcfour256 等弱加密算法&#xff09;…

教你数分钟内创建并运行一个 DolphinScheduler Workflow

点击蓝字 关注我们作者 | 鲍亮&#xff0c;Apache DolphinScheduler PMC Member01Workflow是什么&#xff1f;对于数仓场景和数据湖场景来说&#xff0c;最显著的特点就是数据处理的长流程和高复杂度任务依赖关系&#xff0c;从源数据采集到最终报表数据的生成&#xff0c;中间…

边玩边学,13个 Python 小游戏真有趣啊(含源码)

经常听到有朋友说&#xff0c;学习编程是一件非常枯燥无味的事情。其实&#xff0c;大家有没有认真想过&#xff0c;可能是我们的学习方法不对&#xff1f; 比方说&#xff0c;你有没有想过&#xff0c;可以通过打游戏来学编程&#xff1f; 今天我想跟大家分享几个Python小游…

Docker网络模式解析

目录 前言 一、常用基本命令 &#xff08;一&#xff09;查看网络 &#xff08;二&#xff09;创建网络 &#xff08;三&#xff09;查看网络源数据 &#xff08;四&#xff09;删除网络 二、网络模式 &#xff08;一&#xff09;总体介绍 &#xff08;二&#xff09…

使用SpringBoot实现无限级评论回复功能

评论功能已经成为APP和网站开发中的必备功能。本文采用springbootmybatis-plus框架,通过代码主要介绍评论功能的数据库设计和接口数据返回。我们返回的格式可以分两种方案,第一种方案是先返回评论,再根据评论id返回回复信息,第二种方案是将评论回复直接封装成一个类似于树的数据…

Coremail新春分享会:解读Coremail产品新亮点、邮件安全新趋势

2月15日&#xff0c;由Coremail主办的 “新年‘邮’新意 Coremail新春分享会”在线上直播间重磅开启&#xff01;现场分享精彩纷呈&#xff0c;好礼持续放送&#xff0c;场面火爆&#xff0c;收获观众过万点赞&#xff01; 直播现场 嘉宾分享了哪些行业干货&#xff1f;直播现场…

大数据开发-Linux环境搭建

1、操作系统 1.1 计算机原理 冯诺依曼结构&#xff1a;把程序当作数据存储在计算机存储设备中。 冯诺依曼三个基本原则&#xff1a; 采用二进制逻辑程序存储执行计算机由五个部分组成&#xff1a;运算器、控制器、储存器、输入和输出设备 计算机由软件和硬件组成&#xff0c…

图床(Typora + uPic/PicGo+ 七牛云)

图床&#xff08;Typora uPic/PicGo 七牛云&#xff09; 笔者平时使用 Typora 编写 markdown 文档&#xff0c;文档中常常会放置图片&#xff0c;如果文档不需要分享的话&#xff0c;其实讲图片存放在本地就可以了。由于我有在多台机器编写 markdown 笔记&#xff0c;还有将…

OAK相机跑各种yolo模型的检测帧率和深度帧率

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…

Python字符串处理 -- 内附蓝桥题:门牌制作,卡片

字符串处理 ~~不定时更新&#x1f383;&#xff0c;上次更新&#xff1a;2023/02/20 &#x1f5e1;常用函数&#xff08;方法&#xff09; 1. s.count(str) --> 计算字符串 s 中有多少个 str 举个栗子&#x1f330; s "1354111" print(s.count(1)) # 答案为…

Docker 安装nacos并且配置数据库持久化(无脑CV版)

我们以运行ruoyi-cloud项目为例子 在安装之前请注意版本对应问题 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 由于我的是2021.0.4.0&#xff0c;因此安装2.0.4版本 否则可能会出现以下错误 在若依的issue有解决方案https:…

UnsupportedOperationException

原因&#xff1a;返回值为list时&#xff0c;返回值类型应为具体的类型参考文章&#xff1a;(139条消息) mybatis中返回结果类型为集合类型&#xff08;List、Map&#xff09;_毒毒毒毒丶的博客-CSDN博客_mybatis返回list<map>集合UnsupportedOperationException 是用于表…