基于Java实现(Web)考勤管理系统【100010040】

news2025/4/18 4:13:38

考勤系统设计文档

一、用户需求

1.1 目标

  • 规范员工的上下班、请假、外出工作等行为
  • 方便计算员工的薪金方便管理各种带薪假期
  • 共享员工的请假及外出工作的信息

1.2 涉众

序号涉众待解决的问题
1普通员工方便的查看自己的请假及外出记录
2行政部员工与财务部的“接口”尽量简单
3财务部员工方便管理员工的带薪假期
4项目经理成员的请假信息要能尽早知道

1.3 用例分析

执行者用例

普通员工用例

业务流程概述

本系统要管理的事情主要有:打卡记录 、请假申请、外出申请。各事项的关系如下:

业务流程分析

请假申请与外出申请都需要审批,请假申请和 外出申请在审批流程不同阶段处于不同状态外出申请审批流程

请假申请审批流程

二、详细设计

2.1 系统总体架构

我选择将考勤系统部署在 B/S 结构中,客户只需安装浏览器即可访问到本系统。系统的总体设计采用分层的结构,共分为三层:

  • 视图层
  • 业务逻辑层
  • 数据持久层

各层级的说明会在后文阐述。

此外,系统采用 Spring 框架提供的 Web 模块、Context 模块、Core 模块对三个分层进行集成。通过依赖注入,使得各层级之间解耦,便于后期的维护

2.2 系统层级结构

2.2.1 MVC 层级结构

视图层

  • 我们简化了视图层,直接使用 PostMan 与系统进行通信与调试业务层

业务层

  • 业务层是系统的核心,用于处理考勤管理系统的各项业务。主要包括:打卡记录、请假申请、外出申请。涉及普通员工、行政部员工、财务部员工、项目经理这四大用户群体。

  • 在实现时,可以考虑将业务的处理逻辑封装成 Java 类 ServiceBean。用户给系统发出指令后,View 层就会通过接口,将业务数据传入相关业务类 ServiceBean 中进行处理。

持久层

持久层采用 MyBatis 框架,用于将本来属于业务层的数据持久化工作分离出来,使业务层专注于处理业务逻辑。业务层在需要访问数据库时,只需要访问持久层中相应的 DAO 接口,剩下的工作全部由持久层来完成。

Mapper.xml 中描述了 DAO 和 SQL 语句之间的映射关系,当 DAO 中的方法被调用时,MyBatis 就会从Mapper 中获得映射关系,然后执行对应的 SQL 语句,操作数据库,再将结果返回给 DAO。

2.2.2 MVC 交互方式

采用如下更为灵活的层级之间的交互方式:

  • 用户操作界面,向 View 发送指令;

  • View 不部署任何业务逻辑,直接将指令格式化后传递给 Controller;

  • Controller 完成业务逻辑后,要求 Model 改变状态;

  • Model 将新的数据发送到 Controller;

  • Controller 将响应结果发送给 View 此种交互方式的优点是:

视图层非常薄,不部署任何业务逻辑。从而便利了后期对网站外观的修改;数据的处理由模型层完成,隐藏了数据,在数据显示时,控制器可以对数据进行访问控制,提高数据的安全性。

2.3 RESTFul API 设计

RESTFul API 是采用面向资源的架构,需要考虑资源的标识、资源的表示

2.3.1 资源

一个资源必须具有一个或者多个标识,应该采用 URI 来作为资源的标识。作为资源标识的 URI 应当具有如下特性:

  • 可读性:具有可读性的 URI 更容易被使用,对于用户更友好;
  • 可寻址性:URI 不仅仅指明了被标识资源所在的位置,而且通过这个 URI 可以直接获取目标资源从而采用 URL 作为资源的标识。

结合需求规格说明书中的涉众需求以及员工的用例,可将资源分为如下 5 大类并定义其 URL:

