Compare commits

..

338 Commits
main ... dev

Author SHA1 Message Date
wwb 3c550c6f50 优化 2026-04-08 14:27:08 +08:00
wwb 93a1f5c0d3 优化 2026-03-18 14:58:32 +08:00
wwb c043aebe1b 优化 2026-03-18 11:32:32 +08:00
wwb c48717ee6a 优化 2026-03-18 09:21:53 +08:00
wwb 6c170c01c2 优化 2026-03-18 09:09:25 +08:00
wwb 3987c414f3 优化 2026-03-17 09:35:36 +08:00
wwb 25b63f3250 优化 2026-03-16 20:22:15 +08:00
wwb 8b6e783246 优化 2026-03-16 19:58:13 +08:00
wwb 2eb8736140 优化 2026-03-16 19:29:20 +08:00
wwb 6a1c4a7b10 优化 2026-03-16 17:28:44 +08:00
wwb 2084896e40 优化 2026-03-16 16:45:56 +08:00
wwb df44f8e6c0 优化 2026-03-16 14:57:01 +08:00
wwb 72902c1f88 优化 2026-03-16 14:49:10 +08:00
YuanFeng 206c95a88c 优化 提示下载Edge浏览器遮挡问题 2026-03-15 21:40:29 +08:00
wwb d260383ba6 优化 2026-01-06 10:18:44 +08:00
wwb c7a1eaca9d 优化 2026-01-06 10:09:36 +08:00
wwb d3b8a38f99 优化 2026-01-06 09:51:54 +08:00
wwb 670456654b 优化 2026-01-06 09:05:21 +08:00
wwb e83d55da26 清除无用代码 2026-01-06 08:44:10 +08:00
wwb 59edf96a3b 开启定时任务 2026-01-06 08:29:54 +08:00
wwb 6c3d8408c2 新增对账单 2026-01-05 21:02:44 +08:00
wwb dbe09ab701 优化 2025-12-29 08:10:40 +08:00
袁锋 5d71511e22 改造 下单不合并相同物料SKU的数量 2025-12-14 18:45:22 +08:00
wwb b94515daef 优化 2025-12-09 14:54:58 +08:00
wwb 651fe9b938 优化 2025-12-09 12:02:12 +08:00
wwb aa4cbdfe47 优化 2025-12-09 11:09:53 +08:00
wwb a848b60b4c 优化 2025-12-09 10:56:40 +08:00
wwb ce39bc2895 优化 2025-12-09 10:51:06 +08:00
wwb ca1e497945 优化 2025-12-09 10:10:33 +08:00
wwb df9c0e0c8e 优化 2025-12-09 09:31:03 +08:00
wwb 8f464b28f5 优化 2025-12-09 09:26:04 +08:00
wwb dbf44cf037 优化 2025-12-09 08:59:29 +08:00
wwb a84d1737e3 优化 2025-12-09 08:36:57 +08:00
wwb 75015fa1e4 优化 2025-12-09 08:28:21 +08:00
wwb 9c36dc26f8 优化 2025-12-09 08:25:34 +08:00
wwb 93616ea3e3 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2025-12-09 08:19:23 +08:00
wwb 7c7db11e9f 修改下单邮箱模板 2025-12-09 08:19:14 +08:00
袁锋 8e5b2dc02c Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2025-12-08 22:06:45 +08:00
袁锋 609cc4eef0 优化 添加edge 浏览器下载推荐,单位丢失不能保存问题 2025-12-08 22:05:39 +08:00
wwb 63c2099a74 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Conflicts:
#	hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java
2025-12-08 14:14:18 +08:00
wwb 9538904f0f 销售订单增加附件下载 2025-12-08 12:00:01 +08:00
袁锋 c3d17c4d11 优化 下单页面回显问题 2025-12-08 10:26:01 +08:00
袁锋 6290c1c10a 优化 下单编辑回显问题 2025-12-08 10:24:40 +08:00
袁锋 698ee9b14e 优化 处理下单时候多跟单员回显问题 2025-12-08 10:19:37 +08:00
袁锋 4e6d2a621c 改造 多个跟单员下单发邮件 2025-12-08 10:08:21 +08:00
袁锋 25439fc0b1 优化 支持多跟单员
新增 新增客户 联系邮箱字段
2025-12-06 22:11:20 +08:00
袁锋 cb54921eaf 优化 产品excel导入实体 2025-11-23 07:57:48 +08:00
袁锋 70f355232e 产品 excel导入 2025-11-23 07:49:42 +08:00
袁锋 c5e78f8521 11 2025-11-21 12:19:57 +08:00
袁锋 91b99ef557 优化 缓存 2025-11-17 16:24:09 +08:00
袁锋 2998e828ae 优化 产品类型显示 2025-11-16 08:56:43 +08:00
袁锋 eb8d5539f9 优化 导入提示 2025-11-16 08:28:21 +08:00
袁锋 1b6949baf8 优化 下单显示产品类型 2025-11-15 23:54:49 +08:00
袁锋 eb1748ff79 优化 产品导入导出模板为一致 2025-11-15 23:32:27 +08:00
袁锋 9db1775917 优化 产品导入 2025-11-05 21:01:10 +08:00
yf 42616da7e8 优化 产品导入逻辑,存在相同编码覆盖数据 2025-10-26 08:54:05 +08:00
yf 6d430699f9 优化 修改按钮文字 2025-10-23 10:20:54 +08:00
yf 746698a6f2 优化 按钮文字 2025-10-23 09:40:58 +08:00
yf 3d7fa5e802 优化 新增产品类型导入 2025-10-23 09:04:55 +08:00
yf 9df51bddda 优化 产品导入导出 2025-10-21 10:44:22 +08:00
yf 88d5a41f5c 新增 产品选择关键字搜索 2025-10-14 08:33:40 +08:00
yf ef41c1b22b 修复 销售订单审核 规格问题 2025-10-07 17:21:50 +08:00
yf f68e17ea0e 优化 下单修改为手机号码非必填,
优化 下单步骤产品列表添加关键字搜索
优化 后台订单金额调整为保留4位小数位
2025-07-09 23:01:27 +08:00
yf 766b427270 优化 下单页面业务员设为必填 2025-05-08 20:44:31 +08:00
yf 2319f5d267 优化 翻译 2025-04-13 19:17:20 +08:00
wwb 1e2c64f55f 修改错误提示 2025-04-13 17:02:32 +08:00
Mrking f1033b332e 修改英文版本的登入頁面.
1.請修正左上角, 公司名稱.
Silver Printing Orders Management System
2.另外是右上角, “郵箱帳號不存在”
請改為” The email account does not exist”
2025-04-07 19:54:00 +08:00
Mrking 4ac33b59b5 修改英文版本的登入頁面.
1.請修正左上角, 公司名稱.
Silver Printing Orders Management System
2.另外是右上角, “郵箱帳號不存在”
請改為” The email account does not exist”
2025-04-07 19:46:50 +08:00
yf d88b20ed8a 修复 多语言提示 2025-03-24 00:00:25 +08:00
yf c9c56a1806 修复 复制报错 2025-03-23 23:48:33 +08:00
yf 026072da43 修复 多语言删除提示 2025-03-23 23:32:37 +08:00
yf 3b2449710d 修复 跨越不能下载错误 2025-03-05 08:58:27 +08:00
yf 72d5375658 新增 客户组别弹窗 2025-03-05 00:53:07 +08:00
yf 830ce9d3af 修复 找不到包错误 2025-03-05 00:46:24 +08:00
yf c5a8f8f032 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2025-03-05 00:23:58 +08:00
yf b153c22261 新增 客户组别,新增稿件附件,及下单附件上传 2025-03-05 00:21:13 +08:00
Mrking c94727c72e 新增复制订单 2025-03-03 22:21:00 +08:00
Mrking ccdc8afaab 新增复制订单 2025-03-03 22:01:53 +08:00
Mrking 5cc8a96592 新增复制订单 2025-03-03 20:37:28 +08:00
Mrking 2fb86e4687 新增复制订单 2025-03-03 19:21:37 +08:00
Mrking f3e592af18 新增复制订单 2025-03-03 00:04:10 +08:00
Mrking 2d9539251e 增加下单发送邮件提示 2025-03-02 23:19:45 +08:00
Mrking 3b3183f0b8 优化订单校验数量 2025-02-26 21:44:04 +08:00
wwb a1262b66b4 优化订单校验数量 2025-02-26 11:53:37 +08:00
yf 054780da33 优化 导出文件名称 2025-01-20 12:42:56 +08:00
yf b90eb96bb4 修复 编辑覆盖sku的id问题 2025-01-20 12:31:16 +08:00
yf ea0ce9540b 优化 导出文件名称 2025-01-20 11:19:54 +08:00
yf 66ec59f5f9 优化 导致稿件模板名称 2025-01-20 11:00:19 +08:00
yf 7bbd610392 修复 只导出html 2025-01-20 10:52:16 +08:00
yf e01f3c9918 修复 文件导出 2025-01-20 10:41:35 +08:00
yf 4f061b363d 修复 文件导出 2025-01-20 10:29:14 +08:00
yf bd2c1ccd6b 修复 文件导出 2025-01-20 10:18:46 +08:00
yf 70e2e167a7 修复 文件导出 2025-01-20 09:55:57 +08:00
yf 01ab7a07f7 修复 文件不能存在 2025-01-20 09:31:06 +08:00
yf b391148e26 修复 稿件文件目录问题 2025-01-20 09:18:04 +08:00
yf 2d7ea83f0b 修复 导出文件路径 2025-01-20 08:54:12 +08:00
yf 3729dd568a 修复 稿件导出路径错误 2025-01-20 08:36:32 +08:00
yf 5c051b08a2 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2025-01-20 00:26:23 +08:00
yf 7b1b5cf618 新增 订单稿件导出功能 2025-01-20 00:26:12 +08:00
Mrking b20d5916d3 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2025-01-19 22:41:39 +08:00
Mrking f59d708ef0 优化修改订单 2025-01-19 22:41:03 +08:00
yf b3d8346204 新增 关键字查询 2025-01-19 22:33:46 +08:00
Mrking 3db30d8fd2 优化修改订单 2025-01-19 22:25:10 +08:00
Mrking 1f5872249e 优化修改订单 2025-01-19 21:50:48 +08:00
Mrking ba06f1fb59 优化修改订单 2025-01-19 21:35:18 +08:00
Mrking 1b0078b7cb 优化修改订单 2025-01-19 21:34:15 +08:00
Mrking c6f63d3755 优化修改订单 2025-01-19 21:26:54 +08:00
Mrking ff807e0def 优化修改订单 2025-01-19 21:12:31 +08:00
Mrking 1618b15b01 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Conflicts:
#	hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/ProduceOrderForm.vue
2025-01-19 18:26:50 +08:00
yf f1f88ae4dc Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2025-01-19 18:17:31 +08:00
yf 2ec371bd9a 修复 搜索组件 2025-01-19 17:32:23 +08:00
Mrking d35965748c 修改销售订单 2025-01-19 15:53:11 +08:00
Mrking 97678c49d2 修改销售订单 2025-01-19 15:51:18 +08:00
wwb a14f49f94d 优化生产制单 2025-01-13 08:37:54 +08:00
wwb 2e876da193 优化生产制单 2025-01-13 08:37:07 +08:00
wwb 994be7914f 优化生产制单 2025-01-13 08:11:07 +08:00
Mrking 252cf1a34f 优化生产制单 2025-01-12 22:29:06 +08:00
Mrking e40b176454 优化生产制单 2025-01-12 22:24:49 +08:00
Mrking 3768993929 优化生产制单 2025-01-12 22:16:46 +08:00
Mrking 36940cbd2b 优化生产制单 2025-01-12 22:07:55 +08:00
wwb dd36e9f7cc Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2025-01-12 12:31:20 +08:00
wwb 0aa527f44f Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2025-01-12 12:22:15 +08:00
wwb c13bf4b47a Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2025-01-12 12:09:30 +08:00
wwb 86212bb3b6 修改生产制单备注 2025-01-12 12:09:10 +08:00
yf 94fafa8cab 优化 编码名称为空时默认为编码 2025-01-10 11:48:42 +08:00
wwb 2749b1285e Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2025-01-10 11:29:43 +08:00
wwb f46b04ca90 修复销售合约编码替换数据 2025-01-10 11:29:27 +08:00
yf b41184a5de 优化 2025-01-07 01:47:30 +08:00
yf 8dd5fb6519 新增 稿件源文件下载 2025-01-07 01:07:31 +08:00
yf 89dd0a1c21 优化下载图片 2025-01-06 15:24:05 +08:00
yf dfe4c43765 优化 除了英文字符换行问题 2025-01-06 12:35:50 +08:00
yf f5083ca420 优化 文本不在单词中间进行换行 2025-01-05 21:10:30 +08:00
yf 41bc20a3a8 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2025-01-04 22:42:13 +08:00
yf c2285e42e4 新增 产品信息导入,稿件下载功能 2025-01-04 22:41:06 +08:00
wwb a2ea5282a2 优生产制单备注 2025-01-04 17:10:31 +08:00
wwb 86a118a785 优生产制单备注 2025-01-04 16:23:34 +08:00
wwb 0b956eb7b1 提交20250104 2025-01-04 15:04:19 +08:00
yf 22888ef18c 新增 销售订单sku行备注, 2025-01-03 02:24:51 +08:00
Mrking 1fbc4ebe52 提交20241230 2024-12-30 22:03:12 +08:00
Mrking cc27de49b7 提交20241230 2024-12-30 19:59:28 +08:00
yf 7695075607 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-12-30 14:23:00 +08:00
yf fbe565f3e2 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.

