从零搭建智能打卡系统(一):项目概述与技术选型

SailTrack
2026-01-06
点 赞
1
热 度
9
评 论
0
  1. 首页
  2. 学习
  3. 从零搭建智能打卡系统(一):项目概述与技术选型

从零搭建智能打卡系统(一):项目概述与技术选型

最近在准备一个Web程序设计课程设计,我和几个同学决定做一个实用的企业考勤管理系统。说实话,一开始我们也没想到这个项目会这么复杂,从简单的打卡功能到人脸识别、数据可视化,一路踩坑无数,但也学到了很多。

今天开始,我想用这个系列文章记录我们开发"智能打卡系统"的全过程,希望能给正在学习Java Web和Vue.js的朋友们一些参考。

一、项目背景与需求分析

1.1 为什么选择考勤系统?

说实话,选择这个项目有几个原因:

首先,考勤系统是企业管理的刚需,有实际应用场景。我们不想做一个"玩具项目",而是希望做出能真正解决实际问题的系统。

其次,这个项目能覆盖Web开发的多个核心知识点:

  • 用户认证与权限管理

  • 前后端分离架构

  • 数据库设计与优化

  • 第三方API集成(人脸识别)

  • 数据可视化展示

最后,我们想挑战一下自己。传统的考勤系统太简单,我们想加入一些"智能"元素,比如人脸识别打卡、智能统计分析等。

1.2 核心功能规划

经过讨论,我们确定了以下几个核心模块:

用户管理模块

  • 用户注册登录(含邮箱验证码)

  • 角色权限管理(管理员、部门经理、普通员工)

  • 部门组织架构

  • 人脸照片上传

智能打卡模块

  • 基础打卡功能(签到/签退)

  • 人脸识别打卡

  • 弹性工作制支持(08:00-10:00签到窗口)

  • 迟到早退自动判定

考勤统计模块

  • 月度考勤统计

  • 工作时长计算

  • 加班时长自动计算

  • 数据可视化图表

请假管理模块

  • 请假申请(事假、病假、年假)

  • 部门经理审批流程

  • 请假记录查询

补卡申请模块

  • 签到/签退补卡申请

  • 补卡审批流程

  • 补卡记录管理

二、技术栈选型

2.1 后端技术选型

选择技术栈时,我们考虑了几个因素:学习成本、社区支持、项目需求。

Spring Boot 4.0

为什么选择Spring Boot?

  • 快速开发,减少配置

  • 丰富的生态和文档

  • 与Java 17完美兼容

  • 内置Tomcat,部署简单

// 项目主启动类示例
@SpringBootApplication
public class BackendApplication {
    public static void main(String[] args) {
        SpringApplication.run(BackendApplication.class, args);
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

数据库:MySQL 8.0

选择MySQL的原因:

  • 稳定可靠,社区活跃

  • 支持JSON类型,适合存储人脸照片URL

  • 与Spring Data JPA集成简单

数据持久化:Spring Data JPA

使用JPA而不是MyBatis:

  • 减少SQL编写,提高开发效率

  • 自动生成基础CRUD操作

  • 支持复杂查询方法命名

// 用户仓库示例
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
    boolean existsByUsername(String username);
    boolean existsByEmail(String email);
}

安全认证:JWT + BCrypt

  • JWT用于无状态认证

  • BCrypt加密用户密码

  • 结合拦截器实现权限控制

2.2 前端技术选型

Vue.js 3.x

选择Vue.js而不是React:

  • 学习曲线平缓,适合团队协作

  • 中文文档完善

  • 与Element Plus集成良好

Element Plus 2.x

为什么选择Element Plus?

  • 组件丰富,满足企业级需求

  • 设计规范,界面美观

  • 社区活跃,问题解决快

构建工具:Vite

放弃Webpack选择Vite:

  • 启动速度快,开发体验好

  • 配置简单,开箱即用

  • 支持热更新,开发效率高

图表库:ECharts

选择ECharts而不是其他图表库:

  • 功能强大,图表类型丰富

  • 中文文档完善

  • 与Vue.js集成简单

2.3 第三方服务集成

人脸识别:阿里云人脸识别API

为什么选择阿里云?

  • 识别准确率高

  • API文档清晰

  • 有免费额度,适合学习使用

邮件服务:163邮箱SMTP

使用163邮箱发送验证码:

  • 配置简单,免费使用

  • 发送速度快

  • 支持SSL加密

对象存储:阿里云OSS

存储人脸照片:

  • 存储成本低

  • 访问速度快

  • 支持CDN加速

三、项目架构设计

3.1 前后端分离架构

我们采用经典的前后端分离架构:

┌─────────────┐    HTTP/HTTPS    ┌─────────────┐
│   前端应用   │◄────────────────►│   后端API    │
│  (Vue.js)   │    JSON数据      │ (Spring Boot)│
└─────────────┘                  └─────────────┘
                                        │
                                        ▼
                                ┌─────────────┐
                                │   数据库     │
                                │   (MySQL)   │
                                └─────────────┘

这种架构的好处:

  • 前后端独立开发,互不干扰

  • 前端可以使用任何技术栈

  • 后端专注于业务逻辑和数据处理