序号资源名URL
1账户登录信息http://localhost:8080/entry/
1.1登录认证信息http://localhost:8080/entry/login
1.2注册账户信息http://localhost:8080/entry/newEntry
1.3密码重置信息http://localhost:8080/entry/newPasswd
2员工基本考勤信息https://localhost:8080/attendance/
2.1基本考勤信息条目(按 ID)https://localhost:8080/attendance/{id}
2.2基本考勤信息条目(按时间)https://localhost:8080/attendance/{d1}{d2}
3员工打卡信息https://localhost:8080/card/
3.1上班打卡https://localhost:8080/card/in
3.2下班打卡https://localhost:8080/card/out
3.3打卡信息条目(按 ID)https://localhost:8080/card/{id}
3.4打卡信息条目(按时间)https://localhost:8080/card/{d1}{d2}
4员工外出工作与请假信息https://localhost:8080/leaveApply
4.1出差请假申请条目(按 ID)https://localhost:8080/leaveApply/{id}
4.2出差请假申请条目(按时间)https://localhost:8080/leaveApply/{d1}{d2}
4.3出差请假申请审核信息https://localhost:8080/leaveApply/check
4.3.1出差请假申请条目(按 ID)https://localhost:8080/leaveApply/check/{id}

2.3.2 动作

浏览器需要在发送请求前,添加 HTTP 动词,包括如下五种主要的动作:

HTTP 动词SQL 操作含义
GETSELECT从服务器取出资源(一项或多项)
POSTCREATE在服务器新建一个资源
PUTUPDATE在服务器更新资源(客户端提供改变后的完整资源)
PATCHUPDATE在服务器更新资源(客户端提供改变的属性)
DELETEDELETE从服务器删除资源

具体应用到本项目中,有如下含义:

HTTP 动词简写的 URL含义
GET/card获得供公司员工查询的所有员工打卡信息
GET/card/{id}根据员工 id 提取员工打卡记录
POST/card/{id}根据员工 id 新建一条员工打卡记录
PUT/card/{d1}{d2}根据指定的打卡日期,更新员工打卡信息
DELETE/card/{id}{d1}{d2}根据员工 id 和日期删除指定的打卡信息

2.3.3 表现形式

对于 Web 来说,目前具有两种主流的数据结构,XML 和 JSON,它们也是资源的两种主要的呈现方式。本系统支持不同的资源表示:

  • 对于客户提交的资源:本系统视图层利用请求的 Content-Type 报头携带的媒体类型来判断其采用的表示类型;
  • 对于服务器响应的资源:根据请求相关报头来判断它所希望的资源表示类型,在 HTTP 报文中,“Accept”和“Accept-language”报头可以体现请求可以接受的响应媒体类型和语言。

2.3.4 状态变化

我选择采用标准的 HTTP 方法来对指定的资源进行操作,命令 Model 层改变状态,并返回相应的状态码:

状态码含义操作说明
200SUCCESSGET,;PUT当 GET 和 PUT 请求成功时,要返回对应的数据及此状态码
201CREATEDPOST当 POST 创建数据成功时,要返回创建的数据,及此状态码
204NOT;CONTENTDELETE当 DELETE 删除数据成功时,不返回数据,返回此 状态码
404NOT FOUNDGET找不到所请求的数据,返回此状态码
400BAD;REQUEST-在任何时候,如果请求有问题,返回此状态码
401NOT;AUTHORIZED用户认证当 API 请求需要用户认证时,request 中的认证信息不正确,返回此状态码
403FORBIDDEN-当 API 请求需要验证用户权限时,当前用户无相应权限,返回此状态码

2.4 Jwt 设计

2.4.1 总体流程

  • 用户使用账号和面发出 post 请求

  • 服务器使用私钥创建一个 jwt

  • 服务器返回这个jwt给浏览器

  • 浏览器将此jwt串在请求头中向服务器发送请求

  • 服务器验证此jwt

  • 返回响应的资源给浏览器

2.4.2 拦截规则

会对所有调用映射到方法的 url 请求进行拦截,具体为:

  • 对所有路径进行拦截;
  • 检查该方法是否有 @PassToken,如果有则不需要认证;
  • 检查该方法是否有 @UserLoginToken,如果有则需要认证并执行。

2.4.3 设置需要认证的方法

只需要在方法上添加 @UserLoginToken 即可

2.4.4 接口与业务对象设计

dao 层

用途: 实体层,用于存放我们的实体类,与数据库中的属性值基本保持一致,实现 set 和 get 的方法。

