智能考勤系统的设计与实现


智能考勤系统的设计与实现

**摘要:**在经历过疫情严重的生活后,网上招聘就业越来越流行,人才市场就业愈发激烈,所以使用开发工具IDEA、SPRING等技术学习开发的企业智能考勤信息系统。帮助企业更高效的管理员工信息以及上下班考勤情况。此企业考勤系统主要包括系统主管理员模块、企业管理模块、员工上下班考勤和请假、部门薪资等一系列结合而成。该系统可以方便信息的共享和管理、提高人力资源管理效率以及实现薪资数据自动汇总分析。综上所述,该系统对于企业而言,不仅能够提高管理效率,降低管理成本,而且能够加强对人力资源的管理、实现对企业的整体监控,对企业的长期稳定发展具有一定的帮助作用。

**关键词:**企业考勤 人事 薪资管理 JAVA SPRING

引言

企业考勤管理系统的理论最早起源于西方发达国家,它是市场经济高度发达和现代社会化大生产发展的产物。考勤系统的理念提出历史已经十分悠久,而且经过长时间的实践和验证,已经不断完善成为公司必不可少的体系结构,在各个领域都及早地实现了由人力管理转向计算机管理的模式。企业考勤管理系统是为了解决职工考勤管理问题而设计的,目的是要实现对职工考勤的智能化、规范化管理,帮助考勤工作人员利用计算机技术方便快速的对企业各个部门的考勤信息进行管理,使散乱的考勤信息能够具体化、直观化。这样,系统所需的考勤工作人员数量减少,同时也减轻了他们的负担,有利于提高企业考勤管理的效率。而且企业考勤管理系统运用计算机管理技术,并通过不断的实践和修改,避免了人为管理的一些主观问题,运用最少的人力资源,实现员工考勤的高效管理。

1 系统开发技术

系统开发工具及环境如表1-1所示

表1-1 系统开发工具及环境
| 序号 | 开发工具及环境 | 版本号 | | ---- | -------------- | ------ | | 1 | Windows | 10 | | 2 | Java JDK | 1.8 | | 3 | Idea | 2020 | | 4 | Tomcat | 9.0 | | 5 | MySQL | 5.7 |

企业考勤管理系统基于idea软件开发平台,采用三层体系结构、B/S模式,采用Tomcat9.0作为服务器管理程序,在服务器端用JSP编写程序,实现客户机和服务器之间的交互功能。运用JDBC实现和数据库服务器上的MySQL数据库的数据交换。用户通过在客户端登录进入系统,借助IE浏览器访问Web服务器,即实现客户端与web服务器之间信息的存储与传递。本系统主要应用的技术是数据库的JDBC技术、SQL语句、JSP的内建对象以及JavaBean。

  1. 将整个企业考勤管理系统开发过程进行划分。

  2. 使用了SSM+JSP的开发方式,自下而上进行开发。

  3. 先完成管理方面业务,再进行普通员工的业务开发。

  4. 在系统分析以及系统设计时,先进行对整体的分析,在进行模块的细分。

  5. 在系统实施阶段从基本模块开始,按照系统设计要求完成模块,再逐步拼接模块进行调试,最终完成整个系统

1.1 IDEA 2020

IDEA全称IntelliJ IDEA,是Java语言开发的集成环境,是JetBrains公司的产品。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、Java EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、创新的GUI设计等方面的功能可以说是超常的。IDEA提倡的是智能编码,目的是减少程序员的工作,其特色功能有智能的选取、丰富的导航模式、历史记录功能等,最突出的功能是调试(Debug),可以对Java代码、JavaScript、JQuery等技术进行调试。因此智能考勤系统使用IDEA进行开发。

1.2 JAVA

Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。Java是功能完善的通用程序设计语言,可以用来开发可靠的、要求严格的应用程序。Java是纯面向对象开发,功能强大,分支众多,没有java不能做的软件。C/S也好B/S也好。从功能上讲,没有语言可以和Java相比。

1.3 JSP

