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 getHashMap() { + return new HashMap<>(5); + } + + /** + * SET转换MAP + * @return + */ + public static Map setToMap(Set setobj) { + Map map = getHashMap(); + for (Iterator iterator = setobj.iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + map.put(entry.getKey().toString(), entry.getValue() == null ? "" : entry.getValue().toString().trim()); + } + return map; + + } + + public static boolean isInnerIp(String ipAddress) { + boolean isInnerIp = false; + long ipNum = getIpNum(ipAddress); + /** + * 私有IP:A类 10.0.0.0-10.255.255.255 B类 172.16.0.0-172.31.255.255 C类 192.168.0.0-192.168.255.255 当然,还有127这个网段是环回地址 + **/ + long aBegin = getIpNum("10.0.0.0"); + long aEnd = getIpNum("10.255.255.255"); + long bBegin = getIpNum("172.16.0.0"); + long bEnd = getIpNum("172.31.255.255"); + long cBegin = getIpNum("192.168.0.0"); + long cEnd = getIpNum("192.168.255.255"); + String localIp = "127.0.0.1"; + isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || localIp.equals(ipAddress); + return isInnerIp; + } + + private static long getIpNum(String ipAddress) { + String[] ip = ipAddress.split("\\."); + long a = Integer.parseInt(ip[0]); + long b = Integer.parseInt(ip[1]); + long c = Integer.parseInt(ip[2]); + long d = Integer.parseInt(ip[3]); + + long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d; + return ipNum; + } + + private static boolean isInner(long userIp, long begin, long end) { + return (userIp >= begin) && (userIp <= end); + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。 + * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
+ * 例如:hello_world->helloWorld + * + * @param name + * 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String camelName(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains(SymbolConstant.UNDERLINE)) { + // 不含下划线,仅将首字母小写 + //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + return name.substring(0, 1).toLowerCase() + name.substring(1).toLowerCase(); + //update-end--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 处理真正的驼峰片段 + if (result.length() == 0) { + // 第一个驼峰片段,全部字母都小写 + result.append(camel.toLowerCase()); + } else { + // 其他的驼峰片段,首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + } + return result.toString(); + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。 + * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
+ * 例如:hello_world,test_id->helloWorld,testId* 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String camelNames(String names) { + if(names==null||"".equals(names)){ + return null; + } + StringBuffer sf = new StringBuffer(); + String[] fs = names.split(","); + for (String field : fs) { + field = camelName(field); + sf.append(field + ","); + } + String result = sf.toString(); + return result.substring(0, result.length() - 1); + } + + //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + /** + * 将下划线大写方式命名的字符串转换为驼峰式。(首字母写) + * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
+ * 例如:hello_world->HelloWorld + * + * @param name + * 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String camelNameCapFirst(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains(SymbolConstant.UNDERLINE)) { + // 不含下划线,仅将首字母小写 + return name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase(); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 其他的驼峰片段,首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + //update-end--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + + /** + * 将驼峰命名转化成下划线 + * @param para + * @return + */ + public static String camelToUnderline(String para){ + int length = 3; + if(para.length() clazz = object.getClass(); + List fieldList = new ArrayList<>(); + while (clazz != null) { + fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields()))); + clazz = clazz.getSuperclass(); + } + Field[] fields = new Field[fieldList.size()]; + fieldList.toArray(fields); + return fields; + } + + /** + * 将map的key全部转成小写 + * @param list + * @return + */ + public static List> toLowerCasePageList(List> list){ + List> select = new ArrayList<>(); + for (Map row : list) { + Map resultMap = new HashMap<>(5); + Set keySet = row.keySet(); + for (String key : keySet) { + String newKey = key.toLowerCase(); + resultMap.put(newKey, row.get(key)); + } + select.add(resultMap); + } + return select; + } + + /** + * 将entityList转换成modelList + * @param fromList + * @param tClass + * @param + * @param + * @return + */ + public static List entityListToModelList(List fromList, Class tClass){ + if(fromList == null || fromList.isEmpty()){ + return null; + } + List tList = new ArrayList<>(); + for(F f : fromList){ + T t = entityToModel(f, tClass); + tList.add(t); + } + return tList; + } + + public static T entityToModel(F entity, Class modelClass) { + log.debug("entityToModel : Entity属性的值赋值到Model"); + Object model = null; + if (entity == null || modelClass ==null) { + return null; + } + + try { + model = modelClass.newInstance(); + } catch (InstantiationException e) { + log.error("entityToModel : 实例化异常", e); + } catch (IllegalAccessException e) { + log.error("entityToModel : 安全权限异常", e); + } + BeanUtils.copyProperties(entity, model); + return (T)model; + } + + /** + * 判断 list 是否为空 + * + * @param list + * @return true or false + * list == null : true + * list.size() == 0 : true + */ + public static boolean listIsEmpty(Collection list) { + return (list == null || list.size() == 0); + } + + /** + * 判断旧值与新值 是否相等 + * + * @param oldVal + * @param newVal + * @return + */ + public static boolean isEqual(Object oldVal, Object newVal) { + if (oldVal != null && newVal != null) { + if (isArray(oldVal)) { + return equalityOfArrays((Object[]) oldVal, (Object[]) newVal); + }else if(oldVal instanceof JSONArray){ + if(newVal instanceof JSONArray){ + return equalityOfJSONArray((JSONArray) oldVal, (JSONArray) newVal); + }else{ + if (isEmpty(newVal) && (oldVal == null || ((JSONArray) oldVal).size() == 0)) { + return true; + } + List arrayStr = Arrays.asList(newVal.toString().split(",")); + JSONArray newValArray = new JSONArray(arrayStr); + return equalityOfJSONArray((JSONArray) oldVal, newValArray); + } + }else{ + return oldVal.equals(newVal); + } + + } else { + if (oldVal == null && newVal == null) { + return true; + } else { + return false; + } + } + } + + /** + * 方法描述 判断一个对象是否是一个数组 + * + * @param obj + * @return + * @author yaomy + * @date 2018年2月5日 下午5:03:00 + */ + public static boolean isArray(Object obj) { + if (obj == null) { + return false; + } + return obj.getClass().isArray(); + } + + /** + * 获取集合的大小 + * + * @param collection + * @return + */ + public static int getCollectionSize(Collection collection) { + return collection != null ? collection.size() : 0; + } + + /** + * 判断两个数组是否相等(数组元素不分顺序) + * + * @param oldVal + * @param newVal + * @return + */ + public static boolean equalityOfJSONArray(JSONArray oldVal, JSONArray newVal) { + if (oldVal != null && newVal != null) { + Object[] oldValArray = oldVal.toArray(); + Object[] newValArray = newVal.toArray(); + return equalityOfArrays(oldValArray,newValArray); + } else { + if ((oldVal == null || oldVal.size() == 0) && (newVal == null || newVal.size() == 0)) { + return true; + } else { + return false; + } + } + } + + /** + * 比较带逗号的字符串 + * QQYUN-5212【简流】按日期触发 多选 人员组件 选择顺序不一致时 不触发,应该是统一问题 包括多选部门组件 + * @param oldVal + * @param newVal + * @return + */ + public static boolean equalityOfStringArrays(String oldVal, String newVal) { + if(oldVal.equals(newVal)){ + return true; + } + if(oldVal.indexOf(",")>=0 && newVal.indexOf(",")>=0){ + String[] arr1 = oldVal.split(","); + String[] arr2 = newVal.split(","); + if(arr1.length == arr2.length){ + boolean flag = true; + Map map = new HashMap<>(); + for(String s1: arr1){ + map.put(s1, 1); + } + for(String s2: arr2){ + if(map.get(s2) == null){ + flag = false; + break; + } + } + return flag; + } + } + return false; + } + + /** + * 判断两个数组是否相等(数组元素不分顺序) + * + * @param oldVal + * @param newVal + * @return + */ + public static boolean equalityOfArrays(Object[] oldVal, Object newVal[]) { + if (oldVal != null && newVal != null) { + Arrays.sort(oldVal); + Arrays.sort(newVal); + return Arrays.equals(oldVal, newVal); + } else { + if ((oldVal == null || oldVal.length == 0) && (newVal == null || newVal.length == 0)) { + return true; + } else { + return false; + } + } + } + +// public static void main(String[] args) { +//// String[] a = new String[]{"1", "2"}; +//// String[] b = new String[]{"2", "1"}; +// Integer a = null; +// Integer b = 1; +// System.out.println(oConvertUtils.isEqual(a, b)); +// } + + /** + * 判断 list 是否不为空 + * + * @param list + * @return true or false + * list == null : false + * list.size() == 0 : false + */ + public static boolean listIsNotEmpty(Collection list) { + return !listIsEmpty(list); + } + + /** + * 读取静态文本内容 + * @param url + * @return + */ + public static String readStatic(String url) { + String json = ""; + try { + //换个写法,解决springboot读取jar包中文件的问题 + InputStream stream = oConvertUtils.class.getClassLoader().getResourceAsStream(url.replace("classpath:", "")); + json = IOUtils.toString(stream,"UTF-8"); + } catch (IOException e) { + log.error(e.getMessage(),e); + } + return json; + } + + /** + * 将List 转成 JSONArray + * @return + */ + public static JSONArray list2JSONArray(List list){ + if(list==null || list.size()==0){ + return null; + } + JSONArray array = new JSONArray(); + for(String str: list){ + array.add(str); + } + return array; + } + + /** + * 判断两个list中的元素是否完全一致 + * QQYUN-5326【简流】获取组织人员 单/多 筛选条件 没有部门筛选 + * @return + */ + public static boolean isEqList(List list1, List list2){ + if(list1.size() != list2.size()){ + return false; + } + for(String str1: list1){ + boolean flag = false; + for(String str2: list2){ + if(str1.equals(str2)){ + flag = true; + break; + } + } + if(!flag){ + return false; + } + } + return true; + } + + + /** + * 判断 list1中的元素是否在list2中出现 + * QQYUN-5326【简流】获取组织人员 单/多 筛选条件 没有部门筛选 + * @param list1 + * @param list2 + * @return + */ + public static boolean isInList(List list1, List list2){ + for(String str1: list1){ + boolean flag = false; + for(String str2: list2){ + if(str1.equals(str2)){ + flag = true; + break; + } + } + if(flag){ + return true; + } + } + return false; + } + + /** + * 计算文件大小转成MB + * @param uploadCount + * @return + */ + public static Double calculateFileSizeToMb(Long uploadCount){ + double count = 0.0; + if(uploadCount>0) { + BigDecimal bigDecimal = new BigDecimal(uploadCount); + //换算成MB + BigDecimal divide = bigDecimal.divide(new BigDecimal(1048576)); + count = divide.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + return count; + } + return count; + } + + /** + * map转str + * + * @param map + * @return + */ + public static String mapToString(Map map) { + if (map == null || map.size() == 0) { + return null; + } + + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + String[] values = entry.getValue(); + sb.append(key).append("="); + sb.append(values != null ? StringUtils.join(values, ",") : ""); + sb.append("&"); + } + + String result = sb.toString(); + if (result.endsWith("&")) { + result = result.substring(0, sb.length() - 1); + } + return result; + } + +} diff --git a/czsj-framework/src/main/java/com/czsj/framework/interceptor/MybatisInterceptor.java b/czsj-framework/src/main/java/com/czsj/framework/interceptor/MybatisInterceptor.java new file mode 100644 index 0000000..09978d0 --- /dev/null +++ b/czsj-framework/src/main/java/com/czsj/framework/interceptor/MybatisInterceptor.java @@ -0,0 +1,136 @@ +package com.czsj.framework.interceptor; + +import com.czsj.common.core.domain.entity.SysUser; +import com.czsj.common.core.domain.model.LoginUser; +import com.czsj.common.utils.SecurityUtils; +import com.czsj.common.utils.oConvertUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.binding.MapperMethod.ParamMap; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.plugin.*; + +import org.apache.ibatis.reflection.DefaultReflectorFactory; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.factory.DefaultObjectFactory; +import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Field; +import java.sql.SQLException; +import java.util.Date; +import java.util.Properties; + +/** + * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间 + * @Author + * + */ +@Slf4j +@Component +@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) }) +public class MybatisInterceptor implements Interceptor { + + @Override + public Object intercept(Invocation invocation) throws Throwable { + MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; + SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); + Object parameter = invocation.getArgs()[1]; + if (parameter == null) { + return invocation.proceed(); + } + if (SqlCommandType.INSERT == sqlCommandType) { + LoginUser sysUser = this.getLoginUser(); + Field[] fields = oConvertUtils.getAllFields(parameter); + for (Field field : fields) { + try { + //创建人ID + if ("createUserId".equals(field.getName())) { + if (sysUser != null) { + // 登录人账号 + field.setAccessible(true); + field.set(parameter, sysUser.getUserId()); + field.setAccessible(false); + } + } + // 创建时间 + if ("createTime".equals(field.getName())) { + field.setAccessible(true); + field.set(parameter, new Date()); + field.setAccessible(false); + } + //修改人 + if ("updateUserId".equals(field.getName())) { + if (sysUser != null) { + field.setAccessible(true); + field.set(parameter, sysUser.getUserId()); + field.setAccessible(false); + } + } + // 修改时间 + if ("updateTime".equals(field.getName())) { + field.setAccessible(true); + field.set(parameter, new Date()); + field.setAccessible(false); + } + // 有效标识 + if ("delFlag".equals(field.getName())) { + field.setAccessible(true); + field.set(parameter, 0); + field.setAccessible(false); + } + //注入地区编码编码 + } catch (Exception e) { + } + } + } + if (SqlCommandType.UPDATE == sqlCommandType) { + LoginUser sysUser = this.getLoginUser(); + Field[] fields = oConvertUtils.getAllFields(parameter); + for (Field field : fields) { + try { + //修改人 + if ("updateUserId".equals(field.getName())) { + if (sysUser != null) { + field.setAccessible(true); + field.set(parameter, sysUser.getUsername()); + field.setAccessible(false); + } + } + // 修改时间 + if ("updateTime".equals(field.getName())) { + field.setAccessible(true); + field.set(parameter, new Date()); + field.setAccessible(false); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return invocation.proceed(); + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + /** + * 获取登录用户 + * @return + */ + private LoginUser getLoginUser() { + LoginUser sysUser = null; + try { + sysUser = SecurityUtils.getLoginUser(); + } catch (Exception e) { + //e.printStackTrace(); + sysUser = null; + } + return sysUser; + } + +}