public class AttendanceDao {
    private int emp_no;
    private Date date;
    private Time cardIn_time;
    private Time cardOut_time;
    public int getEmp_no() {
    	return emp_no;
    }
    public void setEmp_no(int emp_no) {
    	this.emp_no = emp_no;
    }
    public Date getDate() {
    	return date;
    }
    public void setDate(Date date) {
    	this.date = date;
    }
    public Time getCardIn_time() {
    	return cardIn_time;
    }
    public void setCardIn_time(Time cardIn_time) {
    	this.cardIn_time = cardIn_time;
    }
    public Time getCardOut_time() {
    	return cardOut_time;
    }
    public void setCardOut_time(Time cardOut_time) {
    	this.cardOut_time = cardOut_time;
    }
}

service 层

用途:给 controller 层的类提供接口进行调用。一般就是自己写的方法封装起来,具体实现在 serviceImpl 中。

public interface AttendanceService {
    void add(int ID);
    List<AttendanceDao> findAll();
    void create(int emp_no);
    List<AttendanceDao> findBydate(Date date);
    List<AttendanceDao> findByID(int id);
    List<AttendanceDao> findByIdAndDate(int id, Date date);
}
@Service
public class AttendanceServiceImpl implements AttendanceService{
    @Autowired
    ICheckInfoMapper iCheckInfoMapper;
    @Value("${spring.work_time}")
    private int work_time;
    @Override
    public void create(int emp_no) {
        // TODO Auto-generated method stub
        java.util.Date d = new java.util.Date();
        java.sql.Date date = new java.sql.Date(d.getTime());
        Time time = new Time(d.getTime());
        if(d.getHours()<=work_time)
        {
        	iCheckInfoMapper.insertCheckDate(emp_no,date);
        	iCheckInfoMapper.updateCheckIn(emp_no, date, time);
        }
        else
        {
        	throw new RuntimeException("你迟到了");
        }
    }
    @Override
    public void add(int emp_no) {
        // TODO Auto-generated method stub
        // System.out.println("开始");
        java.util.Date d = new java.util.Date();
        java.sql.Date date = new java.sql.Date(d.getTime());
        Time time = new Time(d.getTime());
        System.out.println(iCheckInfoMapper.findByIdAndDate(emp_no, date));
        if(!iCheckInfoMapper.findByIdAndDate(emp_no, date).isEmpty())
        {
        	// System.out.println("开始2");
        	iCheckInfoMapper.updateCheckOut(emp_no,date,time);
        }
        else {
        	// System.out.print("签退成功");
        	iCheckInfoMapper.insertCheckDate(emp_no,date);
        	iCheckInfoMapper.updateCheckOut(emp_no,date,time);
        }
    }
    @Override
    public List<AttendanceDao> findAll() {
        // TODO Auto-generated method stub
        return iCheckInfoMapper.findAll();
    }
    @Override
    public List<AttendanceDao> findBydate(Date date) {
        // TODO Auto-generated method stub
        java.sql.Date dt = new java.sql.Date(date.getTime());
        return iCheckInfoMapper.findByDate(dt) ;
    }
    @Override
    public List<AttendanceDao> findByID(int id) {
        // TODO Auto-generated method stub
        return iCheckInfoMapper.findByID(id);
    }
    @Override
    public List<AttendanceDao> findByIdAndDate(int id, Date date) {
        // TODO Auto-generated method stub
    	java.sql.Date dt = new java.sql.Date(date.getTime());
    	return iCheckInfoMapper.findByIdAndDate(id, dt);
    }
}

mapper 层

用途: 对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,主要实现一些增删改查操作