JSP [Java Server Pages],中文名是Java服务器页面,是一个简化的Servlet设计,是一种动态网页技术标准。JSP在传统的网页HTML [标准通用标记语言]的子集文件 [.htm,.html]中插入Java程序段 [Script lets]和JSP标记 [tag],从而形成JSP文件,后缀名为[.jsp]。JSP实现了Html语法中的java扩展(以 <%,%>形式)。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。JSP技术使用Java编程语言编写类XML的tags和script lets,来封装产生动态网页的处理逻辑。网页还能通过tags和script lets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得容易。

1.4 Tomcat

Tomcat服务器是一个开放源代码的免费的轻量级Web应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用。Tomcat可以用来装载Java Web程序,它是一个Servlets容器。它是一个中间件,在B/S架构中,浏览器发出的HTTP请求经过Tomcat中间件,转发到最终的目的服务器上,响应消息再通过Tomcat返回到浏览器。Tomcat所做的事情主要有:开启监听端口监听用户的请求,解析用户发来的HTTP请求然后访问到你指定的应用系统,然后你返回的页面经过Tomcat返回给用户。

2系统需求分析

企业考勤管理系统是企事业单位不可或缺的一部分,最初的考勤管理都是靠人工来完成的。当企业规模比较小的时候,人工可以完成,随着企业的规模越来越大,企业的员工人数也越来越多,人力进行考勤管理必然会造成工作效率低,工作错误增高的问题。因此对于企业来说,开发一个智能化、高效率的企业考勤管理系统是非常有必要的,具有深远的意义。

2.1 系统功能需求分析

智能考勤系统应当具有足以满足企业日常需要的各项功能以方便管理,如下表中所示的八项功能

表2-1 系统功能
| 序号 | 功能名称 | 功能描述 | | ---- | -------- | -------------------------------- | | 01 | 用户管理 | 使用考勤系统的所有用户信息 | | 02 | 部门管理 | 企业所有的部门信息 | | 03 | 职称管理 | 部门的职称 | | 04 | 员工管理 | 企业员工信息 | | 05 | 考勤管理 | 员工打卡签到信息管理员工加班管理 | | 06 | 请假管理 | 员工请假信息申请批准 | | 07 | 公告管理 | 公告信息 | | 08 | 薪资管理 | 薪资信息 |

3 系统设计

3.1 系统体系结构设计

企业考勤管理系统分为三层,具体如图3-1所示。

图3-1 企业考勤管理系统体系结构图
#### 3.2 系统功能结构设计

企业考勤管理系统的模块分为10部分,分别为注册登录、个人信息管理、请假信息管理、员工管理、加班信息管理、考勤信息管理、部门管理、职称管理、公告管理以及薪资管理,如图3-2所示。

图3-2 企业考勤管理系统结构图
系统分为多个角色,可以通过人事部主任账号对员工信息管理,以及对部门信息和职称信息统一管理,不同员工登陆的系统后可以操作不同的菜单功能。具体设计如图3-3、图3-4所示。
图3-3 管理员用例图        图3-4 企业员工用例图
#### 3.3 系统业务流程

管理员可以查看员工的考勤信息。部门主任在员工考勤完成后可以查看员工的考勤信息。人事部员工可以管理各个模块的信息。人事部主任可以管理所有信息同时负责员工的请假加班。具体业务流程如图3-5所示。

图3-5 核心业务流程图
#### 3.4 系统数据流分析
图3-6 顶层数据流图
图3-7 一层数据流图
#### 3.5 数据库概念结构设计

人事部主任可以管理员工信息,员工添加请假信息,人事部主任负责审批请假信息。人事部主任管理员工的加班信息、公告信息。部门信息包括部门名称和部门职能,人事部主任管理部门信息和职能信息。

图3-8 系统整体E-R图
图3-9员工表属性图
员工表的属性图如图3-9所示。其中员工ID为主键。员工通过用户名和密码来登录系统进行考勤。
图3-10 部门表属性图
部门表的属性图如图3-10所示。部门表包括部门信息和部门职能,以及管理人员和联系方式。 img
图3-11 职称表属性图
职能表的属性图如图3-11所示。职能表属于部门信息的一部分, 每个职能有自己的id和编号,名称,以及所属的哪个部门。
图3-12 加班表属性图
加班表的属性图如图3-12所示。加班表负责储存需要加班的员工的信息,开始加班的时间和结束加班的时间。
图3-13 请假表属性图
请假表的属性图如上图3-13所示。请假表负责储存请假员工的信息以及所属部门,请假天数,日期和原因。
图3-14 考勤表属性图
考勤表的属性图如图3-14所示。考勤表负责记录员工的考勤时间,判断员工是否迟到。
图3-15 公告表属性图
公告表的属性图如图3-15所示。公告表负责发布公告信息。

