上班打卡--- 通过批处理命令执行jar文件来记录上班时间

如果 一个程序员要记录自己上班工作时间的话 ,还需要靠手动去记录, 那就有点 不够范了, 程序员自然要有自己的极客范儿 , 下面就跟我一起来(zhuangbi);

先列一下整体的步骤:

1: 先做一个jar文件, 通过执行这个jar文件可以将上下班时间 写入数据库中;

2: 再写一个批处理脚本,能通过批处理命令来执行这个jar文件;

3: 将批处理文件做开机启动执行处理;

1: 先写一个可执行jar:   

原理: 通过jdbc操作数据库, 

那就上代码吧:

项目目录结构:

 上班打卡--- 通过批处理命令执行jar文件来记录上班时间

pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.etoak</groupId>
    <artifactId>daka</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc14</artifactId>
            <version>10.2.0.4.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
                <dependencies>
                    <!-- 解决sun base64编译报错 -->
                    <dependency>
                        <groupId>org.codehaus.plexus</groupId>
                        <artifactId>plexus-compiler-javac</artifactId>
                        <version>1.8.1</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <!--主类入口的路径-->
                            <mainClass>com.etoak.Daka</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
PropertiesUtil 类 :

package com.etoak.util;

import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

public class PropertiesUtil {


/**
* 根据属性文件路径获取所有的属性键值对
* @param propertiesFilePath
* @return
* @throws IOException
*/
public static Properties getProperties(String propertiesFilePath) throws IOException {
Properties props = new Properties();
InputStream in = null;
try {
//第一种,通过类加载器进行获取properties文件流
in = PropertiesUtil.class.getClassLoader().getResourceAsStream(propertiesFilePath);
//第二种,通过类进行获取properties文件流
//in = PropertiesFileUtil.class.getResourceAsStream("/"+propertiesFilePath);
props.load(new InputStreamReader(in, "utf-8"));
} finally {
if (null != in) {
in.close();
}
}
return props;
}


/**
* 根据属性文件路径和属性的键获取属性的值
* @param propertiesFilePath
* @param key
* @return
* @throws IOException
*/
public static String getProperty(String propertiesFilePath, String key) throws IOException {
Properties props = getProperties(propertiesFilePath);
return props.getProperty(key);
}

/**
* 写Properties文件
*/
public static void writePropertiesFile(Map<String,String> propsMap , String outputPropertiesFilePath) throws Exception {

if(propsMap.isEmpty() || propsMap.containsKey("") ){
throw new Exception("传入的键值对不能为空且键值对的主键不能包含空!");
}

if( !outputPropertiesFilePath.endsWith(".properties")){
throw new Exception("输出文件路径需要以.properties为结尾!");
}

//文件路径的文件夹不存在则创建
String fileSeparator = File.separator;
String dirPath = outputPropertiesFilePath.substring(0,outputPropertiesFilePath.lastIndexOf(fileSeparator)) ;
if( !new File(dirPath).exists()){
new File(dirPath).mkdirs();
}

Properties prop = new Properties() ;
Iterator<Map.Entry<String, String>> it = propsMap.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String, String> entry = it.next();
prop.setProperty( entry.getKey(),entry.getValue());
}

FileOutputStream oFile = null ;
try {
//保存属性到b.properties文件
oFile = new FileOutputStream(outputPropertiesFilePath, false);//true表示追加打开,false每次都是清空再重写
//prop.store(oFile, "此参数是保存生成properties文件中第一行的注释说明文字");//这个会两个地方乱码
//prop.store(new OutputStreamWriter(oFile, "utf-8"), "汉字乱码");//这个就是生成的properties文件中第一行的注释文字乱码
prop.store(new OutputStreamWriter(oFile, "utf-8"), null);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (oFile != null ) {
oFile.close();
}
}
}


public static void main(String[] args) throws Exception {
String propertiesFilePath = "properties/userinfo.properties";
Properties props = getProperties(propertiesFilePath);
Iterator<String> it = props.stringPropertyNames().iterator();
Map<String,String> propsMap = new HashMap<String,String>();
while (it.hasNext()) {
String key = it.next();
String value = props.getProperty(key) ;
System.out.println(key + ":" + value);
propsMap.put(key,value);
}
writePropertiesFile(propsMap,"C:\Users\Administrator\Desktop\properties\userinfo2.properties");

}
}
 
ConnectionUtil 类:
package com.etoak.util;