修复 系统编码日期格式问题
2024-12-30 14:22:14 +08:00
Mrking 9b75e76f6b 修改权限项 2024-12-16 18:56:00 +08:00
yf 777e817847 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-12-16 15:34:00 +08:00
yf f8249576d1 提示信息 添加多语言配置 2024-12-16 15:33:43 +08:00
wwb d680808be7 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-12-16 15:27:30 +08:00
wwb a477a5f57a 隐藏岗位 2024-12-16 15:27:19 +08:00
yf 00ff1749d9 修复 下单校验逻辑 2024-12-16 15:22:50 +08:00
wwb 16dc6b2ddd 隐藏岗位 2024-12-16 15:04:33 +08:00
wwb c0d8cdc3aa 隐藏岗位 2024-12-16 15:01:32 +08:00
wwb 21813075af 修改新增用户使用邮箱作为登录账号 2024-12-16 14:41:35 +08:00
wwb 50b54c5f43 还原覆盖代码 2024-12-16 09:57:57 +08:00
yf a232b6fe67 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Conflicts:
#	hangtag-ui/hangtag-ui-front/src/locales/en.ts
#	hangtag-ui/hangtag-ui-front/src/views/oms/saleorder/index.vue
2024-12-15 12:52:55 +08:00
yf 159153d49d 新增 下单页面多语言 2024-12-15 12:43:43 +08:00
Mrking 8041ea0cc2 修改审核方法 2024-12-14 23:06:02 +08:00
Mrking 3061eec79a 修改审核方法 2024-12-14 22:52:07 +08:00
Mrking bdc4983c21 修改审核方法 2024-12-14 22:45:23 +08:00
Mrking c7142816db 修改审核方法 2024-12-14 22:11:21 +08:00
wwb ff45257f88 修改审核方法 2024-12-14 21:35:47 +08:00
wwb 5f96777d00 修改两位小数计算 2024-12-14 21:18:40 +08:00
wwb c85d183e63 修改两位小数计算 2024-12-14 21:10:54 +08:00
wwb e140c1fab7 增加前端英文多语言 2024-12-14 20:53:13 +08:00
wwb ff677dda57 去除admin 语言栏切换 2024-12-14 18:27:28 +08:00
wwb d30e981810 更新订单详情字段 2024-12-14 18:14:21 +08:00
wwb a131e441c0 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-12-14 18:13:38 +08:00
yf d5b05b6d79 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-12-14 17:53:14 +08:00
wwb af39aca752 更新修改地址 2024-12-14 17:51:54 +08:00
YuanFeng 8bd47d5b44 提交 添加字段sql 2024-12-14 17:43:55 +08:00
wwb 90e9d7bbc5 修改生成制单 2024-12-14 17:20:26 +08:00
wwb 359df015f1 新增合约类型 2024-12-14 15:47:24 +08:00
wwb 7314b545ea 增加结算币种 2024-12-14 15:40:07 +08:00
wwb 596af2202c 修改logo图片 2024-12-09 17:16:06 +08:00
wwb d8d5c2b9ba 修改logo图片 2024-12-09 16:35:51 +08:00
wwb 3894c47452 增加忘记密码 2024-12-08 21:34:14 +08:00
wwb 5ad0473e03 增加忘记密码 2024-12-08 20:45:30 +08:00
Mrking 47b6f6a8a5 提交20241207 2024-12-07 09:14:09 +08:00
YuanFeng 8e24f48b52 优化 币种无效过滤 2024-12-02 23:50:46 +08:00
YuanFeng ab5b66e9b4 新增 币种和产品默认价格 2024-12-02 23:41:06 +08:00
YuanFeng 116e703093 优化 没有选择模板时设置默认类型 2024-11-29 22:13:23 +08:00
YuanFeng e91dcc5788 新增 地区语言设置 2024-11-26 17:30:28 +08:00
YuanFeng d8d5ae857f 优化 稿件预览 2024-11-26 01:14:41 +08:00
YuanFeng e8b1bf2817 优化 护理项目列表 2024-11-26 00:58:50 +08:00
YuanFeng 943324af03 优化 2024-11-25 23:57:48 +08:00
YuanFeng ba060c4031 修复 2024-11-25 09:09:54 +08:00
YuanFeng 068e6c6e95 修复 2024-11-25 01:28:19 +08:00
YuanFeng 554da610d2 优化 护理项目 2024-11-25 01:19:01 +08:00
YuanFeng 698dd3f1a8 新增 护理流程类型 2024-11-25 00:59:29 +08:00
YuanFeng 86f080e474 优化 下单动态属性配置 2024-11-24 23:35:27 +08:00
YuanFeng 3920a5415d fix 可输入控制条件 2024-11-21 23:34:26 +08:00
YuanFeng 1d495c6e35 优化 变量输入,下单默认品牌 2024-11-21 23:22:09 +08:00
YuanFeng 36b3161116 add 添加字段sql 2024-11-20 23:31:26 +08:00
YuanFeng 487e8250da 优化 稿件添加封面 2024-11-20 23:28:51 +08:00
YuanFeng 91a9dd8f0e 优化 稿件变量属性控制 2024-11-20 21:58:27 +08:00
YuanFeng 5b64e3b160 修复 不能下单问题 2024-11-20 08:56:02 +08:00
YuanFeng 5984d5a9d7 新增 管理品牌跟单员,新增产品资料复制功能 2024-11-19 23:25:18 +08:00
YuanFeng 1d67e968e9 fix 停用获取产品品类型查询权限 2024-11-19 22:30:34 +08:00
YuanFeng 1b122b0fb7 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Conflicts:
#	hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/ProductInfoController.java
2024-11-19 22:12:16 +08:00
YuanFeng 69799f3705 fix 去除查询权限控制 2024-11-19 22:09:20 +08:00
wwb 8df7c5e026 去除权限校验 2024-11-18 10:02:25 +08:00
wwb c591e0b38f 去除权限校验 2024-11-18 09:51:13 +08:00
wwb ec14990255 隐藏语言选择 2024-11-18 09:19:44 +08:00
wwb e788b57684 跟单员发送邮箱 2024-11-18 09:04:39 +08:00
YuanFeng 1bece1b15d Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-11-18 01:04:40 +08:00
YuanFeng c179177730 添加 批稿参数校验 2024-11-18 01:03:55 +08:00
Mrking be124b6763 优化用户维护品牌关系逻辑 2024-11-17 23:20:21 +08:00
Mrking 4c73984d12 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-11-17 12:07:13 +08:00
Mrking a33bd95b9a 修改菜单名 2024-11-17 12:06:53 +08:00
YuanFeng bd5764b846 同步 本地话多语言配置 2024-11-16 22:47:56 +08:00
YuanFeng cf54cbf47c Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-11-16 14:06:06 +08:00
YuanFeng ad175a2393 新增 下单分不同类型添加sku,下单预览图设置背景 2024-11-16 14:04:38 +08:00
Mrking 92497df2a4 增加跟单员 2024-11-13 21:50:14 +08:00
Mrking 1c5bdd2989 增加跟单员 2024-11-13 21:32:57 +08:00
Mrking 1e11697fd0 增加跟单员 2024-11-13 21:25:39 +08:00
Mrking 63f493ec3d 增加跟单员 2024-11-13 20:53:40 +08:00
Mrking 1b221bca72 销售订单增加导出PI功能 2024-11-03 20:29:09 +08:00
Mrking b3b8f40d03 销售订单增加导出PI功能 2024-11-02 15:56:38 +08:00
Mrking a1f6556df5 销售订单增加导出PI功能 2024-11-02 15:14:57 +08:00
Mrking bb8e93cfc6 销售订单增加导出PI功能 2024-11-02 14:47:18 +08:00
Mrking 12638209f7 销售订单增加导出PI功能 2024-11-02 12:12:44 +08:00
Mrking 47ca534052 销售订单增加导出PI功能 2024-11-02 11:56:53 +08:00
Mrking 973ad77d7f 销售订单增加导出PI功能 2024-11-02 11:52:23 +08:00
Mrking 0c40437c74 销售订单增加导出PI功能 2024-11-02 11:45:49 +08:00
Mrking 294c4e5d6e 销售订单增加导出PI功能 2024-11-02 11:36:20 +08:00
Mrking e20641292a 销售订单增加导出PI功能 2024-11-02 11:30:14 +08:00
Mrking 1d98827bfb 销售订单增加导出PI功能 2024-11-02 11:10:18 +08:00
Mrking e930e28373 销售订单增加导出PI功能 2024-10-29 23:16:13 +08:00
Mrking eb1cd78f07 销售订单增加导出PI功能 2024-10-29 23:13:48 +08:00
Mrking c0cc36772f 优化销售订单 2024-10-29 00:03:06 +08:00
Mrking 0df79512fb 更新生产单信息 2024-10-27 22:38:33 +08:00
Mrking 86bd0b411f 更新生产单信息 2024-10-27 22:20:44 +08:00
Mrking a192ae63c9 修改客户初始化密码 2024-10-27 21:57:33 +08:00
Mrking 18ac4dcbef 增加打印日志 2024-10-27 21:41:59 +08:00
Mrking 64c44b162e 增加打印日志 2024-10-27 21:39:47 +08:00
Mrking ef860b32f3 增加打印日志 2024-10-26 21:20:47 +08:00
Mrking 280747ad91 增加打印日志 2024-10-26 21:11:15 +08:00
YuanFeng e9e5f68e41 修复 稿件背景颜色失效问题 2024-10-24 22:40:12 +08:00
YuanFeng 03bb6c6acb 优化 批稿提交为图片上传 2024-10-24 21:13:32 +08:00
YuanFeng 0e67114e15 优化 文字描述 2024-10-24 00:33:12 +08:00
YuanFeng 7f7acfea0c 优化 去除图片转换逻辑 2024-10-24 00:12:48 +08:00
YuanFeng 21a0ca112e Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-10-23 23:58:42 +08:00
YuanFeng fd26dc46c1 优化 图稿大图问题 2024-10-23 23:57:47 +08:00
Mrking af97c2824f 优化生产制单 2024-10-23 23:23:53 +08:00
Mrking cce6c32bad 优化生产制单 2024-10-23 22:31:24 +08:00
Mrking ccf7fa405a 优化生产制单 2024-10-23 22:31:00 +08:00
Mrking 8a3ddf222f 优化生产制单 2024-10-23 22:24:21 +08:00
Mrking eeed462ef4 优化生产制单 2024-10-22 22:38:17 +08:00
Mrking 476860c434 优化生产制单 2024-10-22 22:28:59 +08:00
Mrking fd67533544 优化销售订单审核功能 2024-10-21 00:04:17 +08:00
Mrking e9a5400423 优化销售订单审核功能 2024-10-20 23:08:14 +08:00
Mrking 6ff368298d 优化销售订单审核功能 2024-10-20 22:30:39 +08:00
Mrking 6858a908c3 优化发票信息 2024-10-20 16:26:56 +08:00
Mrking 55feb08407 修改客户新增页面排版 2024-10-20 15:02:15 +08:00
YuanFeng 3514966d47 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-10-18 10:09:50 +08:00
YuanFeng 75aad6a93d 优化 下单页面,新增客户地址管理,新增查询条件构建工具类 2024-10-18 10:08:43 +08:00
wwb fe600fe26e 客户基础资料增加发票信息字段 2024-10-14 18:00:24 +08:00
wwb 99275b6277 修改下单首页展示信息 2024-10-14 17:01:59 +08:00
wwb 637ebbcb20 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-10-14 16:55:51 +08:00
wwb b61339d5c9 下单首页提交202410114 2024-10-14 16:55:27 +08:00
YuanFeng 018f89c050 优化 修复表中图片预览层级错乱问题 2024-10-10 20:42:26 +08:00
YuanFeng 20c6ca8beb 优化 更新表格允许拖宽,非必要字段不显示 2024-10-10 19:22:56 +08:00
YuanFeng 5e13575dd3 修复 产品回显问题 2024-10-09 20:52:39 +08:00
YuanFeng 932fbf9015 优化 稿件预览 2024-10-09 10:15:53 +08:00
YuanFeng 0828d7376b 修复 稿件预览 2024-10-09 09:40:46 +08:00
YuanFeng 7b3dbb71ca 调试 文件无法访问问题 2024-10-09 00:51:42 +08:00
YuanFeng 4012c53116 关联 销售订单id 2024-10-08 23:46:48 +08:00
YuanFeng 7b3e0d944a 下单页面 接口对接 2024-10-08 23:41:50 +08:00
YuanFeng a12b47aeac Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-10-06 08:44:33 +08:00
YuanFeng f314af7ad2 调整 稿件图片存储方式,新增产品工艺 2024-10-06 08:38:50 +08:00
Mrking 0af809a013 增加下载pdf按钮 2024-09-24 23:51:16 +08:00
Mrking 7550592b8a 新增前端下单首页 2024-09-24 23:45:30 +08:00
Mrking eecdbc1c71 删除无用文件 2024-09-23 23:00:35 +08:00
Mrking 06734e361b 删除无用文件 2024-09-23 22:56:02 +08:00
Mrking fe4019d27d 新增前端订单列表 2024-09-23 22:46:24 +08:00
Mrking c9d84bd169 删除测试代码 2024-09-22 22:38:20 +08:00
Mrking 3bca52f8a1 删除测试代码 2024-09-22 22:26:17 +08:00
Mrking 268b577851 增加首页 2024-09-22 21:25:49 +08:00
Mrking 3d64b4eaac 增加首页 2024-09-22 21:19:31 +08:00
Mrking fe54bd79b6 优化销售订单价格 2024-09-18 23:25:58 +08:00
Mrking 1c17d7edae Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-09-17 17:36:20 +08:00
Mrking 8f88c051c6 优化销售订单 2024-09-17 17:36:09 +08:00
YuanFeng c20846faf3 稿件 设计同步前台项目 2024-09-17 14:05:44 +08:00
YuanFeng 457c955a19 修改 dialog 默认全屏 2024-09-17 11:31:31 +08:00
Mrking 693b8a60e9 优化客户菜单 2024-09-16 14:12:42 +08:00
Mrking 247ab3f00f 提交 2024-09-15 22:05:48 +08:00
Mrking 355e94cc2e 提交 2024-09-15 21:42:05 +08:00
Mrking b33aea368a 提交 2024-09-15 21:40:39 +08:00
Mrking c39aa21b7f 增加pdf打印 2024-09-15 20:04:59 +08:00
Mrking 20f13d7f5b Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-09-12 12:55:21 +08:00
Mrking 11c705f7e6 新增pi推送邮件 2024-09-12 12:54:23 +08:00
YuanFeng 2ffe759adb 优化 设计稿件 2024-09-11 23:10:05 +08:00
YuanFeng 01819f1811 移除 无效的属性组 2024-09-11 22:47:58 +08:00
YuanFeng f4c0e96bcb 优化 图片加载 2024-09-11 22:23:28 +08:00
YuanFeng b2978d5acc 图片优化 测试 2024-09-11 21:11:38 +08:00
Mrking 79e94961ae Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-09-08 23:13:04 +08:00
Mrking f1332e2765 新增生产制单 2024-09-08 23:12:47 +08:00
YuanFeng 60734a8b61 恢复 环境配置 2024-09-08 19:11:21 +08:00
YuanFeng 2a5390752c 临时 处理图片加载问题 2024-09-08 19:07:58 +08:00
YuanFeng 87414ee9a8 测试 2024-09-08 18:38:27 +08:00
YuanFeng 380e088a89 优化 测试 2024-09-08 18:26:03 +08:00
YuanFeng 5a2bde6a69 优化 图稿预览图片加载问题 2024-09-08 18:05:23 +08:00
YuanFeng 8c7cd9b152 修复 稿件预览图片无法显示 2024-09-08 17:59:04 +08:00
YuanFeng f30c3f233a 优化 预览稿件时图片加载慢导致无法显示 2024-09-08 17:48:48 +08:00
YuanFeng c1a7bee638 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Conflicts:
#	hangtag-ui/hangtag-ui-admin/src/utils/dict.ts
2024-09-08 16:42:12 +08:00
YuanFeng 785bcede9f 改造 优化产品保养项,产品支持多稿件关联,产品保养预览数据结构优化
修复 已知错误
2024-09-08 16:34:49 +08:00
Mrking 8d1ce49ac8 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-09-07 20:04:20 +08:00
Mrking 9604e44645 优化销售订单 2024-09-07 20:04:01 +08:00
YuanFeng 2cf2925c46 更新 api地址修改 2024-09-06 12:48:19 +08:00
YuanFeng aa9f2504f0 同步 admin端稿件管理代码 2024-09-05 21:59:51 +08:00
YuanFeng dc46a919f5 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-09-05 15:44:43 +08:00
YuanFeng afa22d2286 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-09-05 15:44:17 +08:00
YuanFeng 3d6c978db6 临时 提交 2024-09-05 15:43:05 +08:00
Mrking ff46f4d940 新增订单信息 2024-09-04 00:24:14 +08:00
Mrking 5e9a1449ec 删除多余模块 2024-09-03 13:10:46 +08:00
Mrking fb0a227f9c Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-09-03 13:06:22 +08:00
Mrking 96b087489f 增加生产制单 2024-09-03 13:05:57 +08:00
YuanFeng 432362174e fix 品牌接口 2024-09-02 10:30:41 +08:00
YuanFeng b8766a3e87 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-09-02 10:18:30 +08:00
YuanFeng 4d2689377b Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev 2024-09-02 10:17:44 +08:00
YuanFeng fb4e1f3fe1 优化 主页 2024-09-02 10:15:39 +08:00
Mrking 2cfd3db67a Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Conflicts:
#	hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java
#	hangtag-module-system/hangtag-module-system-biz/target/generated-sources/annotations/cn/hangtag/module/system/convert/oauth2/OAuth2OpenConvertImpl.java
#	hangtag-module-system/hangtag-module-system-biz/target/generated-sources/annotations/cn/hangtag/module/system/convert/social/SocialUserConvertImpl.java
2024-09-01 18:39:16 +08:00
Mrking 567b95f371 增加销售订单 2024-09-01 18:36:49 +08:00
YuanFeng 250a06e19d fix dialog组件文件 2024-09-01 15:51:14 +08:00
YuanFeng a2231b68de Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Conflicts:
#	hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java
#	hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/DesignPreviewDialog.vue
#	hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/DesignPropEdit.vue
2024-09-01 15:20:38 +08:00
YuanFeng 044df3161f 新增 产品保养项管理
新增 稿件预览组件
完善 产品资料管理功能
2024-09-01 15:12:47 +08:00
Mrking 1c9bca7345 新增品牌关系表 2024-08-30 08:13:57 +08:00
Mrking 320e76dad4 销售订单 2024-08-25 18:15:14 +08:00
Mrking 9f44be32b0 提交20240824 2024-08-24 22:30:27 +08:00
YuanFeng 778968620e 新增 稿件管理 2024-08-12 23:44:01 +08:00
YuanFeng 5744f7be34 修改 处理冲突 2024-08-12 01:11:38 +08:00
YuanFeng 5b73c0cd01 Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev
# Conflicts:
#	hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java
2024-08-12 01:03:50 +08:00
YuanFeng ee85e1217b 优化 后台本地文件存储和访问路径,配置文件添加本地文件域名配置项
新增 [ui]
1.图稿设计图形图库管理
2.工具栏节点更多属性配置
3.使用技巧提示功能
3.右键菜单功能,
4.动态属性功能,右侧查看节点,和动态属性组功能,
5.优化访问资源的路径问题
2024-08-12 00:59:44 +08:00
Mrking 87c6714c5d 增加客户 2024-08-11 22:08:06 +08:00
Mrking e99bf68869 增加客户 2024-08-11 21:57:11 +08:00
Mrking 877b451f4b 提交客户资料 2024-08-11 09:31:22 +08:00
Mrking a31b37910f 提交20240809 2024-08-09 17:48:35 +08:00
YuanFeng 6e2e264e07 优化 本地文件保存 target的问题、修改为存储将保存到项目上级目录下,用于持久化 2024-07-21 09:56:06 +08:00
YuanFeng 18f4f64ae5 新增 oms系统;产品类型,系统编码,品牌管理,产品管理,后端接口及前端页面,
更新sql以下 sql/mysql/20240720/*.sql
更新 忽略*/taget目录文件
2024-07-20 18:24:11 +08:00
YuanFeng 573ed8f5b6 新增 图稿设计组件及相关依赖, 2024-07-19 21:31:33 +08:00
3262 changed files with 190217 additions and 130900 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.hangtag</groupId>
@ -7,7 +7,7 @@
<version>2.1.0-jdk8-snapshot</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>OMS管理系统</description>
<description>嘉晋OMS系统</description>
<modules>
<module>hangtag-dependencies</module>
<module>hangtag-framework</module>

76
.gitignore vendored
View File

@ -1,17 +1,17 @@
# ---> Java
# Compiled class file
# 编译后的类文件
*.class
# Log file
# 日志文件
*.log
# BlueJ files
# BlueJ 文件
*.ctxt
# Mobile Tools for Java (J2ME)
# 移动工具 for Java (J2ME)
.mtj.tmp/
# Package Files #
# 包文件
*.jar
*.war
*.nar
@ -20,8 +20,72 @@
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
# 虚拟机崩溃日志,详见 http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
# 项目帮助文档
HELP.md
# Maven 生成的目标文件夹
/target/
/**/target/
# 保留 Maven wrapper 的 jar 文件
!.mvn/wrapper/maven-wrapper.jar
### STS (Spring Tool Suite) ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea/
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
/build/
### VS Code ###
.vscode/
rebel-remote.xml
rebel.xml
### Vite 项目 ###
node_modules/
dist/
*.local
*.env.local
*.env.*.local
.vite/deps
### macOS 系统文件 ###
.DS_Store
.AppleDouble
.LSOverride
# 见 http://kb.mozillazine.org/Profiles.ini_file
\Icon
\Icon?
.DS_Store
._*
.Spotlight-V100
.Trashes
__MACOSX
*/.Spotlight-V100
*/.Trashes
# 自定义目录
/logs
/.idea
target

View File

@ -1,7 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="Stylelint" enabled="true" level="ERROR" enabled_by_default="true" />
</profile>
</component>

12
bin/clean.bat Normal file
View File

@ -0,0 +1,12 @@
@echo off
echo.
echo [信息] 清理工程target生成路径。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean
pause

12
bin/package.bat Normal file
View File

@ -0,0 +1,12 @@
@echo off
echo.
echo [信息] 打包Web工程生成war/jar包文件。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean package -Dmaven.test.skip=true
pause

14
bin/run.bat Normal file
View File