3.6 数据库结构设计

表3-2 数据库关系模式表
| 数据库表 | 关系模式 | | -------------------- | ------------------------------------------------------------ | | `attendance` | ( `id``employee_number``day` `time_type` `start_time` `start_type``end_time` `end_type``work_type` `notes`) | | `department` | ( `id` `department_number` `name` `manager` `telephone` `address` `notes` ) | | `employee` | (`id` `employee_number` `name` `gender` `birthday` `telephone` `email` `address` `photo` `education``department_number` `position_number` `in_time` `password` `notes` ) | | `gonggao` | (`id` `title` `content`) | | `history` | (`id``employee_number` `name``gender` `birthday``telephone``email` `address` `photo` `education``in_time` `out_time` `department_number` `position_number``status` `home``notes`) | | `lea` | (`id` `employee_number` `department_number` `start_time` `end_time``days``reason` `type``manager` `status` `notes`) | | `move` | ( `id` `employee_number` `before` `after` `time` `manager` `notes` ) | | `overtime` | (`id` `department_number` `employee_number` `day``start_time` `end_time` `notes`) | | `position` | ( `id` `position_number` `name` `level` `notes`) | | `rewards_punishment` | (`id``employee_number``type``reason` `money` `time` `manager``notes`) |

每张表具体的逻辑设计及其功能信息如表3-3所示。

表3-3 表
| 数据库表 | 表名 | 表功能 | | ------------ | ---------- | ------------------ | | `attendance` | 考勤表 | 存放考勤的基本信息 | | `department` | 部门表 | 存放部门基本信息 | | `employee` | 员工表 | 存放员工基本信息 | | `gonggao` | 公告表 | 存放公告基本信息 | | `history` | 员工调度表 | 存放档案基本信息 | | `lea` | 请假表 | 存放请假基本信息 | | `move` | 离职表 | 存放离职基本信息 | | `overtime` | 加班表 | 存放加班基本信息 | | `position` | 职称表 | 存放职称基本信息 |

attendanc表结构设计如表3-4所示。

表3-4attendance表结构设计
| No | 字段名 | 类型 | 长度 | 主键/外键 | 描述 | | ---- | ----------------- | ------- | ---- | --------- | -------- | | 1 | `id` | int | 100 | 主键 | ID | | 2 | `employee_number` | int | 10 | | 员工编号 | | 3 | `day` | date | 0 | | 时间 | | 4 | `time_type` | Data | 0 | | 时间类型 | | 5 | `start_time` | time | 0 | | 开始时间 | | 6 | `start_type` | Data | 0 | | 开始类型 | | 7 | `end_time` | time | 0 | | 结束时间 | | 8 | `end_type` | Data | 0 | | 结束类型 | | 9 | `work_type` | Varchar | 0 | | 工作类型 | | 10 | `notes` | varchar | 255 | | 备注 |

department表结构设计如表3-5所示。

表3-5 department表结构设计
| No | 字段名 | 类型 | 长度 | 主键/外键 | 描述 | | ---- | ------------------- | ------- | ---- | --------- | -------- | | 1 | `id` | Int | 10 | 主键 | ID | | 2 | `department_number` | Int | 10 | | 部门编号 | | 3 | ` `name`` | Varchar | 20 | | 名称 | | 4 | `manager` | Varchar | 10 | | 管理 | | 5 | `telephone` | Varchar | 20 | | 联系方式 | | 6 | `address` | Varchar | 50 | | 地址 | | 7 | `notes` | Varchar | 255 | | 备注 |

employee表结构设计如表3-6所示。