@Mapper
public interface FormMapper {
    @Insert("INSERT INTO outapply(emp_no, start_date, end_date, reason, days,
    type,name,state) " +"VALUES ( #{emp_no}, #{sd}, #{ed}, #{reason},#{days},#{type},#{name},1)")
    public void insertApply(int emp_no, Date sd, Date ed,String reason,int
    days,String type,String name );
    @Update("UPDATE outapply SET days = #{len} WHERE aid = #{aid}")
    public void updateLen(int aid, int len);
    @Update("UPDATE outapply SET reason = #{reason} WHERE aid = #{aid}")
    public void updateReason(int aid, String reason);
    @Update("UPDATE outapply SET state = #{state} WHERE aid = #{aid}")
    public void updateState(int aid, int state);
    @Delete("DELETE FROM outapply WHERE aid = #{aid}")
    public void deleteApply(int aid);
    @Select("SELECT * FROM outapply where emp_no = #{emp_no}")
    public List<Form> findByID(int emp_no);
    @Select("SELECT * FROM outapply where state = #{state}")
    public List<Form> findByState(int state);
    @Select("SELECT state FROM outapply where aid = #{aid}")
    public int getState(int aid);
    @Select("SELECT days FROM outapply where aid = #{aid}")
    public int getDays(int aid);
    @Select("SELECT emp_no FROM outapply where aid = #{aid}")
    public int getEmp_no(int aid);
    @Select("SELECT name FROM outapply where aid = #{aid}")
    public String getName(int aid);
    @Select("SELECT * FROM outapply WHERE state = #{state} AND emp_no "+"in ( SELECT emp_no FROM employee WHERE department = #{department});")
    public List<Form> findApplyByState(int state,String department );
}

controller 层

用途: 控制层,负责具体模块的业务流程控制,需要调用 service 逻辑设计层的接口来控制业务流程。接收前端传过来的参数进行业务操作,再将处理结果返回到前端。

@Controller
@RequestMapping("/Form")
public class FormController {
    @Autowired
    FormService formService;
    /**
    * 请假单
    * @param emp_no 员工编号
    * @param sd 起始日期
    * @param reason 原因
    * @param type 类型 外出/请假
    * @param ed 终止日期
    * @return
    */
    @UserLoginToken
    @PostMapping("/add")
    @ResponseBody
    public String addForm(@RequestParam("empNo")
    int emp_no,
    @RequestParam("sd")Date sd,
    @RequestParam("reason")String reason, @RequestParam("ed")Date ed,
    @RequestParam("type")String type)
    {
    	formService.insertApply(emp_no, sd, ed,reason,type);
    	return "建表成功";
    }
    //全体员工都可查看成功请假表
    @UserLoginToken
    @GetMapping("/list")
    @ResponseBody
    public List<Form> list_Form()
    {
    	return formService.findByState(4);
    }
    @GetMapping("/list/toWork/{id}")
    @ResponseBody
    @UserLoginToken
    public List<Form> list_Forms_todo(@PathVariable("id") int id) {
    	return formService.ListByID(id);
    }
    //处理
    @PostMapping("/handle")
    @ResponseBody
    @UserLoginToken
    public String handleForm(@RequestParam("aid")
    int aid,@RequestParam("decision")String decision,
    @RequestParam("reason")String reason,@RequestParam("empNo") int empNo)
    {
    	formService.updateState(aid,empNo,reason,decision);
    	return "处理成功";
    }
    @DeleteMapping("/delete/{aid}")
    @ResponseBody
    @UserLoginToken
    public String delete(@PathVariable("aid")int aid) {
    formService.delete(aid);
    return "删除成功";
    }
    @ResponseBody
    @GetMapping("/list/{id}")
    @UserLoginToken
    public List<Form> get(@PathVariable("id") int id) {
    return formService.findByID(id);
    }
}

2.5 数据库详细设计

2.5.1 数据库体系结构设计

表名描述说明
employee员工基本信息表记录员工的基础信息
card_info打卡信息表记录各个员工详细的打卡信息条目
leave_apply出差请假申请信息表记录各个员工外出请假申请的详细信息

2.5.2 数据库表项设计

员工基本信息表

记录员工的基础信息,包括 ID、职位以及员工的账户信息等

employee

字段名中文描述数据类型长度是否允许为空是否为主键
emp_no员工编号varchar11×
idNumber身份证号varchar32××
name员工姓名varchar255×
department所属部门varchar255×
position所处职位varchar255×
age年龄int11×
sex性别varchar1×
tel联系电话varchar255×
passwd账户密码varchar255××
email电子邮箱名varchar255×

打卡信息表

用于保存所有员工通过本系统的打卡信息,包括员工编号、公司名、签到 (退) 时间

card_info

字段名中文描述数据类型长度是否允许为空是否为主键
emp_no员工编号varchar11×
company_name公司名varcher255××
date打卡日期date0×
cardIn_time打卡时间time0×
cardOut_time签退时间time0×

出差请假信息表

用于保存所有员工通过本系统申请的请假信息,其中 PK 为申请单单号

leave_apply

字段名中文描述数据类型长度是否允许为空是否为主键
aid申请号int11×
emp_no员工编号int11×
name员工姓名varchar255×
start_date开始日期date0×
×end_date结束日期date0×
reason×申请理由varchar255×
state审批状态int11×
days总时长int11×
type申请类型varchar255×

2.6 具体分工

姓名学号分工情况
王文君3018216144config.DateConverter.java config.InterceptorConfig.java config.WebAppConfig.java controller.FormController.java impl.DateConverter.java impl.IMailService.java service.FormService.java service.IMailService.java;设计文档 < 接口与业务对象 > 部分编写演示视频的录制
张世琦3018216185jwt.AuthentificationInterceptor.java jwt.TokenService.java jwt.annot.PassToken.java jwt.annot.UserLoginToken.java jwt.annot.Auth*.java mapper.FormMapper.java mapper.ICheckInfoMapper.java mapper.IEmployeeMapper.java;设计文档绝大部分内容的编写
郑跃龙3018216187controller.UserController.java dao.UserDao.java dao.Form.java;impl.UserServiceImpl.java service.UserService.java ;设计文档部分内容文献的搜集与编写
卡衣凯尔·库尔班3018218058controller.AttendanceController.java dao.AttendanceDao.java impl.AttendanceServiceImpl.java service.AttendenceService.java ;设计文档部分内容文献的搜集与编写

♻️ 资源

在这里插入图片描述

大小: 3.76MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87248408

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

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

相关文章

Revit中模型文字的放置和族库工具介绍

一、Revit中模型文字的放置 模型文字一般放置在构件表面&#xff0c;因此我们在放置模型文字的时候一定要注意先设置工作平面这样的话会让模型文字更容易放凰而且定位较准。 1.工作平面的设定 2.拾取工作平面&#xff0c;将鼠标放在要拾取面的地方&#xff0c;如果不能一下子就…

线程池监控和动态配置

线程池 线程池是一种 “池化” 的线程使用模式&#xff0c;通过创建一定数量的线程&#xff0c;让这些线程处于就绪状态来提高系统响应速度&#xff0c;在线程使用完成后归还到线程池来达到重复利用的目标&#xff0c;从而降低系统资源的消耗。 池的好处 使用线程池&#xf…

远程桌面时出现“身份验证错误,要求的函数不受支持”解决办法

远程桌面时 “出现身份验证错误&#xff0c;要求的函数不受支持”的错误&#xff0c;如图所示&#xff1a; 这是由于本地客户端或者服务器端一方更新了CVE-2018-0886 的 CredSSP 补丁&#xff0c;而另外一方未安装更新的原因导致的&#xff0c;详见&#xff1a; CVE-2018-0886…

[附源码]计算机毕业设计的物品交换平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

Linux内核基础篇——printk调试

文章目录printk等级修改printk等级printk的输出格式pr_xx( )封装很多内核开发者喜欢的调试工具是printk&#xff0c;在Linux内核中&#xff0c;使用printk()函数来打印信息&#xff0c;它与C库的printf()函数类似。 printk()与printf()的一个重要区别是&#xff1a;printk()提…

大学生动物介绍网页设计作品 dreamweaver作业静态HTML网页设计模板 保护动物网页作业制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Java中synchronized关键字到底怎么用,这个例子一定要看!

在平时开发中&#xff0c;synchronized关键字经常遇到&#xff0c;你知道synchronized怎么用吗&#xff1f;本文给大家介绍一下。 我们有两种方法使用同步&#xff1a; 使用同步方法使用同步语句或块 使用同步方法 要使方法同步&#xff0c;只需将synchronized关键字添加到其…

用javascript分类刷leetcode3.动态规划(图文视频讲解)

什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;将问题分解为互相重叠的子问题&#xff0c;通过反复求解子问题来解决原问题就是动态规划&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划来解是比较…

测量温度的优选模块——新型设备M-THERMO3 16

| 具有16个自由选择通道的新型温度测量设备M-THERMO3 16 IPETRONIK推出了新的温度测量设备——M-THERMO3 16。作为新一代设备的首个模块&#xff0c;它为模块化测量技术确立了标准。该模块具有16个通道&#xff0c;并且各通道不仅分别率高达24位ADC&#xff0c;而且可以自由选…

git初学(二)

git如何进行版本控制&#xff1f; 如何做版本控制呢&#xff1f;其实就是让git管理文件夹&#xff0c;比如我们有一个项目叫学生考试管理系统&#xff0c;首先我们创建一个文件夹student&#xff0c;这个文件夹当中保存所开发的所有代码 进入要管理的文件夹 初始化 git ini…

FTX创始人被警方逮捕:身价曾超150亿美元 坑惨红杉

雷递网 雷建平 12月13日“加密货币大王”、加密货币交易所FTX创始人、前首席执行官&#xff08;CEO&#xff09;萨姆班克曼-弗里德&#xff08;Sam Bankman-Fried&#xff0c; 简称“SBF”&#xff09;日前在巴哈马被逮捕&#xff0c;可能被引渡至美国。巴哈马总检察长办公室和…

访问者模式

一、访问者模式 1、定义 访问者模式&#xff08;Visitor Pattern&#xff09;是一种将数据结构与数据操作分离的设计模式&#xff0c;指封装一些作用于某种数据结构中的各元素的操作&#xff0c;可以在不改变数据结构的前提下定义作用于这些元素的新的操作&#xff0c;属于行为…

漫画 | 这个北欧小国发明的编程技术,竟然占领全世界了!

上世纪60年代 &#xff0c;挪威计算中心。一个新来员工刚上班&#xff0c;发现有两个人居然在一楼的黑板前打架新员工立刻跑到电话接线员那里报告什么样的编程语言&#xff0c;能让两人大动肝火&#xff1f;当时Nygaard正在编写复杂系统的模拟程序&#xff0c;模拟程序要求先定…

【猿如意】中的『XMind』工具详情介绍

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意&#xff1f; 2.2 如何下载猿如意&#xff1f; 2.3 如何在猿如意中下载开发工具&#xff1f; 三、XMind工具功能简介 四、XMind的下载和安装 4.1下载 4.2安装 五、XMind的基本使用 5.1新建项目 5.2系统模板的使…

【java】程序员基础能力测试33问,持续整理中

Java基础&#xff1a; 1&#xff1a;八大基本数据类型&#xff0c;及所占字节数&#xff1f; 2&#xff1a;讲下对面向对象的理解&#xff1f; 特征:封装、继承、多态; 基础:抽象 面向对象&#xff0c;主要就是将现实中的对象抽象成一个类&#xff0c;这个对象具有一定的属性…

[附源码]Python计算机毕业设计服装商城平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

项目管理之Git---submodule

0. 简介 在面对复杂系统时&#xff0c;所有的模块不可能同时开发在一个project下的&#xff0c;而更多的可能就是每个人开发不同的模块&#xff0c;并通过一个模块将这些模块都整合到一起&#xff0c;这时候submodule的作用就非常明显了。通过设置submodule可以轻易地对不同的…

通信基站安装步骤

基站设备安装步骤(移动通信基站施工过程),并说明施工要点和注意事项。 安装机柜流程。安装电源线和系统接地。 安装电源机柜时应直流配电柜接出-48V直流电源至RNC810机柜和NodeB机柜顶端配线盒。 将保护地线接至机柜接地螺栓上并紧固螺栓。 天馈系统安装。 天馈系统安装前的…

大数据学习:压缩与打包

文章目录任务一&#xff1a;压缩文件任务二&#xff1a;解压文件任务三&#xff1a;生成打包文件任务四&#xff1a;将打包文件解压到当前文件任务五&#xff1a;将打包的文件解压缩到指定目录任务六&#xff1a;解压打包文件里的某个目录任务一&#xff1a;压缩文件 在/tmp目…

redis地理位置和MongoDB地理索引的使用

比较 经度纬度都要在有效区间。经度范围介于 -180 到 180&#xff0c;纬度范围大致介于-90和到90。redis使用Zset结构存储&#xff0c;将经度值、纬度值转换为一个值&#xff0c;二维量变成一维量找附近的位置&#xff0c;效率极高&#xff0c;不过限于平面&#xff0c;且无法…