  • 便于后续扩展和维护

3.2 后端分层架构

后端采用经典的三层架构:

┌─────────────────────────────────────────┐
│            Controller层                  │
│   处理HTTP请求,参数验证,调用Service    │
└─────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────┐
│            Service层                     │
│   业务逻辑实现,事务管理                 │
└─────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────┐
│           Repository层                  │
│   数据访问,使用Spring Data JPA         │
└─────────────────────────────────────────┘

3.3 数据库设计

数据库设计我们遵循几个原则:

  1. 表结构尽量简单,避免过度设计

  2. 使用外键约束保证数据完整性

  3. 为常用查询字段添加索引

  4. 合理使用数据类型,避免浪费空间

核心表设计:

  • users:用户表

  • attendance_records:考勤记录表

  • leave_records:请假记录表

  • supplement_records:补卡申请表

  • departments:部门表

  • roles:角色表

四、开发环境搭建

4.1 后端开发环境

# 检查Java版本
java -version
# 输出:java version "17.0.1" 2021-10-19 LTS

# 检查Maven版本
mvn -v
# 输出:Apache Maven 3.8.4

# 创建Spring Boot项目
# 使用Spring Initializr或IDE创建

4.2 前端开发环境

# 检查Node.js版本
node -v
# 输出:v18.17.0

# 检查npm版本
npm -v
# 输出:9.6.7

# 创建Vue项目
npm create vue@latest

4.3 数据库环境

-- 创建数据库
CREATE DATABASE sailtrack 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

-- 创建用户并授权
CREATE USER 'sailtrack'@'%' IDENTIFIED BY 'sailtrackadmin12@';
GRANT ALL PRIVILEGES ON sailtrack.* TO 'sailtrack'@'%';
FLUSH PRIVILEGES;

五、遇到的第一个坑:远程数据库连接

说实话,项目一开始就遇到了问题。我们想使用远程数据库,方便团队协作,但配置起来并不顺利。

5.1 问题描述

application.properties中配置了远程数据库:

spring.datasource.url=jdbc:mysql://server.wangjunsheng.top:3306/sailtrack
spring.datasource.username=sailtrack
spring.datasource.password=sailtrackadmin12@

启动项目时报错:

Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago.

5.2 问题分析

经过排查,发现几个问题:

  1. 远程服务器防火墙未开放3306端口

  2. MySQL用户权限配置问题

  3. 时区设置不一致

5.3 解决方案

# 修改后的配置
spring.datasource.url=jdbc:mysql://server.wangjunsheng.top:3306/sailtrack?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=sailtrack
spring.datasource.password=sailtrackadmin12@
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

同时需要在服务器上执行:

-- 修改用户权限
ALTER USER 'sailtrack'@'%' IDENTIFIED WITH mysql_native_password BY 'sailtrackadmin12@';
FLUSH PRIVILEGES;

六、项目启动与验证

6.1 后端启动

# 进入后端目录
cd backend

# 清理并构建项目
mvn clean install

# 运行项目
mvn spring-boot:run

看到这个输出,说明后端启动成功:

Started BackendApplication in 3.456 seconds (process running for 3.789)

6.2 前端启动

# 进入前端目录
cd web

# 安装依赖
npm install

# 运行开发服务器
npm run dev

访问 http://localhost:3000 可以看到前端界面。

6.3 接口测试

使用curl测试基础接口:

# 测试健康检查接口
curl http://localhost:8080/api/test/health

# 预期返回
{"ok":true,"code":200,"message":"服务正常运行"}

七、总结与下一步计划

7.1 本章总结

这一章我们主要完成了:

  1. 项目需求分析:明确了系统的核心功能模块

  2. 技术栈选型:选择了合适的前后端技术

  3. 架构设计:设计了前后端分离的架构

  4. 环境搭建:配置了开发环境和远程数据库

  5. 问题解决:解决了远程数据库连接问题

7.2 踩坑经验

通过这个阶段,我学到了几个重要的经验:

第一,技术选型要综合考虑学习成本、项目需求和团队能力。不要盲目追求新技术,适合的才是最好的。

第二,数据库配置要仔细。时区、字符集、SSL设置等细节问题很容易被忽略,但会导致各种奇怪的问题。

第三,文档很重要。我们一开始没有详细记录配置过程,后来遇到问题又要重新排查,浪费了很多时间。

7.3 下一步计划

在下一篇文章中,我将详细介绍:

  1. 用户认证模块的实现:包括注册、登录、邮箱验证码

  2. JWT认证的实现:如何生成和验证Token

  3. 全局异常处理:统一处理业务异常

  4. CORS跨域配置:解决前后端分离的跨域问题

说实话,用户认证这部分我们踩了不少坑,特别是JWT的配置和验证码的实现。下一篇文章我会详细记录这些问题的解决过程。


技术如人生,每一个项目都是一次成长的机会。虽然起步阶段遇到了各种问题,但正是这些问题的解决过程,让我们对技术有了更深的理解。

如果你也在学习Java Web开发,或者正在做一个类似的项目,希望这篇文章能给你一些启发。有问题欢迎在评论区交流,我们一起学习进步!


让我们忠于理想,让我们面对显示

SailTrack

entp 辩论家

站长

具有版权性

请您在转载、复制时注明本文 作者、链接及内容来源信息。 若涉及转载第三方内容,还需一同注明。

具有时效性

文章目录

欢迎来到SailTrack的站点,为您导航全站动态

21 文章数
8 分类数
1 评论数
11标签数