表3-6 employee表结构设计
| No | 字段名 | 类型 | 长度 | 主键/外键 | 描述 | | ---- | ------------------- | ------- | ---- | --------- | -------- | | 1 | `id` | Int | 10 | 主键 | ID | | 2 | `employee_number` | Int | 10 | | 员工编号 | | 3 | ` name` | Varchar | 10 | | 名称 | | 4 | `gender` | Varchar | 0 | | 性别 | | 5 | `birthday` | Date | 0 | | 生日 | | 6 | `telephone` | Varchar | 15 | | 联系方式 | | 7 | `email` | Varchar | 30 | | 邮箱 | | 8 | `address` | Varchar | 50 | | 地址 | | 9 | `photo` | Varchar | 50 | | 照片 | | 10 | `education` | Varchar | 20 | | 教育 | | 11 | `department_number` | Int | 10 | | 部门编号 | | 12 | `position_number` | Int | 10 | | 职称编号 | | 13 | `in_time` | Date | 0 | | 参加时间 | | 14 | `password` | Varchar | 20 | | 密码 | | 15 | `notes` | Varchar | 255 | | 状态 |

gonggao表结构设计如表3-7所示。

表3-7 gonggao表结构设计
| No | 字段名 | 类型 | 长度 | 主键/外键 | 描述 | | ---- | --------- | ------- | ---- | --------- | ---- | | 1 | `id` | Int | 11 | 主键 | ID | | 2 | `title` | Varchar | 255 | | 标题 | | 3 | `content` | Varchar | 255 | | 详情 |

history表结构设计如表3-8所示。

表3-8 history表结构设计
| No | 字段名 | 类型 | 长度 | 主键/外键 | 描述 | | ---- | ------------------- | ------- | ---- | --------- | -------- | | 1 | `id` | int | 10 | 主键 | ID | | 2 | `employee_number` | int | 10 | | 员工编号 | | 3 | ` name` | varchar | 10 | | 名称 | | 4 | `gender` | Varchar | 0 | | 性别 | | 5 | `birthday` | date | 0 | | 生日 | | 6 | `telephone` | varchar | 20 | | 联系方式 | | 7 | `email` | varchar | 30 | | 邮箱 | | 8 | `address` | varchar | 50 | | 地址 | | 9 | `photo` | varchar | 50 | | 照片 | | 10 | `education` | varchar | 20 | | 教育 | | 11 | `department_number` | Int | 10 | | 部门编号 | | 12 | `position_number` | Int | 10 | | 职称编号 | | 13 | `in_time` | date | 0 | | 参加时间 | | 14 | `out_time` | varchar | 0 | | 离职时间 | | 15 | `notes` | varchar | 255 | | 备注 | | 16 | `status` | varchar | 255 | | 状态 |

lea表结构设计如表3-9所示。

表3-9 lea表结构设计
| No | 字段名 | 类型 | 长度 | 主键/外键 | 描述 | | ---- | ------------------- | ------- | ---- | --------- | -------- | | 1 | `id` | int | 10 | 主键 | ID | | 2 | `employee_number` | int | 10 | | 员工编号 | | 3 | `department_number` | varchar | 10 | | 部门编号 | | 4 | `start_time` | enum | 0 | | 入职时间 | | 5 | `end_time` | date | 0 | | 离职时间 | | 6 | `days` | varchar | 10 | | 天数 | | 7 | `reason` | varchar | 100 | | 原因 | | 8 | `type` | varchar | 0 | | 类型 | | 9 | `manager` | varchar | 10 | | 管理人 | | 10 | `notes` | varchar | 255 | | 备注 | | 11 | `status` | varchar | 255 | | 状态 |

move表结构设计如表3-10所示。

表3-10 move表结构设计
| No | 字段名 | 类型 | 长度 | 主键/外键 | 描述 | | ---- | ----------------- | ------- | ---- | --------- | -------- | | 1 | `id` | int | 10 | 主键 | ID | | 2 | `employee_number` | int | 10 | | 员工编号 | | 3 | `before` | varchar | 10 | | 之后 | | 4 | `after` | Varchar | 10 | | 之前 | | 5 | `time` | date | 0 | | 时间 | | 6 | `manager` | varchar | 10 | | 管理人 | | 7 | `notes` | varchar | 255 | | 备注 |