@ -0,0 +1,14 @@
@echo off
echo.
echo [信息] 使用Jar命令运行Web工程。
echo.
cd %~dp0
cd ../mikeenk-admin/target
set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
java -jar %JAVA_OPTS% mikeenk-admin.jar
cd bin
pause

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.hangtag</groupId>
@ -77,8 +77,8 @@
<version>${bizlog-sdk.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
@ -163,12 +163,12 @@
<version>${easy-trans.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<groupId>org.springframework.cloud</groupId>
</exclusion>
</exclusions>
</dependency>
@ -193,8 +193,8 @@
<version>${redisson.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
@ -229,8 +229,8 @@
<version>${lock4j.version}</version>
<exclusions>
<exclusion>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<groupId>org.redisson</groupId>
</exclusion>
</exclusions>
</dependency>
@ -275,8 +275,8 @@
<version>${spring-boot-admin.version}</version>
<exclusions>
<exclusion>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-cloud</artifactId>
<groupId>de.codecentric</groupId>
</exclusion>
</exclusions>
</dependency>
@ -302,12 +302,12 @@
<version>${spring.boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<groupId>org.ow2.asm</groupId>
</exclusion>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<groupId>org.mockito</groupId>
</exclusion>
</exclusions>
</dependency>
@ -452,12 +452,12 @@
<version>${aliyun-java-sdk-core.version}</version>
<exclusions>
<exclusion>
<groupId>io.opentracing</groupId>
<artifactId>opentracing-api</artifactId>
<groupId>io.opentracing</groupId>
</exclusion>
<exclusion>
<groupId>io.opentracing</groupId>
<artifactId>opentracing-util</artifactId>
<groupId>io.opentracing</groupId>
</exclusion>
</exclusions>
</dependency>
@ -477,8 +477,8 @@
<version>${justauth.version}</version>
<exclusions>
<exclusion>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<groupId>cn.hutool</groupId>
</exclusion>
</exclusions>
</dependency>
@ -503,8 +503,8 @@
<version>${jimureport.version}</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
</exclusions>
</dependency>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -25,6 +25,7 @@ public interface GlobalErrorCodeConstants {
ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");
ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求不允许
ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试");
ErrorCode NOT_SUPPORT_FILE_TYPE = new ErrorCode(430, "不支持上传该文件类型");
// ========== 服务端错误段 ==========
@ -38,4 +39,8 @@ public interface GlobalErrorCodeConstants {
ErrorCode UNKNOWN = new ErrorCode(999, "未知错误");
ErrorCode DATA_EMPTY = new ErrorCode(1000, "数据不存在");
ErrorCode DATA_DUPLICATE = new ErrorCode(1001, "数据重复,操作失败");
}

View File

@ -0,0 +1,42 @@
package cn.hangtag.framework.common.pojo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "文件信息")
@Data
public class FileInfoVO {
/**
* infra_file id
*/
@Schema(description = "文件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
/**
* infra_file_config id
*/
@Schema(description = "配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11")
private Long configId;
@Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "hangtag.jpg")
private String path;
@Schema(description = "原文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "hangtag.jpg")
private String name;
@Schema(description = "文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/hangtag.jpg")
private String url;
@Schema(description = "文件MIME类型", example = "application/octet-stream")
private String type;
@Schema(description = "文件大小", example = "2048", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer size;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@ -6,6 +6,7 @@ import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Schema(description = "分页结果")
@Data
@ -17,6 +18,10 @@ public final class PageResult<T> implements Serializable {
@Schema(description = "总量", requiredMode = Schema.RequiredMode.REQUIRED)
private Long total;
@Schema(description = "其他数据")
private Map<String,Object> otherMap;
public PageResult() {
}

View File

@ -0,0 +1,30 @@
package cn.hangtag.framework.common.serialnumber;
import cn.hangtag.framework.common.util.FuncUtil;
import lombok.Data;
@Data
public abstract class BaseCodingRulesType extends CodingRulesInfo {
public CodingRulesInfo setLastValue(String value){
// 影响流水号并与之前的值发生变了
hasChanged = resetSerialNumber && !FuncUtil.equals(this.lastValue,value);
// 最后为空时不作为变化
if(FuncUtil.equals(this.lastValue,"")){
hasChanged = false;
}
this.lastValue = value;
return this;
}
/**
* 对代码进行编码
*
* @param resetFlag 是否重置流水号
* @return {@link String}
*/
public abstract String toCode(boolean resetFlag);
}

View File

@ -0,0 +1,73 @@
package cn.hangtag.framework.common.serialnumber;
import cn.hutool.core.bean.BeanUtil;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 构建器规则信息
*
* @author YuanFeng
* @date 2024/07/20
*/
public class BuilderRuleUtils {
/**
* 解析一组规则信息并将修改后的返回
*
* @param list 列表
* @return {@link ParseRuleResult}
*/
public static ParseRuleResult parseRuleInfo(List<CodingRulesInfo> list) {
ParseRuleResult ruleResult = new ParseRuleResult();
Map<String, DateTimeType> timeMap = new HashMap<>();
Map<String, SerialNumberType> serialNumberMap = new HashMap<>();
Map<String, ConstantType> constantMap = new HashMap<>();
String code = "";
boolean reset = false;
// 解析每一段code
for (int i1 = 0; i1 < list.size(); i1++) {
CodingRulesInfo item = list.get(i1);
String mapKey = item.getItemKey();
if ("constant".equals(item.getType())) {
ConstantType constantType = constantMap.get(mapKey);
if (constantType == null) {
constantType = BeanUtil.toBean(item, ConstantType.class);
constantMap.put(mapKey, constantType);
} else {
BeanUtil.copyProperties(item, constantType, "lastValue");
}
code += constantType.toCode(reset);
} else if ("dateTime".equals(item.getType())) {
DateTimeType dateTimeType = timeMap.get(mapKey);
if (dateTimeType == null) {
dateTimeType = BeanUtil.toBean(item, DateTimeType.class);
timeMap.put(mapKey, dateTimeType);
} else {
BeanUtil.copyProperties(item, dateTimeType, "lastValue");
}
code += dateTimeType.toCode(reset);
if (dateTimeType.isHasChanged()) {
reset = true;
}
} else if ("serialNumber".equals(item.getType())) {
SerialNumberType serialNumber = serialNumberMap.get(mapKey);
if (serialNumber == null) {
serialNumber = BeanUtil.toBean(item, SerialNumberType.class);
serialNumberMap.put(mapKey, serialNumber);
} else {
BeanUtil.copyProperties(item, serialNumber);
}
String s = serialNumber.toCode(reset);
// 覆盖之前数据
item.setLastValue(s);
serialNumberMap.put(mapKey, serialNumber);
code += s;
}
}
ruleResult.setCode(code);
ruleResult.setList(list);
return ruleResult;
}
}

View File

@ -0,0 +1,59 @@
package cn.hangtag.framework.common.serialnumber;
import lombok.Data;
import java.io.Serializable;
@Data
public class CodingRulesInfo implements Serializable {
/**
*
*/
protected String itemKey;
/**
* 类型 {@link CodingRulesTypeEnum}
*/
protected String type;
/**
*
*/
protected String value;
/**
* 最后一个值
*/
protected String lastValue;
/**
* 类型名称
*/
protected String typeName;
/**
* 是否影响重置序列号
*/
protected boolean resetSerialNumber;
/**
* 流水号长度
*/
protected Integer length;
/**
* 每次递增数
*/
protected Integer step;
/**
* 类型解释
*/
protected String typeExplain;
/**
* 是否改变值
*/
protected boolean hasChanged;
}

View File

@ -0,0 +1,26 @@
package cn.hangtag.framework.common.serialnumber;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 编码规则类型枚举
*
* @author YuanFeng
* @date 2024/01/31
*/
@AllArgsConstructor
@Getter
public enum CodingRulesTypeEnum {
CONSTANT("constant", "常量","固定值",ConstantType.class),
DATE_TIME("dateTime", "日期时间","使用当前时间",DateTimeType.class),
SERIAL_NUMBER_TYPE("serialNumber", "流水号","使用流水号",SerialNumberType.class);
private final String type;
private final String typeName;
private final String typeExplain;
private final Class clazz;
}

View File

@ -0,0 +1,31 @@
package cn.hangtag.framework.common.serialnumber;
import lombok.Data;
/**
* 常量类型
*
* @author YuanFeng
* @date 2024/01/31
*/
@Data
public class ConstantType extends BaseCodingRulesType {
public ConstantType() {
this.type = CodingRulesTypeEnum.CONSTANT.getType();
}
@Override
public String toCode(boolean resetFlag) {
String value = getValue();
setLastValue(value);
return value;
}
public static void main(String[] args) {
ConstantType constantType = new ConstantType();
constantType.setValue("PO");
System.out.println(constantType.isHasChanged());
}
}

View File

@ -0,0 +1,34 @@
package cn.hangtag.framework.common.serialnumber;
import cn.hangtag.framework.common.util.FuncUtil;
import cn.hutool.core.date.DateUtil;
import lombok.Data;
/**
* 日期时间类型
*
* @author YuanFeng
* @date 2024/01/31
*/
@Data
public class DateTimeType extends BaseCodingRulesType {
public DateTimeType() {
this.type = CodingRulesTypeEnum.DATE_TIME.getType();
this.value = "yyyyMMdd";
}
@Override
public String toCode(boolean resetFlag) {
String res = "";
if("time".equals(this.getValue())){
res = FuncUtil.toStr(System.currentTimeMillis());
}else{
String format = DateUtil.format(DateUtil.date(), this.getValue());
res = format;
}
setLastValue(res);
return res;
}
}

View File

@ -0,0 +1,71 @@
package cn.hangtag.framework.common.serialnumber;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
public static void main(String[] args) {
List<CodingRulesInfo> list = new ArrayList<>();
ConstantType constantType = new ConstantType();
// 常量值
constantType.setValue("TEST-");
DateTimeType dateTimeType = new DateTimeType();
// 时间格式
dateTimeType.setValue("yyyy");
SerialNumberType serialNumberType = new SerialNumberType();
// 起始值
serialNumberType.setValue("1");
serialNumberType.setStep(1);
serialNumberType.setLength(6);
ConstantType constantType2 = new ConstantType();
// 常量值
constantType2.setValue("-");
// 根据顺序生成条码
list.add(constantType);
list.add(dateTimeType);
list.add(constantType2);
list.add(serialNumberType);
ParseRuleResult ruleResult = BuilderRuleUtils.parseRuleInfo(list);
System.out.println(ruleResult.getCode());
System.out.println(builderCodeConfig());
}
public static String builderCodeConfig(){
// 根据需要生成条码 配置
List<CodingRulesInfo> list = new ArrayList<>();
ConstantType constantType = new ConstantType();
// 常量值
constantType.setValue("TEST-");
DateTimeType dateTimeType = new DateTimeType();
// 时间格式
dateTimeType.setValue("yyyy");
SerialNumberType serialNumberType = new SerialNumberType();
// 起始值
serialNumberType.setValue("1");
serialNumberType.setStep(1);
serialNumberType.setLength(6);
ConstantType constantType2 = new ConstantType();
// 常量值
constantType2.setValue("-");
// 根据顺序生成条码
list.add(constantType);
list.add(dateTimeType);
list.add(constantType2);
list.add(serialNumberType);
return JSONUtil.toJsonStr(list);
}
}

View File

@ -0,0 +1,17 @@
package cn.hangtag.framework.common.serialnumber;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class ParseRuleResult implements Serializable {
private String code;
/**
* 生成编码之后的数据
*/
List<CodingRulesInfo> list;
}

View File

@ -0,0 +1,68 @@
package cn.hangtag.framework.common.serialnumber;
import cn.hangtag.framework.common.util.FuncUtil;
import lombok.Data;
/**
* 流水号类型
*
* @author YuanFeng
* @date 2024/01/31
*/
@Data
public class SerialNumberType extends BaseCodingRulesType {
private Integer length = 4;
private Integer step = 1;
private boolean fillZero = true;
public SerialNumberType() {
this.type = CodingRulesTypeEnum.SERIAL_NUMBER_TYPE.getType();;
}
@Override
public String toCode(boolean resetFlag) {
if(resetFlag){
setValue(FuncUtil.toStr(getValue(),"1"));
}else {
long num = FuncUtil.toLong(getLastValue(),0L)+ step;
setValue(FuncUtil.toStr(num));
}
setLastValue(getValue());
return getNUmber();
}
private String getNUmber(){
if(fillZero){
return zeroPad(FuncUtil.toLong(getValue()), FuncUtil.toLong(getLength()));
}
return getValue();
}
public static String zeroPad(long number, long length) {
// 将数字转换为字符串
String numberStr = FuncUtil.toStr(number);
// 计算需要补零的位数
long zeroCount = Math.max(0, length - numberStr.length());
// 构造补零的字符串
StringBuilder zeroPadding = new StringBuilder();
for (int i = 0; i < zeroCount; i++) {
zeroPadding.append("0");
}
// 拼接补零和原始数字字符串
return zeroPadding.toString() + numberStr;
}
public static void main(String[] args) {
SerialNumberType serialNumberType = new SerialNumberType();
serialNumberType.setStep(2);
serialNumberType.setLength(6);
serialNumberType.setFillZero(true);
for (int i = 0; i < 10; i++) {
System.out.println(serialNumberType.isHasChanged());
System.out.println(serialNumberType.toCode(false));
}
serialNumberType.setFillZero(false);
System.out.println(serialNumberType.toCode(true));
}
}

View File

@ -0,0 +1,623 @@
package cn.hangtag.framework.common.util;
import cn.hangtag.framework.common.util.json.JsonUtils;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.DigestUtil;
import org.springframework.lang.NonNull;
import org.springframework.util.*;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 常用功能工具类
*/
public class FuncUtil extends StringUtils {
private static final Pattern humpPattern = Pattern.compile("[A-Z]");
public static boolean isBlank(@NonNull final CharSequence cs) {
return cs == null || containsOnlyWhitespaces(cs);
}
public static String dateFormat(LocalDateTime localDateTime){
return DateUtil.format(localDateTime,"yyyy-MM-dd HH:mm:ss");
}
public static String dateFormat(Date date,String format){
return DateUtil.format(date,format);
}
public static String dateFormat(Date date){
return DateUtil.format(date,"yyyy-MM-dd HH:mm:ss");
}
/**
* 是全是空格
*
* @param string 字符串
* @return boolean
*/
public static boolean containsOnlyWhitespaces(CharSequence string) {
int size = string.length();
for(int i = 0; i < size; ++i) {
char c = string.charAt(i);
if (!isWhitespace(c)) {
return false;
}
}
return true;
}
public static boolean isWhitespace(final char c) {
return Character.isWhitespace(c)
|| Character.isSpaceChar(c)
|| c == '\ufeff'
|| c == '\u202a'
|| c == '\u0000';
}
public static boolean isEmpty(@NonNull Object obj) {
return ObjectUtil.isEmpty(obj);
}
public static boolean isNotEmpty(@NonNull Object obj) {
return !FuncUtil.isEmpty(obj);
}
public static boolean equals(Object a, Object b) {
return equals(a,b,false);
}
/**
*
*
* @param a a
* @param b b
* @param equalsValue 如果是数字类型是否判断值是否相等
* @return boolean
*/
public static boolean equals(Object a, Object b,boolean equalsValue) {
if (a instanceof BigDecimal && b instanceof BigDecimal) {
BigDecimal bigNum1 = (BigDecimal) a;
BigDecimal bigNum2 = (BigDecimal) b;
if (bigNum1 == bigNum2) {
return true;
} else if (bigNum1 != null && bigNum2 != null) {
return 0 == bigNum1.compareTo(bigNum2);
} else {
return false;
}
} else if ( equalsValue && a instanceof Long && b instanceof Integer) {
return toLong(a) == toInt(b);
} else if (equalsValue && a instanceof Integer && b instanceof Long) {
return toInt(a) == toLong(b);
}
return (a == b) || (a != null && a.equals(b));
}
public static boolean isEmpty(@NonNull Object[] array) {
return ObjectUtil.isEmpty(array);
}
public static <T> boolean contains(@NonNull T[] array, final T element) {
return array == null ? false : Arrays.stream(array).anyMatch((x) -> {
Object o1 =x;
Object o2 = element;
if (o1 == o2) {
return true;
}
if (o1 == null || o2 == null) {
return false;
}
if (o1.equals(o2)) {
return true;
}
if (o1.getClass().isArray() && o2.getClass().isArray()) {
if (o1 instanceof Object[] && o2 instanceof Object[]) {
return Arrays.equals((Object[]) o1, (Object[]) o2);
}
if (o1 instanceof boolean[] && o2 instanceof boolean[]) {
return Arrays.equals((boolean[]) o1, (boolean[]) o2);
}
if (o1 instanceof byte[] && o2 instanceof byte[]) {
return Arrays.equals((byte[]) o1, (byte[]) o2);
}
if (o1 instanceof char[] && o2 instanceof char[]) {
return Arrays.equals((char[]) o1, (char[]) o2);
}
if (o1 instanceof double[] && o2 instanceof double[]) {
return Arrays.equals((double[]) o1, (double[]) o2);
}
if (o1 instanceof float[] && o2 instanceof float[]) {
return Arrays.equals((float[]) o1, (float[]) o2);
}
if (o1 instanceof int[] && o2 instanceof int[]) {
return Arrays.equals((int[]) o1, (int[]) o2);
}
if (o1 instanceof long[] && o2 instanceof long[]) {
return Arrays.equals((long[]) o1, (long[]) o2);
}
if (o1 instanceof short[] && o2 instanceof short[]) {
return Arrays.equals((short[]) o1, (short[]) o2);
}
return false;
}
return false;
});
}
public static boolean contains(@NonNull Iterator<?> iterator, Object element) {
if (iterator != null) {
while (iterator.hasNext()) {
Object candidate = iterator.next();
if (ObjectUtils.nullSafeEquals(candidate, element)) {
return true;
}
}
}
return false;
}
public static boolean contains(@NonNull Enumeration<?> enumeration, Object element) {
if (enumeration != null) {
while (enumeration.hasMoreElements()) {
Object candidate = enumeration.nextElement();
if (ObjectUtils.nullSafeEquals(candidate, element)) {
return true;
}
}
}
return false;
}
public static String toStr(Object str) {
return toStr(str, "");
}
public static String toStr(Object str, String defaultValue) {
return null != str ? str.toString() : defaultValue;
}
public static String toStrWithEmpty(Object str, String defaultValue) {
return null != str && !str.equals("null") && !str.equals("") ? FuncUtil.toStr(str) : defaultValue;
}
public static int toInt(final Object str) {
return toInteger(str,-1);
}
public static int toInt(@NonNull final Object str, final int defaultValue) {
return toInteger(str, defaultValue);
}
public static Integer toInteger(final Object str) {
return toInteger(str,null);
}
public static Integer toInteger(@NonNull final Object str, final Integer defaultValue) {
if (str == null) {
return defaultValue;
} else {
try {
return Integer.valueOf(FuncUtil.toStr(str));
} catch (NumberFormatException var3) {
return defaultValue;
}
}
}
public static long tolong(final Object str) {
return toLong(str,-1L);
}
public static long tolong(@NonNull final Object str, final long defaultValue) {
return toLong(str,defaultValue);
}
public static Long toLong(final Object str) {
return toLong(str,-1L);
}
public static Long toLong(@NonNull final Object str, final Long defaultValue) {
if (str == null) {
return defaultValue;
} else {
try {
return Long.valueOf(FuncUtil.toStr(str));
} catch (NumberFormatException var4) {
return defaultValue;
}
}
}
public static Double toDouble(Object value) {
return toDouble(FuncUtil.toStr(value), -1.0D);
}
public static Double toDouble(Object value, Double defaultValue) {
try {
return value != null ? Double.valueOf(FuncUtil.toStr(value).trim()) : defaultValue;
}catch (Exception var3) {
return defaultValue;
}
}
public static Float toFloat(Object value) {
return toFloat(FuncUtil.toStr(value), -1.0F);
}
public static Float toFloat(Object value, Float defaultValue) {
return value != null ? Float.valueOf(FuncUtil.toStr(value).trim()) : defaultValue;
}
public static Boolean toBoolean(Object value) {
return toBoolean(value, (Boolean)null);
}
public static Boolean toBoolean(Object value, Boolean defaultValue) {
if (value != null) {
if(value instanceof Boolean){
return (Boolean) value;
}
String val = FuncUtil.toStr(value);
val = val.toLowerCase().trim();
return Boolean.parseBoolean(val);
} else {
return defaultValue;
}
}
public static Integer[] toIntArray(String str) {
return toIntArray(",", str);
}
public static Integer[] toIntArray(String split, String str) {
if (isEmpty(str)) {
return new Integer[0];
} else {
String[] arr = str.split(split);
Integer[] ints = new Integer[arr.length];
for(int i = 0; i < arr.length; ++i) {
Integer v = toInteger(arr[i], 0);
ints[i] = v;
}
return ints;
}
}
public static List<Integer> toIntList(String str) {
return Arrays.asList(toIntArray(str));
}
public static List<Integer> toIntList(String split, String str) {
return Arrays.asList(toIntArray(split, str));
}
public static Integer firstInt(String str) {
return firstInt(",", str);
}
public static Integer firstInt(String split, String str) {
List<Integer> ints = toIntList(split, str);
return isEmpty((Object)ints) ? null : (Integer)ints.get(0);
}
public static Long[] toLongArray(String str) {
return toLongArray(",", str);
}
public static Long[] toLongArray(String split, String str) {
if (isEmpty(str)) {
return new Long[0];
} else {
String[] arr = str.split(split);
Long[] longs = new Long[arr.length];
for(int i = 0; i < arr.length; ++i) {
Long v = toLong(arr[i], 0L);
longs[i] = v;
}
return longs;
}
}
public static List<Long> toLongList(String str) {
return Arrays.asList(toLongArray(str));
}
public static List<Long> toLongList(String split, String str) {
return Arrays.asList(toLongArray(split, str));
}
public static Long firstLong(String str) {
return firstLong(",", str);
}
public static Long firstLong(String split, String str) {
List<Long> longs = toLongList(split, str);
return isEmpty((Object)longs) ? null : (Long)longs.get(0);
}
public static String[] toStrArray(String str) {
return toStrArray(",", str);
}
public static String[] toStringArray(Collection<String> collection) {
if(isEmpty(collection)){
return null;
}
int size = collection.size();
String[] arr = new String[size];
collection.toArray(arr);
return arr;
}
public static String[] toStrArray(String split, String str) {
return isBlank(str) ? new String[0] : str.split(split);
}
public static List<String> toStrList(String str) {
return Arrays.asList(toStrArray(str));
}
public static List<String> toStrListByArray(Object[] objects) {
if(isEmpty(objects)){
return null;
}
List<String> list = new ArrayList<>();
for (Object o : objects) {
list.add(toStr(o,null));
}
return list;
}
public static List<String> toStrListByCollection(Collection<Object> objects) {
if(isEmpty(objects)){
return null;
}
List<String> list = new ArrayList<>();
for (Object o : objects) {
list.add(toStr(o,null));
}
return list;
}
public static List<String> toStrList(String split, String str) {
return Arrays.asList(toStrArray(split, str));
}
public static String firstStr(String str) {
return firstStr(",", str);
}
public static String firstStr(String split, String str) {
List<String> strs = toStrList(split, str);
return isEmpty((Object)strs) ? null : (String)strs.get(0);
}
public static String randomInt(int count) {
return getRandomRange(count,1);
}
public static String randomChar(int count) {
return getRandomRange(count,2);
}
public static String randomAll(int count) {
return getRandomRange(count,-1);
}
private static String getRandomRange(int count,int type){
if (count == 0) return "";
String factor = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
if(1 == type){
factor = "0123456789";
} else if(2 == type){
factor = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
}
Assert.isTrue(count > 0, "Requested random string length " + count + " is less than 0.");
Random random = new SecureRandom();
char[] buffer = new char[count];
for(int i = 0; i < count; ++i) {
buffer[i] = factor.charAt(random.nextInt(factor.length()));
}
return new String(buffer);
}
public static String md5Hex(final String data) {
return DigestUtil.md5Hex(data);
}
public static String md5Hex(final byte[] bytes) {
return DigestUtil.md5Hex(bytes);
}
public static String sha1Hex(String data) {
return DigestUtil.sha1Hex(data);
}
public static String sha1Hex(final byte[] bytes) {
return DigestUtil.sha1Hex(bytes);
}
public static String sha256Hex(String data) {
return DigestUtil.sha256Hex(data);
}
public static String sha256Hex(final byte[] bytes) {
return DigestUtil.sha256Hex(bytes);
}
public static String encodeBase64(String value, Charset charset) {
byte[] val = value.getBytes(charset);
return new String(Base64Utils.encode(val), charset);
}
public static String decodeBase64(String value) {
return decodeBase64(value, StandardCharsets.UTF_8);
}
public static String decodeBase64(String value, Charset charset) {
byte[] val = value.getBytes(charset);
byte[] decodedValue = Base64Utils.decode(val);
return new String(decodedValue, charset);
}
public static String decodeBase64UrlSafe(String value) {
return decodeBase64UrlSafe(value,StandardCharsets.UTF_8);
}
public static String decodeBase64UrlSafe(String value, Charset charset) {
byte[] val = value.getBytes(charset);
return new String(Base64Utils.encodeUrlSafe(val), charset);
}
public static String urlDecode(String source) {
return StringUtils.uriDecode(source, StandardCharsets.UTF_8);
}
public static String urlDecode(String source, Charset charset) {
return StringUtils.uriDecode(source, charset);
}
public static <T> T toBean(Map<String, Object> beanMap, Class<T> valueType) {
return BeanUtil.toBean(beanMap, valueType);
}
/**
* 高亮度文本
*
* @param sourceText 源文本
* @param keyword 关键字
* @param pre 前缀
* @param suf 后缀
* @return {@link String}
*/
public static String toHighLightText(String sourceText,String keyword,String pre,String suf){
if(isEmpty(sourceText) || isEmpty(keyword)){
return sourceText;
}
char[] chars = keyword.toCharArray();
Set<Character> set = new HashSet<>();
for (Character c : chars) {
set.add(c);
}
for (Character item : set) {
String tmp = FuncUtil.toStr(item).trim();
sourceText = sourceText.replaceAll(tmp,pre+tmp+suf);
}
return sourceText;
}
public static String toHighLightText(String sourceText,String keyword){
return toHighLightText(sourceText,keyword,HIGH_LIGHT_PRE_TAG, HIGH_LIGHT_POST_TAG);
}
public static final String HIGH_LIGHT_PRE_TAG = "<font color='#CC0000'>";
public static final String HIGH_LIGHT_POST_TAG = "</font>";
/**
* 高亮度文本
*
* @param textList 源文本
* @param keyword 关键字
* @return {@link List}<{@link String}>
*/
public static List<String> toHighLightText(List<String> textList,String keyword){
return toHighLightText(keyword,textList,HIGH_LIGHT_PRE_TAG,HIGH_LIGHT_POST_TAG);
}
/**
* 高亮度文本
*
* @param keyword 关键字
* @param textList 文本列表
* @param pre 精准医疗
* @param suf 进而
* @return {@link List}<{@link String}>
*/
public static List<String> toHighLightText(String keyword,List<String> textList,String pre,String suf){
List<String> list = new ArrayList<>();
if(isEmpty(textList) || isEmpty(keyword)){
return textList;
}
for (String s : textList) {
list.add(toHighLightText(s,keyword,pre,suf));
}
return list;
}
/**
* 驼峰转下划线
*
* @param str
* @return
*/
public static String humpToLine(String str) {
if (str != null && str.length() > 0) {
str = str.substring(0, 1).toLowerCase() + str.substring(1);
Matcher matcher = humpPattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
return str;
}
/**
* 生成数据指纹
*
* @param data
* @return
*/
public static String createDataMD5(final Object data, final Object... datas) {
StringBuilder builder = new StringBuilder();
builder.append(getObjectStr(data));
if (FuncUtil.isNotEmpty(datas)) {
for (Object object : datas) {
builder.append(getObjectStr(object));
}
}
return DigestUtils.md5DigestAsHex(FuncUtil.toStr(builder, "").getBytes(StandardCharsets.UTF_8));
}
private static String getObjectStr(Object object){
if(object instanceof ServletRequest){
ServletRequest servletRequest = (ServletRequest) object;
String remoteAddr = servletRequest.getRemoteAddr()+servletRequest.getRemoteHost();
return DigestUtils.md5DigestAsHex(JsonUtils.toJson(remoteAddr).getBytes(StandardCharsets.UTF_8));
}
return DigestUtils.md5DigestAsHex(JsonUtils.toJson(object,"{}").getBytes(StandardCharsets.UTF_8));
}
public static String createDeviceId() {
HttpServletRequest request = getRequest();
String host = request.getHeader("host");
String userAgent = request.getHeader("User-Agent");
String deviceId = createDataMD5("sessionUserId",host, userAgent, "8htcgeib794ual23nnyo6udyka746tgqfl74sldw0dae3ilm9abg2qqrkvogjtqm");
return deviceId;
}
public static HttpServletRequest getRequest() {
RequestAttributes requestAttributes =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
return requestAttributes == null ? null : ((ServletRequestAttributes) requestAttributes).getRequest();
}
public static LocalDateTime timeToLocalDate(Long timestamp) {
if(isEmpty(timestamp)){
return null;
}
Instant instant = Instant.ofEpochMilli(timestamp);
// Instant 转换为 LocalDateTime
return LocalDateTime.ofInstant(instant, java.time.ZoneId.systemDefault());
}
public static Long localDateToLong(LocalDateTime date) {
if(isEmpty(date)){
return null;
}
Instant instant = date.atZone(TimeZone.getDefault().toZoneId()).toInstant();
return instant.getEpochSecond();
}
private static final Snowflake snowflake = IdUtil.getSnowflake();
public static long getNextId() {
return snowflake.nextId();
}
}

View File

@ -0,0 +1,490 @@
package cn.hangtag.framework.common.util;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.type.CollectionLikeType;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.Nullable;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.*;
@Slf4j
public class JsonUtil {
public static <T> String toJson(T value) {
try {
return getFastInstance().writeValueAsString(value);
} catch (Exception var2) {
log.error(var2.getMessage(), var2);
return null;
}
}
public static <T> String toJson(T value, String defaultValue) {
if (value == null) {
return defaultValue;
}
try {
return getFastInstance().writeValueAsString(value);
} catch (Exception var2) {
return defaultValue;
}
}
@SneakyThrows
public static byte[] toJsonAsBytes(Object object) {
return getFastInstance().writeValueAsBytes(object);
}
public static <T> T parse(String content, Class<T> valueType) {
try {
return getInstance().readValue(content, valueType);
} catch (Exception var3) {
log.error(var3.getMessage(), var3);
return null;
}
}
public static <T> T parseFast(String content, Class<T> valueType) {
try {
return getFastInstance().readValue(content, valueType);
} catch (Exception var3) {
log.error(var3.getMessage(), var3);
return null;
}
}
@SneakyThrows
public static <T> T parse(String content, TypeReference<T> typeReference) {
return getInstance().readValue(content, typeReference);
}
@SneakyThrows
public static <T> T parse(byte[] bytes, Class<T> valueType) {
return getInstance().readValue(bytes, valueType);
}
@SneakyThrows
public static <T> T parse(byte[] bytes, TypeReference<T> typeReference) {
return getInstance().readValue(bytes, typeReference);
}
@SneakyThrows
public static <T> T parse(InputStream in, Class<T> valueType) {
return getInstance().readValue(in, valueType);
}
@SneakyThrows
public static <T> T parse(InputStream in, TypeReference<T> typeReference) {
return getInstance().readValue(in, typeReference);
}
public static <T> List<T> parseArray(String content, Class<T> valueTypeRef) {
try {
if (!content.toLowerCase().startsWith("[")) {
content = "[" + content + "]";
}
List<Map<String, Object>> list = getInstance().readValue(content, new TypeReference<List<Map<String, Object>>>() {
});
List<T> result = new ArrayList();
Iterator var4 = list.iterator();
while (var4.hasNext()) {
Map<String, Object> map = (Map) var4.next();
result.add(toPojo(map, valueTypeRef));
}
return result;
} catch (IOException var6) {
log.error(var6.getMessage(), var6);
return null;
}
}
@SneakyThrows
public static JsonNode readTree(String jsonString) {
Objects.requireNonNull(jsonString, "jsonString is null");
return getInstance().readTree(jsonString);
}
@SneakyThrows
public static JsonNode readTree(InputStream in) {
Objects.requireNonNull(in, "InputStream in is null");
return getInstance().readTree(in);
}
@SneakyThrows
public static JsonNode readTree(byte[] content) {
Objects.requireNonNull(content, "byte[] content is null");
return getInstance().readTree(content);
}
@SneakyThrows
public static JsonNode readTree(JsonParser jsonParser) {
return getFastInstance().readTree(jsonParser);
}
@SneakyThrows
@Nullable
public static <T> T readValue(@Nullable byte[] content, Class<T> valueType) {
if (ObjectUtil.isEmpty(content)) {
return null;
}
return getInstance().readValue(content, valueType);
}
@SneakyThrows
@Nullable
public static <T> T readValue(@Nullable String jsonString, Class<T> valueType) {
if (jsonString == null || jsonString.contains(" ")) {
return null;
}
return getInstance().readValue(jsonString, valueType);
}
@SneakyThrows
@Nullable
public static <T> T readValue(@Nullable InputStream in, Class<T> valueType) {
if (in == null) {
return null;
}
return getInstance().readValue(in, valueType);
}
@SneakyThrows
@Nullable
public static <T> T readValue(@Nullable byte[] content, TypeReference<T> typeReference) {
if (ObjectUtil.isEmpty(content)) {
return null;
}
return getInstance().readValue(content, typeReference);
}
@SneakyThrows
@Nullable
public static <T> T readValue(@Nullable String jsonString, TypeReference<T> typeReference) {
if (jsonString == null || jsonString.contains(" ")) {
return null;
}
return getInstance().readValue(jsonString, typeReference);
}
@SneakyThrows
@Nullable
public static <T> T readValue(@Nullable InputStream in, TypeReference<T> typeReference) {
if (in == null) {
return null;
}
return getInstance().readValue(in, typeReference);
}
public static MapType getMapType(Class<?> keyClass, Class<?> valueClass) {
return getFastInstance().getTypeFactory().constructMapType(Map.class, keyClass, valueClass);
}
public static CollectionLikeType getListType(Class<?> elementClass) {
return getFastInstance().getTypeFactory().constructCollectionLikeType(List.class, elementClass);
}
@SneakyThrows
public static <T> List<T> readList(@Nullable byte[] content, Class<T> elementClass) {
if (ObjectUtil.isEmpty(content)) {
return Collections.emptyList();
}
return getInstance().readValue(content, getListType(elementClass));
}
@SneakyThrows
public static <T> List<T> readList(@Nullable InputStream content, Class<T> elementClass) {
if (content == null) {
return Collections.emptyList();
}
return getInstance().readValue(content, getListType(elementClass));
}
@SneakyThrows
public static <T> List<T> readList(@Nullable String content, Class<T> elementClass) {
if (ObjectUtil.isEmpty(content)) {
return Collections.emptyList();
}
return getInstance().readValue(content, getListType(elementClass));
}
@SneakyThrows
public static <K, V> Map<K, V> readMap(@Nullable byte[] content, Class<?> keyClass, Class<?> valueClass) {
if (ObjectUtil.isEmpty(content)) {
return Collections.emptyMap();
}
return getInstance().readValue(content, getMapType(keyClass, valueClass));
}
@SneakyThrows
public static <K, V> Map<K, V> readMap(@Nullable InputStream content, Class<?> keyClass, Class<?> valueClass) {
if (ObjectUtil.isEmpty(content)) {
return Collections.emptyMap();
}
return getInstance().readValue(content, getMapType(keyClass, valueClass));
}
@SneakyThrows
public static <K, V> Map<K, V> readMap(@Nullable String content, Class<?> keyClass, Class<?> valueClass) {
if (ObjectUtil.isEmpty(content)) {
return Collections.emptyMap();
}
return getInstance().readValue(content, getMapType(keyClass, valueClass));
}
public static Map<String, Object> readMap(@Nullable String content) {
return readMap(content, String.class, Object.class);
}
@SneakyThrows
public static List<Map<String, Object>> readListMap(@Nullable String content) {
if (ObjectUtil.isEmpty(content)) {
return Collections.emptyList();
}
return getInstance().readValue(content, new TypeReference<List<Map<String, Object>>>() {
});
}
public static <T> T convertValue(Object fromValue, Class<T> toValueType) {
return getFastInstance().convertValue(fromValue, toValueType);
}
public static <T> T convertValue(Object fromValue, JavaType toValueType) {
return getFastInstance().convertValue(fromValue, toValueType);
}
public static <T> T convertValue(Object fromValue, TypeReference<T> toValueTypeRef) {
return getFastInstance().convertValue(fromValue, toValueTypeRef);
}
public static <T> T treeToValue(TreeNode treeNode, Class<T> valueType) {
try {
return getFastInstance().treeToValue(treeNode, valueType);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
public static JsonNode valueToTree(@Nullable Object value) {
return getInstance().valueToTree(value);
}
public static boolean canSerialize(@Nullable Object value) {
return value == null || getInstance().canSerialize(value.getClass());
}
public static Map<String, Object> toMap(String content) {
try {
return (Map) getInstance().readValue(content, Map.class);
} catch (IOException var2) {
log.error(var2.getMessage(), var2);
return null;
}
}
public static <T> Map<String, T> toMap(String content, Class<T> valueTypeRef) {
try {
Map<String, Map<String, Object>> map = getInstance().readValue(content, new TypeReference<Map<String, Map<String, Object>>>() {
});
Map<String, T> result = new HashMap(16);
Iterator var4 = map.entrySet().iterator();
while (var4.hasNext()) {
Map.Entry<String, Map<String, Object>> entry = (Map.Entry) var4.next();
result.put(entry.getKey(), toPojo(entry.getValue(), valueTypeRef));
}
return result;
} catch (IOException var6) {
log.error(var6.getMessage(), var6);
return null;
}
}
public static <T> T toPojo(Map fromValue, Class<T> toValueType) {
return getFastInstance().convertValue(fromValue, toValueType);
}
/**
* 使用这个覆盖更多类型配置效率一点些但是精度更高
*
* @param fromValue 从价值
* @param toValueType 指向值类型
* @return {@link T }
*/
public static <T> T toPojoFull(Object fromValue, Class<T> toValueType) {
return getInstance().convertValue(fromValue, toValueType);
}
/**
* 使用这个覆盖更多类型配置效率一点些但是精度更高
*
* @param fromValue
* @param toValueType
* @param <T>
* @return
*/
public static <T> T convertValueFull(Object fromValue, Class<T> toValueType) {
return getInstance().convertValue(fromValue, toValueType);
}
private static final ObjectMapper INSTANCE = new NormalJacksonObjectMapper();
private static final ObjectMapper FAST_INSTANCE = new FastObjectMapper();
public static ObjectMapper getInstance() {
return INSTANCE;
}
public static ObjectMapper getFastInstance() {
return FAST_INSTANCE;
}
/**
* 使用表达式获取值
* String city = getValue2(jsonString, "person.address.city2", String.class);
*
* @param jsonString JSON字符串
* @param expression 表达式
* @param targetType 目标类型
* @return {@link T}
*/
public static <T> T getJsonValue(String jsonString, String expression, Class<T> targetType) {
JSONObject jsonObject = JSONUtil.parseObj(jsonString);
Object result = jsonObject.getByPath(expression);
return targetType.cast(result);
}
/**
* 一般的配置
*
* @author YuanFeng
* @date 2022/11/21
*/
private static class NormalJacksonObjectMapper extends ObjectMapper implements Serializable {
public NormalJacksonObjectMapper(ObjectMapper src) {
super(src);
}
public NormalJacksonObjectMapper() {
//序列化BigDecimal时之间输出原始数字还是科学计数, 默认false, 即是否以toPlainString()科学计数方式来输出
disable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
//允许将JSON空字符串强制转换为null对象值
enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
//允许单个数值当做数组处理
enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
//禁止重复键, 抛出异常
enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
//禁止使用int代表Enum的order()來反序列化Enum, 抛出异常
enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS);
//有属性不能映射的时候不报错
disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
//使用null表示集合类型字段是时不抛异常
disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES);
//对象为空时不抛异常
disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
//允许在JSON中使用c/c++风格注释
enable(JsonParser.Feature.ALLOW_COMMENTS);
//强制转义非ascii字符
disable(JsonGenerator.Feature.ESCAPE_NON_ASCII);
//允许未知字段
enable(JsonGenerator.Feature.IGNORE_UNKNOWN);
//在JSON中允许未引用的字段名
enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
//时间格式
disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//识别单引号
enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES);
// 配置 ObjectMapper
setSerializationInclusion(JsonInclude.Include.NON_NULL); // NULL不参与序列化
// 设置时区为默认系统时区
setTimeZone(TimeZone.getDefault()); // 默认时区
}
}
/**
* 快速对象映射器 不做复杂的序列化配置
*
* @author YuanFeng
* @date 2022/11/26
*/
private static class FastObjectMapper extends ObjectMapper implements Serializable {
public FastObjectMapper(ObjectMapper src) {
super(src);
}
public FastObjectMapper() {
//序列化BigDecimal时之间输出原始数字还是科学计数, 默认false,不以toPlainString()科学计数方式来输出
disable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
//允许将JSON空字符串强制转换为null对象值
enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
//允许单个数值当做数组处理
enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
//禁止重复键, 抛出异常
enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
//禁止使用int代表Enum的order()來反序列化Enum, 抛出异常
enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS);
//有属性不能映射的时候不报错
disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
//使用null表示集合类型字段是时不抛异常
disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES);
//对象为空时不抛异常
disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
//允许未知字段
enable(JsonGenerator.Feature.IGNORE_UNKNOWN);
//在JSON中允许未引用的字段名
enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
}
}
}

View File

@ -0,0 +1,118 @@
package cn.hangtag.framework.common.util;
import cn.hutool.core.bean.BeanUtil;
import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Function;
/**
* 安全使用值
*
* @author YuanFeng
* @date 2024/5/16
*/
public class SafeUseUtil extends BeanUtil {
// 缓存结果的 Map
private static final Map<Object, Object> cache = new HashMap<>();
private static final int CACHE_LIMIT = 1000; // 设置缓存大小限制
/**
* Optional 的简单版
* 安全使用值 对象中能取值则使用对象的值否则返回默认值
*
* @param obj obj
* @param extractor 提取器
* @return {@link R }
*/
public static <T, R> R use(T obj, Function<T, R> extractor) {
return use(obj, extractor, null);
}
/**
* 安全使用值 对象中能取值则使用对象的值否则返回默认值
*
* @param obj obj
* @param extractor 提取器
* @param defaultValue 默认值
* @return {@link R }
*/
public static <T, R> R use(T obj, Function<T, R> extractor, R defaultValue) {
if (obj == null) return defaultValue;
// 使用简单键例如 obj 的哈希值
Object key = generateCacheKey(obj, extractor,defaultValue);
if (cache.containsKey(key)) {
return (R) cache.get(key); // 从缓存中获取结果
}
R result = defaultValue;
try {
result = extractor.apply(obj);
} catch (Exception e) {
e.printStackTrace();
}
putCacheKey(key, result);
return result;
}
private static <R> void putCacheKey(Object key, R result) {
if (cache.size() >= CACHE_LIMIT) {
// 进行简单的缓存清理
cache.clear();
}
cache.put(key, result); // 缓存结果
}
/**
* 安全使用值 对象不为空 能取值并且不为空时 使用对象的中值
*
* @param obj obj
* @param extractor 提取器
* @param defaultValue 默认值
* @return {@link R }
*/
public static <T, R> R useNotEmpty(T obj, Function<T, R> extractor, R defaultValue) {
if (isEmpty(obj)) return defaultValue;
R result = use(obj, extractor, defaultValue);
if (!isEmpty(result)) {
return result;
}
return defaultValue; // 如果结果为空返回默认值
}
public static boolean isEmpty(final Object object) {
if (object == null) return true;
if (object instanceof Collection) {
return ((Collection<?>) object).isEmpty();
} else if (object instanceof Map) {
return ((Map<?,?>) object).isEmpty();
} else if (object instanceof CharSequence) {
return ((CharSequence) object).length() == 0;
} else if (object.getClass().isArray()) {
return Array.getLength(object) == 0;
}
return false;
}
// 生成缓存键
private static Object generateCacheKey(Object obj, Function<?, ?> extractor,Object val) {
return Objects.hash(obj, extractor, val);
}
// public static void main(String[] args) {
// User2 user2 = new User2();
//
// user2.setName("yuanfeng");
// Dept2 dept3 = new Dept2();
// dept3.setName("parent");
// Dept2 dept2 = new Dept2();
// dept2.setParent(dept3);
// dept2.setName("dept");
// user2.setDept(dept2);
// String name = use(use(use(user2, User2::getDept), Dept2::getParent),Dept2::getName);
//
// System.out.println(name);
// }
}

View File

@ -7,11 +7,13 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.hangtag.framework.common.enums.DateIntervalEnum;
import java.sql.Timestamp;
import java.time.*;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@ -306,4 +308,10 @@ public class LocalDateTimeUtils {
}
}
public static Date toDate(LocalDateTime localDateTime){
Timestamp timestamp = Timestamp.valueOf(localDateTime); // 直接转换为 Timestamp
Date date = new Date(timestamp.getTime()); // 使用 Timestamp 的时间戳构造 Date
return date;
}
}

View File

@ -10,6 +10,7 @@ import lombok.SneakyThrows;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.HashSet;
/**
* 文件工具类
@ -18,6 +19,49 @@ import java.io.File;
*/
public class FileUtils {
public static final HashSet<String> SUFFIXS = new HashSet<String>() {{
// 常用的图片文件类型
add("jpg");
add("jpeg");
add("png");
add("gif");
add("bmp");
add("tiff");
add("webp");
add("ico");
add("svg");
// 常用的文档文件类型
add("pdf");
add("doc");
add("docx");
add("xls");
add("xlsx");
add("ppt");
add("pptx");
add("txt");
add("rtf");
// 常用的视频文件类型
add("mp4");
add("avi");
add("mov");
add("wmv");
add("flv");
add("mkv");
// 常用的音频文件类型
add("mp3");
add("wav");
add("ogg");
add("aac");
// 压缩文件类型
add("zip");
add("rar");
add("7z");
}};
/**
* 创建临时文件
* 该文件会在 JVM 退出时进行删除

View File

@ -199,4 +199,23 @@ public class JsonUtils {
return JSONUtil.isTypeJSON(text);
}
public static <T> String toJson(T value) {
try {
return objectMapper.writeValueAsString(value);
} catch (Exception var2) {
log.error(var2.getMessage(), var2);
return null;
}
}
public static <T> String toJson(T value,String defaultValue) {
if(value == null){
return defaultValue;
}
try {
return objectMapper.writeValueAsString(value);
} catch (Exception var2) {
return defaultValue;
}
}
}

View File

@ -0,0 +1,50 @@
package cn.hangtag.framework.common.util.validation;
import cn.hangtag.framework.common.exception.ErrorCode;
import cn.hangtag.framework.common.exception.ServiceException;
import cn.hangtag.framework.common.util.FuncUtil;
import org.springframework.util.Assert;
/**
* 断言实用程序
*
* @author YuanFeng
* @date 2024/09/23
*/
public class AssertUtil {
public static void isEmpty(Object field, String errorMessage) {
if (FuncUtil.isEmpty(field)) {
throw new ServiceException(600, errorMessage);
}
}
public static void isTrue(boolean b, String errorMessage) {
if (b) {
throw new ServiceException(600, errorMessage);
}
}
public static void isFalse(boolean b, String errorMessage) {
if (!b) {
throw new ServiceException(600, errorMessage);
}
}
public static void isEmpty(Object field, ErrorCode errorCode) {
if (FuncUtil.isEmpty(field)) {
throw new ServiceException(errorCode);
}
}
public static void isNull(Object field, String errorMessage) {
if (field == null) {
throw new ServiceException(600,errorMessage);
}
}
public static void isNull(Object field, ErrorCode errorCode) {
if (field == null){
throw new ServiceException(errorCode);
}
}
}

View File

@ -24,11 +24,20 @@ public class ValidationUtils {
private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*");
private static final Pattern PATTERN_EMAIL = Pattern.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
public static boolean isMobile(String mobile) {
return StringUtils.hasText(mobile)
&& PATTERN_MOBILE.matcher(mobile).matches();
}
public static boolean isEmail(String email) {
return StringUtils.hasText(email)
&& PATTERN_EMAIL.matcher(email).matches();
}
public static boolean isURL(String url) {
return StringUtils.hasText(url)
&& PATTERN_URL.matcher(url).matches();

View File

@ -0,0 +1,28 @@
package cn.hangtag.framework.common.validation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({
ElementType.METHOD,
ElementType.FIELD,
ElementType.ANNOTATION_TYPE,
ElementType.CONSTRUCTOR,
ElementType.PARAMETER,
ElementType.TYPE_USE
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
validatedBy = EmailValidator.class
)
public @interface Email {
String message() default "邮箱格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

View File

@ -0,0 +1,25 @@
package cn.hangtag.framework.common.validation;
import cn.hangtag.framework.common.util.validation.ValidationUtils;
import cn.hutool.core.util.StrUtil;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class EmailValidator implements ConstraintValidator<Email, String> {
@Override
public void initialize(Email annotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 如果手机号为空默认不校验即校验通过
if (StrUtil.isEmpty(value)) {
return true;
}
// 校验手机
return ValidationUtils.isEmail(value);
}
}

View File

@ -1,3 +0,0 @@
artifactId=hangtag-common
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

@ -1,49 +0,0 @@
cn\hangtag\framework\common\core\KeyValue.class
cn\hangtag\framework\common\exception\ErrorCode.class
cn\hangtag\framework\common\validation\MobileValidator.class
cn\hangtag\framework\common\enums\TerminalEnum.class
cn\hangtag\framework\common\util\date\DateUtils.class
cn\hangtag\framework\common\util\validation\ValidationUtils.class
cn\hangtag\framework\common\validation\Mobile.class
cn\hangtag\framework\common\enums\DocumentEnum.class
cn\hangtag\framework\common\util\json\JsonUtils.class
cn\hangtag\framework\common\util\number\MoneyUtils.class
cn\hangtag\framework\common\exception\util\ServiceExceptionUtil.class
cn\hangtag\framework\common\util\servlet\ServletUtils.class
cn\hangtag\framework\common\util\collection\MapUtils.class
cn\hangtag\framework\common\util\io\FileUtils.class
cn\hangtag\framework\common\exception\enums\ServiceErrorCodeRange.class
cn\hangtag\framework\common\validation\InEnumCollectionValidator.class
cn\hangtag\framework\common\validation\InEnum.class
cn\hangtag\framework\common\exception\enums\GlobalErrorCodeConstants.class
cn\hangtag\framework\common\util\cache\CacheUtils.class
cn\hangtag\framework\common\pojo\PageParam.class
cn\hangtag\framework\common\util\collection\CollectionUtils.class
cn\hangtag\framework\common\util\spring\SpringExpressionUtils.class
cn\hangtag\framework\common\validation\InEnumValidator.class
cn\hangtag\framework\common\util\number\NumberUtils.class
cn\hangtag\framework\common\pojo\PageResult.class
cn\hangtag\framework\common\util\date\LocalDateTimeUtils.class
cn\hangtag\framework\common\util\io\IoUtils.class
cn\hangtag\framework\common\util\spring\SpringUtils.class
cn\hangtag\framework\common\util\collection\ArrayUtils.class
cn\hangtag\framework\common\pojo\CommonResult.class
cn\hangtag\framework\common\util\http\HttpUtils.class
cn\hangtag\framework\common\util\date\LocalDateTimeUtils$1.class
cn\hangtag\framework\common\enums\WebFilterOrderEnum.class
cn\hangtag\framework\common\exception\ServiceException.class
cn\hangtag\framework\common\util\object\PageUtils.class
cn\hangtag\framework\common\validation\Telephone.class
cn\hangtag\framework\common\util\collection\SetUtils.class
cn\hangtag\framework\common\enums\UserTypeEnum.class
cn\hangtag\framework\common\core\IntArrayValuable.class
cn\hangtag\framework\common\pojo\SortingField.class
cn\hangtag\framework\common\pojo\SortablePageParam.class
cn\hangtag\framework\common\util\object\ObjectUtils.class
cn\hangtag\framework\common\util\object\BeanUtils.class
cn\hangtag\framework\common\util\string\StrUtils.class
cn\hangtag\framework\common\exception\ServerException.class
cn\hangtag\framework\common\validation\TelephoneValidator.class
cn\hangtag\framework\common\enums\DateIntervalEnum.class
cn\hangtag\framework\common\util\monitor\TracerUtils.class
cn\hangtag\framework\common\enums\CommonStatusEnum.class

View File

@ -1,51 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\number\MoneyUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\core\IntArrayValuable.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\PageParam.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\util\ServiceExceptionUtil.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\Telephone.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\spring\SpringExpressionUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\CommonStatusEnum.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\InEnum.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\ServerException.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\SortablePageParam.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\DateIntervalEnum.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\string\StrUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\validation\ValidationUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\MobileValidator.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\number\NumberUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\json\JsonUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\InEnumCollectionValidator.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\InEnumValidator.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\monitor\TracerUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\enums\GlobalErrorCodeConstants.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\object\ObjectUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\collection\CollectionUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\PageResult.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\enums\ServiceErrorCodeRange.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\date\LocalDateTimeUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\object\PageUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\UserTypeEnum.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\object\BeanUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\spring\SpringUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\io\IoUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\collection\SetUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\core\KeyValue.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\TelephoneValidator.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\servlet\ServletUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\TerminalEnum.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\SortingField.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\date\DateUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\WebFilterOrderEnum.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\http\HttpUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\ServiceException.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\collection\MapUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\collection\ArrayUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\DocumentEnum.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\cache\CacheUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\CommonResult.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\io\FileUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\ErrorCode.java
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\Mobile.java

View File

@ -1,2 +0,0 @@
cn\hangtag\framework\common\util\collection\CollectionUtilsTest.class
cn\hangtag\framework\common\util\collection\CollectionUtilsTest$Dog.class

View File

@ -1 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\test\java\cn\hangtag\framework\common\util\collection\CollectionUtilsTest.java

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -123,6 +123,7 @@ public class DeptDataPermissionRule implements DataPermissionRule {
return new EqualsTo(null, null); // WHERE null = null可以保证返回的数据为空
}
if(true) return null;
// 情况三拼接 Dept User 的条件最后组合
Expression deptExpression = buildDeptExpression(tableName,tableAlias, deptDataPermission.getDeptIds());
Expression userExpression = buildUserExpression(tableName, tableAlias, deptDataPermission.getSelf(), loginUser.getId());

View File

@ -1,2 +0,0 @@
cn.hangtag.framework.datapermission.config.HangtagDataPermissionAutoConfiguration
cn.hangtag.framework.datapermission.config.HangtagDeptDataPermissionAutoConfiguration

View File

@ -1,3 +0,0 @@
artifactId=hangtag-spring-boot-starter-biz-data-permission
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

@ -1,15 +0,0 @@
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactory.class
cn\hangtag\framework\datapermission\core\util\DataPermissionUtils.class
cn\hangtag\framework\datapermission\core\rule\DataPermissionRule.class
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptor.class
cn\hangtag\framework\datapermission\core\aop\DataPermissionContextHolder.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptor.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptor$ContextHolder.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptor$MappedStatementCache.class
cn\hangtag\framework\datapermission\config\HangtagDeptDataPermissionAutoConfiguration.class
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImpl.class
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationAdvisor.class
cn\hangtag\framework\datapermission\config\HangtagDataPermissionAutoConfiguration.class
cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRule.class
cn\hangtag\framework\datapermission\core\annotation\DataPermission.class
cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRuleCustomizer.class

View File

@ -1,15 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImpl.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRule.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\config\HangtagDataPermissionAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRuleCustomizer.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\DataPermissionRule.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\util\DataPermissionUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\annotation\DataPermission.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionContextHolder.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactory.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationAdvisor.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\config\HangtagDeptDataPermissionAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptor.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptor.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\dept\package-info.java

View File

@ -1,21 +0,0 @@
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass05.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2$1.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2$2.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2.class
cn\hangtag\framework\datapermission\core\util\DataPermissionUtilsTest.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest$DeptDataPermissionRule.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest$EmptyDataPermissionRule.class
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest$TestClass.class
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass06.class
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest$TestNone.class
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$DataPermissionRule01.class
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest.class
cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRuleTest.class
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest$TestMethod.class
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest.class
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$DataPermissionRule02.class
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass04.class
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass03.class
cn\hangtag\framework\datapermission\core\aop\DataPermissionContextHolderTest.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest.class
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest$1.class

View File

@ -1,7 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionContextHolderTest.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\util\DataPermissionUtilsTest.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRuleTest.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest.java

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -1,3 +0,0 @@
artifactId=hangtag-spring-boot-starter-biz-ip
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

@ -1,4 +0,0 @@
cn\hangtag\framework\ip\core\enums\AreaTypeEnum.class
cn\hangtag\framework\ip\core\utils\IPUtils.class
cn\hangtag\framework\ip\core\Area.class
cn\hangtag\framework\ip\core\utils\AreaUtils.class

View File

@ -1,5 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\core\utils\IPUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\core\Area.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\core\utils\AreaUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\core\enums\AreaTypeEnum.java

View File

@ -1,2 +0,0 @@
cn\hangtag\framework\ip\core\utils\AreaUtilsTest.class
cn\hangtag\framework\ip\core\utils\IPUtilsTest.class

View File

@ -1,2 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\test\java\cn\hangtag\framework\ip\core\utils\AreaUtilsTest.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\test\java\cn\hangtag\framework\ip\core\utils\IPUtilsTest.java

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -74,7 +74,7 @@ public class TenantSecurityWebFilter extends ApiRequestFilter {
}
// 如果非允许忽略租户的 URL则校验租户是否合法
if (!isIgnoreUrl(request)) {
if (false) {
// 2. 如果请求未带租户的编号不允许访问
if (tenantId == null) {
log.error("[doFilterInternal][URL({}/{}) 未传递租户编号]", request.getRequestURI(), request.getMethod());

View File

@ -1,30 +0,0 @@
{
"groups": [
{
"name": "hangtag.tenant",
"type": "cn.hangtag.framework.tenant.config.TenantProperties",
"sourceType": "cn.hangtag.framework.tenant.config.TenantProperties"
}
],
"properties": [
{
"name": "hangtag.tenant.enable",
"type": "java.lang.Boolean",
"description": "是否开启",
"sourceType": "cn.hangtag.framework.tenant.config.TenantProperties"
},
{
"name": "hangtag.tenant.ignore-tables",
"type": "java.util.Set<java.lang.String>",
"description": "需要忽略多租户的表 即默认所有表都开启多租户的功能,所以记得添加对应的 tenant_id 字段哟",
"sourceType": "cn.hangtag.framework.tenant.config.TenantProperties"
},
{
"name": "hangtag.tenant.ignore-urls",
"type": "java.util.Set<java.lang.String>",
"description": "需要忽略多租户的请求 默认情况下,每个请求需要带上 tenant-id 的请求头。但是,部分请求是无需带上的,例如说短信回调、支付回调等 Open API",
"sourceType": "cn.hangtag.framework.tenant.config.TenantProperties"
}
],
"hints": []
}

View File

@ -1,2 +0,0 @@
org.springframework.boot.env.EnvironmentPostProcessor=\
cn.hangtag.framework.tenant.core.mq.kafka.TenantKafkaEnvironmentPostProcessor

View File

@ -1,3 +0,0 @@
artifactId=hangtag-spring-boot-starter-biz-tenant
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

@ -1,28 +0,0 @@
cn\hangtag\framework\tenant\core\mq\kafka\TenantKafkaEnvironmentPostProcessor.class
cn\hangtag\framework\tenant\core\service\TenantFrameworkService.class
cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQInitializer.class
cn\hangtag\framework\tenant\core\job\TenantJobAspect.class
cn\hangtag\framework\tenant\core\service\TenantFrameworkServiceImpl$1.class
META-INF\spring-configuration-metadata.json
cn\hangtag\framework\tenant\config\HangtagTenantAutoConfiguration.class
cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQSendMessageHook.class
org\springframework\messaging\handler\invocation\InvocableHandlerMethod.class
cn\hangtag\framework\tenant\core\db\TenantBaseDO.class
cn\hangtag\framework\tenant\core\job\TenantJob.class
cn\hangtag\framework\tenant\core\util\TenantUtils.class
cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQConsumeMessageHook.class
cn\hangtag\framework\tenant\core\db\TenantDatabaseInterceptor.class
cn\hangtag\framework\tenant\core\redis\TenantRedisCacheManager.class
cn\hangtag\framework\tenant\core\aop\TenantIgnoreAspect.class
cn\hangtag\framework\tenant\core\service\TenantFrameworkServiceImpl$2.class
cn\hangtag\framework\tenant\core\mq\rabbitmq\TenantRabbitMQInitializer.class
cn\hangtag\framework\tenant\core\service\TenantFrameworkServiceImpl.class
cn\hangtag\framework\tenant\core\mq\rabbitmq\TenantRabbitMQMessagePostProcessor.class
cn\hangtag\framework\tenant\core\aop\TenantIgnore.class
cn\hangtag\framework\tenant\core\web\TenantContextWebFilter.class
cn\hangtag\framework\tenant\core\context\TenantContextHolder.class
org\springframework\messaging\handler\invocation\InvocableHandlerMethod$AsyncResultMethodParameter.class
cn\hangtag\framework\tenant\core\mq\redis\TenantRedisMessageInterceptor.class
cn\hangtag\framework\tenant\core\security\TenantSecurityWebFilter.class
cn\hangtag\framework\tenant\config\TenantProperties.class
cn\hangtag\framework\tenant\core\mq\kafka\TenantKafkaProducerInterceptor.class

View File

@ -1,25 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\security\TenantSecurityWebFilter.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\org\springframework\messaging\handler\invocation\InvocableHandlerMethod.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\service\TenantFrameworkService.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\kafka\TenantKafkaProducerInterceptor.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\context\TenantContextHolder.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\service\TenantFrameworkServiceImpl.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\job\TenantJob.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\job\TenantJobAspect.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQConsumeMessageHook.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQSendMessageHook.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\redis\TenantRedisCacheManager.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\db\TenantBaseDO.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rabbitmq\TenantRabbitMQMessagePostProcessor.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\util\TenantUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\aop\TenantIgnoreAspect.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\config\HangtagTenantAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\config\TenantProperties.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\db\TenantDatabaseInterceptor.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\kafka\TenantKafkaEnvironmentPostProcessor.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rabbitmq\TenantRabbitMQInitializer.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\redis\TenantRedisMessageInterceptor.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\aop\TenantIgnore.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQInitializer.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\web\TenantContextWebFilter.java

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -1,3 +0,0 @@
artifactId=hangtag-spring-boot-starter-excel
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

@ -1,14 +0,0 @@
cn\hangtag\framework\excel\core\convert\JsonConvert.class
cn\hangtag\framework\dict\config\HangtagDictAutoConfiguration.class
cn\hangtag\framework\excel\core\convert\AreaConvert.class
cn\hangtag\framework\dict\core\DictFrameworkUtils$1.class
cn\hangtag\framework\excel\core\handler\SelectSheetWriteHandler.class
cn\hangtag\framework\excel\core\annotations\DictFormat.class
cn\hangtag\framework\excel\core\convert\MoneyConvert.class
cn\hangtag\framework\excel\core\annotations\ExcelColumnSelect.class
cn\hangtag\framework\dict\core\DictFrameworkUtils$3.class
cn\hangtag\framework\excel\core\function\ExcelColumnSelectFunction.class
cn\hangtag\framework\dict\core\DictFrameworkUtils$2.class
cn\hangtag\framework\excel\core\convert\DictConvert.class
cn\hangtag\framework\dict\core\DictFrameworkUtils.class
cn\hangtag\framework\excel\core\util\ExcelUtils.class

View File

@ -1,13 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\convert\MoneyConvert.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\dict\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\annotations\ExcelColumnSelect.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\dict\core\DictFrameworkUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\dict\config\HangtagDictAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\util\ExcelUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\annotations\DictFormat.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\function\ExcelColumnSelectFunction.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\convert\JsonConvert.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\handler\SelectSheetWriteHandler.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\convert\DictConvert.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\convert\AreaConvert.java

View File

@ -1 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\test\java\cn\hangtag\framework\dict\core\util\DictFrameworkUtilsTest.java

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -1,2 +0,0 @@
cn.hangtag.framework.quartz.config.HangtagQuartzAutoConfiguration
cn.hangtag.framework.quartz.config.HangtagAsyncAutoConfiguration

View File

@ -1,3 +0,0 @@
artifactId=hangtag-spring-boot-starter-job
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

@ -1,9 +0,0 @@
cn\hangtag\framework\quartz\core\enums\JobDataKeyEnum.class
cn\hangtag\framework\quartz\config\HangtagQuartzAutoConfiguration.class
cn\hangtag\framework\quartz\core\scheduler\SchedulerManager.class
cn\hangtag\framework\quartz\config\HangtagAsyncAutoConfiguration$1.class
cn\hangtag\framework\quartz\core\service\JobLogFrameworkService.class
cn\hangtag\framework\quartz\core\util\CronUtils.class
cn\hangtag\framework\quartz\config\HangtagAsyncAutoConfiguration.class
cn\hangtag\framework\quartz\core\handler\JobHandler.class
cn\hangtag\framework\quartz\core\handler\JobHandlerInvoker.class

View File

@ -1,9 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\handler\JobHandler.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\handler\JobHandlerInvoker.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\scheduler\SchedulerManager.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\enums\JobDataKeyEnum.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\config\HangtagAsyncAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\util\CronUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\service\JobLogFrameworkService.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\config\HangtagQuartzAutoConfiguration.java

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -1,11 +0,0 @@
{
"groups": [
{
"name": "hangtag.tracer",
"type": "cn.hangtag.framework.tracer.config.TracerProperties",
"sourceType": "cn.hangtag.framework.tracer.config.TracerProperties"
}
],
"properties": [],
"hints": []
}

View File

@ -1,2 +0,0 @@
cn.hangtag.framework.tracer.config.HangtagTracerAutoConfiguration
cn.hangtag.framework.tracer.config.HangtagMetricsAutoConfiguration

View File

@ -1,3 +0,0 @@
artifactId=hangtag-spring-boot-starter-monitor
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

@ -1,8 +0,0 @@
cn\hangtag\framework\tracer\core\filter\TraceFilter.class
cn\hangtag\framework\tracer\config\HangtagTracerAutoConfiguration.class
cn\hangtag\framework\tracer\core\util\TracerFrameworkUtils.class
cn\hangtag\framework\tracer\config\TracerProperties.class
cn\hangtag\framework\tracer\config\HangtagMetricsAutoConfiguration.class
cn\hangtag\framework\tracer\core\aop\BizTraceAspect.class
META-INF\spring-configuration-metadata.json
cn\hangtag\framework\tracer\core\annotation\BizTrace.class

View File

@ -1,8 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\core\aop\BizTraceAspect.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\core\filter\TraceFilter.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\config\HangtagTracerAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\config\HangtagMetricsAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\config\TracerProperties.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\core\util\TracerFrameworkUtils.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\core\annotation\BizTrace.java

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -1,3 +0,0 @@
cn.hangtag.framework.mq.redis.config.HangtagRedisMQProducerAutoConfiguration
cn.hangtag.framework.mq.redis.config.HangtagRedisMQConsumerAutoConfiguration
cn.hangtag.framework.mq.rabbitmq.config.HangtagRabbitMQAutoConfiguration

View File

@ -1,3 +0,0 @@
artifactId=hangtag-spring-boot-starter-mq
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

@ -1,11 +0,0 @@
cn\hangtag\framework\mq\redis\core\RedisMQTemplate.class
cn\hangtag\framework\mq\redis\core\pubsub\AbstractRedisChannelMessageListener.class
cn\hangtag\framework\mq\redis\core\stream\AbstractRedisStreamMessage.class
cn\hangtag\framework\mq\redis\config\HangtagRedisMQProducerAutoConfiguration.class
cn\hangtag\framework\mq\rabbitmq\config\HangtagRabbitMQAutoConfiguration.class
cn\hangtag\framework\mq\redis\core\interceptor\RedisMessageInterceptor.class
cn\hangtag\framework\mq\redis\core\pubsub\AbstractRedisChannelMessage.class
cn\hangtag\framework\mq\redis\core\stream\AbstractRedisStreamMessageListener.class
cn\hangtag\framework\mq\redis\config\HangtagRedisMQConsumerAutoConfiguration.class
cn\hangtag\framework\mq\redis\core\job\RedisPendingMessageResendJob.class
cn\hangtag\framework\mq\redis\core\message\AbstractRedisMessage.class

View File

@ -1,15 +0,0 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\stream\AbstractRedisStreamMessage.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\stream\AbstractRedisStreamMessageListener.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\interceptor\RedisMessageInterceptor.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\RedisMQTemplate.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\pubsub\AbstractRedisChannelMessageListener.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\job\RedisPendingMessageResendJob.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\rabbitmq\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\rabbitmq\config\HangtagRabbitMQAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\rabbitmq\core\package-info.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\pubsub\AbstractRedisChannelMessage.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\config\HangtagRedisMQConsumerAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\config\HangtagRedisMQProducerAutoConfiguration.java
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\message\AbstractRedisMessage.java

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>

View File

@ -0,0 +1,23 @@
package cn.hangtag.framework.mybatis.build;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import lombok.Data;
import java.io.Serializable;
@Data
public class FilterItem implements Serializable {
/**
* 类型 = > >= < <= != in notIn like likeLef likeRight handler
* {@link QueryFilterTypeEnum}
*/
private String type = QueryFilterTypeEnum.EQ.getValue();
/**
* 条件为 或关系
*/
private boolean or;
}

View File

@ -0,0 +1,85 @@
package cn.hangtag.framework.mybatis.build;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import lombok.Data;
import java.io.Serializable;
import java.util.*;
/**
* 过滤条件配置
*
* @author YuanFeng
*/
@Data
public class FilterItemConfig implements Serializable {
// 排序字段 多个使用逗号分隔 name asc,createTime desc
private String orderBy = ""; // 排序规则 name,createTime desc 这个默认使用 asc
private String groupBy = ""; // 分组 name,createTime desc 这个默认使用 asc
private Set<String> ignoreFields = new HashSet<>(); // 忽略字段 多个使用逗号分隔 : userName,age
private String dateFields = ""; //声明哪些是 日期字段 避免搜索错误 多个使用逗号分隔 createTime,updateTime
private String defaultFilterType = QueryFilterTypeEnum.EQ.getValue();
// 关键字搜索值多个使用空格间隔 查询条件 where (name like %% or name or like %%) or (code like %% or code or like %%)
private String keywordSearch; // 关键字搜索值多个使用空格间隔
private String keywordFields; // 关键字段多个使用逗号 name,code
private String easyOption = ""; // 简单配置 多个使用逗号号间隔; name@like,age@> 条件 where like '%?%' and age > ?
private Map<String, FilterItem> options; // 条件过滤配置
public Set<String> getIgnoreFieldsKeys() {
if(ignoreFields == null){
ignoreFields = new HashSet<>();
}
return ignoreFields;
}
public void setIgnoreFields(String config) {
if(QueryConfigUtils.isNotEmpty(config)){
List<String> strList = QueryConfigUtils.toStrList(config);
getIgnoreFieldsKeys().addAll(strList);
}
}
public String getIgnoreFields(){
if(getIgnoreFieldsKeys().isEmpty()){
return "";
}
return String.join(QueryConfigUtils.SPLIT_CHAR, getIgnoreFieldsKeys());
}
public Map<String, FilterItem> getOptions() {
if(options == null){
options = new HashMap<>();
}
return options;
}
// @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; name@like,age@> 条件 where like '%?%' and age > ?
public void setEasyOption(String options){
if (QueryConfigUtils.isNotEmpty(options)) {
String[] split = options.split(QueryConfigUtils.SPLIT_CHAR);
for (String s : split) {
if(QueryConfigUtils.isNotEmpty(s.trim())){
String[] split1 = s.trim().split(QueryConfigUtils.SPLIT_CONDITIONS);
FilterItem item = new FilterItem();
// 简单模式设置条件为都为 and 模式
item.setOr(false);
item.setType(getDefaultFilterType());
if(split1.length == 2){
// 获取条件类型
QueryFilterTypeEnum byValue = QueryFilterTypeEnum.getByValue(split1[1]);
if(byValue != null){
item.setType(byValue.getValue());
}
}
if(QueryConfigUtils.isEmpty(getOptions().get(split1[0].trim()))){
//没有配置时候才将 简单条件添加到配置中
getOptions().put(split1[0].trim(), item);
}
}
}
}
}
}

View File

@ -0,0 +1,105 @@
package cn.hangtag.framework.mybatis.build;
import java.util.*;
/**
* 高性能有序Map
*
* @author YuanFeng
* @date 2020/9/14
*/
public class HighPerformanceOrderedMap<K, V> extends AbstractMap<K, V> {
private final Map<K, V> map; // 存储数据的 HashMap
private final List<K> order; // 维护插入顺序的 List
// 构造函数
public HighPerformanceOrderedMap() {
this.map = new HashMap<>();
this.order = new ArrayList<>();
}
@Override
public Set<Entry<K, V>> entrySet() {
Set<Entry<K, V>> entrySet = new LinkedHashSet<>();
for (K key : order) {
entrySet.add(new SimpleEntry<>(key, map.get(key)));
}
return entrySet;
}
/**
* 移除第一
*
* @return {@link K }
*/
public K removeFirst(){
if(!isEmpty()){
K k = this.order.get(0);
remove(k);
return k;
}
return null;
}
public List<K> keyList(){
return order;
}
@Override
public Set<K> keySet(){
return new LinkedHashSet<>(order);
}
@Override
public List<V> values(){
return new ArrayList<>(map.values());
}
@Override
public V put(K key, V value) {
if (!map.containsKey(key)) {
order.add(key); // 只在新插入时添加顺序
}
return map.put(key, value);
}
@Override
public V get(Object key) {
return map.get(key);
}
@Override
public V remove(Object key) {
if (map.containsKey(key)) {
order.remove(key); // 移除顺序中的键
}
return map.remove(key);
}
@Override
public boolean containsKey(Object key) {
return map.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return map.containsValue(value);
}
@Override
public int size() {
return map.size();
}
@Override
public void clear() {
map.clear();
order.clear();
}
// 打印所有键值对
public void printEntries() {
for (K key : order) {
System.out.println(key + ": " + map.get(key));
}
}
}

View File

@ -0,0 +1,446 @@
package cn.hangtag.framework.mybatis.build;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.lang.reflect.Field;
import java.util.*;
/**
* mybatisPlus 查询条件构建工具
*
* @author YuanFeng
* @date 2023/5/14
*/
public class MybatisPlusUtil {
public static String[] defaultIgnoreFilters = {"pageNo", "pageSize", "PAGE_NO", "PAGE_SIZE", "PAGE_SIZE_NONE"};
/**
* 弱类型 生成非空值查询 指定转成的实体类型
*
* @param entity 实体
* @param clazz clazz 返回QueryWrapper泛型的类型
* @param ignoreField ignore字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> buildQueryFor(Object entity,
Class<T> clazz,
String... ignoreField) {
return buildQueryFor(null, entity, QueryFilterTypeEnum.EQ, clazz, ignoreField);
}
/**
* 弱类型 生成非空值查询 指定转成的实体类型
*
* @param conditions 条件 @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; name@like,age@> 条件 where like '%?%' and age > ?
* @param entity 实体
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
* @param clazz clazz 返回QueryWrapper泛型的类型
* @param ignoreField ignore字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> buildQueryFor(String conditions,
Object entity,
QueryFilterTypeEnum typeEnum,
Class<T> clazz,
String... ignoreField) {
QueryFilterInfo queryFilterInfo = toFilter(conditions, entity, typeEnum, ignoreField);
return parseQuery(queryFilterInfo, true, ignoreField);
}
/**
* 弱类型 实体转成查询条件
* 实体可能是vo 但是查询 Db实体的时候使用
*
* @param conditions 条件 @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; name@like,age@> 条件 where like '%?%' and age > ?
* @param entity 实体
* @param clazz clazz 返回QueryWrapper泛型的类型
* @param ignoreField ignore字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> buildQueryFor(String conditions,
Object entity,
Class<T> clazz,
String... ignoreField) {
return buildQueryFor(conditions, entity, QueryFilterTypeEnum.EQ, clazz, ignoreField);
}
/**
* 弱类型 实体转成查询条件
* 实体可能是vo 但是查询 Db 实体的时候使用
*
* @param entity 实体
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
* @param clazz clazz 返回QueryWrapper泛型的类型
* @param ignoreField ignore字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> buildQueryFor(Object entity,
QueryFilterTypeEnum typeEnum,
Class<T> clazz,
String... ignoreField) {
return buildQueryFor(null, entity, typeEnum, clazz, ignoreField);
}
/**
* 实体转成查询条件
*
* @param entity 实体
* @param ignoreField ignore字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> buildQuery(T entity, String... ignoreField) {
return buildQuery(null, entity, QueryFilterTypeEnum.EQ, ignoreField);
}
/**
* 实体转成查询条件
*
* @param conditions 条件
* @param entity 实体
* @param ignoreField ignore字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> buildQuery(String conditions, T entity, String... ignoreField) {
return buildQuery(conditions, entity, QueryFilterTypeEnum.EQ, ignoreField);
}
/**
* 生成非空值查询
*
* @param entity 实体
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
* @param ignoreField ignore字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> buildQuery(T entity, QueryFilterTypeEnum typeEnum, String... ignoreField) {
return buildQuery(null, entity, typeEnum, ignoreField);
}
/**
* 生成非空值查询 根据泛型返回类型
*
* @param conditions 简单条件 @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; name@like,age@> 条件 where like '%?%' and age > ?
* @param entity 实体
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
* @param ignoreField ignore字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> buildQuery(String conditions, T entity, QueryFilterTypeEnum typeEnum, String... ignoreField) {
QueryFilterInfo<T> queryFilterInfo = toFilter(conditions, entity, typeEnum, ignoreField);
QueryWrapper<T> queryWrapper = parseQuery(queryFilterInfo, true, ignoreField);
return queryWrapper;
}
public static <E> QueryFilterInfo<E> toFilter(E entity, QueryFilterTypeEnum typeEnum, String... ignoreField) {
return toFilter(null, entity, typeEnum, ignoreField);
}
/**
* 实体转成 过滤信息对象
*
* @param conditions 条件 name@like,age@>,code@= 简单配置 字段名称@条件
* @param entity 实体
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
* @param ignoreField ignore字段
* @return {@link QueryFilterInfo }<{@link E }>
*/
public static <E> QueryFilterInfo<E> toFilter(String conditions, E entity, QueryFilterTypeEnum typeEnum, String... ignoreField) {
Set<String> ignoreList = new HashSet<>();
if (QueryConfigUtils.isNotEmpty(ignoreField)) {
for (String ignoreColumn : ignoreField) {
// 忽略字段 类中的字段转成下划线命名
ignoreList.add(QueryConfigUtils.humpToLine(ignoreColumn));
}
}
QueryFilterInfo<E> queryFilterInfo = new QueryFilterInfo<E>();
queryFilterInfo.easyOptions(conditions);
queryFilterInfo.setDefaultFilterType(typeEnum);
queryFilterInfo.appendIgnoreFields(ignoreList);
handlerEntityField(entity, queryFilterInfo, QueryConfigUtils.getDeclaredFields(entity.getClass()));
// 处理父类
Class<?> superclass = entity.getClass().getSuperclass();
while (superclass != null) {
handlerEntityField(entity, queryFilterInfo, QueryConfigUtils.getDeclaredFields(superclass));
superclass = superclass.getSuperclass();
}
return queryFilterInfo;
}
/**
* 处理实体字段 字段转成 查询条件
*
* @param entity 实体
* @param queryFilterInfo 查询过滤器信息
* @param declaredFields 声明字段
*/
private static <T> void handlerEntityField(T entity, QueryFilterInfo<T> queryFilterInfo, Field[] declaredFields) {
// 字段过滤条件类型
Map<String, QueryFilterTypeEnum> filterMap = new HashMap<>();
// 取出过滤条件类型
Map<String, FilterItem> options = queryFilterInfo.getOptions();
// 或者关系条件的字段集合
Set<String> orKeys = new HashSet<>();
if (QueryConfigUtils.isNotEmpty(options)) {
Set<String> keySet = options.keySet();
for (String s : keySet) {
FilterItem item = options.get(s);
String type = item.getType();
QueryFilterTypeEnum queryFilterTypeEnum = QueryFilterTypeEnum.getByValue(type);
// 类中的字段转成下划线命名
String field = QueryConfigUtils.humpToLine(s);
if (queryFilterTypeEnum != null) {
filterMap.put(field, queryFilterTypeEnum);
} else {
filterMap.put(field, QueryFilterTypeEnum.getByValue(queryFilterInfo.getDefaultFilterType()));
}
if (item.isOr()) {
orKeys.add(field);
}
}
}
Set<String> ignoreList = queryFilterInfo.getIgnoreFieldsKeys();
for (Field field : declaredFields) {
field.setAccessible(true);
try {
//序列化 字段 属性为空不查询
if (QueryConfigUtils.shouldSkipField(field, ignoreList)) {
queryFilterInfo.appendIgnoreFields(ignoreList);
continue;
}
String column = QueryConfigUtils.humpToLine(field.getName());
//主键 注解TableId
TableId tableId = field.getAnnotation(TableId.class);
if (tableId != null && field.get(entity) != null) {
//主键
if (QueryConfigUtils.isNotEmpty(tableId.value())) {
column = tableId.value();
}
} else {
//数据库中字段名和实体类属性不一致 注解TableField
TableField tableField = field.getAnnotation(TableField.class);
if (tableField != null && !tableField.exist()) {
// @TableField(exist = false) 不是表中内容 不形成查询条件
if (QueryConfigUtils.isNotEmpty(tableField.value())) {
column = tableField.value();
}
ignoreList.add(column);
queryFilterInfo.appendIgnoreFields(ignoreList);
continue;
}
}
// 属性不为null 值在过滤条件中
if (field.get(entity) != null) {
Object inputVal = field.get(entity);
Class<?> type = field.getType();
Object val;
// 是否有指定的过滤条件
QueryFilterTypeEnum filterTypeEnum = filterMap.get(column);
if (filterTypeEnum == null) {
filterTypeEnum = QueryFilterTypeEnum.getByValue(queryFilterInfo.getDefaultFilterType());
}
if (QueryConfigUtils.isArr(inputVal)) {
val = QueryConfigUtils.objToArray(inputVal, Object.class);
} else if (QueryConfigUtils.isList(inputVal)) {
val = QueryConfigUtils.objToArray(inputVal, Object.class);
} else {
val = TypeConverter.convertValue(inputVal, type);
if (val == null) {
// 没有转换成功
val = inputVal.toString();
}
}
queryFilterInfo.build(column, val, filterTypeEnum, orKeys.contains(column));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
/**
* 解析为查询条件
*
* @param queryFilterInfo 查询过滤器信息
* @param isToLine 是否转成 下划线命名
* @param clazz clazz 返回QueryWrapper泛型的类型
* @param ignoreField 忽略字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> parseQuery(QueryFilterInfo queryFilterInfo, boolean isToLine, Class<T> clazz, String... ignoreField) {
QueryWrapper<T> queryWrapper = parseQuery(queryFilterInfo, isToLine, ignoreField);
return queryWrapper;
}
/**
* 解析为查询条件
*
* @param filterInfo 查询过滤器信息
* @param isToLine 是否转成 下划线命名
* @param ignoreField 忽略字段
* @return {@link QueryWrapper }<{@link T }>
*/
public static <T> QueryWrapper<T> parseQuery(QueryFilterInfo<T> filterInfo, boolean isToLine, String... ignoreField) {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
queryWrapper.and((q) -> {
q.eq("1", 1);
});
String keywordFields = filterInfo.getConfig().getKeywordFields();
String keywordSearch = filterInfo.getConfig().getKeywordSearch();
if (QueryConfigUtils.isEmpty(filterInfo)) {
return queryWrapper;
}
Map<String, Object> filter = filterInfo.getFilter();
Map<String, FilterItem> options = filterInfo.getOptions();
String str = filterInfo.getConfig().getOrderBy();
Set<String> ignoreFieldsKeys = filterInfo.getIgnoreFieldsKeys();
if(QueryConfigUtils.isNotEmpty(ignoreField)){
ignoreFieldsKeys.addAll(Arrays.asList(ignoreField));
}
Set<String> ignoreKeys = new HashSet<>();
for (String ignoreFieldsKey : ignoreFieldsKeys) {
ignoreKeys.add(isToLine ? QueryConfigUtils.humpToLine(ignoreFieldsKey) : ignoreFieldsKey);
}
if (QueryConfigUtils.isNotEmpty(str)) {
String[] split = str.split(QueryConfigUtils.SPLIT_CHAR);
for (String s1 : split) {
String[] s2 = s1.split(" ");
String orderField = s2[0];
if (isToLine) {
orderField = QueryConfigUtils.humpToLine(orderField);
}
// 说明字段不存在 或者不参与排序
if (ignoreKeys.contains(orderField)) {
continue;
}
if (s2.length > 1 && "desc".equalsIgnoreCase(QueryConfigUtils.toStr(s2[1],""))) {
queryWrapper.orderByDesc(orderField);
} else {
queryWrapper.orderByAsc(orderField);
}
}
}
// 处理关键字查询
if (QueryConfigUtils.isNotEmpty(keywordSearch) && QueryConfigUtils.isNotEmpty(keywordFields)) {
String finalKeywordSearch = keywordSearch.trim();
if (QueryConfigUtils.isNotEmpty(finalKeywordSearch)) {
String[] split = keywordFields.split(QueryConfigUtils.SPLIT_CHAR);
queryWrapper.and((c) -> {
for (String s : split) {
s = isToLine ? QueryConfigUtils.humpToLine(s) : s;
// 说明字段不存在 或者不参与搜索
if (ignoreKeys.contains(s)) {
continue;
}
// name like '%%' or name like '%%' or name like '%%'
// 多个关键字空格间隔
String[] keyList = finalKeywordSearch.split(" ");
for (String key : keyList) {
c.or();
// 关键字过滤 key
c.like(s, key.trim());
}
c.or();
}
});
}
}
// 条件查询
if (QueryConfigUtils.isNotEmpty(filter)) {
Set<String> keySet = options.keySet();
// 过滤配置
Map<String, FilterItem> filterMap = new HashMap<>();
for (String s : keySet) {
// 处理驼峰字段
filterMap.put(isToLine ? QueryConfigUtils.humpToLine(s) : s, options.get(s));
}
// 日期字段
Set<String> dateSet = new HashSet<>();
String dateFields = filterInfo.getConfig().getDateFields();
if (QueryConfigUtils.isNotEmpty(dateFields)) {
String[] split = dateFields.split(QueryConfigUtils.SPLIT_CHAR);
for (String s : split) {
if (QueryConfigUtils.isNotEmpty(s.trim())) {
dateSet.add(isToLine ? QueryConfigUtils.humpToLine(s.trim()) : s.trim());
}
}
}
// 遍历过滤条件
Set<String> fieldKey = filter.keySet();
for (String objKey : fieldKey) {
// 取出过滤的值
Object value = filter.get(objKey);
if (QueryConfigUtils.skipData(value)) {
// 跳过数据
continue;
}
String field = isToLine ? QueryConfigUtils.humpToLine(objKey) : objKey;
// 说明字段不存在 或者不参与条件查询
if (ignoreKeys.contains(field)) {
continue;
}
FilterItem item = filterMap.get(field);
if (item == null) {
//找不到指定的过滤类型 默认过滤类型
item = new FilterItem();
// 默认过滤类型
item.setType(filterInfo.getDefaultFilterType());
// 判断是否是数组
if (QueryConfigUtils.isArr(value) || QueryConfigUtils.isList(value)) {
item.setType(QueryFilterTypeEnum.BETWEEN.getValue());
}
item.setOr(false);
}
// 判断是否是or
if (item.isOr()) {
queryWrapper.or();
}
QueryFilterTypeEnum byValue = QueryFilterTypeEnum.getByValue(item.getType());
if(byValue == null){
byValue = QueryFilterTypeEnum.EQ;
}
// 条件处理器
queryWrapper = QueryConfigUtils.whereHandler(queryWrapper, byValue, dateSet, field, value);
}
}
// 分组
List<String> strList = QueryConfigUtils.toStrList(filterInfo.getConfig().getGroupBy());
if (QueryConfigUtils.isNotEmpty(strList)) {
List<String> strSet = new ArrayList<>();
for (String s : strList) {
String s1 = isToLine ? QueryConfigUtils.humpToLine(s) : s;
if (ignoreKeys.contains(s1)) {
continue;
}
strSet.add(s1);
}
if (QueryConfigUtils.isNotEmpty(strSet)) {
queryWrapper.groupBy(strSet);
}
}
return queryWrapper;
}
}

View File

@ -0,0 +1,475 @@
package cn.hangtag.framework.mybatis.build;
import cn.hangtag.framework.mybatis.build.enums.DbTypeEnum;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import cn.hangtag.framework.mybatis.build.where.handler.*;
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class QueryConfigUtils {
private static final Map<String, Function<Object, Boolean>> SKIP_HANDLER = new HashMap<>();
public static int MAX_LINE_CACHE = 100000;
/**
* 分隔符
*/
public static final String SPLIT_CHAR = ",";
/**
* 分裂条件
*/
public static final String SPLIT_CONDITIONS = "@";
private static final Pattern HUMP_PATTERN = Pattern.compile("[A-Z]");
private static DbTypeEnum currentType = DbTypeEnum.MYSQL;
public static DbTypeEnum getDbType() {
return currentType;
}
public static void setDbType(String dbType) {
currentType = DbTypeEnum.getDbType(dbType);
}
private static final ThreadLocal<String> LOCAL_HANDLER = new ThreadLocal<>();
/**
* 注册一个跳过数据处理方法名称为key
*
* @param name 名称
* @param handler 处理程序
*/
public static void registerSkipHandler(String name, Function<Object, Boolean> handler) {
SKIP_HANDLER.put(name, handler);
}
static {
// 默认
registerSkipHandler("null", (obj) -> {
return obj == null || obj.equals("null");
});
resetWrapperHandler();
}
public static void resetWrapperHandler(){
registerWrapperHandler(new Between2Handler<>());
registerWrapperHandler(new BetweenHandler<>());
registerWrapperHandler(new EqHandler<>());
registerWrapperHandler(new GeHandler<>());
registerWrapperHandler(new GtHandler<>());
registerWrapperHandler(new InHandler<>());
registerWrapperHandler(new InSetHandler<>());
registerWrapperHandler(new KeywordHandler<>());
registerWrapperHandler(new LeHandler<>());
registerWrapperHandler(new LikeHandler<>());
registerWrapperHandler(new LikeLeftHandler<>());
registerWrapperHandler(new LikeRightHandler<>());
registerWrapperHandler(new LtHandler<>());
registerWrapperHandler(new NeHandler<>());
registerWrapperHandler(new NotInHandler<>());
registerWrapperHandler(new NotLikeHandler<>());
}
public static void registerWrapperHandler(WhereWrapper<?> whereWrapper) {
WrapperHandler.registerWrapperHandler(whereWrapper);
}
/**
* 使用跳过逻辑处理方法名称
*
* @param name 名称
*/
public static void useSkipHandler(String name) {
// 线程绑定
LOCAL_HANDLER.set(name);
}
private static Function<Object, Boolean> getSkipHandler(String name) {
Function<Object, Boolean> function = null;
if (name != null) {
function = SKIP_HANDLER.get(name);
}
if (function == null) {
// 使用默认
return QueryConfigUtils::isEmpty;
}
return function;
}
/**
* 获取 sql 字段为 id1,id2,id3 , 条件如 id1
* 使用 方法 queryWrapper.apply(MybatisPlusUtil.getIdsToApply(user_ids"),id)
*
* @param columnName 列名
* @return {@link String }
*/
public static String getIdsToApply(String columnName) {
return getIdsToApply(getDbType(), columnName);
}
/**
* 获取身份证申请
*
* @param dbType db类型
* @param columnName 列名
* @return {@link String }
*/
public static String getIdsToApply(DbTypeEnum dbType, String columnName) {
switch (dbType) {
case MYSQL:
return "FIND_IN_SET ({0}, " + columnName + ")";
case POSTGRE_SQL:
return "'{0}' = ANY (string_to_array(" + columnName + ", ','))";
default:
return "FIND_IN_SET ({0}, " + columnName + ")";
}
}
/**
* 转成下线缓存
*/
private static final HighPerformanceOrderedMap<String, String> TO_LINE_CACHE = new HighPerformanceOrderedMap<>();
/**
* 驼峰转下划线
*
* @param str str
* @return {@link String}
*/
public static String humpToLine(String str) {
if (isNotEmpty(str)) {
String s = TO_LINE_CACHE.get(str);
if (isNotEmpty(s)) {
return s;
}
str = str.substring(0, 1).toLowerCase() + str.substring(1);
Matcher matcher = HUMP_PATTERN.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
String string = sb.toString();
TO_LINE_CACHE.put(str, string);
if (TO_LINE_CACHE.size() > MAX_LINE_CACHE) {
TO_LINE_CACHE.removeFirst();
}
return string;
}
return str;
}
/**
* 转为骆驼
*
* @param s S
* @return {@link String }
*/
public static String toCamelCase(String s) {
if (isEmpty(s) || !s.contains("_")) {
return s;
}
s = s.toLowerCase();
StringBuilder sb = new StringBuilder(s.length());
boolean upperCase = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '_') {
upperCase = true;
} else if (upperCase) {
sb.append(Character.toUpperCase(c));
upperCase = false;
} else {
sb.append(c);
}
}
return sb.toString();
}
public static boolean shouldSkipField(Field field, Set<String> ignoreList) {
if ("serialVersionUID".equals(field.getName())) return true;
if (ignoreList.contains(humpToLine(field.getName()))) return true;
// 过滤字段 只写字段
if (field.getAnnotation(JsonProperty.class) != null
&& field.getAnnotation(JsonProperty.class).access() == JsonProperty.Access.WRITE_ONLY) {
ignoreList.add(humpToLine(field.getName()));
return true;
}
// 在序列化和反序列化时忽略的属性
if (field.getAnnotation(JsonIgnore.class) != null) {
ignoreList.add(humpToLine(field.getName()));
return true;
}
return false;
}
private static final Map<Class<?>, Field[]> fieldCache = new HashMap<>();
public static Field[] getDeclaredFields(Class<?> clazz) {
return fieldCache.computeIfAbsent(clazz, Class::getDeclaredFields);
}
// 去除空白
public static List<String> toStrList(String str) {
if (isEmpty(str)) {
return new ArrayList<>();
}
String[] split = str.split(QueryConfigUtils.SPLIT_CHAR);
return Arrays.stream(split).filter(s -> !isEmpty(s)).collect(Collectors.toList());
}
public static String[] toStrArr(String str) {
List<String> strList = toStrList(str);
if (isEmpty(strList)) {
return null;
}
return strList.toArray(new String[strList.size()]);
}
public static boolean isNotEmpty(final Object object) {
return !isEmpty(object);
}
public static boolean isEmpty(final Object object) {
if (object == null) {
return true;
}
if (object instanceof CharSequence) {
return ((CharSequence) object).length() == 0;
}
if (object.getClass().isArray()) {
return Array.getLength(object) == 0;
}
if (object instanceof Collection<?>) {
return ((Collection<?>) object).isEmpty();
}
if (object instanceof Map<?, ?>) {
return ((Map<?, ?>) object).isEmpty();
}
return false;
}
/**
* 是否支持日期搜索的类型 的关键字
*
* @param input 输入
* @return boolean
*/
public static boolean isDateValue(String input) {
try {
LocalDate.parse(input, DateTimeFormatter.ISO_LOCAL_DATE);
return true;
} catch (Exception e) {
try {
Long.valueOf(input);
return true;
} catch (Exception e2) {
}
}
return false;
}
public static String toStr(Object str) {
return toStr(str, "");
}
public static String toStr(Object str, String defaultValue) {
return null != str ? str.toString() : defaultValue;
}
/**
* 对象到数组
*
* @param obj obj
* @param clazz clazz
* @return {@link T[] }
*/
public static <T> T[] objToArray(Object obj, Class<T> clazz) {
if (obj == null) {
return (T[]) Array.newInstance(clazz, 0); // 返回空数组
}
if (obj.getClass().isArray()) {
return (T[]) obj; // 已经是数组直接转换
}
if (obj instanceof List<?>) {
List<?> list = (List<?>) obj;
// 使用传入的类型创建数组
return list.toArray((T[]) Array.newInstance(clazz, list.size()));
}
// 单个对象转换为包含该对象的数组
T[] array = (T[]) Array.newInstance(clazz, 1);
array[0] = (T) obj;
return array;
}
/**
* 日期格式
*
* @param localDateTime 当地日期时间
* @return {@link String }
*/
public static String dateFormat(LocalDateTime localDateTime) {
return DateUtil.format(localDateTime, "yyyy-MM-dd HH:mm:ss");
}
/**
* // 将对象转换为 List支持泛型
*
* @param obj obj
* @param clazz clazz
* @return {@link List }<{@link T }>
*/
public static <T> List<T> objToList(Object obj, Class<T> clazz) {
if (obj == null) {
return new ArrayList<>(); // 返回空 List
}
if (obj.getClass().isArray()) {
// 数组转换为 List
int length = Array.getLength(obj);
List<T> list = new ArrayList<>(length);
for (int i = 0; i < length; i++) {
list.add((T) Array.get(obj, i));
}
return list;
}
if (obj instanceof List<?>) {
return new ArrayList<>((List<T>) obj); // 已经是 List直接转换
}
// 单个对象转换为包含该对象的 List
return new ArrayList<>(Collections.singletonList((T) obj));
}
/**
* 对象是否为数组类型
*
* @param obj obj
* @return boolean
*/
public static boolean isArr(Object obj) {
if (obj == null) {
return false;
}
// 检查是否为数组
if (obj.getClass().isArray()) {
return true;
}
return false;
}
/**
* 是否为List 类型的数据
*
* @param obj obj
* @return boolean
*/
public static boolean isList(Object obj) {
if (obj == null) {
return false;
}
// 检查是否为 List
if (obj instanceof List) {
return true;
}
return false;
}
/**
* 字符串添加
*
* @param str str
* @param field 领域
* @return {@link String }
*/
public static String strAdd(String str, String... field) {
if (QueryConfigUtils.isNotEmpty(field)) {
for (String s : field) {
if (QueryConfigUtils.isNotEmpty(s.trim())) {
str += (s.trim() + QueryConfigUtils.SPLIT_CHAR);
}
}
}
return str;
}
/**
* 字符串删除
*
* @param str str
* @param keys
* @return {@link String }
*/
public static String strRemove(String str, String... keys) {
if (QueryConfigUtils.isNotEmpty(keys)) {
String[] split = str.split(QueryConfigUtils.SPLIT_CHAR);
StringBuilder builder = new StringBuilder();
List<String> strList = QueryConfigUtils.toStrList(String.join(QueryConfigUtils.SPLIT_CHAR, keys));
for (int i = 0; i < split.length; i++) {
if (strList.contains(split[i])) {
continue;
}
builder.append(split[i]).append(QueryConfigUtils.SPLIT_CHAR);
}
str = builder.toString();
}
return str;
}
/**
* 跳过数据处理器
*
* @param str str
* @return boolean
*/
public static boolean skipData(Object str) {
return getSkipHandler(LOCAL_HANDLER.get()).apply(str);
}
/**
* where 条件处理
*
* @param value str
* @return boolean
*/
public static <T> QueryWrapper<T> whereHandler(QueryWrapper<T> queryWrapper,
QueryFilterTypeEnum type,
Set<String> dateField,
String filed,
Object value) {
return WrapperHandler.exeWrapperHandler(queryWrapper, type,dateField, filed, value);
}
}

View File

@ -0,0 +1,216 @@
package cn.hangtag.framework.mybatis.build;
import cn.hangtag.framework.common.pojo.PageParam;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import java.io.Serializable;
import java.util.*;
/*
前端条件 条件
where
(userName like '%%' or nickname like '%%')
and (age > 18)
and (userName in ('陈海瑶', '冯雨馨')
or nickname like '%%')
{
"pager": {
"current": 1,
"size": 10
},
"config": {
"keywordSearch": "",
"keywordFields": "userName,nickname",
"orderBy": "age desc;name asc",
"options": {
"age": {
"type": ">",
"or": false
},
"userName": {
"type": "in",
"or": false
},
"nickname": {
"type": "like",
"or": true
}
}
},
"filter": {
"age": 18,
"userName": [
"陈海瑶",
"冯雨馨"
],
"nickname": ""
}
}
*/
@Data
public class QueryFilterInfo<T> implements Serializable {
private FilterItemConfig config; // 配置
private PageParam pager = new PageParam(); // 分页
// 查询条件
private Map<String, Object> filter = new HighPerformanceOrderedMap<>();
public FilterItemConfig getConfig() {
if(config == null){
config = new FilterItemConfig();
}
return config;
}
public String getDefaultFilterType() {
return getConfig().getDefaultFilterType();
}
public Map<String, Object> getFilter() {
if (filter == null) {
filter = new HighPerformanceOrderedMap<>();
}
return filter;
}
// @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; name@like,age@> 条件 where like '%?%' and age > ?
public void easyOptions(String options){
this.getConfig().setEasyOption(options);
}
public Map<String, FilterItem> getOptions() {
return this.getConfig().getOptions();
}
/**
* 建立或
*
* @param field 字段
* @param value
* @param type 类型
* @return {@link FilterItem }
*/
public FilterItem buildOr(String field, Object value, QueryFilterTypeEnum type) {
return buildFilter(field, value, type, true);
}
public void appendKeywordFields(String ...field){
QueryConfigUtils.strAdd(this.getConfig().getKeywordFields(),field);
}
public void delKeywordFields(String... keys){
QueryConfigUtils.strRemove(this.getConfig().getKeywordFields(), keys);
}
public void appendDateFields(String ...field){
QueryConfigUtils.strAdd(this.getConfig().getDateFields(),field);
}
public void delDateFields(String... keys){
QueryConfigUtils.strRemove(this.getConfig().getDateFields(),keys);
}
public void appendGroupBy(String ...field){
QueryConfigUtils.strAdd(this.getConfig().getGroupBy(),field);
}
public void delGroupBy(String... keys){
QueryConfigUtils.strRemove(this.getConfig().getGroupBy(),keys);
}
public boolean containsIgnoredKeys(String key) {
return this.getConfig().getIgnoreFields().contains(key);
}
public Set<String> getIgnoreFieldsKeys(){
return this.getConfig().getIgnoreFieldsKeys();
}
public void appendIgnoreFields(String ...field){
Set<String> set = new HashSet<>();
if(QueryConfigUtils.isNotEmpty(field)){
set.addAll(Arrays.asList(field));
}
appendIgnoreFields(set);
}
public void setDefaultFilterType(QueryFilterTypeEnum type){
this.getConfig().setDefaultFilterType(type.getValue());
}
public void appendIgnoreFields(Set<String> field){
if(QueryConfigUtils.isNotEmpty(field)){
for (String s : field) {
if(QueryConfigUtils.isNotEmpty(s.trim())){
this.getConfig().getIgnoreFieldsKeys().add(s.trim());
}
}
}
}
public void delIgnoreFields(String... keys){
if(QueryConfigUtils.isNotEmpty(keys)){
for (String key : keys) {
this.getConfig().getIgnoreFieldsKeys().remove(key);
}
}
}
public void appendOrderByDesc(String ...field){
appendOrderBy("DESC",field);
}
private void appendOrderBy(String type,String ...field){
if(QueryConfigUtils.isNotEmpty(field)){
StringBuilder builder = new StringBuilder();
List<String> strList = QueryConfigUtils.toStrList(this.getConfig().getOrderBy());
for (String s : field) {
if (QueryConfigUtils.isNotEmpty(s.trim())) {
String key = s.trim() + " "+type;
if(strList.contains(key)){
strList.remove(key);
}
builder.append(s.trim()).append(" ").append(type).append(",");
}
}
// 移除重复的排序
StringBuilder res = new StringBuilder();
for (String s : strList) {
res.append(s).append(",");
}
String tmp = res.toString();
tmp += builder.toString();
this.getConfig().setOrderBy(tmp);
}
}
public void appendOrderByAsc(String ...field){
appendOrderBy("ASC",field);
}
public void delOrderBy(String... keys){
QueryConfigUtils.strRemove(this.getConfig().getOrderBy(), keys);
}
/**
* 构建
*
* @param field 字段
* @param value
* @param type 类型
* @return {@link FilterItem }
*/
public FilterItem build(String field, Object value, QueryFilterTypeEnum type) {
return build(field, value, type, false);
}
public FilterItem build(String field, Object value, QueryFilterTypeEnum type, boolean isOr) {
return buildFilter(field, value, type, isOr);
}
private FilterItem buildFilter(String field, Object value, QueryFilterTypeEnum type, boolean isOr) {
filter.put(field, value);
FilterItem item = new FilterItem();
item.setOr(isOr);
item.setType(type.getValue());
this.getConfig().getOptions().put(field, item);
return item;
}
}

View File

@ -0,0 +1,113 @@
package cn.hangtag.framework.mybatis.build;
import cn.hutool.core.date.DateUtil;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
/**
* 类型 取值转换器
*
* @author YuanFeng
* @date 2024/10/16
*/
public class TypeConverter {
// 用于存储类型和其对应的转换逻辑
private static final Map<Class<?>, Function<Object, Object>> converters = new HashMap<>();
// 注册类型转换器
public static <T> void registerConverter(Class<T> type, Function<T, Object> converter) {
converters.put(type, (Function<Object, Object>) converter);
}
// 根据类型进行转换
public static Object convertValue(Object inputVal, Class<?> targetType) {
Function<Object, Object> converter = converters.get(targetType);
if (converter == null) {
// 如果没有注册转换器返回原始值
return null;
}
// 如果有对应类型的转换器执行转换
return converter.apply(inputVal);
}
static {
rest();
}
public static void rest(){
restLocalDateTime();
restDate();
restString();
restLong();
restDouble();
restInteger();
restBoolean();
restBigDecimal();
restBigInteger();
}
public static void restLocalDateTime(){
// 注册LocalDate的转换器
TypeConverter.registerConverter(LocalDateTime.class, inputVal -> {
if (inputVal != null) {
return QueryConfigUtils.dateFormat(inputVal);
}
return null;
});
}
public static void restDate(){
// 注册Date的转换器
TypeConverter.registerConverter(Date.class, inputVal -> {
if (inputVal != null) {
return DateUtil.formatDate(inputVal);
}
return null;
});
}
public static void restString(){
// 注册字符的转换器
TypeConverter.registerConverter(String.class, inputVal -> {
return inputVal;
});
}
public static void restLong(){
TypeConverter.registerConverter(Long.class, inputVal -> {
return inputVal;
});
}public static void restDouble(){
TypeConverter.registerConverter(Double.class, inputVal -> {
return inputVal;
});
}
public static void restInteger(){
TypeConverter.registerConverter(Integer.class, inputVal -> {
return inputVal;
});
}public static void restBoolean(){
TypeConverter.registerConverter(Boolean.class, inputVal -> {
return inputVal;
});
}
public static void restBigDecimal() {
TypeConverter.registerConverter(BigDecimal.class, inputVal -> {
if (inputVal != null) {
return new BigDecimal(inputVal.toString()).toString();
}
return null;
});
}
public static void restBigInteger() {
TypeConverter.registerConverter(BigInteger.class, inputVal -> {
if (inputVal != null) {
return new BigInteger(inputVal.toString());
}
return null;
});
}
}

View File

@ -0,0 +1,52 @@
package cn.hangtag.framework.mybatis.build;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class WrapperHandler {
private static final Map<QueryFilterTypeEnum, WhereWrapper<?>> QUERY_WRAPPER_HANDLER = new HashMap<>();
public static void registerWrapperHandler(WhereWrapper<?> whereWrapper) {
if(whereWrapper != null){
QUERY_WRAPPER_HANDLER.put(whereWrapper.getType(), whereWrapper);
}
}
public static <T> QueryWrapper<T> exeWrapperHandler(QueryWrapper<T> queryWrapper,
QueryFilterTypeEnum type,
Set<String> dateField,
String field, Object value) {
if (queryWrapper == null) {
queryWrapper = new QueryWrapper<>();
}
WhereWrapper<?> whereWrapper = QUERY_WRAPPER_HANDLER.get(type);
WrapperInfo<T> wrapperInfo = new WrapperInfo<>(queryWrapper, field, value,dateField);
if (whereWrapper == null) {
//没有找到处理器 使用默认
if (QueryConfigUtils.isArr(value)) {
Object[] strings = QueryConfigUtils.objToArray(value, Object.class);
if (QueryConfigUtils.isNotEmpty(strings)) {
return queryWrapper.between(field, strings[0], strings[strings.length - 1]);
}
}
if (QueryConfigUtils.isList(value)) {
List<Object> list = QueryConfigUtils.objToList(value, Object.class);
if (QueryConfigUtils.isNotEmpty(list)) {
return queryWrapper.between(field, list.get(0), list.get(list.size() - 1));
}
}
return queryWrapper.eq(field, value);
}
// 执行
return ((WhereWrapper<T>)whereWrapper).handler(wrapperInfo);
}
}

View File

@ -0,0 +1,37 @@
package cn.hangtag.framework.mybatis.build;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.HashSet;
import java.util.Set;
/**
* 包装信息
*
* @author YuanFeng
*/
@Data
@AllArgsConstructor
public class WrapperInfo<T> {
private QueryWrapper<T> queryWrapper;
private String field;
private Object value;
private Set<String> dateFields;
public Set<String> getDateFields() {
if (dateFields == null) {
dateFields = new HashSet<>();
}
return dateFields;
}
public QueryWrapper<T> getQueryWrapper() {
if (queryWrapper == null) {
queryWrapper = new QueryWrapper<>();
}
return queryWrapper;
}
}

View File

@ -0,0 +1,70 @@
package cn.hangtag.framework.mybatis.build.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum DbTypeEnum {
MYSQL("mysql", "MySql数据库"),
MARIADB("mariadb", "MariaDB数据库"),
ORACLE("oracle", "Oracle11g及以下数据库(高版本推荐使用ORACLE_NEW)"),
ORACLE_12C("oracle12c", "Oracle12c+数据库"),
DB2("db2", "DB2数据库"),
H2("h2", "H2数据库"),
HSQL("hsql", "HSQL数据库"),
SQLITE("sqlite", "SQLite数据库"),
POSTGRE_SQL("postgresql", "Postgre数据库"),
SQL_SERVER2005("sqlserver2005", "SQLServer2005数据库"),
SQL_SERVER("sqlserver", "SQLServer数据库"),
DM("dm", "达梦数据库"),
XU_GU("xugu", "虚谷数据库"),
KINGBASE_ES("kingbasees", "人大金仓数据库"),
PHOENIX("phoenix", "Phoenix HBase数据库"),
GAUSS("zenith", "Gauss 数据库"),
CLICK_HOUSE("clickhouse", "clickhouse 数据库"),
GBASE("gbase", "南大通用(华库)数据库"),
GBASE_8S("gbase-8s", "南大通用数据库 GBase 8s"),
GBASE8S_PG("gbase8s-pg", "南大通用数据库 GBase 8s兼容pg"),
GBASE_8C("gbase8c", "南大通用数据库 GBase 8c"),
SINODB("sinodb", "星瑞格数据库"),
OSCAR("oscar", "神通数据库"),
SYBASE("sybase", "Sybase ASE 数据库"),
OCEAN_BASE("oceanbase", "OceanBase 数据库"),
FIREBIRD("Firebird", "Firebird 数据库"),
HIGH_GO("highgo", "瀚高数据库"),
CUBRID("cubrid", "CUBRID数据库"),
SUNDB("sundb", "SUNDB数据库"),
SAP_HANA("hana", "SAP_HANA数据库"),
IMPALA("impala", "impala数据库"),
VERTICA("vertica", "vertica数据库"),
XCloud("xcloud", "行云数据库"),
REDSHIFT("redshift", "亚马逊redshift数据库"),
OPENGAUSS("openGauss", "华为 opengauss 数据库"),
TDENGINE("TDengine", "TDengine数据库"),
INFORMIX("informix", "Informix数据库"),
UXDB("uxdb", "优炫数据库"),
LEALONE("lealone", "Lealone数据库"),
TRINO("trino", "Trino数据库"),
PRESTO("presto", "Presto数据库"),
OTHER("other", "其他数据库");
private final String db;
private final String desc;
public static DbTypeEnum getDbType(String dbType) {
DbTypeEnum[] var1 = values();
int var2 = var1.length;
for (int var3 = 0; var3 < var2; ++var3) {
DbTypeEnum type = var1[var3];
if (type.db.equalsIgnoreCase(dbType)) {
return type;
}
}
return OTHER;
}
}

View File

@ -0,0 +1,50 @@
package cn.hangtag.framework.mybatis.build.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum QueryFilterTypeEnum {
GT("大于", ">"),
GE("大于等于", ">="),
LT("小于", "<"),
LE("小于等于", "<="),
NE("不等于", "!="),
EQ("等于", "="),
IN("在...之内", "in"),
NOTIN("不在...之内", "notIn"),
BETWEEN("之间", "between"),
BETWEEN2("之间", "><"),
LIKE("模糊匹配", "like"),
NOT_LIKE("模糊匹配", "notLike"),
LIKE_LEFT("左模糊匹配", "likeLeft"),
LIKE_RIGHT("右模糊匹配", "likeRight"),
/**
* 查询以逗号分隔的组合字段数据
* 使用条件FIND_IN_SET({0}, columnName) 进行查询
* 示例
* - 字段值为数据1: 123,234,345数据2: 23,456数据3: 123,567
* - 当条件为 23 仅匹配包含 23 的数据即数据2
*/
IN_SET("查询以逗号分隔的组合字段数据", "inSet"),
KEYWORD("关键字", "keyword")
;
private final String msg;
private final String value;
public static QueryFilterTypeEnum getByValue(String value){
if(value != null && !value.isEmpty()){
for( QueryFilterTypeEnum enumItem: QueryFilterTypeEnum.values()) {
if (enumItem.getValue().equalsIgnoreCase(value)) {
return enumItem;
}
}
}
return null;
}
}

View File

@ -0,0 +1,11 @@
package cn.hangtag.framework.mybatis.build.where;
import cn.hangtag.framework.mybatis.build.WrapperInfo;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public interface WhereWrapper<T> {
QueryFilterTypeEnum getType();
QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo);
}

View File

@ -0,0 +1,29 @@
package cn.hangtag.framework.mybatis.build.where.handler;
import cn.hangtag.framework.mybatis.build.QueryConfigUtils;
import cn.hangtag.framework.mybatis.build.WrapperInfo;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;
public class Between2Handler<T> implements WhereWrapper<T> {
@Override
public QueryFilterTypeEnum getType() {
return QueryFilterTypeEnum.BETWEEN2;
}
@Override
public QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo) {
if (QueryConfigUtils.isArr(wrapperInfo.getValue())) {
Object[] strings = QueryConfigUtils.objToArray(wrapperInfo.getValue(), Object.class);
wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), strings[0], strings[strings.length - 1]);
} else if (QueryConfigUtils.isList(wrapperInfo.getValue())) {
List<Object> list = QueryConfigUtils.objToList(wrapperInfo.getValue(), Object.class);
wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), list.get(0), list.get(list.size() - 1));
}
return wrapperInfo.getQueryWrapper();
}
}

View File

@ -0,0 +1,28 @@
package cn.hangtag.framework.mybatis.build.where.handler;
import cn.hangtag.framework.mybatis.build.QueryConfigUtils;
import cn.hangtag.framework.mybatis.build.WrapperInfo;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;
public class BetweenHandler<T> implements WhereWrapper<T> {
@Override
public QueryFilterTypeEnum getType() {
return QueryFilterTypeEnum.BETWEEN;
}
@Override
public QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo) {
if (QueryConfigUtils.isArr(wrapperInfo.getValue())) {
Object[] strings = QueryConfigUtils.objToArray(wrapperInfo.getValue(), Object.class);
wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), strings[0], strings[strings.length - 1]);
} else if (QueryConfigUtils.isList(wrapperInfo.getValue())) {
List<Object> list = QueryConfigUtils.objToList(wrapperInfo.getValue(), Object.class);
wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), list.get(0), list.get(list.size() - 1));
}
return wrapperInfo.getQueryWrapper();
}
}

View File

@ -0,0 +1,21 @@
package cn.hangtag.framework.mybatis.build.where.handler;
import cn.hangtag.framework.mybatis.build.QueryConfigUtils;
import cn.hangtag.framework.mybatis.build.WrapperInfo;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;
public class EqHandler<T> implements WhereWrapper<T> {
@Override
public QueryFilterTypeEnum getType() {
return QueryFilterTypeEnum.EQ;
}
@Override
public QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo) {
return wrapperInfo.getQueryWrapper().eq(wrapperInfo.getField(), wrapperInfo.getValue());
}
}

View File

@ -0,0 +1,19 @@
package cn.hangtag.framework.mybatis.build.where.handler;
import cn.hangtag.framework.mybatis.build.WrapperInfo;
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public class GeHandler<T> implements WhereWrapper<T> {
@Override
public QueryFilterTypeEnum getType() {
return QueryFilterTypeEnum.GE;
}
@Override
public QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo) {
return wrapperInfo.getQueryWrapper().ge(wrapperInfo.getField(), wrapperInfo.getValue());
}
}

Some files were not shown because too many files have changed in this diff Show More