当前位置: 首页 > article >正文

企业级公司日常考勤系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要现代企业管理中考勤管理是人力资源管理的核心环节之一直接影响企业的运营效率和员工的工作积极性。传统考勤方式依赖人工记录容易出现数据错误、效率低下等问题难以满足企业精细化管理的需求。随着信息技术的快速发展数字化考勤系统成为企业提升管理效率的重要工具。基于SpringBootVueMyBatis架构的企业级考勤管理系统能够实现考勤数据的自动化采集、存储和分析有效减少人为干预提高数据的准确性和实时性。该系统适用于中大型企业能够满足多部门、多角色的协同管理需求为企业决策提供数据支持。关键词企业考勤管理、数字化、自动化、SpringBoot、Vue、MyBatis。本系统采用前后端分离架构后端基于SpringBoot框架实现高效稳定的业务逻辑处理前端使用Vue.js构建动态交互界面提升用户体验。数据库采用MySQL存储考勤数据结合MyBatis实现灵活的数据操作。系统功能包括员工信息管理、考勤记录统计、请假审批、报表生成等模块支持多维度数据分析。系统通过人脸识别或指纹识别技术实现精准考勤并支持移动端访问方便员工随时随地查看考勤状态。关键词前后端分离、人脸识别、移动端、数据分析、请假审批。数据表员工信息数据表员工信息数据表用于存储员工的基本信息包括姓名、部门、职位等属性。员工编号是该表的主键入职时间通过函数自动获取。结构表如表1所示。表1 员工信息数据表employee_info字段名数据类型说明emp_idVARCHAR(20)员工编号主键emp_nameVARCHAR(50)员工姓名emp_deptVARCHAR(50)所属部门emp_positionVARCHAR(50)职位emp_join_dateDATETIME入职时间emp_contactVARCHAR(20)联系方式考勤记录数据表考勤记录数据表存储员工的每日考勤数据包括打卡时间、考勤状态等信息。记录编号是该表的主键打卡时间由系统自动记录。结构表如表2所示。表2 考勤记录数据表attendance_log字段名数据类型说明log_idVARCHAR(20)记录编号主键emp_idVARCHAR(20)员工编号check_in_timeDATETIME上班打卡时间check_out_timeDATETIME下班打卡时间attendance_statusVARCHAR(10)考勤状态正常/迟到/早退/缺勤请假审批数据表请假审批数据表用于管理员工的请假申请及审批流程包括请假类型、审批状态等。申请编号是该表的主键提交时间由系统自动生成。结构表如表3所示。表3 请假审批数据表leave_application字段名数据类型说明apply_idVARCHAR(20)申请编号主键emp_idVARCHAR(20)员工编号leave_typeVARCHAR(20)请假类型病假/事假/年假start_dateDATE请假开始日期end_dateDATE请假结束日期apply_statusVARCHAR(10)审批状态待审批/已通过/已拒绝submit_timeDATETIME提交时间博主介绍✨专业背景专注Java企业级开发与小程序生态全网影响力10万开发者CSDN特邀作者、技术专家、新星计划导师。 核心服务 毕业设计智库微信小程序方向100个前沿选题 Java企业级方向500个实战选题 项目实战宝库3000精品案例✨专业指导选题策略规划量身定制技术路线 架构设计指导企业级应用构建 论文写作辅导技术文档专业化详细视频演示请联系我获取更详细的演示视频系统介绍直接拿走意外获得200多套代码需要的滴我企业级公司日常考勤系统管理系统源码SpringBootVueMyBatis架构MySQL数据库【完整版】可提供说明文档通过AIGC功能参考截图文档参考技术架构栈 后端技术Spring BootSpring Boot 作为现代Java企业级开发的核心框架以其**“约定优于配置”**的设计哲学重新定义了应用开发模式。 核心特性解析零配置启动集成自动配置机制大幅减少XML配置文件编写 嵌入式服务器内置Tomcat/Jetty/Undertow支持独立JAR包部署生产就绪集成Actuator监控组件提供健康检查、指标收集等企业级特性 微服务友好天然支持分布式架构与SpringCloud生态无缝集成开发优势通过Starter依赖体系和智能自动装配开发者可将精力完全聚焦于业务逻辑实现而非底层基础设施搭建。单一可执行JAR的部署模式极大简化了运维流程。 前端技术Vue.jsVue.js 以其渐进式框架设计和卓越的开发体验成为现代前端开发的首选解决方案。 技术亮点响应式数据流基于依赖追踪的响应式系统实现高效的视图更新 组件化架构单文件组件SFC设计实现样式、逻辑、模板的完美封装灵活的渐进式设计可从简单的视图层库扩展至完整的SPA解决方案 丰富的生态系统Vue Router、Vuex/Pinia、VueCLI等官方工具链完备开发效率直观的模板语法结合强大的指令系统让复杂的用户交互变得简洁明了。优秀的TypeScript支持和开发者工具为大型项目提供可靠的开发保障。核心代码package com;importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.builder.SpringApplicationBuilder;importorg.springframework.boot.web.servlet.support.SpringBootServletInitializer;SpringBootApplication MapperScan(basePackages{com.dao})publicclassSpringbootSchemaApplicationextends SpringBootServletInitializer{publicstaticvoidmain(String[]args){SpringApplication.run(SpringbootSchemaApplication.class,args);}OverrideprotectedSpringApplicationBuilderconfigure(SpringApplicationBuilder applicationBuilder){returnapplicationBuilder.sources(SpringbootSchemaApplication.class);}}package com.controller;importjava.math.BigDecimal;importjava.text.SimpleDateFormat;importjava.text.ParseException;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Calendar;importjava.util.Map;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Date;importjava.util.List;importjavax.servlet.http.HttpServletRequest;importcom.utils.ValidatorUtils;importorg.apache.commons.lang3.StringUtils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.transaction.annotation.Transactional;importorg.springframework.format.annotation.DateTimeFormat;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importcom.baomidou.mybatisplus.mapper.EntityWrapper;importcom.baomidou.mybatisplus.mapper.Wrapper;importcom.annotation.IgnoreAuth;importcom.entity.YonghuEntity;importcom.entity.view.YonghuView;importcom.service.YonghuService;importcom.service.TokenService;importcom.utils.PageUtils;importcom.utils.R;importcom.utils.MPUtil;importcom.utils.MapUtils;importcom.utils.CommonUtil;importjava.io.IOException;/** * 用户 * 后端接口 * author * email * date 2024-04-24 17:59:31 */RestController RequestMapping(/yonghu)publicclassYonghuController{AutowiredprivateYonghuService yonghuService;AutowiredprivateTokenService tokenService;/** * 登录 */IgnoreAuth RequestMapping(value/login)publicRlogin(String username,String password,String captcha,HttpServletRequest request){YonghuEntity uyonghuService.selectOne(newEntityWrapperYonghuEntity().eq(yonghuzhanghao,username));if(unull||!u.getMima().equals(password)){returnR.error(账号或密码不正确);}String tokentokenService.generateToken(u.getId(),username,yonghu,用户);returnR.ok().put(token,token);}/** * 注册 */IgnoreAuth RequestMapping(/register)publicRregister(RequestBody YonghuEntity yonghu){//ValidatorUtils.validateEntity(yonghu);YonghuEntity uyonghuService.selectOne(newEntityWrapperYonghuEntity().eq(yonghuzhanghao,yonghu.getYonghuzhanghao()));if(u!null){returnR.error(注册用户已存在);}Long uIdnewDate().getTime();yonghu.setId(uId);yonghuService.insert(yonghu);returnR.ok();}/** * 退出 */RequestMapping(/logout)publicRlogout(HttpServletRequest request){request.getSession().invalidate();returnR.ok(退出成功);}/** * 获取用户的session用户信息 */RequestMapping(/session)publicRgetCurrUser(HttpServletRequest request){Long id(Long)request.getSession().getAttribute(userId);YonghuEntity uyonghuService.selectById(id);returnR.ok().put(data,u);}/** * 密码重置 */IgnoreAuth RequestMapping(value/resetPass)publicRresetPass(String username,HttpServletRequest request){YonghuEntity uyonghuService.selectOne(newEntityWrapperYonghuEntity().eq(yonghuzhanghao,username));if(unull){returnR.error(账号不存在);}u.setMima(123456);yonghuService.updateById(u);returnR.ok(密码已重置为123456);}/** * 后台列表 */RequestMapping(/page)publicRpage(RequestParam MapString,Objectparams,YonghuEntity yonghu,HttpServletRequest request){EntityWrapperYonghuEntityewnewEntityWrapperYonghuEntity();PageUtils pageyonghuService.queryPage(params,MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew,yonghu),params),params));returnR.ok().put(data,page);}/** * 前台列表 */IgnoreAuth RequestMapping(/list)publicRlist(RequestParam MapString,Objectparams,YonghuEntity yonghu,HttpServletRequest request){EntityWrapperYonghuEntityewnewEntityWrapperYonghuEntity();PageUtils pageyonghuService.queryPage(params,MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew,yonghu),params),params));returnR.ok().put(data,page);}/** * 列表 */RequestMapping(/lists)publicRlist(YonghuEntity yonghu){EntityWrapperYonghuEntityewnewEntityWrapperYonghuEntity();ew.allEq(MPUtil.allEQMapPre(yonghu,yonghu));returnR.ok().put(data,yonghuService.selectListView(ew));}/** * 查询 */RequestMapping(/query)publicRquery(YonghuEntity yonghu){EntityWrapperYonghuEntityewnewEntityWrapperYonghuEntity();ew.allEq(MPUtil.allEQMapPre(yonghu,yonghu));YonghuView yonghuViewyonghuService.selectView(ew);returnR.ok(查询用户成功).put(data,yonghuView);}/** * 后台详情 */RequestMapping(/info/{id})publicRinfo(PathVariable(id)Long id){YonghuEntity yonghuyonghuService.selectById(id);returnR.ok().put(data,yonghu);}/** * 前台详情 */IgnoreAuth RequestMapping(/detail/{id})publicRdetail(PathVariable(id)Long id){YonghuEntity yonghuyonghuService.selectById(id);returnR.ok().put(data,yonghu);}/** * 后台保存 */RequestMapping(/save)publicRsave(RequestBody YonghuEntity yonghu,HttpServletRequest request){if(yonghuService.selectCount(newEntityWrapperYonghuEntity().eq(yonghuzhanghao,yonghu.getYonghuzhanghao()))0){returnR.error(用户账号已存在);}yonghu.setId(newDate().getTime()newDouble(Math.floor(Math.random()*1000)).longValue());//ValidatorUtils.validateEntity(yonghu);YonghuEntity uyonghuService.selectOne(newEntityWrapperYonghuEntity().eq(yonghuzhanghao,yonghu.getYonghuzhanghao()));if(u!null){returnR.error(用户已存在);}yonghu.setId(newDate().getTime());yonghuService.insert(yonghu);returnR.ok();}/** * 前台保存 */RequestMapping(/add)publicRadd(RequestBody YonghuEntity yonghu,HttpServletRequest request){if(yonghuService.selectCount(newEntityWrapperYonghuEntity().eq(yonghuzhanghao,yonghu.getYonghuzhanghao()))0){returnR.error(用户账号已存在);}yonghu.setId(newDate().getTime()newDouble(Math.floor(Math.random()*1000)).longValue());//ValidatorUtils.validateEntity(yonghu);YonghuEntity uyonghuService.selectOne(newEntityWrapperYonghuEntity().eq(yonghuzhanghao,yonghu.getYonghuzhanghao()));if(u!null){returnR.error(用户已存在);}yonghu.setId(newDate().getTime());yonghuService.insert(yonghu);returnR.ok();}/** * 修改 */RequestMapping(/update)TransactionalpublicRupdate(RequestBody YonghuEntity yonghu,HttpServletRequest request){//ValidatorUtils.validateEntity(yonghu);if(yonghuService.selectCount(newEntityWrapperYonghuEntity().ne(id,yonghu.getId()).eq(yonghuzhanghao,yonghu.getYonghuzhanghao()))0){returnR.error(用户账号已存在);}yonghuService.updateById(yonghu);//全部更新returnR.ok();}/** * 删除 */RequestMapping(/delete)publicRdelete(RequestBody Long[]ids){yonghuService.deleteBatchIds(Arrays.asList(ids));returnR.ok();}}文章下方名片联系我即可~✌大家点赞、收藏、关注、评论啦 、查看✌获取联系方式精彩专栏推荐订阅在下方专栏

相关文章:

企业级公司日常考勤系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 现代企业管理中,考勤管理是人力资源管理的核心环节之一,直接影响企业的运营效率和员工的工作积极性。传统考勤方式依赖人工记录,容易出现数据错误、效率低下等问题,难以满足企业精细化管理的需求。随着信息技术的快速发展&am…...

Quartus Prime 18.0 标准版安装Cyclone V器件库,别再傻傻双击图标了!

Quartus Prime 18.0标准版安装Cyclone V器件库的完整避坑指南 当你第一次尝试在Quartus Prime 18.0标准版中安装Cyclone V器件库时,可能会遇到一个看似简单却令人困惑的问题——明明按照常规操作双击软件图标,却在点击"Install Device..."时遭…...

程序员学英语:用词根‘ori’和‘pan’搞定技术文档里的‘起源’与‘伙伴’

程序员学英语:用词根‘ori’和‘pan’破解技术文档高频词 技术文档里那些似懂非懂的英文词汇,往往成为程序员阅读源码、理解API的隐形门槛。当你在GitHub看到origin remote时,是否思考过为什么代码仓库的默认远程分支叫这个名字?当…...

AI驱动的消防员呼吸保护系统:闭环控制与动态优化

1. 消防员生命支持系统的技术挑战与AI解决方案在高温、有毒、低氧的火灾现场,消防员的呼吸保护装备直接关系到任务成败与人身安全。传统自给式呼吸器(SCBA)采用开环设计,氧气利用率不足30%,且无法动态调节供氧策略。我们团队开发的Galactic B…...

AI Workspace:统一管理团队AI编程工具配置与技能的工程实践

1. 项目概述:AI Workspace 是什么,以及它解决了什么问题如果你和你的团队已经开始在日常开发中大量使用 Cursor、Claude Code、GitHub Copilot 这类 AI 编程工具,那你一定遇到过下面这些让人头疼的场景:你在一个前端项目里&#x…...

Zenity实战:用Shell脚本构建轻量级GTK图形界面

1. Zenity入门:Shell脚本的图形化神器 第一次在终端里看到Zenity弹出一个日历对话框时,我正对着黑底白字的命令行界面发呆。原本需要用户输入复杂日期格式的脚本,突然变成了直观的图形化选择,这种转变让我意识到:原来给…...

基于Alexa与AWS Lambda的港铁实时查询语音技能开发实战

1. 项目概述:一个为香港地铁通勤者打造的智能助手如果你在香港生活或工作,每天依赖港铁(MTR)通勤,那么“下一班车几点到?”这个问题,恐怕是你每天都要问上好几遍的灵魂拷问。站台上人潮涌动&…...

5分钟掌握ComfyUI_essentials:解锁AI绘画的终极创作工具箱

5分钟掌握ComfyUI_essentials:解锁AI绘画的终极创作工具箱 【免费下载链接】ComfyUI_essentials 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_essentials 还在为ComfyUI中缺少关键功能而烦恼吗?ComfyUI_essentials就是你的终极解决方案…...

IWR1642与mmWave Studio实战:从参数配置到数据解析的完整指南

1. IWR1642与mmWave Studio初探:为什么参数配置如此重要 第一次接触TI的IWR1642评估板和mmWave Studio软件时,很多人会被各种参数搞得晕头转向。我刚开始用的时候也是这样,看着界面上密密麻麻的选项,完全不知道从哪下手。后来才发…...

解决跨平台表情显示难题:Noto Emoji技术实现深度解析

解决跨平台表情显示难题:Noto Emoji技术实现深度解析 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji 在当今数字通信时代,表情符号已成为不可或缺的表达元素。然而,开发者面临…...

从售前到落地:我是如何用Apache Atlas 2.0 + Hive/Sqoop为数据治理项目搭建元数据管理原型的

从售前到落地:构建数据治理原型的实战指南 去年夏天,我接到一个紧急任务:客户要求在两周内看到数据治理方案的实际效果演示。这不是普通的POC,而是一次决定数百万合同成败的关键验证。经过72小时不眠不休的技术攻关,我…...

snip CLI代理:为AI编程助手智能过滤终端输出,节省90%以上令牌成本

1. 项目概述:snip,一个为AI编程助手节省60-90%上下文令牌的CLI代理 如果你和我一样,每天都在用Claude Code、Cursor或者GitHub Copilot这类AI编程助手,那你肯定也遇到过这个让人头疼的问题:每次让AI运行一个简单的 g…...

深入探讨.NET 6中WeakHandle的垃圾回收机制

在.NET框架中,垃圾回收(Garbage Collection, GC)是管理内存的重要机制之一。而在.NET 6版本中,我们发现了一个关于弱引用(Weak Reference)的有趣现象。下面我们将通过一个实例来详细分析这个问题。 问题描述 以下是一个简单的C#代码示例,展示了在.NET 6下使用GCHandle…...

神经网络训练绝对值函数的奥秘

在机器学习和深度学习的世界里,神经网络的训练过程充满了各种有趣的现象和挑战。本文将详细讨论如何使用神经网络来拟合一个看似简单的函数——绝对值函数(|x|),并探讨为何在某些情况下需要增加网络的层数来获得更好的拟合效果。 问题背景 假设我们想用神经网络来学习函数…...

主机上的数据管理:如何创建和管理记录结构化的PS文件

在主机环境中工作,尤其是对于新手来说,理解和操作数据集的结构化存储是一个关键技能。今天,我们将详细探讨如何在IBM主机上创建和管理一个结构化的物理顺序(PS)文件,用于记录月度支出,并通过实例一步步讲解如何完成这一任务。 1. 创建PS文件 在开始之前,确保您已经熟…...

Excel VBA 动态下拉列表与错误处理

在Excel中使用VBA(Visual Basic for Applications)编写脚本,可以实现许多自动化操作和功能扩展。本文将结合实例,详细介绍如何在Excel中使用VBA创建动态下拉列表,并探讨一些常见的错误及其解决方案。 背景 假设你正在管理一个项目计划表,用户需要能够动态添加和删除行,…...

高效OCR文字识别:Umi-OCR免费离线批量处理工具终极指南

高效OCR文字识别:Umi-OCR免费离线批量处理工具终极指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语…...

ThinkPad风扇控制终极指南:TPFanCtrl2让你的笔记本静音又高效

ThinkPad风扇控制终极指南:TPFanCtrl2让你的笔记本静音又高效 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 ThinkPad用户们,你是否厌倦了笔记…...

115.YOLOv5/v8核心原理(CSPDarknet+SPPF)+ Ultralytics工程实现

摘要 YOLO(You Only Look Once)作为目标检测领域的一阶段经典算法,以端到端、实时性高、精度均衡著称。本文从YOLOv5/v8核心原理出发,系统讲解锚框机制、损失函数、模型结构等关键技术点,并基于Ultralytics官方框架,提供从数据准备、模型训练、评估到推理部署的完整可运…...

114.YOLOv8全流程代码合集,含图像/视频推理+多格式模型导出

摘要 YOLO(You Only Look Once)系列目标检测算法以其端到端的单阶段检测架构,在工业界和学术界获得了广泛应用。本文从YOLO的核心原理出发,系统讲解其技术演进脉络,并基于Ultralytics YOLOv8框架,提供一套完整可运行的实战案例。案例涵盖数据集准备、模型训练、评估、推…...

AI视频生成新范式:通过MCP协议将AITuber集成到Claude与Cursor工作流

1. 项目概述:当AI助手学会“拍视频” 如果你和我一样,每天都要和内容创作打交道,无论是运营社交媒体账号、制作产品介绍,还是批量产出短视频素材,那你肯定体会过那种“创意枯竭”和“执行繁琐”的双重折磨。写脚本、找…...

如何解决ComfyUI核心功能缺失问题?ComfyUI_essentials的设计哲学与实践指南

如何解决ComfyUI核心功能缺失问题?ComfyUI_essentials的设计哲学与实践指南 【免费下载链接】ComfyUI_essentials 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_essentials 你是否曾经在使用ComfyUI构建AI图像生成工作流时,发现某些关键…...

终极指南:用Python轻松获取通达信数据,量化投资不再难

终极指南:用Python轻松获取通达信数据,量化投资不再难 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 你是否曾经为了获取A股行情数据而焦头烂额?是否在复杂的A…...

3步掌握DLSS Swapper:免费游戏性能优化终极指南

3步掌握DLSS Swapper:免费游戏性能优化终极指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款功能强大的免费工具,专门用于管理游戏中的DLSS、FSR和XeSS动态链接库文件。通…...

Python玩转CAD:用ezdxf从零绘制带属性的智能图块(附完整代码)

Python玩转CAD:用ezdxf从零绘制带属性的智能图块(附完整代码) 在工业设计和工程制图领域,CAD软件的自动化操作一直是提升效率的关键。传统手动绘图不仅耗时耗力,还容易在重复性工作中出现人为误差。而Python的ezdxf库为…...

Adobe-GenP 3.0终极指南:三步免费解锁Adobe全家桶创意软件

Adobe-GenP 3.0终极指南:三步免费解锁Adobe全家桶创意软件 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款专为Adobe Creative Clo…...

Calfkit分布式AI Agent SDK:事件驱动架构与微服务化实践

1. 项目概述:为什么我们需要一个“分布式”的AI Agent SDK?如果你最近也在折腾AI Agent,大概率会和我有一样的感受:从LangChain、LlamaIndex到AutoGen,这些框架确实极大地降低了构建智能体的门槛,但当你试图…...

BricksLLM:开源LLM API网关,实现成本控制与精细化管理

1. 项目概述:一个为AI应用量身打造的开源API管理与成本控制平台如果你正在或计划将OpenAI、Anthropic、Azure OpenAI这类大模型API集成到自己的产品中,那么你大概率会遇到几个绕不开的痛点:API调用成本像雪球一样越滚越大,却难以清…...

终极网盘下载加速指南:如何用LinkSwift一键获取九大网盘直链地址

终极网盘下载加速指南:如何用LinkSwift一键获取九大网盘直链地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…...

ThinkPad风扇控制终极指南:TPFanCtrl2让你的笔记本电脑散热更智能

ThinkPad风扇控制终极指南:TPFanCtrl2让你的笔记本电脑散热更智能 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 作为ThinkPad用户,你是否曾经…...