overtime表结构设计如表3-11所示。

表3-11 overtime表结构设计
| No | 字段名 | 类型 | 长度 | 主键/外键 | 描述 | | ---- | ------------------- | ------- | ---- | --------- | -------- | | 1 | `id` | int | 10 | 主键 | ID | | 2 | `employee_number` | int | 10 | | 员工编号 | | 3 | `department_number` | varchar | 10 | | 之后 | | 4 | `day` | Varchar | 0 | | 之前 | | 5 | `time` | date | 0 | | 时间 | | 6 | `manager` | varchar | 0 | | 管理人 | | 8 | `status` | varchar | | | 状态 |

position表结构设计如表3-12所示。

表3-12 position表结构设计
| No | 字段名 | 类型 | 长度 | 主键/外键 | 描述 | | ---- | ----------------- | ------- | ---- | --------- | -------- | | 1 | `id` | int | 10 | 主键 | ID | | 2 | `position_number` | int | 10 | | 职称编号 | | 3 | `name` | varchar | 20 | | 名称 | | 4 | `level` | Varchar | 0 | | 级别 | | 5 | `notes` | varchar | 255 | | 备注 |

4系统实现展示

4.1 登陆界面

在此界面输入账号密码进入系统,如图4-1所示。

图4-1 登陆界面
#### 4.2 系统首页

不同权限用户进入不同的首页,具体区别在于可以使用的功能不同,如图4-2所示是普通员工首页,管理员首页左侧有本系统支持的各种功能,点击可以展开并跳转到该功能界面,在系统首页可以签到签退,在签到签退按钮下方会显示最新公告以便于查看,首页右上方可以退出系统登录,如图4-3所示

4.3 系统个人信息模块功能

4.3.1 查看个人信息:

在此界面可以查看职工个人信息,如图4-6所示。

图4-6 查看个人信息
##### 4.3.2 查看考勤记录:

可以查看各员工的签到时间,签退时间等考勤信息,如图4-7所示。

图4-7 考勤信息查看
##### 4.3.3 查看加班信息

查看加班信息支持查看加班信息的查看以及安排加班,如图4-8所示。

图4-8 加班信息查看
安排加班需要通过下拉栏选定员工和时间来安排加班,各项信息都是必填,倘若未填写则会有红字报错提醒
4.3.4 申请请假

若企业员工需要请假,可以通过申请请假界面来实现请假操作,如图所示,员工需要填写各项信息,若必填信息未填写则会有提醒。如图4-10所示。

图4-10 申请请假
##### 4.3.5 查看请假记录

查看请假记录可以实现对请假列表的查看,请假列表包含了请假人姓名,请假时间、请假原因和审批状态等信息,如图4-11所示。

图4-11 查看请假记录
#### 4.4 系统员工模块功能

系统员工模块实现对员工信息的管理、考勤管理以及请假管理。

4.4.1 员工管理

员工管理包括在职员工管理、离休员工管理、员工档案管理三项。在职员工管理可以查看在职员工信息并进行修改和删除,删除只需点击删除按钮即可,如图4-12所示。

图4-13 在职员工管理
添加员工需要按格式输入各项信息,其中有必填信息是必须要填写的,否则会有报错提醒,如图4-13所示。
图4-13 添加员工
离休员工管理可以查看离休员工列表,获取离休时间等信息。如图4-14所示。
图4-14 离休员工管理
##### 4.4.2考勤管理

考勤管理包含考勤管理和加班管理两项,其中考勤管理可以查看各员工的考勤记录,如图4-15所示。加班管理则是可以安排加班,如图4-16所示。

图4-15 员工考勤记录
图4-16 加班管理
加班管理可以安排人员加班,也可以修改和删除加班信息,安排加班具体如图4-17所示。修改加班信息如图4-18所示。删除加班信息点击删除按钮即可,如图4-16所示。
图4-17 添加加班安排
图4-18 加班信息修改
##### 4.4.3 请假管理

请假管理是管理员功能,可以查看已批准和未批准的请假以及请假记录,如下图4-19所示,在请假记录一栏中可以看到各项已批准和未批准的请假记录,如图4-20所示。