import java.io.IOException;
import java.sql.*;
import java.util.Properties;

public class ConnectionUtil {


    //获得链接
    public static  Connection getConn(String propertiesFilePath) throws ClassNotFoundException, SQLException, IOException {
        Properties props = PropertiesUtil.getProperties(propertiesFilePath);
        Class.forName(props.getProperty("driver"));
        return DriverManager.getConnection(props.getProperty("url"), props.getProperty("user"), props.getProperty("password"));
    }

    //释放链接
    public static void release(Connection conn, Statement st, PreparedStatement pst, ResultSet rs) throws SQLException {
        if (rs != null) {
            try {
                rs.close();
            } finally {
                try {
                    if (st != null) {
                        st.close();
                    } else if (pst != null) {
                        pst.close();
                    }
                } finally {
                    if (conn != null) {
                        conn.close();
                    }
                }
            }
        }
    }
}

Daka类:

package com.etoak;

import com.etoak.util.ConnectionUtil;
import com.etoak.util.PropertiesUtil;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;

public class Daka {

    public static void daka(String jdbcPropertiesFilePath, String userinfoPropertiesFilePath) throws SQLException, ClassNotFoundException, IOException {

        //用户名
        String name = PropertiesUtil.getProperty(userinfoPropertiesFilePath, "username");
        String[] xqArr = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        Calendar calendar = Calendar.getInstance();//可以对每个时间域单独修改
        int day = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        String xq = xqArr[day];
        String flag = "0";
        int hour = calendar.get(Calendar.HOUR_OF_DAY);

        if (day == 0 || day == 6) {
            flag = "3"; //周末加班
        } else {
            if (hour <= 19) {
                flag = "1"; // 平时正常点上下班
            } else {
                flag = "2"; // 平时加班
            }
        }

        /* 持久化到数据库中*/
        Connection conn = ConnectionUtil.getConn(jdbcPropertiesFilePath);
        String insertSql = "insert into WORKTIMERECODE (recordId , name , rq , xq , flag , workstartTime , workendTime ) select  " +
                " sys_guid() , '" + name + "' , trunc(sysdate,'dd') , '" + xq + "' , '" + flag + "' , to_char(trunc(sysdate,'mi'),'hh24:mi') , to_char(trunc(sysdate,'mi'),'hh24:mi') from dual ";
        String updateSql = "update WORKTIMERECODE set (flag, workendtime ) = ( select '" + flag + "' ,  to_char(trunc(sysdate,'mi'),'hh24:mi') from dual ) where rq = trunc(sysdate,'dd') ";

        Statement st = conn.createStatement();
        int un = st.executeUpdate(updateSql);
        if (un == 0) {
            st.executeUpdate(insertSql);
        }
        ConnectionUtil.release(conn, st, null, null);
    }


    public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
        String jdbcPropertiesFilePath = "properties/jdbc.properties";
        String userinfoPropertiesFilePath = "properties/userinfo.properties";
        daka(jdbcPropertiesFilePath,userinfoPropertiesFilePath);
        System.out.println(Calendar.getInstance().getTime() +"  SUCCESSED");
    }

}

 执行Maven clean  >> Maven install >> Maven package ;

上班打卡--- 通过批处理命令执行jar文件来记录上班时间

 使用这个带依赖关系的jar包,并更名为daka.jar ; 

先使用 cmd 命令行执行一下 ; 

执行结果如下, 没有报错说明执行成功了;

上班打卡--- 通过批处理命令执行jar文件来记录上班时间

 2: 写批处理脚本;

上班打卡--- 通过批处理命令执行jar文件来记录上班时间

echo off 
cd/d "C:UsersAdministratorDesktop"
java -jar daka.jar 
pause

上面脚本的注释: 

1: echo off  :关闭打印输出;

2: cd/d 打开目录 "C:UsersAdministratorDesktop"  目录文件路径;

3: java -jar daka.jar  执行 daka.jar 的 cmd命令 ;

4: pause 暂停 ; 不然的话 就会一闪而过 ; 

OK  执行结果如下:

上班打卡--- 通过批处理命令执行jar文件来记录上班时间

3: 再下面一步: 设置成为开机启动时执行:

 将脚本放到开机启动的文件夹下即可开机启动: 

如果找不到路径 有肯能是隐藏了; 需要显示隐藏文件;

 上班打卡--- 通过批处理命令执行jar文件来记录上班时间

 下面是源代码:

https://pan.baidu.com/s/1dE3OGUX

jjs9