个人编写的小工具一览

程序的出现很大程度是为了解决效率低下的重复劳作,这样大家才能把时间花在更需要创造力的事情上。

然而工作和生活中经常遇到多次执行重复的步骤或程序,总忍不住想要做个工具,避免把生命浪费在这些无聊的事情上。

静夜思:

能否用程序代替重复劳作?

如果编写这段程序本身是一段重复劳作,能否用另一段程序代替编写程序?

如果上述用来代替编写程序的程序还是重复劳作。。。

代码相关

千行代码一键生成

背景:

公司的基础层模型为 mapper -> service -> open api

服务层模型为 open api -> remote service -> controller(HTTP service)

运营后台模型 xml(open api) -> controller(HTTP service) -> jsp

由于业务迭代迅速,经常新建表,每次建完上面这几个模型几乎每一层都要拷拷改改相应的代码,来来回回熟练的话也得1~2小时,还可能出错,比如少拷字段之类的,排查又要花成倍的时间。

由于这个架构是公司内部使用的,市面上的插件不能覆盖全部需求,只能自己造轮子了。

思路:

用代码生成代码,几个模型每一层都覆盖到;

java对模板字符串支持很不友好,改用kotlin编写小工具;

需要实现常用的方法:save,update,delete,get,listOfIds,listByDto

结果:

使用工具前 使用工具后
耗时 1~2小时 5分钟
操作次数 200次 10次
bug率 10% 0%

生成的代码已经成了公司的一种规范,新加入的成员理解代码结构特别容易,可以更专注地进行业务开发。

展示:

数据表结构

image-20210113144653739

生成代码过程

qian

代码一览

code2

前端页面

web


junit单点压测

背景:

开发中提供出去接口经常遇到性能问题,但流程一般是这样

开发-> 压测 -> 压测报告 -> 优化

整个流程下来少说也有2天,这对优化来说是个很大的阻碍。

自然会想到,自己写完要是有个什么东西能测一下方法性能就好了,也不用太精确,至少优化完能看到效果就行。

思路:

写完方法单元测试是少不了的,如果单元测试还能给出“压测结果”,那就一步到位了。

能否扩展Junit框架加入自定义的功能?代码层如何进行配置?

参考:

junit的注解@RunWith,核心接口——org.junit.runners.model.Statement,装饰者模式

结果:

使用工具前 使用工具后
耗时 1~2天 10分钟
操作次数 20次 2次
bug率 10% 10%

展示:

测试机配置

image-20210113184858959

测试数据库获取单个

image-20210113184439726

image-20210113184625751

测试redis单条命令

image-20210113184555333

image-20210113184918417

测试java创建对象

image-20210113184816739

image-20210113185113001

测试斐波那契数列

递归版

image-20210113190104689

public int fibonacci(int n) {
        if (n <=2 ) {
            return 1;
        }
        return fibonacci(n-1)+fibonacci(n-2);
    }

image-20210113190132508

缓存版

image-20210113190116111

public int fibonacciOpt(int n) {
        int[] arr = new int[n+1];
        arr[0]=0;
        arr[1]=1;
        for (int i = 2; i <= n; i++) {
            arr[i] = arr[i-1] + arr[i-2];
        }
        return arr[n];
    }

image-20210113190350171


java分页请求处理工具

背景:

由于微服务的盛行,各业务从设计之初就被拆到了不同的库和不同的表,但需求来的时候可不会管你这些,你又得把分散到各个库的数据组合起来最终返回个json给前端。但有些表是别的业务端在管,他们甚至会对接口主动施加各种各样的限制,比如每次请求最多只给你返回20条,遇到这种情况多了自然会想到写个分页工具。

思路:

想想整个流程是怎样的?

  1. 发现list(K)中有些字段未填充。
  2. 上述字段应该通过一个主键id调用其它接口拿,我该找哪个业务部门要
  3. 如果目标接口做了限制,一次只查20条,我该如何分页?
  4. 我拿到了目标接口返回的list(T)对象。
  5. list(T)中每一条数据如何和我最开始的list(K)每一条数据对应上?(其实就是通过主键id对应)
  6. 我该取T对象中哪些属性赋值到K上以填充想要的数据?