图4-20 请假列表
#### 4.5 系统部门模块功能

部门管理模块是管理员功能,其中有两部分,分别为部门管理和职称管理。

4.5.1部门管理

部门管理页面展示了如部门名称、部门电话、部门地址等信息,通过此界面可以实现对部门的查看、添加和删除,对部门信息的修改功能,如图4-21所示。

图4-21 部门管理
对部门的添加需要按格式输入部门的各项信息,如果出错则会报错提示,如图4-22所示:
图4-22 添加部门
修改部门信息则需要在原信息基础上修改,如图4-23所示,修改完成后会弹窗提示修改成功,如图4-24所示:
图4-23 修改部门信息
图4-24 修改成功提示
##### 4.5.2 职称管理

职称管理与部门管理大致相同,其实现了对职称的查看、添加、修改和删除。如图4-25所示,界面中展示了已有职称的信息,如要增删改需要按下相关按钮

图4-25 职称管理
如图4-26所示为添加职称,其中职称名称为必填选项,如果未填写会有错误提示,职称的权限可以通过下拉栏来选择。
图4-26 职称添加
对职称的修改需要点击修改按钮,在原基础上进行修改,如图4-27所示
图4-27 职称修改
#### 4.6 系统公告模块功能
4.6.1公告管理

公告管理中可以对公告进行查看、添加、修改、删除,如图4-28所示。添加公告时需要输入公告标题和内容,如图4-29所示。修改可以修改公告的标题和内容,如图4-30所示。删除只需点击删除按钮即可。

图4-28 公告管理
图4-29 添加公告
图4-30 修改公告
### 5 结束语

企业考勤管理系统是为了解决员工考勤管理而设计的,目的是建立一个能够初步实现企业考勤管理系统的智能化管理,提高考勤管理效率,工作人员能够在各个岗位上的工作状态得到及时的反馈,而系统所需的工作人员的数量少,效率高,是一个企业单位不可缺少的一部分。企业考勤管理系统的开发是一项系统性工程,它不但涉及JSP、Web、数据库技术等技术领域,还涉及到管理观念、管理体制和管理科学,以及一些制度和人为的因素。因此,系统开发的各个环节都需要有效地衔接,有条不紊的进行。本文研究的主要目的是为了开发一个智能化、高效率的企业考勤管理系统。在本项目中我们初步分析了企业考勤管理系统的几个主要模块的功能与作用,经多次调试,该系统基本能够达到预期的效果。本系统是基于Web的企业考勤管理系统。由于企业考勤管理系统本身的复杂性,以及我们能力、开发技术的局限性,此系统还存在不少的缺陷和漏洞,有待进一步的改进和研究。

参考文献:

[1] 尚中君.探析JAVA编程语言在计算机软件开发中的应用[J].信息记录材料,2021,22(03):176-178.

[2] 朱宝善,陈光浦,李鹏程,王深.基于B/S模式和MySQL的人力资源管理系统设计[J].现代电子技术,2021,44(14):65-69.

[3] 张淼,刘东旭.基于JavaEE的人力资源管理系统的设计与实现[J].普洱学院学报,2020,36(03):35-36.

[4] 张艳明.动态网页开发Servlet基础实验综述[J].电脑知识与技术,2019,15 (20):80-82.

[5] 王军.计算机网络环境下的大学就业信息网研究[J],中国宇航出版社,2019,(10),115-117.

[6] 韩坤,林关成,安嘉豪,陈泽.基于B/S的高校学生学业预警系统设计与实现[J].信息技术,2021,(08):53-58.

[7] 王烽杰,郭玉靖.JAVA编程语言在计算机软件开发中运用[J].大众标准化,2020,(18):66-67.

[8] 赵国文,夏平平.基于JavaEE的人事管理系统的设计与实现[J].现代工业经济和信息化,2019,9(11):88-89.

[9] 王佳林,郭炀.基于计算机软件开发Java编程语言的分析研究及技术思考[J].科技风,2019,(33):108.

[10] 李琼.基于三层B/S架构的企业信息化管理系统的设计与实现[J].信息与电脑(理论版),2021,33(04):126-128.


文章作者: 十二惊惶
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 十二惊惶 !
  目录