# occd-commons **Repository Path**: personalhyz/occd-commons ## Basic Information - **Project Name**: occd-commons - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-10 - **Last Updated**: 2026-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OCCD Commons ## 一、引言 > 鉴于许多公共工具、组件复用困难,遂创建该项目,整合多个公共工具等。 ## 二、使用 ### 引入依赖 #### 1、本地安装的方式 > 拉取项目:`git clone https://gitee.com/personalhyz/occd-commons.git` 到本地,使用 `maven` 工具 `package` 后再 `install` ,即可将 `jar` 安装到本地的 `maven` 仓库,直接在项目 `pom` 文件中引入: ```xml cn.occd occd-commons 版本 ``` > `*` 注意,`maven` 本地仓库的目录必须相同,否则无法引入 #### 2、直接引入`jar`包 > 还有一种方式是将项目直接打成 `jar` 包,放入项目根目录中,通过系统引入的方式。 > 在业务项目的根目录中创建一个文件夹 `lib` ,将打好的 `jar` 包复制进这个文件夹,在 `pom` 中添加: ```xml cn.occd occd-commons 版本 system ${project.basedir}/lib/occd-commons-版本.jar ``` #### 3、从在线 `maven` 仓库中引入 > `待定`,等待仓库建成 ## 二、简易文档 ### 通用返回 > 建议所有的项目都统一使用通用返回 > 手动构建一个服务器错误通用返回对象 ```java Res.of().code(ResCode.ERROR) .success(false) .message("error") .data(null) .metadata(null) .create(); ``` > 快速构建一个失败返回: ```java Res.fail(); ``` > 当然,它是重载的: ```java Res.fail("fail"); // 默认错误代码是 BAD_REQUEST 400 Res.fail("fail",data); // 默认错误代码是 BAD_REQUEST 400 Res.fail("fail",data,metadata); // 默认错误代码是 BAD_REQUEST 400 Res.fail(ResCode.BAD_REQUEST,"fail",data,metadata); ``` > `data` 属性可以是任何类型,建议在使用时通过泛型指明 `data` 的类型 > `metadata` 元数据,它可以携带许多对 `data` 的描述,构建一个空 `metadata` 对象: ```java Metadata.of().create(); ``` > 携带一些信息,以分页为例: ```java Metadata.of().currentPage(1) // 当前页 .pageSize(10) // 页长度 .totalItems(100) // 总共有多少条数据 .create(); ``` > 如果 `Metadata` 类没有提供你想使用的属性,那么可以在自定义方法 `custom()` 中添加: ```java Metadata.of().custom("key1","value") .custom("key2",1) .custom("key3",false) .custom("key4",Object) .create(); ``` > 它是一个 `map` ,在响应结果的 `json` 中存储在 `custom` 字段中 > 一个分页查询用户数据成功的例子,使用 `mybatis-plus`: ```java Page userPaged = userMapper.selectPage(new Page(currentPage,pageSize),new QueryWrapper(user)); return Res.success("查询成功", userPaged.getRecords(), Metadata.ofPaged(userPaged.getTotal())); ``` > 这个例子查询了用户信息的第 `currentPage` 页的 `pageSize` 条数据,并将总共有多少条数据也响应了。 ### `AES` 工具 > 在一些需求性能的加密场景中,可以使用 `AES` 代替 `RSA` 工具会更好。 > 算法默认使用 `AES` 算法,加密模式和填充方式默认使用 `AES/ECB/PKCS5Padding` > 生成密钥: ```java AESUtil.generateKey(); // 默认使用256长度的key AESUtil.generateKey(128); // 使用128长度的key ``` > 加密解密直接看方法就懂 > 你也可以使用统一入口: ```java PowerchinaCommons.AESUtil.方法(); ``` ### `RSA` 工具 > 默认使用 `RSA` 算法,加密模式和填充方式默认使用 `RSA/ECB/OAEPWithSHA-256AndMGF1Padding` > 用法就不再过多介绍 > 你也可以使用统一入口: ```java PowerchinaCommons.RSAUtil.方法(); ``` ### 拼音工具 > 获取中文字符串的拼音首字符大写 ```java PinyinUtil.getFirstLetterUpperCase("中文"); // ZW ``` > 获取每个汉字的首字母 ```java PinyinUtil.getEachFirstLetter("今天天气不错"); // jttqbc ``` > 你也可以使用统一入口: ```java PowerchinaCommons.PinyinUtil.方法(); ``` ### 密码验证器 > 该工具默认验证英文字符串: > > 1、字符串是否为空。 > > 2、字符串长度不能少于8位 > > 3、字符串中是否包含大写字母。 > > 4、字符串中是否包含小写字母。 > > 5、字符串中是否包含数字。 > > 6、字符串中是否包含特殊字符。 ```java PasswordValidator.validate("password"); ``` > 当字符串不符合要求时抛出 `IllegalStateException` 异常,`message` 中包含异常信息。 > 你也可以使用统一入口: ```java PowerchinaCommons.PasswordValidator.方法(); ``` ### SQL生成器 > 手写 `sql` 太麻烦,你可以只写一个 `Java` 实体,然后把它传递给 `SQLConverter` ,即可帮你生成一个创建表的 `sql`: ```java SQLConverter.createTable(DBType.MYSQL, Test.class); public static class Test{ private Integer id; private String name; private Integer age; private String address; } ``` > 生成的 `sql`: ```sql CREATE TABLE IF NOT EXISTS test( id INT(128) NOT NULL, name VARCHAR(255) NOT NULL, age INT(128) NOT NULL, address VARCHAR(255) NOT NULL ); ``` > 目前 `0.2.1` 版本只支持 `Mysql`,其他数据库待完善 > 你也可以使用统一入口: ```java PowerchinaCommons.SQLConverter.方法(); ``` ### 序列工具 > 在业务开发中,我们会遇到一些生成业务单号的情况,例如某个单号,`BUSINESS2025001`,它的规则是一开始的 `BUSINESS` 是不变的,后面的 `2025` 是根据年份变动的,`001` 是根据流水号经常变动的,如果单号只有一种那么不会那么复杂,要是单号有多种,就变得麻烦了。 > 这个工具就可以帮你完成这些管理,你只需要配置规则即可。 > 例如上面这个例子,我们仅需配置规则对象 `SequencePolicy` : ```json { "index": 0, "dynamic": "FIXED", "type": "TEXT", "value": "BUSINESS" }, { "index": 1, "dynamic": "INCREMENT", "type": "DATE", "pattern": "yyyy" }, { "index": 2, "dynamic": "INCREMENT", "type": "NUMBER", "maxlength": 3, "stepsize": 1, "start": 0, "end": 999 } ``` > 并将这些规则存入数据库,使用的时候查出来,并交给工具,例如自增: ```java List policies = 存储中查询来的规则数据; List incrementPolicies = SequenceUtil.incrementSequence(policies); ``` > 即可根据规则将规则中存储的值变动一次,如果我们想获取规则值,也就是将规则组装为字符串,可以: ```java List policies = 存储中查询来的规则数据; List incrementPolicies = SequenceUtil.incrementSequence(policies); String val = SequenceUtil.getSequenceValue(incrementPolicies); ``` > 即可得到 `BUSINESS2025002` ,经过规则自增的值。 > 变动类型有三种:固定值、随机值、自增值: ```java public enum Dynamic { FIXED,RANDOM,INCREMENT } ``` > 值类型有三种:文本、日期、数字: ```java public enum Type{ TEXT,DATE,NUMBER } ``` > 经过不同的规则组合,即可生成对应的序列号。 > 你也可以使用统一入口: ```java PowerchinaCommons.SequenceUtil.方法(); ``` ### Bean对象工具 #### 对象拷贝 > 我们常常会使用对象拷贝工具来拷贝两个对象,例如: ```java Dog d = new Dog(); Dog j = new JinMao(); BeanUtil.copyProperties(d,j); ``` > 或者使用原始的getter/setter: ```java Dog d = new Dog(); Dog j = new JinMao(); j.setA(d.getA()); j.setB(d.getB()); ``` > 使用spring自带的对象拷贝工具很简便,缺点是速度慢,尤其是当大量拷贝的时候。使用getter/setter缺点是要写一大堆。 > 使用我们的工具: ```java BeanManager.copy(source,target); ``` > 即可完成拷贝,基于cglib的 `BeanCopier` ,所以速度特别快,代码也不用写多少。