结果:

使用工具前 使用工具后
耗时 30分钟 2分钟
操作次数 20次 2次
bug率 30% 10%

展示:

举个例子,我的K对象中只有userId,而userName还未填充值,我知道要调用哪个接口,但请求中分页的细节我不想管,接口返回如何与这条数据对应的关系我告诉你你来对应,我只想告诉你T如何把数据填充到K上,剩下的我统统不想做。

image-20210114112947170

该场景的调用代码

image-20210114113708706

工具内部还统一对请求做了优化:

  1. 如果某条K的对应主键id为空,忽略;
  2. 如果多条K的主键id重复,那么请求中只应该包含1条id记录,即10条K的userId都是1001,那么请求出去只有1个1001,这样可以最大减少带宽消耗,也能提升查询速度,但此时1条结果T应该要对应至原始的10条K数据中。

一键打包上传至maven仓库

背景:

公司用的是dubbo框架,但别人需要你的接口时你的提供jar包,一般是pom坐标的形式提供出去。打包竟然是手动引入class文件的,经常出现忘记打入某些类的情况,打完还得用nexus传jar包填坐标(如下图),十分不方便。

image-20210113192211703

思路:

能不能用一个配置文件记录我要打的jar包和它的坐标,以及要打入哪些class文件?

打jar包传到仓库时能否替我计算出一个最新版本?

结果:

使用工具前 使用工具后
耗时 15分钟 5分钟
操作次数 20次 2次
bug率 10% 10%

耗时没降多少,但整个流程连起来了,从落后的手动选择class文件到无人值守打包,在这之后公司多了很多这样的人——点击脚本,上厕所,接开水,回来拷贝更新pom坐标接着写代码,

展示:

坐标配置

image-20210113192426944

配置并利用maven打包插件

<profile>
            <id>jar-tmCourse</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jar-plugin</artifactId>
                        <version>2.4</version>
                        <configuration>
                            <finalName>tmCourse-${pkg}</finalName>
                            <includes>
                                <include>com/zhihuishu/aries/tmCourse/openapi/*</include>
                                <include>com/zhihuishu/aries/tmCourse/openapi/dto/*</include>
                            </includes>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>

打包脚本目录

image-20210113192620846

运行展示

pkg


文件处理

解析excel

背景:

工作中经常遇到运营部门发个excel过来,最终目标其实就是生成一些sql放到外网执行,但此类需求频率比较高,应抽出重复部分作为“微服务”,加速下次处理流程

思路:

(重复)读取excel

(重复)读取每一个sheet

(重复)读取每一个sheet的每一行

(重复)读取每一个sheet的每一行的每一个单元格

分析从每一行能得到什么信息,以一个map表示,将一个个map变成一条条sql,打印

审核后拷到外网执行

结果:

使用工具前 使用工具后
耗时 30分钟 10分钟
操作次数 100次 20次
bug率 30% 10%

展示:

excel记录

image-20210113190808303

代码

image-20210113191054728

结果

image-20210113190946079


数据导出到excel

背景:

工作中经常遇到运营部门需要某些数据,用excel发给他们,就是写条sql运行完保存到excel中,但将数据变成excel的操作过程比较繁琐,哪怕有可视化界面,而且还需要拖动调整列宽让excel好看点。

此类需求频率比较高,应抽出重复部分作为“微服务”,加速下次处理流程

思路:

写sql

(重复)外网环境执行sql

(重复)生成一个空excel

(重复)读取sql结果中的列名,解析到excel表头中

(重复)读取sql结果中的数据,解析到excel数据行中

(重复)调整excel样式——表头底色,列宽

美滋滋地发给运营人员

结果:

使用工具前 使用工具后
耗时 10分钟 1分钟
操作次数 20次 2次
bug率 10% 10%

展示:

代码

image-20210113191339963

导出的excel

image-20210113191414563


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注