# 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` ,所以速度特别快,代码也不用写多少。