From f47569e426dd8fddb78529bf57e9406fee83078c Mon Sep 17 00:00:00 2001
From: Kris <2893855659@qq.com>
Date: Wed, 4 Dec 2024 01:29:28 +0800
Subject: [PATCH] =?UTF-8?q?[feat]=20mybatis=E6=8B=A6=E6=88=AA=E5=99=A8?=
=?UTF-8?q?=E5=A2=9E=E5=BC=BAsql?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/resources/mybatis/mybatis-config.xml | 5 +
.../czsj/common/constant/CommonConstant.java | 620 ++++++++++
.../czsj/common/constant/SymbolConstant.java | 123 ++
.../com/czsj/common/utils/oConvertUtils.java | 1025 +++++++++++++++++
.../interceptor/MybatisInterceptor.java | 136 +++
5 files changed, 1909 insertions(+)
create mode 100644 czsj-common/src/main/java/com/czsj/common/constant/CommonConstant.java
create mode 100644 czsj-common/src/main/java/com/czsj/common/constant/SymbolConstant.java
create mode 100644 czsj-common/src/main/java/com/czsj/common/utils/oConvertUtils.java
create mode 100644 czsj-framework/src/main/java/com/czsj/framework/interceptor/MybatisInterceptor.java
diff --git a/czsj-admin/src/main/resources/mybatis/mybatis-config.xml b/czsj-admin/src/main/resources/mybatis/mybatis-config.xml
index ac47c03..c832323 100644
--- a/czsj-admin/src/main/resources/mybatis/mybatis-config.xml
+++ b/czsj-admin/src/main/resources/mybatis/mybatis-config.xml
@@ -15,6 +15,11 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+
+
+
+
+
diff --git a/czsj-common/src/main/java/com/czsj/common/constant/CommonConstant.java b/czsj-common/src/main/java/com/czsj/common/constant/CommonConstant.java
new file mode 100644
index 0000000..b62eb5a
--- /dev/null
+++ b/czsj-common/src/main/java/com/czsj/common/constant/CommonConstant.java
@@ -0,0 +1,620 @@
+package com.czsj.common.constant;
+
+/**
+ * @Description: 通用常量
+ * @author: jeecg-boot
+ */
+public interface CommonConstant {
+
+ /**
+ * 正常状态
+ */
+ Integer STATUS_NORMAL = 0;
+
+ /**
+ * 禁用状态
+ */
+ Integer STATUS_DISABLE = -1;
+
+ /**
+ * 删除标志
+ */
+ Integer DEL_FLAG_1 = 1;
+
+ /**
+ * 未删除
+ */
+ Integer DEL_FLAG_0 = 0;
+
+ /**
+ * 系统日志类型: 登录
+ */
+ int LOG_TYPE_1 = 1;
+
+ /**
+ * 系统日志类型: 操作
+ */
+ int LOG_TYPE_2 = 2;
+
+ /**
+ * 系统日志类型: 租户操作日志
+ */
+ int LOG_TYPE_3 = 3;
+
+ /**
+ * 系统日志类型: 异常
+ */
+ int LOG_TYPE_4 = 4;
+
+ /**
+ * 操作日志类型: 查询
+ */
+ int OPERATE_TYPE_1 = 1;
+
+ /**
+ * 操作日志类型: 添加
+ */
+ int OPERATE_TYPE_2 = 2;
+
+ /**
+ * 操作日志类型: 更新
+ */
+ int OPERATE_TYPE_3 = 3;
+
+ /**
+ * 操作日志类型: 删除
+ */
+ int OPERATE_TYPE_4 = 4;
+
+ /**
+ * 操作日志类型: 倒入
+ */
+ int OPERATE_TYPE_5 = 5;
+
+ /**
+ * 操作日志类型: 导出
+ */
+ int OPERATE_TYPE_6 = 6;
+
+
+ /** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */
+ Integer SC_INTERNAL_SERVER_ERROR_500 = 500;
+ /** {@code 404 Not Found} (HTTP/1.0 - RFC 1945) */
+ Integer SC_INTERNAL_NOT_FOUND_404 = 404;
+ /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */
+ Integer SC_OK_200 = 200;
+
+ /**访问权限认证未通过 510*/
+ Integer SC_JEECG_NO_AUTHZ=510;
+
+ /** 登录用户Shiro权限缓存KEY前缀 */
+ public static String PREFIX_USER_SHIRO_CACHE = "shiro:cache:org.jeecg.config.shiro.ShiroRealm.authorizationCache:";
+ /** 登录用户Token令牌缓存KEY前缀 */
+ String PREFIX_USER_TOKEN = "prefix_user_token:";
+// /** Token缓存时间:3600秒即一小时 */
+// int TOKEN_EXPIRE_TIME = 3600;
+
+ /** 登录二维码 */
+ String LOGIN_QRCODE_PRE = "QRCODELOGIN:";
+ String LOGIN_QRCODE = "LQ:";
+ /** 登录二维码token */
+ String LOGIN_QRCODE_TOKEN = "LQT:";
+
+
+ /**
+ * 0:一级菜单
+ */
+ Integer MENU_TYPE_0 = 0;
+ /**
+ * 1:子菜单
+ */
+ Integer MENU_TYPE_1 = 1;
+ /**
+ * 2:按钮权限
+ */
+ Integer MENU_TYPE_2 = 2;
+
+ /**通告对象类型(USER:指定用户,ALL:全体用户)*/
+ String MSG_TYPE_UESR = "USER";
+ String MSG_TYPE_ALL = "ALL";
+
+ /**发布状态(0未发布,1已发布,2已撤销)*/
+ String NO_SEND = "0";
+ String HAS_SEND = "1";
+ String HAS_CANCLE = "2";
+
+ /**阅读状态(0未读,1已读)*/
+ Integer HAS_READ_FLAG = 1;
+ Integer NO_READ_FLAG = 0;
+
+ /**优先级(L低,M中,H高)*/
+ String PRIORITY_L = "L";
+ String PRIORITY_M = "M";
+ String PRIORITY_H = "H";
+
+ /**
+ * 短信模板方式 0 .登录模板、1.注册模板、2.忘记密码模板
+ */
+ String SMS_TPL_TYPE_0 = "0";
+ String SMS_TPL_TYPE_1 = "1";
+ String SMS_TPL_TYPE_2 = "2";
+
+ /**
+ * 状态(0无效1有效)
+ */
+ String STATUS_0 = "0";
+ String STATUS_1 = "1";
+
+ /**
+ * 同步工作流引擎1同步0不同步
+ */
+ Integer ACT_SYNC_1 = 1;
+ Integer ACT_SYNC_0 = 0;
+
+ /**
+ * 消息类型1:通知公告2:系统消息
+ */
+ String MSG_CATEGORY_1 = "1";
+ String MSG_CATEGORY_2 = "2";
+
+ /**
+ * 是否配置菜单的数据权限 1是0否
+ */
+ Integer RULE_FLAG_0 = 0;
+ Integer RULE_FLAG_1 = 1;
+
+ /**
+ * 是否用户已被冻结 1正常(解冻) 2冻结 3离职
+ */
+ Integer USER_UNFREEZE = 1;
+ Integer USER_FREEZE = 2;
+ Integer USER_QUIT = 3;
+
+ /**字典翻译文本后缀*/
+ String DICT_TEXT_SUFFIX = "_dictText";
+ /**字典翻译颜色后缀*/
+ String DICT_COLOR_SUFFIX = "_dictColor";
+
+ /**
+ * 表单设计器主表类型
+ */
+ Integer DESIGN_FORM_TYPE_MAIN = 1;
+
+ /**
+ * 表单设计器子表表类型
+ */
+ Integer DESIGN_FORM_TYPE_SUB = 2;
+
+ /**
+ * 表单设计器URL授权通过
+ */
+ Integer DESIGN_FORM_URL_STATUS_PASSED = 1;
+
+ /**
+ * 表单设计器URL授权未通过
+ */
+ Integer DESIGN_FORM_URL_STATUS_NOT_PASSED = 2;
+
+ /**
+ * 表单设计器新增 Flag
+ */
+ String DESIGN_FORM_URL_TYPE_ADD = "add";
+ /**
+ * 表单设计器修改 Flag
+ */
+ String DESIGN_FORM_URL_TYPE_EDIT = "edit";
+ /**
+ * 表单设计器详情 Flag
+ */
+ String DESIGN_FORM_URL_TYPE_DETAIL = "detail";
+ /**
+ * 表单设计器复用数据 Flag
+ */
+ String DESIGN_FORM_URL_TYPE_REUSE = "reuse";
+ /**
+ * 表单设计器编辑 Flag (已弃用)
+ */
+ String DESIGN_FORM_URL_TYPE_VIEW = "view";
+
+ /**
+ * online参数值设置(是:Y, 否:N)
+ */
+ String ONLINE_PARAM_VAL_IS_TURE = "Y";
+ String ONLINE_PARAM_VAL_IS_FALSE = "N";
+
+ /**
+ * 文件上传类型(本地:local,Minio:minio,阿里云:alioss)
+ */
+ String UPLOAD_TYPE_LOCAL = "local";
+ String UPLOAD_TYPE_MINIO = "minio";
+ String UPLOAD_TYPE_OSS = "alioss";
+
+ /**
+ * 文档上传自定义桶名称
+ */
+ String UPLOAD_CUSTOM_BUCKET = "eoafile";
+ /**
+ * 文档上传自定义路径
+ */
+ String UPLOAD_CUSTOM_PATH = "eoafile";
+ /**
+ * 文件外链接有效天数
+ */
+ Integer UPLOAD_EFFECTIVE_DAYS = 1;
+
+ /**
+ * 员工身份 (1:普通员工 2:上级)
+ */
+ Integer USER_IDENTITY_1 = 1;
+ Integer USER_IDENTITY_2 = 2;
+
+ /** sys_user 表 username 唯一键索引 */
+ String SQL_INDEX_UNIQ_SYS_USER_USERNAME = "uniq_sys_user_username";
+ /** sys_user 表 work_no 唯一键索引 */
+ String SQL_INDEX_UNIQ_SYS_USER_WORK_NO = "uniq_sys_user_work_no";
+ /** sys_user 表 phone 唯一键索引 */
+ String SQL_INDEX_UNIQ_SYS_USER_PHONE = "uniq_sys_user_phone";
+ /** 达梦数据库升提示。违反表[SYS_USER]唯一性约束 */
+ String SQL_INDEX_UNIQ_SYS_USER = "唯一性约束";
+
+ /** sys_user 表 email 唯一键索引 */
+ String SQL_INDEX_UNIQ_SYS_USER_EMAIL = "uniq_sys_user_email";
+ /** sys_quartz_job 表 job_class_name 唯一键索引 */
+ String SQL_INDEX_UNIQ_JOB_CLASS_NAME = "uniq_job_class_name";
+ /** sys_position 表 code 唯一键索引 */
+ String SQL_INDEX_UNIQ_CODE = "uniq_code";
+ /** sys_role 表 code 唯一键索引 */
+ String SQL_INDEX_UNIQ_SYS_ROLE_CODE = "uniq_sys_role_role_code";
+ /** sys_depart 表 code 唯一键索引 */
+ String SQL_INDEX_UNIQ_DEPART_ORG_CODE = "uniq_depart_org_code";
+ /** sys_category 表 code 唯一键索引 */
+ String SQL_INDEX_UNIQ_CATEGORY_CODE = "idx_sc_code";
+ /**
+ * 在线聊天 是否为默认分组
+ */
+ String IM_DEFAULT_GROUP = "1";
+ /**
+ * 在线聊天 图片文件保存路径
+ */
+ String IM_UPLOAD_CUSTOM_PATH = "biz/user_imgs";
+ /**
+ * 在线聊天 用户状态
+ */
+ String IM_STATUS_ONLINE = "online";
+
+ /**
+ * 在线聊天 SOCKET消息类型
+ */
+ String IM_SOCKET_TYPE = "chatMessage";
+
+ /**
+ * 在线聊天 是否开启默认添加好友 1是 0否
+ */
+ String IM_DEFAULT_ADD_FRIEND = "1";
+
+ /**
+ * 在线聊天 用户好友缓存前缀
+ */
+ String IM_PREFIX_USER_FRIEND_CACHE = "sys:cache:im:im_prefix_user_friend_";
+ /**
+ * 缓存用户id与用户名关系
+ */
+ String SYS_USER_ID_MAPPING_CACHE = "sys:cache:user:id_mapping";
+
+ /**
+ * 考勤补卡业务状态 (1:同意 2:不同意)
+ */
+ String SIGN_PATCH_BIZ_STATUS_1 = "1";
+ String SIGN_PATCH_BIZ_STATUS_2 = "2";
+
+ /**
+ * 公文文档上传自定义路径
+ */
+ String UPLOAD_CUSTOM_PATH_OFFICIAL = "officialdoc";
+ /**
+ * 公文文档下载自定义路径
+ */
+ String DOWNLOAD_CUSTOM_PATH_OFFICIAL = "officaldown";
+
+ /**
+ * WPS存储值类别(1 code文号 2 text(WPS模板还是公文发文模板))
+ */
+ String WPS_TYPE_1="1";
+ String WPS_TYPE_2="2";
+
+
+ /**===============================================================================================*/
+ /**
+ * ::非常重要::
+ * 注意:这四个常量值如果修改,需要与 jeecg-boot-starter/jeecg-boot-common/org.jeecg.config.FeignConfig 类中的值保持一致。
+ */
+ String X_ACCESS_TOKEN = "X-Access-Token";
+ String X_SIGN = "X-Sign";
+ String X_TIMESTAMP = "X-TIMESTAMP";
+ /** 租户请求头 更名为:X-Tenant-Id */
+ String TENANT_ID = "X-Tenant-Id";
+ /** 简流接口请求头,用于排除不支持的控件字段 */
+ String X_MiniFlowExclusionFieldMode = "X-Miniflowexclusionfieldmode";
+ /**===============================================================================================*/
+
+ String TOKEN_IS_INVALID_MSG = "Token失效,请重新登录!";
+ String X_FORWARDED_SCHEME = "X-Forwarded-Scheme";
+
+
+ /**
+ * 微服务读取配置文件属性 服务地址
+ */
+ String CLOUD_SERVER_KEY = "spring.cloud.nacos.discovery.server-addr";
+
+ /**
+ * 第三方登录 验证密码/创建用户 都需要设置一个操作码 防止被恶意调用
+ */
+ String THIRD_LOGIN_CODE = "third_login_code";
+
+ /**
+ * 第三方APP同步方向:本地 --> 第三方APP
+ */
+ String THIRD_SYNC_TO_APP = "SYNC_TO_APP";
+ /**
+ * 第三方APP同步方向:第三方APP --> 本地
+ */
+ String THIRD_SYNC_TO_LOCAL = "SYNC_TO_LOCAL";
+
+ /** 系统通告消息状态:0=未发布 */
+ String ANNOUNCEMENT_SEND_STATUS_0 = "0";
+ /** 系统通告消息状态:1=已发布 */
+ String ANNOUNCEMENT_SEND_STATUS_1 = "1";
+ /** 系统通告消息状态:2=已撤销 */
+ String ANNOUNCEMENT_SEND_STATUS_2 = "2";
+
+ /**ONLINE 报表权限用 从request中获取地址栏后的参数*/
+ String ONL_REP_URL_PARAM_STR="onlRepUrlParamStr";
+
+ /**POST请求*/
+ String HTTP_POST = "POST";
+
+ /**PUT请求*/
+ String HTTP_PUT = "PUT";
+
+ /**PATCH请求*/
+ String HTTP_PATCH = "PATCH";
+
+ /**未知的*/
+ String UNKNOWN = "unknown";
+
+ /**字符串http*/
+ String STR_HTTP = "http";
+
+ /**String 类型的空值*/
+ String STRING_NULL = "null";
+
+ /**前端vue3版本Header参数名*/
+ String VERSION="X-Version";
+
+ String VERSION_V3 = "v3";
+
+ /**存储在线程变量里的动态表名*/
+ String DYNAMIC_TABLE_NAME="DYNAMIC_TABLE_NAME";
+ /**
+ * http:// http协议
+ */
+ String HTTP_PROTOCOL = "http://";
+
+ /**
+ * https:// https协议
+ */
+ String HTTPS_PROTOCOL = "https://";
+
+ /** 部门表唯一key,id */
+ String DEPART_KEY_ID = "id";
+ /** 部门表唯一key,orgCode */
+ String DEPART_KEY_ORG_CODE = "orgCode";
+
+ /**======【消息推送相关】==============================================================================*/
+ /**
+ * 发消息 会传递一些信息到map
+ */
+ String NOTICE_MSG_SUMMARY = "NOTICE_MSG_SUMMARY";
+
+ /**
+ * 发消息 会传递一个业务ID到map
+ */
+ String NOTICE_MSG_BUS_ID = "NOTICE_MSG_BUS_ID";
+
+ /**
+ * 发消息 消息业务类型
+ */
+ String NOTICE_MSG_BUS_TYPE = "NOTICE_MSG_BUS_TYPE";
+
+ /**
+ * 邮箱消息中地址登录时地址后携带的token,需要替换成真实的token值
+ */
+ String LOGIN_TOKEN = "{LOGIN_TOKEN}";
+
+ /**
+ * 模板消息中 跳转地址的对应的key
+ */
+ String MSG_HREF_URL = "url";
+
+ /**
+ * sys_data_log表的类型 用于区别评论区域的日志数据
+ */
+ String DATA_LOG_TYPE_COMMENT = "comment";
+
+ /**
+ * sys_data_log表的类型 老的数据比较 类型都设置为json
+ */
+ String DATA_LOG_TYPE_JSON = "json";
+
+ /** 消息模板:markdown */
+ String MSG_TEMPLATE_TYPE_MD = "5";
+ /**========【消息推送相关】==========================================================================*/
+
+ /**
+ * 短信验证码redis-key的前缀
+ */
+ String PHONE_REDIS_KEY_PRE = "phone_msg";
+
+ /**
+ * 是文件夹
+ */
+ String IT_IS_FOLDER = "1";
+
+ /**
+ * 文件拥有者
+ */
+ String FILE_OWNER = "owner";
+
+ /**
+ * 文件管理员
+ */
+ String FILE_ADMIN = "admin";
+
+ /**
+ * 只允许编辑
+ */
+ String FILE_EDITABLE = "editable";
+
+ /**
+ * 登录失败,用于记录失败次数的key
+ */
+ String LOGIN_FAIL = "LOGIN_FAIL_";
+
+ /**
+ * 入职事件
+ */
+ Integer BPM_USER_EVENT_ADD = 1;
+
+ /**
+ * 离职事件
+ */
+ Integer BPM_USER_EVENT_LEVEL = 2;
+
+ /**
+ * 用户租户状态(正常/已通过审核的)
+ */
+ String USER_TENANT_NORMAL = "1";
+
+ /**
+ * 用户租户状态(离职)
+ */
+ String USER_TENANT_QUIT = "2";
+
+ /**
+ * 用户租户状态(审核中)
+ */
+ String USER_TENANT_UNDER_REVIEW = "3";
+
+ /**
+ * 用户租户状态(拒绝)
+ */
+ String USER_TENANT_REFUSE = "4";
+
+ /**
+ * 用户租户状态(邀请)
+ */
+ String USER_TENANT_INVITE = "5";
+
+ /**
+ * 不是叶子节点
+ */
+ Integer NOT_LEAF = 0;
+
+ /**
+ * 是叶子节点
+ */
+ Integer IS_LEAF = 1;
+
+ /**
+ * 钉钉
+ */
+ String DINGTALK = "DINGTALK";
+
+ /**
+ * 企业微信
+ */
+ String WECHAT_ENTERPRISE = "WECHAT_ENTERPRISE";
+
+ /**
+ * 系统默认租户id 0
+ */
+ Integer TENANT_ID_DEFAULT_VALUE = 0;
+
+ /**
+ * 【low-app用】 应用级别的复制
+ */
+ String COPY_LEVEL_APP = "app";
+
+ /**
+ * 【low-app用】 菜单级别的复制
+ */
+ String COPY_LEVEL_MENU = "menu";
+
+
+ /**
+ * 【low-app用】 应用备份
+ */
+ String COPY_LEVEL_BAK = "backup";
+
+ /**
+ * 【low-app用】 从备份还原
+ */
+ String COPY_LEVEL_COVER = "cover";
+
+ /** 【QQYUN-6034】关联字段变更历史值,缓存半个小时 */
+ String CACHE_REL_FIELD_OLD_VAL = "sys:cache:desform:relFieldOldVal:";
+
+ /**
+ * 排序类型:升序
+ */
+ String ORDER_TYPE_ASC = "ASC";
+ /**
+ * 排序类型:降序
+ */
+ String ORDER_TYPE_DESC = "DESC";
+
+
+ //update-begin---author:scott ---date:2023-09-10 for:积木报表常量----
+ /**
+ * 报表允许设计开发的角色
+ */
+ public static String[] allowDevRoles = new String[]{"lowdeveloper", "admin"};
+ /**
+ * 【对应积木报表的常量】
+ * 数据隔离模式: 按照创建人隔离
+ */
+ public static final String SAAS_MODE_CREATED = "created";
+ /**
+ * 【对应积木报表的常量】
+ * 数据隔离模式: 按照租户隔离
+ */
+ public static final String SAAS_MODE_TENANT = "tenant";
+ //update-end---author:scott ---date::2023-09-10 for:积木报表常量----
+
+ //update-begin---author:wangshuai---date:2024-04-07---for:修改手机号常量---
+ /**
+ * 修改手机号短信验证码redis-key的前缀
+ */
+ String CHANGE_PHONE_REDIS_KEY_PRE = "sys:cache:phone:change_phone_msg:";
+
+ /**
+ * 缓存用户最后一次收到消息通知的时间 KEY
+ */
+ String CACHE_KEY_USER_LAST_ANNOUNT_TIME_1HOUR = "sys:cache:userinfo:user_last_annount_time::%s";
+
+ /**
+ * 验证原手机号
+ */
+ String VERIFY_ORIGINAL_PHONE = "verifyOriginalPhone";
+
+ /**
+ * 修改手机号
+ */
+ String UPDATE_PHONE = "updatePhone";
+ //update-end---author:wangshuai---date:2024-04-07---for:修改手机号常量---
+
+ /**
+ * 修改手机号验证码请求次数超出
+ */
+ Integer PHONE_SMS_FAIL_CODE = 40002;
+}
diff --git a/czsj-common/src/main/java/com/czsj/common/constant/SymbolConstant.java b/czsj-common/src/main/java/com/czsj/common/constant/SymbolConstant.java
new file mode 100644
index 0000000..17ea11e
--- /dev/null
+++ b/czsj-common/src/main/java/com/czsj/common/constant/SymbolConstant.java
@@ -0,0 +1,123 @@
+package com.czsj.common.constant;
+
+/**
+ * @Description: 符号和特殊符号常用类
+ * @author: wangshuai
+ * @date: 2022年03月30日 17:44
+ */
+public class SymbolConstant {
+
+ /**
+ * 符号:点
+ */
+ public static final String SPOT = ".";
+
+ /**
+ * 符号:双斜杠
+ */
+ public static final String DOUBLE_BACKSLASH = "\\";
+
+ /**
+ * 符号:冒号
+ */
+ public static final String COLON = ":";
+
+ /**
+ * 符号:逗号
+ */
+ public static final String COMMA = ",";
+
+ /**
+ * 符号:左花括号 }
+ */
+ public static final String LEFT_CURLY_BRACKET = "{";
+
+ /**
+ * 符号:右花括号 }
+ */
+ public static final String RIGHT_CURLY_BRACKET = "}";
+
+ /**
+ * 符号:井号 #
+ */
+ public static final String WELL_NUMBER = "#";
+
+ /**
+ * 符号:单斜杠
+ */
+ public static final String SINGLE_SLASH = "/";
+
+ /**
+ * 符号:双斜杠
+ */
+ public static final String DOUBLE_SLASH = "//";
+
+ /**
+ * 符号:感叹号
+ */
+ public static final String EXCLAMATORY_MARK = "!";
+
+ /**
+ * 符号:下划线
+ */
+ public static final String UNDERLINE = "_";
+
+ /**
+ * 符号:单引号
+ */
+ public static final String SINGLE_QUOTATION_MARK = "'";
+
+ /**
+ * 符号:星号
+ */
+ public static final String ASTERISK = "*";
+
+ /**
+ * 符号:百分号
+ */
+ public static final String PERCENT_SIGN = "%";
+
+ /**
+ * 符号:美元 $
+ */
+ public static final String DOLLAR = "$";
+
+ /**
+ * 符号:和 &
+ */
+ public static final String AND = "&";
+
+ /**
+ * 符号:../
+ */
+ public static final String SPOT_SINGLE_SLASH = "../";
+
+ /**
+ * 符号:..\\
+ */
+ public static final String SPOT_DOUBLE_BACKSLASH = "..\\";
+
+ /**
+ * 系统变量前缀 #{
+ */
+ public static final String SYS_VAR_PREFIX = "#{";
+
+ /**
+ * 符号 {{
+ */
+ public static final String DOUBLE_LEFT_CURLY_BRACKET = "{{";
+
+ /**
+ * 符号:[
+ */
+ public static final String SQUARE_BRACKETS_LEFT = "[";
+ /**
+ * 符号:]
+ */
+ public static final String SQUARE_BRACKETS_RIGHT = "]";
+
+ /**
+ * 拼接字符串符号 分号 ;
+ */
+ public static final String SEMICOLON = ";";
+}
\ No newline at end of file
diff --git a/czsj-common/src/main/java/com/czsj/common/utils/oConvertUtils.java b/czsj-common/src/main/java/com/czsj/common/utils/oConvertUtils.java
new file mode 100644
index 0000000..27f8ec7
--- /dev/null
+++ b/czsj-common/src/main/java/com/czsj/common/utils/oConvertUtils.java
@@ -0,0 +1,1025 @@
+package com.czsj.common.utils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.czsj.common.constant.CommonConstant;
+import com.czsj.common.constant.SymbolConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import org.springframework.beans.BeanUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.net.*;
+import java.sql.Date;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+
+ *
+ */
+@Slf4j
+public class oConvertUtils {
+ public static boolean isEmpty(Object object) {
+ if (object == null) {
+ return (true);
+ }
+ if ("".equals(object)) {
+ return (true);
+ }
+ if (CommonConstant.STRING_NULL.equals(object)) {
+ return (true);
+ }
+ return (false);
+ }
+
+ public static boolean isNotEmpty(Object object) {
+ if (object != null && !"".equals(object) && !object.equals(CommonConstant.STRING_NULL)) {
+ return (true);
+ }
+ return (false);
+ }
+
+
+ /**
+ * 返回decode解密字符串
+ *
+ * @param inStr
+ * @return
+ */
+ public static String decodeString(String inStr) {
+ if (oConvertUtils.isEmpty(inStr)) {
+ return null;
+ }
+
+ try {
+ inStr = URLDecoder.decode(inStr, "UTF-8");
+ } catch (Exception e) {
+ // 解决:URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "自动"
+ //e.printStackTrace();
+ }
+ return inStr;
+ }
+
+ public static String decode(String strIn, String sourceCode, String targetCode) {
+ String temp = code2code(strIn, sourceCode, targetCode);
+ return temp;
+ }
+
+ @SuppressWarnings("AlibabaLowerCamelCaseVariableNaming")
+ public static String StrToUTF(String strIn, String sourceCode, String targetCode) {
+ strIn = "";
+ try {
+ strIn = new String(strIn.getBytes("ISO-8859-1"), "GBK");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return strIn;
+
+ }
+
+ private static String code2code(String strIn, String sourceCode, String targetCode) {
+ String strOut = null;
+ if (strIn == null || "".equals(strIn.trim())) {
+ return strIn;
+ }
+ try {
+ byte[] b = strIn.getBytes(sourceCode);
+ for (int i = 0; i < b.length; i++) {
+ System.out.print(b[i] + " ");
+ }
+ strOut = new String(b, targetCode);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ return strOut;
+ }
+
+ public static int getInt(String s, int defval) {
+ if (s == null || "".equals(s)) {
+ return (defval);
+ }
+ try {
+ return (Integer.parseInt(s));
+ } catch (NumberFormatException e) {
+ return (defval);
+ }
+ }
+
+ public static int getInt(String s) {
+ if (s == null || "".equals(s)) {
+ return 0;
+ }
+ try {
+ return (Integer.parseInt(s));
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ }
+
+ public static int getInt(String s, Integer df) {
+ if (s == null || "".equals(s)) {
+ return df;
+ }
+ try {
+ return (Integer.parseInt(s));
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ }
+
+ public static Integer[] getInts(String[] s) {
+ if (s == null) {
+ return null;
+ }
+ Integer[] integer = new Integer[s.length];
+ for (int i = 0; i < s.length; i++) {
+ integer[i] = Integer.parseInt(s[i]);
+ }
+ return integer;
+
+ }
+
+ public static double getDouble(String s, double defval) {
+ if (s == null || "".equals(s)) {
+ return (defval);
+ }
+ try {
+ return (Double.parseDouble(s));
+ } catch (NumberFormatException e) {
+ return (defval);
+ }
+ }
+
+ public static double getDou(Double s, double defval) {
+ if (s == null) {
+ return (defval);
+ }
+ return s;
+ }
+
+ /*public static Short getShort(String s) {
+ if (StringUtil.isNotEmpty(s)) {
+ return (Short.parseShort(s));
+ } else {
+ return null;
+ }
+ }*/
+
+ public static int getInt(Object object, int defval) {
+ if (isEmpty(object)) {
+ return (defval);
+ }
+ try {
+ return (Integer.parseInt(object.toString()));
+ } catch (NumberFormatException e) {
+ return (defval);
+ }
+ }
+
+ public static Integer getInteger(Object object, Integer defval) {
+ if (isEmpty(object)) {
+ return (defval);
+ }
+ try {
+ return (Integer.parseInt(object.toString()));
+ } catch (NumberFormatException e) {
+ return (defval);
+ }
+ }
+
+ public static Integer getInt(Object object) {
+ if (isEmpty(object)) {
+ return null;
+ }
+ try {
+ return (Integer.parseInt(object.toString()));
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+
+ public static int getInt(BigDecimal s, int defval) {
+ if (s == null) {
+ return (defval);
+ }
+ return s.intValue();
+ }
+
+ public static Integer[] getIntegerArry(String[] object) {
+ int len = object.length;
+ Integer[] result = new Integer[len];
+ try {
+ for (int i = 0; i < len; i++) {
+ result[i] = new Integer(object[i].trim());
+ }
+ return result;
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+
+ public static String getString(String s) {
+ return (getString(s, ""));
+ }
+
+ /**
+ * 转义成Unicode编码
+ * @return
+ */
+ /*public static String escapeJava(Object s) {
+ return StringEscapeUtils.escapeJava(getString(s));
+ }*/
+
+ public static String getString(Object object) {
+ if (isEmpty(object)) {
+ return "";
+ }
+ return (object.toString().trim());
+ }
+
+ public static String getString(int i) {
+ return (String.valueOf(i));
+ }
+
+ public static String getString(float i) {
+ return (String.valueOf(i));
+ }
+
+ /**
+ * 返回常规字符串(只保留字符串中的数字、字母、中文)
+ *
+ * @param input
+ * @return
+ */
+ public static String getNormalString(String input) {
+ if (oConvertUtils.isEmpty(input)) {
+ return null;
+ }
+ String result = input.replaceAll("[^0-9a-zA-Z\\u4e00-\\u9fa5]", "");
+ return result;
+ }
+
+ public static String getString(String s, String defval) {
+ if (isEmpty(s)) {
+ return (defval);
+ }
+ return (s.trim());
+ }
+
+ public static String getString(Object s, String defval) {
+ if (isEmpty(s)) {
+ return (defval);
+ }
+ return (s.toString().trim());
+ }
+
+ public static long stringToLong(String str) {
+ Long test = new Long(0);
+ try {
+ test = Long.valueOf(str);
+ } catch (Exception e) {
+ }
+ return test.longValue();
+ }
+
+ /**
+ * 获取本机IP
+ */
+ public static String getIp() {
+ String ip = null;
+ try {
+ InetAddress address = InetAddress.getLocalHost();
+ ip = address.getHostAddress();
+
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ return ip;
+ }
+
+ /**
+ * 判断一个类是否为基本数据类型。
+ *
+ * @param clazz
+ * 要判断的类。
+ * @return true 表示为基本数据类型。
+ */
+ private static boolean isBaseDataType(Class clazz) throws Exception {
+ return (clazz.equals(String.class) || clazz.equals(Integer.class) || clazz.equals(Byte.class) || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(BigDecimal.class) || clazz.equals(BigInteger.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.isPrimitive());
+ }
+
+ /**
+ * 解码base64
+ *
+ * @param base64Str base64字符串
+ * @return 被加密后的字符串
+ */
+// public static String decodeBase64Str(String base64Str) {
+// byte[] byteContent = Base64.decodeBase64(base64Str);
+// if (byteContent == null) {
+// return null;
+// }
+// String decodedString = new String(byteContent);
+// return decodedString;
+// }
+
+
+ /**
+ * @param request
+ * IP
+ * @return IP Address
+ */
+ public static String getIpAddrByRequest(HttpServletRequest request) {
+ String ip = request.getHeader("x-forwarded-for");
+ if (ip == null || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {
+ ip = request.getHeader("Proxy-Client-IP");
+ }
+ if (ip == null || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {
+ ip = request.getHeader("WL-Proxy-Client-IP");
+ }
+ if (ip == null || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {
+ ip = request.getRemoteAddr();
+ }
+ return ip;
+ }
+
+ /**
+ * @return 本机IP
+ * @throws SocketException
+ */
+ public static String getRealIp() throws SocketException {
+ // 本地IP,如果没有配置外网IP则返回它
+ String localip = null;
+ // 外网IP
+ String netip = null;
+
+ Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces();
+ InetAddress ip = null;
+ // 是否找到外网IP
+ boolean finded = false;
+ while (netInterfaces.hasMoreElements() && !finded) {
+ NetworkInterface ni = netInterfaces.nextElement();
+ Enumeration address = ni.getInetAddresses();
+ while (address.hasMoreElements()) {
+ ip = address.nextElement();
+ // 外网IP
+ if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {
+ netip = ip.getHostAddress();
+ finded = true;
+ break;
+ } else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {
+ // 内网IP
+ localip = ip.getHostAddress();
+ }
+ }
+ }
+
+ if (netip != null && !"".equals(netip)) {
+ return netip;
+ } else {
+ return localip;
+ }
+ }
+
+ /**
+ * java去除字符串中的空格、回车、换行符、制表符
+ *
+ * @param str
+ * @return
+ */
+ public static String replaceBlank(String str) {
+ String dest = "";
+ if (str != null) {
+ String reg = "\\s*|\t|\r|\n";
+ Pattern p = Pattern.compile(reg);
+ Matcher m = p.matcher(str);
+ dest = m.replaceAll("");
+ }
+ return dest;
+
+ }
+
+ /**
+ * 判断元素是否在数组内
+ *
+ * @param child
+ * @param all
+ * @return
+ */
+ public static boolean isIn(String child, String[] all) {
+ if (all == null || all.length == 0) {
+ return false;
+ }
+ for (int i = 0; i < all.length; i++) {
+ String aSource = all[i];
+ if (aSource.equals(child)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 判断元素是否在数组内
+ *
+ * @param childArray
+ * @param all
+ * @return
+ */
+ public static boolean isArrayIn(String[] childArray, String[] all) {
+ if (all == null || all.length == 0) {
+ return false;
+ }
+ for (String v : childArray) {
+ if (!isIn(v, all)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 判断元素是否在数组内
+ *
+ * @param childArray
+ * @param all
+ * @return
+ */
+ public static boolean isJsonArrayIn(JSONArray childArray, String[] all) {
+ if (all == null || all.length == 0) {
+ return false;
+ }
+
+ String[] childs = childArray.toArray(new String[]{});
+ for (String v : childs) {
+ if (!isIn(v, all)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 获取Map对象
+ */
+ public static Map